go to post Guillaume Rongier · Jun 23, 2021 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. https://docs.intersystems.com/components/csp/docbook/Doc.View.cls?KEY=PA... For database administration, you can use the management portal. https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=PA... For 100% SQL administration, I recommend DbBeaver. https://community.intersystems.com/post/dbeaver-officially-supports-inte...
go to post Guillaume Rongier · May 25, 2021 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...
go to post Guillaume Rongier · May 18, 2021 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))
go to post Guillaume Rongier · Apr 29, 2021 Hi Cindy, To deploy your services, routes and plugins to another environment you can use CI/CD with postman (newman) Some examples here : https://github.com/grongierisc/iam-training/tree/main#12-cicd Another possibility is to use deck (decK helps manage Kong’s configuration in a declarative fashion) from kong https://docs.konghq.com/deck/ I haven't tried this one, I can't give you feedback on it.
go to post Guillaume Rongier · Apr 12, 2021 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
go to post Guillaume Rongier · Dec 7, 2020 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
go to post Guillaume Rongier · Dec 2, 2020 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; }
go to post Guillaume Rongier · Dec 2, 2020 Hi Yuri, Not now but it's plan to be in the future, may be next year.
go to post Guillaume Rongier · Nov 17, 2020 If you have license key for heathshare (no community version of healthshare is available), the installers and familiar with docker, check this git : https://github.com/grongierisc/healthshare-docker It's an unofficial version of HealthShare on docker, very useful to do test and build edge on the fly.
go to post Guillaume Rongier · Nov 17, 2020 If you need an how-to de develop an interoperability production check this git. https://github.com/grongierisc/formation-template It's in french but you will have a lot of gif to get throw the tuto and build a CSV parser and drop the file in the database with transformations.
go to post Guillaume Rongier · Nov 4, 2020 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.
go to post Guillaume Rongier · Nov 3, 2020 Hi Paul, Are you looking for theses classes : HS.Hub.Standalone.HL7.DTL.SubTransform.PD1ToSDA3 HS.Hub.Standalone.HL7.DTL.SubTransform.PIDToSDA3 and co ? And you can have a look at this code to convert any HL7 and all his segment into SDA : https://github.com/grongierisc/FHIR-HL7v2-SQL-Demo/blob/master/src/FHIRD...
go to post Guillaume Rongier · Oct 27, 2020 Hi Yakov, Have you tried to extend you target message by %SerialObject rather than %RegistredObject. In fact, %RegistredObject are in memory object and can't be transmitted in Messages. More details in this documentation : https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI...
go to post Guillaume Rongier · Oct 25, 2020 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.
go to post Guillaume Rongier · Oct 23, 2020 Hi, you have to use irisinstall with elevated privileges. cf: https://docs.intersystems.com/irisforhealthlatest/csp/docbook/Doc.View.c...
go to post Guillaume Rongier · Jun 22, 2020 Hi Klaus, You have to proxy IRIS to use https. To do so, use this git : https://github.com/grongierisc/Https-Proxy-IRIS-Docker Simple https proyx https://github.com/lscalese/isc-webgateway-letsencrypt More robust Https proxy with certbot and https between proxy and IRIS https://github.com/grongierisc/IRIS-Oauth2-Server-Client An example of IRIS as an Oauth2 server + embedded apache https proxy + full implementation of those tutos : https://community.intersystems.com/post/intersystems-iris-open-authoriza...
go to post Guillaume Rongier · Jun 12, 2020 Hi Yuri, You have to use a proxy server to do that. Have a look at this git : https://github.com/grongierisc/Https-Proxy-IRIS-Docker or this one : https://github.com/lscalese/isc-webgateway-letsencrypt
go to post Guillaume Rongier · May 25, 2020 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
go to post Guillaume Rongier · Jan 30, 2020 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.
go to post Guillaume Rongier · Jan 16, 2020 Hi Kevin, You can use IOAddr property from EnsLib.TCP.CountedInboundAdapter IOAddr property come in this format : 57777<-127.0.0.1:54844 To extract the source IP adresse you can parse it like that : set fullIOAddr = ..Adapter.IOAddr //57777<-127.0.0.1:54844 set remoteIP = $P($P(fullIOAddr,"-",2),":",1) //127.0.0.1