go to post Jeffrey Drumm · Feb 9, 2022 Unfortunately not through ^MONMGR. Since it's just reporting on what's appearing in the messages (or cconsole) log above a certain severity level, an external job that periodically scans the file is a potential solution.
go to post Jeffrey Drumm · Feb 9, 2022 I've followed up with you on Github, as this does not appear to work for me (either ctrl/left-click/drag or copy/paste).
go to post Jeffrey Drumm · Feb 8, 2022 I've installed standalone web servers/gateways on both the same host as IRIS and on separate servers that support multiple standalone IRIS instances. I often use the standalone web host/gateway as the arbiter host for a mirrored server pair. The customer I'm currently working with has all of their PROD and STAGE hosts (mirror pairs and DR servers) accessible through two separate web server/arbiter hosts. If you're doing this to enhance security, it's not just about installing certificates and turning on TLS for the web server. You also need to make sure the communication between the web gateway module and the IRIS server is encrypted via TLS (primarily when the gateway is on a host separate from the IRIS instance). And if you're doing that, you probably ought to make sure that ODBC/jdbc and Studio connections are also encrypted, you've enabled STARTTLS for LDAP/AD authentication, TLS for mirror synchronization, etc.
go to post Jeffrey Drumm · Feb 8, 2022 @Brett Saviano , Apologies if I'm seeming a little dense here, but what's the relevance of CI/CD to the workflow I described? In my experience the need to move code from one work area to another has been fairly common, and while it's not a streamlined operation in IRIS Studio, it at least doesn't require editing configuration files. I'm not talking about big projects here, just the sort of stuff you need to do in healthcare integration (custom business hosts, scheduled tasks, or utility methods used in business rules/DTLs). Is VS Code simply the wrong tool for my needs? I use it for other projects and very much like it as an editor, so was hopeful it would be an effective replacement for IRIS Studio.
go to post Jeffrey Drumm · Feb 3, 2022 Understood ... but I'm curious as to how IRIS is getting my environment: w ##class(%SYSTEM.Util).GetEnviron("USER") jdrumm w ##class(%SYS.ProcessQuery).GetOSUsername() irisusr
go to post Jeffrey Drumm · Feb 3, 2022 If you're doing file I/O, why not %File.GetOwnerGroup()? Or is this something you need to know before you open (or create) a file?
go to post Jeffrey Drumm · Jan 27, 2022 One oddity I've noticed when using this method is that the Home/End keys don't work as expected. If I start an ssh shell session and manually run iris session <instance>, everything works normally. If I start it using the method described in my post above, the Home and End keys seem to send a newline or carriage return, sending what I've typed to the IRIS interpreter rather than moving the cursor to the beginning of the line. This is regardless of whether I execute it from VS Code or the "DOS" Shell, so it's not really a VS Code problem. Just curious if anyone else has a solution ... Note: Interestingly Ctrl+A works for moving to the beginning of the line ... but not Home.
go to post Jeffrey Drumm · Jan 27, 2022 set tmpStr = ##class(%Stream.FileCharacter).%New() do tmpStr.LinkToFile("/some/writeable/location/temp.json") do tmpStr.CopyFrom(newMsg) do tmpStr.%Save() You should then be able to open the JSON file outside of Caché/Ensemble, from the location to which it was written. EDIT: The location could potentially be /<cache-install-dir>/csp/user/<filename> ... in which case you may be able to access it through the Caché/Ensemble web server and display it in your web browser: http://<hostname>:<port>/csp/user/<filename>
go to post Jeffrey Drumm · Jan 27, 2022 write ##class(Ens.Util.Time).FormatDateTime("%Y%m%d%H%M%S",,$ZDT($ZTS,3)) Assumes you have Ensemble/Interoperability, though ...
go to post Jeffrey Drumm · Jan 25, 2022 For those that use a Windows workstation but code on a Linux/Unix-based server, here's a configuration that provides a remote IRIS terminal session. It uses the ssh client that is included with Windows 10 (I'm assuming there's one in Windows 11 as well). Add it to your user settings to make it available across all of your projects, or to your workspace settings to have a custom terminal session per workspace: "terminal.integrated.profiles.windows": { "IRIS Session": { "overrideName": true, "path": "C:\\Windows\\System32\\OpenSSH\\ssh.exe", "args": [ "-t", "<user>@<hostname>", "iris session <instance>" ] } }
go to post Jeffrey Drumm · Jan 18, 2022 Do you have a corporate mail server that supports SMTP relay? You would need to get the details from the administrator of the mail system. Some require TLS, some don't. Some require credentials, others don't. You can use GMail, in which case you would need a configuration of something like this: Mail server? smtp.gmail.com Mail server port? 587Mail server SSLConfiguration? <SSLConfigName> <-- You would need to create this in Security | SSL/TLS ConfigurationsMail server UseSTARTTLS? 1 You will also need to supply your Gmail email address for the username, and an app password (created in your Google Account Security settings) for the Set Authentication option. Your best bet would be to discuss your email delivery requirements with the mail server administrator of your organization; they should be able to provide you with the required values. If this is for a private/personal installation of Caché or IRIS, GMail is probably the easiest to configure and best documented.
go to post Jeffrey Drumm · Jan 18, 2022 If you create a class that extends Ens.Rule.FunctionSet, you can have a method that's selectable from the expression editor in either a DTL or a Routing Rule ... Class User.Util.MetaData Extends Ens.Rule.FunctionSet { /// Retrieves the UserValue associated with key <var>pKey</var> from the message object supplied as /// <var>pMsg</var> (normally <strong>source</strong> in a DTL or <strong>Document</strong> in /// a Routing Rule) as a %String. Returns an empty string if the key is undefined. ClassMethod UserValueGet(pMsg As EnsLib.HL7.Message, pKey As %String) As %String { If pMsg.UserValues.IsDefined(pKey) { Return pMsg.UserValues.GetAt(pKey) } Return "" } }
go to post Jeffrey Drumm · Jan 17, 2022 I haven't found support for this yet. I have a need for this as well and am considering writing an adapter to support get/put operations using smbclient. If there's a better/quicker way to accomplish this, I'd be very excited to learn about it We had toyed with the idea of mounting all of the shares as cifs filesystems on the RHEL 8.5 hosts, but there are quite a few ... Dynamically establishing a connection and then performing the required operation is preferred.
go to post Jeffrey Drumm · Jan 12, 2022 If you're interested in seeing what the actual request looks like, use the value 1 for the 2nd parameter to the Get/Post/Put/etc. call. USER> Do objHttpRequest.Get("location",1) This will output the request to the local device, so it's handy for terminal-based troubleshooting.
go to post Jeffrey Drumm · Jan 10, 2022 Sorry Scott, got busy and never looped back. I'm assuming you've found the issue ... by checking the configs for any production components that referenced RecordMap message types and verifying that the RecordMap classes they use exist. Thanks for marking my (somewhat incomplete) answer as correct
go to post Jeffrey Drumm · Jan 7, 2022 If your class is JSON-enabled (subclasses %JSON.Adaptor), it should be as simple as calling the message object's %JSONExportToStream() or %JSONExportToString() method: Set tSC = msgObj.%JSONExportToStream(.oStream)
go to post Jeffrey Drumm · Jan 7, 2022 What happens if you use SELECT TOP 1 Full_Message ...? Embedded SQL doesn't work for queries that return multiple rows* (assuming that's what you mean by "multiple results"). * unless you're using cursor-based queries
go to post Jeffrey Drumm · Jan 7, 2022 Hi Scott, can you open the production in Studio and look for any oddities in the configuration values for your services and operations that use record maps? I've seen similar issues when a production was configured with references to certain classes and the classes were subsequently deleted.
go to post Jeffrey Drumm · Jan 5, 2022 The simplest solution is to make sure the ADT transform/send rule is called before the ORM transform/send rule in the routing rule, set the router's pool size to 1, and enable the "Force Sync Send" option in the router. What happens to the ORM message when the ADT message is NAKed, though, may be problematic. If you want more granular control over this processing, invoke the transformations and subsequent calls to the operation via a BPL instead of a router. You will be able to evaluate the ACK/NAK response from the called Business Operation responsible for sending the ADT message and take appropriate measures for processing/suspending the ORM message.