Hi Blaise.

Does following query looks like what you need?

With Member Measures.[RunningTotal] As 
                MEASURES.[Amount Sold])',FORMAT_STRING='$#,#.#' 
SELECT {Measures.[Amount Sold],Measures.[RunningTotal]} ON 0,  
        [DateOfSale].[Actual].YearSold.&[2016].CHILDREN ON 1 

It prints two columns -- Revenue in current month and Total revenue from 2011-01 up to current month. Rows are months of 2016 year.

As far as I know it is not possible to switch it on.

You might find function DESCENDANTS (http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=...) helpful.

For time dimension, all members of the level are generated and available to queries that show empty. This means

SELECT DESCENDANTS([DateOfSale].[YearSold].&[2015],DateOfSale.DaySold) ON 1 FROM HoleFoods

will show all days from 2015 on rows, whether there are facts recorded for those days or not.

SQL Adapter does some metadata caching.

See, for example, doc for method EnsLib.SQL.Common:ExecuteProcedure

"Appending a '#' to the pIO argument (or passing only '#') prevents the adapter from using cached DescribeColumns() results for the procedure call output, forcing a fresh call to ODBC DescribeColumns() every time the stored procedure is invoked. This can be necessary if the procedure is capable of returning different sequences of result types from consecutive invocations"

I'm not sure if this is what happened in this case, though.

By default %ToJSON method prints empty properties.

If you pass pFormat without "e" flags (that is passed by default), then empty properties are skipped:

USER>set p = ##class(%ZEN.proxyObject).%New()

USER>set p.a = 1

USER>set p.b = 2

USER>do p.%ToJSON()
USER>set p.b = ""

USER>do p.%ToJSON()
USER>do p.%ToJSON(,"alotw")

I encourage you to use Caché 2016.1 with native JSON support. Don't start with %ZEN.proxyObject.
See great article by Stefan Wittman about JSON support in 2016.1:

The first time a message is added to a domain by $$$Text, $$$SessionLanguage is used:

$$$SessionLanguage is determined by locale of current process, that is by default is the same as locale of Caché instance

Default locale for Caché instance is determined during installation based on OS locale. For example, on English Windows that has Russian in Regional Settings, Caché is installed with locale rusw (ruw8 for 8-bit installation). You can change locale after installation. There is no option to select locale during installation.

You can change current session language with ##class(%MessageDictionary).SetSessionLanguage("ru")