#Caché

30 Followers · 4.6K Posts

  

InterSystems Caché is a multi-model DBMS and application server. See more details here.

Documentation.

Question Carl Deitrich · Feb 17

We are attempting to "Repoint" old class data to new class data to save disk space and data redundancy across multiple tables. This works to a point.  In essence the two classes are sharing the same data / Index / stream globals.  But if an ID in the Old_Class is opened, a property is modified, and saved the property that is in the New_Class (but not in the Old_Class) is NULLed / blanked.

Simplified explanation of data and what’s occurring.

10
0 91
Question Jainam Shah · Feb 7

Hello Team,

I am trying to duplicate the production flow in the Ensemble 2018 but after doing all the steps (like copying same class file, adapter file, process class file) as production, still the flow is not working. The error is that it is not reaching the operation (which is supposed to store the data), it gets stuck in the processes. Additionally, I am also trying to add a logic where in OUL message if the value of code 20061 > 30mg, it should automatically send another order back to service (OML).

2
0 59
Question Hour Abdellatif · Jan 26

Hello everyone,

My team lead mentioned that users can sometimes create globals directly without associating them with tables or classes. In this case, these globals would not be accessible via SQL.

Is this correct? Can a global exist independently in this way, and if so, is there a specific approach to access or manage them without SQL?

9
0 155
Question Jainam Shah · Jan 25

I've modified the class file, but messages still arrive as a single line (e.g., "H|.../rQ|.../rL") instead of separate lines in the ASTM service. The <ENQ>..<EOT> header looks correct, logs show no errors, and the service receives messages fine. Is there an Ensemble 2018.1 engine setting (like line terminator handling or TCP framing) to fix the line splitting? ​

4
0 108
Question Hour Abdellatif · Jan 27

Hello Community,

I am facing a JDBC connection issue after migrating from Caché 2016 to Caché 2018.1. When I attempt to connect using the following connection settings:

CACHE_DATASOURCE_URL=jdbc:Cache://localhost:1972/TEST

CACHE_DB_USERNAME=test

CACHE_DB_PASSWORD=test
 

I consistently receive the following error:

[Cache JDBC] Communication link failure: Access Denied

This configuration worked perfectly with Caché 2016. I have verified the following:

  1. The namespace (TEST) exists and is correctly specified in the connection URL.
  2. The credentials (username: test, password: test) are correct.
7
1 123
Question Fernando Zañartu · Mar 3, 2021

Where can I download the Cache ODBC drivers?

Where can I download the Cache ODBC drivers for Windows?

I need to connect to a cache database by odbc but the FPTs that I have found do not work, 
could you tell me where to download the ODBC drivers

16
0 11001
Job Tricia Scanlon · Jan 19

We are hiring!  100% Remote W2 Contract | 3-6+ Months (numerous extensions likely)

Two Roles:
🔹InterSystems Engineer
🔹Epic Bridges Certified/InterSystems Engineer

Having solid experience with the below: 

  • Interface Development: Building and configuring message routes, business processes, and transformations using components like IRIS, Ensemble, or HealthShare.
  • Interoperability Standards: Implementing and supporting workflows for healthcare standards including HL7 (v2/v3), FHIR, etc.
0
0 116
Question Victor Paredes · Jan 7

Hello,

We are accessing an InterSystems Cacha database from Microsoft SQL Server using a linked server over ODBC (ODBC35). Queries are executed using OPENQUERY.

On the SQL Server side, there is a linked server property called Query Timeout. By default it is set to 0 (no timeout). We are considering setting it to 15 seconds and would like to understand how Cache behaves in this scenario.

6
0 131
Question Ruslan K · Dec 4, 2025

Hello. Here is   XData ReportDefinition

/// XML that defines the contents of this report.
XData ReportDefinition [ XMLNamespace = "http://www.intersystems.com/zen/report/definition]
{
<report xmlns="http://www.intersystems.com/zen/report/definitionname='bills' runonce="true">
<attribute name='runTime' expression='$ZDT($H,3)/>
    <attribute name='runBy' expression='..GetUserName()/>
    <attribute name='author' expression='..ReportAuthor'/>
<group name='bills' OnCreateResultSet="CreateRS">
<parameter name="MonthDt" expression="..Month"/>
<parameter name="Company" expression

1
0 76
Question Ruslan K · Jan 8

Hello
How to hide a table completely in pdf generation when a row is empty?
A table has style with borders
<table  group="services" removeEmpty="1" style="border:1px solid black;">
     <item field="TotalSum" suppressEmpty="1" />

     <item field="TotalAvSum" suppressEmpty="1" />
 </table>
With 
removeEmpty="1" and  suppressEmpty="1"  all data are hidden when a row is empty but top and bottom borders are remain on the page.
How to hide also table's top and bottom borders when a data row is empty?

3
0 90
Article Thibault Odor · Dec 29, 2025 3m read

You probably know this situation:
Some time ago, you found a very special $ZU function for a very specific type of problem. Some kind of mystical formula. It became popular and was used by many developers throughout your code and across all your installations.

Several versions and updates later, you are informed by ISC that your mystical $ZU is deprecated and no longer supported. You are advised to replace it with a new $something().

So, how do you find and document the usage of this mysterious code?
It might be located in classes, in MAC, INT, or INC code.

2
0 137
Article Tani Frankel · Dec 24, 2025 2m read

You send an HTTP request and get back an HTTP error but with an HTML error page which you didn't expect... what's happening?... 🤔

Specifically for example, perhaps you tried to READ a FHIR Resource (e.g. /Patient/123) and you get back a 404 error page, even though with other Patient IDs, you get back the Resource payload, so "the page" definitely does exist... why should you be getting a 404 error page? 🙄

0
0 139
Article Vachan C Rannore · Oct 21, 2025 3m read

Hello!!!

Data migration often sounds like a simple "move data from A to B task" until you actually do it. In reality, it is a complex process that blends planning, validation, testing, and technical precision.

Over several projects where I handled data migration into a HIS which runs on IRIS (TrakCare), I realized that success comes from a mix of discipline and automation.

Here are a few points which I want to highlight.

1. Start with a Defined Data Format.

Before you even open your first file, make sure everyone, especially data providers, clearly understands the exact data format you expect. Defining templates early avoids unnecessary bank-and-forth and rework later. 

While Excel or CSV formats are common, I personally feel using a tab-delimited text file (.txt) for data upload is best. It's lightweight, consistent, and avoids issues with commas inside text fields. 

PatID   DOB Gender  AdmDate
10001   2000-01-02  M   2025-10-01
10002   1998-01-05  F   2025-10-05
10005   1980-08-23  M   2025-10-15

Make sure that the date formats given in the file is correct and constant throughout the file because all these files are usually converted from an Excel file and an Basic excel user might make mistakes while giving you the date formats wrong. Wrong date formats can irritate you while converting into horolog.

12
2 249
Article Karthickraja S · Dec 18, 2025 2m read

The Power of Indexing in Database Tables

When working with databases, most developers understand the concept of an index and why it's used: to speed up data retrieval. But the real impact of indexing often becomes clear only when you compare scenarios with and without it.

Do you Know what Happens Without an Index?
Imagine a table with three columns: Name, Age, and MobileNumber.


Now, consider this query:

If the Age column does not have an index, the database engine will:

  • Check if the WHERE condition field has an index.
  • If not, it will scan the entire table (a full table scan).
3
2 135
Question Alan Nguyen · Dec 10, 2025

Hi,

I have Cache 2024.1.  I attached the process ID from my terminal to the Cache Studio for Debugger.  When I click on  "Call Stack" tab I only see first 500 shown.  Anyone know how to extend so I can see the rest of the information when i click on "Call Stack" tab?  Thank you very much.

Second question:  Using Cache Studio Debugger, anyone know how to expand the value of this variable when it display F,...

3
0 98
Article Megumi Kakechi · Dec 18, 2025 1m read

InterSystems FAQ rubric

If you try to kill a global that is mapped at the subscript level from the top node, you will get a <SLMSPAN> error and it will not be deleted. This is because the kill command for subscript-level mapped globals cannot be used across mappings.

// Suppose subscript-mapped globals exist in different databases, as shown below:
^TEST(A*~K*) -> database A
^TEST(L*~Z*) -> database B

// Trying to kill from the top level will result in a <SLMSPAN> error.
NAMESPACE>Kill ^TEST
<SLMSPAN> <- This error is output.
0
0 87
Question Matthew Cummings · Oct 14, 2021

Hello all,

First time post and newer to Cache/ObjectScript in general, please keep it in mind! 

Some background: I need to build part of a production whose goal is to send patients emails based on appointment status as a daemon-based approach. I have to use Microsoft Graph to accomplish this, which you need an access token to use. To get the access token, I have to go through the OAuth2.0 client credentials grant flow, which involves the creation of a signed JWT assertion using the RS256 algorithm.  
I was looking at the %OAuth2.JWT class to accomplish this, via its ObjectToJWT() method.

10
1 1570
Article Hiroshi Sato · May 16, 2024 1m read

InterSystems FAQ rubric

Too run SQL in Terminal use $system.SQL.Shell().

Please refer to the sample below.

SAMPLES>do $System.SQL.Shell()
SQL Command Line Shell
---------------------------------------------------- The command prefix is currently set to: <>.
Enter q to quit, ? for help.
SAMPLES>>select * from Sample.Vendor
1. select * from Sample.
6
0 625
Question Matheus Augusto · Nov 25, 2025

In some cases, it's necessary to manipulate data from one namespace to another. For example, a routine in the "N1" namespace needs data from the "N2" namespace. In legacy systems (using only globals), it's common to make the global universal, but what about persistent classes? Is this type of globalization also possible?

In the same context, how could I make a persistent class global for all namespaces? The only way I know is by putting it in %SYS.

7
0 140
Question Matheus Augusto · Dec 4, 2025

Recently, we implemented some Java-based services using JDBC. And some time ago, I refactored some legacy PHP programs that used "csession" for communication between systems to use PDO with ODBC.

This raised a question for me about how license management is done in this scenario.
Is a license used per pool? Or per connection? How is this management done?

0
0 85
Article Timothy Leavitt · Jan 15, 2020 9m read

Introduction and Motivation

A unit of ObjectScript code (a ClassMethod, say) may produce a variety of unexpected side effects by interacting with parts of the system outside of its own scope and not properly cleaning up. As a non-exhaustive list, these include:

  • Transactions
  • Locks
  • I/O devices
  • SQL cursors
  • System flags and settings
  • $Namespace
  • Temporary files

Use of these important language features without proper cleanup and defensive coding can lead to an application that normally works correctly, but that may fail in unexpected and difficult-to-debug ways.

8
7 1720
Article Andreas Schneider · Apr 22, 2025 4m read

When using standard SQL or the object layer in InterSystems IRIS, metadata consistency is usually maintained through built-in validation and type enforcement. However, legacy systems that bypass these layers—directly accessing globals—can introduce subtle and serious inconsistencies.

Understanding how drivers behave in these edge cases is crucial for diagnosing legacy data issues and ensuring application reliability.
The DATATYPE_SAMPLE database is designed to help analyze error scenarios where column values do not conform to the data types or constraints defined in the metadata.

3
0 259
Article Thomas Carroll · Nov 12, 2016 4m read

Embedded SQL is a tool that allows us to execute SQL statements in Caché Object Script. For example, to select the name of a person with a particular SSN from the Sample.Person class we can do the following:

&SQL(
SELECT Name into :tName
From Sample.Person
Where SSN = :tSSN
)

The colon syntax is used to identify local variables, in this case tName and tSSN. Here, tSSN will be defined prior to execution and  tName  will be set during execution of the statement. &SQL indicates to our compiler that this is SQL syntax.

4
0 2111
Article John Murray · Oct 6, 2025 1m read

gj :: configExplorer is a new VS Code extension integrating with Server Manager and leveraging Structurizr to produce configuration diagrams of your servers.

Here's a short introductory video.

By using the InterSystems IRIS Native API for Node.js it avoids the need for any support code to be installed on the servers. This technology choice also qualifies it for entry into the current Developer Community contest.

The initial release focuses on two aspects of server configuration:

  • Namespaces and databases
  • ECP connectivity

Suggestions for what to add next are welcome, as is general feedback.

7
0 222
Article Robert Cemper · Nov 16, 2025 2m read

In my previous article, I structured network communications
in these 3 possible layers, and covered the last

  • Client <---> Transport
  • Server <---> Transport
  • Client <---> Server

In fact, you have the most control over the last one.
The IRIS side as a server is yours and under your full control. 
Up to now, the Transport layer was assumed to be as passive as a bare wire.

This assumption should be verified. I once met a Windows environment with
a quite surprising setup where a Firewall-like filter was isolating internal
processes and causing a lot of trouble.

0
2 106
Article Robert Cemper · Nov 16, 2025 3m read

Chasing errors or misbehavior in the network can be quite a challenge.
Differently to  a local application on the DB server, you always have at least 3 players:

  • A client  to place a request 
  • some kind of transport layer
  • and a server to provide a reply.

This results in a minimum of 3 possible communication layers

  • Client <---> Transport
  • Server <---> Transport
  • Client <---> Server

The last one is probably the easiest  to check, while the other 
two deal with the same counterpart just from opposite sides.

0
3 144