Well, in this case you definitely don't need to read from stream at all. You can save the stream in the database (or file using %Stream.FileCharacter)) and send it to the client later:

set stream = ##class(%Stream.GlobalCharacter).%New()
set sc = stream.CopyFromAndSave(%request.Content)
set oid = stream.%Oid()
kill (oid)
set stream = ##class(%Stream.GlobalCharacter).%Open(oid)
do stream.OutputToDevice()

Streams can be class properties too.

catch-scope is not seems to be reached

Have you enabled logging?

Error occurs on saving incorrect data and not on setting the data. Saving also does not throw an exception, only returns an error status.

Also you need to quit something:

#dim sc As %Status = $$$OK

try
{
  set myClass= ##class(SomeClass).%New()
  myClass.Date =  Sourcedata.Date  //Sourcedata send us wrong format to that datefield.
  set sc = myClass.%Save() // Error occurs on save.
} catch ex {
  set sc = ex.AsStatus()
  set errMsg = "Error in this method "  _ $System.Status.GetOneStatusText(sc)
  $$$LOGERROR(errMsg)
}
quit sc

On a side note, you're using 3 different naming conventions for variables in your snippet:

  • tHungarianNotation
  • CapitalCase
  • lowercase

It would probably be better to decide on one notation.

All datatypes go through the transformation.

The collation is determined in this order:

  1. If an index definition includes an explicitly specified collation for a property, the index uses that collation.
  2. If an index definition does not include an explicitly specified collation for a property, the index uses the collation explicitly specified in the property definition.
  3. If the property definition does not include an explicitly specified collation, then the index uses the collation that is the default for the property data type.
  4. If the property data type does not include an explicitly specified collation, then the index uses namespace default collation
  5. If the namespace default collation is not specified, then SQLUPPER is used.

Documentation.

The general approach is:

  1. XData to ZEN objects
  2. Modify object(s)
  3. Serialize back into XData.

Sample code (SAMPLES namespace):

/// This is the Desktop Demonstration page for the Zen demonstration application.
Class ZENDemo.AutoDemo Extends %ZEN.Component.page
{

/// Class name of application this page belongs to.
Parameter APPLICATION = "ZENDemo.Application";


/// This XML block defines the contents of this page.
XData Contents [ XMLNamespace = "http://www.intersystems.com/zen" ]
{
<page xmlns="http://www.intersystems.com/zen" title="Zen Desktop Demo">
<tablePane sql="SELECT ID,Name FROM Sample.Person WHERE Name %STARTSWITH ? ORDER BY Name">
<column colName="ID" hidden="0"/>
<column colName="Name"/>
<parameter value="Z"/>
</tablePane>
</page>
}

/// Toggles visibility of the ID column.
/// w $System.Status.GetErrorText(##class(ZENDemo.AutoDemo).Modify())
ClassMethod Modify() As %Status
{
    #Dim pSC As %Status = $$$OK
    #Dim tPage As %ZEN.Component.page
    #Dim tHidden As %Boolean
    Set tSC = ..GetPageObject(, .tPage)
    Quit:$$$ISERR(tSC) tSC

    Set tHidden = tPage.children.GetAt(1).columns.GetAt(1).hidden

    Write "Old ID column hidden value: ", tHidden, !

    Set tPage.children.GetAt(1).columns.GetAt(1).hidden = 'tHidden

    Write "New ID column hidden value: ", 'tHidden, !

    Set tNewStream = ##class(%Stream.TmpCharacter).%New()
    Set tSC = ##class(%ZEN.Utils).%ObjectToXML(tNewStream, tPage)

    Write "New XData: ", 'tHidden, !
    Do tNewStream.Rewind()
    Do tNewStream.OutputToDevice()
    Do tNewStream.Rewind()

    Set tSC = ..SavePage(,tNewStream)

    Do $system.OBJ.Compile($classname())

    Quit tSC
}

ClassMethod GetPageObject(pClassName = {$classname()}, Output pPage As %ZEN.Component.page) As %Status
{
    Set tReader = ##class(%XML.Reader).%New()
    Set tSC = tReader.OpenStream(##class(%Dictionary.CompiledXData).%OpenId(pClassName _ "||" _ "Contents").Data)
    If $$$ISERR(tSC) Quit tSC

    Do tReader.Correlate("page","%ZEN.Component.page")

    #; there should only be one page defined
    Do tReader.Next(.pPage,.tSC)
    Quit:$$$ISERR(tSC) tSC
    Quit:'$IsObject(pPage) $$$ERROR($$$GeneralError,"No <page> element defined in Contents block.")

    Quit tSC
}

ClassMethod SavePage(pClassName = {$classname()}, pStream) As %Status
{
    Set tCDef = ##class(%Dictionary.ClassDefinition).%OpenId(pClassName)
    If '$IsObject(tCDef) {
        Set tSC = $$$ERROR($$$GeneralError,"Unable to open class definition: " _ tClass)
    }
    #; find XDATA Contents block
    Set tIndex = tCDef.XDatas.FindObjectId(pClassName _ "||" _ "Contents")
    If (tIndex '= "") {
        #; get XDATA as stream
        Set tStream = tCDef.XDatas.GetAt(tIndex).Data
        Do tStream.CopyFrom(pStream)
    }
    Else {
        #; create a new XData block !!!
    }
    Set tSC = tCDef.%Save()
    Quit tSC
}

}

Calling:

Write $System.Status.GetErrorText(##class(ZENDemo.AutoDemo).Modify())

Toggles visibility of the ID column.

In what context are you encountering IDKEY?

While Primary Key, ID  and IDKEY refer to the same concept, there are some nuances:

  • Primary Key - is something that uniquely identifies a row or an object (it's usually a property or several properties)
  • ID is a default name of the Primary Key property (persistent cache classes/tables have ID property by default and it's a Primary Key) 
  • IDKEY is an index over Primary Key property (regardless of the actual property name)

Angular pages are often templates filled with data (via REST) and so it' possible to use that. In the root broker of the application add request tracking (who accessed what and when).

OnPreDispatch method works for that purpose.

/// This method Gets called prior to dispatch of the request. Put any common code here
/// that you want to be executed for EVERY request. If pContinue is set to 0, the
/// request will NOT be dispatched according to the UrlMap. If this case it's the
/// responsibility of the user to return a response.
ClassMethod OnPreDispatch(pUrl As %String, pMethod As %String, ByRef pContinue As %Boolean) As %Status
{
    Quit $$$OK
}