This error is coming out of IRIS rather than the OS.  To determine what is happening would require knowing the authentication method you are using and the IRIS user you are attempting to log in as.  At first glance I would believe that your organization is in the process of tightening security.  If this worked before and does not work now then the IRIS permissions that control access to Terminal have been removed from your user.   I would discuss this with your system administrators to determine what has changed and have access restored if that is in keeping with policy.

Due to this involving aspects of your security, if you need further assistance I would encourage you to contact InterSystems support rather than share details here.  The contact numbers are:

+1-617-621-0700 (US)

+44 (0) 844 854 2917 (UK)

0800615658 (NZ Toll Free)

1800 628 181 (Aus Toll Free)

You could also use a regular expression with the %Regex.Matcher class

set regex = ##Class(%Regex.Matcher).%New("(/w)*")

The "/w" refers to any word character include alphabetic, numeric, and connecting characters).  This is wrapped in a grouping expression '()' and finally the * say match 0 or more occurences.  

You can then examine the GroupCount and Group multidimensional properties to see the results.

As someone else indicated applications will normally have a configuration page for the driver.  

In dBeaver for example when you setup a connection there is a "Driver Settings" button 

Clicking on this will allow you to configure a JDBC driver for connecting.  To start you would go to the libraries tab and point at the InterSystems JDBC jar file as shown below.  Your path would look something like c:/InterSystemsJDBC/intersystems-jdc-3.2.0.jar (your folder may be different).

Finally on the Settings tab you would indicate the class name and other connection settings

If you are trying to connect programaticaly you can use whatever library you wish and provide the same type information.  Here is an example in Python using the JayDeBe API library.

    IRIS_JARFILE = "c:\JDBCdrivers\intersystems-jdbc-3.2.0.jar"
    IRIS_DRIVER = "com.intersystems.jdbc.IRISDriver"

    JDBC_JARFILES = [IRIS_JARFILE]
    # Database settings - this should be in a config file somewhere
    # credentials.MyCreds = ["username","password"]
    dbConn = jaydebeapi.connect(IRIS_DRIVER, 
      jdbc:IRIS://10.17.10.84:1972/B360",
      credentials.MyCreds, JDBC_JARFILES)

You can also use the iris.system object in python. 

iris.system.Version.GetVersion() returns the full version ($ZV)

IRIS for UNIX (Ubuntu Server LTS for x86-64 Containers) 2022.2 (Build 356U) Thu Oct 6 2022 22:56:28 EDT

There are other methods here to call to such as GetMajor() which would return '2022' and GetPlatform() which returns 'Ubuntu Server LTS for x86-64 Containers'

do dir(iris.system.Version) at the python shell to see them all.

Careful with the 'objectscript.export' folder setting.  This needs to match where, under the root of your VScode project, your source lives.  For example my settings are:

        "folder": "iris/image/iris_src/dev",
        "addCategory": true,

So under my VScode project folder I have the path indicated in Folder.  This is how my git repository is setup.  Now my 'addCategory' is also true.  Therefore under that /dev folder I have sub-folders for 'cls' and 'rtn'.  All my classes should be under the 'cls' folder and any routines are under 'rtn'.  There are other sub folder too for other elements, but you should get the idea.

To add to the puzzle there is also the setting "objectscript.export.atelier".  With this setting true the plug in expects each package and sub-package to be a separate directory.  So if I have a class Example.code.test what you will end up with is a path, given my setup above, under vs code that looks like this.

iris/image/iris_src/dev/cls/Example/code/test.cls

If the file whose definition you are trying to get to is not in the right place it will open it in read-only mode from the server when using Client-side editing

Prudhvi,

The simplest answer is no.   ZEN, which has been a deprecated technology for some time, is a complete framework deeply integrated to Cache.  It relies heavily on synchronous communications which has been deprecated by, thought still available, by most browsers.  For both reasons new development should not be done using ZEN.

Angular, on the other hand, is a modern framework for Web Application development.  It is inherently asynchronous and therefore disconnected from the back-end.  As Eduard stated the typical communication methodology is for the back-end to provide a RESTful interface which are quite easy to develop and publish both direct from IRIS or via the InterSystems API Manager.

I am going to make the assumption that this is part of an existing application that you are looking do new development on.  As stated ZEN is deprecated therefore it would be a good idea to develop a roadmap to migrate from ZEN to something like Angular.  I would take this new project and use it to explore the move to Angular.

You should also note that at some unknown point in time browsers could remove support for synchronous communications.  The latter will likely not happen for quite some time as many older applications still rely on it.  Several years back one browser, Firefox I think, tried to remove this support and had to quickly backtrack as too many applications stopped working.  So you have time.

Aaron,

In my experience you need to purchase the schema.  You can go to http://x12.org to find out more.  Depending on your usage and needs it can be a bit pricey for licensing especially if you only need one schema.  If you have a partner that has access you could piggyback on there license assuming you have a working relationship with them.  Unfortunately I did not see any option to purchase just a single schema, though there was something like that in the past as I have a colleague that did so.  You can try to contact the org to inquire.

There is no general rule-of-thumb.  It really depends on the nature of your application and usage patterns.  For example if this is primarily a REST based service I would set the maximum to your license capacity minus a reserve for administrative functions, background tasks, and reporting.

In a mixed environment you need to have a more balanced setup of REST (web) calls versus direct connections.

As I indicated you really need to have an idea of the use patterns of your application.

One thought that occurs to me is to check the 'Maximum Server Connections' settings in the CSP  Gateway under Server Access.  This is the maximum number of connections allows and when reached further requests are queued until a connection is available or the client times out.  This is often used with REST services to avoid clients receiving a licensing error which is not desirable or to avoid any CSP calls from consuming the entire system.   If this is the case you should examine your license usage and CSP Sessions to see what might be overloading the server. 

Of course if this is a very active system then you may need to increase the maximum connections allowed and possibly the license as well.

Hope that helps.

Diego,

As I understand it you are have an existing VM on AWS that you have access too.  When you do the SSH command you indicated you end up at linux command prompt and you need to know how to install IRIS in that environment.  This is a straight installation and not running in a docker container.

All that being the case you need to do the following:

  1. Download the appropriate installation kit from https://wrc.intersystems.com/wrc/coDistIRIS.csp.  You can filter the name by 'Health' and the OS by 'Ubuntu' to get a shorter list.
  2. Now use scp to copy that installation file to your AWS environment.  Note scp has similar syntax to the ssh and cp commands.  Google it and you will find many resources for this command
  3. Finally read the documentation on installation. https://docs.intersystems.com/iris20221/csp/docbook/DocBook.UI.Page.cls?... https://docs.intersystems.com/iris20221/csp/docbook/DocBook.UI.Page.cls?...

If you get stuck on any issues come back here or call directly into the Worldwide Response Center https://www.intersystems.com/support.

Finally, if you DON'T have an existing environment you can look at InterSystems Cloud Manager to provision and deploy IRIS for Health to a cloud environment.

https://docs.intersystems.com/iris20221/csp/docbook/DocBook.UI.Page.cls?...

Much of the documentation refers to deployment with containers. However there is a containerless option too which is covered in one of the subsections off this main page.

I hope this helped you get started.

Daniel,

Ok, so the data is basically a parsed report and each daily run replaces the previous run with no Delta or net change processing.  So on error they could just rerun the process to get the data.  

One suggestion on the alerting, use a distribution group as the address to send to and make sure a at least one of the Business consumers of the data are on that list.  Just alerting a technical resource could lead the business side to use incomplete data as they don't know that something went wrong.  Relying on the technical resource to pass on this information  can be risky.  Not a dig at the customer, just reality.

So, back to your question, I would still lean towards a solution that separates the loading of the data from the export to MS SQL Server.   Since you want to avoid the use of messages for the data I would still lean towards a global mapped to IRISTEMP, note NOT a process private global as the business hosts will be in separate processes.  This is a repetitive process so the fact that the DB will grow should not be an issue.  It will reach a size necessary to handle the load and stay there.  You can, if needed, programatically handle the mapping using the Config.MapGlobals API ( https://docs.intersystems.com/irislatest/csp/documatic/%25CSP.Documatic.cls?&LIBRARY=%25SYS&CLASSNAME=Config.MapGlobals).

So this would look something like this:

  1. Business Service accepts and processes the data into a non-journaled global on a schedule.  When the data has been consumed a message is generated that is sent to the Business Operation to trigger the next phase
  2. Business operation to write to MS SQL Server reacts to receiving a message to process, including how to identify the dataset to load.  The process consumes the data out of the Global to write to SQL Server.  Once complete the data in the Global for this run is purged.

Anyway that is my two cents on this.  I am sure others will have different ideas.

First lets get the adapter concerns out of the way.  An adapter, in general, is only the "how do I connect" part of the.  What you need to do is write an Business Operation that has this set as its adapter.  Within your service you can do anything you want with the payload that is returned.

If you are not familiar with how this works I would start with our documentation.  Here are a couple of links to get you started:

https://docs.intersystems.com/iris20212/csp/docbook/DocBook.UI.Page.cls?KEY=EGDV_intro

https://docs.intersystems.com/iris20212/csp/docbook/Doc.View.cls?KEY=EGDV_busop

There are also Learning Service resources you could use.

Now to your process.  First off what is the reason you don't want messages or any tracing?  There are a number of good reasons to utilize the structure of IRIS interoperability including the ability to see a trace if something goes wrong and queue persistence to provide resilience in delivery.  

If messaging is still not viable for any reason I would consider creating a temporary holding class/Table for the data. then sending a message to another Business operation based on the SQL adapter that will pick this data up, write it to MS, and then remove it from the temp storage.  You can map this data to either a non-journaled database or to IRISTEMP depending on your needs.  Also allow for the fact that there could be multiple batches in progress so how you key the temporary storage will be important.

Some important questions:

What happens to the data if the process aborts in the middle?

Would missing any of the data being pulled have a negative effect on the business?

Is there any concern over data lineage for security or external auditing ?

Here is a quick example program I wrote a couple of months ago.  This uses JDBC and the JayDeBeapi library others have mentioned.  Note the Credentials import provides a set of  login credentials in the following format.

LocalCreds = {"user":"SuperUser", "password":"SYS"}

Here is the code:

import jaydebeapi
import credentials
def get_database_connection(inpDBInstance):
    IRIS_JARFILE = "/home/ritaylor/InterSystemsJDBC/intersystems-jdbc-3.2.0.jar"
    IRIS_DRIVER = "com.intersystems.jdbc.IRISDriver"
    AA_JARFILE = "/home/ritaylor/Downloads/AtScale/hive-jdbc-uber-2.6.5.0-292.jar"
    AA_DRIVER = "org.apache.hive.jdbc.HiveDriver"
    # note connecting to two data sources in the same program requires that you 
    # reference the paths to BOTH jar files in a list in every call. Otherwise the
    # second connection attempt will fail.  It appears that the paths only get
    # added once within a process.
    JDBC_JARFILES = [IRIS_JARFILE,AA_JARFILE]
    # Database settings - this should be in a config file somewhere
    if (inpDBInstance == "local"):
        dbConn = jaydebeapi.connect(IRIS_DRIVER,
                           "jdbc:IRIS://18.119.2.28:1972/USER",
                           credentials.LocalCreds,
                           JDBC_JARFILES)
    else:
         dbConn = None
  
    return dbConn
def run_database_query(inpQuery, inpDBInstance):
    resultSet = None
    dbConn = get_database_connection(inpDBInstance)
    cursor = dbConn.cursor()
    cursor.execute(inpQuery)
    resultSet = cursor.fetchall()
    return resultSet
def print_db_result_set(resultSet):
    if (resultSet != None):
        for row in resultSet:
            print(row)
    else:
        print("Input result set is empty")