› Clovertech Forums › Read Only Archives › Cloverleaf › Cloverleaf › Epic Empty Segments
Write TCL proc that sit on inbound data TPS and KILLs messages that are missing some important required field, like MRN in PID (could be 2 or 3 depending on your Epic profile variable settings). This would be most efficient processing-wise, and easiest to implement/remove.
Hope this helps,
Robert Milfajt
Northwestern Medicine
Chicago, IL
Matthew,
Just a question – What version of Epic are you on? We never saw this type of issue. We implemented version 2012 and have upgraded to 2014. Just curious.
Thanks
Jim Cobane
Henry Ford Health
Matthew,
Just a question – What version of Epic are you on?
Basically looking for a simple proc to get kill messages that come in looking like the below:
MSH|^~&||KGH|||201508241127|ADTPA|ADT^A08|9200|T|2.3
EVN
PID
PV1
They are always A08s but not all A08s are like this – some actually are correct.
Per Robert’s suggestion, you could simply KILL any message where PID 2 or 3 is null. That would address the messages like the sample you provided.
Jim Cobane
Henry Ford Health
I think Matthew is looking for someone to provide an actual proc to do this.
Matthew I have a proc which does almost all of our filtering. It is moree than what you need right now but it will do what you want and can also filter any Cloverleaf definable message type (HL/7, X12, XML, FRL, VRL HRL, etc.) on virtually any field and is extensible as it has its own UPoC architecture.
The proc is argument driven so no need to modify the code.
I know others have similar procs for HL/7 specifically – hopefully someone will respond about one of those.
email: jim.kosloskey@jim-kosloskey.com 30+ years Cloverleaf, 60 years IT – old fart.
Here is one that we have. You can change it to meet your needs fairly simply i believe. Im sure someone has a more streamlined way of doing it.
#########################################################################################
#########################################################################################
#########################################################################################
# Name: tpsKILL_InstGT1.tcl
# Purpose: This tps tclproc will KILL out any ADT’s that has an I in the GT1_10 field
#
#
#
# UPoC type: tps
# Args: tps keyedlist containing the following keys:
# MODE run mode (”start”, “run” or “time”)
# MSGID message handle
# ARGS user-supplied arguments:
# 1) The user can specify if we are to echo to log
# The key is ECHOON
# ECHOON = YES -> put entry in engine log
# ECHOON = NO -> do not put entry in log (default value)
# ECHOON = anything else -> Default to NO
#
# Example arguments: {ECHOON YES}
#
#
# Returns: tps disposition list:
# Continues the messages as is
# OR
# Errors the message
#
#
#
#
#########################################################################################
#########################################################################################
#########################################################################################
proc tpsKILL_InstGT1 { args } {
#########################################################################################
# Get the Connection/Proc Name for Error/Debug Messages (NOT USED)
#########################################################################################
# global HciConnName
# set myname “$HciConnName/[lindex [info level 1] 0]”
# set nowis [clock format [clock scan now] -format “%D – %T”]
#########################################################################################
# Initialize Variables Used
#########################################################################################
set dispList [list] ;# Disposition List Returned to Engine
set fldSep “” ;# Field Seperator – get from MSH
set subSep “” ;# SubField Seperator – get from MSH
set repSep “” ;# Repeating Field Seperator – get from MSH
set GT1pos -1 ;# Position of GT1 Segment in msg
set GT1List [list] ;# GT1 Segment Fields in List Form
set GT1Type 10 ;# Guarantor Type is in field 10
#########################################################################################
# Load in the arguments we need that were passed from the caller
#########################################################################################
keylget args MODE mode ;# The mode the engine called from
set echoon “NO” ;# Set to default Value
keylget args ARGS.ECHOON echoon ;# The Engine Log output indicator
set echoon [string toupper $echoon] ;# Use upper case in procedure
#########################################################################################
# Switch based on what mode the engine was in when it called the procedure
#########################################################################################
switch -exact — $mode {
start { }
run {
set mh [keylget args MSGID] ;# Get message handle from args
set dispList [list “CONTINUE $mh”] ;# Initialize to good message
set msg [msgget $mh] ;# Get a copy of the message
set fldSep [string index $msg 3] ;# Field Seperator
set subSep [string index $msg 4] ;# Sub-Field Seperator
set repSep [string index $msg 5] ;# Repeating Field Seperator
set segList [split $msg r] ;# Split message into segList
#########################################################################################
# Find Position of Segements –
#########################################################################################
set GT1pos [lsearch -regexp $segList {^GT1}]
#########################################################################################
# Split up the Segments into Field Lists
#########################################################################################
set GT1List [split [lindex $segList $GT1pos] $fldSep]
#########################################################################################
#
#########################################################################################
set gtType [lindex $GT1List $GT1Type]
#########################################################################################
# If the GT1-10 = I then KILL the message
# else
# CONTIUNE the message
#########################################################################################
if {[string equal $gtType I]} {
set dispList [list “KILL $mh”]
}
}
time { }
shutdown { }
} ;# End Switch
return $dispList
} ;# End Proc
I shared this post with our integration team and got a response back from one of our bridge certified team members.
We recently went from Epic 2014 to Epic 2015 so I was concerned we would see the same problem and apparently we did but it was handled on the Epic side and I was unaware until now.
Here is the email I got back from one of our team members about this:
FYI. We have error setting in Bridges to log fatal error and suppress ADT messages with blank PID-3. I do see many A08 messages with MSH segment only in our EPIC TST as well like a user said in the clovertech forum, but they are being all suppressed by the error setup.
Russ Ross
RussRoss318@gmail.com
Thanks for the info. This is something that we will keep in the back of our minds as we start planning for the 2015 upgrade.
Jim Cobane
Henry Ford Health
same here. we start our new epic install next month.
Thanks to all for the help.
I have a new quick one? New to everything cloverleaf…
If this is an ORU in the variant i am using
MSH
{
[
PID
[ PD1 ]
[{ NTE } ]
[
PV1
[ PV2 ]
]
]
{
[ ORC ]
OBR
[{ NTE } ]
{
[ OBX ]
[{ NTE } ]
}
[{ CTI } ]
}
}
[ DSC ]
I want to put a value in every obx-3 of =&GDT – i have tried it in the translate using iterate but i do not fully understand how it works esp when the group is repeating and what ‘basis’ to use. I think if i get one good example/explanation i could go from there for the next one. Any help would be appreciated. Thanks.
Matthew,
email me (my email address is in my signature) and I will assist.
email: jim.kosloskey@jim-kosloskey.com 30+ years Cloverleaf, 60 years IT – old fart.
Matthew,
See the Help with Translate Topic.
I have this working now. Thanks Keith and Jim and all that replied with helpful ideas.
Turns out another team member ran across a case that does require a filter on Cloverleaf to get rid of messages with no MRN that still can come from EPIC 2015 despite configurations to prevent that from happening.
Here is what that person sent me in an email about this:
When Cerner receives a message without a MRN, it crashes their listener.
Russ Ross
RussRoss318@gmail.com