Hi Yeung,

First how-to auto increment an integer, you can use this property :

Then, why you have ID1 in your table, because by default any persistent class have an column called ID who is an auto increment and indexed as a primary key.
You can overload this primary key by your own with this index :

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 Yuri,
Have a look at this : https://github.com/grongierisc/iris-csvgen-ui/blob/master/src/CSVGEN/API...
Here you will find and example of a multi-part upload on a %CSP.REST class.

To get the stream from the multi part you have to do this ligne 39 to 43 :

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

Where id is the name of you multi-part

To send the stream to a business service :

        $$$ThrowOnError(##class(Ens.Director).CreateBusinessService(BsName,.tService))

        $$$ThrowOnError(tService.ProcessInput(stream,.output))

Where BsName is the name of your business service in the active production of your namespace.
And stream you stream.

What a great idea :)

Here is my contribution :

{
    "Request Class": {
        "prefix": "ClassRequest",
        "body": [
            "Class ${0:ClassName} Extends Ens.Request",
            "{",
            "\t$1",
            "}"
        ],
        "description": "Message helper"
    },

    "Response Class": {
        "prefix": "ClassResponse",
        "body": [
            "Class ${0:ClassName} Extends Ens.Response",
            "{",
            "\t$1",
            "}"
        ],
        "description": "Message helper"
    },

    "Operation Class": {
        "prefix": "ClassOperation",
        "body": [
            "Class ${0:ClassName}  Extends Ens.BusinessOperation",
            "{",
            "\tParameter ADAPTER = \"${1:Adapter}\";",
            "\tProperty Adapter As ${1:Adapter};",
            "\tParameter INVOCATION = \"Queue\";",
            "\n",
            "Method ${2:Methode}(pRequest As ${3:Request}, Output pResponse As ${4:Response}) As %Status",
            "{",
            "\tset tStatus = $$$$OK",
            "\tset pResponse = ##class(${4:Response}).%New()",
            "",
            "\ttry{",
            "\t\t\n",
            "\t}",
            "\tcatch exp",
            "\t{",
            "\t\tset tStatus = exp.AsStatus()",
            "\t}",
            "\tQuit tStatus",
            "}",
            "XData MessageMap",
            "{",
            "<MapItems>",
            "\t<MapItem MessageType=\"${3:Request}\">",
            "\t\t<Method>${2:Methode}</Method>",
            "\t</MapItem>",
            "</MapItems>",
            "}",
            "}",
        ],
        "description": "Operation helper"
    },

    "Service Class": {
        "prefix": "ClassService",
        "body": [
            "Class ${0:ClassName} Extends Ens.BusinessService",
            "{",
            "Parameter ADAPTER = \"${1:Adapter}\";",
            "Property TargetConfigNames As %String(MAXLEN = 1000) [ InitialExpression = \"${2: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",
            "{",
            "\tset status = $$$$OK",
            "",
            "\ttry {",
            "",
            "\t\tfor iTarget=1:1:$L(..TargetConfigNames, \",\") {",
            "\t\t\tset tOneTarget=$ZStrip($P(..TargetConfigNames,\",\",iTarget),\"<>W\")  Continue:\"\"=tOneTarget",
            "\t\t\t$$$$ThrowOnError(..SendRequestSync(tOneTarget,pDocIn,.pDocOut))",
            "\t\t}",
            "\t} catch ex {",
            "\t\tset status = ex.AsStatus()",
            "\t}",
            "",
            "\tQuit status",
            "}",
            "",
            "}",
        ],
        "description": "Operation helper"
    },
}

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.

I agree with you in most cases.


The most important announcement for me would be Embedded Python.
This will bring to the community the power of python libraries, it's a giant step forward.

https://www.youtube.com/embed/widxuV4Ov9s
[This is an embedded link, but you cannot view embedded content directly on the site because you have declined the cookies necessary to access it. To view embedded content, you would need to accept all cookies in your Cookies Settings]

Hi,

SuperServer port since 2020.3 is 1972 :

docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/iris-community:2020.3.0.221.0-zpm

docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/iris-community:2020.4.0.521.0-zpm

docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/irishealth-community:2020.3.0.221.0-zpm

docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/irishealth-community:2020.4.0.521.0-zpm