Search

Clear filter
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 !
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!
Article
Tony Coffman · Feb 6, 2020

Connecting to InterSystems Caché and InterSystem 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 InterSystem 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
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
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
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)
Question
Kevin Johnson · Sep 10, 2020

Is InterSystems Global Masters and InterSystems Global Masters Gamification Platform the same?

Hello there Community, I am so pumped and curious about this platform. The more I search about it, the more deeper it goes just as the maze. I followed the following link https://community.intersystems.com/post/global-masters-advocate-hub-start-here and it took me to a page where i learnt more on what Global Masters is and also more about the Advocate Hub. But then I came across an very confusing this named as the Global Masters Gamification Platform. I was denied permission when i tried to access it. (Screen Shot has been attached.) Well, my question is, are both the Global Masters and Global Masters Gamification Platform the same or are they two different platforms ? If they are different I would like to know on how to gain access to it as well. Hoping to hear soon from you all. Regards. @Olga.Zavrazhnova2637 , it looks like we have a bad link at https://community.intersystems.com/post/global-masters-advocate-hub-start-here (leading to the certificate error shown). @Kevin.Johnson3273 see https://intersystems.influitive.com/users/sign_in instead of the link in that article Hi Kevin, thank you for your question. Global Masters and Global Masters Gamification Platform are the same. @Timothy.Leavitt thank you! The link was broken indeed - already fixed it 👌 Good day to all! Hello @Kevin Johnson, Answering to your question, Yes, You are correct. Both are the same and has no difference. The only difference is that the way they have named it. Both are the same. #Good Day.
Question
Kranthi kumar Merugu · Nov 6, 2020

Need to know the difference between InterSystems Cache DB and InterSystems IRIS

Hi Team, What is the difference between Intersystems Cache DB and Intersystems IRIS ? I am looking for Cache DB installation details, but getting IRIS only everywhere. we are looking for a POC to test it. Thanks, Kranthi. The scope and the dimension of possibilities are much wider with IRIS than it was with Caché.Very generally speaking: There is nothing in Caché that you can't do with IRIS.The only thing you might miss eventually, are some ancient compatibility hooks back to the previous millennium. Also, support of some outdated operating system versions is gone In addition to what @Robert.Cemper1003 said InterSystems IRIS is much faster than Caché in SQL, it has officially released Docker images, it has IRIS Interoperability and IRIS BI is included and it has Community Edition which gives you the way to develop and evaluate your solution on IRIS which is less than 10GB without ordering a license. And IRIS has a Package Manager ZPM which gives you a universal and robust way to deploy your solutions. I would also add better JSON support with %JSON.Adapter (the lack of which currently causes a lot of struggle for us on the older version) Hi Kranthi, I believe that you are just finding information about IRIS because it is something that is "in fashion". Part of Summit was about this, if you look at the developer community, basically just talk about it. In a way, we are almost unconsciously induced to migrate to IRIS. It is a fact that they have differences as friends have already commented, however, in general, it is more of the same. For differences between InterSystems CACHE and InterSystems IRIS Data Platform I suggest you have a look here. Specifically you can find there a table comparing the products (including InterSystems Ensemble). As well as a document going into detail about various new features and capabilities If you want to perform a PoC for a new system definitely use InterSystems IRIS. At a high level you can find the feature differences between Cache, Ensemble and IRIS here: https://www.intersystems.com/wp-content/uploads/2019/05/InterSystems_IRIS_Data_Platform_Comparison_chart.pdf
Announcement
Andreas Dieckow · Oct 10, 2019

Full kit versions of InterSystems IRIS and InterSystems IRIS for Health for Developers!

InterSystems is pleased to announce a new Developer Download site providing full kit versions of InterSystems IRIS Community Edition and InterSystems IRIS for Health Community Edition. These are available free of charge for application development use. You can download directly from the InterSystems Developer Community by selecting Download InterSystems IRIS. Those instances include a free built-in 13-month license. They are limited to 10GB of user data, will run on machines up to 8 cores, support 5 concurrent connections and are supported for application development. Available Platforms: RedHat, Ubuntu, SUSE, Windows and macOS. InterSystems IRIS and InterSystems IRIS for Health are also available in container format from the Docker Hub. Please check here for information on how to get started, visit the InterSystems IRIS Data Platform page and the InterSystems IRIS for Health page on our website to learn more about our products, and visit the Developer resource page to get deeper with development. If you previously registered for an InterSystems Login account (e.g. for the Developer Community or WRC Direct), you can use those credentials to gain access to the Developer Download. Why is there no Container option? Hi Angelo! This is a very good question. But there are community versions in containers on docker: image name are for InterSystems IRIS: store/intersystems/iris-community:2019.3.0.309.0 and for InterSystems IRIS for Health: store/intersystems/irishealth:2019.3.0.308.0-community Check this template app to start using this immediately. Hi Evgeny, thanks for informations, even though I already knew that, but there should be everything produced on the download site. I second having the conatiners available in the same place. Also could you show the version number available before downloading and are these production releases or previews? David, Thanks for your feedback! In general, Developer Download always makes available the latest GA version of our two Community Edition products. In this case we wanted to be able to launch by Global Summit and so we went with the Preview since 2019.1.1 kits were not full GA yet. There are ongoing discussions about the pros/cons of making containers available here rather than people just fetching them directly from Docker. We'll let you know the final decision! We will post container kits here as well. Those are released versions and not previews, that can be used for Development, but not for deployments. Thanks for the clarification. The fact that the current download is slightly different from the norm due to a Global Summit launch does highlight the need for a brief explanation of the version you are downloading though. David - I completely agree. It's an excellent suggestion and we'll get it put in place. Hi David, thanks for this suggestion. File names that include full version strings are now visible prior to download. Thanks for adding that, in the case of a preview it might be worth adding this to the "Notes" section to save cross referencing with release notifications or the usual downloads page. I was just able to install IRIS on an Apple MacBook Pro, with Parallels and Windows 10 Pro. I installed the current FOIA VistA with about 8.2 GB of data. Everything worked good until getting to the Taskman and RPC Broker startup. This has always been an issue with the developer version from Intersystems. It's almost enough users to bring up Taskman. Not nearly enough to bring up Taskman and the RPC Broker. It's great to have IRIS Studio. Everything seems just like Cache with a new name. Thanks Intersystems. David - FYI, the full Release Version of 2019.1.1 Community Editions is now available at Download.InterSystems.com I just installed the IRIS for Windows (x86-64) 2021.1 (Build 215U) Wed Jun 9 2021 12:15:53 EDT [Health:3.3.0] ... and the license key expires 10/30/2021. Where can I get a new license, or newer version? I read where it should be for 13 months. I could barely get started in 40 days... ExpirationDate=10/30/2021
Article
Evgeny Shvarov · Jul 28, 2019

How to Learn InterSystems IRIS on InterSystems Developers community? Part 1

Hi Developers! Recently I was asked, “How can a beginner in InterSystems technologies learn from InterSystems Developers community content to improve his developer skills”? This is a really good question. It has several answers so I decided to write the post with the hope it could be useful for developers. So! How to learn Intersystems Data Platforms(IRIS, IRIS for Health) from InterSystems Developers community content if you are a beginner? Beginner and Tutorial tags First, it worth to check articles with Beginner tag and Tutorial tags. Developers who write articles put these tags if they describe the basics or are the tutorials for some InterSystems IRIS features. InterSystems Best Practices Next, if you are looking for some serious stuff check the Best Practices tag. Every week InterSystems product management selects a new article and put Best Practices tag on it. So if you subscribe it you have a new InterSystems best practice every week. Views and Votes Another way to find helpful posts is to pay attention to what developers on community vote for and what developers read most. Indeed, if a developer finds the article helpful he votes up so we can consider that articles with the most of votes are the most useful. This is the filter of the most voted articles. Also, the articles with most of the views could be considered useful too, cause not all the developers vote (and voting need the registration) but we count all the reads. So the articles with most of the views maybe not only are the most popular but also are useful. And often the questions which have accepted answers could be very useful cause it is a solved problem. Same as with articles you can filter questions with accepted answers by votes and by views and hopefully find your answers but definitely is a helpful read. Ask your questions! And of course, the best way to learn and get the experience in technology is to practice with it, run into the problems and solve it. So, you’ll have questions during the process and don’t hesitate to ask your questions on InterSystems Developers - sometimes you’ll get the answers even before you end typing the question! Resources for InterSystems Beginners And of course, it worth to mention the general resources for developers-beginners in InterSystems data platforms. They are Documentation, Online Learning, Try InterSystems IRIS sandbox, classroom learning, InterSystems Developers Videos. Developers, you are very welcome to submit other ways and advice on how to learn InterSystems Technology on Developer Community in the comments below.
Announcement
Olga Zavrazhnova · Oct 6, 2020

InterSystems Digital Services for Business

Hi Community, We introduced Business Services Rewards on Global Masters, so now you have a great opportunity to highlight applications, solutions, services of your company on Developer Community and our social media, and even redeem a Google AdWords campaign for your OEX application! $1,000 Google AdWords Campaign Voucher Redeem this prize to promote your OEX application on Google Adwords.We will set up the campaign (keywords, description, audience) and will send a report after campaign is over. Requirements: The application should work on InterSystems IRIS/IRIS for Health or be a tool to manage/develop with IRIS. 3,000 points "NEWS" Promo Block on Developer Community Redeem this prize to promote your services, events or vacancies on Developer Community. Duration: 1 week. Through all website pages on the right. Our designer will prepare a banner for you. Requirements: Development services, events or vacancies should be related to InterSystems technology. 1,500 points Open Exchange project promotion on Developer Community Redeem this prize to promote your OEX project on the Developer Community.A banner with a clickable link to your project will be shown for all DC visitors during 1 week, through all website pages on the right in the "App of the week" block. 1,000 points Webinar supported by InterSystems Would you like to organize a professional webinar for developers to tell about your solution/tool and your company services? Redeem this reward and we will help to organize it. What you will get: InterSystems team will set up an online webinar; Promotion of the webinar on DC and social media; Landing page on Developers Community; Dry-run before and technical support during webinar. Requirements: The application should work on InterSystems IRIS/IRIS for Health or be a tool to manage/develop with IRIS. 3,000 points Your Video on InterSystems Developers YouTube channel Do you have a YouTube video that describes the tool, solution or experience related to InterSystems Data Platforms? Increase the traffic to your YouTube videos ordering the Video Boost Pack: Promotion of the video on the InterSystems Developers YouTube Channel. Listing in the monthly "InterSystems Developers Videos" digest. Here is an example. Promotion on Global Masters and InterSystems Developers Social Media. 1,500 points Introduce Your Company's Tag on Developer Community Redeem this prize to get a tag for your Company on Developers Community and thus a description, a section with posts and your own subscribers. 5,000 points How to redeem if you are not a Global Masters member yet? ➡️ We invite you to join: Log in to Global Masters with the same credentials you use on DC. Answer 4 questions in "Customize your program. START HERE!" challenge (you'll see it there). Points for your contribution to OEX and DC will be automatically awarded within 3 days. Redeem the prizes at the Rewards catalog. InterSystems Developer Community has an audience of more than 80K people visiting every month. Let the world know about your applications, solutions, and services built on InterSystems Data Platform! Feel free to ask your questions in the comments below. Additional information about Global Masters: What is Global Masters? Start Here
Announcement
Anastasia Dyubaylo · Sep 11, 2020

InterSystems Full Stack Contest

Hey Developers! We're pleased to announce the next competition of creating open-source solutions using InterSystems IRIS! Please welcome: ⚡️ InterSystems Full Stack Contest ⚡️ Duration: September 21 - October 11, 2020 Prizes 1. Experts Nomination - winners will be determined by a specially selected jury: 🥇 1st place - $2,000 🥈 2nd place - $1,000 🥉 3rd place - $500 2. Community Nomination - an application that will receive the most votes in total: 🥇 1st place - $1,000 🥈 2nd place - $500 If several participants score the same amount of votes they all are considered as winners and the money prize is shared among the winners. Who can participate? Any Developer Community member, except for InterSystems employees. Create an account! Contest Period September 21 - October 4: Two weeks to upload your applications to Open Exchange (also during this period, you can edit your projects). October 5 - 11: One week to vote. October 12: Winners announcement. The topic 💡 Full Stack Applications 💡 Develop a Full Stack solution using the InterSystems IRIS. By full stack we mean a frontend application web or mobile which uses data in InterSystems IRIS via REST API, Native API, JDBC, or just IRIS Web Gateway. The application should work either on IRIS Community Edition or IRIS for Health Community Edition or IRIS Advanced Analytics Community Edition. The application should be Open Source and published on GitHub. If the application satisfies some additional requirements listed in this post, it gets additional technology votes. Helpful resources 1. InterSystems IRIS Docker templates suitable for a Full Stack application: IRIS Full Stack template Basic InterSystems IRIS Docker template IRIS REST API template Native API template IntegratedML template IRIS Analytics template 2. How to submit your app to the contest: How to publish an application on Open Exchange How to submit an application for the contest 3. Online courses: Implementing RESTful Applications 4. Videos: REST API design and Development REST API in 5 minutes Data-Driven Web Apps Judgment Please find the Judgment and Voting Rules for the Contest here. So! Ready. Set. Code. Please join our exciting coding marathon! ❗️ Please check out the Official Contest Terms here.❗️ So guys, We introduced some technology bonuses that will give you extra points in the voting: InterSystems IRIS REST API Usage InterSystems Native API Usage InterSystems JDBC Usage ZPM Package publishing Docker container usage Full details in this post. One more! Unit Testing bonus is introduced. Details. Hi devs! There is a good question in discord, whether it's possible to use other templates for a full-stack application. - YES! Sure, use and build whatever you want! You are not limited to these templates! Moreover, we are very curious about what are your templates, techniques on building full-stack apps with IRIS. We introduced an IRIS full-stack template which is an example of a simple full-stack application that is represented as an Angular frontend application and uses IRIS as a backend via REST API. Developers! Are you ready to participate in our exciting contest? 🚀 The contest begins! And we're waiting for your cool projects! Want more? Watch the latest video on InterSystems Developers YouTube related to the Full Stack contest: ⏯ InterSystems Full Stack Contest Kick-off Webinar This video describes how to use the IRIS Full Stack template and how to develop, build and deploy full stack applications in InterSystems IRIS. Stay tuned! ✌🏼 Hey guys, You're very welcome to join the InterSystems Developers Discord Channel to discuss all topics and questions related to the IRIS programming contests. There are lively discussions with InterSystems developers! Join us! 😎 BTW, @Guillaume.Rongier7183 recently published an amazing example of a full-stack app: csvgen-ui. You can install it with zpm "install csvgen-ui" and it gives you the option to import any csv to IRIS just with drag-n-drop. Here is the demo: There is also a switcher if you want to generate and download it from the URL. How to apply for the programming contest Log in to Open Exchange, open your applications section. Open the application which you want to apply for the contest and click Apply for Contest. Make sure the status is 'Published'. The application will go for the review and if it fits the topic of the contest the application will be listed on the contest board. Developers! One week left to submit your apps for the Full Stack contest! Feel free to submit if you haven't completed your project yet – you'll be able to fix bugs and make improvements during the voting week too. Hey Community! Our Contest Board is waiting for your apps! 🔥 Hey guys, Want an easy start to join the contest? Then try the IRIS Full Stack demo and template that shows you how to build, test & deploy a simple full-stack application using InterSystems IRIS REST API. Enjoy! 😉 A few more days and I'll be there. Can't wait! 🤩 The first application is already in the Contest Board! Welcome: @Rob.Tweed with the qewd-conduit project is in the game! 🔥 Check out the QEWD Implementation of the RealWorld Conduit REST Back-end. And who's next? 😉 Please welcome the next IRIS contestant: ⬇️ realworld-intersystems-iris project by @Dmitry.Maslennikov – InterSystems IRIS Starter kit for new RealWorld framework implementations. Full speed ahead! 🔥 Another "Realworld" ) That's funny ) Looking forward to seeing how two "realworlds" will compete with each other) "Great minds think alike!" @Rob.Tweed , @Dmitry.Maslennikov ;) Voting for the best apps will begin soon! Only 3 days left before the end of registration for the Full Stack contest. 🗓 Registration ends on October 4 – 11:59 PM EST. Note: Also during the voting period, you can edit your projects. Don't miss your chance to win! 🏆 @Rob.Tweed , @Dmitry.Maslennikov - your apps are the forum-like engines, right? Is it possible to load posts from community? We export globals of it every week: here is the recent Globals export. Classes structure is here. Yes, it would be possible to do so - it would be a simple matter of writing a process that invoked the appropriate Conduit REST APIs to create the articles, comments and links to authors/users from your data export. The one thing that might be tricky would be the user password property, which would be required for a user to log in and view/edit their own articles, and to follow other users and/or favourite their articles.
Announcement
RB Omo · Mar 12, 2020

InterSystems COVID-19 Update

In light of the COVID-19 situation worldwide, InterSystems is working to ensure continuous support for our customers, promote the health and well-being of our employees, and protect the communities where we live and work. Please view our statement and frequently asked questions. In addition, we have also established a special email address, COVID-19@InterSystems.com, should you have any questions or concerns. As we have for 41 years, we stand by our commitment to customers and are prepared to support you during this challenging time. Sincerely, John Paladino Vice President, Client Services
Announcement
Anastasia Dyubaylo · Oct 6, 2020

InterSystems Virtual Summit 2020

Hey Developers, Are you joining us for the InterSystems Virtual Summit 2020? ⚡️ THE REGISTRATION IS NOW OPEN ⚡️ There will be something for everyone at Virtual Summit, whether you’re a tech-savvy executive, a technical manager, a developer or a systems integrator. And this year all sessions are free to attend! The general theme of the summit is Interaction & Information. And what awaits you at the Summit? ✅ KEYNOTESCreating an Adaptive OrganizationOctober 20-22, 2020 ✅ 60+ LIVE FOCUS SESSIONSBest Practices, New Technology, Roadmaps October 27-29, 2020 ✅ ASK THE EXPERTSOne on OneOctober 30 & November 2, 2020 ✅ EXPERIENCE LABSHands On with Our TechnologyNovember 2-5, 2020 More details can be found here: intersystems.com/summit20 So! Join Us for Virtual Summit 2020! Hey Developers, Several hours are left before the start of the InterSystems Virtual Summit 2020! Don't miss the most exciting sessions and get the latest news & developments in the world of InterSystems technology! How to join? 📍 intersystems.com/virtual-summit-2020/ Keynote Schedule: Day 1 ➡️ Please join at intersystems.com/virtual-summit-2020