Search

Clear filter
Announcement
Kristina Lauer · Aug 25, 2022

Dive into InterSystems technologies

In the August Learning Services newsletter, see how you can get hands-on with healthcare analytics tools, Embedded Python, and InterSystems Package Manager. If you're new to InterSystems ObjectScript, try out a learning path to get started!
Article
Aasir Waseer · Jul 28, 2022

Approach to InterSystems IRIS

Hi Folks, Before I begin my writing journey here I wish to introduce myself briefly, so that everyone who reads and follows me will get a clear picture. To start with I did my Bachelors in Physical Sciences, Mathematics and Computer Science were my core subjects. I have 4+ years of experience in HealthCare Revenue Cycle operations including Medical Coding, Billing, AR Collections, Denial Management and Fincial Reconciliation. Also, 2+ years of experience in Data Operations and Analytics, specifically in Python, PowerBI, SQL and MsExcel. i'm a beginner here. I love reading, exploring and I'm a continous learner. I'm pursuing towards DataScince and AI. I will continue to write blog related to my path. Let's support each other and grow together. Please don't hesitate to share your inputs and thoughts. Thank you for your time Aasir Waseer Welcome Aasir! Aasir! Welcome to the InterSystems Community!
Announcement
Preston Brown · Sep 8, 2023

InterSystems Application Developer

SCOPE OF SERVICES:The Database Developer’s responsibilities will include, but are not limited to:• Understand existing application using InterSystems Technology such as Cache Object Code, Ensemble, Older Style Tag and Routine.• To perform support and maintenance of existing Cache code• Analysis and migration of existing Cache code to Microsoft SQL; and Web Services (SOA) REQUIRED SKILLS/EXPERIENCE: A minimum of 5 proven years of experience in computer applications development planning, design, troubleshooting, integration, maintenance, and enhancement of Cache Database applications. In Queens NY Office 4 days a week. 1 Day RemoteMust be an US Citizen only. Position Requires this.This is a long term contract (1 - 4+ years).This is a 1099 Position only.Rate is $50-80/hour.Position will begin 1.5 - 2 months after succesfull interview. Serious inquires only. Interested parties email to pbrown@cybercodemasters.com #Job Opportunity
Article
Piyush Adhikari · Feb 24, 2023

InterSystems IRIS in Containers

InterSystems has also released IRIS as containerized deployments. This post is to demonstrate how InterSystems IRIS and applications those rely on IRIS a backend can be packaged into an image and be run in other machines in containers and how simple it is to do that. A container runs image/s which have all the necessary executables, binary code, libraries, and configuration files. And the images can be moved from one machine to another, and an images repository like Docker Hub can simplify that process. I have used an application from Open Exchange for this demo. Demo video: https://www.loom.com/share/93f9a760b5f54c0a8811b7a212387b9d The image for IRIS Data Platform Community Edition can be found at the InterSystems Container Registry: https://containers.intersystems.com/contents In order to use a containerized instance of IRIS in a host machine, it shall be pulled during runtime. For that, the Dockerfile needs to have following commands like shown below: Dockerfile: Dockerfile ARG IMAGE=intersystemsdc/iris-community:preview FROM $IMAGE RUN iris start IRIS \ && iris merge IRIS /tmp/merge.cpf \ && iris stop IRIS quietly These are the base commands that make a Dockerfile written to build an image which has instructions for containerized IRIS. The commands to also run installation of other dependencies required for the application that is running alongside the containerized instance of IRIS can be added. Given are the Docker commands that tag and push an image that carries IRIS instance into Docker Hub, and subsequently pull and run that image in another host machine. Commands docker build -t image_name filepath docker tag image_name dockerhub_username/repository_name:tag_name docker push dockerhub_username/repository_name:tag_name Commands docker pull dockerhub_username/repository_name:tag_name docker run --name test -p host_8080:52773 padhikar/irisincontainer:main Application used in demo: https://openexchange.intersystems.com/package/iris-geo-map Creating InterSystems IRIS images: https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=ADOCK#ADOCK_iris_creating Just for clarification, the lines starting with `ARG IMAGE = ` replace each other. Only the last one is actually used. I'm not sure why the others are left in there but I think its so users will know what worked before. So you can simplify the Dockerfile to: ARG IMAGE=intersystemsdc/iris-community:preview FROM $IMAGE RUN iris start IRIS \ && iris merge IRIS /tmp/merge.cpf \ && iris stop IRIS quietly Thank you Raj. I have updated it as you suggested.
Article
sween · May 21, 2024

InterSystems® IRIS Conky

Have written several worthless Conky's in my day, and this one is no exception, but it was fun. I cant imagine anybody is going to use this Conky, but here it is anyway. This is a mere implementation that scrapes the REST API for Metrics and uses the execi to display it on your desktop. conky.conf -- Conky, a system monitor https://github.com/brndnmtthws/conky -- InterSystems IRIS https://www.intersystems.com/products/intersystems-iris/ conky.config = { use_xft = true, xftalpha = 0.8, update_interval = .5, total_run_times = 0, own_window = true, own_window_transparent = true, own_window_argb_visual = true, own_window_type = 'normal', own_window_class = 'conky-semi', own_window_hints = 'undecorated,below,sticky,skip_taskbar,skip_pager', background = false, double_buffer = true, imlib_cache_size = 0, no_buffers = true, uppercase = false, cpu_avg_samples = 2, override_utf8_locale = true, -- placement alignment = 'top_right', gap_x = 25, gap_y = 50, -- default drawing draw_shades = true, draw_outline = false, draw_borders = false, draw_graph_borders = true, default_bar_width = 150, default_bar_height = 20, default_graph_width = 150, default_graph_height = 12, default_gauge_width = 20, default_gauge_height = 20, -- colors font = 'Liberation Mono:size=14', default_color = 'EEEEEE', color1 = 'AABBFF', color2 = 'FF993D', color3 = 'AAAAAA', color4 = '3ab4ad', -- layouting template0 = [[${font Liberation Sans:bold:size=11}${color2}\1 ${color3}${hr 2}${font}]], template1 = [[${color1}\1]], template2 = [[${goto 100}${color}]], template3 = [[${goto 180}${color}${alignr}]], }; conky.text = [[ ${image /etc/conky/isc.png -p 325,400 -s 100x250} ${color1}InterSystems IRIS Conky:$color ${scroll 16 $conky_version - $sysname $nodename $kernel $machine} ${color grey}Metrics Endpoint:$color ${scroll 32 http://iris.deezwatts.com:52773/api/monitor/metrics} ${color grey}license_days_remaining: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep license_days_remaining | cut -d " " -f 2 } $alignr ${color grey} system_alerts_new: $color2 ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep iris_system_alerts_new | cut -d " " -f 2 } ${color4}$hr ${color grey}$color CPU and Memory ${color grey}cpu_pct:$color $alignr ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep cpu_usage | cut -d " " -f 2 }% ${execibar 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep cpu_usage | cut -d " " -f 2 } ${color grey}page_space_percent_used:$color $alignr ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep page_space | cut -d " " -f 2 }% ${execibar 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep page_space | cut -d " " -f 2 } ${color grey}phys_mem_percent_used:$color $alignr ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep phys_mem | cut -d " " -f 2 }% ${execibar 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep phys_mem | cut -d " " -f 2 } ${color grey}phy_reads_per_sec: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep phys_reads | cut -d " " -f 2 } $alignr ${color grey} phy_writes_per_sec: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep phys_writes | cut -d " " -f 2 } ${color grey}cache_efficiency : $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep cache_efficiency | cut -d " " -f 2 } $alignr ${color grey} process_count: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep process_count | cut -d " " -f 2 } ${color4}$hr ${color grey}$color Database ${color grey}db_disk_percent_full :$color $alignr ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep disk_percent_full | grep USER | cut -d " " -f 2 }% ${execibar 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep disk_percent_full | grep USER | cut -d " " -f 2 } ${color grey}db_free_space : $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep db_free_space | grep USER | cut -d " " -f 2 } GB $alignr ${color grey} db_latency: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep db_latency | grep USER | cut -d " " -f 2 } ${color grey}wij_writes_per_second: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep wij_writes | cut -d " " -f 2 } $alignr ${color grey} trans_open_count: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep trans_open_count | cut -d " " -f 2 } ${color4}$hr ${color grey}$color Journaling ${color grey}jrn_free_space_primary: $alignr $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep iris_jrn_free_space | grep primary | cut -d " " -f 2 } GB ${color grey}jrn_free_space_secondary: $alignr $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep iris_jrn_free_space | grep secondary | cut -d " " -f 2 } GB ${color4}$hr ${color grey}$color Shared Memory Heap ${color grey}smh_percent_full_classes :$color $alignr ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep smh_percent_full | grep Classes | cut -d " " -f 2 }% ${execibar 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep smh_percent_full | grep Classes | cut -d " " -f 2 } ${color grey}smh_percent_full_globalmapping :$color $alignr ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep smh_percent_full | grep Global | cut -d " " -f 2 }% ${execibar 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep smh_percent_full | grep Global | cut -d " " -f 2 } ${color grey}smh_percent_full_locktable :$color $alignr ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep smh_percent_full | grep Lock | cut -d " " -f 2 }% ${execibar 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep smh_percent_full | grep Lock | cut -d " " -f 2 } ${color grey}smh_percent_full_routinebuffer :$color $alignr ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep smh_percent_full | grep Routine | cut -d " " -f 2 }% ${execibar 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep smh_percent_full | grep Routine | cut -d " " -f 2 } ${color4}$hr ${color grey}$color CSP ${color grey}csp_activity : $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep csp_activity | cut -d " " -f 2 } $alignr ${color grey} csp_actual_connections: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep csp_actual_connections | cut -d " " -f 2 } ${color grey}csp_gateway_latency : $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep csp_gateway_latency | cut -d " " -f 2 } $alignr ${color grey} csp_in_use_connections: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep csp_in_use_connections | cut -d " " -f 2 } ${color grey}csp_private_connections: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep csp_private_connections | cut -d " " -f 2 } $alignr ${color grey} csp_sessions: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep csp_sessions | cut -d " " -f 2 } ${color4}$hr ${color grey}$color SQL ${color grey}sql_commands_per_second: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep sql_commands_per_second | grep all | cut -d " " -f 2 | printf "%.2f" $(cat - | bc -l)} $alignr ${color grey} sql_queries_avg_runtime: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep sql_queries_avg_runtime | grep -v std | grep all | cut -d " " -f 2 | printf "%.5f" $(cat - |bc -l)} ${color grey}sql_queries_per_second : $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep sql_queries_per_second | grep all | cut -d " " -f 2 | printf "%.2f" $(cat - |bc -l) } $alignr ${color grey} sql_row_count_per_second: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep sql_row_count_per_second | grep all | cut -d " " -f 2 | printf "%.2f" $(cat - |bc -l)} ${color4}$hr ${color grey}$color Write Daemon ${color grey}wd_buffer_redirty: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep wd_buffer_redirty | cut -d " " -f 2 } $alignr ${color grey} wd_buffer_write: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep wd_buffer_write | cut -d " " -f 2 } ${color grey}wd_cycle_time : $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep wd_cycle_time | cut -d " " -f 2 } $alignr ${color grey} wd_proc_in_global: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep wd_proc_in_global | cut -d " " -f 2 } ${color grey}wd_wij_time : $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep wdwij_time | cut -d " " -f 2 } $alignr ${color grey} wd_write_time: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep wd_write_time | cut -d " " -f 2 } ${color4}$hr ${color grey}$color Routines ${color grey}rtn_call_local_per_sec: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep rtn_call_local_per_sec | cut -d " " -f 2 } $alignr ${color grey} rtn_call_miss_per_sec: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep rtn_call_miss_per_sec | cut -d " " -f 2 } ${color grey}rtn_seize_per_sec : $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep rtn_seize_per_sec | cut -d " " -f 2 } $alignr ${color grey} rtn_load_per_sec: $color ${execi 5 curl -s http://iris.deezwatts.com:52773/api/monitor/metrics | grep rtn_load_per_sec | cut -d " " -f 2 } ]]; Ran the below code below in the POD to drive up the resource consumption in the gif above as the example.CPU fulload() { dd if=/dev/zero of=/dev/null | dd if=/dev/zero of=/dev/null | dd if=/dev/zero of=/dev/null | dd if=/dev/zero of=/dev/null & }; fulload; read; killall dd Disk Space fallocate -l 1390143672 /data/IRIS/OUTPUT.dat Get your Conky and slap IRIS Monitoring on your X11 display today!
Question
lai pham · May 16, 2024

InterSystems Class Dictionary

Hi, I use the data functions but don't know what they all do. Is there a dictionary that explains what each function does? Thanks, Lai Pham Docs. Class reference. I noticed that some of the functions in your system are not IRIS built-in function but, evidently, are custom functions implemented in your system, as documented here. To search and find the class and code that implement this functions you may search classes that extends the Ens.Rule.FunctionSet class using the class reference in your system/server, not in the documentation website. You can find a short description about the function clicking on it:
Announcement
Vanshika Tiwari · Dec 18, 2024

IRIS InterSystems Engineer

Please note- the resource should have expertise working in CCDA/FHIR implementation along with IRIS development experience. IRIS for Health CCDA/FHIR IRIS developer Hard Core IRIS for Health Engineers who have experience working on IRIS for Health CCD/FHIR and conversion services using SDA and DTL model (at least one production implementation of Conversion services to FHIR) Have Good knowledge of GCP and GKE’s (IKO’s deployed on GKE environment or any K8 cluster) Fine tune and debug IRIS Productions, assist L2 ops team when required CICD/GIT knowledge
Article
Ashok Kumar T · Jul 18

InterSystems IRIS JSON

JSON JSON (JavaScript Object Notation) is a lightweight, text-based format designed for structured data interchange. It represents data objects consisting of key–value pairs and arrays, and it is entirely language-independent. JSON Datatypes JSON consists of six fundamental data types used to represent structured data: String It is a text enclosed in double quotes. For example, "name": "Alice". Number It is integers or floating-point numbers. They have no quotes, no leading zeros (e.g., 03562), and no special values like NaN or Infinity. For instance, "age": 30, "score": 95.5. Boolean It represents logical values: true or false (without quotes). For example, "isActive": true. Null It symbolizes a null or an empty value. For instance, "middleName": null. Array It is an ordered list of values (can be of any data type, including nested arrays/objects). For example, "colors": ["red", "green", "blue",{ "additional": "black" },"1Bx124s"]. Object It is a collection of key/value pairs (e.g., a dictionary or map). Keys must be strings, whereas values can be any JSON type. Example: How InterSystems IRIS Creates and Manipulates JSON InterSystems IRIS provides several simple and efficient methods for creating and interacting with standard JSON data structures: JSON literal constructors in ObjectScript syntax %DynamicObject and %DynamicArray class definitions with their APIs for serialization and deserialization JSON_OBJECT, JSON_ARRAYAGG and JSON_TABLE functions for SQL JSON Literal Constructors JSON literal constructors in ObjectScript syntax enable the creation and modification of JSON structures in a highly flexible and intuitive manner. This approach allows you to define dynamic entities by directly assigning a JSON string to a variable, simplifying JSON data handling. When JSON is created using literal constructors, InterSystems IRIS automatically instantiates the appropriate %DynamicObject and %DynamicArray object classes. It provides direct access to object model capabilities, allowing you to manipulate instance methods without explicit object creation. The literal constructor for an object ({}) corresponds to the %Library.DynamicObject class. The literal constructor for an array ([]) corresponds to the %Library.DynamicArray class. Dynamic Object Example Multiple Ways to Construct JSON in IRIS InterSystems IRIS offers flexibility in how you construct and assign JSON data. You can either use a single-line literal constructor or build the JSON object step-by-step utilizing dynamic object syntax. The resulting structure is always a fully-typed %DynamicObject that inherits all the behaviors and methods available to %DynamicObject. Method 1: Literal JSON Construction You can define the entire JSON structure in one line, including ObjectScript expressions that are evaluated at runtime:set json = Set json= { "name": "test,patient", "title": "Mr", "p_age": ($H - $ZDateH("12/01/1990") \ 365), “isActive”: true } In this example the values stand for the following: "p_age" is an expression evaluated at runtime, based on the difference between the current date ($Horolog) and a specific birth date. "isActive" directly declares a JSON Boolean true value. Method 2: Step-by-Step Dynamic Assignment Alternatively, you can build the JSON object by setting each key-value pair individually: Set json = {} Set json.name = "test,patient" Set json.title = "Mr" Set json."p_age" = ($Horolog - $ZDateH("12/01/1990") \ 365) This approach is helpful in the following cases: Values are derived conditionally. You want to build the object incrementally. Code clarity and maintainability are priorities. Method 3: Build a DynamicObject Using Methods You can build a %DynamicObject incrementally with the help of the %Set() method that lets you define the values below: The key (1st argument) The value (2nd argument) The data type (optional 3rd argument) To ensure the correct JSON data type is employed for the value, you can explicitly specify the type as the third parameter. Set json = {} Do json.%Set("name", "test,patient") Do json.%Set("title", "Mr ") Do json.%Set("p_age", ($Horolog - $ZDateH("12/01/1990") \ 365), "number") Do json.%Set(“IsActive”,1,”Boolean”) Dynamic Array Construction in IRIS Similar to dynamic objects, dynamic arrays in InterSystems IRIS can be constructed with either a single-line literal constructor or a step-by-step dynamic assignment approach.These arrays are instances of %DynamicArray and can hold mixed data types, including objects, numbers, strings, booleans, and runtime expressions. Method 1: Literal JSON Array Construction You can define a JSON array in a single line utilizing the array literal syntax. The resulting structure is a fully-typed %DynamicArray object that inherits all the behaviors and methods available to %DynamicArray. set array = [1, "test", 12.32565, 0.01548, {"name": "test"}, 1.00000, ($ZVersion), true] Note for this example: The array includes integers, strings, decimals, a nested object, a runtime-evaluated expression ($ZVersion), and a Boolean. Method 2: Step-by-Step Dynamic Assignment Method 2.1: Set Values in a Dynamic Array by Index A %DynamicArray in InterSystems IRIS is an ordered collection of values, where each element is accessed by its index, starting from 0. You can assign values directly to specific indices. If you skip any intermediate positions, those indices remain unassigned internally. However, for serialization purposes (e.g., when using ZWrite or %ToJSON()), IRIS automatically displays unassigned elements as null to maintain a valid JSON structure. This means there is a distinction between how the data is stored and how it is represented: unassigned elements are not truly null unless explicitly set, but they appear as null when the array is output or serialized. You can determine the type of a value using the %GetTypeOf() method. Example: USER>Set array = [] USER>Set array."1" = "test" ; assigned into index 1 USER>Set array."5" = "hello" ; assigned into index 5 USER>Write array.%ToJSON() array=[null,"test",null,null,null,"hello"] Although the output shows null at index 0, it is crucial to note that the value was never explicitly set. Therefore, calling array.%GetTypeOf(0) will return "unassigned", indicating that the index exists only for display purposes and has not been initialized with a value. Method 2.2: Build a DynamicArray Using Methods You can incrementally construct a %DynamicArray by using the built-in %Push() method. This approach appends values to the end of the array in the order they are added. set array = [] do array.%Push(1) do array.%Push("test") do array.%Push({"name": "test"}) do array.%Push($Piece($zversion, " ", 1, 5)) Do array.%ToJSON() #; Output [1,"test",{"name":"test"},"IRIS for Windows (x86-64) 2024.1.1"] This method is practical in the following cases: Array elements are determined dynamically. You are constructing the array conditionally or iteratively. You want more control over the data being inserted. Detailed Overview of JSON Key-Value Assignment Assigning Runtime Values in JSON (IRIS) InterSystems IRIS supports both static and dynamic value assignment within JSON structures. When working with the literal constructor syntax ({} or []), any extended expression enclosed in parentheses is evaluated at runtime. For example: USER>Set json = {"version":($ZVersion)} USER>ZWrite json ; print the entire JSON json={"version":"IRIS for Windows (x86-64) 2024.1.1 (Build 347U) Thu Jul 18 2024 17:40:10 EDT"} ; <DYNAMIC OBJECT> In this case, the value of the "version" key is dynamically evaluated using the $ZVersion system variable at runtime. it allows you to embed real-time system or application data directly into your JSON structures. Number Representation and Assignment in JSON An ObjectScript Decimal Floating-Point number and an IEEE Binary Floating-Point number do not track trailing zeros in decimal representation (e.g., 12.3, 12.30, and 12.3000). However, in JSON, numbers are represented as text in decimal or scientific notation (aka exponent form). While JSON syntax supports scientific notation (e.g., 1.23e4), it does not mandate any internal binary representation. It means that JSON numbers can preserve trailing zeros when created using literal constructors with square brackets [] or curly braces {}, as these constructors parse values utilizing JSON syntax that maintains formatting details. Chek out the example below: USER> Set json = {"decimal":1.00000} USER> ZWrite json {"decimal":1.00000} ; <DYNAMIC OBJECT> Here, the trailing zeros are preserved in the JSON object representation. Scientific Notation InterSystems IRIS preserves scientific notation and trailing zeros in JSON, allowing you to set and view values in exponent form. The number retains this format until it is explicitly written or serialized. However, note that numbers supported by JSON can exceed the capacity of the internal representations backed by ObjectScript. Rounding or overflow can occur when converting a JSON numeric value for use in an ObjectScript expression. For example: USER>SET z=[3E400] ; No error placing a large JSON number into a %DynamicArray USER>WRITE z.%Get(0) ; But converting the JSON number gets a <MAXNUMBER> signal Step-by-Step Way USER>Set json = {} USER>Set json."e_exponent"=1E5 USER>ZWrite json json={"e_exponent":100000} ; <DYNAMIC OBJECT> In this example, the following happens: The value 1E5 (scientific notation for 100,000) is treated as a numeric expression. IRIS evaluates the dynamic expression at runtime and stores the computed result (100000) as the actual value of the "e_exponent" key. Unicode Translation Unicode Handling in Literal Constructors – IRIS JSON In InterSystems IRIS, when working with the literal constructor syntax for dynamic arrays, each element is assessed at runtime. It means that you can mix standard JSON strings and ObjectScript expressions, including those involving Unicode characters, and IRIS will store the evaluated results. Example: Mixed Input, Same Result USER>Set array = ["\u00E9", "cach\u00E9", ("cach"_$CHAR(233))] USER>ZWrite array array=["é","caché","caché"] ; <DYNAMIC ARRAY> "\u00E9" is interpreted as the Unicode character é. "cach\u00E9" becomes caché when parsed. ("cach"_$CHAR(233)) is an ObjectScript expression that concatenates "cach" with the character é (Unicode 233). All three inputs result in identical strings: "é" and "caché". When Unicode Escapes Are Passed as Expressions If you wrap a Unicode escape string in parentheses (making it an expression), IRIS treats it as a plain string literal, not as a Unicode escape. USER>Set array = ["cach\u00E9", ("cach\u00E9")] USER>ZWrite array array=["caché","cach\\u00E9"] ; <DYNAMIC ARRAY> The first element "cach\u00E9" string literal is parsed as JSON and becomes caché. When a string literal directly appears as an element within the literal constructor syntax (which functions as a JSON array literal in ObjectScript), IRIS treats this as a JSON string literal context The second element ("cach\u00E9") is treated as a ObjectScript string literal and it evaluated as runtime expression, so the \u is not parsed as Unicode. It stays escaped as \\u00E9. Assign Null Values IRIS provides a straightforward way to assign a null value to a key in a JSON key-value pair. For example: USER>Set json = {"isActive":null} USER>ZWrite json json={"isActive":null} ; <DYNAMIC OBJECT> It sets the "isActive" key to null within the JSON object, with the help of the native dynamic object syntax in IRIS. Using Comments Inside JSON Constructors in IRIS Unlike strict JSON parsers (which do not allow any comments), InterSystems IRIS provides the flexibility to include comments within JSON literal constructors ({} or []). It can significantly enhance code readability and maintainability. Block Comments (/* */) in Arrays and Objects IRIS allows you to insert block-style comments (/* comment */) anywhere within JSON constructors (both arrays and objects). However, note that // line comments are not allowed inside single-line array/object declarations. set array = [1, "test" /* test comment */, "hello world", ($Horolog)] set array = [ 1, "test" /* test comment */, "Hello world", ($Horolog) // Internal date and time format ] It is valid in IRIS. It is useful for documenting array elements. Block and Line Comments in JSON Objects IRIS also allows both /* block comments */ and // line comments inside object constructors: set json = { "name": "test", /* test name */ "age": (age) // age will be calculated at runtime } /* ... */ can be used after any key-value pair. // ... can be placed after a pair as well Create JSON with Class Definitions The %DynamicAbstractObject (%DAO) subclasses, including the %DynamicArray and %DynamicObject classes, are the primary classes for creating, modifying, and sending JSON representations into and out of InterSystems IRIS databases. These classes support object manipulation using such ObjectScript intrinsic functions as $Property and $Method.The %DynamicObject implementation does not maintain a predefined list of valid property names, as all string keys are considered legal and valid. Instead of employing %Get and %Set dedicated methods for DynamicObject and DynamicArray, you can also retrieve values dynamically with the $Property and $Method intrinsic functions. However, $Property is generally more efficient than $Method, and is therefore recommended when accessing values in %DynamicObject instances. ClassMethod sample() { #dynamic object Set do = {"1D":"test"} Set $Property(do, "id")=12 Do $Method(do, "%Set", "version", $ZV, "string") ZWrite do #; Dynamic Array Set da = [] #; Here the property should be the index of the array Set $Property(da, "0")=12 Do $Method(da, "%Set", "4", $ZV) Zwrite da } DynamicObject USER>Set do = {"1D":"test","version":($Piece($ZVersion," ",1,5))} USER>Write $Property(do,"1D") test USER>Write $Method(do,"versionGet") IRIS for Windows (x86-64) 2024.1.1 DynamicArray USER>Set da = [1,($USERNAME),($ROLES)] USER>Write $Property(da,1) Test USER>Write $Method(da,"%Get",2) All Code Sample The following provides ObjectScript and Embedded Python code samples for %DynamicObject creation (for IRIS 2024.1 and 2025.1 versions). Set dynObject1 = ##class(%DynamicObject).%New() Set dynObject1.MRN = 4298598 Set dynObject1.name = "test,Patient A" Set dynObject1.IsActive = 1 Set dynObject1.emails = ##class(%DynamicArray).%New() Set dynObject1. emails."0" = "test@gmail.com" Set dynObject1. emails."1" = “test1@gmail.com” Embedded Python sample import iris dynObject1 = iris.cls("%DynamicObject")._New() dynObject1._Set("MRN",298598) # inovke IRIS %DynamicObject object %Set method dynObject1._Set("name" , "test,Patient A") dynObject1._Set("IsActive", 1, "boolean") # no native python set method available emails = iris.cls("%DynamicArray")._New() emails.add("test@gmail.com") #native python function emails.add("test1@gmail.com") dynObject1._Set("emails", emails) print(dynObject1.toString()) Embedded Python 2025.1 Simplified Class Method Access in Python Instead of operating the iris.cls("ClassName").method() syntax, you can directly access class methods with the iris.ClassName.method() format for improved readability and convenience. # Traditional syntax iris.cls("Sample.Person")._New() # Simplified syntax iris.Sample.Person._New() # For system classes iris.cls("%DynamicObject")._New() iris._Library.DynamicObject._New() This approach provides a more Pythonic and concise way to interact with InterSystems IRIS classes. 2025.1 Embedded Python sample import iris #DynamicObject dynObject1 = iris._Library.DynamicObject._New() dynObject1._Set("MRN",298598) dynObject1._Set("name" , "test,Patient A") dynObject1._Set("IsActive", 1, "boolean") #DynamicArray emails = iris._Library.DynamicArray._New() emails.add("test@gmail.com") emails.add("test1@gmail.com") dynObject1._Set("emails", emails) print(dynObject1.toString()) Methods of %DynamicObject and %DynamicArray A set of commonly used and practical methods is available for working with JSON in InterSystems IRIS. These methods are essential for efficiently creating, modifying, and deleting JSON objects and arrays. %IsDefined(Key) The %IsDefined method checks whether a specified key exists in the object. It returns a Boolean value: 1 if the key is present, or 0 if it is not. Note that key matching is case-sensitive. USER>Set json = {"username":"TestUser", "role":"All"} USER>Write json.%IsDefined("username") 1 USER>Write json.%IsDefined("password") 0 USER>Write json.%IsDefined("userName") 0 Embedded Python - contains(key) The Python contains function checks if a specified key exists in a DynamicObject or DynamicArray. It returns 1 if the key is present, and 0 if it is not. Class Sample.DAO.EmpeddedPY Extends %RegisteredObject { ClassMethod DAOIsDefined() { Set json = {"username":($USERNAME), "roles": ($ROLES), "horolog":(+$H)} Do ..DAOIsDefinedPY(json,"horolog") } ClassMethod DAOIsDefinedPY(dao, key) [ Language = python ] { # use contains instead of %IsDefined method print(dao.contains(key)) } } OutputUSER>DO ##class(Sample.DAO.EmpeddedPY).DAOIsDefined()1 %Get(Key, Default, Type) The %Get is an instance method used to retrieve values from a %DynamicObject or %DynamicArray. When you work with the %Get(key) method to evaluate a property containing a JSON representation, that JSON representation will first be converted into an ObjectScript value, and then it will return that value. This method accepts 3 formal parameters: Key (required) objects: the name of the key to retrieve. arrays: the index position of the element. Default (optional) The value to return if the key or index is not present. If omitted and the key is missing, an empty string is returned. Type (optional but important) This is the most crucial parameter when handling large strings. If the JSON contains a large string exceeding the IRIS maximum string length (3,641,144), get the maxstring by ($SYSTEM.SYS.MaxLocalLength() / $$$MaxLocalLength / $$$MaxStringLength). You can also pass this parameter with one of the following values to prevent a <MAXSTRING> error: "string"       - Convert to text string"string>base64"   - Convert to text string, then encode into base64"string<base64"   - Convert to text string, then decode from base64"stream"     - Place string conversion into %Stream"stream>base64" - String encoded into base64 into %Stream"stream<base64" - String decoded from base64 into %Stream"json"       - Convert to JSON representation Apart from the abovementioned types, it might also signal < ILLEGAL VALUE> error in the next cases: To handle large string values efficiently, use the "stream" type. It returns a stream object (e.g., %Stream.DynamicCharacter) instead of loading the entire string into memory. Example: Set stream = json.%Get("image", , "stream") If you want to retrieve the value as a Base64-encoded string, go for the "string>base64" type. Example: Set data = json.%Get("image", , "string>base64") To decode a Base64-encoded string and get the original value, utilize the "string<base64" type. Example: Set data= json.%Get("b64_encode", , "string<base64") By default, %Get converts JSON values to their corresponding ObjectScript types. To retrieve the original JSON representation instead (e.g., true, null), specify "JSON" as the third parameter. Here is how it works in detail: Set json = {"IsActive": true, "IsNull": null} By default, retrieving "IsActive" returns 1, and "IsNull" returns an empty string (""). It happens because JSON values are automatically converted to their ObjectScript equivalents. To retrieve the original JSON representations (true and null), pass "JSON" as the third parameter in the %Get method: USER>Set json = {"IsActive": true, "IsNull": null} USER>Write json.%Get("IsActive") ; returns 1 1 USER>Write json.%Get("IsActive",,"JSON") ; returns true true USER>Write json.%Get("IsNull") ; returns "" USER>Write json.%Get("IsNull", , "JSON") ; returns null null Generate Large JSON The following code generates a large sample JSON as a stream. ClassMethod LargeJSON() { Set $Piece(data,"a",$$$MaxStringLength)="" #; create a stream object and it has json string {"data":""} Set stream = ##class(%Stream.TmpCharacter).%New() Do stream.Write("{""data"": "" ") For i=1:1:20 d stream.Write(data) Do stream.Write(" ""} ") Quit stream } Once a stream is created, convert it to JSON with the help of the %FromJSON() method. When you work with %Get() to fetch by JSON key, it might signal a <MAXSTRING> error. To prevent this, you need to pass the third parameter as "stream", and it will convert the string into a stream object (%Stream.DynamicBinary). What is %Stream.DynamicBinary and %Stream.DynamicCharacter? The %Stream.DynamicCharacter (%SDC) and %Stream.DynamicBinary (%SDB) classes are specifically designed to hold copies of string or binary data stored within elements of a %DynamicArray (%DA) or %DynamicObject (%DO). These %SDC and %SDB streams are read-only, meaning their contents cannot be modified directly. However, if you need to alter the data, you can create a writable stream from the %Stream package and use the CopyFrom() method to duplicate the contents from the read-only stream into the new writable stream. ClassMethod ParseToJSON() { Set stream = ..LargeJSON() Set json = ##class(%DynamicAbstractObject).%FromJSON(stream) Write json Write json.%Get("data") ; it signals <MAXSTRING> error #; to prevent this Write json.%Get("data",,"stream") ; it returns a stream object } Embedded Python DynamicObject Embedded Python - get(key) The Python get function takes one argument — the key to check for in the dynamic object. Class Sample.DAO.EmpeddedPY Extends %RegisteredObject { ClassMethod DOGet() { Set json = {"id":1234,"firstName":"Ashok","lastName":"Kumar","IsActive":true} Do ..DOGetPY(json) } /// DynamicObject set python ClassMethod DOGetPY(dynamicObj) [ Language = python ] { print(dynamicObj._Get("IsActive",1,"JSON")) # get has one parameter print(dynamicObj.get("id")) } ClassMethod DAOGet() { Set json ={"string":"Hello, world!","number_integer":42, "number_float":3.1415899999999999,"boolean_true":true, "boolean_false":false,"null_value":null, "object":{"nested_key":"nested value"}, "array":[1,"two",true,null,{"key":"value"}] } Do ..DAOGetPY(json,"array") } ClassMethod DAOGetPY(dao, key) [ Language = python ] { # Use the Python-specific function "get" to retrieve values from the DynamicObject/ array. No need to use %Get print(dao.get(key).get(4).get("key")) return 0 } } OutputUSER>do ##class(Sample.DAO.EmpeddedPY).DOGet()true1234USER>do ##class(Sample.DAO.EmpeddedPY).DAOGet()value DynamicArray Class Sample.DAO.EmpeddedPY Extends %RegisteredObject { ClassMethod DAGet() { Set array = [1234,"ashok","kumar",{"version":($ZVersion)}] Do ..DAGetPY(array) } /// DynamicObject set python ClassMethod DAGetPY(dynamicArr) [ Language = python ] { print(dynamicArr._Get(1)) print(dynamicArr.get(3)._ToJSON()) } } OutputUSER>do ##class(Sample.DAO.EmpeddedPY).DAGet()ashok{"version":"IRIS for Windows (x86-64) 2024.1.1 (Build 347U) Thu Jul 18 2024 17:40:10 EDT"} %Set(Key, Value, Type) The %Set instance method is used to add or modify key-value pairs in a %DynamicObject, or set indexed values in a %DynamicArray. The value assigned is evaluated as a runtime ObjectScript expression, and the result of that expression becomes the property's value. This %Set has 3 formal parameters: Key (required): Represents the key in a %DynamicObject or the index in a %DynamicArray. In JSON, all object keys must be strings. If you provide a numeric key (e.g., 1), it will automatically be converted to a string. Example: Do json.%Set(1, "test") results in {"1": "test"}. Value (required): The actual value that will be stored in the element. Omitting this will signal a <PARAMETER> error. Type (optional): This parameter helps enforce correct JSON data types during assignment. It is particularly necessary when dealing with Booleans, nulls, large strings, or stream objects. Boolean: To set a Boolean key-value pair in JSON, note that InterSystems IRIS does not have a native Boolean type. You can pass 1 for true and specify the type as "Boolean" to store the value correctly. Example: Do json.%Set("active", 1, "Boolean") results in {"active":true}. Number: To store a string as a JSON number, provide the value as a string and specify the type as "Number". Example: Do json.%Set("int", "158425", "Number"). Null: In IRIS, a string with a space (" ") is not automatically treated as null. To explicitly set a JSON null, use a blank string with the type "null". Example: Do json.%Set("IsNull", "", "null") results in {"IsNull": null}. Stream: If the value is a stream object, you can specify the type as "stream" to automatically convert the stream content to a string before storing it in the JSON object. String and numeric values can be assigned directly without specifying a type. Base64 Encoding/Decoding: To encode a string as a Base64 value before storing it, utilize the type "string>base64". Example: Do json.%Set("basicpassword", "_BASIC:TEST","string>base64"). To decode a Base64 string and store the result, employ the type "string<base64". Example: Do json.%Set("basicpassword", "X0JBU0lDOlRFU1Q=","string<base64"). For stream content: "stream>base64"- %Stream contents are encoded into a Base64 string. "stream<base64"- %Stream is decoded from Base64 into a byte string. Embedded Python In embedded Python, you must use an underscore _ instead of a percent sign % for methods. For instance, %Get() becomes _Get() in a Python script. DynamicObject Embedded Python - put(key, value) The Python put function takes two arguments: The first is the key (for a DynamicObject) or index (for a DynamicArray), and the second is the value to assign to that key or index. Class Sample.DAO.EmpeddedPY Extends %RegisteredObject { ClassMethod DOSet() { Set json = {} Do ..DOSetPY(json) Write json.%ToJSON() } /// simple set in Python ClassMethod DOSetPY(dynamicObj) [ Language = python ] { dynamicObj._Set("id",1234) dynamicObj._Set("firstName", "Ashok") dynamicObj.put("lastName", "Kumar") #print(dynamicObj._ToJSON()) } ClassMethod DAOSet() { Set json ={"string":"Hello, world!","number_integer":42, "object":{"nested_key":"nested value"}, "array":[1,"two",true,null,{"key":"value"}] } Do ..DAOSetPY(json,"array") } /// chaining function usage ClassMethod DAOSetPY(dao, key) [ Language = python ] { # Use the Python-specific function "put" to retrieve values from the DynamicObject/ array. No need to use %Set dao.get(key).get(4).put("key","changed to hello") # use toString() function . No need to use %ToJSON() print(dao.toString()) return 0 } } OutputUSER> Do ##class(Sample.DAO.EmpeddedPY).DOSet(){"id":1234,"firstName":"Ashok","lastName":"Kumar"}USER>do ##class(Sample.DAO.EmpeddedPY).DAOSet(){"string":"Hello, world!","number_integer":42,"object":{"nested_key":"nested value"},"array":[1,"two",true,null,{"key":"changed to hello"}]} DynamicArray Class Sample.DAO.EmpeddedPY Extends %RegisteredObject { ClassMethod DASet() { Set array = ##class(%DynamicArray).%New() Do ..DASetPY(array) Write array.%ToJSON() } /// DynamicObject set Python ClassMethod DASetPY(dynamicArr) [ Language = python ] { dynamicArr._Set(0, 1234) dynamicArr._Set(1, "Ashok") dynamicArr.put(2, "Kumar") #print(dynamicObj._ToJSON()) } } OutputUSER> Do ##class(Sample.DAO.EmpeddedPY).DASet()[1234,"Ashok","Kumar"]USER>do ##class(Sample.DAO.EmpeddedPY).DAOSet(){"string":"Hello, world!","number_integer":42,"object":{"nested_key":"nested value"},"array":[1,"two",true,null,{"key":"changed to hello"}]} Important Note: When using %Set(key, value) to modify a property, the value is computed as a runtime ObjectScript expression, and the result of that computation becomes the property's value. Method Chaining Such methods as %Set() and %Push() return chainable references and can be called from anywhere in the chain. USER>Set jstring = "[123]" USER>Write [].%FromJSON(jstring).%Set(1,"one").%Push("two").%Push("three").%Set(1,"final value").%ToJSON() [123,"final value","two","three"] %Push(Value, Type) The %Push instance method appends the given value to the end of the current array, increasing its length. This method has two formal parameters: Value (required): The actual value to be inserted at the end of the array. This value can be a JSON string, number, Boolean, or JSON object. Type (optional): This parameter helps enforce correct JSON data types during assignment. It is particularly critical when dealing with Booleans, nulls, large strings, or stream objects. You can refer to this type in the %Set() section. USER>Set da = ##class(%DynamicArray).%New() USER>Do da.%Push("test") USER>Do da.%Push("","null") USER>Do da.%Push(1,"Boolean") USER>Do da.%Push("Test","string>Base64") USER>Do da.%ToJSON() ["test",null,true,"VGVzdA=="] %Remove(Key) The %Remove method is used to delete an element from a JSON object or array. It returns the value of the removed element. When working with objects, pass the key to the element to remove. When working with arrays, pass the index of the element to remove. Object USER>Set json = {"username":"Test", "role":"Admin"} USER>Write json.%Remove("username") Test USER>Write json.%ToJSON() json={"role":"Admin"} Array USER>Set array = [1,2,3,4,5] USER>Write array.%Remove(2) 3 USER>Write array.%ToJSON() array=[1,2,4,5] Embedded Python Embedded Python - remove(key) The Python remove function deletes the specified key from a DynamicObject or removes the element at the given index from a DynamicArray. Class Sample.DAO.EmpeddedPY Extends %RegisteredObject { ClassMethod DAOremovePY(dao, key) [ Language = python ] { dao._Remove(key) #invoke IRIS DynamicObject %Remove method dao.remove(key) #native Python method } ClassMethod DAORemove() { Set json = ##class(%DynamicObject).%New() Set json."m_username"=$USERNAME Set json.roles=$ROLES Do ..DAOremovePY(json,"m_username") ZWrite json Set array = [1,"test",2,"test2"] Do ..DAOremovePY(array,2) ZWrite array } ClassMethod Sample2() [ Language = python ] { da = iris.cls("%Library.DynamicArray")._New() da.put(0,3) da.put(1,4) da.remove(1) da.remove(2) print(da.size()) } } OutputUSER>DO ##CLASS(Sample.DAO.EmpeddedPY). DAORemove()json={"roles":"All"} ; <DYNAMIC OBJECT>array=[1,"test","test2"] ; <DYNAMIC ARRAY> This method is helpful when you need to clean up or selectively modify JSON structures during processing. %Size() The %Size() method returns the number of elements contained within a JSON object or array. USER>Set json ={"username":($USERNAME),"role":($ROLES)} USER>Write json.%Size() 2 USER>Set array = [1,2,3,4,5,6,7,9,0,121,"test"] USER>Write array.%Size() 11 Embedded Python - size() The Python size function returns the number of elements in a DynamicObject or DynamicArray ClassMethod Size() [ Language = python ] { import iris dao = iris.cls("%Library.DynamicObject")._New() # dao1 = iris.cls("%Library.DynamicObject")._New() dao1._Set("key1","AAA") dao1._Set("key2","AAA") # dao._Set("key1",dao1) dao._Set("key2",dao1) dao.put("key3",111) dao.put("key4","test") #Native Python size() function print(dao.size()) # output 4 #IRIS DynamicArray %Size() method print(dao.get("key1")._Size()) # output 2 } The remaining methods will be discussed in the following article. What a deep article, thanks. Special kudo python examples :). 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) This is great, thank you. Very useful article, a lot of use-cases and examples! Thank you @Ashok.Kumar ! Thank you! Thank you! Nice Article Ashok! excellent work!! thank you for the time you took to put this together Thank you for this article, the clear examples make understanding much more practical.
Announcement
Evgeny Shvarov · Aug 23, 2017

Share Your InterSystems Solution on InterSystems Global Summit 2017

Hi, Community!For those developers who are attending Global Summit 2017 this year: you have an opportunity to share your solutions, framework, and experience with the rest GS attendees and Developer Community.On Monday 11th we would have Developer Community Sessions in Tech Exchange Open House (see the agenda).Every presenter would have 10 minutes for slides and 5 minutes for questions. So we have 6 slots available at the moment.We would have a live stream of the event on DC YouTube so you would be able to watch it and ask questions in comments to the streaming over Internet.If you want to participate and share your InterSystems solution or framework leave the comment to this post, we would contact you directly.The agenda of the event would be updated here upon incoming requests.Share your InterSystems Developer Solution on Global Summit 2017 the largest annual InterSystems Solutions Developers ConferenceCurrent agenda for the meeting: TimeSessionPresenterSite 5:00 pmDependencies and Complexity [@John.Murray] georgejames.com 5:15 pmRESTForms - REST API and UI Framework for your persistent classes [@Eduard.Lebedyuk] RESTForms 5:30 pmDeepSee Web - Angular and Mobile UI for Deepsee Dashboards [@Evgeny.Shvarov] DeepSeeWeb 5:45 pmCaché ObjectScript Code Quality Management Carlos Carlà cachequality.com 6:00 pmDocker, why and how it can be used in development [@Dmitry.Maslennikov] 6:15 pm Kano MDM - Master Data Management Solution [@Liudmyla.valerko] kanosoftware.com 6:30pmA Secure Distributed System DevOps Architecture with Caché, Git Ansible and Object Synchronization [@Amir.Samary]` 6:45pm Visualizing DeepSee Data Your Way [@Peter.Steiwer] Live Stream on DC Channel. Ask your questions! Hi, Community! We have 3 first sessions for DC Sessions meeting. Have 3 more available. Hi!We would like to talk about Static Code Analysis for COS. AsOne has developed a multi tenancy, multi lingual massive ERP system in Cache which has been deployed in many industries. Would be a good showcase - could we get a slot ? Refer Richard Courier, Mike Fuller etal Hi, Daniel! That's great. Contacted you via email regarding presenter and topic. Hi, Andre! Sounds great! Check your email for details. Hi, Daniel! Your session on Caché ObjectScript static code analysis is introduced! HiI'd like to make a small presentation of Ensemble-based Master Data Management Solution Kano MDM. We are also going to participate in Partner Pavilion. Could you please schedule our presentation. Hi, Liudmila!Sure! We'll contact you directly via email about session details, slides, and presenter. One more session has been introduced to the schedule: "Docker, why and how it can be used in development" by [@Dmitry.Maslennikov] We introduced two more sessions:"A Secure Distributed System DevOps Architecture with Caché, Git Ansible and Object Synchronization " by [@Amir.Samary] and "Visualize DeepSee Data Your Way" by [@Peter.Steiwer].We are starting at 5pm (PT) at Tech Exchange, Developer Community table (Pike's Peak). Come the sessions! Join DC Flash Sessions online on the InterSystems Developers YouTube Channel at 5pm (PT).
Announcement
Jeff Fried · Dec 10, 2019

InterSystems IRIS and InterSystems IRIS for Health 2019.4 released

The 2019.4 versions of InterSystems IRIS, InterSystems IRIS for Health, and InterSystems IRIS Studio are now Generally Available! These releases are available from the WRC Software Distribution site, with build number 2019.4.0.383.0. InterSystems IRIS Data Platform 2019.4 has many new capabilities including: New Automatic Configuration Customization System security, performance, and efficiency enhancements including node tables ICM support for Tencent Cloud List Class available in the Native API for Java and .Net Container and Cloud Deployment improvements SQL enhancements InterSystems IRIS for Health 2019.4 includes all of the enhancements of InterSystems IRIS. In addition, this release includes FHIR searching with chained parameters (including reverse chaining) and minor updates to FHIR and other health care protocols. These are detailed in the documentation: InterSystems IRIS 2019.4 documentation and release notes InterSystems IRIS for Health 2019.4 documentation and release notes InterSystems IRIS Studio 2019.4 is a standalone development image supported on Microsoft Windows. It works with InterSystems IRIS and InterSystems IRIS for Health version 2019.4 and below, as well as with Caché and Ensemble. As this is a CD release it is only available in OCI (Open Container Initiative) a.k.a. Docker container format. The platforms on which this is supported for production and development are detailed in the Supported Platforms document. Hi Jeff! Thanks! When the new release will be available on Docker Hub? These are now available! docker pull store/intersystems/iris-community:2019.4.0.383.0 docker pull store/intersystems/irishealth-community:2019.4.0.383.0 Thanks, Steve! Hi Jeff, Is there a distinct Health Connect build? I'm upgrading from 2017.1 Kind regards, Stephen Hi Stephen - Sorry for the slow response on this. We are not releasing the quarterly CD releases for Health Connect, so there isn't a 2019.4 available for it. The most recent version is 2019.1.1. But we'll have a 2020.1 out shortly (there's a preview available now if you want to work with it). Since you are moving from 2017.1, you should be aware that the underlying technology has changed (from being based on Ensemble to being based on InterSystems IRIS) , so technically this is an in-place conversion. Please look at the in-place conversion guide ahead of your move, and if you follow the steps it should go quite smoothly. -jeff
Article
Tony Coffman · Feb 6, 2020

Connecting to InterSystems Caché and InterSystems IRIS with BridgeWorks VDM

Hello Community, Thank you all for your continued feedback and support of our ad hoc reporting platform, VDM. There's been some questions around setting up a non-ODBC connection for InterSystems platforms. We published a new YouTube video showing the steps necessary to connect to InterSystems Caché and InterSystems IRIS with BridgeWorks VDM. jQuery(document).ready(function ($){$("#youtubeNtH5w4AzmMY").css("height",$("#youtubeNtH5w4AzmMY").css("width").replace(/[^0-9]/gim,"")/(560/315));$(window).resize(function(){ $("#youtubeNtH5w4AzmMY").css("height",$("#youtubeNtH5w4AzmMY").css("width").replace(/[^0-9]/gim,"")/(560/315));});});
Announcement
Anastasia Dyubaylo · Apr 23, 2020

InterSystems IRIS Tech Talks: Upcoming Webinars for InterSystems Developers

Hi Community, We're pleased to invite you to join the “InterSystems IRIS Tech Talks”, a new series of webinars presented by InterSystems product managers. The webinars will take deep dives into the latest features of InterSystems IRIS 2020.1 from a developer’s perspective. They’ll go beyond the high-level overviews and kick the tires on the very best and latest technologies we’ve released. Please have a look at the list of webinars planned for May and June: ✅ API-First DevelopmentDate: May 5, 2020Time: 10:00 AM EDT ✅ Integrated Development EnvironmentsDate: May 19, 2020Time: 10:00 AM EDT ✅ DevOpsDate: June 2, 2020Time: 10:00 AM EDT So, dear developers! You're very welcome to join the upcoming InterSystems Tech Talks! ➡️ REGISTRATION IS ALREADY OPEN! Hope you enjoy the new webinars! And please find the first webinar recording on Data Science, Machine Learning & Analytics here: WATCH NOW Stay tuned!
Announcement
Fabiano Sanches · Mar 14, 2024

InterSystems announces General Availability of InterSystems IRIS 2024.1

The 2024.1 release of InterSystems IRIS Data Platform is now Generally Available (GA). Release Highlights In this release, you can expect a host of exciting updates, including: Using vectors in ObjectScript: A powerful capability for optimizing data manipulation. Vector Search (experimental): A cutting-edge feature for efficient data retrieval. Multi-Volume Database: Enhancing scalability and storage management. FastOnline Backup (experimental): Streamlining backup processes. Multiple Super Server Ports: Providing flexibility in network configuration. and much more! Documentation Details on all the highlighted features are available through these links below: InterSystems IRIS 2024.1 documentation, release notes and deprecated & discontinued technologies and features. In addition, check out this link for upgrade information related to this release. Early Access Programs (EAPs) There are many EAPs available now. Check out to this page and register to those you are interested. How to get the software? As usual, Extended Maintenance (EM) releases come with classic installation packages for all supported platforms, as well as container images in Docker container format. For a complete list, refer to the Supported Platforms page. Classic installation packages Installation packages are available from the WRC's Extended Maintenance Releases page. Additionally, kits can also be found in the Evaluation Services website. InterSystems IRIS Studio is still available in the release, and you can get it from the WRC's Components distribution page. Containers Container images for both Enterprise and Community Editions of InterSystems IRIS and IRIS for Health and all corresponding components are available from the InterSystems Container Registry web interface. ✅ Build number for this InterSystems IRIS data platform release is: 2024.1.0.262.0. If you're in the ICR, containers are tagged as both "2024.1" or "latest-em". For InterSystems IRIS for Health and HealthShare Health Connect, read this other post: Extended Developer Preview. @Fabiano.Sanches this is great news! I see that there are some changes related to LOAD DATA command. Release notes describe the following sentence: "For example, you can interpret dates or timestamps supplied in a format different from the ODBC standard or clean up whitespace or other formatting issues." I have a question about these changes. A few months ago the following idea was posted on the Ideas Portal: Date format in LOAD DATA to indicate a date/datetime format other than 'yyyy-mm-dd hh:mm:ss' Could you please share has this idea been implemented in the new release? Congrats everyone! Great milestone :) Hi @Vadim.Aniskin , while putting together a sample of the new feature, I found out that very unfortunately this change did not make it into 2024.1.0 after all. It passed our internal testing a few months ago and was promoted through project and integration branches using our existing automation, and as such was added to the draft list of features we wanted to describe in the release notes. However, because of overlapping changes it did not get promoted into the main release branch automatically (as those earlier steps), and ended up in a manual queue. That took a little longer than expected, and I did not perform a final check before publishing the draft release notes. To my knowledge, this is the first time we had a fully-greenlit feature miss out on the automation, but that's no excuse and we've learned to do a manual check right before release. In short, this change is now on its way to 2024.2, and the 2024.1 release notes will be updated shortly. I'm sorry about the confusion this may have caused,benjamin Hi @Benjamin.DeBoe thank you so much for your detailed feedback. Everything is fine, no confusion, thanks for the clarification.
Announcement
Daniel Palevski · Jul 23

InterSystems Announces General Availability of InterSystems IRIS 2025.2

InterSystems is pleased to announce the General Availability (GA) of the 2025.2 release of InterSystems IRIS® data platform. This is a Continuous Delivery (CD) release. Please note that the GA versions of InterSystems IRIS for Health™ and HealthShare® Health Connect™ 2025.2 are currently withheld due to mirroring limitations introduced by security updates (details below). Release Highlights This release introduces impactful enhancements across security, developer experience, operations, and interoperability. Notable new features include: 1. Security Enhancements with the New IRISSECURITY Database o Security data has been moved to the new IRISSECURITY database. This database can be encrypted. o New role %SecurityAdministrator supports centralized administration. o Direct access to security globals and tables is deprecated; use the provided APIs with appropriate permissions instead. Additional info: Developer Community – IRISSECURITY Overview 2. Platform and Observability Updates o RHEL 10 support added; RHEL 8 retired. o SUSE support removed for this release (will return in 2025.3). o Initial support for OpenTelemetry tracing in CSP framework (REST/SOAP), available on Linux only. 3. Improved Data Onboarding o Enhanced Foreign Tables with support for: Pushdown of GROUP BY, HAVING, ORDER BY, and TOP. Expanded Push Through capabilities for exploration queries using non-IRIS syntax o Continued alignment with InterSystems Data Fabric strategy. 4. Developer Experience o Direct distribution of client libraries now available via: Maven (Java), NuGet (.NET), NPM (Node.js), PyPI (Python) 5. Interoperability UX (Opt-In) o New UI workflows for: Creating and recovering productions Viewing pool sizes, editing rules with better visibility, and copying paths o Improved DTL editing, filtering, and search o Browser-wide search now supported o This opt-in UI continues to evolve based on feedback from 2025.1. Please share your feedback for these enhancements on the Developer Community so we can build a better product together. Notes on IRIS for Health and Health Connect 2025.2 Due to required changes introduced by the Security DB in IRIS 2025.2, the 2025.2 versions of IRIS for Health and Health Connect are not publicly released as of today’s July 23 GA date. Development previews are available but not intended for production use. These have been posted to the WRC developer preview site. Containers can be found on our container registry and are tagged latest-preview. Documentation Details on all the highlighted features are available through these links below: · InterSystems IRIS 2025.2 documentation, release notes. In addition, check out the upgrade impact checklist for an easily navigable overview of all changes you need to be aware of when upgrading to this release. Early Access Programs (EAPs) There are many EAPs available now. Check out this page and register to those who are interested. How to get the software? As usual, Continuous Delivery (CD) releases come with classic installation packages for all supported platforms, as well as container images in Docker container format. Classic installation packages Installation packages are available from the WRC's InterSystems IRIS page for InterSystems IRIS. Additionally, kits can also be found in the Evaluation Services website. Availability and Package Information This release comes with classic installation packages for all supported platforms, as well as container images in Docker container format. For a complete list, refer to the Supported Platforms document. The build number for this Continuous Delivery release is: 2025.2.0.227.0. This release comes with container images in Docker container format, available from the InterSystems Container Registry. IRIS containers are tagged as both "2025.2" and "latest-cd". ©2024 InterSystems Corporation. All Rights Reserved.
Question
Saptarshi Sengupta · Jan 24, 2020

Intersystems and JReport

Intersystems use JReport as their reporting framework. Are there any free version available for developers to try it out? If yes, can I avail the link? Is there any free trial version for 'DeepSee'? if yes, can I avail the link? Thanks in advance for your feedback. Logi JReport are currently available for operational reporting as part of InterSystems TrakCare. InterSystems IRIS Business Intelligence (aka "DeepSee") is available for all InterSystems products for data modeling, exploration and dashboarding. Evgeny pointed you to all the download information needed for that. JReport and InterSystems IRIS BI are complimentary as they provide different capabilities. I am interested in hearing more about your operational reporting requirements. Download as by PRODUCTS / Download IRIS .Never heard of J-Report before. IRIS Analytics. (DeepSee) is included even in IRIS Community Version by default so you are welcome to try. 3 easiest ways to try: 1. download IRIS Community version as @Robert.Cemper1003 mentioned. 2. Launch Try IRIS instance 3. Docker pull the image 4. Run an instance of IRIS on a cloud you like: Azure, AWS, GCP. You have IRIS Analytics with Community Edition but you probably want to try something working. Samples BI is not included but could be installed. The easiest way to install is to use ZPM. Or even to launch a docker image with ZPM on board and install Samples-BI with one command. Also, I can recommend trying AnalyzeThis by @Peter.Steiwer - it's a nice tool to generate a cube+pivot+dashboard vs arbitrary csv file. HTH Hi, If you want to try J-Report, here is a link for the trial version: https://www.jinfonet.com/product/download-jreport/For an OpenSource alternative, you can take a look at Jasper Reports Community Edition https://community.jaspersoft.com/ I used to work with Jasper Reports to generate PDF reports for my customers. To connect to InterSystems IRIS, use the ODBC and voilá. As mentioned by @Carmen.Logue , if you tell us your reporting requirements, that should be easier to discuss alternatives. Thank you very much. Yes JReport trial version does not help much as it is only last 14 days. Regarding Jasper Report, did you install 'Jaspersoft Studio'? I want to work on JReport Designer,which uses JDBC... I mainly want to master JReport Designer, so I can develop/design report. Therefore, do you think, Jasper Studio would provide me similar environment? Any lead would be appreciated. Thanks. @the.alchemist If you want to develop/design reports. Jasper Studios is what you looking for. Free and simple Hi Henrique, Does jasper reports run one time or is it real time. What I intend to have is a real time report embedded in the zen page. not a pdf. i mean a downloaded pdf may be a plus, but not the endpoint Any thoughts? Hi, Jasper Reports will work just like Crystal Reports. It will generate PDF reports on demand. But, you can take a look here: https://www.jaspersoft.com/downloadMaybe what you need it's more than the Jasper Studio. We (#Roche) will also be very interested in having JReport integrated with IRIS in order to generate pdf files given specific data (i.e.: a screen table, a patient test)