The lookup read code seems ok. the error suggests that the table Ens.Util.LookupTable doesn't exist in SQL DB.
Are you sure that table you can successfully call from the portal is not local in IRIS?
- Log in to post comments
The lookup read code seems ok. the error suggests that the table Ens.Util.LookupTable doesn't exist in SQL DB.
Are you sure that table you can successfully call from the portal is not local in IRIS?
Very good article @Dmitry Maslennikov
The $LIST framework was created alongside classes in Caché as a replacement for the older $PIECE function. With $PIECE, you must predefine a delimiter that cannot occur in the data, while $LIST avoids this constraint entirely.
AI bot answer is not relevant to the question.
You say that code/data is in the same DB that is mirrored. 2025 and 2022 are using different version of journaling, but 2025 is capable of de-journaling journals from previous version (but not the vice versa).
1. When you upgraded the failover to 2025 (the one which is the new primary) did you had any issues with journal files? (might be that some files were dropped in the upgrade and not processed).
2. is that "missing rule" mapped to another DB that is not in mirror?
The Quit command is quitting the if statement therefore no value is allowed.
Clean code is not to have multiple places that quit with value, in long code it is difficult to track. Therefore a nice structure could be:
Ser result=1
If [condition] { ... set result=0 }
else { ... set result=1 }
Quit result
WIJ (write image journal) is used for data before it is saved to the database. This is used to keep the data consistency (block level in database) and avoid database degradation. If IRIS (or the OS) crash, WIJ will have "dirty blocks" (not written to databases) that will be weritten during the next IRIS startup.
Journal files (or mirror journal, in case you have mirroring) are used after data saved to the database. This will help for transactions rollback and also to ensure a good restore point up to the "current time" along with the latest backup restore.
The sequence is:
1. Read a block was changed from the database
2. Write the modified block to WIJ
3. Write the modified block to the database
4. Write the global SETS and KILLS (and also transaction start/stop) to the journal file
any folder(s) that have IRIS/Cache databases and other components (WIJ, journals) should be excluded from any antivirus/defender. See: Configuring Third-Party Software to Work in Conjunction with InterSystems Products | System Administration Guide | InterSystems IRIS Data Platform 2025.3
I would also exclude those from any indexing services, which will leave a good bandwidth & throughput to IRIS/Cache itself.
Depending on your server (on-prem or cloud) and the disks that you use, it might help to segregate IRIS/Cache databases and other components (WIJ, journals) across different disks.
Thank you so much for your recognition (!)
to feed any monitoring system best is to use: /api/monitor/metrics
if you enable interoperability monitoring, you should have: "iris_interop_hosts" which will have "status" (ok, Inactive etc.) per any host in any production.
you may also look into the property "Enabled" in class: Ens_Config.Item
if this is not enough, and you need your own code, than do a "user defined metric" than can be added to the /api/monitor/metrics results
when you have 2 applications, with the same namespace, and difference path you need to set "Package Name" to some (different) values for both applications. When "Package Name" is not set, the default prefix is "csp"
As InterSystems Technology is not an open source, it is not fair, in my opinion to compare the community open-source library of tools and examples to others (e.g. Linux, Apache etc.) since its not possible to use them without a valid license of a product (IRIS, Cache). As such its InterSystems motivation and also a rational should be to support this library, similar to their (massive) support for the community.
Norman,
If terminal is ok for you, but studio isn't, maybe you should try the VSCODE Lite terminal.
I'm using: IRIS for Windows (x86-64) 2024.1.4 (Build 516_1U) Sat May 31 2025 13:15:40 EDT
I get the same in Terminal (Telnet) and also in VS-Code Lite terminal:
MSCEME>write $ascii("♥")
9829
HTTP 401 means "Unauthorized" check that the web application /terminal has the correct credentials and correct authentication methods (password, LDAP etc.)
(the /terminalsocket should be always unauthenticated, its the default)
to help you resolve this, you may use auditing, to see if there is a "login failure" when you try to access.
I would day that the bot answer is not relevant to what you asked.
there is no directive to do looping in macro definitions, however, you could look at a directive called #execute where you should be able to execute any valid COS code, but there are some limitations:
#execute | ObjectScript Reference | InterSystems IRIS Data Platform 2025.2
for sure direct global access, especially looping on indexes is faster than SQL. It seems that the index global you used: ^PatientD("Date",FromDate)) should be: ^PatientI("Date",FromDate))
Using queue manager (for each "FromDate") will do this in parallel which will speed things much more!
The is a core process called GARCOL which is used to handle large global kills.
Securing Caché, Ensemble, And Operating System Resources | Caché & Ensemble 2018.1.0-2018.1.3
I would consider, replacing the lock + and lock - with setting/killing a (temporary) global, which can be mapped to IRISTEMP for better performance, and avoid journaling. It might be easy to implement such in parallel to the current lock mechanism (add those while keep the old in place) then migrate the management page in the application to loop on this global instead of the entries in lock table. The new approach can also have the timestamp for the lock and then have a function that will auto-retain locks (kill) based on a time interval.
aha I got it. then look at class: EnsPortal.SVG.ProductionConfigurationLegend
look at Ens_Config.Item there is a property called "Enabled"
See those articles:
Accessing the IRIS Terminal: A Comprehensive Guide for Visual Studio Code
How to run ObjectScript commands in the VS Code integrated terminal |
and documentation:
Run and Debug Your ObjectScript Code | Use Visual Studio Code as a Development Environment for InterSystems Applications | InterSystems Components and Tools
try to change:
<Route Url="/{id:[0-9]+}" Method="GET" Call="NewsGetItem"/>
try to open developer tools (shift-ctrl-P) then search for "developer tools" - check in console if there are any errors
on any class that extends Ens.Request or Ens.Response you may use:
Parameter COMPRESS = 2;
Property JSON As %Stream.GblChrCompress;
On large messages (or in a system with billions of messages per day) the save on storge is huge!
- Visual trace working fine
- You may search within the compressed property (but it will take time)
- Property is visible in SQL queries against Ens.MessageHeader / Ens.MessageBody
- The "out of the box" purge working fine
instead of having each property stored with its name as a subscript, (e.g. ^Student(1,"Name") = "Alice" / ^Student(1,"Age") = 29 etc.)
its much better to use the same format the class compiler is storing data on the D global:
^Student(1)=$LB("Alice",29 ... )
when having globals with millions (or billions) of records it will have a huge impact on performance and storage footprint.
in retrieval code use: Set {*} = ...
There are 2 options:
1. access the raw code for classes is stored in ^oddDEF global. all class methods are store in this format: ^oddDEF(className,"m",methodName,11)=sequence
where the sequence is 1,2,3...
If you are going to manually manipulate this don't forget to compile: do $system.OBJ.Compile("className","ckr")
2. using SQL:
SELECT ID,Name,SequenceNumber FROM %Dictionary.MethodDefinition where parent='className' order by SequenceNumber
I'm not sure if you need to compile after an UPDATE to this table (but its easy test).
1. Usually this indicates that the IRIS is sending an incomplete certificate chain
2. The fact that you can access IRIS SMP has nothing to do with the outgoing HTTPS request, which I assume you do with %Net.HttpRequest and using the SSL property that match the SSL config
3. I recommend accessing the https://myserver.com/api/gap/... from a browser and to check the certificate chain. Usually you will see 3 certificates (root CA, intermediate authority, the certificate itself) - you should put all those certificates (one after the other) in the PEM file that is configured in the SSL config in IRIS. Depending on the CA (which might be public, or company self-generated) you need to ask your sys admin
Hello Malcolm,
You should consider using a VIP (Virtual IP) to let users connect to the current primary regardless of a mirror switch.
Usually, the arbiter machine, does not require IRIS to be installed, only the ISCAgent service, but if you have IRIS there with a license server than you lose the HA for licensing (in case arbiter machine is down).
Very good article Ashok!
If someone is going to calculate age in a production system, one should divide by 365.25 (to take into consideration leap years)
As Alexey said, the issue could be with code, not ECP (as usually ECP is backward compatible)
Make sure that code on app. servers in not mapped (no routine, package mapping) to a remote DB (on database server) - all code should be local to app. server
If your 3 app. servers are identical (for HA, LB reasons) then if you can disable access to 1 app. server and still working with other 2 - it will give you an option to to the app. servers one by one without downtime.
Another issue to concern is cached queries - on such upgrades its good to have all cached queries "un-freeze" to make sure all are compiled.
You can call directly to: Do BACK^%ETN it will save the $ZE + the stack. (LOG is also calling this one)