Also I'm curious if we can set up and pass a JSON that easily too? Would be great.

Certainly.

Class dc.test Extends %RegisteredObject
{

ClassMethod MethodTest(args As %DynamicObject)
{
 i $IsObject(args{
   args.%ToJSON(),!
   w:args.%IsDefined("arr"args.arr."2",!
 }else{
   "null",!
 }
}

ClassMethod Test()
{
  ;d ##class(dc.test).Test()
  ..MethodTest(),
    ..MethodTest({}),
    ..MethodTest({"arg1":($zts),"arg6":"hello","arr":["a",10,true,2.5674]})
}

}

Result:

USER>##class(dc.test).Test()
null
{}
{"arg1":"65136,19638.022","arg6":"hello","arr":["a",10,true,2.5674]}
1

First, should be so (AttachFile):

status=msg.AttachFile("F:\MyDir","myFirstFile.pdf",1,,.count)

status=msg.AttachFile("F:\MyDir","mySecondFile.pdf",1,,.count)

Second, you did not specify the error text.

Try the following simple MAC-example, replacing the values with your own:

#include %systemInclude
new

try{

  $$$AddAllRoleTemporaryInTry
  new $namespace
  
  set msg=##class(%Net.MailMessage).%New()

  set msg.Subject="Subject"

  set msg.From="from@domain"

  do msg.To.Insert("to@domain")

  do msg.TextData.Write("Hello!")
  
  $$$ThrowOnError(msg.AttachFile("F:\MyDir","myFirstFile.pdf"))
  $$$ThrowOnError(msg.AttachFile("F:\MyDir","mySecondFile.pdf"))

  set smtp=##class(%Net.SMTP).%New()
  set smtp.smtpserver="123.145.167.189"

  $$$ThrowOnError(smtp.Send(msg))
      
}catch(ex){
  write "Error "ex.DisplayString(),!
}

See examples and try "Run It" in JSON_ARRAYAGG.

E.g.:

  1. SELECT JSON_ARRAYAGG(Home_StateFROM Sample.Person WHERE Home_State %STARTSWITH 'A'

    Result:

    ["AR","AL","AR","AL","AL","AR","AK","AL","AR","AK","AK","AZ","AR","AR","AL"]
  2. SELECT JSON_OBJECT('state':Home_StateFROM Sample.Person WHERE Home_State %STARTSWITH 'A'

    Result:

    {"state":"AR"}
    {"state":"AL"}
    {"state":"AR"}
    {"state":"AL"}
    {"state":"AL"}
    {"state":"AR"}
    {"state":"AK"}
    {"state":"AL"}
    {"state":"AR"}
    {"state":"AK"}
    {"state":"AK"}
    {"state":"AZ"}
    {"state":"AR"}
    {"state":"AR"}
    {"state":"AL"}
  3. SELECT JSON_ARRAYAGG(JSON_OBJECT('state':Home_State)) FROM Sample.Person WHERE Home_State %STARTSWITH 'A'

    Result:

    [{"state":"AR"},{"state":"AL"},{"state":"AR"},{"state":"AL"},{"state":"AL"},{"state":"AR"},{"state":"AK"},{"state":"AL"},{"state":"AR"},{"state":"AK"},{"state":"AK"},{"state":"AZ"},{"state":"AR"},{"state":"AR"},{"state":"AL"}]

NoContext helped. What does it mean?

NoContext
With the same success it is possible to specify NoContext for the class:

Class Test.String Extends %String [ NoContext ]
{

Method Get() As %String CodeMode = objectgenerator ]
{
  %code.WriteLine("  q $this.Test()")
  q $$$OK
}

}
This works too btw:

It doesn't work for me:

MPP5376 : Method or Property 'Test' does not exist in this class.

You can do it even easier:

&sql(SELECT {fn TIMESTAMPDIFF(SQL_TSI_HOUR,CURRENT_TIMESTAMP(3),:tx)})

Small example:

&sql(SELECT CURRENT_TIMESTAMP(3),
            {fn TIMESTAMPADD(SQL_TSI_MINUTE,67,CURRENT_TIMESTAMP(3))} into :txBefore,:txAfter)
txBefore," -> ",txAfter,!!

&sql(SELECT {fn TIMESTAMPDIFF(SQL_TSI_HOUR,CURRENT_TIMESTAMP(3),:txAfter)},
            {fn TIMESTAMPDIFF(SQL_TSI_HOUR,:txBefore,:txAfter)} into :r1,:r2)
r1,!,r2

Result:

USER>^test
2019-04-08 08:51:34.916 -> 2019-04-08 09:58:34.916
 
1
1
USER>^test
2019-04-08 08:55:11.907 -> 2019-04-08 10:02:11.907
 
2
2

There are two ways to define views, so I'll give you both options:

  1. /// bla-bla-bla:<ul>
    /// <li>Name - Person's name;</li>
    /// <li>SSN - Person's Social Security number. This is validated using pattern match;</li>
    /// <li>DOB - Person's Date of Birth.</li></ul>
    Class view.Person ClassType = view, CompileAfter Sample.PersonDdlAllowedNot ProcedureBlockViewQuery = { select Name,SSN,DOB from Sample.Person} ]
    {
    
    }
  2. /// This sample persistent class represents a person.
    /// <p>Maintenance note: This class is used by some of the bindings samples.
    Class Sample.Person Extends (%Persistent%Populate%XML.Adaptor)
    {
    
    ...
    
    /// bla-bla-bla:<ul>
    /// <li>Name - Person's name;</li>
    /// <li>SSN - Person's Social Security number. This is validated using pattern match;</li>
    /// <li>DOB - Person's Date of Birth.</li></ul>
    Query viewPerson() As %SQLQuery SqlViewSqlViewName viewPerson ]
    {
    select Name,SSN,DOB from Sample.Person
    }
    
    ...
    
    }

Now take a look at these classes from Documatic.