Question Jeffrey Drumm 路 Aug 5, 2025

It appears as though command history is not available via up/down arrow keyboard keys when using the SQL Shell. Is there anything in the works to change that?

Also, typing the colon character (:) as the first character after the prompt in Terminal Lite does odd things in 2025.1.1 ... every keystroke starting with the colon is echoed back and pressing Enter generates an error:

The red :SQL on the first line was echoed simultaneously as the :SQL in white was typed. Also, it's obvious that aliases don't work in Terminal Lite 馃槈

1
0 132
Question Jeffrey Drumm 路 Jun 18, 2025

I seem to remember making this work before, but I'm not having any luck digging up examples.

I've defined some custom properties for a business operation that could definitely benefit from having popup descriptions available in the Production Configuration. I have triple-slash comments before each property that do just that in the source. I thought those provided the text for the popup descriptions when clicking on the property name, but apparently not.

Any thoughts?

10
0 142
Question Jeffrey Drumm 路 Apr 30, 2025

I ran into a situation where VS Code consumed all available web sessions and was unable to get to the Management Console to clear them. I was able to establish a terminal session, though.

Is there a method or routine available through the IRIS terminal that allows one to clear web sessions? I've searched the administration and class documentation and haven't found a solution.

3
0 160
Question Jeffrey Drumm 路 Jan 13, 2025

I'm sure I've seen this issue reported before, but a search hasn't turned it up.

This appears to happen randomly, but once it starts it doesn't seem to stop ... at least for a while. I attempt to compile a class and compilation fails but produces no error explaining why. Here's an example:

The last two compilation errors repeat indefinitely (or at least until I've found and fixed the issue), but I can open the class in Studio, compile, and get the error information in the output panel every time. The compilation qualifiers are the same in both.

1
0 192
Question Jeffrey Drumm 路 Nov 21, 2024

I'm attempting to streamline a process for renaming PDF documents received from multiple vendors to conform to a specification provided by an EMR vendor for ingestion. Things like Document ID, Document Type, Date of Service, Account Number, MRN, etc. all must be included in the filename at defined offsets and lengths. Most of the required values can be extracted from the inbound file's name and the few remaining are static values that would be the same (or handled via a lookup table based on source) for all documents.

22
0 341
Article Jeffrey Drumm 路 Jul 17, 2024 2m read

I found myself in the not-so-comfortable situation of working with a Linux system on which someone had accidentally disabled user access to the Linux shell. HealthConnect was running, servicing hundreds of interfaces. To resolve the access issue, though, we needed to bring the host down for the application of a fix.

Without the shell, the iris command is not available to control the instance, so we were faced with the potential of shutting down the server ungracefully. We wanted to avoid that if possible .

7
3 730
Question Jeffrey Drumm 路 Jun 28, 2024

There's a distinct difference between the control sequences issued by Windows ssh.exe (OpenSSH_for_Windows_9.5p1, LibreSSL 3.8.2) vs. the RHEL 9 ssh (OpenSSH_8.7p1, OpenSSL 3.0.7 1 Nov 2022) when establishing a session to a Linux host.

Windows ssh issues the following for the Home/End keys:

^[OH - Home
^[OF - End

Linux ssh issues these:

^[[1~ - Home
^[[4~ - End

iris session does the "right thing" when the initial ssh client is Linux (i.e.

0
0 166
Discussion Jeffrey Drumm 路 Jun 13, 2024

I'm scraping my way through some code that's been around for a while, and came across the use of $ZTRAP and (dear GOD) GOTO for trapping and handling errors.

In an effort to "modernize" it and make it, I don't know, less M-ish (sorry old-timers!), I'm replacing it with Try/Catch blocks.

Some questions:

  1. Is this a dumb idea?
  2. Anything I should look out for?
  3. Did I hurt anyone's feelings?

And if the answer to number 3 is Yes, my deepest apologies ... I love you guys! 馃ぉ

5
0 436
Article Jeffrey Drumm 路 Jul 24, 2023 2m read

When creating custom Business Hosts, it's often necessary to add properties to the class for additional settings that will be used in the initialization or operation of the host. The property name itself isn't always very descriptive, so it's an advantage to have a custom caption display with the field.

In Cach茅, it was fairly straightforward:

TEST> Set ^CacheMsg("EnsColumns","en-us","<property name>") = "<caption>"

But It involves a bit more effort in IRIS ...

In IRIS, the caption names of business host and production properties are stored in

4
3 471
Question Jeffrey Drumm 路 May 5, 2023

I'm using the EnumerateJobStatus query of class Ens.Util.Statistics to obtain the LastActivity value of a Business Host.

I would expect that this would return the timestamp of the last message received by the BH, understanding that any connect/disconnect activity would reset that timer. However, the time returned appears to actually be the time at which Ens.MonitorService generated the alert and is not directly related to anything that happened in the BH itself.

1
0 246
Question Jeffrey Drumm 路 Apr 16, 2023

When an object is created in memory, the object reference (OREF) is represented as a string value when displayed with the Write command:

HICG>Set pat=##class(JD.Sample.patient).%OpenId(70)
HICG>Write pat
1@JD.Sample.patient ; "stringified" OREF
HICG>Zwrite pat
pat=1@JD.Sample.patient  ; <OREF>
+----------------- general information ---------------
|      oref value: 1
|      class name: JD.Sample.patient
|           %%OID: $lb("70","JD.Sample.
14
1 706
Question Jeffrey Drumm 路 Feb 10, 2023

I've been trying for a while now to get OS authentication working on IRIS running on Ubuntu 20.04 and subsequently 22.04. I have the following authentication methods enabled for %Service_Terminal:

  • Operating System
  • Password
  • Operating System Delegated Authorization

And i have these options selected in Authentication/Web Session Options:

But when logging in via iris session <instancename> I am always prompted for a username and password. I am logged into the operating system with a username that matches my IRIS username, and the same configuration and login method works fine on Red Hat 8.5.

2
0 327
Question Jeffrey Drumm 路 Jun 7, 2022

I'm attempting to configure VS Code's InterSystems Server Manager to establish a connection to an IRIS for Health server. It has a standalone CSP gateway running on an Apache server with TLS enabled. The port for all IRIS api and browser traffic is 443.

I've configured the webServer section's host, port, and variations on pathPrefix (including no pathPrefix entry), and have the correct user ID set. The password is stored in the server keychain.

The connection simply fails with "Server could not be reached." Nothing in the Output or Problems tabs.

5
1 2159
Question Jeffrey Drumm 路 Feb 8, 2022

Is there a straightforward workflow in VS Code for moving a class from one namespace to another on the same server? With Cach茅/IRIS Studio, it was a (sort of) simple export/change namespace in file menu/import operation. But in VS Code it's not obvious (to me, at least). 

I can add multiple namespaces to a workspace, but when using isfs:// paths I see only a "Download" option and no "Upload" or "Import/Compile." When I'm navigating the local file tree, I see Import options, but no way to select the namespace into which I want to import.

8
0 1998
Question Jeffrey Drumm 路 Nov 21, 2021

Running HealthConnect 2021.1 on RedHat Linux 8.4.

I've configured IRIS/HealthConnect with an external web server to support TLS encryption. It's installed on the same server as IRIS, but is a different instance and version of Apache httpd. That all works as expected.

I would also like to keep the "private" web server available, but I'm having an issue with using the fully-qualified domain name in the URL vs. just the hostname itself.

If I use http://servername:52773/csp/sys/UtilHome.csp to log on, all is well.

If I use http://servername.domain.name.tld:52773/csp/sys/UtilHome.

7
1 545
Question Jeffrey Drumm 路 Nov 5, 2021

EnsLib.HL7.Adapter.TCPInboundAdapter has a Connected property that I assume is set to the state of the connection session with the remote host; i.e. 1 when Connected, 0 when not. I'm assuming this is the property the Production Configuration web page uses to display the state of the service (green for Connected, red for not Connected, etc.).

How can I interrogate the value of that property of an active service, via a method running in separate process?

(It really seems like I should know this, but I'm just not finding the right magical incantation)

3
0 243
Question Jeffrey Drumm 路 Jun 2, 2021

I've poked through the class documentation and globals and I can't seem to find what I'm looking for, namely a mechanism that will give me the PropName key and value for each of the Items in an EnsLib.HL7.SearchTable definition. Is there some sort of query that will turn the list of Items in the XData SearchSpec section into a key/value pair of some sort?

For example:

<Items>
<Item DocType=""  PropName="MSHTypeName" Unselective="true">{1:9.1}_"_"_{1:9.
1
0 325
Question Jeffrey Drumm 路 Jun 1, 2021

I've been tasked with an interface that needs to supply some additional metadata for the indexing of HL7v2 messages. After toying with a couple of ideas, I thought that it would be useful to subclass EnsLib.HL7.Message, add a %DynamicObject property, and store the metadata in it (it ends up getting sent to the target in JSON form anyway).

And, well, it seems to work just fine ... so far.

I seem to remember that %DynamicObjects are not persistent, and for that reason not something you would normally stuff into a database.

4
0 1168
Question Jeffrey Drumm 路 Oct 23, 2020

I'm attempting to extract some very large messages from Interoperability/Ensemble, and I'm just not getting something right ...

The closest I've come to getting something useful is this:

ClassMethod GetHL7Msg(pId As %String) As %Stream.TmpCharacter [ SqlName = GetMsg, SqlProc ]
{
    Set tHl7 = ##class(EnsLib.HL7.Message).%OpenId(pId,,.tSC)
    Throw:$$$ISERR(tSC) .GetErr(-400, "HL7 Message with ID "_pId_" Not Found.")
    Set tMsg = ##class(%Stream.TmpCharacter).%New()
    Set tSC = tHl7.OutputToLibraryStream(.
15
0 1051
Discussion Jeffrey Drumm 路 Feb 7, 2020

I'm not sure what the purpose of this is, but the Management Console causes the browser to refresh periodically. If you're in a form or an editor such as the DTL or Routing Rule editors, you may lose work unless you save frequently. This did not occur in Cach茅 2018 and earlier releases.

I've had a couple of incidents where I've created a number of rules in the DTL editor, answered the phone or stepped away for a few minutes, then come back to find any work since the last save erased.

I've noticed this in both 2019 and 2020 releases of IRIS.

Heads up!

4
1 604
Article Jeffrey Drumm 路 Jan 7, 2020 3m read

I'm always on the lookout for tools that make the development and testing of my interfaces more efficient. A couple of years ago I came across HL7 Spy, from Inner Harbour Software. It quickly became my go-to tool for running message comparison reports for interface engine migrations, message statistics gathering, and troubleshooting message receipt and delivery. It also offered enhanced functionality for things like fetching messages via sftp that other tools don't provide.

I've recently been working with HL7 Spy's author, Jon Reis, to enable support for fetching messages directly from the Ensemble message store. Its SQL Loader feature now has native Cach茅/IRIS support, and I've contributed a small server-side class to support the extraction of messages using it.

5
1 1412
Question Jeffrey Drumm 路 Jan 7, 2020

I'm currently working with a developer to add IRIS/Cach茅 functionality to his HL7 analysis tool that would allow its users to extract messages directly from the Ensemble message store. IRIS for Health Community Edition has been a great aid in debugging this, but I keep banging into the 5 connection license limit with Studio, the Management Portal, an IRIS terminal session and a client database connection using either ODBC or ADO.NET.

1
1 728
Question Jeffrey Drumm 路 Jan 6, 2020

While I can query the HL7 message class EnsLib.HL7.Message (EnsLib_HL7.Message for SQL) to my heart's content in the SQL Shell or the Management Portal's SQL page, I can't seem to SELECT anything other than ID/%Id from an ADO/ODBC client. Properties such as TimeCreated, Name, MessageTypeCategory, etc. all seem to prevent the query from ever completing EXCEPT when I provide the ID as part of the WHERE criteria.

This works fine in the Management Portal and Shell:

SELECT head.ID As HeadId, body.ID As BodyId, body.Name as BodyName
FROM Ens.MessageHeader head
INNER JOIN EnsLib_HL7.
7
0 543
Question Jeffrey Drumm 路 Jan 4, 2020

I've writing a short classmethod that extracts an HL7 message from EnsLib.HL7.Message by ID and returns it as a stream. It's to be called as a stored procedure via ODBC (or ADO.NET) to fetch messages into an application.

I'm not using an SQL query in the classmethod itself, but it will be called as part of an SQL query via ODBC, but I can't figure out how to set a custom SQLCODE and error text from within the classmethod that propagates back to the external application. I thought %sqlcontext would be useful for this, but it doesn't appear to do anything. Here's the class:

Class User.HL7.
13
1 645
Question Jeffrey Drumm 路 Sep 17, 2019

I've created a scheduled task that dumps HL7 messages to flat files. It uses the OutputToLibraryStream() method of EnsLib.HL7.Message. I'd like to be able to run it on a mirror member host whether it's primary or backup.

When run against a database that's mounted read-only, it works fine. However, when I attempt to run it against a mirror backup database, I get the following error:

#5002: Cache error: <PROTECT>%LoadData+7^EnsLib.HL7.Message.1

Tracing that back to the source, I find:

Lock +(^EnsLib.H.

9
0 592
Article Jeffrey Drumm 路 Jul 25, 2019 1m read

I'm not saying that this is in anyway "best practices," but I'm in a peculiar situation where I need to restrict users from starting a "retired" Ensemble Production in a namespace that's been renamed. It's still an "Ensemble-activated" namespace; we need to keep it available for Ensemble Message Viewer access ... fortunately, only for a little while.

It's a bit of a hack ...

Open the Production class in Studio and add the following classmethod:

ClassMethod OnStart() As %Status
{
    Return $system.Status.
6
1 545
Question Jeffrey Drumm 路 Jul 18, 2019

I need to copy a bunch of globals from some crufty old databases to spanking clean brand new ones. GBLOCKCOPY has this cool feature that lets you create a batch of global names to copy and save the list in a batch. You can then execute the batch and go take a nap.

I like naps.

I need to do this for a number of old-new database pairs, but it's the same global names every time. Is there a way to export the batch configuration created the first time and import it to another environment/namespace? These databases will be spread across multiple hosts.

Thanks!

2
0 417