go to post Jeffrey Drumm · Aug 15, 2021 Put them in a separate production and namespace that is restricted to only users with the proper role/resource assignments. There is no built-in mechanism to restrict visibility below the production/namespace level.
go to post Jeffrey Drumm · Aug 13, 2021 If you don't care about any unsent/completed/suspended messages, try calling the CleanProduction() method in class Ens.Director: Do ##class(Ens.Director).CleanProduction() This is strongly discouraged for PROD environments ... be forewarned. Would recommend you contact the WRC if you're getting this error in a PROD environment.
go to post Jeffrey Drumm · Aug 13, 2021 Giving them only the %EnsRole_Operator role will prevent them from making configuration changes to the production. And if they aren't assigned the database resource (%DB_<databasename>), they won't be able to start or stop the production either.
go to post Jeffrey Drumm · Aug 8, 2021 In the %SYS namespace: %SYS>Set ^%SYS("Portal","EnableAutoRefresh")=1 That will reveal the radio buttons that allow you to turn on/off Auto Refresh. Setting that global to 0 actually has the same effect as clicking the Off button, but eliminates the ability to turn it back on via the management console.
go to post Jeffrey Drumm · Jul 28, 2021 There's the Activity Monitor, but I don't know whether it was available for 2017.x. It requires configuration, as it is not enabled by default. It starts gathering activity after configuration, so you won't be able to use it to obtain activity/volume history for messages processed through the production prior to setup.
go to post Jeffrey Drumm · Jul 20, 2021 Are these messages all compliant with the doctype structure they're associated with? If yes, why not use the symbolic path that the structure supplies ... i.e. something like MsgOut.GetValueAt("PIDgrpgrp.ORCgrp(n).OBXgrp(n).NTE(n)")?
go to post Jeffrey Drumm · Jul 16, 2021 @Robert C. Cemper has you on the right track, but I'm curious as to whether the vendor of the foreign (i.e. non-HealthShare/HealthConnect) system has provided a specification. Do you need to accommodate Acknowledgement messages for both sending/receiving? Is there some sort of handshake protocol that is used to indicate when it's safe to send, a sort of RTS/CTS-type mechanism? Or is this being designed "on the fly?" If I were designing something like this, I'd go with a web service ... always over the same port, and when you want to send something you'd POST it. When there's nothing to POST, you'd periodically GET to see if anything is waiting. Anything else would most likely be a one-off in healthcare integration.
go to post Jeffrey Drumm · Jul 14, 2021 The maximum string length for HL7 fields in Health Connect/IRIS for Health is something like 3.6MB; larger than that, the field itself is represented as a stream. You may want to look into the stream methods for accessing fields for your use case.
go to post Jeffrey Drumm · Jul 6, 2021 I haven't actually tried this, but I suspect it's as simple as creating a message of type Ens.AlertRequest, populating it, and <call>ing Ens.Alert asynchronously in the <catchall>. Or maybe insert an <alert> action?
go to post Jeffrey Drumm · Jun 27, 2021 Would it be possible to provide a little more detail? Are you referring to the Ensemble/HealthConnect message store, the HealthShare UCR, or the TrakCare EHR?
go to post Jeffrey Drumm · Jun 25, 2021 The tools for doing this will vary by platform, but a utility called qpdf supports your needs for most modern Unix/Linux variants. You would call it from ObjectScript using the $ZF(-100) function.
go to post Jeffrey Drumm · Jun 2, 2021 I think the key to my quest lies here: https://community.intersystems.com/post/how-can-i-get-list-fo-classes-pa...
go to post Jeffrey Drumm · May 28, 2021 Here's a method that might get you close to what you want: ClassMethod GetHostsByAdapter(pProduction As %String, pAdapterName As %String) As %List { Set tPrd = ##class(Ens.Config.Production).%OpenId(pProduction) Return:'$ISOBJECT(tPrd) "Production does not exist!" Set tItems = tPrd.Items Set tItemCnt = tItems.Count() Set tHostList = "" Set tCnt = 1 For i=1:1:tItemCnt { Set tItem = tItems.GetAt(i) If $CLASSMETHOD(tItem.ClassName,"%GetParameter","ADAPTER") = pAdapterName { Set $LIST(tHostList,tCnt) = tItem.Name Set tCnt = tCnt + 1 } } Return tHostList } Call it with: Set hosts=##class(<classname>).GetHostsByAdapter("<production name>","EnsLib.HTTP.InboundAdapter") The variable hosts will contain the list (in $LIST form) of business hosts that have the adapter specified as the 2nd argument.
go to post Jeffrey Drumm · May 2, 2021 In additional experimentation, I found that there is a quoted-string mechanism: > Set oM."click".type = "double" is equivalent to > Set oM.click.type = "double" Regardless, it's still not persistent.
go to post Jeffrey Drumm · Apr 30, 2021 ClassMethod TestObj() As %DynamicObject { Set oM = {} Set mMode = ["down","up","click"] Set iter = mMode.%GetIterator() While iter.%GetNext(,.val) { Do oM.%Set(val,{"id":"","type":""}) } Quit oM } USER> set oM = ##class(User.DynObj).TestObj() USER> write oM.%ToJSON() {"down":{"id":"","type":""},"up":{"id":"","type":""},"click":{"id":"","type":""}} USER> zwrite oM.down.id "" USER> zwrite oM.up.type "" USER> set oM.click.type = "double" USER> write oM.click.type double USER> write oM.%ToJSON() {"down":{"id":"","type":""},"up":{"id":"","type":""},"click":{"id":"","type":"double"}}
go to post Jeffrey Drumm · Apr 26, 2021 There's a description of this in the documentation. You can find it here: Business Host Versions.
go to post Jeffrey Drumm · Apr 1, 2021 Do you have ^EnsPortal("DisableInactivityTimeout","Portal")=1 in each namespace that's running a production? It's not mapped from another namespace.
go to post Jeffrey Drumm · Apr 1, 2021 Have you tried %K(Server) as the output format prefix? HICG>set tm="20210401072630+0000" HICG>w ##class(Ens.Util.FunctionSet).ConvertDateTime(tm,"%q%z","%K(Server)%q%z") 20210401032630-0400 This of course assumes your server is in your locale/time zone.
go to post Jeffrey Drumm · Mar 30, 2021 This might get you closer to what you want, perhaps called from OnProcessMessage() in the service: ClassMethod QueueGetOldest(pQueueName As %String, Output pStatus As %Status) As %String { If ##class(Ens.Queue).GetCount(pQueueName) > 0 { Set tStmt = ##class(%SQL.Statement).%New() set qSC = tStmt.%PrepareClassQuery("Ens.Queue","EnumerateItem") Set tRS = tStmt.%Execute(pQueueName,"") Do tRS.%Next() Set tHdrid = tRS.%Get("MessageId") Set tMsghdr = ##class(Ens.MessageHeader).%OpenId(tHdrid) Set pStatus = $$$OK Return tMsghdr.TimeCreated } Set pStatus = $$$ERROR($$$GeneralError,"Not found") Return "" } It returns the time created of the oldest entry in the queue, or the empty string if the queue is empty or doesn't exist. You could create a variant that would accept a duration argument and return true/false if the duration between the current time and the time of the oldest entry exceeds that.
go to post Jeffrey Drumm · Mar 24, 2021 Hi Scott, You can get the repetition count for a field with the GetValueAt() method: Set tRepCount = msg.GetValueAt("OBX(3):5(*)") You can then iterate over the repetitions in a FOR loop: For tRep = 1:1:tRepCount { If msg.GetValueAt("OBX(3):5("_tRep_")") = tMatchVal { // Do stuff } }