go to post Ashok Kumar · Nov 3, 2023 Basically you should keepIntegrity enabled. Otherwise it will delete all the messages regardless of whether processed or not processed. Select "All types" in Type to purge. You can enable the " Open output file when task is running? " and provide the file location. Once the process is completed or Errored you can check the Ens_Util.Log to get some additional information. Can you try the above steps.
go to post Ashok Kumar · Nov 3, 2023 The object doesn't throw the <MAXSTRING> error. However variable do. If your serialization the JSON and stored into variable. If it's reaches the maximum string it will throw an error.
go to post Ashok Kumar · Oct 16, 2023 Hello You can send you're POST/GET URL's as part of the method itself. Refer the below sample codes Set httprequest=##class(%Net.HttpRequest).%New() Set httpRequest.ContentType = "application/json" Set httpRequest.Server = "renderProjectName.onrender.com" set httprequest.https=1 ;add this additional set if you're going to make it as a HTTPS call set httprequest.SSLConfiguration = "your ssl certificate" ; include the certificate as well for HTTPS call's Do httprequest.Post("/")
go to post Ashok Kumar · Oct 8, 2023 As far as we don't have any default functionality for JSON beautify/Pretty print option in interoperability. There is alternative OEX app(https://openexchange.intersystems.com/package/JsonTraceViewer ) available to do it.
go to post Ashok Kumar · Oct 6, 2023 Generally we can't execute the macros directly in terminal, studio output. The Macro preprocessor aka MPP do converts the marcos into the expression or function at the time of compilation. So, You can open and use the .int file for the specific code. Test.mac macromac write $$$EnsMajorVersion ; Test.int macromac write $system.Version.GetMajor() ; Get the relevant value of macros and execute it in terminal or output window.
go to post Ashok Kumar · Oct 4, 2023 You can do $Name for the global and use your subscript runtime set gbl= $NA(^ABC) write @gbl@(1,2) set sub=1 write @gbl@(sub)
go to post Ashok Kumar · Sep 26, 2023 Hi @RKumar You need to set the properties SSLConfiguration and UseSTARTTLS for enabling SSL configuration set smtp=##class(%Net.SMTP).%New() set smtp.SSLConfiguration="TestSSL" ;your SSL configured name in System Management Portal set smtp.UseSTARTTLS=1 /* ... Additional required property set */
go to post Ashok Kumar · Sep 25, 2023 The syntax of $$$LOGINFO won't allow you make it in multiple lines. Instead you can set it in local variable and pass the variable in LOGINFO for better visibility set log= "object: 'This is a try'" _"this is the second line with an example parameter: "_$get(x,1) _"this is the third line with an example parameter: "_$get(y,5) $$$LOGINFO(log)
go to post Ashok Kumar · Sep 25, 2023 Hi @Lingnan Zhang You can use %File API class to create a directory. This result will be 1 if directory is created else 0. Refer the sample code below set directory="c:\Test" write ##class(%File).CreateDirectory(directory) ; result will be 1 if create else 0
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 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
go to post Ashok Kumar · Sep 7, 2023 Hello David, Both object script and SQL transaction rollback's are captured in log once you enabled the setting is true System > Configuration > Compatibility Settings > Edit Compatibility Settings for rollback log USER>write $ZVIRIS for Windows (x86-64) 2023.1 (Build 229) Fri Apr 14 2023 17:36:18 EDTUSER>tstart TL1:USER>set ^TEST=1 TL1:USER>trollback log entry
go to post Ashok Kumar · Sep 7, 2023 This is nice. Anyway there are few suggestions Make sure the commands and string functions are following same format either SET or Set or set Use %DynmaicArray instead of literal constructors [ ]. Because it's instantiate the methods of the object like %push when accessing it. Literal constructors won't do it. Comments are essential for better understanding the program flow. Anyway if you don't want to appear your comments in INT code then use the syntax #; instead of ; ex: #;Test comment Use $ListNext to get the list values one by one. It rid out the 2 additional string functions $LISTLENGTH and $LISTGET usage in your case. Easy to understand You can use $Increment instead of declaring a questionNumber variable and do addition operation in the code. Add some conditional checks to skip the if the values in between | is empty I have attached the code sample below. ClassMethod createResponse(data As %String(MAXLEN="")) As %DynamicArray { set items = ##class(%DynamicArray).%New() #;1.- Questions splitted by "|" set ptr=0 set listQuestions = $ListFromString(data, "|") #;2.- Iterate while $ListNext(listQuestions,ptr,questionAnswer) { #;3.- Update variables continue:questionAnswer="" set question= $Piece(questionAnswer, ":", 1) set answer = $ZStrip($PIECE(questionAnswer, ":", 2), "<W") //Get rid of initial whitespace #;4.- Generate item set item = { "definition": ("question "_($Increment(questionNumber))), "text": (question), "answer": [ { "valueString": (answer) } ] } do items.%Push(item) } return items } Hope this helps
go to post Ashok Kumar · Sep 2, 2023 AFAIK No. There is no straightforward way to import JSON from FHIR discrete resources to SDA3 objects by %JSONImport(). Basically, there are various stages involved in converting the FHIR to HL7 and vice versa. To achieve this, Intersystems created an intermediary format called SDA. However, there are more processes involved whenever convert the bundle or discrete resource.for example In some instances, the FHIR resource data element name (property) is not the same as the SDA property. Lots of internal DTL's are invoked or invoked at the conversion time, and an SDA object is created based on that output. Typically it's common for SDA to FHIR and vice versa. DTL's are crucial to accomplish this conversion. Some of the data elements are not mapped in the standard FHIR to SDA or SDA to FHIR DTL transformation. HS.FHIR.DTL.vR4.SDA3.AllergyIntolerance.Allergy in this DTL the "criticality" data element is not mapped with SDA object In this case you should create your custom DTL from the already implemented DTL to convert the values to object. So If you haven't added this type of additional properties in the SDA extension class, it won't work. Metadata values and lookup tables vary from SDA to FHIR. SDA has 'A' in the lookup tables for some fields, while FHIR has 'Active'. There is a internal validation runs against every data element to verify the generated FHIR resource Every time
go to post Ashok Kumar · Aug 31, 2023 The reason behind the conversion is Cache identifies/assume from 1900 - 1999 year if you send two digit for year. So, You should send four digit year. attached the documentation "Two or four digits may be specified for years in the range 1900 to 1999. Four digits must be specified for years before 1900 or after 1999."
go to post Ashok Kumar · Aug 29, 2023 As per your code. Couple of things. Firstly, the item is list of object so you should use Insert method. You're inserting item.ItemName instead item object. Property Item As list Of AllItems; expects object. Not a string. Do AllItem.Item.Insert(Item)
go to post Ashok Kumar · Aug 24, 2023 I'm not sure why the request class CSVtoHL7.Inputfile.Record inherits from right. All the request and response are required persistent object. This will be used to display the entire flow in the visual trace section. I have attached some sample below. You can add a property setter method for property DOB and modify the value from MM/DD/YYYY to +$H value. This will keep the internal date format in database. Class CSVtoHL7.Inputfile.Record Extends (Ens.Request, %XML.Adaptor, EnsLib.RecordMap.Base) [ ProcedureBlock ] { Property ID As %Integer; Property LastName As %String; Property FirstName As %String; Property MiddleName As %String; Property DOB As %Date; Method DOBSet(pDate) As %Status { Set i%DOB= $ZDH(pDate) Quit $$$OK } Property Gender As %String; ClassMethod createObj() As CSVtoHL7.Inputfile.Record { Set obj = ##class(CSVtoHL7.Inputfile.Record).%New() Set obj.DOB="12/30/2001" Set obj.FirstName="Test" Set obj.ID=12345 Set obj.MiddleName = "middle" Set obj.Gender="M" return obj } } Create a object for the request class and send to Transformation. you can use the logic $translate($ZDT(source.DOB_",0",3)," ","T")_"Z" in DTL to convert the internal date format to required output 2023-08-24T00:00:00Z. You can refer the DTL sample below Class CSVtoHL7.DTL.Record Extends Ens.DataTransformDTL [ DependsOn = (CSVtoHL7.Inputfile.Record, EnsLib.HL7.Message) ] { Parameter IGNOREMISSINGSOURCE = 1; Parameter REPORTERRORS = 1; Parameter TREATEMPTYREPEATINGFIELDASNULL = 0; XData DTL [ XMLNamespace = "http://www.intersystems.com/dtl" ] { <transform sourceClass='CSVtoHL7.Inputfile.Record' targetClass='EnsLib.HL7.Message' targetDocType='2.5:ADT_A01' create='new' language='objectscript' > <assign value='source.ID' property='target.{PID:SetIDPID}' action='set' /> <assign value='source.FirstName' property='target.{PID:PatientName().FamilyName}' action='set' /> <assign value='source.MiddleName' property='target.{PID:PatientName().GivenName}' action='set' /> <assign value='source.Gender' property='target.{PID:AdministrativeSex}' action='set' /> <assign value='$translate($ZDT(source.DOB_",0",3)," ","T")_"Z"' property='target.{PID:DateTimeofBirth.Time}' action='set' /> </transform> } } output