It depends on what you are looking for.

To create applications to expose data on IRIS with custom APIs and make custom applications, you can use IRIS Studio and/or VsCode with the IRIS extension.

For database administration, you can use the management portal.

For 100% SQL administration, I recommend DbBeaver.

Hi Xiong,

To convert FHIR R4 to SDA you have to use this helper class :

HS.FHIR.DTL.Util.HC.FHIR.SDA3.Process

This class take in input a message of this kind : HS.FHIRServer.Interop.Request or HS.Message.FHIR.Request.

So if you want to convert an json FHIR file to SDA, you have to read the file from a business service cast you file to one of this message and send it to the helper class.

Here is and Business service example of reading fhir json files :

Class BS.FHIRFileService Extends Ens.BusinessService
{

Parameter ADAPTER = "EnsLib.File.InboundAdapter";

Property TargetConfigNames As %String(MAXLEN = 1000) [ InitialExpression = "BusinessProcess" ];

Parameter SETTINGS = "TargetConfigNames:Basic:selector?multiSelect=1&context={Ens.ContextSearch/ProductionItems?targets=1&productionName=@productionId}";

Method OnProcessInput(pDocIn As %RegisteredObject, Output pDocOut As %RegisteredObject) As %Status
{
    set status = $$$OK

    try {

        set pInput = ##class(HS.FHIRServer.Interop.Request).%New()
        set tQuickStream = ##class(HS.SDA3.QuickStream).%New()
        do tQuickStream.CopyFrom(pDocIn)
        set pInput.QuickStreamId= tQuickStream.Id


        for iTarget=1:1:$L(..TargetConfigNames, ",") {
            set tOneTarget=$ZStrip($P(..TargetConfigNames,",",iTarget),"<>W")  Continue:""=tOneTarget
            $$$ThrowOnError(..SendRequestSync(tOneTarget,pInput,.pDocOut))
        }
    } catch ex {
        set status = ex.AsStatus()
    }

    Quit status
}

}

You can find more information from this documentation :

https://docs.intersystems.com/irisforhealthlatest/csp/docbook/Doc.View.c...

Hi Lucas,

A simple solution to you question can be this :

Property numDossiersMER As list Of %Integer(SQLPROJECTION = "table/column", STORAGEDEFAULT = "array");

Index numDossiersMERIdx On numDossiersMER(ELEMENTS);

With those parameters you can achieve :

  • 'As list Of %Integer' allows you to use the Insert() in ObjectScript and 'for some %element' in SQL command
  • 'SQLPROJECTION = "table/column"' allows you to display the table as a column (note, the column does not appear in a select * it must be specified : select numDossierMER, numDossiersMER from User_TestList_Data.Titre )
  • 'STORAGEDEFAULT = "array"' allows a separate table for the normalized representation
  • 'Index numDossiersMERIdx On numDossiersMER(ELEMENTS);' bring the ability to use index on values with this SQL query :
select numDossierMER, numDossiersMER from User_TestList_Data.Titre
where
for some %element(numDossiersMER) (%Value in (345))

Hi Cindy,

To deploy your services, routes and plugins to another environment you can use CI/CD with postman (newman)

Some examples here :

Another possibility is to use deck (decK helps manage Kong’s configuration in a declarative fashion) from kong

I haven't tried this one, I can't give you feedback on it.

If I understand correctly, you want to replace an HTTP Header basic auth with a bearer token.
If the bearer token is static, you can implement a solution like this:
- https://github.com/grongierisc/iam-training/tree/training#6-third-add-ou...

If it is dynamic, I think you will have to develop your own plug-in:
- https://github.com/grongierisc/iam-training/tree/training#11-plugins

A good base to start working on could be this plugin:
- https://github.com/grongierisc/kong-plugin-jwt-crafter

Hi,

What you can do is a snapshot of this ResultSet.

Then use the global of this snapshot for another Operation :

Get snapshot global :

Method OnGetSnapshot(pRequest As Ens.Request, Output pResponse As Ens.StringResponse) As %Status
{
    set tStatus = $$$OK

    try{

        set pResponse = ##class(Ens.StringResponse).%New()

        set tQuery = "SELECT *  FROM [sqlserver].[dbo].[whatever] "

        //$$$TRACE(tQuery)      
        Set pSnap = ##class(EnsLib.SQL.Snapshot).%New()

        //size of snapshot
        // -1 = Max
        set pSnap.MaxRowsToGet = -1

        $$$ThrowOnError(..Adapter.ExecuteQueryBatch(pSnap,tQuery,1000))

        $$$ThrowOnError(pSnap.%Save())


        set pResponse.StringValue = pSnap.%GblRef   

    }
    catch exp
        {
            Set tStatus = exp.AsStatus()
        }
    Quit tStatus
}

Use snapshot global :

Method UseSnapshot(pRequest As Ens.StringRequest, Output pResponse As Ens.Response) As %Status
{

    set status = $$$OK

    try {
        set pResponse = ##class(Ens.Response).%New()

        set nRow = 0
        set tSequence = 0

        //Get SnapShot
        Set tSnap = ##class(EnsLib.SQL.Snapshot).%New()
        set tSnap.%GblRef = pRequest.StringValue // use of global SnapShot
        set tSnap.%CurrentRow = 0
        set tSnap.FirstRow = 1
        set tSnap.MaxRowsToGet = -1

        $$$TRACE("MaxRowsToGet :  "_tSnap.RowCountGet())

                while tSnap.Next() {
                    try {
                            set nRow = nRow + 1
                            set tSequence = tSequence + 1

                            set i = 0

                            set i = i + 1
                            set tParam(i) = tSnap.Get("Col1")


                            set i = i + 1
                            set tParam(i) = tSnap.Get("Col2")


                            set i = i + 1
                            set tParam(i) = tSnap.Get("Col3")


                            set i = i + 1
                            set tParam(i) = tSnap.Get("ColX")

                            set tParam = i

                            set tQuery = "UPDATE Whatever  "_
                                        "SET   "_
                                        "Col1 = ?  "_
                                        ",Col2 = ?  "_
                                        ",Col3 = ?  "_
                                        " WHERE ColX = ?  " 


                            $$$ThrowOnError(..Adapter.ExecuteUpdateParmArray(.tResult,tQuery,.tParam))

                        } catch exSnap {
                            // Update exeption
                        }

        }


    } catch ex {
        set status = ex.AsStatus()
    }
    return status
}

Furthermore, If you have big table to query/insert in JDBC consider this ZPM module :
https://github.com/grongierisc/BatchSqlOutboundAdapter

Hi Alexender, I'll send you the WSDL in PM.

But I guess I found a workaround :

I created a new method that parse the XML with %XML.Reader and correlate the payload with my destination class :

 set reader = ##class(%XML.Reader).%New()
 // pRequest.GetPatientsByClinicResult.any.GetAt(1) <-- Header
 // pRequest.GetPatientsByClinicResult.any.GetAt(2) <-- Payload
 do reader.OpenString(pRequest.GetPatientsByClinicResult.any.GetAt(2))
 do reader.Correlate("Patients","FME.Object.Patient")

 while reader.Next(.object,.status) {
   do pResponse.Patients.Insert(object)
 }

Where FME.Object.Patient is :

Class FME.Object.Patient Extends (%SerialObject, %XML.Adaptor)
{

Property LastName As %String;

Property FirstName As %String;

Property Datex0020ofx0020Birth As %String(XMLNAME = "Date_x0020_of_x0020_Birth");

Property Gender As %String;

Property Code As %String;

Property Insurance As %String;

Property GUID As %String;

Property CLINICGUID As %String;

}

Hi Mike,
To retrive multi-part from %resquest you have do to this in the %CSP.REST class :

    // Get properties
    set body = %request.Get("body")
    if '$d(body) {
      $$$ThrowOnError($$$ERROR(9200,"no parameters"))
    }
    set dynaBody = {}.%FromJSON(body)

    // Get stream
    set stream = %request.GetMimeData("file")
    if ('$IsObject(stream) {
      $$$ThrowOnError($$$ERROR(9200,"no file"))
    }

To get property you have to use Get and for stream GetMimeData
In my example my body is a json.

Hi Ravikumar,

All can be done in InterSystems IRIS with almost no code.

Have a look at this demo to convert HL7v2 to FHIR : https://openexchange.intersystems.com/package/FHIR-HL7v2-SQL-Demo

For JSON/XML to FHIR, you can have a look here : https://github.com/grongierisc/HL7ToJson

For HL7 SIU, the same can be achieved with the first link.

For CDA/FHIR you have example here : https://github.com/grongierisc/FHIRaaS/blob/master/src/Interop/BP/CCDATr...

If you need more help, let me know.

Hi Klaus,

You have to proxy IRIS to use https. To do so, use this git :

Hi Tom,
You can have a look at this documentation : https://cedocs.intersystems.com/latest/csp/docbook/Doc.View.cls?KEY=EDIC... to help you to create a dicom production to send document to pacs.

If you are not on Ensemble, you have in the community installer for ENSDEMO production : https://openexchange.intersystems.com/package/irishealth-ensdemo

But in short, you have to create an EnsLib.DICOM.Document
Fill it with information about the patient, ect.
e.g

  Set pDocOut = ##class(EnsLib.DICOM.Document).%New()
  // Set patient data
  $$$THROWONERROR(tSC, pDocOut.SetValueAt("Toto^Toto", "DataSet.PatientName"))
  $$$THROWONERROR(tSC, pDocOut.SetValueAt(1, "DataSet.PatientID"))

  //Set pdf in EncapsulatedDocument
  $$$THROWONERROR(tSC, pDocOut.SetValueAt("application/pdf","DataSet.MIMETypeOfEncapsulatedDocument"))
  /// File is you binary pdf document
  IF '$IsObject(file) $$$THROWONERROR(tSC, $$$ERROR($$$FailedToNewClass, "%Stream.TmpBinary"))

  // DICOM Standard PS3.5: The Value Field containing Pixel Data, like all other Value Fields in DICOM, shall be an even number of bytes in length
  // Thanks Michel Liberado for this hack
  IF (($L(binary) # 2) '= 0) {
          // Any char would be fine but I want to have the End Of Transmission ASCII character
          $$$THROWONERROR(tSC, file.Write($CHAR(4)))
  }

  $$$THROWONERROR(tSC, pDocOut.SetValueAt(file,"DataSet.EncapsulatedDocument"))

Once you have your pDocOut you can send it to business process Demo.DICOM.Process.Storage

Hi Lucas,

All security settings are store in the %SYS databases.

You can access then with this query :

select * from Security.System

Or with this procedure

select * from Security.System_List()

If you want to do this in COS :

s ResultSet=##class(%ResultSet).%New("Security.System:List")
d ResultSet.Execute()
While ResultSet.Next() {
	zw ResultSet.Data("Name")
}

Like that you don't have to use the export function who only create files.

Now you can parse data and build your report directly from an homemade object.