Clear filter
Article
Mihoko Iijima · Mar 5, 2021
**This article is a continuation of this post.**
In the previous article, we reviewed how to create and define messages used to send and receive data between components.
In this article, I will explain how to create a business operation from the component creation methods.
* Production
* Message(previous article)
* **Components**
* Business Services
* Business Processes
* **Business Operations**
We will quickly check the code by referring to the sample.。

| Component Name | Role |
|---|---|
| Start.FileBS | A business service that uses file inbound adapter to read files placed in a specified directory at regular intervals. |
| Start.NonAdapterBS | Business services that allow applications and users to input information directly without using an adapter. |
| Start.WS.WebServiceBS | Business services that allow people to enter information using web services. |
| Start.WeatherCheckProcess | A business process that controls the procedure for acquiring weather information and then registering it in a database. |
| Start.GetKionOperation | Business operation to pass the city name to the web service that provides weather information and sent back. |
| Start.SQLInsertOperation | Business operations using SQL outbound adapters to request registration of weather and purchase information into the database. |
| Start.InsertOperation | Business operations that perform updates to tables in InterSystems IRIS without the use of adapters. |
Note: BS stands for Business Services, BP for Business Processes, and BO for Business Operations.
You need to write ObjectScript in Business Services and Business Operations and can be created in VSCode or Studio. Business Processes can also be made in the Management Portal (see this article for more information on using VSCode).
There is no particular order of creation, but the external site to be connected to is a public site and can be used immediately in this sample. In this case, it is convenient to start with the business operation to make testing easier.
After creating the components, there are test page in the production for business processes and business operations.
However, testing is disabled by default in the production definition to avoid random testing in the production environment.
For details on how to allow "Testing Enables" in Production, use the following settings (the sample Production has been set to "Testing Enabled" in advance):

### 1) Business Operations
In the sample, two types of business operations are provided.
One operation is to pass the city’s name to an external Web API via REST and request the acquisition of weather information. The other operation is to give the weather information and the name of the purchased product to the InterSystems IRIS database and ask for the update process.
#### 1)-1 REST Business Operations
Let’s start by creating an operation that calls an external Web API via REST.
This operation starts the GetKion() method when a Start.Request message is entered, queries an external site, and returns the weather information in a Start.Response message.
See here for code details.
To create a business operation for REST, inherit from **EnsLib.REST.Operation** .
```objectscript
Class Start.GetKionOperation Extends EnsLib.REST.Operation
```
Inheritance of this class provides the following methods in IRIS that match the HTTP methods. Please refer to the documentation for details.
GetURL()— used for HTTP GET operations.
PostURL()— used in HTTP POST operations.
PutURL()— used in a HTTP PUT operations.
DeleteURL()— used in a HTTP DELETE operations.
For REST, use the adapter **EnsLib.HTTP.OutboundAdapter**. Set the adapter name to the **ADAPTER** parameter and the Adapter property, as shown in the example.
The INVOCATION parameter configures the **Queue**.
```objectscript
Parameter ADAPTER = "EnsLib.HTTP.OutboundAdapter";
Property Adapter As EnsLib.HTTP.OutboundAdapter;
Parameter INVOCATION = "Queue";
```
It is necessary to specify the OpenWeather API key to be obtained at runtime. There is a way to display settings that vary depending on the environment in the production settings.
The procedure is as follows:
1. Define the properties
2. Specify the name of the property you created in the SETTINGS parameter (if there are multiple properties, separate them with commas). Optionally, you can also specify a category (use “property name: category name”).
An example code is shown below.
```objectscript
/// APIキーを指定します
Property appid As %String;
/// specify lang option for OpenWeather API (default = ja = japanese)
Property lang As %String [ InitialExpression = "ja" ];
Parameter SETTINGS = "lang:OpenWeatherMap,appid:OpenWeatherMap";
```
The Production Settings page displays the following. The description in the line immediately before the property definition is also displayed in the production settings page, as shown in the figure.

Then, we will review the message map, which is an essential setting for business operations.
.png)
The above definition is defined so that the GetKion() method will work when the **Start.Request message** is **sent**.
In the GetKion() method, the city name can be obtained from the request message’s Area property passed as input information.
By setting the city name as a parameter of the URL published by the external Web API and calling it, you can obtain weather information.
The HTTP server and URL settings are configured in the Production page of the Management Portal. To obtain the settings, use the **Adapter** property provided by the HTTP outbound adapter.
Example) to specify a URL, use ..Adapter.URL
Use the GetURL() method provided by Business Operations for REST to call an external site. The first parameter is the URL to be executed (i.e., the URL specified in the required parameters such as city name). The second parameter is the HTTP response with parameters passed by reference.
Since the weather information is stored in JSON format in the HTTP response, the operation is complete when the data is registered in the response message (=pResponse).

The response message class’s name is specified in the second parameter of the created method by passing reference.
```objectscript
Method GetKion(pRequest As Start.Request, Output pResponse As Start.Response) As %Status
```
To return a response message to the caller, create an instance of the response message, store it in the second parameter variable (_**pResponse**_), and set the necessary information in the properties.
```objectscript
set pResponse.AreaDescription=weatherinfo.weather.%Get(0).description
set pResponse.KionMax=weatherinfo.main."temp_max"
set pResponse.KionMin=weatherinfo.main."temp_min"
set pResponse.Area=weatherinfo.name
// this code is fit to Japan time because weatherinfo.dt is UTC
set unixEpochFormat=weatherinfo.dt+32400
set dt=$system.SQL.Functions.DATEADD("s",unixEpochFormat,"1970-01-01 00:00:00")
set pResponse.AreaPublicTime=dt
```
Since HTTP responses from external sites are returned in JSON format, the stream that could be obtained from the HTTP response is used to convert it into a dynamic object that is convenient for JSON operations within IRIS.
```objectscript
set weatherinfo={}.%FromJSON(tHttpResponse.Data)
```
An example of a returned JSON string is shown below:
```json
{
"coord": {
"lon": 135.5022,
"lat": 34.6937
},
"weather": [
{
"id": 803,
"main": "Clouds",
"description": "broken clouds",
"icon": "04d"
}
],
"base": "stations",
"main": {
"temp": 11.38,
"feels_like": 8.33,
"temp_min": 11,
"temp_max": 12.22,
"pressure": 1007,
"humidity": 62
},
"visibility": 10000,
"wind": {
"speed": 2.57,
"deg": 220
},
"clouds": {
"all": 75
},
"dt": 1611820991,
"sys": {
"type": 1,
"id": 8032,
"country": "JP",
"sunrise": 1611784750,
"sunset": 1611822143
},
"timezone": 32400,
"id": 1853909,
"name": "Osaka",
"cod": 200
}
```
The maximum temperature, minimum temperature, and weather can be obtained as follows:
```objectscript
set pResponse.AreaDescription=weatherinfo.weather.%Get(0).description
set pResponse.KionMax=weatherinfo.main."temp_max"
set pResponse.KionMin=weatherinfo.main."temp_min"
```
If you would like to learn more about JSON manipulation in IRIS, please refer to this article and documentation.
Now, let’s use the production testing tool to see if we can get the weather information properly.
Open the Production page (**Management Portal> Interoperability> Configuration> Production**), click Start.GetKionOperation, and then click the **"Test" button** on the "**Action**" tab.
Specify a city name (Naha, Sapporo, Nagano, Shinjuku, etc.) for **Area**, and click the “**Run Test Service**” button.
You can see the test results below, with the maximum and minimum temperatures and the weather listed.

Continue to learn how to use the Trace page.

Selecting a horizontal rectangle such as  in the left screen causes the information, in the right screen, to change.
Messages sent and received during the system integration process are automatically saved in the database. Using the message Visual Trace page, you can see in detail what messages were passed to which components in chronological order and whether there was a response or not.
Besides, if an error occurs,
“An error occurred while sending/receiving/receiving □ message to the component from ○ to △.”
a red mark will appear where the error occurred so that you can see it. Of course, in addition to tracing, we also have an event log page.
**(Management Portal > [Interoperability] > [View] > [Event Log])**
Moving on, let’s check out the operation to request an update to the database.
#### 1)-2 Business operations that request updates to the database
The sample provides two types of operations: Start.SQLInsertOperation and Start.InsertOperation.
Each of them is an operation to request a database update, but Start.SQLInsertOperation uses the SQL outbound adapter, while Start.InsertOperation has no adapter.
The difference between the two is,
operation using the SQL outbound adapter is assumed to be accessed via ODBC/JDBC connections so that the database connection destination can be switched in the production settings.
For operations that do not use adapters, it is assumed that the DB update target is a database within the range of visibility from the production configuration and that no connection destination switching occurs.
The IRIS database can be used to store arbitrary data during system integration. However, suppose the system configuration changes for some reason a few years later, and the need to connect to a database on a different server arises. In that case, the operation without the adapter cannot be continued.
On the other hand, operations using the SQL outbound adapter can be operated if there are no changes processing the content of the destination specification (if there is no problem with the SQL statement to be executed, it can be connected to databases of different products).
During system integration, there may be cases where connection information changes due to external system reasons. Therefore it is vital to have a design that can flexibly respond to changes. For this reason, it is recommended to create components that support external connections in a loosely coupled manner.
However, suppose there is no change in the configuration in the future. In that case, you can access the database in IRIS without using the ODBC/JDBC connection, so you can choose to use the adapter or not, depending on your usage.
Let’s take a look at the Start.SQLInsertOperation code that uses the adapter.
The adapter used in the sample is an SQL outbound adapter, which allows you to request the database to execute SQL statements.
Different adapters provide different methods. Please refer to the documentation for details on the methods provided by the adapters.

Then review the code for Start.InsertOperation, without using the adapter.
Whether you use an adapter or not, the message map and method definitions for the operation are required. If you do not use an adapter, you do not need to define the “Paramter” and “Property” for the adapter.
.png)
Business operations without adapters: In Start.InsertOperation, SQL is executed using ObjectScript (the comment statement is the update process in object operations).
The implementation is satisfactory if the database to be updated is not detached from IRIS.
We found out that operations using adapters provide a reliable method to request processing from the destination. We also confirmed that it is possible to create operations without using adapters and freely write code for them.
Next, I would like to explain how to create a business process that calls the operations for getting weather information and updating the database in the correct order.
Article
Evgeny Shvarov · Feb 9, 2021
Hi developers!
Recently we announced the preview of Embedded Python technology in InterSystems IRIS.
Check the Sneak Peak video by @Robert.Kuszewski.
Embedded python gives the option to load and run python code in the InterSystems IRIS server. You can either use library modules from Python pip, like numpy, pandas, etc, or you can write your own python modules in the form of standalone py files.
So once you are happy with the development phase of the IRIS Embedded Python solution there is another very important question of how the solution could be deployed.
One of the options you can consider is using the ZPM Package manager which is described in this article.
I want to introduce you a template repository that introduces a deployable ZPM module and shows how to build such a module.
The example is very simple and it contains one sample.py, that demonstrates the usage of pandas and NumPy python libs and the test.cls objectscript class that makes calls to it.
The solution could be installed with ZPM as:
zpm "install iris-python-template"
NB: Make sure the IRIS you install the module contains an Embedded Python preview code. E.g. you can use the image:
intersystemsdc/iris-ml-community:2020.3.0.302.0-zpm
With commands:
docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/iris-ml-community:2020.3.0.302.0-zpm
docker exec -it my-iris iris session IRIS
USER>zpm "install iris-python-template"
[iris-python-template] Reload START
...
[iris-python-template] Activate SUCCESS
The module installs sample.py python file and titanic.csv sample file along with test.cls to the system.
E.g. sample.py exposes meanage() function which accepts the csv file path and calculates the mean value using numpy and pandas llibraries.
test.cls objectscript class loads the python module with the following line code:
set tt=##class(%SYS.Python).Import("sample")
then provides the path to csv file and collects the result of the function.
Here is how you can test the installed module:
USER>d ##class(dc.python.test).Today()
2021-02-09
USER>d ##class(dc.python.test).TitanicMeanAge()
mean age=29.69911764705882
USER>
OK! Next, is how to deploy Embedded Python modules?
You can add the following line to module.xml:
<FileCopy Name="python/" Target="${mgrdir}python/"/>
the line copies all python files from the python folder of the repository to the python folder inside /mgr folder of IRIS installation.
This lets the python modules then be imported from ObjectScript via ##class(%SYS.Python).Import() method.
Also if you want the data files to be packed into the ZPM module check another FileCopy line in the module that imports the data folder from the repository along with titanic.csv into the package:
<FileCopy Name="data/" Target="${mgrdir}data/"/>
this is it!
Feel free to use the template as a foundation for your projects with Embedded Python for IRIS!
Any questions and comments are appreciated! Hi Evgeny!
I tried embedded Python in my multi model contest app but used an ugly approach to deploy Python code. I didn't realize that ZPM could do this for me... Nice tip! Thanks, Jose!
Yes, indeed ZPM option of delivering files to a target IRIS installation looks elegant and robust. Maybe it could be used not only for Embedded python but e.g. for jar-files delivery and data. @Yuri.Gomes, what do you think? Nice option! OK. I did node.js, @Yuri.Gomes Java is yours. A suggestion is allows ZPM to copy from a HTTP URL like a github address.
Announcement
Benjamin De Boe · Oct 19, 2020
Preview releases are now available for the 2020.4 version of InterSystems IRIS, IRIS for Health and IRIS Studio. As this is a preview release, we are eager to learn from your experiences with this new release ahead of its General Availability next month.InterSystems IRIS Data Platform 2020.4 makes it even easier to develop, deploy and manage augmented applications and business processes that bridge data and application silos. It has many new capabilities including:
Enhancements for application and interface developers, including:
Support for Java SE 11 LTS, both when using Oracle OpenJDK and AdoptOpenJDK
Support for Connection Pooling for JDBC
A new "foreach" action in routing rules for segmented virtual documents
Enhancements for database and system administrators, including:
ICM now supports deploying System Alerting and Monitoring (SAM) and InterSystems API Manager (IAM)
Extensions to our SQL syntax for common administrative tasks
Simplified deployment for InterSystems Reports
InterSystems IRIS for Health 2020.4 includes all of the enhancements of InterSystems IRIS. In addition, this release includes
Enhanced FHIR support, including support for FHIR profiles
Support for the RMD IHE profile
DataGate support in the HL7 Migration Tooling
More details on these features can be found in the product documentation:
InterSystems IRIS 2020.4 documentation and release notes
InterSystems IRIS for Health 2020.4 documentation and release notes
As this is a CD release, it is only available in OCI (Open Container Initiative) a.k.a. Docker container format. Container images are available for OCI compliant run-time engines for Linux x86-64 and Linux ARM64, as detailed in the Supported Platforms document.
Container images for the Enterprise Edition and all corresponding components are available from the InterSystems Container Registry using the following commands:
docker pull containers.intersystems.com/intersystems/iris:2020.4.0.524.0
docker pull containers.intersystems.com/intersystems/irishealth:2020.4.0.524.0
For a full list of the available images, please refer to the ICR documentation.
Container images for the Community Edition can also be pulled from the Docker store using the following commands:
docker pull store/intersystems/iris-community:2020.4.0.524.0
docker pull store/intersystems/iris-community-arm64:2020.4.0.524.0
docker pull store/intersystems/irishealth-community:2020.4.0.524.0
docker pull store/intersystems/irishealth-community-arm64:2020.4.0.524.0
Alternatively, tarball versions of all container images are available via the WRC's preview download site.
InterSystems IRIS Studio 2020.4 is a standalone development image supported on Microsoft Windows. It works with InterSystems IRIS and IRIS for Health version 2020.4 and below, as well as with Caché and Ensemble. It can be downloaded via the WRC's preview download site.
The build number for this preview release is 2020.4.0.524.0 (updated from 2020.4.0.521.0 on Nov 2nd) And we updated the images with ZPM 0.2.7 too:
intersystemsdc/iris-community:2020.3.0.221.0-zpm
intersystemsdc/iris-community:2020.4.0.524.0-zpm
intersystemsdc/iris-ml-community:2020.3.0.302.0-zpm
intersystemsdc/irishealth-community:2020.3.0.221.0-zpm
intersystemsdc/irishealth-community:2020.4.0.524.0-zpm
intersystemsdc/iris-community-arm64:2020.4.0.524.0-zpm
intersystemsdc/irishealth-community-arm64:2020.4.0.524.0-zpm
And to launch IRIS do:
docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/iris-community:2020.3.0.221.0-zpm
docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/iris-community:2020.4.0.524.0-zpm
docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/iris-ml-community:2020.3.0.302.0-zpm
docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/irishealth-community:2020.3.0.221.0-zpm
docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/irishealth-community:2020.4.0.524.0-zpm
docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/iris-community-arm64:2020.4.0.524.0-zpm
docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/irishealth-community-arm64:2020.4.0.524.0-zpm
And for terminal do:
docker exec -it my-iris iris session IRIS
and to start the control panel:
http://localhost:9092/csp/sys/UtilHome.csp
To stop and destroy container do:
docker stop my-iris Hi,
SuperServer port since 2020.3 is 1972 :
docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/iris-community:2020.3.0.221.0-zpm
docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/iris-community:2020.4.0.521.0-zpm
docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/irishealth-community:2020.3.0.221.0-zpm
docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/irishealth-community:2020.4.0.521.0-zpm Thanks again, Guillaume!
fixed! Thank's for this! UPDATE: We uploaded an updated version of our 2020.4 preview release, including a small number of additional enhancements in the broader SQL area that missed the boat for the scheduled preview release date. These features meet the quality requirements for inclusion in the GA release later this month so we thought it was worthwhile sharing them in preview mode for users to try ahead of time.
The new build number is 524, up from 521. The new images have been posted on the ICR, Docker Store and WRC locations as described above and the docker pull scripts have been updated.
As always, we're looking forward to your feedback! ZPM images are updated with a new IRIS 2020.4.0.524.0 build. Hi -
Note that using the ZPM images to build a HealthShare Foundation namespace (interoperability enabled database and namespace), using the HealthShare -> Installer wizard -> Configure Foundation ; .
OR you can try this, using this line:
ZN "HSLIB"DO ##class(HS.HC.Util.Installer).InstallFoundation("MYNAMESPACE")
will hang mid-way.
However, above operations complete successfully using the standard, non-ZPM enhanced builds.I haven't tested any other functionality.
Steve Thanks, Steve! Just to clarify: this issue is related to ZPM-enabled IRIS for Health images, right? Filed the issue. yes
Just tested on 2020.4 zpm enabled:
HSLIB>DO ##class(HS.HC.Util.Installer).InstallFoundation("HSFOUNDATION")
HS.Util.Installer.Foundation:Install User 'irisowner' has %Admin_Manage:USE privilege
HS.Util.Installer.Foundation:Install tComponent Foundation = HSFOUNDATION
HS.Util.Installer.Foundation:Install About to Create Database HSFOUNDATION
HS.Util.Installer.Foundation:Install Create IRIS.DAT in HSFOUNDATION
HS.Util.Installer.Foundation:Install Made Namespace HSFOUNDATION
HS.HC.Util.Installer:EnableEnsemble Created Ensemble Mappings
HS.HC.Util.Installer:EnableEnsemble Configuration Loaded
HS.HC.Util.Installer:EnableEnsemble Compiling Ensemble DeepSee Dashboard
HS.HC.Util.Installer:EnableEnsemble Ensemble Enabled
HS.Util.Installer.Foundation:SecureInstall Added Package mappings HS,HSMOD,SchemaMap
HS.Util.Installer.Foundation:SecureInstall Added include mappings HSMOD.*,SchemaMap*
HS.Util.Installer.Foundation:Install Created Portal CSP app
HS.Util.Installer.Foundation:CreateProduction Compiled template HSFOUNDATIONPKG.FoundationProduction
HS.Util.Installer.Foundation:AdditionalSetup Set Credential HS_Services
Running HS.Util.Installer.Kit.PostInstall.SetupOIDRegistry:RunHub(HSFOUNDATION)
Ran HS.Util.Installer.Kit.PostInstall.SetupOIDRegistry:RunHub with status OK
Running HS.Util.Installer.Kit.PostInstall.AssignAuthTypes:RunHub(HSFOUNDATION)
Ran HS.Util.Installer.Kit.PostInstall.AssignAuthTypes:RunHub with status OK
HS.Util.Installer.Foundation:SecureInstall Recompiled XML extension classesSaving hl7.fhir.r3.core@3.0.2
Saving hl7.fhir.r4.core@4.0.1
Saving hl7.fhir.us.core@3.1.0
Load Resources: hl7.fhir.r3.core@3.0.2
Load Resources: hl7.fhir.r4.core@4.0.1
Resource Used in Multiple Packages: http://healthit.gov/nhin/purposeofuse|2.0(hl7.fhir.r3.core@3.0.2,hl7.fhir.r4.core@4.0.1)
Resource Used in Multiple Packages: http://dicom.nema.org/resources/ontology/DCM|01(hl7.fhir.r3.core@3.0.2,hl7.fhir.r4.core@4.0.1)
Load Resources: hl7.fhir.us.core@3.1.0
HS.FHIRServer.Installer:InstallNamespace Created FHIR web application
HS.FHIRServer.Installer:InstallNamespace Created FHIR API web application
Load of directory started on 11/04/2020 08:59:25
Loading file /usr/irissys/dev/fhir/gbl/XFReferenceField.xml as xml
Imported global: ^HS.XF.ReferenceField
Loading file /usr/irissys/dev/fhir/gbl/XFTransform.xml as xml
Imported global: ^HS.XF.Transform
Loading file /usr/irissys/dev/fhir/gbl/XFValueSet.xml as xml
Imported global: ^HS.XF.ValueSet
Loading file /usr/irissys/dev/fhir/gbl/XFConfig.xml as xml
Imported global: ^HS.XF.Config
Loading file /usr/irissys/dev/fhir/gbl/XFReferenceType.xml as xml
Imported global: ^HS.XF.ReferenceType
Load finished successfully.
HS.Util.Installer.Foundation:SecureInstall Install HSFOUNDATION done at 2020-11-04 08:59:26
HSLIB>w $zv
IRIS for UNIX (Ubuntu Server LTS for x86-64 Containers) 2020.4 (Build 524U) Thu Oct 22 2020 13:04:25 EDT
HSLIB>zpm
zpm: HSLIB>version
%SYS> zpm 0.2.8
Locally installed zpm-registry not found
https://pm.community.intersystems.com - 0.0.2
zpm: HSLIB>
It works. I guess the issue is with your docker, it could run out of resources.
@Steve.Pisani, if you perform docker cleanup (it's safe):
docker system prune -f
and test again? Another idea - your docker just doesn't have enough resources for this. I have 6GB memory and 200G space. well that sucks....
docker system prune -fDeleted Containers:98a246148a9bbe5dd84ca435368dcc072173660320c7b3198788d135bb4a17bbd53fcde88168b084928bda0a95daecfa08661efcdf5e04b875e75b9c45f373c154e4d30989a7b94a828d8e554acf6ad6caa9ca74928b28db011bfc30148cfe6842f1432d7f62bbd0b6a9f8c4dc6e1e74fb9d6717c3c45b8a53d4228506cf4599
then re-running .. worked...
That may seem a great outcome to some, but, this un-predictability or, failure to report what the issue is (remember, the issue manifested in an IRIS process hanging), is not ideal. Also - I did try with non-ZPM containers successfully multiple times, whilst I was getting the issue, just to ensure, the issue was with only the zpm ones. It worked fine every time with non-ZPM containers.
Steve Just to clarify again - these types of issues are not related to ZPM anyhow.
But yes - this happens with docker sometimes, it's a "dark side" of docker-way of software development ;) If something doesn't work without a reason every time I do the following:
1) build without cache:
docker-compose build --no-cache
2) clean up docker:
docker system prune -f
In a lot of cases, this helps.
And maybe it's a trigger for us to make docker images smaller, @Steven.LeBlanc , @Luca.Ravazzolo ?
Another approach is not having docker locally at all - e.g. Github Codespaces very promising way forward, you code in a browser and use Github's docker infrastructure (which is endless?). yes - I can't expect it was related to ZPM, but definitely seemed that way when it was the only image that didn't work in that state.
Warning I guess for others reading this thread:
docker system prune -f
Did remove 3 containers I had created, run and stopped on my system (but was planning to get back to them and start them again).
thanks for now.. Yes, it removes not used/stopped containers, but usually, it's safe: I hope you don't store anything important in a container. Hi Benjamin, does 2020.4 include Ebedded Python ? No, that capability is projected for official release with 2021.1.
Please reach out to @Robert.Kuszewski if you are interested in joining an expert panel or join this Discord channel for the latest on our Python support. And they carry ZPM 0.2.8, see the release notes. added the line for IntegratedML image with ZPM:
intersystemsdc/iris-ml-community:2020.3.0.302.0-zpm ARM images with ZPM added:
intersystemsdc/iris-community-arm64:2020.4.0.524.0-zpm
intersystemsdc/irishealth-community-arm64:2020.4.0.524.0-zpm
The reply is updated accordingly We greatly appreciate the support for FHIR packages in 2020.4. We have encountered issues with long FHIR package names, however; it seems as though MAXLENs of strings are a little short in HS.FHIRMeta.Storage.Package. Does it make sense to report such issues with a preview edition somewhere? If so, I am happy to provide details on it. Only now will I be able to enjoy this wonder. I was very much looking forward to this. I hope that there is no very drastic change and that it forces me to change something. I would like to know which channels can get the trial version? I look forward to migrating and starting using this new version. Although, I already know that it got even better. Thank you!
Announcement
Janine Perkins · Nov 4, 2020
Get your hands on our technology with On-Demand Experience Labs available now through November 6th. Each lab is paired with an office hour session scheduled for this week. Learn more about how you can get hands-on with our technology.
Join the office hours to get answers your questions about the labs, talk about how the technology fits into your environment, and discuss implementation. Sign up for the Office Hours/On-Demand Experience Labs today. The labs have gotten great reviews so far!
Experience Lab Topics
InterSystems ObjectScript Development in Visual Studio Code
HealthShare Provider Directory: Sharing Clean Provider Data with FHIR
Getting Started with InterSystems Reports
Please complete the on-demand labs before arriving for office hours.
Article
Mihoko Iijima · Mar 5, 2021
**This article is a continuation of this post.**
In the previous article, we discussed the development of business processes, which are part of the components required for system integration and serve as a production coordinator.
This article will discuss creating a business service, which is the information input window for production.
* Production
* Message
* **Components**
* **Business services**
* Business processes(previous post)
* Business operation
And finally, the last component of “Let's Use Interoperability!”
The business service provides a window of input for information sent from outside IRIS, with or without using the adapter for external I/F.
There are three types of business services in the sample (links in parentheses are links to the sample code):
1. [Business services for files using inbound adapters](#fileinboundadapter)(Start.FileBS)
2. [Business services for Web services using the SOAP inbound adapter](#soapinboundadapter)(Start.WS.WebServiceBS)
3. [Business service called by stored procedure or REST without using an adapter](#nonadapter)(Start.NonAdapterBS)
Different connection methods used for inputting information will only increase the number of business services; however, the processing done within a business service is
Create a request message to be sentusing externally inputted information and simply call the business component
It's effortless.
Now, let's outline how to create components that use file-inbound adapters.
Business services are written in scripts, which can be created in VSCode or Studio (see this article on using VSCode).
### 1. Business services for files using inbound adapters(Start.FileBS)
If you create a class in VSCode, you should create a class that inherits from Ens.BusinessService. As for adapters, you can use the **ADAPTER** parameter as ADAPTER class name (e.g., specify a file-inbound adapter class).
If you do not use the adapter, no configuration is required.
```objectscript
Class Start.FileBS Extends Ens.BusinessService
{
Parameter ADAPTER = "EnsLib.File.InboundAdapter";
```
In the file-inbound adapter, you can specify the directory to be monitored in Settings→File Path for the production's business service.

If the file located in the "File Path" matches the information specified in the "File Spec," it opens the file as a stream object. It defines it as the first variable when calling the business service **ProcessInput()**.
When **ProcessInput()** is started, **OnProcessInput()** is automatically called. OnProcessInput() is passed directly to **OnProcessInput()** with the parameters passed to ProcessInput().

In **OnProcessInput()** the initial statement gets the information from the file stream object, which is passed as the first parameter, then creates a message to be given to the next component, writes the process of calling the next component, and completes the basic logic.
* * *
【Memo】For Studio, launch the Business Services Wizard in the New Creation menu, select the adapter and press the Finish button.
* * *
The **OnProcessInput()** method definition is as follows:
```objectscript
Method OnProcessInput(pInput As %Stream.Object, Output pOutput As %RegisteredObject) As %Status
```
**pInput** is provided with an instance of the **%Stream.FileCharacter** class for text files or the **%Stream.FileBinary** class for binary files.
In the sample, a file in text format will be inputted, and we have written it to accept multi-line requests and one request per line.
**AtEnd property** is set to 1 when EndOfFile is deteced. You can use this property to stop loop.
In a loop, we read the lines using the **ReadLine()** method, which enables us to obtain information about the contents of the file one line at a time (see the documentation for file adapter details).
Compose the message, retrieving information line by line. Then, we execute the ..SendRequestAsync() method, which calls the other components.
When executing the method, the first parameter should be the name of the component you want to call as a string, and the second parameter should be the request message you have created.
Note that the ..SendRequestAsync() is an asynchronous call and does not wait for a response.
Memo:There is also SendRequestSync() for synchronous calls.。
The sample code is as follows:

Reference:explanation of the usage of the $piece() function in the above example text
$piece(“string”, ”delimiter mark”, ”position number”)
The function to set/get a string with a delimiter, in the sample, to get the first and second value of comma-separated data, is written with the following syntax:
```objectscript
set request.Product=$piece(record,",",1)
set request.Area=$piece(record,",",2)
```
Now, let's check the function of Start.FileBS as it appeared in the above description.
In the sample production, the "File Path" was set to **/irisdev/src**, and the "File Spec" was set to **check.txt**. Either prepare the same directory or change it to a different directory and register the sample data in the check.txt file using the following format: purchased product name, name of the city.
※If you are using the sample container, please rename [Test-check.txt] in the src directory under the directory created by the git clone.


### 2. Business services for Web services using the SOAP inbound adapter (Start.WS.WebServiceBS)
Next, we will outline the creation of business services for Web services.
The Business Service Class for Web Services acts as a Web Service Provider = Web Service Server.
In the sample, we have two parameters in the Web service method for this sample production to have information sent from the Web service client. The web method uses the data entered in the parameters to create a message class and call other components.

When you define a Web service class, a test screen is created. However, it is not shown by default.
Log in to IRIS (or start a terminal), go to the namespace where the production is located and do the following:
For your reference:Access to the Catalog and Test Pages
Here is a sample code configuration in the setting where the container was started with docker-compose up -d (run in the %SYS namespace)
set $namespace="%SYS"
set ^SYS("Security","CSP","AllowClass","/csp/user/","%SOAP.WebServiceInfo")=1
set ^SYS("Security","CSP","AllowClass","/csp/user/","%SOAP.WebServiceInvoke")=1
【Attention】Please note that the sentence is case-sensitive and should be written with care. Also, depending on the namespace in which the product is used, the specified script changes. The example sentence is written on the assumption that the sample is imported into the USER namespace.If you import the sample code into the ABC namespace, the fourth subscript should be "/csp/abc/."
Once the configuration is complete, go to the following URL:
http://localhost:52773/csp/user/Start.WS.WebServiceBS.cls

If you want to provide the WSDL to your Web services client, specify WSDL=1 at the end of the following URL
http://localhost:52773/csp/user/Start.WS.WebServiceBS.cls?WSDL
### 3. Business services called by stored procedures or REST without using adapters(Start.NonAdapterBS)
Next, we will introduce the Business Service without adapters (Start.NonAdapterBS).

For business services that use adapters, the adapter calls the business service's ProcessInput() method to detect the information.
If you don't use adapters, you can still call the ProcessInput() method, but this method is not public. Therefore, if you implement a business service that does not use adapters, you will need to consider ProcessInput().
The sample utilizes the following two methods:
* Stored procedures(Start.Utils)
* Dispatch Class for REST(Start.REST)→This is the service we ran in this article.
Now, here's an example of a stored procedure.

After adding a business service (Start.NonAdapterBS) that does not use adapters to the production (state added in the sample), run the following stored procedure
call Start.Utils_CallProduction('piroshki','Russia')

A resulting trace of the running result is as follows:

Next, here is an example of creating a dispatch class for REST:

The XML described in the XData Url Map defines which methods are called in response to the URL at the time of the REST call.
The example describes a definition that calls the **WeatherCheck()** method when the URL of the **/weather/first parameter (purchased product name)/ second parameter (name of the city)** are provided in the **GET request**.
```objectscript
```
Then, define the base URL for the above URL in the Management Portal's Web Application Path Settings screen, and it is complete.
See this article for more details on the configuration.
Once it is ready, try to run the information using a business service that allows you to send the REST information.
Example)http://localhost:52773/start/weather/Takoyaki/Osaka


If you do not use an adapter, as ProcessInput() cannot be called directly from outside, we have created an object for the business service in the logic executed through REST or stored procedures (using the CreateBusinessService() method of the Ens.Director class) and called ProcessInput()
If you use an adapter, the adapter detects the input and stores the information in a unique object and passes it to the business service. In contrast, if you don't use an adapter, the rest is pretty much the same, only the difference is in the above-mentioned part of the process.
The business service is simply designed to use the information entered outside IRIS to create request messages and call business components.
Throughout the sample production, we were able to see the following:
Different components play different roles in making a production run (business services, business processes, business operations).
To transmit information between components, use the message.
Messages are stored in the database unless deleted and thus can be traced at any time.
Some adapters simplify the process of around the connection.
These are the basic operations on how to use Interoperability in IRIS.
There are also record maps (see: FAQ TOPIC) and data conversion tools that are useful for input and output of CSV files and other format-specific files.
As well as this series, there is also an article on simple IoT applications developed with InterSystems IRIS using Interoperability. Please check it out.
Besides, IRIS for Health also supports FHIR and HL7 (including SS-MIX2) transmissions.
I would be pleased to explain it in another post. If you have something of interest to share, please leave a comment!
Finally, training courses are also available to learn how to use Interoperability.
If you'd like to take the time to try it out with an instructor, please consider joining one of our training courses!
Announcement
Anastasia Dyubaylo · Dec 12, 2020
Hey Developers,
Please welcome the new video by @Ron.Sweeney1582 on InterSystems Developers YouTube:
⏯ InterSystems IRIS Native Python API in AWS Lambda
In this video, you will learn the seamless InterSystems IRIS functionality in the AWS Serverless ecosystem.
Leave your questions in the comments to this post.
Enjoy and stay tuned!
Announcement
Olga Zavrazhnova · Dec 14, 2020
Hi Developers,
We invite you to take a few minutes and leave a review about your experience with InterSystems IRIS on the TrustRadius. Submitting a review requires time and effort, so we'll be glad to reward you with a $25 VISA Gift Card for a published review! UPDATE: this promotion ended in 2021.
To get a $25 VISA card from InterSystems follow these steps:
✅ #1: Follow → this link ← to submit a review (click on the "Start My Review" button).
✅ #2: Your review will have a title (headline). Copy the text of the headline of your review and paste it in this challenge on Global Masters.
✅ #3: After your review is published you will get the $25 VISA Cards and 3000 points on Global Masters.
Please note:
TrustRadius must approve the survey to qualify for the gift card. TrustRadius will not approve reviews from resellers, systems integrators, or MSP/ISV’s of InterSystems.
TrustRadius does not approve the reviews that have been previously published online.
Done? Awesome! Your gift card is on the way!
Hmm. The link to GM says:
Ooops!
Sorry friend, looks like this challenge is no longer available.
My title: " Never say IMPOSSIBLE with IRIS "
Hi Robert, thank you for submitting a review for us! I made some corrections to the challenge, so the link should work for you now. THX. Just verified it. Hi, the GM link is broken. It says:
Ooops!
Sorry friend, looks like this challenge is no longer available. here it is:https://www.trustradius.com/reviews/intersystems-iris-2020-12-15-16-53-48 Hi Akshay,I see you registered recently - welcome to Global Masters! Could you please complete this challenge first? After it's done the TrustRadius challenge will be unlocked for you. Thank you, Robert! Your gift card is already opened for you on GM Thanks for your help. Here's the published review! https://www.trustradius.com/reviews/intersystems-iris-2020-12-23-14-00-04 Hi Akshay! So great, thank you! Your reward is opened for you on Global Masters. Happy New Year! There seems to be some error. I clicked on Redeem, and my card just disappeared. It is not showing in the Rewards section either! That's the way it works. You consume it once.You'll get a mail once processed. But probably not this year Ah no issues, I'll wait until next year. I've got nothing but time. Thanks though!! I can't see any challenges... What do I do now? Great Unable to paste in challenge on Global Master
Announcement
Anastasia Dyubaylo · Jan 20, 2021
Hi Community,
We are pleased to invite you to the upcoming webinar in Spanish:
➡️ Developing a chatbot with Google Dialogflow, Telegram and InterSystems IRIS
Date & Time: February 2, 4:00 PM (CET)
During the webinar:
you will learn how to develop a chatbot that will permit users to interact with an appointment system. We will coordinate the appointment system's backend and the Google Dialogflow and Telegram services with InterSystems IRIS.
you will know how to consider adding a chatbot to help users to use your services in a smarter way.
we will go over the required concepts to implement a chatbot, what is needed and how you can coordinate the external services.
Speaker: @Alberto.Fuentes, Sales Engineer, InterSystems Iberia
Note: The language of the webinar is Spanish.
We are waiting for you at our webinar!
➡️ Please register here!
Article
Botai Zhang · Jan 25, 2021
Built in multi model integration using InterSystems iris data platform
Solution of hospital information inquiry business
Integration of hospital information query business solutions using InterSystems IRIS data platform with built-in multiple models
### Summary:
With the gradual improvement of hospital information construction, there are more and more hospital subsystems, and more and more interfaces between systems. At the same time, the interface cost is increasing, and the management work is becoming more and more complex. Among them, the number of query business interfaces is gradually increasing according to the business type differentiation, which brings problems such as large amount of interfaces, heavy development work, code redundancy, difficult maintenance and so on. In view of this dilemma, we use InterSystems IRIS data platform built-in multi model integration of hospital information query business solutions. The application can be configured to complete the query business interface implementation, greatly reducing the key operation cycle of development, maintenance, implementation and other projects.Key applications: IRIS, Rest API, ObjectScript, Globals, SQL, data lookup tables
### Application model and Application Introduction:
1. Using the model 1. Globals (key-value) Globals is a sparse multidimensional array that can be stored and managed in IRIS database. You can use ObjectScript and native APIs to work with globals. **Tools:** https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GGBL_MANAGING **Application:** According to the key value pair of globals, the application program has the characteristics of fast access speed. It is applied in the rest dispatch class and BP process management of this program, which solves the problem of frequent value taking, slow speed and configuration operation on the front page of the lookup table, such as storing SQL model, service configuration information and so on. 2. SQL access InterSystems iris provides SQL access to data through ObjectScript, rest API and JDBC **Tools:** https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=GSQL_smp **Application:** In the query business, the three-party system does not cooperate with the interface transformation, which leads to the difficulty of interface implementation. At this time, we use iris embedded model ObjectScript, rest API and JDBC to realize SQL access to data and establish business interface. 3. Object access Through ObjectScript and rest API, InterSystems iris provides a way to store and change object instances in globals. **File:** https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=PAGE_multimodel_object **Application:** During the whole interaction process, the InterSystems iris object is manipulated directly. ObjectScript class definitions are often used as templates for creating objects such as patients, departments, or healthcare workers. 2. Establish application cases (this application takes patients as an example) 1. application construction: 1. basic environment Iris version information: iris for windows (x86-64) 2020.1 (build 215u) mon Mar 30 2020 20:14:33 EDT \[Health Connect:2.1.0] Iris has java and JDBC environment Postman can be used for testing 2. installation steps ① Establish rest Service New web application → configure dispatch class → configure permission. This step can be seen in the following pictures: application running / webreplication (query). PNG and webreplication (role). PNG ② Configure sql-jdbc Establish SQL connection, connect to test database mysql, import test jhip_ patient_ info.sql ③ Configuration lookup table Global-^ Ens.LookupTable Look up table file import in ④ Import code Import the code in applicationcode, compile and open production, Note: modify Bo configuration information (DNS), configure Java gateway, etc 2. application process Omitted (see PDF) 3. Application Test The postman tool (or other tools) can be used for test verification Postman can import Query.postman_ collection.json , change IP, port number information and URL for testing. 4. application summary This application takes patient service query as a case, which can be configured with inbound and outbound protocols, query conditions and business types to solve the problem of query business interface.
Finally, if you agree with this solution, please vote for the application in the inter systems multi model database contest.
Voting links
Application name:HealthInfoQueryLayer
Thank you very much for your support!
Announcement
Shane Nowack · Apr 11, 2022
Get certified on InterSystems CCR!
Hello Community,
After beta testing the new CCR Technical Implementation Specialist exam, the Certification Team of InterSystems Learning Services has performed the necessary calibration and adjustments to release it to our community. It is now ready for purchase and scheduling in the InterSystems certification exam catalog. Potential candidates can review the exam topics and the practice questions to help orient them to exam question approaches and content. Passing the exam allows you to claim an electronic certification badge that can be embedded in social media accounts such as Linkedin.
If you are new to InterSystems Certification, please review our program pages that include information on taking exams, exam policies, FAQ and more. Also, check out our Organizational Certification that can help your organization access valuable business opportunities and establish your organization as a solid provider of InterSystems solutions in our marketplace.
The Certification Team of InterSystems Learning Services is excited about this new exam and we are also looking forward to working with you to create new certifications that can help you advance your career. We are always open to ideas and suggestions at certification@intersystems.com.
One final note: The Certification Team will be proctoring free certification exams ($150 value) at Global Summit 2022. All of the products in our exam catalog will be available. The summit will be in Seattle, WA from June 20-23. All individuals registered for the Summit will be eligible for one free certification exam (that must be taken during the Summit at one of the live proctoring sessions).
Looking forward to celebrating your success,
Shane Nowack - Certification Exam Developer, InterSystems @Shane.Nowack - thank you for this tremendous news!! A hearty congratulations to you and to everyone who helped to get to this moment of full certification exam launch!
@Evgeny.Shvarov / @DC.Administration - Does the D.C. provide a way to display / share InterSystems Professional Certifications in a member's profile? If so I would love to see the instructions, and if not then perhaps we could consider it an enhancement request?
A second request would be to see a list of everyone who has publicly listed a specific certification (e.g. a catalog of experts). Has any thought been put into that? @Evgeny.Shvarov / @DC.Administration - THANK YOU for the feature that allows you to display your professional certifications in your profile, as well as the check-mark on your profile pic .... love it!
Has any thought been given to the second idea of being able to see a list of people who publicly listed a specific certification? That would make the experts more discoverable. Hi Ben,
Glad to hear you enjoyed our latest updates ;)
It seems worth implementing smth special to highlight the list of our certified members on one page.
p.s. To make your ideas more visible, feel free to submit them to our InterSystems Ideas portal. We constantly review ideas from this portal and try to follow the feedback of our users.
And thanks for your constant feedback and ideas!
Announcement
Angelo Bruno Braga · Apr 25, 2022
Hi Community,
Our 1st InterSystems Portuguese Tech Article Contest ended. We received several interesting content in: 6 amazing articles 🔥
A great thanks to all that participated on our competition !
And now it's time to announce the winners ....
Meet the winners of the 1st InterSystems Portuguese Tech Article Contest and their amazing articles:
⭐️ Expert Awards – winners selected by InterSystems experts:
🥇 1st place: Utilizando HealthShare para normalização de resultados de SARS-CoV-2/COVID-19 written by @Renan.Santos
🥈 2nd place: Introdução à análise de dados com IRIS e Pandas written by @Henry.HamonPereira
🥉 3rd place: HealthShare: criando o ecossistema de atendimento orientado a dados written by @Yuri Marx
⭐️ Community Award – winner selected by Community members, article with the most likes:
🎉 Winner: Utilizando HealthShare para normalização de resultados de SARS-CoV-2/COVID-19 written by @Renan.Santos
⭐️ And let's meet our new member who joined our competition:
@Julio.Esquerdo : 1 article 🤩
Wow! For their great contribution, we'd like to reward these authors with a 🎁 InterSystems Thermic Bottle 🎁!
⭐️ Let's congratulate all our heroes at the contest:
@Renan.Santos
@Henry.HamonPereira
@Yuri Marx
@Julio.Esquerdo
THANK YOU ALL! You have made an incredible contribution to our Dev Community!
P.S. The prizes are in production now. We will contact all the participants when they are ready to ship - stay in touch!
So,
Awesome our 1st InterSystems Portuguese Tech Article Contest, isn't it ?
Thanks to all the participants for the efforts you pay in our 1st InterSystems Portuguese Tech Article Contest!
And what's next.....?
Stay tuned !!!! 
Congratulations!! Congratulations to all of you!
I hope it's always helping the community! Congrats for all participants and thanks for this fantastic contest Congratulations to all of you! CONGRATULATIONS ALL!!!! 🎉
Question
Oleksandr Kyrylov · Mar 3, 2022
Hello dear community
I tried to run windows command from an intersystems terminal using objectscript routine.
routine :
Zpipe quit ; CPIPE example to run host console command
cmd(command="",test=0) ;
if command="" set command="dir"
quit $$execute(command,test) execute(cmd,test) Public {
set dev="|CPIPE|1"
set $zt="cls"
set empty=0
open dev:cmd:0
write:test $test,!
else write "pipe failed",! quit 0
while empty<3 {
use dev read line
set empty=$s($l(line):0,1:$i(empty))
use 0 write line,! ;;; or do any kind of analysis of the line
} cls ;
set $zt="" use 0
close dev
if $ze'["<ENDOFFILE>" w $ze,!
quit $t
}
In InterSystems terminal:
do cmd^pipe("cmd /c ""cd /d E:\repos\twilio-video-app-react && call npm run build""")
When i run the command directly in windows shell with admin privileges it works.
The routine runs the command without admin privileges and that causes error:
question:
Is there way to add admin privileges to intersystems?
Thanks! I believe the privilege comes from the OS user that is launching Terminal.
Have you tried running Terminal as an Admin and seeing if runs as expected?
Article
Evgeniy Potapov · Mar 22, 2022
Let's assume that we have already connected a data source to Adaptive Analytics, created a project and added tables there.
Now we will prepare Adaptive Analytics for work. First, we need to select data from tables, to make it available for the future report. To do this, we need to create dimensions from the columns of the tables. Dimensions are usually created to break down our data into categories, such as what city the user lives in, or what month a purchase was made in. However nothing prevents us from creating dimensions from numerical data so that we could apply functions to them in Intersystems Reports Designer.
The tool for creating dimensions is located on the right side of the interface as shown in the image below. To create a new dimension, right-click on the hamburger button located to the right of the "Filter" line and select a "Create Dimension" line as indicated in the picture.
The following window will appear:
After having created a dimension, you can make it hierarchical. To do that, double-click the left mouse button on the dimension in the left table and get into the hierarchy editor.
By clicking on the three dots next to the hierarchy, we can create a new dimension within the hierarchy. In the menu, the dimensions can be moved up / down the hierarchy. Thanks to hierarchies, we can make different levels of data details. For example, we can specify how many people have visited the site from the country, region, city.You can use dimensions to create relationships between tables. To do that, you need to drag the desired field of the table using the left mouse button and drop it in the desired highlighted dimension.. The link creation window will appear. Click Save, and our connection will be ready.
In addition to the actual data from the table, in Adaptive Analytics we can create measures based on various operations applied to a specific column. Measures are always a numerical display of data - number of users, amount of purchases, average time spent watching a video, etc.
To create a measure, we apply the same principle as for dimensions but using the "Measures" tab.
By clicking on the hamburger button and selecting "Add measure", we call the following window:
‘Measure name’ is the name that will be displayed in the Adaptive Analytics interface.
‘Query name’ is the name that will be displayed in the Intersystems Reports Designer. It is generated automatically based on the column name, but you can also set it yourself.
‘Description’ is the description visible in Adaptive Analytics.
'Sources' define from which table and which column to take data for the measure.‘Aggregation Handling’ shows which function we apply to the data. The list of functions can be found below. By default the "Sum" is selected as a value:
‘Data Handling and Formatting’ determines what will happen to the measure if it is used in conjunction with a dimension for which the measure is not defined. You should leave it by default.
‘Visibility in Published Data Sources’ specifies whether this measure will be available in Intersystems Reports Designer.
You can split measures by dimensions. For example, we have a measure that shows the average check, which we have calculated employing the data of a column with daily data for one year. If we distribute the measure over a dimension containing months, we will get the average check for each month.
To find out what is in your data connected to Adaptive Analytics, you can use the Cube Data Preview tool. You can get into it by clicking on the tab in the upper left corner of the workspace.
By specifying a dimension on one axis and a measure on the other, we get the measure value for each dimension value. In this case, below you can see the number of records in the table for each date.
Having created all the measures, dimensions and relationships that we needed, now we must publish our project. To do that, go to the main page of the project on the tab in the upper left corner and click the "Publish" button, then click the "Next" button on all windows which will appear.
Now we can start paying attention to the left window, where we have 2 sections: "Draft", where we can edit our project, and "Publish", which displays the published versions of the project. By clicking on the "Published project", select the cube, and go to its "Connect" tab. Here we can see all the necessary data to connect Intersystems Reports Designer to our project.
We have learned everything we need to work with Adaptive Analytics. Now we can move on to working in InterSystems Reports Designer.
I need to mention that Intersystems Reports Designer version 17.1 requires JDK version 16 to work, and it will not run on later versions.
First, you need to install drivers for the JDBC connection to Adaptive Analytics.
Here are the links to the required JAR files. The JDBC driver itself must be compatible with the one used on the server. We use versions that are old enough so that we do not get an error caused by the older version of the Hive on the server compared to ours. For convenience, we have collected all the necessary libraries in one archive, which you can download from the link:
https://github.com/teccod/Logi-JDBC-drivers
These files must be placed in the lib folder, located along the path LogiReport\Designer\lib.
Launch Intersystems Reports Designer and close the "Start" page. Now you can find yourself in the workspace of Intersystems Reports Designer. By default, it opens the last catalog with which the user was working or the pre-installed catalog that was installed with Intersystems Reports Designer.
Go to the "File" section and click "New Catalog"; fill in the name of the catalog, the name of the data source and the location where the file should be saved.
Intersystems Reports Designer creates an empty data source for us. Right-click on it and select "New JDBC connection".
In the "Driver" line we write our driver - org.apache.hive.jdbc.HiveDriver.
We take the URL from the JDBC field of the "Connect" tab in Adaptive Analytics and fill in the username and password.
The connection is established, but no cubes from the project have been loaded into it yet. Right-click on "Tables", then "Add tables" and select the desired cubes; add them with the "Add button", then press "Done" to complete the process. If the tables are not displayed when you select a data scheme different from the one that opens by default, use the "Refresh" button.
After adding everything that we needed, we have the dimensions and measures available in the project, and we can almost start creating a report.
In order to use the available data, we must make a request. In this request, we can impose the necessary restrictions on the data (do not show canceled orders, do not display data for the current month, etc.) and take only the part of the data that we need.
To create a query on the "Home" or "File" tab, select "New" and choose "Query". We pick the data source, fill in the query name, open our source, "Tables" and add the necessary tables to the query using the arrow.
We get into the query editor window:
There, by setting the necessary checkboxes or by checking the box next to the * field, select the necessary ones or all fields of the table. In the "Menu" item, we see several functions, the most interesting one of which is data filtering.
Here we can add conditions that will be written in SQL in the "WHERE" section of the "SELECT" statement (or simply, conditions that cut off data for the specified expression). In our case, we could write that the date is less than a certain value, is in a range of values, etc.In the "Query Editor", we can also add calculated columns to enrich our data. The functions that you can use when creating them depend on what functions the data source provides. Adaptive Analytics does not provide any functions, so we are limited to the built-in Logi functions (which are the simplest mathematical and logical operators).
If there are several tables in the query, then you can set up links between them by dragging the link with the left mouse button from one field to another. In the SQL query code, these relationships will be displayed as WHERE table_name1.field_name = table_name2.field_name.
When you have finished editing the request, click the "ok" button. If necessary, you can create several more queries with different filters or fields in them.
Now you are ready to create the report. We will talk about the process of its creation in the next article.
Article
Deirdre Viau · Mar 16, 2022
Support is helping you troubleshoot a report. They want to reproduce a problem in their local system. Too bad they can't run your report, because the JDBC data source connection will fail. Or... is there a way?
There is a way to run a report offline, with no access to the source database. You must provide a cached query result exported from Designer. This is a file containing report source data. Support will use this to override the report's data source. When they run the report, it will get data from the file, rather than the JDBC connection.
Clarification
This has nothing to do with the IRIS BI query cache.
IRIS BI query cache
Globals used by the BI query engine to improve performance.
InterSystems Reports cached query result
A file that enables running a report offline, with no access to the source database. The report retrieves data from the file instead of the usual JDBC connection.
How to send a report with a cached query result
1. Zip and send the entire catalog folder. Indicate which report you are testing.
2. Open your report in Designer. In the Data panel on the left, right-click the dataset and choose Create Cached Query Result. If the report has multiple datasets, do this for each one. Send the exported files.
Disclaimer
Do not send a cached query result containing confidential data.
Documentation
Logi Cached Query documentation (v18) very useful tip ... thank you for writing this up!
Announcement
Anastasia Dyubaylo · Mar 18, 2022
Hi Community,
We're pleased to invite you to the upcoming webinar in Spanish called "Exploring the new Embedded Python feature of InterSystems IRIS"
Date & Time: March 30, 4:00 PM CEST
Speaker: @Eduardo.Anglada, Sales Engineer, InterSystems Iberia
The webinar is aimed at any Python developer or data scientist.
At the webinar, we'll discover the potential of Python, the new programming language added to IRIS. Python is at its peak, increasing its popularity every year. It is now used by +1.5M developers around the world, and has thousands of libraries to perform almost any function needed. It is also the most widely used language in data science.
During the webinar, we'll explain how to create anonymous data and to develop interactive dashboards.
If you are using Python, don't miss it! You'll have no excuses to avoid trying InterSystems IRIS.
👉 Register today and enjoy!