0 Followers · 498 Posts

Health Level-7 or HL7 refers to a set of international standards for the transfer of clinical and administrative data between software applications used by various healthcare providers

Learn more

Article Sanjib Pandey · Mar 3, 2025 5m read

Background:

This guideline provides an overview of how to design and implement a REST API interface for querying patient demographic data from an Electronic Patient Record (EPR) system using HealthConnect. The process involves sending a query request with the patient's identification number, retrieving the response from the EPR system, extracting the required patient demographic data from the HL7 message, and sending it as a JSON response to the supplier. The high-level process diagram is shown below (Screenshot 1).

5
1 217
Question Padmaja Konduru · Mar 29, 2025

We are receiving the report in text format and it has special characters like ', - like that in the text. Source system is using the UTF8 encoding format hence the text is showing as ' � ' . Is there a way to convert the utf8 to actual character in the DTL.

Thank you,

6
0 194
Question Colin Brough · Mar 25, 2025

Is there a generic process for "walking" the structure of a virtual document - eg an HL7 message (EnsLib.HL7.Message) or an XML document (EnsLib.EDI.XML.Document).

At least we'd want to be able to visit all "nodes" (HL7 fields or sub-fields, XML nodes) in the virtual document and be able to work out/generate the Property Path (so we could call "GetValueAt"). 

We can just about come up with something generic for HL7, since it only nests down to 4 levels within each segment, though we're using numeric Property Path's at that point rather than symbolic ones (MSH:1.3 etc).

7
0 107
Question Will · Mar 16, 2025

Hi,

My HL7 interface in production is outputting messages to a HL7 File Operation and a  EnsLib.HL7.Operation.HTTPOperation. There is no errors in the File Operation, but the HL7 HTTPOperation is giving ERROR #5911: Character Set 'iso-8859-4' not installed, unable to perform character set translation.  Both the HL7 File Operation and HL7 HTTP Operation are using latin1 for Default Char Encoding.

What is ERROR #5911 aboutIs something missing in the IRIS installation? 

Thank you.

W

5
0 92
Question Harshitha · Mar 11, 2025

Hello everyone,

I'm looking for a practical project guide to help me gain hands-on experience with InterSystems Ensemble HL7. Ideally, this guide would walk through building a small project — something that covers key concepts like message routing, transformations, and interoperability.

If there's a resource that also includes step-by-step instructions and perhaps even offers a certification upon completion, that would be perfect.

Any recommendations or guidance would be greatly appreciated. Thanks in advance! 😊

2
0 133
Question Kevin Mayfield · Feb 20, 2025

I'm working on FHIR project and using this code to convert an incoming request to FHIR 

Method OnRequest(request As HS.FHIRServer.Interop.Request, Output response As HS.FHIRServer.Interop.Response) As %Status

{

    #dim tSC As %Status = $$$OK

    Try {

        // Process incoming request

        set stream = ##class(HS.SDA3.QuickStream).%OpenId(request.QuickStreamId)

        set bundle = ##class(HS.FHIR.DTL.vR4.Model.Resource.Bundle).FromJSON(stream,"vR4")

9
0 153
Question André Suhnel · Jan 30, 2025

Hello,

I'm trying to add another segment to an HL7 MDM message. More specifically OBXgrp(1).OBX. The addition itself works,. When I look at the message in the trace, the segment with the content can be seen. However, it is not displayed as an OBX segment.

Build Map Status = 'ERROR <EnsEDI>ErrMapRequired: Missing required OBXgrp(1) element at segment 6'
'ERROR <EnsEDI>ErrMapSegUnrecog: Unrecognized Segment 6:'' found after segment 5 (TXA)'

2
0 122
Announcement Guillaume Rongier · Mar 16, 2022

Iris Healthtoolkit Service

Video

Easy to use HL7v2 to FHIR, CDA to FHIR, FHIR to HL7v2 as a Service.

The aim of this project is to provide an REST API that can convert easily various health formats. Post the desire format in the REST body, get the answer in the new format.

Install

Clone this repository

git clone https://github.com/grongierisc/iris-healthtoolkit-service.git

Docker

docker-compose up --build -d

Usage

Api details

HL7 to FHIR

POST http://localhost:32783/api/hl7/fhir

Example

Input

MSH|^~\&||^^NPI|||20211105165829+0000||ADT^A01|66053,61109.396628|P|2.5.1|||AL|AL|||||PH_SS-Ack^SS Sender^2.16.840.1.114222.4.10.3^ISO
EVN||202111051658|||||^^NPI
PID|1||060a6bd5-5146-4b08-a916-009858997bd3^^^https://github.com/synthetichealth/synthea^~060a6bd5-5146-4b08-a916-009858997bd3^^^http://hospital.smarthealthit.org^MR~999-97-4582^^^&^SS~S99986284^^^&^DL~X84330364X^^^&^PPN||Masson^Livia^^^Mrs.^^||19920820|F|Simon^Livia^^||615 Avenue Lemaire^^Lyon^Auvergne-Rhone-Alpes^63000||^PRN^PH^^^555^286|||||||||||||||||||||
PV1|1|O||424441002|||||||||||||||1^^^&&^VN|||||||||||||||||||||||||200812312325|20090101044004
PV2|||72892002^Grossesse normale^SCT
OBX|1||8302-2^Taille du corps^LN||20101014002504^^|cm^^UCUM|||||F|||20101014
OBX|2||72514-3^Gravite de la douleur - 0-10 evaluation numerique verbale [Score] - Signaleee^LN||20101014002504^^|{score}^^UCUM|||||F|||20101014
OBX|3||29463-7^Poids corporel^LN||20101014002504^^|kg^^UCUM|||||F|||20101014
OBX|4||39156-5^Indice de masse corporelle^LN||20101014002504^^|kg/m2^^UCUM|||||F|||20101014
OBX|5||72166-2^Statut du tabagisme^LN||20171026002504^Ancien fumeur^SCT^^^^^^Ancien fumeur||||||F|||20171026

Output

{
"resourceType": "Bundle",
"type": "transaction",
"entry": [
  {
    "request": {
      "method": "POST",
      "url": "Organization"
    },
    "fullUrl": "urn:uuid:347a0c88-e7fa-11ec-9601-0242ac1a0002",
    "resource": {
      "resourceType": "Organization",
      "identifier": [
        {
          "value": "https://github.com/synthetichealth/synthea"
        }
      ]
    }
  },
  {
    "request": {
      "method": "POST",
      "url": "Organization"
    },
    "fullUrl": "urn:uuid:34d03d1a-e7fa-11ec-9601-0242ac1a0002",
    "resource": {
      "resourceType": "Organization",
      "identifier": [
        {
          "value": "http://hospital.smarthealthit.org"
        }
      ]
    }
  },
  {
    "request": {
      "method": "POST",
      "url": "Patient"
    },
    "fullUrl": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002",
    "resource": {
      "resourceType": "Patient",
      "address": [
        {
          "city": "Lyon",
          "line": [
            "615 Avenue Lemaire"
          ],
          "postalCode": "63000",
          "state": "Auvergne-Rhone-Alpes"
        }
      ],
      "birthDate": "1992-08-20",
      "gender": "female",
      "identifier": [
        {
          "assigner": {
            "reference": "urn:uuid:347a0c88-e7fa-11ec-9601-0242ac1a0002"
          },
          "system": "https://github.com/synthetichealth/synthea",
          "value": "060a6bd5-5146-4b08-a916-009858997bd3"
        },
        {
          "assigner": {
            "reference": "urn:uuid:34d03d1a-e7fa-11ec-9601-0242ac1a0002"
          },
          "system": "http://hospital.smarthealthit.org",
          "type": {
            "coding": [
              {
                "code": "MR",
                "system": "http://terminology.hl7.org/CodeSystem/v2-0203"
              }
            ],
            "text": "MRN"
          },
          "value": "060a6bd5-5146-4b08-a916-009858997bd3"
        },
        {
          "extension": [
            {
              "url": "http://intersystems.com/fhir/extn/sda3/lib/patient-number-i-s-o-assigning-authority",
              "valueString": "&"
            }
          ],
          "type": {
            "coding": [
              {
                "code": "SS"
              }
            ],
            "text": "SS"
          },
          "value": "999-97-4582"
        },
        {
          "extension": [
            {
              "url": "http://intersystems.com/fhir/extn/sda3/lib/patient-number-i-s-o-assigning-authority",
              "valueString": "&"
            }
          ],
          "type": {
            "coding": [
              {
                "code": "DL",
                "system": "http://terminology.hl7.org/CodeSystem/v2-0203"
              }
            ],
            "text": "DL"
          },
          "value": "S99986284"
        },
        {
          "extension": [
            {
              "url": "http://intersystems.com/fhir/extn/sda3/lib/patient-number-i-s-o-assigning-authority",
              "valueString": "&"
            }
          ],
          "type": {
            "coding": [
              {
                "code": "PPN",
                "system": "http://terminology.hl7.org/CodeSystem/v2-0203"
              }
            ],
            "text": "PPN"
          },
          "value": "X84330364X"
        }
      ],
      "name": [
        {
          "family": "Simon",
          "given": [
            "Livia"
          ],
          "text": "Livia Simon"
        },
        {
          "family": "Masson",
          "given": [
            "Livia"
          ],
          "prefix": [
            "Mrs."
          ],
          "text": "Mrs. Livia Masson",
          "use": "official"
        }
      ],
      "telecom": [
        {
          "system": "phone",
          "use": "home",
          "value": "(555) 286"
        }
      ]
    }
  },
  {
    "request": {
      "method": "POST",
      "url": "Encounter"
    },
    "fullUrl": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002",
    "resource": {
      "resourceType": "Encounter",
      "class": {
        "code": "AMB",
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/encounter-encounter-type",
          "valueString": "O"
        },
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/encounter-entered-on",
          "valueDateTime": "2008-12-31T23:25:00+00:00"
        },
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/encounter-to-time",
          "valueDateTime": "2009-01-01T04:40:04+00:00"
        }
      ],
      "identifier": [
        {
          "type": {
            "text": "EncounterNumber"
          },
          "use": "official",
          "value": "1"
        }
      ],
      "period": {
        "start": "2008-12-31T23:25:00+00:00"
      },
      "reasonCode": [
        {
          "coding": [
            {
              "code": "72892002",
              "display": "Grossesse normale",
              "system": "http://snomed.info/sct"
            }
          ]
        }
      ],
      "status": "unknown",
      "subject": {
        "reference": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "type": [
        {
          "coding": [
            {
              "code": "424441002"
            }
          ]
        }
      ]
    }
  },
  {
    "request": {
      "method": "POST",
      "url": "Observation"
    },
    "fullUrl": "urn:uuid:3a13745e-e7fa-11ec-9601-0242ac1a0002",
    "resource": {
      "resourceType": "Observation",
      "code": {
        "coding": [
          {
            "code": "72166-2",
            "display": "Statut du tabagisme",
            "system": "http://loinc.org"
          }
        ]
      },
      "effectiveDateTime": "2017-10-26T00:00:00+00:00",
      "encounter": {
        "reference": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-encounter-number",
          "valueString": "1"
        },
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-observation-coded-value",
          "valueCodeableConcept": {
            "coding": [
              {
                "code": "20171026002504",
                "display": "Ancien fumeur",
                "system": "http://snomed.info/sct"
              }
            ],
            "text": "Ancien fumeur"
          }
        }
      ],
      "status": "final",
      "subject": {
        "reference": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "valueString": "Ancien fumeur"
    }
  },
  {
    "request": {
      "method": "POST",
      "url": "Observation"
    },
    "fullUrl": "urn:uuid:3b6212fc-e7fa-11ec-9601-0242ac1a0002",
    "resource": {
      "resourceType": "Observation",
      "category": [
        {
          "coding": [
            {
              "code": "vital-signs",
              "display": "Vital Signs",
              "system": "http://terminology.hl7.org/CodeSystem/observation-category"
            }
          ],
          "text": "Vital Signs"
        }
      ],
      "code": {
        "coding": [
          {
            "code": "8302-2",
            "display": "Taille du corps",
            "system": "http://loinc.org"
          }
        ],
        "extension": [
          {
            "url": "http://intersystems.com/fhir/extn/sda3/lib/code-table-detail-observation-observation-value-units",
            "valueCodeableConcept": {
              "coding": [
                {
                  "code": "cm",
                  "system": "http://unitsofmeasure.org"
                }
              ]
            }
          }
        ]
      },
      "effectiveDateTime": "2010-10-14T00:00:00+00:00",
      "encounter": {
        "reference": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-encounter-number",
          "valueString": "1"
        }
      ],
      "status": "final",
      "subject": {
        "reference": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "valueCodeableConcept": {
        "coding": [
          {
            "code": "20101014002504"
          }
        ]
      }
    }
  },
  {
    "request": {
      "method": "POST",
      "url": "Observation"
    },
    "fullUrl": "urn:uuid:3c8aba30-e7fa-11ec-9601-0242ac1a0002",
    "resource": {
      "resourceType": "Observation",
      "code": {
        "coding": [
          {
            "code": "72514-3",
            "display": "Gravite de la douleur - 0-10 evaluation numerique verbale [Score] - Signaleee",
            "system": "http://loinc.org"
          }
        ],
        "extension": [
          {
            "url": "http://intersystems.com/fhir/extn/sda3/lib/code-table-detail-observation-observation-value-units",
            "valueCodeableConcept": {
              "coding": [
                {
                  "code": "{score}",
                  "system": "http://unitsofmeasure.org"
                }
              ]
            }
          }
        ]
      },
      "effectiveDateTime": "2010-10-14T00:00:00+00:00",
      "encounter": {
        "reference": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-encounter-number",
          "valueString": "1"
        }
      ],
      "status": "final",
      "subject": {
        "reference": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "valueCodeableConcept": {
        "coding": [
          {
            "code": "20101014002504"
          }
        ]
      }
    }
  },
  {
    "request": {
      "method": "POST",
      "url": "Observation"
    },
    "fullUrl": "urn:uuid:3de455d0-e7fa-11ec-9601-0242ac1a0002",
    "resource": {
      "resourceType": "Observation",
      "category": [
        {
          "coding": [
            {
              "code": "vital-signs",
              "display": "Vital Signs",
              "system": "http://terminology.hl7.org/CodeSystem/observation-category"
            }
          ],
          "text": "Vital Signs"
        }
      ],
      "code": {
        "coding": [
          {
            "code": "29463-7",
            "display": "Poids corporel",
            "system": "http://loinc.org"
          }
        ],
        "extension": [
          {
            "url": "http://intersystems.com/fhir/extn/sda3/lib/code-table-detail-observation-observation-value-units",
            "valueCodeableConcept": {
              "coding": [
                {
                  "code": "kg",
                  "system": "http://unitsofmeasure.org"
                }
              ]
            }
          }
        ]
      },
      "effectiveDateTime": "2010-10-14T00:00:00+00:00",
      "encounter": {
        "reference": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-encounter-number",
          "valueString": "1"
        }
      ],
      "status": "final",
      "subject": {
        "reference": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "valueCodeableConcept": {
        "coding": [
          {
            "code": "20101014002504"
          }
        ]
      }
    }
  },
  {
    "request": {
      "method": "POST",
      "url": "Observation"
    },
    "fullUrl": "urn:uuid:3f501418-e7fa-11ec-9601-0242ac1a0002",
    "resource": {
      "resourceType": "Observation",
      "code": {
        "coding": [
          {
            "code": "39156-5",
            "display": "Indice de masse corporelle",
            "system": "http://loinc.org"
          }
        ],
        "extension": [
          {
            "url": "http://intersystems.com/fhir/extn/sda3/lib/code-table-detail-observation-observation-value-units",
            "valueCodeableConcept": {
              "coding": [
                {
                  "code": "kg/m2",
                  "system": "http://unitsofmeasure.org"
                }
              ]
            }
          }
        ]
      },
      "effectiveDateTime": "2010-10-14T00:00:00+00:00",
      "encounter": {
        "reference": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-encounter-number",
          "valueString": "1"
        }
      ],
      "status": "final",
      "subject": {
        "reference": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "valueCodeableConcept": {
        "coding": [
          {
            "code": "20101014002504"
          }
        ]
      }
    }
  }
]
}

FHIR to HL7 ADT

POST http://localhost:32783/api/fhir/hl7/adt

Example

{
"resourceType": "Bundle",
"type": "transaction",
"entry": [
  {
    "request": {
      "method": "POST",
      "url": "Organization"
    },
    "fullUrl": "urn:uuid:347a0c88-e7fa-11ec-9601-0242ac1a0002",
    "resource": {
      "resourceType": "Organization",
      "identifier": [
        {
          "value": "https://github.com/synthetichealth/synthea"
        }
      ]
    }
  },
  {
    "request": {
      "method": "POST",
      "url": "Organization"
    },
    "fullUrl": "urn:uuid:34d03d1a-e7fa-11ec-9601-0242ac1a0002",
    "resource": {
      "resourceType": "Organization",
      "identifier": [
        {
          "value": "http://hospital.smarthealthit.org"
        }
      ]
    }
  },
  {
    "request": {
      "method": "POST",
      "url": "Patient"
    },
    "fullUrl": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002",
    "resource": {
      "resourceType": "Patient",
      "address": [
        {
          "city": "Lyon",
          "line": [
            "615 Avenue Lemaire"
          ],
          "postalCode": "63000",
          "state": "Auvergne-Rhone-Alpes"
        }
      ],
      "birthDate": "1992-08-20",
      "gender": "female",
      "identifier": [
        {
          "assigner": {
            "reference": "urn:uuid:347a0c88-e7fa-11ec-9601-0242ac1a0002"
          },
          "system": "https://github.com/synthetichealth/synthea",
          "value": "060a6bd5-5146-4b08-a916-009858997bd3"
        },
        {
          "assigner": {
            "reference": "urn:uuid:34d03d1a-e7fa-11ec-9601-0242ac1a0002"
          },
          "system": "http://hospital.smarthealthit.org",
          "type": {
            "coding": [
              {
                "code": "MR",
                "system": "http://terminology.hl7.org/CodeSystem/v2-0203"
              }
            ],
            "text": "MRN"
          },
          "value": "060a6bd5-5146-4b08-a916-009858997bd3"
        },
        {
          "extension": [
            {
              "url": "http://intersystems.com/fhir/extn/sda3/lib/patient-number-i-s-o-assigning-authority",
              "valueString": "&"
            }
          ],
          "type": {
            "coding": [
              {
                "code": "SS"
              }
            ],
            "text": "SS"
          },
          "value": "999-97-4582"
        },
        {
          "extension": [
            {
              "url": "http://intersystems.com/fhir/extn/sda3/lib/patient-number-i-s-o-assigning-authority",
              "valueString": "&"
            }
          ],
          "type": {
            "coding": [
              {
                "code": "DL",
                "system": "http://terminology.hl7.org/CodeSystem/v2-0203"
              }
            ],
            "text": "DL"
          },
          "value": "S99986284"
        },
        {
          "extension": [
            {
              "url": "http://intersystems.com/fhir/extn/sda3/lib/patient-number-i-s-o-assigning-authority",
              "valueString": "&"
            }
          ],
          "type": {
            "coding": [
              {
                "code": "PPN",
                "system": "http://terminology.hl7.org/CodeSystem/v2-0203"
              }
            ],
            "text": "PPN"
          },
          "value": "X84330364X"
        }
      ],
      "name": [
        {
          "family": "Simon",
          "given": [
            "Livia"
          ],
          "text": "Livia Simon"
        },
        {
          "family": "Masson",
          "given": [
            "Livia"
          ],
          "prefix": [
            "Mrs."
          ],
          "text": "Mrs. Livia Masson",
          "use": "official"
        }
      ],
      "telecom": [
        {
          "system": "phone",
          "use": "home",
          "value": "(555) 286"
        }
      ]
    }
  },
  {
    "request": {
      "method": "POST",
      "url": "Encounter"
    },
    "fullUrl": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002",
    "resource": {
      "resourceType": "Encounter",
      "class": {
        "code": "AMB",
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/encounter-encounter-type",
          "valueString": "O"
        },
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/encounter-entered-on",
          "valueDateTime": "2008-12-31T23:25:00+00:00"
        },
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/encounter-to-time",
          "valueDateTime": "2009-01-01T04:40:04+00:00"
        }
      ],
      "identifier": [
        {
          "type": {
            "text": "EncounterNumber"
          },
          "use": "official",
          "value": "1"
        }
      ],
      "period": {
        "start": "2008-12-31T23:25:00+00:00"
      },
      "reasonCode": [
        {
          "coding": [
            {
              "code": "72892002",
              "display": "Grossesse normale",
              "system": "http://snomed.info/sct"
            }
          ]
        }
      ],
      "status": "unknown",
      "subject": {
        "reference": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "type": [
        {
          "coding": [
            {
              "code": "424441002"
            }
          ]
        }
      ]
    }
  },
  {
    "request": {
      "method": "POST",
      "url": "Observation"
    },
    "fullUrl": "urn:uuid:3a13745e-e7fa-11ec-9601-0242ac1a0002",
    "resource": {
      "resourceType": "Observation",
      "code": {
        "coding": [
          {
            "code": "72166-2",
            "display": "Statut du tabagisme",
            "system": "http://loinc.org"
          }
        ]
      },
      "effectiveDateTime": "2017-10-26T00:00:00+00:00",
      "encounter": {
        "reference": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-encounter-number",
          "valueString": "1"
        },
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-observation-coded-value",
          "valueCodeableConcept": {
            "coding": [
              {
                "code": "20171026002504",
                "display": "Ancien fumeur",
                "system": "http://snomed.info/sct"
              }
            ],
            "text": "Ancien fumeur"
          }
        }
      ],
      "status": "final",
      "subject": {
        "reference": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "valueString": "Ancien fumeur"
    }
  },
  {
    "request": {
      "method": "POST",
      "url": "Observation"
    },
    "fullUrl": "urn:uuid:3b6212fc-e7fa-11ec-9601-0242ac1a0002",
    "resource": {
      "resourceType": "Observation",
      "category": [
        {
          "coding": [
            {
              "code": "vital-signs",
              "display": "Vital Signs",
              "system": "http://terminology.hl7.org/CodeSystem/observation-category"
            }
          ],
          "text": "Vital Signs"
        }
      ],
      "code": {
        "coding": [
          {
            "code": "8302-2",
            "display": "Taille du corps",
            "system": "http://loinc.org"
          }
        ],
        "extension": [
          {
            "url": "http://intersystems.com/fhir/extn/sda3/lib/code-table-detail-observation-observation-value-units",
            "valueCodeableConcept": {
              "coding": [
                {
                  "code": "cm",
                  "system": "http://unitsofmeasure.org"
                }
              ]
            }
          }
        ]
      },
      "effectiveDateTime": "2010-10-14T00:00:00+00:00",
      "encounter": {
        "reference": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-encounter-number",
          "valueString": "1"
        }
      ],
      "status": "final",
      "subject": {
        "reference": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "valueCodeableConcept": {
        "coding": [
          {
            "code": "20101014002504"
          }
        ]
      }
    }
  },
  {
    "request": {
      "method": "POST",
      "url": "Observation"
    },
    "fullUrl": "urn:uuid:3c8aba30-e7fa-11ec-9601-0242ac1a0002",
    "resource": {
      "resourceType": "Observation",
      "code": {
        "coding": [
          {
            "code": "72514-3",
            "display": "Gravite de la douleur - 0-10 evaluation numerique verbale [Score] - Signaleee",
            "system": "http://loinc.org"
          }
        ],
        "extension": [
          {
            "url": "http://intersystems.com/fhir/extn/sda3/lib/code-table-detail-observation-observation-value-units",
            "valueCodeableConcept": {
              "coding": [
                {
                  "code": "{score}",
                  "system": "http://unitsofmeasure.org"
                }
              ]
            }
          }
        ]
      },
      "effectiveDateTime": "2010-10-14T00:00:00+00:00",
      "encounter": {
        "reference": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-encounter-number",
          "valueString": "1"
        }
      ],
      "status": "final",
      "subject": {
        "reference": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "valueCodeableConcept": {
        "coding": [
          {
            "code": "20101014002504"
          }
        ]
      }
    }
  },
  {
    "request": {
      "method": "POST",
      "url": "Observation"
    },
    "fullUrl": "urn:uuid:3de455d0-e7fa-11ec-9601-0242ac1a0002",
    "resource": {
      "resourceType": "Observation",
      "category": [
        {
          "coding": [
            {
              "code": "vital-signs",
              "display": "Vital Signs",
              "system": "http://terminology.hl7.org/CodeSystem/observation-category"
            }
          ],
          "text": "Vital Signs"
        }
      ],
      "code": {
        "coding": [
          {
            "code": "29463-7",
            "display": "Poids corporel",
            "system": "http://loinc.org"
          }
        ],
        "extension": [
          {
            "url": "http://intersystems.com/fhir/extn/sda3/lib/code-table-detail-observation-observation-value-units",
            "valueCodeableConcept": {
              "coding": [
                {
                  "code": "kg",
                  "system": "http://unitsofmeasure.org"
                }
              ]
            }
          }
        ]
      },
      "effectiveDateTime": "2010-10-14T00:00:00+00:00",
      "encounter": {
        "reference": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-encounter-number",
          "valueString": "1"
        }
      ],
      "status": "final",
      "subject": {
        "reference": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "valueCodeableConcept": {
        "coding": [
          {
            "code": "20101014002504"
          }
        ]
      }
    }
  },
  {
    "request": {
      "method": "POST",
      "url": "Observation"
    },
    "fullUrl": "urn:uuid:3f501418-e7fa-11ec-9601-0242ac1a0002",
    "resource": {
      "resourceType": "Observation",
      "code": {
        "coding": [
          {
            "code": "39156-5",
            "display": "Indice de masse corporelle",
            "system": "http://loinc.org"
          }
        ],
        "extension": [
          {
            "url": "http://intersystems.com/fhir/extn/sda3/lib/code-table-detail-observation-observation-value-units",
            "valueCodeableConcept": {
              "coding": [
                {
                  "code": "kg/m2",
                  "system": "http://unitsofmeasure.org"
                }
              ]
            }
          }
        ]
      },
      "effectiveDateTime": "2010-10-14T00:00:00+00:00",
      "encounter": {
        "reference": "urn:uuid:38cf2d40-e7fa-11ec-9601-0242ac1a0002"
      },
      "extension": [
        {
          "url": "http://intersystems.com/fhir/extn/sda3/lib/observation-encounter-number",
          "valueString": "1"
        }
      ],
      "status": "final",
      "subject": {
        "reference": "urn:uuid:36dd6e2a-e7fa-11ec-9601-0242ac1a0002"
      },
      "valueCodeableConcept": {
        "coding": [
          {
            "code": "20101014002504"
          }
        ]
      }
    }
  }
]
}
Output
MSH|^~\&||^^NPI|||20220609134903+0000||^|66269,49743.388133779|P|2.5.1|||AL|AL|||||PH_SS-Ack^SS Sender^2.16.840.1.114222.4.10.3^ISO
EVN||202206091349|||||^^NPI
PID|1||060a6bd5-5146-4b08-a916-009858997bd3^^^https://github.com/s&&ISO^~060a6bd5-5146-4b08-a916-009858997bd3^^^http://hospital.smar&&ISO^MR~999-97-4582^^^&^SS~S99986284^^^&^DL~X84330364X^^^&^PPN||Masson^Livia^^^Mrs.^^||19920820|F|Simon^Livia^^||615 Avenue Lemaire^^^^||^PRN^PH^^^555^286|||||||||||||||||||||
PV1|1|O||424441002|||||||||||||||1^^^&&^VN|||||||||||||||||||||||||200812312325|
PV2|||72892002^Grossesse normale^SCT
OBX|1||72166-2^Statut du tabagisme^LN||^^||||||F|||20171026
OBX|2||8302-2^Taille du corps^LN||^^||||||F|||20101014
OBX|3||72514-3^Gravite de la douleur - 0-10 evaluation numerique verbale [Score] - Signaleee^LN||^^||||||F|||20101014
OBX|4||29463-7^Poids corporel^LN||^^||||||F|||20101014
OBX|5||39156-5^Indice de masse corporelle^LN||^^||||||F|||20101014

FHIR to HL7 ORU

POST http://localhost:32783/api/fhir/hl7/oru

FHIR to HL7 vxu

POST http://localhost:32783/api/fhir/hl7/vxu

CDA to FHIR

POST http://localhost:32783/api/cda/fhir

Example

FHIR repo

GET http://localhost:32783/api/fhir/metadata

Supported HL7 inbound format :

  • ADT_A01, ADT_A02, ADT_A03, ADT_A04, ADT_A05, ADT_A06, ADT_A07, ADT_A08, ADT_A09, ADT_A10, ADT_A11, ADT_A12, ADT_A13, ADT_A17, ADT_A18, ADT_A23, ADT_A25, ADT_A27, ADT_A28, ADT_A29, ADT_A30, ADT_A31, ADT_A34, ADT_A36, ADT_A39, ADT_A40, ADT_A41, ADT_A45, ADT_A47, ADT_A49, ADT_A50, ADT_A51, ADT_A60

  • BAR_P12

  • MDM_T02, MDM_T04, MDM_T08, MDM_T11

  • OMP_O09

  • ORM_O01

  • ORU_R01

  • PPR_PC1, PPR_PC2, PPR_PC3

  • RDE_O11

  • SIU_S12, SIU_S13, SIU_S14, SIU_S15, SIU_S16, SIU_S17, SIU_S26

  • VXU_V04

How it's working

This project works with the pivot diagram: SDA.

The SDA (Summary Document Architecture) is the InterSystems Clinical Data Format.

The SDA <-> FHIR correspondences can be consulted here, and those of the CDA -> SDA here.

gif sda pivot

9
1 1509
Question Colin Brough · Jan 10, 2025

We are using a DTL transformation to take HL7 and transform into custom XML. But the nodes in the resulting XML are appearing out of sequence - and therefore failing validation against the schema.

The XSD schema for the XML looks fine when imported into Ensemble: root node in the XSD looks like this:

And shows in Ensemble like this:

The transformation looks like this, and we can see the text from the trace elements at lines 5, 12 and 19 appear in the correct order in the event log:

HOWEVER, the resulting XML has the <allergies> nodes before the <patientNotes> nodes....:

5
0 140
Question Colin Brough · Jan 13, 2025

We are using a DTL transformation to take HL7 and transform into custom XML (XML is a virtual document, held in an EnsLib.EDI.XML.Document object). The schema specifying the format of the XML says one element should occur no more than 24 times (maxOccurs="24" in the XSD schema). However, the transformation to produce one such element always produces 24 elements, all but the last one blank, when tested stand-alone. And when the sub-transform producing one element is incorporated into the full transformation to produce the whole XML object, it produces the wrong output.Is this a bug in the

1
0 85
Question Yuhong Snyder · Jan 22, 2025

Hello,

I hope this is a simple ask..

basically I need to create local files daily at a certain time for example 11:30pm.

1. file name needs to be like  xxx__20250113.txt , the date part should be next day's timestamp with format YYYYMMDD, so I will write about 17 files like that with different names.

2. write a dummy hard coded word for example “Dummy Word” in the file.  the file eventually will be used by other operations to add hl7 message on top of this  in it with the live interface message. 

3. this needs to be done every night at 11:45pm

So how am I going to implement this?

0
0 86
Question Yuhong Snyder · Jan 7, 2025

Hello,

is it possible to kill/suppress hl7 message in the DTL (data transformation).

in cloverleaf, it is common practice to check the value in message, for example pv1:7.9. if the value is certain word(assigning authority) then send the message over to destination, if it is not, kill the message

how would this be done in InterSystems ? does that need to be done in the rule instead? or can it be done in the data transformation? if it can be done in data transformation, how can it be done? 

Thanks

4
0 151
Announcement Jake Coulter · Jan 7, 2025

I've just stumbled across this post. I am an aspiring developer and one of my first few projects is a HL7 v2 message generator. It takes in a message template and then you can edit and create bulk messages from it. 

Simply choose which segment to edit, specify the field position and then you can add a CSV of values. test, test2 and so on. You can choose to download the messages or display them in your browser. It also provides a JSON file showing you which new values are grouped. Not sure of all the use cases but I built it for a bit of fun over a weekend! 

0
1 279
Discussion David Robson · Dec 24, 2024

Hi everyone,

I'm looking for a tool that can be used as a base to create an interface that allows a non-technical user to easily forward messages. 

The idea is that the user can find an already sent HL7 message and forward it by modifying specific fields of the message without needing any technical knowledge.

An example would be something similar to the Ensemble search engine, but with a less technical and much more intuitive approach and that only allows changing 1 or 2 fields. 

0
0 158
Question Anthony Master · Dec 18, 2024

Very similar question posed here: https://community.intersystems.com/node/467496, but I am missing a piece of this:

How do I correctly call a EnsLib.HL7.MsgRouter.RoutingEngine class from the BPL?I can successfully call the BPL from the EnsLib.HL7.Service.TCPService, and I have the BPL created to delay then call the rule. And I set the context and the result location.

This rule is really basic just sending the HL7 content to a EnsLib.HL7.Operation.TCPOperation

0
0 115
Article Muhammad Waseem · Dec 16, 2024 5m read

image
Hi Community,
In this article, I will introduce my application iris-HL7v2Gen .

IRIS-HL7v2Gen is a CSP application that facilitates the dynamic generation of HL7 test messages. This process is essential for testing, debugging, and integrating healthcare data systems. The application allows users to generate a wide variety of HL7 message types, validate their structure against HL7 specifications, explore the message hierarchy, and transmit messages over TCP/IP to production systems. These features are particularly useful in settings where compliance with HL7 standards is mandatory for interoperability between different healthcare organizations or systems.


Application Features

  • Dynamic HL7 Message Generation: Instantly create HL7 messages for a range of message types, facilitating comprehensive testing.
  • Message Structure Exploration: Visualize the structure of generated messages based on HL7 specifications.
  • Value Set Visualization View predefined sets of allowable coded values for specific fields.
  • Message Validation: Validate messages against HL7 standards to ensure compliance.
  • TCP/IP Communication: Easily transmit messages to production using TCP/IP settings.
  • Broad Message Type Support: Supports 184 different HL7 message types, ensuring versatility for various healthcare integration needs.
  • ClassMethod: Generate a Test Message by Invoking a Class Method
  • Version Support: Currently Supports HL7 Version 2.5
0
4 365
Question Mary George · Nov 13, 2023

Hello, 

We noticed from the integrity logs that some of the namespaces in our integration engine are using large amount of space ( ~380GB ) for the global ^EnsHL7.Segment. 

We have culling implemented for large globals like MessageHeader and MessageBody.

Is it a standard process to implement culling for ^EnsHL7.Segment global and any idea about what will be the impact of adding culling to this global?

7
0 447
Article Anthony Master · Dec 12, 2024 2m read

Like many others probably find themselves, we were stuck doing live data mapping in our Interface Engine that we really didn't want to do, but had no good alternative choice. We want to only keep mappings for as long as possibly needed and then purge expired rows based upon a TTL value. We actually had 4 use cases for it ourselves before we built this. Use cases:

0
0 211
Question Bradley Collins · Nov 26, 2024

Dear All,

I have been sent an HL7 message as a file with the MSH segment as follows....

MSH|^~\&|SendingApp|pms3medd|HealthLink|cribrumt|20241121050000|PKI|ORU^R01|01_ASCIItest_2|P|2.3.1||||||UNICODE

I try picking up the file with a "EnsLib.HL7.Service.FileService" business service using a  EnsLib.File.InboundAdapter adaptor.  The Character set is set to "Native" and the Default Char Encoding to latin 1.

I am seeing the following error:

4
1 220
Question Yuhong Snyder · Nov 21, 2024

Has anybody encountered this before?

I did a very usual hl7 adt transformation DTL, but it is with a customized schema, like ADT_ALL, it is a structure that tries to cover all the ADT schema scenario so we can use 1 type for all ADT messages.

the DTL tests fine in DTL test, with all the segment transformed correctly, but once I put it to test, to send message through source and the message after transformation can only go to MSH, EVN, but won't transform other segment like PID etc.  

5
0 128
Article Sylvain Guilbaud · Apr 30, 2024 3m read

Production Configuration

This demo has an interoperability production with 16 items. 

Production Configuration HL7 + Kafka Producer

The first part of this demonstration consists of sending an HL7 SIU file which will be transmitted to the 2 other HL7 flows (HTTP and TCP), and transformed and transmitted to the Kafka server. HTTP and TCP flows will transform HL7 messages in the same way before sending them to Kafka as well.

  • 3 HL7 Business Services
  • 1 HL7 router
  • 2 HL7 Business Operations
  • one Business Operation sending the transformed messages to Kafka

Business Rule

3
4 474
Question Smythe Smythee · Nov 15, 2024

Hi Team,

I am converting xml message into HL7 message but the input XML message contains pdf which is converting into base 64 and getting mapped to OBX:5.5 in HL7 message and sending it to downstream 

In Downstream service i am using normal HL7 TCP class EnsLib.HL7.Service.TCPService but the message looks like below i am not sure why stream is taking as another segment in HL7 message,

Any thoughts on this?

Thanks,

Smythee

15
0 280
Question Anthony Master · Nov 8, 2024

Throughout the forum, I find examples of using the method getSegmentByIndex to get the segment as I loop through the HL7 message segments.

Today I spent way too long trying to figure out why I could not modify the segment with this same method. I reached out to my more experienced team and I showed where I got the base code from what I was doing, but I myself could not find the documentation of the method.

After some time, we stumbled upon the GetMutableSegmentAt and GetSegmentAt methods and plugged the mutable method in its place and what do you know, it worked!

What is the purpose of the different methods then for GetSegmentAt and getSegmentByIndex?

1
0 169
Article Anthony Master · Oct 17, 2024 2m read

I was working on a DTL but kept getting ERROR #5002... MAXSTRING errors. The problem was that most of the DTL GUI action steps only support the string data type when working with the segments. A %String has a limit of 3,641,144 characters and my OBX5.1 was 5,242,952 characters long as the example provided. Of course PACS admin stated ultra high quality up to and including 4K resolution files were needed, so we could not get the vendor to compress or reformat these files to compressed jpg or something similar.

Initially this vendor sends a 2.3 ORU^R01 and our EHR (Epic) is expecting a 2.3 MDM^T02. Furthermore, we needed the following transformations:

  1. The embedded image was sent in OBX-5.1, and we needed it moved to OBX-5.5
  2. The image format was sent in OBX-6 and we needed it in OBX-5.3 & 4
  3. Needed to create TXA segment
  4. Support a set 25 OBX segments that may be completely empty (>25 x 5Mb = 125Mb+ Message sizes, yikes!)

Example received message (replace ... with 5+ Mb embedded data):

MSH|^~\&|VENDOR||||20241017125335||ORU^R01|1|P|2.3|
PID|||203921||LAST^FIRST^^^||19720706|M||||||||||100001|
PV1||X||||||||GI6|||||||||100001|
ORC|RE||21||SC||1|||||||||||
OBR|1||21|21^VENDOR IMAGES|||20241017123056|||||||||1001^GASTROENTEROLOGY^PHYSICIAN|||||Y||||F||1|
OBX|1|PR|100001|ch1_image_001.bmp|...^^^^^^^|BMP|||||F|
OBX|2|PR|100001|ch1_image_003.bmp|...|BMP|||||F|
OBX|3|PR|100001|ch1_video_01thumbnail.bmp|...|BMP|||||F|
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||
OBX||||||||||||

My normal tools and testing was not up to par with these really large messages. When I used this example replacing the data with the ... of course the normal DTL drag and drop GUI and testing would play nice, but plug in the real data, and it all crumbled.

Eventually I found that I had to use a code block with ObjectScript using the %GlobalCharacterStream data types to work with the large messages correctly.

Sharing my final DTL class for anyone who might come after me and find this helpful

Class OrdRes.VendorMDM Extends Ens.DataTransformDTL [ DependsOn = EnsLib.HL7.Message ]
{

Parameter IGNOREMISSINGSOURCE = 1;

Parameter REPORTERRORS = 1;

Parameter TREATEMPTYREPEATINGFIELDASNULL = 0;

XData DTL [ XMLNamespace = "http://www.intersystems.com/dtl" ]
{
<transform sourceClass='EnsLib.HL7.Message' targetClass='EnsLib.HL7.Message' sourceDocType='2.3:ORU_R01' targetDocType='2.5:MDM_T02' create='new' language='objectscript' >
<assign value='source.{MSH}' property='target.{MSH}' action='set' />
<assign value='"MDM"' property='target.{MSH:MessageType.MessageCode}' action='set' />
<assign value='"T02"' property='target.{MSH:MessageType.TriggerEvent}' action='set' />
<assign value='"2.5"' property='target.{MSH:VersionID.VersionID}' action='set' />
<assign value='source.{MSH:DateTimeofMessage}' property='target.{EVN:2}' action='set' />
<assign value='source.{PIDgrpgrp().PIDgrp.PID}' property='target.{PID}' action='set' />
<assign value='source.{PIDgrpgrp().PIDgrp.PV1grp.PV1}' property='target.{PV1}' action='set' />
<assign value='source.{PIDgrpgrp().ORCgrp().ORC}' property='target.{ORCgrp().ORC}' action='set' />
<assign value='source.{PIDgrpgrp().ORCgrp().OBR}' property='target.{ORCgrp().OBR}' action='set' />
<assign value='source.{PIDgrpgrp().ORCgrp().NTE()}' property='target.{ORCgrp().NTE()}' action='set' />
<assign value='"Endoscopy Image"' property='target.{TXA:DocumentType}' action='set' />
<assign value='"AU"' property='target.{TXA:DocumentCompletionStatus}' action='set' />
<assign value='"AV"' property='target.{TXA:DocumentAvailabilityStatus}' action='set' />
<assign value='source.{PID:18}' property='target.{TXA:12.3}' action='set' />
<code>
<![CDATA[
 set OBXCount=source.GetValueAt("PIDgrpgrp(1).ORCgrp(1).OBXgrp(*)")
 For k1 = 1:1:OBXCount
 {
   // if OBX-1 is empty then it is assumed the rest of the segment will be empty too, so disregard it.
   If source.GetValueAt("PIDgrpgrp(1).ORCgrp(1).OBXgrp("_k1_").OBX:SetIDOBX") '= ""
   {
     // create new stream to read source OBX
     set srcOBXStream=##class(%GlobalCharacterStream).%New()
     // get stream data from source OBX
     set tSC=source.GetFieldStreamRaw(srcOBXStream,"PIDgrpgrp(1).ORCgrp(1).OBXgrp("_k1_").OBX")
     // get the positions of needed delimitters:
     set p1=srcOBXStream.FindAt(1,"|")    // 0>p1="OBX"
     set p2=srcOBXStream.FindAt(p1+1,"|") // p1>p2=OBX-1
     set p3=srcOBXStream.FindAt(p2+1,"|") // p2>p3=OBX-2
     set p4=srcOBXStream.FindAt(p3+1,"|") // p3>p4=OBX-3
     set p5=srcOBXStream.FindAt(p4+1,"|") // p4>p5=OBX-4
     set p6=srcOBXStream.FindAt(p5+1,"^") // p5>p6=OBX-5.1
     set p7=srcOBXStream.FindAt(p6+1,"|") // p6>p7=OBX-5.2 -> OBX 5.*
     // if no OBX-5.2 then there will not be the `^` and p6 and p7 will be `-1`
     // when that is the case, find p7 starting at `p5+1` and make p6 = p7
     if (p6 < 0) {
       set p7=srcOBXStream.FindAt(p5+1,"|") // p5>p7=OBX-5
       set p6=p7
     }
     set p8=srcOBXStream.FindAt(p7+1,"|") // p7>p8=OBX-6
     set tStream=##class(%GlobalCharacterStream).%New()

     // renumber OBX-1 to OBX 
     set tSC=tStream.Write("OBX|"_k1_"|")
     
     // set OBX2-2 to "ED"
     set tSC=tStream.Write("ED|")
     
     // copy source OBX-3 to target OBX-3
     set tSC=srcOBXStream.MoveTo(p3+1)
     set tSC=tStream.Write(srcOBXStream.Read(p4-p3-1))
     set tSC=tStream.Write("|")
     
     // copy source OBX-4 to target OBX-4
     set tSC=srcOBXStream.MoveTo(p4+1)
     set tSC=tStream.Write(srcOBXStream.Read(p5-p4-1))
     
     // copy source OBX-6 to OBX-5.3 & OBX-5.4
     set tSC=srcOBXStream.MoveTo(p7+1)
     set docType=srcOBXStream.Read(p8-p7-1)
     set tSC=tStream.Write("|^^"_docType_"^"_docType_"^")
     
     // copy source OBX-5.1 to target OBX-5.5
     // can only set up to 3,641,144 chars at once, so do while loop...
     set startPos=p5+1
     set remain=p6-p5-1
     // characters to read/write in each loop, max is 3,641,144 since .Write limit is a %String
     set charLimit=3000000
     while remain > 0 {
       set tSC=srcOBXStream.MoveTo(startPos)
       set toRead = charLimit
       if toRead > remain {
         set toRead=remain
       }
       set tSC=tStream.Write(srcOBXStream.Read(toRead))
       set remain=remain-toRead
       set startPos=startPos+toRead
     }
     set tSC=tStream.Write("|")

     set obxSegment=##class(EnsLib.HL7.Segment).%New()
     set obxSegment.SegType="2.5:OBX"
     set tSC=obxSegment.StoreRawDataStream(tStream)
     set tSC=target.setSegmentByPath(obxSegment,"OBXgrp("_k1_").OBX")
   }
 }
]]></code>
</transform>
}

}

For developing and testing this, I used the VSCode Plugins for InterSystems because the integrating testing tools could not handle the message size.

I will also add, that getting HL7 over HTTPS to Epic's InterConnect also involved creating a custom HTTP class and sending the custom Content-Type x-application/hl7-v2+er7

7
1 392
Question Scott Roth · Oct 2, 2024

I have been trying to track down an issue we are seeing in our TEST environment with Memory usage.

We have Several BP's for years now that take a HL7 message, parse it apart, and make calls to a Custom EnsLib.SQL.OutboundAdapter to have it execute Insert/Select/Update/Delete stored procedures against a MS SQL Database via JDBC connection. We are using Microsoft's JDBC 12.2 driver to do this.

What we are seeing is that IRIS.WorkQueue globals are being defined for these calls but then the IRIS.WorkQueue is not being cleaned up and taking up large amounts of Memory.

5
0 141