go to post Jeffrey Drumm · Apr 6, 2018 The cursor is hovering over the 2nd sub-component of the first component of the field. 3 is the field, 3.1 is the first component of the field, 3.1.1 is the first sub-component of the first component of the field, and 3.1.2 is the second sub-component of the first component of the field. If the field has repetitions (delimited by a ~), the first repetition would be referenced as 3(1), with its components and sub-components referenced as 3(1).1, 3(1).1.1, 3(1).1.2, etc.
go to post Jeffrey Drumm · Apr 6, 2018 You may already understand this, but it bears repeating: If your intent is to include a literal ampersand symbol, you should also change the sub-component separator in MSH-2 in keeping with the formal HL7 spec.Unfortunately, many vendors don't understand (or bother to handle) HL7 escaped characters, and some of them don't even pay attention to the values in MSH-2 ... leaving us forced to generate what is essentially badly-formed HL7.
go to post Jeffrey Drumm · Apr 4, 2018 If you're unable to purge Message Headers that are beyond the retention period with KeepIntegrity turned off, you may need to clean up your indices. In a Cache terminal, execute the method below in the namespace where your Ensemble production is defined:> Do ##class(Ens.MessageHeader).%ValidateIndices("",1)Depending on the number of message headers, this may take a while to run ... on one system I've worked with it took more than a month.You may want to also check for orphaned message bodies. You can determine if you have any by issuing the following SQL query from the SQL shell:> Do $system.SQL.Shell()>> SELECT COUNT(*) FROM EnsLib_HL7.Message HL7 LEFT JOIN Ens.MessageHeader hdr ON HL7.Id=hdr.MessageBodyId WHERE hdr.MessageBodyId IS NULLCleaning up the orphaned message bodies is yet another task, but let's see if you have any first ...
go to post Jeffrey Drumm · Mar 26, 2018 I know this is sort of making an end-run around the issue, but my needs are such that it works well for me.I run all of my development environments in virtual machines on my laptop. Spinning up a new (or cloning an existing) VM to support a distinct environment gives me the flexibility you appear to need without jeopardizing other software installations.
go to post Jeffrey Drumm · Feb 27, 2018 The record mapper creates a record definition that can be used as either a source or a target; create the record layout you require in the mapper, then use the DTL editor to define how the HL7 fields are mapped from the HL7 document type to the record map document.
go to post Jeffrey Drumm · Feb 27, 2018 If your HL7 message is an object of type EnsLib.HL7.Message, use the OutputToLibraryStream() method.
go to post Jeffrey Drumm · Feb 21, 2018 One place you can't use persistent classes is where you need to obtain such things as a count of repeating elements in a Routing Rule, at least while using "native" rule functionality. EnsLib.EDI.XML.Document supports that in a way that's consistent with other document types.
go to post Jeffrey Drumm · Feb 7, 2018 This isn't an Atelier-specific issue, it's Eclipse.The Java editor for Eclipse has an option for changing the behavior of Ctrl-Left/Ctrl-Right, but as far as I know that's the only one that changes the default.This is something ISC could change, but I suspect there would have to be significant demand for it.
go to post Jeffrey Drumm · Feb 6, 2018 Looking at the error you're getting, I'm suspecting that the vendor of the external application that feeds your service intended to include a \r (carriage return) as the EOD character and somehow managed to omit the backslash. That would explain the 'r' character ... it's always an 'r' in the error that's generated, right?
go to post Jeffrey Drumm · Feb 6, 2018 Looks like changing the framing would require a modified Parser anyway. So ... I think you'll have to create a copy of EnsLib.HL7.Service.Standard (something like OSU.HL7.Service.CrappyFraming) that changes the %Parser property to be your custom parser: Property %Parser As OSU.Custom.HL7.CrappyFramingParser [ Internal ]; Then modify the custom service that was developed long, long ago to subclass it: Class OSU.HL7.Service.TCPService Extends OSU.HL7.Service.CrappyFraming[ ClassType = "", ProcedureBlock, System = 4 ]
go to post Jeffrey Drumm · Feb 5, 2018 This error is usually indicative of a framing issue. Have you looked at what, specifically, this non-HL7 data consists of?
go to post Jeffrey Drumm · Feb 2, 2018 The issue with the "[" option is that it doesn't compare the MRNs individually; it treats the entire PID:3 field (which can contain multiple MRNs) as the value to locate in MRG:1. You'd have to first locate the PID:3 iteration that contains the "CKS" facility identifier, then check the MRG:1 field to see if it's contained within it.
go to post Jeffrey Drumm · Feb 2, 2018 Hi Richard,The issue in this case was that there could be a variable number of repetitions in the PID:3 and MRG:1 fields, and that there was no guarantee that the MRNs for each facility would appear in the same order. So the actual need was to be able to compare each iteration of the MRN in PID:3 with each iteration of the MRN in MRG:1. This is cumbersome/difficult without a loop construct in the Rules editor, and would require at least as many sequential comparisons as there are repetitions in PID:3.The example you provided compares only the first iteration of PID:3 with the first iteration of MRG:1, so if the desired match appeared in any subsequent iteration of either of those fields the desired outcome would not be achieved. This is one of those cases where some ObjectScript is a more streamlined solution.
go to post Jeffrey Drumm · Jan 30, 2018 Yes, and just recently too.You very likely need to run an index validation against Ens.MessageHeader.NAMESPACE>Set sc = $System.OBJ.ValidateIndices("Ens.MessageHeader",,1,1)Depending on the size of your database, it could take a while ... possibly weeks if you're in the multi-terabyte range. It has very little impact on performance, though. If you think it might take a while, you can create a task class and have it run non-interactively in Task Manager (that's what I did).Once it's complete, your message purge should remove the old cruft automatically.
go to post Jeffrey Drumm · Jan 30, 2018 Scott, there's a utility called %GSIZE that does just this; it analyzes global storage and reports allocated vs. actual use.namespace> d ^%GSIZEIt will prompt you for the database directory (defaulted to your current namespace's), whether you want to include all globals (Yes), globals that contain no data (No), and whether it should show details (Yes). Hit Enter for Device: or specify a path/filename if you want the report written to disk, and Enter again for the Right margin.If your environment is mirrored, you can run it against the mirror. It could take a while to run; an Ensemble database I've worked with recently is 10TB in size and it took a month to complete.EDIT: Should've paid attention to your qualification, too ... that's something that will take a bit of query development, thinking in terms of message volume between specific source and target config items along with an analysis of message content size. You'd be working with Ens.MessageHeader for that ...
go to post Jeffrey Drumm · Jan 29, 2018 I think the intent is to limit configuration control of business hosts in an Ensemble production based on user role. Effectively, prevent a Cache/Ensemble user from changing the IP address or port number of a TCP/IP Business Operation through the Management Console without restricting the ability to view the settings.
go to post Jeffrey Drumm · Jan 26, 2018 So how is this an ACTUAL solution if you're going to get cursed at for using it in a Production environment?
go to post Jeffrey Drumm · Jan 25, 2018 And if there will always be a fixed number of iterations, you could do "1."_$CASE(k1,1:"a",2:"b",3:"c",4:"d",5:"e",6:"f",:""). It's hard to say which solution is less intuitive, though.Another variation ... "1."_$EXTRACT("abcdefghijklmnopqrstuvwxyz",k1). The possibilities are endless!
go to post Jeffrey Drumm · Jan 24, 2018 Do you have access to the Cache terminal?NAMESPACE> Do $System.SQL.Shell()I know it's not exactly what you asked for, but it doesn't time out ...
go to post Jeffrey Drumm · Jan 24, 2018 Hmm. You could do something like "1."_$C(96 + k1) for the value of that field, assuming k1 is the iterator.Things are gonna get funky when you hit the 27th iteration, though