go to post Ashok Kumar · Sep 23, 2023 I agree with Mr @Mihoko Iijima mentioned points. If Interoperability production need to be executed as part of the FHIR REST call configure HS.FHIRServer.Interop.Service this class in both Production and FHIR server configuration page. No need do it for using the direct Intersystems FHIRServer storage.
go to post Ashok Kumar · Sep 23, 2023 You need to pass the subscripts also part of the $NAME itself to make it dynamic instead start from the beginning USER>s subscript="a" ;your dynamic subscript USER>set GlobalVar=$NAME(^["IRISMYDEV"]TEST(subscript)) ; pass the subscript into $NAME USER>write GlobalVar ^["IRISMYDEV"]TEST("a") USER>set sub="" write $o(@GlobalVar@(sub),1,data) ; next subscript of "a" b USER>write @GlobalVar Test USER>write GlobalVar ^["IRISMYDEV"]TEST("a")
go to post Ashok Kumar · Sep 22, 2023 You could add $char(13,10) or $$$NL ( this also refer $c(13,10) ) macro to make a new line $$$LOGINFO("object: 'This is a try'"_$$$NL_"this is the second line with an example parameter: "_$get(x)_$$$NL_"this is the third line with an example parameter: "_$get(y))
go to post Ashok Kumar · Sep 22, 2023 Hi @Ryan Pflughaupt You need to use the $NAME function set the global variable into local variable to process global names extended global reference dynamically. There is no problem with setting global name in local variable if it's belongs from the current namespace. Use indirection( @ ) operator to do $query,$order,$data string functions and get values from it(Suggest to use $NAME for current namespace global as well) . USER>set GlobalVar=$NAME(^["IRISMYDEV"]TEST) USER>zwrite @GlobalVar ^["IRISMYDEV"]TEST("a")="Test" ^["IRISMYDEV"]TEST("a","b")="66739,34774" ^["IRISMYDEV"]TEST("a","b","c")="Apple\Orange-Peach#ball\1#0#1#1" USER>set sub=$query(@GlobalVar) for quit:sub="" write sub,! set sub=$Query(@sub) ^["IRISMYDEV"]TEST("a") ^["IRISMYDEV"]TEST("a","b") ^["IRISMYDEV"]TEST("a","b","c") by using this you can take the values. Check last global reference by using the $zreference function.
go to post Ashok Kumar · Sep 20, 2023 Have you tried to pass the provider as a host variable in the query SELECT ID FROM TestTable WHERE ProviderName = :PROVIDER AND IDType= 'BPI'
go to post Ashok Kumar · Sep 20, 2023 Hello @Muhammad Waseem Maybe you can try extract the patient resource from bundle or use if it's already resource. Load into FHIR model patient class HS.FHIR.DTL.vR4.Model.Resource.Patient with the extracted resource. Then you can convert the Birthdate and validate the Age. You can use the same logic in your code DTL in your FHIR process in between FHIR service (HS.FHIRServer.Interop.Service) to FHIR operation (HS.FHIRServer.Interop.Operation) ClassMethod VaidatePatientResource(patientResourceStreram As %Stream.Object) { #dim patient As HS.FHIR.DTL.vR4.Model.Resource.Patient try { set patient = ##class(HS.FHIR.DTL.vR4.Model.Resource.Patient).FromJSON(patientResourceStreram) Set age = $horolog - $ZdateH(patient.birthDate,3)\360 if age<18 $$$ThrowStatus($$$ERROR($$$GeneralError, "Age is less than 18")) } catch ex { w ex.DisplayString() } }
go to post Ashok Kumar · Sep 20, 2023 Hello @Padmaja Konduru The certificate and private key is configured for the your SSL/TLS connection. You can try executing the below code to get some certificates of the certificate I have attached my sample "test" SSL/TLS which is included the sample certificate and private key (x509) Call the SSLDetails method with your SSL name. This method will return an local array with some basic details like expire date , subject and so on. SSL configuration name was taken from the System > Security Management > SSL/TLS Configurations /// Call this method with your ssl name ClassMethod SSLDetails(SSLName As %String = "") As %Status { new $namespace set $namespace="%SYS" set ssl=##class(Security.SSLConfigs).%OpenId("test") set privateKeyFile = ssl.CertificateFile set file = ##class(%FileCharacterStream).%New() do file.LinkToFile(privateKeyFile) set str=file.Read($$$MaxLocalLength) do ..certificateDetails(str,.fields) zw fields return $$$OK } ClassMethod certificateDetails(str As %String, ByRef fields) { #;getting some basic details for field="SerialNumber","Issuer","ValidityNotAfter","ValidityNotBefore","Subject","SubjectKeyIdentifier" { set fields(field) = $SYSTEM.Encryption.X509GetField(str,field) } } output verify the local array fields("ValidityNotAfter") value for the expired date IRISMYDEV>do ##class(Sample.NewClass1).SSLDetails("test") fields("Issuer")="L=test,CN=test,O=test,ST=test,C=us" fields("SerialNumber")=0 fields("Subject")="L=test,CN=test,O=test,ST=test,C=us" fields("SubjectKeyIdentifier")=$c(144)_"¾&p"_$c(28)_"áÁZÀ"_$c(140)_"Ô4OÜ"_$c(24)_"º""=B"_$c(137) fields("ValidityNotAfter")="2023-09-21 06:13:50" fields("ValidityNotBefore")="2023-09-20 06:13:50"
go to post Ashok Kumar · Sep 19, 2023 Basically Summary Document Architecture aka SDA is an intersystems intermediary format to convert the HL7 Messages to FHIR or create an FHIR resource form custom data. vR4 is representing FHIR version. So I guess. You may need to upgrade the instance to get vR4 packages
go to post Ashok Kumar · Sep 19, 2023 Hello @Michael Wood, The line property is actually a list of string in address object property. So You should use direct Insert action instead of Set for that property when doing mapping in DTL for single values. If it's list/collection the you should foreach the list property and insert the values to the line() property. Refer the screenshots below for both scenarios. Direct single Insert XData DTL [ XMLNamespace = "http://www.intersystems.com/dtl" ] { <transform sourceClass='CSVtoHL7.Inputfile.Record' targetClass='HS.FHIR.DTL.vR4.Model.Resource.Location' create='new' language='objectscript' > <assign value='source.FirstName' property='target.address.line' action='insert' key='1' /> </transform> } List XData DTL [ XMLNamespace = "http://www.intersystems.com/dtl" ] { <transform sourceClass='CSVtoHL7.Inputfile.Record' targetClass='HS.FHIR.DTL.vR4.Model.Resource.Location' create='new' language='objectscript' > <foreach property='source.AddressLine()' key='k1' > <assign value='source.AddressLine.(k1)' property='target.address.line' action='insert' key='k1' /> </foreach> </transform> } result
go to post Ashok Kumar · Sep 19, 2023 Hello @Jimmy Christian You can use the foreach element instead of code block if it's direct set to target and no code logic required. I have attached the sample codes below. You can refer mr. @Sylvain Guilbaud samples as well. XData DTL [ XMLNamespace = "http://www.intersystems.com/dtl" ] { <transform sourceClass='CSVtoHL7.Inputfile.Record' targetClass='CSVtoHL7.Test.NewClass2' targetDocType='2.5:ADT_A01' create='new' language='objectscript' > <foreach property='source.EmailList()' key='k1' > <assign value='source.EmailList.(k1)' property='target.ListOfEmails.(k1)' action='set' /> </foreach> </transform> } DTL output
go to post Ashok Kumar · Sep 18, 2023 You can use code block in DTL to write the iterate code fo the list or general loop iteration for item=1,3,4,5 /// code }
go to post Ashok Kumar · Sep 15, 2023 You can add sql from the add action and place your embedded sql query and get the values in host variable. Then set the sql return value to the field directly like below. XData DTL [ XMLNamespace = "http://www.intersystems.com/dtl" ] { <transform sourceClass='EnsLib.HL7.Message' targetClass='EnsLib.HL7.Message' sourceDocType='2.3.1:ADT_A01' targetDocType='2.3.1:ADT_A01' create='new' language='objectscript' > <assign value='source.{PV1:SetIDPV1}' property='target.{PV1:SetIDPV1}' action='set' disabled='1' /> <sql> <![CDATA[ select count(id) INTO :value from Sample.Person]]></sql> <assign value='value' property='target.{PV1:AdmissionType}' action='set' /> </transform> }
go to post Ashok Kumar · Sep 12, 2023 May be you can try to take a clone of the object by %ConstructClone() I know it increments the reference count. However you can keep the old object for validation.
go to post Ashok Kumar · Sep 11, 2023 Hello smythe, There are couple of ways to import your file into stream and convert to Ens.StreamContianer First you can create a %FileCharacterStream object and link your file in to it. Create a streamcontainer object and send the created stream as a first parameter in %OnNew to Ens.StreamContiner class. ClassMethod StreamContainer() { set file="dir\file" ; Your directory and file name(C:\Intersystems\new13.txt) set file = ##class(%FileCharacterStream).%New() do file.LinkToFile(file) set strmContainer=##class(Ens.StreamContainer).%New(file) zwrite strmContainer.Stream.Read($$$MaxLocalLength) } Second, This way it's almost similar way. But Instead of pushing directly into Ens.Streamcontainer. You need to create a object for SDA. Import your file through XMLImportSDAString method to prepare SDA object. Now you have SDA object handy. So you can do any SDA stuffs with this object. Eventually it's an implicit step for validate your SDA file structure(Keep in mind the file structure should be exact XML format of SDA). Once the SDA object generated you can use Stream method generate stream from this SDA. Now you can convert to Ens.StreamContainer. Refer the below code to implement the above steps ClassMethod FileToSDAToEnsContainer() { set file = ##class(%FileCharacterStream).%New() do file.LinkToFile("C:\FHIRFILE\new13.txt") set SDA3Container=##class(HS.SDA3.Container).%New() do SDA3Container.XMLImportSDAString(file.Read($$$MaxLocalLength)) zwrite SDA3Container do SDA3Container.ToQuickXMLStream(.stream) set strmContainer=##class(Ens.StreamContainer).%New(stream) zwrite strmContainer.Stream.Read() }
go to post Ashok Kumar · Sep 11, 2023 No. GetColumnType() method returns an integer of the datatype.You can manually get the datatype from the integer. Class Sample.Person Extends %Persistent { Property FirstName As %String; Property LastName As %String; Property StartDate As %Library.TimeStamp ; Property Age As %Integer; Property TestCurrency As %Currency; Property TestBoolean As %Boolean; Property TestCharStream As %Stream.GlobalCharacter; Query TestQuery() As %SQLQuery [ SqlProc ] { select firstname,LastName,Age,TestCurrency,TestBoolean,TestCharStream from Sample.Person } ClassMethod GetDataTypeOfField() As %String { set result = ##class(%ResultSet).%New("Sample.Person:TestQuery") ; for I=1:1:result.GetColumnCount() { write "Column Name: ",result.GetColumnName(I)," " write "Datatype number: ",result.GetColumnType(I)," " write "DataType: ",..GetDataType(result.GetColumnType(I)),!! } } ///Get datatype from the integer ClassMethod GetDataType(type As %Integer=0) [ CodeMode = expression ] { $Case(type, 1:"BINARY", 2:"DATE", 3:"DOUBLE", 4:"HANDLE", 5:"INTEGER", 6:"LIST", 7:"LONGVARCHAR", 8:"TIME", 9:"TIMESTAMP", 10:"VARCHAR", 11:"STATUS", 12:"BINARYSTREAM", 13:"CHARACTERSTREAM", 14:"NUMERIC", 15:"CURRENCY", 16:"BOOLEAN", 17:"OID", 18:"BIGINT", 19:"FDATE", 20:"FTIMESTAMP", :"") } } The output when execute the method GetDataTypeOfField() IRISMYDEV>d ##class(Sample.Person).GetDataTypeOfField() Column Name: FirstName Datatype number: 10 DataType: VARCHAR Column Name: LastName Datatype number: 10 DataType: VARCHAR Column Name: Age Datatype number: 5 DataType: INTEGER Column Name: TestCurrency Datatype number: 15 DataType: CURRENCY Column Name: TestBoolean Datatype number: 16 DataType: BOOLEAN Column Name: TestCharStream Datatype number: 13 DataType: CHARACTERSTREAM refer the documentation here