go to post Ashok Kumar · Dec 19, 2023 Hello @Nimisha Joseph Can you try the below XData BPL [ XMLNamespace = "http://www.intersystems.com/bpl" ] { <process language='objectscript' request='Ens.Request' response='Ens.Response' height='2000' width='2000' > <context> <property name='Forename' type='%String' instantiate='0' > <parameters> <parameter name='MAXLEN' value='50' /> </parameters> </property> <property name='Surname' type='%String' instantiate='0' > <parameters> <parameter name='MAXLEN' value='50' /> </parameters> </property> <property name='ReportDiscipline' type='%String' instantiate='0' > <parameters> <parameter name='MAXLEN' value='50' /> </parameters> </property> <property name='tResult' type='%SQL.StatementResult' instantiate='0' /> </context> <sequence xend='200' yend='950' > <trace name='TEMP trace element' value='"In business process "_request.StringValue' xpos='200' ypos='250' /> <assign property="context.ReportDiscipline" value="request.StringValue" action="set" xpos='200' ypos='350' /> <trace value='"ReportDiscipline value: "_context.ReportDiscipline' xpos='200' ypos='450' /> <assign property="context.tResult" value="##Class(%SQL.Statement).%ExecDirect(,"select * from table")" action="set" xpos='200' ypos='550' /> <while condition='context.tResult.%Next()' xpos='200' ypos='650' xend='200' yend='450' > <assign property="context.surname" value="context.tResult.%Get("surname")" action="set" xpos='200' ypos='250' /> </while> <trace value='"SQLCODE: "_SQLCODE' xpos='200' ypos='750' /> <trace value='"returned value: "_context.Forename' xpos='200' ypos='850' /> </sequence> </process> }
go to post Ashok Kumar · Dec 18, 2023 For FHIR message you should use the Content-Type application/fhir+json (refer section 3.2.0.1.10 Content Types and encodings)
go to post Ashok Kumar · Dec 7, 2023 Hello @Denys Kondratiuk you can use below code to convert the response data to JSON object ClassMethod test() { set response = ##Class(%DynamicAbstractObject).%FromJSON(%request.HttpResponse.Data) set iter = response.%GetIterator() while iter.%GetNext(.key,.obj) { ;looping the array object Write "Name: ", obj.Name, ! Write "Gender: ", obj.Gender, ! } }
go to post Ashok Kumar · Nov 30, 2023 Hello @Michael Wood If those values are not part of the response. Then don't need to worry about it. Code will skip by default. Incase if the property is not defined . Then you have to declare the %JSONIGNOREINVALIDFIELD value as 1 to prevent from that ERROR #9406: Unexpected format for value of field. Parameter %JSONIGNOREINVALIDFIELD As BOOLEAN = 1;
go to post Ashok Kumar · Nov 30, 2023 Hello @Enrico Parisi That's right, However Instead of creating a custom datatype to fix this. create/use the auto generated method for that property "OPDTLogicalToXSD" and implement the code logic. ClassMethod OPDTLogicalToXSD(%val As %TimeStamp) As %String [ ServerOnly = 1 ] { Set %val=##class(%Library.TimeStamp).LogicalToXSD(%val) Quit $translate(%val,"TZ"," ") }
go to post Ashok Kumar · Nov 30, 2023 Hello @water huang As You can create a class method with name of your property " OPDTLogicalToXSD" and add the code conversion for the datetime as mentioned by @Enrico Parisi at XML export time. It's suitable for both XML and JSON adaptor. Sample code. Class Samples.NewClass2 Extends (%Persistent, %Populate, %JSON.Adaptor, %XML.Adaptor) { Property OPDT As %Library.DateTime; ClassMethod OPDTLogicalToXSD(%val As %TimeStamp) As %String [ ServerOnly = 1 ] { Set %val=##class(%Library.TimeStamp).LogicalToXSD(%val) Quit $translate(%val,"TZ"," ") } } output <NewClass2><OPDT>2023-11-30 11:07:02</OPDT></NewClass2>
go to post Ashok Kumar · Nov 30, 2023 Hello @water huang, The default implementation of the XMLExportToString in %XML.Adaptor basically converts the date format as 2023-11-28T13:57:26Z for the property value by the logic $translate(value," ","T")_"Z"). So, I guess you may need to convert by own.
go to post Ashok Kumar · Nov 29, 2023 Hello @Andy Khemraj Are you returning the file name with business operation response.
go to post Ashok Kumar · Nov 29, 2023 Hello @Michael Wood It won't allow to import the array values directly from the response/payload If you're using %JSONImport in %JSON.Adaptor due to the datatype validation while import. So, You may define the list of properties in separate class definition and use that Property Messages As list of class if the array has object values and It allows to import. Or if it's literal string inside an array then it allows without any issues. Sample: Literal string values inside array Class Samples.NewClass2 Extends (%Persistent, %Populate, %JSON.Adaptor) { Property email As list Of %String; Parameter %JSONIGNOREINVALIDFILED = 1; Property FirstName As %String; Property LastName As %String; ClassMethod test() { set json={"FirstName":"test","LastName":"lastname","email":["test@gmail.com","test2@gmail.com"]} set obj= ..%New() set st= obj.%JSONImport(json) if $$$ISERR(st) write $SYSTEM.OBJ.DisplayError(st) write obj.%JSONExport() } } output LEARNING>d ##Class(Samples.NewClass2).test() {"email":["test@gmail.com","test2@gmail.com"],"FirstName":"test","LastName":"lastname"}
go to post Ashok Kumar · Nov 28, 2023 Hi @Nimisha Joseph The query is executed directly when you call. Check this SQL.Statement set tResult = ##class(%SQL.Statement).%ExecDirect(,"select name,age from Sample.Person") "And result will be stored in tResult variable. Try executing the below in trace or assign and see write tResult.%SQLCODE write tStatement
go to post Ashok Kumar · Nov 27, 2023 Hello @Nimisha Joseph As per you're SQL implementation. It's actually straightforward and you took and store "Forename" and "Surname" in to context. haven't taken any SQL resultset object to loop. You can execute only embedded sql in the <sql> BPL element. So, If you want to execute the query you can assign the SQL object by using <assign> or you can use code block to write executable codes. I have added some sample code below for reference. Assign the SQL result set object to context variable while the result set process and result and do your implementation /// 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='Forename' type='%String' instantiate='0' > <parameters> <parameter name='MAXLEN' value='50' /> </parameters> </property> <property name='Surname' type='%String' instantiate='0' > <parameters> <parameter name='MAXLEN' value='50' /> </parameters> </property> <property name='ReportDiscipline' type='%String' instantiate='0' > <parameters> <parameter name='MAXLEN' value='50' /> </parameters> </property> <property name='tResult' type='%SQL.StatementResult' instantiate='0' /> </context> <sequence xend='200' yend='950' > <trace name='TEMP trace element' value='"In business process "_request.StringValue' xpos='200' ypos='250' /> <assign property="context.ReportDiscipline" value="request.StringValue" action="set" xpos='200' ypos='350' /> <trace value='"ReportDiscipline value: "_context.ReportDiscipline' xpos='200' ypos='450' /> <assign property="context.tResult" value="##Class(%SQL.Statement).%ExecDirect(,"select * from table")" action="set" xpos='200' ypos='550' /> <while condition='context.tResult.%Next()' xpos='200' ypos='650' xend='200' yend='450' > <assign property="context.surname" value="context.tResult.%Get("surname")" action="set" xpos='200' ypos='250' /> </while> <trace value='"SQLCODE: "_SQLCODE' xpos='200' ypos='750' /> <trace value='"returned value: "_context.Forename' xpos='200' ypos='850' /> </sequence> </process> } HTH.
go to post Ashok Kumar · Nov 21, 2023 Hello @Colin Brough Can you try is this approach is suitable. Create a Business Service with Ens.InboundAdapter or without adapter. Call your BPL process as usual interoperability production flow. Eventually Create your custom Task and invoke your Business service from the OnTask Inherited Method Class HL7Task.Test Extends %SYS.Task.Definition { Method OnTask() As %Status { Set status = $$$OK Try { #dim service As Ens.BusinessService Set status = ##class(Ens.Director).CreateBusinessService("HL7.Feed.TriggerService",.service) if $isobject(service) { do service.OnProcessInput(pInput,.pOutpt) } } Catch(ex) { Set status = ex.AsStatus() } return status } } Business service Class HL7.Feed.TriggerService Extends Ens.BusinessService { Parameter ADAPTER = "Ens.InboundAdapter"; Property TargetConfigName As Ens.DataType.ConfigName; Parameter SETTINGS = "TargetConfigName:Basic"; Method OnProcessInput(pInput As %RegisteredObject, Output pOutput As %RegisteredObject) As %Status { Do ..SendRequestSync(..TargetConfigName,pInput,.pOutput) Quit $$$OK } }
go to post Ashok Kumar · Nov 20, 2023 Hi @Prasanth Annamreddy If you're using Interoperability production to publish your FHIR resources. Then you may instantiate the object for the class HS.FHIRServer.Interop.Request to process the request and production expects this object as a input . Otherwise it will throw "ERROR <Ens>ErrRequestNotHandled: Request message not handled"
go to post Ashok Kumar · Nov 15, 2023 Maybe you're using literal properties for list operation. It causes the list error.
go to post Ashok Kumar · Nov 14, 2023 Hello @Luis Angel Pérez Ramos as of my understanding, We can send the it's as a query parameter or http request body if the design supports. Incase the external system protocol was designed to handled the authorization and some additional custom headers are must be a request header Then it should be part of the headers section otherwise I believe it may creates some issue with the request/response.