Scott Roth · Jan 24, 2018 go to post

When calling a SQL call, I normally return the value in a Snapshot. 

You can do this 1 of two ways...

1. Set two variables....One for the Outbound HL7 Message, and one for the structure of your snapshot. Set your source equal to your snapshot variable and your target being the Outbound HL7 context variable. Use a Data transformation to take the information from the Snapshot and insert it into the HL7.

2. Create a variable for your ID variable, and loop through the Snapshot to set that ID variable. Then create a dummy data transformation that you can use to set your HL7 field to your context.ID variable.

I have plenty of examples of doing this in either way. There might be others that have a better solution, its just what I have used in the past.

Scott Roth

The Ohio State University Wexner Medical Center

Scott Roth · Jan 12, 2018 go to post

No luck but thanks.

I took the query from $$$LOGINFO(select)  and executed it fine in SQL Server. It showed Ensemble should of returned 185 rows.

For every database pull Ensemble stores either that whole message or a key value so it knows that record has already been read.  I can't figure out how to get around that when I do a ExecuteQuery() call inside my Operation.

Scott Roth · Nov 3, 2017 go to post

Simplifying the query to just the select statement worked, however is there a good way to convert date/time from GMT to EST?

Scott Roth · Oct 20, 2017 go to post

thanks...the documentation isn't took clear on how to at %ListOfObjects to a snapshot.

Scott Roth · Oct 19, 2017 go to post

I found my answer, but the question now is how do we set MaxRowsToGet within the Studio Operation for EnsLib.SQL.Snapshot.

Thanks

Scott

Scott Roth · Oct 17, 2017 go to post

We found the Ensemble Scheduler single threaded, so If you had schedules that would overlap some instances would not be started correctly. One of my colleagues created two simple command line scripts to start and stop interfaces. We are using those scripts along with the cron scheduler on AIX.

Scott Roth · Aug 7, 2017 go to post

In working with WRC, I think I am going to have to go down the route of creating a Custom Service to send a tickler to a BPL to begin selecting the data. In theory it makes sense but I am having an issue trying to grasp my head around to code it. Without having to build a message structure to send the request to the BPL is there an easier way?

Scott Roth · Jul 20, 2017 go to post

The SQL Inbound Service has a set start and stop time. I give it about a 1/2 hr to run before closing the connection. This is because I am treating it like a job, it doesn't need to be up all the time, just once a night.

I have used SQL Outbound Adapters in many other Operations I have built. What do you use as the Trigger, to say yes go ahead and process these records? In this case I use the records to send to a BPL to then use an Outbound SQL Adapter Operation I have created to get what ever else data wasn't in the record but I need in the outbound file.

Scott Roth · Jul 20, 2017 go to post

Wonder if you add the following to your OnInit() would help...

Kill $$$EnsRuntimeAppData(..%ConfigName)

Scott Roth · Jun 29, 2017 go to post

Have you attempted to use LENGTH?

Say LENGTH(HL7.{MRG. PriorPatientIdentifierList }) > 0

We have never been successful in using the field numbers within our routing rules. Normally we just use the name of the field, or that's at least how we were taught.

I would also think you want to check the message type before you check the MRG.1. So it would be if Message Type is A18 and LENGTH(HL7.{MRG. PriorPatientIdentifierList }) > 0 then return

Scott Roth · Jun 20, 2017 go to post

I am looking more for a function that I can call in a Business Rule or Data Transformation to compare the dates.

For example

  • In a Business Rule I might want to say only send messages that have an Admit Date after 7/1/2017.
  • In a Data transformation I might want to say only populate certain fields if Admit Date is after 7/1/2017

Thanks

Scott Roth · Jun 12, 2017 go to post

I was able to figure out what exactly I was doing wrong. Thanks. One last question is it possible to call Ensemble-->Configuration-->Credenitals, into Cache Object Script?

Scott Roth · Jun 9, 2017 go to post

I took your suggestion about using %Net.FtpSession to transfer the file back and forth between the two boxes, however I am running into an issue trying to ftp.Store the file. Can I have a second pair of eyes take a look at this to see what I am doing wrong?

 

ClassMethod DecodeBase64HL7ToFileFaxing(base64 As %Stream.GlobalBinary, Ancillary As %String, FileName As %String) As %String
{
set ftp=##class(%Net.FtpSession).%New()
if 'ftp.Connect("xxxxx","xxxxx","xxxxxx") $$$LOGINFO("Unable to connect to inteng11") quit
set Oref = ##class(%FileBinaryStream).%New()
set Oref.Filename = FileName
Do base64.Rewind()
While 'base64.AtEnd {
     set ln = base64.ReadLine()
    set lnDecoded = $system.Encryption.Base64Decode(ln)
do Oref.Write(lnDecoded)
}
if 'ftp.SetDirectory("/home/egate/Scott") $$$LOGINFO("Unable to change directory") quit
If 'ftp.Store(Oref,stream) $$$LOGINFO("Unable to write file") quit
if 'ftp.Logout() $$$LOGINFO("Failed to logout") quit
}

 

Thanks

Scott Roth · Apr 11, 2017 go to post

Here is how I am Calling the Method and Returning me the string

<transform sourceClass='EnsLib.HL7.Message' targetClass='osuwmc.Visit.DataStructures.InsertVisitAttachmentResult' sourceDocType='ORMORUPDF:OSU_ORMORU_PDF' create='new' language='objectscript' >
<assign value='context.TextIDTemp' property='target.TextID' action='set' />
<assign value='source.GetFieldStreamRaw(.tStream,"ORCgrp(1).OBRgrp(1).OBXgrp(1).OBX:ObservationValue(1).AlternateText",.tRemainder)' property='tSC' action='set' />
<assign value='##class(osuwmc.Functions).DecodeBase64HL7ToFile(tStream,source.{MSH:SendingApplication.NamespaceID},source.{PID:PatientIdentifierList(1).IDNumber}_context.TextIDTemp_".pdf")' property='tSC' action='set' />
<assign value='$Get(tSC)' property='target.Text' action='set' />
</transform>

Scott Roth · Dec 5, 2016 go to post

This is just another one of our servers that we use. We don't necessarily use SFTP to transfer files between our servers, just SCP. I am wondering if it is an issue with our keys that we have saved off, and not in Ensemble but at the OS Level.

Scott Roth · Dec 2, 2016 go to post

I am unfamiliar with if we have this and how to go about setting it up. I am following up with John Goodgame.

Scott Roth · Nov 28, 2016 go to post

I was just seeing if it was possible at this point, I had not tried to code it. Would I create a custom Service to read in the file or use the EnsLib function and pass it to a BPL to read in the line by line format?

Scott Roth · Nov 22, 2016 go to post

I found by using %Library.File it worked better.

w ##class(%Library.File).DirectoryExists("/ensemble/")
1
w ##class(%Library.File).DirectoryExists("/ensemble/Scott/")
1
w ##class(%Library.File).DirectoryExists("/joe")
0
w ##class(%Library.File).DirectoryExists("/joe/")
0

Thanks for your help.

Scott Roth · Nov 22, 2016 go to post

if I run it from the command line I was expecting for it to return me a 1. Is that not possible?

Scott Roth · Nov 21, 2016 go to post

That was very helpful. Thanks. I just now have to add in code to check the file structure and create a new directory if it does not exist to place the PDF in.

Scott Roth · Nov 21, 2016 go to post

Thanks, the issue I am having though is that it will not even save the file I am writing to.  I am using GetFieldStreamRaw to get the Base64 into a tSC variable, so do I send that tSC variable to the function that I have created to get it to Decode and Save the file?

Scott Roth · Oct 6, 2016 go to post

Is there a way to check the response before doing something to it? So if I get a "Patient Not Found" response, I can then bypass a DTL I have setup for the response?

Scott Roth · Aug 5, 2016 go to post

Looking at the Activity Monitor it looks more of a Analytical tool then anything. Has anyone created their own Production Monitor, or modified the existing monitor to only show those Inbound Connections, Outbound Connections, Processes that are having errors? Is there a way to only show those "Red" issues on the current monitor?

Scott Roth · May 10, 2016 go to post

We are not on 2016.1 as of yet. We just recently upgraded to 2015.2.2. The activity monitor looks like it is more statical than what I am looking for. I am looking for making the Production Monitor more useful for our group.

Scott Roth · Apr 29, 2016 go to post

I just worked with WRC on this same issue. I was able to make copies of %ZEN.Dialog.finderDialog and EnsPortal.LookupSettings. By using these copies I was able to modify some of the methods to limit down the number of tables a end user would have access too by using a filter on the Naming convention.


Class osuwmc.DataLookup.testFinderDialog Extends %ZEN.Dialog.finderDialog
{
Method GetFinderArray(ByRef pParameters, Output pMetaData, Output pData) As %Status
{
Kill tParms
// assemble search parameters
Set tParms("sort") = ..currSortMode
Set tParms("search") = ..searchKey
Set tParms("abstract") = ..includeAbstract
if (..mode = "labLookup"){
tSC = ##class(%ZEN.FinderUtils).%GetArrayForQuery("Ens.Util.LookupTable","Enumerate",$LB("{Name}","{Name}_"".lut""","lut",""),".",,.pMetaData,.tData)
k=""
for {
k=$order(tData(k))
q:k=""
tableName = $li(tData(k),1)
if (tableName [ "LABS") {
pData($i(pData)) = tData(k)
}
}
tSC
}
else {
Quit ##class(%ZEN.FinderUtils).%GetClassListArray(.tParms,.pMetaData,.pData)
}
}


Class osuwmc.DataLookup.testLookupSettings Extends EnsPortal.LookupSettings
{
/// Handle various dialogs.
ClientMethod onPopupAction(popupName, action, value) [ Language = javascript ]
{
try {
if (action != "ok") {
return false;
}
popupName this.removePopupSuffix(popupName);
switch(popupName) {
case 'NewLookup':
if (value.substring(value.length-4).toUpperCase() != '.LUT') value += '.lut';
// note that we fall through to open the page for both NewLookup and LookupOpen
case 'LookupOpen':
var link zenLink('osuwmc.DataLookup.testLookupSettings.zen');
link += (link.indexOf('?') -1 '&' '?') 'LookupTable=' encodeURIComponent(value);
this.setModified(false);
this.gotoPage(link);
break;
case 'switchNamespace':
zenPage.changeURLNamespace(value);
break;
case 'LookupSaveAs':
if (value.substring(value.length-4).toUpperCase() == '.LUT') value value.substring(0,value.length-4);
zenPage.checkName(value);
break;
}
}
catch (ex) {
alert("Error: " ex);
}
}
/// If the new name is already in use, confirm that the user wishes to overwrite the old table of that name.
ClientMethod checkName(newName) [ Language = javascript ]
{
var duplicateName zenPage.NameCheck(newName);
if (duplicateName !="")
{
if (!confirm($$$FormatText($$$Text("Lookup table name '%1' is already in use! Are you sure you want to overwrite this table?"),duplicateName))) {
return;
}
zenPage.RemoveTable(duplicateName);
}
zenPage.renameSave(newName);
var link zenLink('osuwmc.DataLookup.testLookupSettings.zen');
link += (link.indexOf('?') -1 '&' '?') 'LookupTable=' encodeURIComponent(newName+".lut");
this.setModified(false);
this.gotoPage(link);
}
ClientMethod openTable() [ Language = javascript ]
{
if (this.pageModified) {
var doOpen confirm($$$Text('The current lookup table has been modified. Do you wish to discard these changes and open a different lookup table?'));
if (!doOpen) return;
}
var parms { MODE: "labLookup"};
zenLaunchPopupWindow(zenLink('osuwmc.DataLookup.testFinderDialog.cls'),this.addPopupSuffix('LookupOpen'),'status,scrollbars,resizable=yes,width=800,height=600',parms);
}
Method OnGetRibbonInfo(Output pDisplay As %Boolean, Output pViewIcons As %List, Output pSortOptions As %List, Output pSearchBox As %Boolean, Output pRibbonTitle As %String, Output pCommands As %List) As %Status
{
Set pDisplay = 1
Set pRibbonTitle = $$$Text("Lookup Table Viewer")
Set pCommands(1) = $LB("btnOpen",$$$Text("Open"),$$$Text("Open an existing lookup table"),"zenPage.openTable();")
Set pCommands(2) = $LB("btnSave",$$$Text("Save"),$$$Text("Save the current lookup table"),"zenPage.saveTable();")
Set pCommands(3) = $LB("btnSaveAs",$$$Text("Save As"),$$$Text("Save the current lookup table with a different name"),"zenPage.saveTableAs();")
Quit $$$OK
}
}
 

Scott Roth · Apr 21, 2016 go to post

I know most of the Documentation was written years ago, but it would be helpful if there was screen shots on how to do certain things within the Ensemble GUI editors.