6 Followers · 246 Posts

IRIS supports Data Transformation Language (DTL) for describing data transformations. DTL is an XML language. Ensemble provides wizards and graphical tools for creating, editing, and testing DTL transformations. A data transformation is a Caché class like the following. If you prefer you can use Studio to edit the class definition directly and bypass the wizards and graphical tools.

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 386
Question Smythe Smythee · Sep 28, 2022

Hi ,

I am Converting HL7 message into SDA3 format by using  Ens.DataTransform Class but transformation is not happening while using this class and throwing the below error

ERROR <Ens>ErrException: <UNDEFINED>zTransform+1^Hosiptal.SDA3.DataTrans.1 *target -- logged as '-' number - @' Set target.Patient.Name=source.GetValueAt("PID:5")'

Let me know if any mistake please refer the below code

Class Hosiptal.SDA3.DataTrans Extends Ens.DataTransform
{

ClassMethod Transform(source As EnsLib.HL7.Message, target As HS.SDA3.Container) As %Status
{
 
   Set target.Patient.Name=source.

15
0 680
Question Smythe Smythee · Aug 23, 2023

Hi Community ,

I am using %Date Property for defining one csv source message class .Please refer below class

Class CSVtoHL7. Inputfile.Record  Extends  ,(%XML.Adaptor, Ens.Request, EnsLib.RecordMap.Base) [ Inheritance = right, ProcedureBlock ]

{

Property ID As %Integer;

Property LastName As %String;

Property FirstName As %String;

Property MiddleName As %String;

Property DOB As %Date;

Property Gender As %String;
}

Please refer to data transformation class

XData DTL [ XMLNamespace = "http://www.intersystems.com/dtl]
{
<transform sourceClass='CSVtoHL7.Inputfile.RecordtargetClass='EnsLib.HL7.

14
0 790
Question Scott Roth · Jun 19, 2017

I have come across several cases where I need to set a Date filter to send only send any admit/scheduled date past a certain point. We have a couple different date comparison functions but none looking at the true date. Most of them are date + 15 or etc. Does anyone have a good date function they have written to say if x > 20170102 ?

Thanks

Scott

14
0 2508
Question Colin Brough · Jun 6, 2023

One of our development Ensemble instances is misbehaving. We suspect we'll just need to reinstall it - which would be a hassle. Before we do, we wanted to check we weren't missing some kind of easy fix. The symptoms we are seeing:

  1. A Cache process is running at 100% CPU on one core of the server - its the TASKMGR process
  2. That Cache process resumes at 100% on Ensemble restart, and indeed after server reboot
  3. There might be evidence of corruption in the task schedule: there's a "next scheduled date" of 1840-12-31 00:05.
12
0 705
Question John Klahn · Apr 28, 2022

Good afternoon,

I'm trying to take an unformatted social security number and insert the dashes into it.  I'm getting a value in PID-19 like this:  "123456789" and would like to use a data transformation to set the value in PID-19 to "123-45-6789". 

I can't find any insert or append functions and I can't find anything in the Intersystems doc repository that would do this.  Can someone help point the way for me please?  I would like to keep this as a "set" action in my DT.  I'm a little new to calling classes so it would be helpful if you included some syntax that would go in the "Value" field.

12
0 831
Question Joao Palma · Jul 5, 2017

Hi

I've got a Service that get ACK Messages originated by another system. 

I want to get the details of a Message when the ACK is CE (Failed Message).

I don't know whether this is the best approach but, at the moment, I have a DTL and I would like to search the Cache Database for a Message with the Control ID on the ACK in the MSA segment.

Any help with this would be great.

Tks.

11
0 842
Question Goran Stefanovic · Jul 6, 2020

I need to set and use some context variables in a transformation (written in DTL), but the code is manually written.

When writing the same as BPL I define context variables and they are visible in transformations called by that process.

In something like this my.DTLtransform sets HL7 message fields to values in context variables:

Set dtl = ##class(my.DTLtransform).%New()
Set qStatus = dtl.Transform(pRequest, .msg)
 

However, when I create a business process using custom code option, I don't see an obvious option, as well as documentation covering that area.

11
1 1016
Question Aman · Jul 2, 2024

Hello Community,

I'm a beginner and currently working on a project to convert CCDA files to FHIR using InterSystems IRIS. I have developed a web form to upload CCDA files, and I'm attempting to convert the uploaded CCDA files to FHIR. However, I am encountering an issue where the conversion process results in an empty entry.
Here's the Output it displays on HTML page:

Size of CCDA Stream: 741524

Here is my code: CCDtoFHIR.csp

htmllang<</<br<brul

Problem Description:

9
0 251
Question Scott Roth · Jul 3, 2025

I am making a FHIR request against Epic, in when I get the Response back using "fromDao" I am extracting the stream into HS.FHIRModel.R4.Patient. However, the patient's name comes back as name within a list that references HS.FHIRModel.R4.SeqOfHumanName.

  • How do I extract the name from HS.FHIRModel.R4.SeqOfHumanName?
  • Do I have to then do another "fromDao" to pull the list into string format?
  • How do I navigate around the lists that are in a FHIRModel response, to extract the string values?
9
0 174
Question Scott Roth · Jan 13, 2021

I have a case where our EMR is sending data, but not all the values needed for the Ancillary are valued properly and causes that message to error/halt processing on the Ancillary system, not ideal but its what they do. I would expect them to still process the message except that 1 field, but they don't.

I want to add validation to make sure certain fields are valued correctly for the Vendor. 

So I add some statements to take those items that don't pass this validation out to a batch file with headers.

But I want to email out that batch file.

9
0 1155
Question Ravi Akkiraju · Apr 22, 2017

Consider the below scenario:

1. HL7 Service -> Process

2. DTL makes a call to a webservice (Post) via a REST operation via SendRequestSync call.

        a. if the post is successful, end the DTL

        b. if the server that hosts the webservice is down, i would like to keep retrying with the same message and not lose any messages in the queue.

does a simple "quit 0" at the DTL will  rollback the message and will retry? please let me know how not to lose any messages if the webservice server is down.

Appreciate it.

8
1 606
Question Mary George · Apr 1, 2021

Does anyone know how to disable the auto-refresh in Healthshare, especially for Message viewer , Business process designer, DTL editor pages?  

These pages in management portal refresh every 15min( i.e. as per the session time out setting) . I tried to  set the following two configs to disable the auto refresh but both had no impact. 

set ^EnsPortal("DisableInactivityTimeout","Portal") = 1
set ^%SYS("Portal","EnableAutoRefresh") = 1

Thank you for your help. 

Mary

8
0 970
Question Ondřej Hoferek · Apr 20, 2016

I installed Atelier on Windows in order to take a look at how the BPL and DTL graphical editors accessible via the "Open diagram editor" action work. The diagram editor is opened but I get the following error:


Message from webpage
---------------------------
Unable to load SVG diagram. Please ensure your browser is supported for portal access.

It looks like Atelier uses IE in order to display the editor even though my Windows default browser is Chrome.

I tried to change the General -> Web Browser setting to "Use external web browser" and choosing Firefox or Default system web browser.

8
0 677
Question Graham Uricchio · Apr 4, 2017

I created a DTL to do HL7 mapping. The test function in the tools works the DTL perfectly but when used by the rule in my business process, the OBX segments are stripped and the MRN is gone. The assigning authority and ID type are added into the PID but the actual patient MRN is blank (3.1 value).

Here is the source code. 

<transform sourceClass='EnsLib.HL7.Message' targetClass='EnsLib.HL7.Message' sourceDocType='2.3:MDM_T02' targetDocType='2.5:MDM_T02' create='new' language='objectscript' >
<code>
<![CDATA[ //MSH SEGMENT]]></code>
<assign value='source.{MSH}' property='target.

8
0 857
Question Smythe Smythee · Oct 10, 2022

Hi ,

Still a newbie for ensemble, I am trying to convert XML message to HL7 Message. I am using Custom schema for XML structure which includes MSH and PID segments from HL7 Message.

These are the service, process, Operation classes i am using 

Business service-EnsLib.EDI.XML.Service.FileService

Business Process-EnsLib.MsgRouter.RoutingEngine

Business operation -EnsLib.HL7.Operation.FileOperation

I am using data transformation to convert XML message to HL7 message  and data transformation is working fine and im getting this in the business operation.

8
0 1214
Question Thembelani Mlalazi · Dec 7, 2017

I am trying to transform an Enlib.EDI.XML.Document through aXLT I know how to trans form the xml document  through a xlt stylesheet but been trying to get an Enlib.EDI.XML. Document from a procees by creating aoperation that will do the transformation of this to file if this can be done in a process all ideas welcome  so far I have come to this and I keep getting an error

:ERROR{ERROR #5002: Cache error: <PROPERTY DOES NOT EXIST>zXMLTOJson+6^TestEnvironment.Custom.GENERAL.CUSTOM.XLT.XMLToJsonOperation1.1 *Parameters,EnsLib.EDI.XML}
Class XLT.XMLToJsonOperation1 Extends (Ens.BusinessOperation, EnsLib.XSLT.Transformer)
{ Parameter ADAPTER = "EnsLib.File.OutboundAdapter"; Property Adapter As EnsLib.File.OutboundAdapter; /// Style sheet to convert Message to Json
Property XLTStyleSheet As %String(MAXLEN = ""); Parameter SETTINGS = "XLTStyleSheet:Basic"; Parameter INVOCATION = "Queue"; /// Default operation is to use a TransformationRequest to transform the input XML into the output
Method XMLTOJson(pRequest As EnsLib.EDI.XML.Document, Output pResponse As EnsLib.XSLT.TransformationResponse) As %Status
{
 Set tSC=$$$OK,$ZT="Trap"
 do {
  // Grab the input content and the stylesheet key
  Set tInput = pRequest
  Set tSSKey = ..XLTStyleSheet
  
  Set tSC = ..Transform(tInput,tSSKey,pRequest.Parameters,.tOutput)
    
  If $$$ISOK(tSC) {
   Set pResponse = ##class(EnsLib.XSLT.TransformationResponse).%New()
   Set pResponse.Content = tOutput
  }
  
 } while (0)
Exit Quit tSC
Trap Set tSC=$$$ERROR($$$CacheError,$ZE) Goto Exit
} XData MessageMap
{
<MapItems>
 <MapItem MessageType="EnsLib.EDI.XML.Document">
  <Method>XMLTOJson</Method>
 </MapItem>
</MapItems>
} }
7
0 1055
Question Scott Roth · Jun 3, 2022

I noticed today that when we are creating a message from one doc type to another doc type, that the message type categories are not necessarily set. This is causing some issues with routing rules when we try to reference the Message Type Categories. Is there a way to make sure the Message Type Categories are being set within a DTL to make sure this doesn't cause problems down the road?

Thanks

Scott

7
0 515
Question Scott Roth · Jan 13, 2024

Within a DTL is it possible to access and update the Message Header properties of an EnsLib.HL7.Message?

Currently we have multiple EMR Services for each environment sending to 1 Business Process to Normalize the data, then it is sent to another Business Process to route the data. 

Since the SourceConfigName changes with every send to a Business Process, I am looking for a way to maintain the SourceConfigName of the SessionID so I know how to direct the message.

7
0 723
Question Thom de Groot · Nov 15, 2023

Hello,

For a particular problem we were trying to parse a relatively large *.csv file with a recordmap. We are doing this from a BPL where we start with a REST call to acquire the file. This file needs a slight transformation which we tried in a DTL. However DTL's seem to be incapable of parsing larger files. 

We see two different alternatives: The first one to write custom code to parse the file. And the second option to write SQL queries and to write the output to a csv file.

7
0 604
Question Laura Cavanaugh · Jun 28, 2016

Hello Community,

I am trying to create a simple Ensemble DTL transform using the GUI.  In order to test something very simple, I have created a transform that does nothing.  

I'm using test data from here: https://www.emedny.org/HIPAA/5010/5010_sample_files/835%20Sample%20(Ins…

 It's a very small test 835 file.

My transform looks like this in the compiled class:

7
0 1168
Question Scott Roth · Nov 23, 2016

I have a standard text file that is coming out of a system new line delimited. Each document will have the same field structure each time.

ID: xxxxxxxxx
Name: xxxx,xxxx   Age: xx   Sex: x

OSU Wexner Medical Center Harding Hospital
Treatment at  7/14/2016   10:39:34 AM

% Energy Set                                    50 %
Charge Delivered                             255.4 mC
Current                                       0.91 A
Stimulus Duration                              7.0 Sec
Frequency                                       40 Hz
Pulse Width                                   0.50 mSec
Static Impedance                              1170 Ohm
Dynamic Impedance                              200 Ohm
EEG Endpoint is not detected
EMG Endpoint                                    15 Sec
Base Heart Rate                                 78 b/m
Peak Heart Rate                                 91 b/m
Average Seizure Energy Index                7471.4 ?V?
Postictal Suppression Index                    N/A
Maximum Sustained Power                    15787.0 ?V?
Time to Peak Power                              12 Sec
Maximum Sustained Coherence                   99.3 %
Time to Peak Coherence                          17 Sec
Early Ictal Amplitude                        113.1 ?V
Midictal Amplitude                           177.7 ?V
Post-Ictal Amplitude                           N/A
Program Selected:   LOW 0.5 CHARGE RATE
7
0 1164
Question Scott Roth · Jul 8, 2019

Way back when during our Siemens LCR days we had to limit the number of characters in OBX.5 to a length of 75. That was back when we had eGate.

Now I need to do the reversal of that and take loop through a string length and split the string up into multiple OBX or NTE based on a certain length. In reading documentation $EXTRACT can do this if you know the exact length, but in this case we don't. 

So how would one loop through a string and say every 75 characters create a new OBX or NTE segment?

Thanks

Scott

7
0 3173
Question Eric Tulowetzke · May 23, 2025

Hi all,

My team is exploring options for handling timezone offsets in DTL and we’re wondering if there are any built-in methods available — ideally low-code or no-code solutions. Specifically, we're looking for a way to adjust timestamps based on the date and whether Daylight Saving Time (DST) is in effect.

For example, if an HL7 message has an MSH-7 value of 20250518144529, it should be converted to 20250518144529-0500 (Central Daylight Time), but if the timestamp were 20250218144529, it should be 20250218144529-0600 (Central Standard Time).

6
1 242
Question Smythe Smythee · Feb 17, 2024

Hi Community,

Is there a way to call HL7 Data transformation directly from Business service without using Rule functionality in the production

In this scenario i need to call a data transformation in directly in business service and give the transformed message to Business operation 

Please share if you have any ideas to implement this.

Thanks,
Smythee

6
0 314