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")

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.

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()
	}
}

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"
 

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

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

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>
}

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()
}

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