Enrico Parisi 路 Feb 11, 2025 go to post

Well...it's still valid for old versions 馃槈

You may want to edit and add at the beginning that IRIS can use VSS with a link to documentation.

Enrico Parisi 路 Feb 11, 2025 go to post

That's not the WebGateway port, it's the web server port, so you can change it in the web server configuration.

From the port you mentioned (57773) It seems you are using PWS (aka Private Web Server) that used to be installed with IRIS before version 2023.2 (if I recall it correctly).

Since you are using version 2024.3 my guess (I can be wrong) is that your system was upgraded from a previous version, so the PWS is still installed.

If so (you are using PWS), I suggest to install a proper "web server" (Apache or, if Windows, IIS) and use it instead of the deprecated, no longer installed, PWS.

It has been announced that future version (2025.??) PWS will be removed during IRIS install.

Enrico Parisi 路 Feb 12, 2025 go to post

Embedded SQL build the cached query ONCE while you compile

This is no longer true since some time/version, please check relevant documentation:

Embedded SQL is not compiled when the routine that contains it is compiled. Instead, compilation of Embedded SQL occurs upon the first execution of the SQL code (runtime). First execution defines an executable cached query. This parallels the compilation of Dynamic SQL, where the SQL code is not compiled until the SQL Prepare operation is executed.

As a result, some assumptions, even in the main post, are no longer accurate.

My suggestion is to read the article in this community from @Benjamin De Boe :

New in 2020.1: the Universal Query Cache

Enrico Parisi 路 Feb 14, 2025 go to post

Whatever you use,  portal, code or SQL, I'd suggest NOT to delete the suspended messages. If you delete a message, only the message header will be deleted, leaving all the associated requests/responses orphaned.

I suggest discarding the messages using SQL.

Be careful doing so with a single update SQL statement for 2M messages, with more that 1000 records lock escalation will lock the entire Ens.MessageHeader table/class and your production will have big trouble. To avoid it use %NOLOCK.

Using Display mode:

Update %NOLOCK Ens.MessageHeader set Status ='Discarded' where Status = 'Suspended'

Using Logical or ODBC mode:

Update %NOLOCK Ens.MessageHeader set Status = 4 where Status = 5

Enrico Parisi 路 Feb 17, 2025 go to post

@Jeffrey Drumm , it's too late, he has already deleted the headers so the bodies are already orphaned.

@Kirsten Whatley , there is no query using the Ens.MessageHeader that can return orphaned message bodies info/reference. The very definition of orphaned messages is that have lost the link form Ens.MessageHeader.

Do you know the MessageBodyClassName of the messages you have deleted?
If it's a custom defined persistent class, can you provide some detail of the message(es) class(es)?

 

Enrico Parisi 路 Feb 17, 2025 go to post

I'm no sure it it makes any difference, but....what IRIS version are you using?

Enrico Parisi 路 Feb 18, 2025 go to post

@David.Satorres6134 , in the class EnsPortal.SuspendedMsg,  DeleteMessage() is an instance method and cannot be invoked directly.

Anyway, what it does is simply invoking:

Set tStatus = ##class(Ens.MessageHeader).%DeleteId(pHeaderId)

But, as explained in my previous post, this leave orphaned messages and should be avoided.

Enrico Parisi 路 Feb 18, 2025 go to post

I don't have experience with SQL SP from IRIS but I believe the SQL syntax should be something like:

call ExternalDB.DB.StoredProcName(?)

I'm not sure named parameters are supported. I don't think they are.

Enrico Parisi 路 Feb 18, 2025 go to post

I've seen that message too and.....I ignored it since everything works fine.

It would be nice to know without opening a WRC for something that, apart of that message, just works! 馃榿

If that directory is required for Web Gateway cache, then it looks like a bug in the GW installation script.

Enrico Parisi 路 Feb 18, 2025 go to post

@David.Satorres6134 , you asked:

We have reviewed the documentation but were unable to find a method or API that provides the correct compilation order for the cubes.

I gave the documentation links on how to provide the correct compilation order for classes.

In most cases the compiler does take care of dependencies and build/compile in correct order.
In my experience I have very, very rarely (maybe a couple of times) used DependsOn or CompileAfter Class keywords (I don't do cubes/DeepSee).

I'm not familiar with multiple cubes compilation, but evidently your implementation has some particular dependency that the compiler is unable to identify and take care of it.

Maybe  (just guessing here) you have some cross dependency that is "resolved" with multiple compilations?

Enrico Parisi 路 Feb 21, 2025 go to post

To my knowledge what can be done it's making a call via Web Gateway using %Net.HttpRequest.

I'm afraid that without going trough the Web Gateway it's not possible, but I'd love to be proven wrong.

Enrico Parisi 路 Feb 24, 2025 go to post

Would you mind specify what kind of rule?

Edit to add: note that rules are defined as XML, there is no table available to directly query a rule

Enrico Parisi 路 Feb 25, 2025 go to post

From documentation:

General Rules

Every identifier must be unique within its context (for example, no two classes in a given namespace can have the same full name).

Identifiers preserve case: you must exactly match the case of a name; at the same time, two classes cannot have names that differ only in case. For example, the identifiers id1 and ID1 are considered identical for purposes of uniqueness.

Enrico Parisi 路 Feb 25, 2025 go to post

You can use this query in your method:

select * from Ens.Job_Enumerate()
where  ConfigName ='T_SPM_SIU'

Enrico Parisi 路 Feb 28, 2025 go to post

I really doubt it's possible to search for Data Set values, that information is stored in a binary file in the filesystem, not in the database.

Enrico Parisi 路 Feb 28, 2025 go to post

To get the XML rule definition from SQL you can write/define a stored procedure that returns the XML rule definition, then....parse the XML. Something like:

Class Community.Rule.XDATA
{
ClassMethod GetXML(RuleName As%String) As%String(MAXLEN="") [ SqlProc ]
{
    Set xdataOBJ = ##class(%Dictionary.XDataDefinition).IDKEYOpen(RuleName,"RuleDefinition")
    Quit xdataOBJ.Data.Read($$$MaxLocalLength)
}
}

Then from SQL:

select Community_Rule.XDATA_GetXML('Your.Rule.Name')

Enrico Parisi 路 Feb 28, 2025 go to post

I'm not sure what you want to implement, note that ByRef and Output are keywords (not parameters) and are for documentation purpose only, the (dot) syntax used by the caller define if an argument is passed by reference, regardless of ByRef/Output keyword specified in the called method.

What kind of customization you need to implement?

Enrico Parisi 路 Feb 28, 2025 go to post

I'm not familiar with Spring Boot, so I don't understand what you want to implement in IRIS.

Do you want to define a custom datatype?

What kind of behavior you need to implement in IRIS?

Enrico Parisi 路 Feb 28, 2025 go to post

Are you sure you are using the correct/full name reference to your parametisedClass?

It should be NamespaceName.PublicClassName

Enrico Parisi 路 Feb 28, 2025 go to post

You can enable the log in the .NET Gateway and see if the log give you some useful info.

As in my previous post, my guess is that you are passing the wrong/incomplete class name as 1st parameter of new().

Enrico Parisi 路 Feb 28, 2025 go to post

Hi @Muhammad Waseem , nice and useful article.

Please note that for embedded SQL, since some version 2020.1, when the Universal Query Cache was introduced, it's no longer true that "SQL statements are pre-compiled into the program during development", please check relevant documentation.
 

You can find more details and a discussion of this topic, including comments from @Dan Pascothe initial dynamic SQL developer, in the post A look at Dynamic SQL and Embedded SQL
 

Enrico Parisi 路 Mar 4, 2025 go to post

Ciao Riccardo,

<PROTECT> error, evidently the caller or the web application does not have enough permission.

Is the caller being authenticated? How? What user? What roles has the user?

Check the associated Web Application authentication and the user used by the caller to connect to your (FHIR) Web Application.

Enrico Parisi 路 Mar 4, 2025 go to post

select count(*) from (
select SessionId
from Ens.MessageHeader
where TimeCreated between '2025-02-01 00:00:00' and '2025-02-28 23:59:59'
group by SessionId
)

Enrico Parisi 路 Mar 5, 2025 go to post

Well...if fact, a better query would be:

select count(DISTINCT SessionId)
from Ens.MessageHeader
where TimeCreated between '2025-02-01 00:00:00' and '2025-02-28 23:59:59'

Note: while the query is different, it ends running pretty much the same code as the previous query, but I like this better 馃槉

Enrico Parisi 路 Mar 6, 2025 go to post

I'm afraid that the query you suggest does not returns the same result.

It returns one row per session, each with the number of messages for the session.

Enrico Parisi 路 Mar 10, 2025 go to post

I know this is an old question, but in case someone will search for the same question, another option (better, IMHO) is to use:

$$$ClassSQLTable("my.ClassName")

In case you need it for current class:

$$$ClassSQLTable($classname())

To use the $$$ClassSQLTable macro your class needs:

Include Ensemble

Enrico Parisi 路 Mar 10, 2025 go to post

Be careful, in some cases that method does not work correctly.

I was testing this using a class where the package redefine the SQL schema name for the classes, in that case the ClassNameToTableName() returns a wrong result.