The error from Prepare will write to messages.log with this change:

Class otw.dynq

{

ClassMethod prepareQ() As %Status

{

    Set result=##class(%ResultSet).%New("%DynamicQuery:SQL")

    Set sc=result.Prepare("SELECT %ID, Name, Salary FROM Sample.Employee WHERE Salary > ?")

    If $$$ISERR(sc) {

        // here I want to capture the error details in trace , log , that I can see in production web page

        Try {

            Set x = $System.Status.GetOneStatusText(sc)

            Do ##class(%SYS.System).WriteToConsoleLog("otw.dynq prepareQ: "_x)

        } Catch exception {

            Do BACK^%ETN // Log error in error log

        }

    }

    Quit sc

}

}

I created a class for dynamic query:

Class otw.dynq

{

ClassMethod prepareQ() As %Status

{

    Set result=##class(%ResultSet).%New("%DynamicQuery:SQL")

    Set sc=result.Prepare("SELECT %ID, Name, Salary FROM Sample.Employee WHERE Salary > ?")

    If $$$ISERR(sc) {

        // here I want to capture the error details in trace , log , that I can see in production web page

        Try {

            Do ##class(%SYS.System).WriteToConsoleLog("%ZSTART Routine: "_"Import Users",0,0)

        } Catch exception {

            Do BACK^%ETN // Log error in error log

        }

    }

    Quit sc

}

}

I call the Dynamic Query Prepare from BPL and Trace the Status Text from the Prepare:

///

Class otw.bplJSON2HL7 Extends Ens.BusinessProcessBPL

{

/// BPL Definition

XData BPL [ XMLNamespace = "http://www.intersystems.com/bpl" ]

{

<process language='objectscript' request='Ens.Request' response='Ens.Response' height='2000' width='2000' >

<context>

<property name='dynPrepareStatus' type='%Library.Status' instantiate='0' />

</context>

<sequence xend='200' yend='750' >

<trace name='request.Stream.Read()' value='request.Stream.Read()' xpos='200' ypos='250' />

<assign name="dynPrepareStatus" property="context.dynPrepareStatus" value="##class(otw.dynq).prepareQ()" action="set" xpos='200' ypos='350' />

<trace name='dynPrepareStatus' value='$System.Status.GetOneStatusText(context.dynPrepareStatus)' xpos='200' ypos='450' />

<transform name='otw.dtlJSON2HL7' class='otw.dtlJSON2HL7' source='request' target='response' xpos='200' ypos='550' />

<call name='HL7FileOperation' target='HL7FileOperation' async='1' xpos='200' ypos='650' >

<request type='Ens.Request' >

<assign property="callrequest" value="response" action="set" />

</request>

<response type='Ens.Response' />

</call>

</sequence>

</process>

}

Storage Default

{

<Type>%Storage.Persistent</Type>

}

}

The code is in this GitHub repo:

https://github.com/oliverwilms/HL7

Joe,

I created a HL7 production, added JSON Passthrough File Service. Use BPL and DTL to transform Ens.StreamContainer to HL7 Message. Code is here:

https://github.com/oliverwilms/HL7

Input test file I use this (no double double quotes):

{"Doctype":"ADT^A01","PatientId":"123","PatientName":"Alex"}

I see PatientId in HL7 message, but not PatientName. Need to review the DTL ...

Class HS.Local.Example.ProcessBPL Extends Ens.BusinessProcessBPL
{ Storage Default
{
<Type>%Storage.Persistent</Type>
} /// BPL Definition
XData BPL [ XMLNamespace = "http://www.intersystems.com/bpl]
{
<process language='objectscript' request='EnsLib.HTTP.GenericMessage' response='EnsLib.HTTP.GenericMessage' height='2000' width='2000' >
<context>
<property name='SuccessResponse' type='%String' instantiate='0' >
<parameters>
<parameter name='MAXLEN'  value='50' />
</parameters>
</property>
<property name='ConvertedStream' type='Ens.StreamContainer' instantiate='0' />
</context>
<sequence xend='200' yend='1000' >
<code name='ConvertedStream' xpos='200' ypos='250' >
<![CDATA[ If 1=request.%IsA("Ens.StreamContainer") {
   Set context.ConvertedStream = request
 }
 If 1=request.%IsA("EnsLib.HTTP.GenericMessage") {
   Set context.ConvertedStream = ##class(Ens.StreamContainer).%New()
   Set context.ConvertedStream.Stream = ##class(%GlobalCharacterStream).%New()
   Set tSC = context.ConvertedStream.Stream.CopyFrom(request.Stream)
   Set context.ConvertedStream.OriginalFilename = $Piece(request.HTTPHeaders.GetAt("RawParams"),"=",2)
 }
 If 1=request.%IsA("EnsLib.Kafka.Message") {
   Set context.ConvertedStream = ##class(Ens.StreamContainer).%New()
   Set context.ConvertedStream.Stream = ##class(%GlobalCharacterStream).%New()
   Set tSC = context.ConvertedStream.Stream.Write(request.value)
   Set context.ConvertedStream.OriginalFilename = request.key
   Set tSC = context.ConvertedStream.%Save()
 }]]>
</code>
<if name='Check Test Transaction' condition='context.ConvertedStream.OriginalFilename="TEST.txt"' xpos='200' ypos='350' xend='200' yend='700' >
<false>
<code name='Store Document' xpos='335' ypos='500' disabled="false">
<![CDATA[ Set tSC = ##class(HS.Local.VA.eSCM.FMS.Util).StoreStream(context.ConvertedStream,context.ConvertedStream)]]>
</code>
<call name='Call ToIrisMail Operation' target='ToIrisMail' async='0' xpos='335' ypos='600' >
<request type='Ens.StreamContainer>
<assign property="callrequestvalue="context.ConvertedStreamaction="set" />
</request>
<response type='EnsLib.HTTP.GenericMessage/>
</call>
</false>
</if>
<code name='setting of success response' xpos='200' ypos='800' >
<![CDATA[ Set context.SuccessResponse = ""
 If 1=request.%IsA("EnsLib.HTTP.GenericMessage") {
   Set tmp = ##class(%Library.GlobalBinaryStream).%New()
   Set tSC = tmp.Write("File received successfully")
   Set tSC = tmp.%Save()
   Set context.SuccessResponse=##class(EnsLib.HTTP.GenericMessage).%New(tmp,,request.HTTPHeaders)
   Do context.SuccessResponse.HTTPHeaders.SetAt("HTTP/1.1 200 OK","StatusLine")
   Set tSC = context.SuccessResponse.%Save()
 }]]>
</code>
<assign name="send response back" property="responsevalue="context.SuccessResponseaction="set" xpos='200' ypos='900' />
</sequence>
</process>
} }