Find

Digest
· Sep 1

InterSystems Developers Publications, Week August 25 - 31, 2025, Digest

Articles
Announcements
#InterSystems IRIS
#InterSystems Ideas Portal
InterSystems Ideas News #24
By Irène Mykhailova
#Other
#HealthShare
#InterSystems IRIS BI (DeepSee)
Questions
Discussions
#Global Masters
Summer 2025 with Global Masters
By Admin GlobalMasters
August 25 - 31, 2025Week at a GlanceInterSystems Developer Community
Digest
· Sep 1

InterSystems Developer Community Digest, August 2025

Hello and welcome to the August 2025 Developer Community Newsletter.
General Stats
107 new posts published in August:
 23 new articles
 33 new announcements
 47 new questions
 4 new discussions
350 new members joined in August
15,403 posts published all time
17,441 members joined all time
Top posts
Top authors of the month
Articles
#InterSystems IRIS
A video of InterSystems Testing Manager version 2 revealing how much coverage your unit tests are achieving
By John Murray
Why It's Time for a TrakCare Techno-Functional Application Specialist Certification
By Harshitha
WARNING: Bug in IRIS Native API
By Robert Cemper
IrisTest – Simplifying Unit Test Report Generation
By Ashok Kumar T
Tracing InterSystems IRIS Applications Using Jaeger
By Yuri Marx
The Object Script Hitchhiker’s Handbook
By Zion Amsalem
Why do we need coding rules or conventions, anyway?
By Timothy Leavitt
Using LIKE with Variables and Patterns in SQL
By Iryna Mykhailova
A beginner's guide to creating SQL tables and seeing them as classes
By Iryna Mykhailova
Beginner's Guide to %JSON and Dynamic Entities in IRIS
By Robbie Luman
Practical ObjectScript Coding: From JSON to Globals to SQL
By Vachan C Rannore
Migrating InterSystems Studio/Caché and Visual Studio Code Setup to a new Windows PC
By Pietro Di Leo
Building a robot with IRIS
By Stuart Salzer
Understanding free memory on a Linux database server
By Murray Oldfield
Importing CSV Data Into InterSystems IRIS and preserving IDs
By Evgeny Shvarov
Prevent specific table data from being rolled back
By Hiroshi Sato
Convert Python %SYS.Python List to %Library.DynamicArray in Objectscript
By Sammy Lee
How to Integrate Google Cloud Pub/Sub with InterSystems IRIS: A Practical Guide
By Eugene.Forde
#InterSystems IRIS for Health
#Developer Community Official
#HealthShare
Announcements
#InterSystems IRIS
#Developer Community Official
#Other
#Open Exchange
#IRIS contest
#HealthShare
#InterSystems IRIS for Health
#Global Masters
#Learning Portal
#InterSystems Official
#InterSystems Ideas Portal
InterSystems Ideas News #24
By Irène Mykhailova
#InterSystems IRIS BI (DeepSee)
Questions
#InterSystems IRIS
I am trying to design a home Zen screen with a title at the top and 6 buttons gathered in the center and middle of the screen arranged in 2 columns of 3 three buttons.
By David Saunders
SQL Search REST Interface Example
By Scott Roth
IRIS Terminal Lite / VS Code and $system.SQL.Shell()
By Jeffrey Drumm
How do I use rabbitmq?
By Kyungbeom Jin
Redirecting Python output to the device ObjectScript method is called from for output capture?
By Hannah Sullivan
Is there a simple, perhaps built in, way of recording sequence of function calls?
By Anna Golitsyna
Business service connect ECONNREFUSED error
By Touggourt
How to get treeMapCharts to show labels on DeepSeeWeb
By Georgia Gans
ZenPage Table not Updating
By Aaron Laferty
Any Better Way to Strip the Fractions of Seconds from a Posix Time?
By Jean Millette
Is there a way to drop/remove an inherited setting (from the SETTINGS class parameter) in an interoperability business host?
By Timothy Leavitt
Do I need a separate python iris connection for each Namespace?
By Ronaldo Nascimento
How much length of data stored in Binary Resource? the Data is base64bineary it support the large data like 50 lac characters length on base64 data(35mb) pdf data stored in IRIS Binary Resource?
By Rutvik ISM
About the deprecated libraries, is there an expiration time in the code?
By André Dienes Friedrich
How to change the IRIS user when starting a terminal session in an IRIS container?
By Ali Nasser
How to Handel large data like 50 lac characters support in Base64 binary in Binary FHIR Resource ? i
By Rutvik ISM
VS code not importing CSP files
By Peter Smit
Router does not work with number parameter in %CSP.REST
By Sébastien Demoustiez
How to integrate Google Cloud Pub/Sub with InterSystems IRIS?
By Rama Krishna Kummari
ZEN Webpage for uploading and downloading a file without unix access
By Virat Sharma
How do I get a Search Table to show up in a different Namespace?
By Scott Roth
Best practices for JSON transformation in IRIS interoperability
By Timothy Leavitt
Using a Linked Table (SQL) as a Filter in a Business Rule
By Scott Roth
Find In Files fails with WIDE CHAR
By Anna Golitsyna
How can I integrate Google Cloud Pub/Sub with InterSystems IRIS (HealthShare)?
By Eugene.Forde
Cache Studio for IRIS 2024.3
By Nuno Almeida
#Other
#InterSystems IRIS for Health
#HealthShare
#Caché
#Open Exchange
#InterSystems IRIS BI (DeepSee)
BI Architect expressions
By Dmitrij Vladimirov
Discussions
#InterSystems IRIS
#HealthShare
#TrakCare
#Global Masters
Summer 2025 with Global Masters
By Admin GlobalMasters
August, 2025Month at a GlanceInterSystems Developer Community
Announcement
· Sep 1

Vote na Melhor Demonstração! Os Jogos de Demonstração da InterSystems estão no ar!

Ola Comunidade,

Temos algo emocionante para você: é hora de um novo concurso de vídeo de demonstração e, desta vez, você está na cadeira do jurado!

📺 Jogos de Demonstração para Engenheiros de Vendas da InterSystems 📺

Para este concurso, os Engenheiros de Vendas da InterSystems do mundo todo enviaram pequenos vídeos de demonstração apresentando casos de uso exclusivos, soluções inteligentes e recursos poderosos das tecnologias da InterSystems.

Agora é a sua vez! Estamos abrindo a votação para toda a Comunidade de Desenvolvedores. Sua percepção e perspectiva como desenvolvedores fazem de vocês os especialistas perfeitos.

👉 Como Participar

🗓 Período do Concurso

A votação estará aberta de 26 de maio a 14 de setembro de 2025, e os vencedores serão anunciados logo depois.

Novos vídeos serão adicionados ao longo do concurso — então continue acompanhando. Você pode encontrar um favorito bem no final!
 

✅ Como votar: 

Todos os membros ativos que fizeram uma contribuição válida para a Comunidade de Desenvolvedores ou o Open Exchange — como fazer ou responder perguntas, escrever artigos ou publicar aplicativos — podem votar. Isso inclui clientes, parceiros e funcionários que se cadastraram usando seus endereços de e-mail corporativos.

Para votar:

  1. Log in (ou crie uma conta) na Comunidade de Desenvolvedores 
  2. Visite a página do concurso
  3. Selecione seus 3 vídeos favoritos e clique no botão “Votar” para cada um

🏆 Sistema de pontuação:

  • 1º lugar = 9 pontos
  • 2º lugar = 6 pontos
  • 3º lugar = 3 pontos

🔁 Os votos dos Moderadores Oficiais da Comunidade* contam em dobro, então suas principais escolhas realmente importam!

* Os moderadores são indicados por um círculo verde ao redor do avatar.


Que comecem os Jogos de Demonstração – e que vença a melhor demonstração!
 

Discussion (0)1
Log in or sign up to continue
Digest
· Sep 1

Nuevas publicaciones en la Comunidad de InterSystems, 25-31 agosto

25-31 agostoWeek at a GlanceInterSystems Developer Community
Article
· Sep 1 9m read

Data Transformation Testing

InterSystems IRIS interoperability production development involves using or writing various types of components. They include services (which handle incoming data), processes (which deal with the data flow and logic), and operations (which manage outgoing data or requests). Messages flowing through those components constantly require being adapted to consuming applications. Therefore,Data transformations are by far the most common component in interoperability productions.

In the early stages of data transformation development, the test tool from the Management Portal becomes quite handy. It complements programmatic tests (unit tests), which can be implemented during a later stage to prevent regressions and ensure the transformations continue to function after changes are applied to the environment.

The first part of this article explains how to use the test tool user interface available in Ensemble 2007 and later versions. We can invoke it directly from Visual Studio Code IDE with any class that extends Ens.DataTransform.

Please note that a new user interface is now available for DTL Editor and the test tool. In the first part of this article, we will examine the current user interface (available in Ensemble 2007 and later versions). In the second part, on the other hand, we will explore the new interface (available in IRIS 2025.1 and later versions).

The third and final part of this article will detail unit testing data transformations. It will also outline some guidelines and good practices for data transformation coding.

Part 1: Using the current Test Tool User Interface

The test tool can be accessed from either Studio or the Management Portal. It is also possible to configure a server action to invoke it directly from VS Code.

To access the test tool from the Management Portal, navigate to Interoperability > Build > Data Transformation and open a transformation using the 'Open' button. The dialog will allow you to select only DTL transformations. However, the test tool supports any class that extends Ens.DataTransform (more on this later).

   

The URL for the tool, when invoked from the Management Portal, should look like the following:

http://localhost:58603/csp/healthshare/irisapp/EnsPortal.Dialog.TestTransform.zen?$ZEN_POPUP=1&$ZEN_SOFTMODAL=1&TRANSFORM=test.SampleTransformDTL

Let’s have a closer look at the URL individual components:

  • Server base URL: it is the IRIS CSP gateway base URL
  • Test component path: it is the path of the (zen) test tool component
  • The remaining part of the URL has component parameter values:
    • $ZEN_POPUP: true (1) - it means that this is a pop window
    • $ZEN_SOFTMODAL: true (1) - it means that this window is modal
    • TRANSFORM: it is a data transform class name

Invoking the tool from VS Code

 

Using the test component's URL, you can invoke a tool from VS Code with the help of a server action. To do that, simply add an extra link to the "links" key of objectscript.conn in settings.json.

For IRIS for Health:

"objectscript.conn": {
       "links": {
         "Data Transform Test": "${serverUrl}/csp/healthshare/${namespace}/EnsPortal.Dialog.TestTransform.zen?$ZEN_POPUP=1&$ZEN_SOFTMODAL=0&TRANSFORM=${classname}"
       }
     }
 
For IRIS Data Platform:
"objectscript.conn": {
       "links": {
         "Data Transform Test": "${serverUrl}/csp/${namespace}/EnsPortal.Dialog.TestTransform.zen?$ZEN_POPUP=1&$ZEN_SOFTMODAL=0&TRANSFORM=${classname}"
       }
     }

 

The link uses the following variables exposed by the ObjectScript extension:

  • ${serverUrl}: The connected server base URL.
  • ${namespace}: The connected namespace.
  • ${classname}: The currently open class name.

 

For more details on configuring server actions, see Configure and Perform Server Actions within VS Code | Use Visual Studio Code as a Development Environment for InterSystems Applications | InterSystems Components and Tools.

While the dialog in the portal allows you to select only DTL transformations, the test tool supports any class that extends Ens.DataTransform.

For DTL transformations, it gets the source and target classes from the DTL <transform> element's attributes. For non-DTL transformations (classes that extend  Ens.DataTransform), the tool uses the Transform() method signature.

When the source and/or target class is a virtual document class (a class that extends Ens.VDoc.Interface), a document type (DocType) is required. For DTL data transformations, the tool gets the <transform> element's attributes, SourceDocType, and TargetDocType. For non-DTL transformations, an implementation of GetSourceDocType() and/or GetTargetDocType() is a must.

Example

Below you can find a complete example of a non-DTL data transformation (extending Ens.DataTransform directly) that can be used with the test tool. The transformation clones a source HL7 v2.3 SIU message and sets the target message SCH:7.1 field component value.

Class ut.ks.lib.interop.SampleTranform Extends Ens.DataTransform
{ 
ClassMethod Transform(source As EnsLib.HL7.Message, Output target As EnsLib.HL7.Message, aux As %String) As %Status
{
    #Dim sc as %Status
    #Dim ex as %Exception.AbstractException
    s sc = $$$OK
    try {
        s target = source.%ConstructClone(1)        
        s target.DocType = ..GetTargetDocType()
        d target.SetValueAt("hello","SCH:7.1")   
    } catch (ex) {
      s sc = ex.AsStatus()
    }
    return sc
}
 
ClassMethod GetSourceDocType() As %String
{
  return "2.3:SIU_S12"
}
 
ClassMethod GetTargetDocType() As %String
{
  return "2.3:SIU_S12"
}
 
}

 Take a look at a little screencast of this code in action below:

 

Part 2: Using the Test Tool with the new user interface

Starting with InterSystems IRIS version 2025.1, the DTL editor and test tool got a new, alternative user interface accessible from the Management Portal or VSCode IDE.

To access the new UI from the Management Portal, go to Interoperability > Build > Data Transformation and open a transformation using the ‘open’ button. Remember that the dialog will let you select only DTL transformations. To switch to the new user interface, click the “new UI” button. 
The new user interface can also be accessed as an editor directly in VS Code.

Unlike the previous version, the new test tool supports only DTL data transformations. To use it with a class that extends Ens.DataTransform, you must wrap the call to the Transform() class method in a code action. Review the following example:

Class ut.ks.lib.interop.SampleTransformDTL Extends Ens.DataTransformDTL [ DependsOn = EnsLib.HL7.Message ]
{
 
Parameter IGNOREMISSINGSOURCE = 0;
Parameter REPORTERRORS = 0;
Parameter TREATEMPTYREPEATINGFIELDASNULL = 0;
Parameter GENERATEEMPTYSEGMENTS = 0;
XData DTL [ XMLNamespace = "http://www.intersystems.com/dtl" ]
{
<transform sourceClass='EnsLib.HL7.Message' targetClass='EnsLib.HL7.Message' sourceDocType='2.3:SIU_S12' targetDocType='2.3:SIU_S12' create='new' language='objectscript' >
<code>
<![CDATA[
    return ##class(ut.ks.lib.interop.SampleTranform).Transform(source,.target,.aux)
  ]]></code>
</transform>
}
}

 

Part 3: Programmatic testing

Using the %UnitTest framework, it is easy to write repeatable and robust programmatic tests for data transformations. See @Yuri Marx excellent article on the topic and the official documentation for more.

It is generally a good practice for transformations to depend as little as possible on runtime context data other than the source and auxiliary objects.

Generally speaking, operating anything other than the source, target, auxiliary objects, or the current namespace content should be avoided. Below you can check some examples of what should be bypassed:

  • Depending on interoperability production (e.g., sending a request to a business operation).
  • Having a stateful Transform() class method.
  • Performing a file or external database input/output.

If additional runtime data is needed, the transformation class should provide default values to the maximum extent possible. To achieve that, add such members as class parameters or XData blocks to the transformation class.

Parameters can hold any string value (even multi-line), and when declared as a configuration value, can be changed in a given namespace after class compilation (a nice, yet underrated configuration mechanism).

XData blocks are more suitable for small XML documents, JSON objects or arrays, or text-structured data. Remember to takegeneral system limits into account, though.

Larger data may be made available to the transformation using the following:

The Auxiliary parameter “aux” is passed by the caller of the Transform() class method. It can be a datatype value or an OREF. When the transformation is used in the ‘send’ action of a message router rule, the router passes itself as an aux parameter, and its properties (e.g., RuleActionUserData) become available to the transformation.

If the transformation class cannot provide the defaults, the test should deliver them and initialize any required state before running the Transform() method. If the transformation is, for instance, using a custom HL7 schema, it should be loaded before the test run. The test should, as an example, do the following:

A unit test for a transformation begins by initializing context data (e.g., import lookup tables). Then, for each test source object, it calls the Transform() method and compares the resulting target object coming from the transformation to the expected outcome.

Anticipated results can be stored as files loaded by the test at runtime or XData blocks. With many inputs to test (e.g., when testing multiple complete HL7 v2.x ADT scenarios), I find files to be more practical.

Example

Test Class

This test uses the ks-iris-lib module from Open Exchange to import HL7 messages from XData blocks and compare the target message from the transformation to the expected result:

Class dc.SampleTransformTest Extends ks.lib.test.TestCase
{
 
Method TestTransform()
{
    #Dim sc as %Status
    #Dim ex as %Exception.AbstractException
    #Dim source,target,expected As EnsLib.HL7.Message
   
    s sc = $$$OK
    try {
        set source = ##class(ks.lib.hl7.Utils).ImportFromXData($classname(),"SourceHL7","2.3",.sc)
        $$$TOE(sc,sc)
        set expected = ##class(ks.lib.hl7.Utils).ImportFromXData($classname(),"ExpectedHL7","2.3",.sc)
        $$$TOE(sc,sc)
        $$$TOE(sc,##class(NullTranform).Transform(source,.target,$this))
        do $$$AssertTrue(..CompareHL7Messages(target,expected))
    } catch (ex) {
      s sc = ex.AsStatus()
    }
    do $$$AssertStatusOK(sc)
}
 
XData SourceHL7 [ MimeType = application/hl7 ]
{
MSH|^~\&|SPOCARD|EWHIN|JONES|EWHIN|199401040800||SIU^S13|021244SPOCARD|P|2.3|||AL|ER||
SCH|1994047^SCH001|1994567^SCH100|||||047^Referral|NORMAL|30|min|^^^199401091300^199401091330^^^^|0045^Jones^Harold^S^^^MD|555-4685|||087^Jensen^Helen^M^^^MD|555-9255||||BOOKED
NTE||The patient is going to be on vacation so cannot make previous appointmentscheduled on January 6.
PID||4875439|484848||Peterson^Joseph^^Jerome^SR|Brown|19401121|M|Jayjay||N 1234 Newport Highway^Mead^WA^99021||555-4685|||M|||999-99-4413|||||||||||
RGS|001|
AIP|001|032^JENSEN^HELEN|002^CARDIOLOGIST|||||||NO|BOOKED
}
 
XData ExpectedHL7 [ MimeType = application/hl7 ]
{
MSH|^~\&|SPOCARD|EWHIN|JONES|EWHIN|199401040800||SIU^S13|021244SPOCARD|P|2.3|||AL|ER||
SCH|1994047^SCH001|1994567^SCH100|||||047^Referral|NORMAL|30|min|^^^199401091300^199401091330^^^^|0045^Jones^Harold^S^^^MD|555-4685|||087^Jensen^Helen^M^^^MD|555-9255||||BOOKED
NTE||The patient is going to be on vacation so cannot make previous appointmentscheduled on January 6.
PID||4875439|484848||Peterson^Joseph^^Jerome^SR|Brown|19401121|M|Jayjay||N 1234 Newport Highway^Mead^WA^99021||555-4685|||M|||999-99-4413|||||||||||
RGS|001|
AIP|001|032^JENSEN^HELEN|002^CARDIOLOGIST|||||||NO|BOOKED
}
 
}
 

Transform Class

Class dc.NullTransform Extends Ens.DataTransform
{
 
ClassMethod Transform(source As EnsLib.HL7.Message, Output target As EnsLib.HL7.Message, aux As %String) As %Status
{
    #Dim sc as %Status
    #Dim ex as %Exception.AbstractException
    s sc = $$$OK
    try {
        s target = source.%ConstructClone(1)        
        s target.DocType = ..GetTargetDocType()
    } catch (ex) {
      s sc = ex.AsStatus()
    }
    return sc
}
 
ClassMethod GetSourceDocType() As %String
{
  return "2.3:SIU_S12"
}
 
ClassMethod GetTargetDocType() As %String
{
  return "2.3:SIU_S12"
}
 
}
Discussion (0)3
Log in or sign up to continue