› Clovertech Forums › Read Only Archives › Cloverleaf › Tcl Library › Splitting the MSH
Here is how i am splitting them:
set MSHList [split [lindex $segList $MSHpos] $fldSep]
set ORCList [split [lindex $segList $ORCpos] $fldSep]
set OBRList [split [lindex $segList $OBRpos] $fldSep]
Are you sure you’re getting the MSH segment? I’d need to see more of the code to know if something else isn’t right. Based on what you have, that should work.
Steve
below is my proc. It works like i want it to, but then i wanted to find something in the msh-5 field but am not getting anything. Attached is a sample message.
proc tpsOrderNumber { args } {
#########################################################################################
# Get the Connection/Proc Name for Error/Debug Messages
#########################################################################################
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
set fldSep “” ;# Field Seperator – get from MSH
set subSep “” ;# SubField Seperator – get from MSH
set repSep “” ;# Repeating Field Seperator – get from MSH
set MSHpos -1 ;# Position of MSH Segment in msg
set OBRpos -1 ;# Position of OBR Segment in msg
set ORCpos -1 ;# Position of ORC Segment in msg
set MSHList
set OBRList
set ORCList
set MSHorderDept 5 ;# Dept test was ordered from
set orderingDept 18 ;# Segment in ordering where
set OBRorderNum 2 ;# OBR Order Number
set ORCorderNum 2 ;# ORC Order Number
set orderDept “” ;# Department that the order was from
set table “OrderNumber_Letter” ;# Table to use for the Order Letter
#########################################################################################
# Switch based on what mode the engine was in when it called the procedure
#########################################################################################
keylget args MODE mode ;# The mode the engine called from
switch -exact — $mode {
start { }
run {
set mh [keylget args MSGID] ;# Get message handle from args
set dispList
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
set fldList
set repList
set subfldList
set segList [split $msg r] ;# Split message into segList
#########################################################################################
# Find Position of Segements – If missing -> Error out Message and Return
#########################################################################################
set OBRpos [lsearch -regexp $segList {^OBR}]
if { $OBRpos < 0 } {
msgmetaset $mh USERDATA “Required Segment OBR Missing!”
echo n n n
echo “:WARN – OBR Segment Missing !”
echo “:WARN – Sending Message to error db.”
echo “:WARN – Here Is: $myname”
echo “:WARN – Now Is: $nowis”
echo $msg
echo n n n
set dispList
return $dispList
}
set ORCpos [lsearch -regexp $segList {^ORC}]
if { $ORCpos < 0 } {
msgmetaset $mh USERDATA “Required Segment ORC Missing!”
echo n n n
echo “:WARN – ORC Segment Missing !”
echo “:WARN – Sending Message to error db.”
echo “:WARN – Here Is: $myname”
echo “:WARN – Now Is: $nowis”
echo $msg
echo n n n
set dispList
return $dispList
}
#########################################################################################
# Getting the MSH, OBR, ORC segment as a list. This part is working.
#########################################################################################
set MSHList [split [lindex $segList $MSHpos] $fldSep]
set ORCList [split [lindex $segList $ORCpos] $fldSep]
set OBRList [split [lindex $segList $OBRpos] $fldSep]
echo MSHList: $MSHList
#########################################################################################
# Getting the Ordering Dept and corresponding letter from the table. This part is working.
#########################################################################################
set orderCode [lindex $MSHList $MSHorderDept]
set orderDept [lindex $OBRList $orderingDept]
set orderLetter [tbllookup $table $orderDept]
echo orderCode: $orderCode
#########################################################################################
# Getting the Order Number from the OBR Segment. This part is working.
#########################################################################################
set cmOrderNum [lindex $OBRList $OBRorderNum]
#########################################################################################
# Join the order letter to the order number. This part is working.
#########################################################################################
set newcmOrderNum [join “$orderLetter$cmOrderNum”]
#########################################################################################
# Put the new order number back into the OBR segment. This part is working.
#########################################################################################
lset ORCList $ORCorderNum $newcmOrderNum
lset OBRList $OBRorderNum $newcmOrderNum
#########################################################################################
# Put the new segment back into the HL& message. This part is working.
#########################################################################################
lset segList $ORCpos [join $ORCList $fldSep]
lset segList $OBRpos [join $OBRList $fldSep]
#########################################################################################
# Rebuild msg and store at mh for engine. This part is working.
#########################################################################################
msgset $mh [join $segList r]
}
time { }
shutdown { }
} ;# End Switch
return $dispList
} ;# End Proc
Remember that MSH:1 is the field separator so when you split MSH
MSH|^&~|||||… so if you are splitting the same as the other segments, then the value in MSH:5 is index 4 since the first pipe is MSH:1.
Index 0 –> MSH
Index 1 –> ^&~ which is really MSH:2
Index 2 –> MSH:3
…
Hope this helps….
To add on what Keith stated, the MSH segment is handled a bit differently when using field numbers. Fields related to indices in the MSH are off by 1.
Example, in the MSH segment, HL7 field 1 is not synonymous with the index after the split. MSH.#1 is the pipe, index 1 after the split is the ^&~.
All the other fields using .# notation regarding HL7 segments match directly to the index value after the split. PID.#18, considered the account number is really the 18 index after the split of the PID segment. So if $pid contains the string of the PID segment only; [lindex [split $pid |] 18] would give you the value of PID.#18.
MSH.#5 is really [lindex [split $msh |] 4] if msh contains just the string of the MSH data.
Thank you all for your replies, learned a few things. When i got to looking at my code:
set MSHList [split [lindex $segList $MSHpos] $fldSep]
i didnt have the MSHpos set for it to find it. After doing that it all seemed to work.
Thanks for your time.