Homepage › Clovertech Forums › Read Only Archives › Cloverleaf › Cloverleaf › Replace MSH:4 with PV1:5 need help to finish it
- This topic has 29 replies, 8 voices, and was last updated 8 years, 7 months ago by Albert Sinha.
-
CreatorTopic
-
January 20, 2016 at 7:10 am #54957Albert SinhaParticipant
# Message handle keylget args MSGID mh
set msg [msgget $mh]
set segList [split $msg r]
set fldSep [string index $msg 3]
set subSep [string index $msg 4]
set pidLoc [lsearch -regexp $segList {^MSH}]
set MSH [split [lindex $segList $pidLoc] $fldSep]
How do I split PV1 and then copy the PV1:5 to MSH:4
Some suggestions and help will be really appreciated.
-
CreatorTopic
-
AuthorReplies
-
-
January 20, 2016 at 10:36 am #83579Charlie BursellParticipant
# Message handle
keylget args MSGID mh
set msg [msgget $mh]
set segList [split $msg r]
set fldSep [string index $msg 3]
set subSep [string index $msg 4]
# You don’t need location of PV1 just the fields
set PV1 [split [lsearch -inline -regexp $segList {^PID}] $fldSep]
# MSH is always first segment get list of fields
set MSH [split [lindex $segList 0] $fldSep]
# Get PV1.5
set pv15 [lindex $PV1 5]
# Put PV1.5 into MSH.4 Remember fields are skewed
# by one since you split using field 1
set MSH [lreplace $MSH 3 3 $pv15]
# Replace MSH sith modified segment
set segList [lreplace $segList 0 0 [join $MSH $fldSep]]
# Send it on
msgset $mh [join $segList r]
return “{CONTINUE $mh}”
Note: I have been known to fat-finger some things. I did not test it
-
January 20, 2016 at 5:12 pm #83580David BarrParticipant
I’d use a library for this.
<a href="http://clovertech.infor.com/viewtopic.php?t=4886″ class=”bbcode_url”>http://clovertech.infor.com/viewtopic.php?t=4886Your code would look something like this:
Code:package require hl7
set hl7 [hl7::parse_msg [msgget $mh]]
hl7::set_field hl7 MSH.4 [hl7::get_field hl7 PV1.5]
msgset $mh [hl7::join_msg hl7] -
January 21, 2016 at 5:02 am #83581Albert SinhaParticipant
Thank you very much to both David and Charlie, now I have a better understanding for my next script.
-
January 21, 2016 at 6:59 pm #83582Robert MilfajtParticipant
Does installation of this library on a server require any special access on AIX, i.e., root, etc.?
Thanks for taking the time to create this library David! 😀
Robert Milfajt
Northwestern Medicine
Chicago, IL -
January 21, 2016 at 7:47 pm #83583David BarrParticipant
You just need to extract the archive under $HCIROOT. The files go into the tcl/lib/hl7 subdirectory, so it shouldn’t require root access to install.
-
January 22, 2016 at 5:57 pm #83584Albert SinhaParticipant
In windows it is the same on HCIROOT and just unzip it ?
Thanks again David
-
January 29, 2016 at 8:47 pm #83585David BarrParticipant
I’m not sure about Windows. You probably have to use %HCIROOT% instead of $HCIROOT if you’re typing at a command prompt, but otherwise it should be the same.
-
February 3, 2016 at 1:24 am #83586Albert SinhaParticipant
run { keylget args MSGID mh
set msg [msgget $mh]
set segList [split $msg r]
set fldSep [string index $msg 3]
set subSep [string index $msg 4]
set PID [split [lsearch -inline -regexp $segList {^PID}] $fldSep]
set MSH [split [lindex $segList 0] $fldSep]
# Get Pid 3.3
set pid33 [lindex $PID 3]
set field33 [lindex $pid33 3]
set MSH [lreplace $MSH 3 3 $field33]
set segList [lreplace $segList 0 0 [join $MSH $fldSep]]
# Final restructure
msgset $mh [join $segList r]
return “{CONTINUE $mh}”
Above is what I have for replacing MSH4 with PID3
But here is the input and the output
input:
MSH|^~&|EMR|DMD|PWIM||20160202102658.467||ADT^A31|2016020218221182|P|2.4EVN|A31|20160201110129.503|||USER
PID|1|004100089^^^GMC^MR^EMR|004100089^^^GMC^MR||TRAUMA^ONE^^^^^L||196001010000|M||99^Unknown^HL70005||||||||480000095^^^GMC|||||||||N|||N
output:
MSH|^~&|EMR||PWIM||20160202102658.467||ADT^A31|2016020218221182|P|2.4EVN|A31|20160201110129.503|||USER
PID|1|004100089^^^GMC^MR^EMR|004100089^^^GMC^MR||TRAUMA^ONE^^^^^L||196001010000|M||99^Unknown^HL70005||||||||480000095^^^GMC|||||||||N|||N
Seems like it is not populating which should be GMC, instead a blank in MSH-4 , what I am doing wrong. Thanks in advance for any help or suggestion.
-
February 3, 2016 at 1:23 pm #83587Brandon GrudtParticipant
It does not look like you are splitting by the subfield separator, so your pid33 variable is not a list.
-
February 3, 2016 at 9:43 pm #83588Albert SinhaParticipant
set field33 [lindex [split [lindex $PID 3] $sub] 3]
After replacing field33 with the above line it does not replace it with a blank it keeps it as it is, does not replace it with PID-3.3 . Really need some help to finish this.
-
February 3, 2016 at 11:37 pm #83589David BarrParticipant
It would help if you use the testing tool and echo out some variables at each step. Like I would echo $PID and $sub before “set field33” and echo $field33 after you set it.
-
February 4, 2016 at 1:23 pm #83590Kevin CristParticipant
Here is one we use here at times.
Code:
#########################################################################################
#########################################################################################
#########################################################################################
# Name: tpsTransferField.tcl
# Purpose: – This tps tclproc moves or copies the specified Segment/Field (Source) value
# to new Specified Segment/Field (Destination)location.
# The Source Segment/Field will be set to {} for a MOVE
# The Source Segment/Field will left intact for a COPY
# – If the any of the user supplied arguments (5 of them) are omitted,
# the message will be continued as is and an entry will be made in
# the engine log.
# – If there are mutilple occurances of the Source Segment, the value will be
# taken from the first one.
# – If there are mutilple occurances of the Destination Segment, the value
# will be moved to all of them.
# – If the Source or Destintion Segment does not exist in the message,
# the message will be continued and an entry will be put in
# the engine log.
# – If the New Field does not exist in the message but the segment does,
# blank fields will be added to create the space for the field number
# specified.
# – If the New Field already has data in it, it will be over written.
# – The field numbers start with 0, ie the 3rd field is field number 2.
#
# 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 specified Function
# The key is FUNCTION (only MOVE or COPY are Valid)
# 1) The user specified Source Segment
# The key is SOURCESEG
# 2) The user can specify the Source Field Number
# The key is SOURCEFLD
# 3) The user specified Destination Segment
# The key is DESTINSEG
# 4) The user can specify the Destination Field Number
# The key is DESTINFLD
#
# Example arguments: {FUNCTION MOVE} {SOURCESEG OBR} {SOURCEFLD 25} {DESTINSEG OBR} {DESTINFLD 30}
# This will move the value that is in OBR-25 to OBR-30.
#
# Returns: tps disposition list:
# Continues the modified message
# OR
# Continues the Un-modified message (if bad ARGS passed in)
#
# Created: John Zalesak 04/15/2009
#
#
#########################################################################################
#########################################################################################
#########################################################################################proc tpsTransferField { 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 [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 MSHset Function “” ;# Specifies Move or Copy
set SourceSeg “” ;# Source Segment Name
set SourceFld 0 ;# Source Field Number
set DestinSeg “” ;# Destination Segment Name
set DestinFld 0 ;# Destination Segment Nameset fldVal “” ;# Value to be moved
set null {} ;# Null Valueset segList [list] ;# Message Segments in List Form
set fldList [list] ;# Segment Fields in List Form
set fldCnt [list] ;# Count of Fields in fldListset SourceSegPos [list] ;# List of Seg Pos in segList of Source Seg
set DestinSegPos [list] ;# List of Seg Pos in segList of Destin Segset seg “” ;# A segment from a list of segments
set flds 0 ;# Field Counter used in a loop#########################################################################################
# Load in the arguments we need that were passed from the caller
#########################################################################################keylget args MODE mode ;# The mode the engine called from
keylget args ARGS.FUNCTION Function ;# The Function reqested (MOVE/COPY)
set Function [string toupper $Function] ;# Force to uppercasekeylget args ARGS.SOURCESEG SourceSeg ;# Source Segement Name
set SourceSeg [string toupper $SourceSeg] ;# Force to uppercase
keylget args ARGS.SOURCEFLD SourceFld ;# Source Field Numberkeylget args ARGS.DESTINSEG DestinSeg ;# Destination Segement Name
set DestinSeg [string toupper $DestinSeg] ;# Force to uppercase
keylget args ARGS.DESTINFLD DestinFld ;# Destination Field Number#########################################################################################
# Switch based on what mode the engine was in when it called the procedure
#########################################################################################switch -exact — $mode {
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 messageset fldSep [string index $msg 3] ;# Field Seperator
set subSep [string index $msg 4] ;# Sub-Field Seperator
set repSep [string index $msg 5] ;# Repeating Field Seperatorset segList [split $msg r] ;# Split message into segList
#########################################################################################
# Validate the user supplied values
#########################################################################################if { $Function == “MOVE” || $Function == “COPY” } {
} else {
echo n n
echo “==========================================================”
echo “:WARN – Invalid Function Supplied !”
echo “:WARN – Function = “$Function” ”
echo “:WARN – Message Continued As Is.”
echo “:WARN – Here Is: $myname”
echo “:WARN – Now Is: $nowis”
echo $msg
echo “==========================================================”
echo n n
return $dispList
}if { $SourceSeg == “” || $DestinSeg == “” } {
echo n n
echo “==========================================================”
echo “:WARN – Required Segment was not Supplied !”
echo “:WARN – Source Segment = “$SourceSeg” ”
echo “:WARN – Destination Segment = “$DestinSeg” ”
echo “:WARN – Message Continued As Is.”
echo “:WARN – Here Is: $myname”
echo “:WARN – Now Is: $nowis”
echo $msg
echo “==========================================================”
echo n n
return $dispList
}if { $SourceFld == “” || $SourceFld == 0 ||
$DestinFld == “” || $DestinFld == 0 } {
echo n n
echo “==========================================================”
echo “:WARN – Invalid or No Field Number Was Supplied !”
echo “:WARN – Source Field Number = “$SourceFld” ”
echo “:WARN – Destination Field Number = “$DestinFld” ”
echo “:WARN – Message Continued As Is.”
echo “:WARN – Here Is: $myname”
echo “:WARN – Now Is: $nowis”
echo $msg
echo “==========================================================”
echo n n
return $dispList
}#########################################################################################
# Find Position of Segement(s) – If missing -> Continue Message and Return
#########################################################################################set SourceSegPos [lsearch -all -regexp $segList “^$SourceSeg”]
if { [lindex $SourceSegPos 0] < 0 } {
echo n n
echo "=========================================================="
echo ":WARN – Source Segment "$SourceSeg" Is Missing !"
echo ":WARN – Message Continued As Is."
echo ":WARN – Here Is: $myname"
echo ":WARN – Now Is: $nowis"
echo $msg
echo "=========================================================="
echo n n
return $dispList
}set DestinSegPos [lsearch -all -regexp $segList "^$DestinSeg"]
if { [lindex $DestinSegPos 0] = [expr $SourceFld + 1]} {
set fldVal [lindex $fldList $SourceFld]
if { $Function == “MOVE” } {
lset fldList $SourceFld $null
lset segList [lindex $SourceSegPos] [join $fldList $fldSep]
}
} else {
echo n n
echo “==========================================================”
echo “:WARN – Source Segment “$SourceSeg” ”
echo “:WARN – Does not Contian Field Number: “$SourceFld” ”
echo “:WARN – Message Continued As Is.”
echo “:WARN – Here Is: $myname”
echo “:WARN – Now Is: $nowis”
echo $msg
echo “==========================================================”
echo n n
return $dispList
}#########################################################################################
# Write the Source Field Value into the Destination Field – Add blank fields if needed
#########################################################################################foreach seg $DestinSegPos {
set fldList [split [lindex $segList $seg] $fldSep]
set fldCnt [llength $fldList]for { set flds $fldCnt } { $flds < [expr $DestinFld + 1] } { incr flds } {
lappend fldList $null
}
lset fldList $DestinFld $fldVal
lset segList $seg [join $fldList $fldSep]
}#########################################################################################
# Recreate the message and store back at msg handle
#########################################################################################set msg [join $segList r]
msgset $mh $msg}
start { }
time { }
shutdown { }
default {
echo ":WARN"
echo ":WARN ======================================"
echo ":WARN – tps called with invalid mode !"
echo ":WARN – Mode Is: $mode"
echo ":WARN – Here Is: $myname"
echo ":WARN – Now Is: $nowis"
echo ":WARN ======================================"
echo ":WARN"
}
} ;# End Switchreturn $dispList
} ;# End Proc
[quote][/quote] -
February 4, 2016 at 7:04 pm #83591Michael HertelParticipant
set field33 [lindex [split [lindex $PID 3] $sub] 3]
Should have blown up on you.
Use $subSep not $sub
set field33 [lindex [split [lindex $PID 3] $subSep] 3]
-
February 4, 2016 at 9:13 pm #83592Albert SinhaParticipant
thank you all, I will try all the suggestions and test it out.
-
February 4, 2016 at 9:44 pm #83593Jim KosloskeyParticipant
Another thought:
Xlate:
BULKCOPY
COPY PV1-5 –> MSH-4
Done
I am not a proponent of using BULKCOPY but this is quick to do.
email: jim.kosloskey@jim-kosloskey.com 29+ years Cloverleaf, 59 years IT - old fart.
-
February 5, 2016 at 7:28 pm #83594Albert SinhaParticipant
proc replace_MSH_4_PID_3 { args } {
keylget args MODE mode ;# Fetch mode
set dispList {} ;# Nothing to return
switch -exact — $mode {
start {
}
run { keylget args MSGID mh
set msg [msgget $mh]
set segList [split $msg r]
set fldSep [string index $msg 3]
set subSep [string index $msg 4]
set sub [string index ‘^’]
set PID [split [lsearch -inline -regexp $segList {^PID}] $fldSep]
set MSH [split [lindex $segList 0] $fldSep]
# Get Pid 3.3
set field33 [lindex [split [lindex $PID 3] $subsep] 3]
set MSH [lreplace $MSH 3 3 $field33]
set segList [lreplace $segList 0 0 [join $MSH $fldSep]]
# Final restructure
msgset $mh [join $segList r]
return “{CONTINUE $mh}”
}
time {
# Timer-based processing
# N.B.: there may or may not be a MSGID key in args
}
shutdown {
# Doing some clean-up work
}
default {
error “Unknown mode ‘$mode’ in tpsFixOnMSH”
}
}
return $dispList
}
Above is what I have when I have the tcl in the thread nothing crosses over. When I take it out it goes over.
-
February 5, 2016 at 7:33 pm #83595Michael HertelParticipant
The proc is case sensitive.
use $subSep
Change this line -> set field33 [lindex [split [lindex $PID 3] $subsep] 3]
To this line -> set field33 [lindex [split [lindex $PID 3] $subSep] 3]
Are you running this through your testing tool?
It should be bombing there with an undefined error.
-
February 6, 2016 at 12:18 am #83596Albert SinhaParticipant
Yes I am running it via testing tool
-
February 6, 2016 at 1:34 am #83597Michael HertelParticipant
Isn’t it erring on an undefined variable?
In any event, did you make the change and does it work now?
-
February 10, 2016 at 5:41 pm #83598Albert SinhaParticipant
proc replace_MSH_4_PID_3 { args } {
keylget args MODE mode ;# Fetch mode
set dispList {} ;# Nothing to return
switch -exact — $mode {
start {
}
run { keylget args MSGID mh
set msg [msgget $mh]
set segList [split $msg r]
set fldSep [string index $msg 3]
set subSep [string index $msg 4]
set PID [split [lsearch -inline -regexp $segList {^PID}] $fldSep]
set MSH [split [lindex $segList 0] $fldSep]
# Get Pid 3.3
# set pid33 [lindex $PID 3]
# set field33 [lindex $pid33 3]
set field33 [lindex [split [lindex $PID 3] $subSep] 3]
set MSH [lreplace $MSH 3 3 $field33]
set segList [lreplace $segList 0 0 [join $MSH $fldSep]]
# Final restructure
msgset $mh [join $segList r]
return “{CONTINUE $mh}”
}
time {
# Timer-based processing
# N.B.: there may or may not be a MSGID key in args
}
shutdown {
# Doing some clean-up work
}
default {
error “Unknown mode ‘$mode’ in tpsFixOnMSH”
}
}
return $dispList
}
Here is the whole script I made the change for subSep still not working, it does not send the message, when I take it out the messages go thru fine.
-
February 10, 2016 at 6:04 pm #83599Kevin CristParticipant
i copied your script and got it worked fine for me with no modifications.
-
February 10, 2016 at 9:30 pm #83600Albert SinhaParticipant
what you think might be the problem I am just putting it right on the tps of the outbound thread, and as soon as I stop and restart the process and send a new message it does not go , I take it out and resend it goes thru fine.
-
February 10, 2016 at 9:56 pm #83601David BarrParticipant
Have you looked in the error database?
-
February 11, 2016 at 2:53 am #83602Charlie BursellParticipant
Mike
Change this line -> set field33 [lindex [split [lindex $PID 3] $subsep] 3]
To this line -> set field33 [lindex [split [lindex $PID 3] $subSep] 3]
Would return PID.3.2 which is probably the emty string.
I too think the proc is good. To insure put a before and after echo statement
set segList [split $msg r]
#DEBUG
echo nBEFORE:
foreach el $segList {echo $el}
echo
#DEBUG
echo nAFTER:
foreach el $segList {echo $el}
echo
Note newlines before and after each echo to set it apart from any other garbage. You can run it through hcitpstest or the engine. See if change is there.
Be sure and remove DEBUG once problem is resolved.
-
February 11, 2016 at 5:59 am #83603Michael HertelParticipant
Charlie, I don’t want to question you since you are the master.
But it counts from zero so I think you’re counting in the wrong direction.
Besides, Kevin said it tested fine. Lol
If you think I’m wrong, I’ll run the code through my engine to make sure I’m not nuts. But by now I am spending way too much time on this. I was only trying to point out the undefined variable, not the field position.
🤓
-
February 11, 2016 at 7:56 am #83604Charlie BursellParticipant
I will take your work for it but breaking it down from inner to outer:
[lindex [split [lindex $PID 3] $subSep] 3]
set var1 [lindex $PID 3] ;# Returns PID field 3
set var2 [split $var1 $subSep] ;# Splits PID,3 into subfields
set var3 [lindex $var2 3] ;3 Returns PID.3.2 0-based
Where am I wrong?
-
February 11, 2016 at 1:21 pm #83605Kevin CristParticipant
i only did mine in the testing tool. i did not put it in a thread and test that way.
-
February 11, 2016 at 5:00 pm #83606Michael HertelParticipantQuote:
I will take your work for it but breaking it down from inner to outer:
[lindex [split [lindex $PID 3] $subSep] 3]
set var1 [lindex $PID 3] ;# Returns PID field 3
set var2 [split $var1 $subSep] ;# Splits PID,3 into subfields
set var3 [lindex $var2 3] ;3 Returns PID.3.2 0-based
Where am I wrong?
Ok, here’s what I’m thinking:
[lindex $var2 0] = PID-3.1
[lindex $var2 1] = PID-3.2
[lindex $var2 2] = PID-3.3
[lindex $var2 3] = PID-3.4 <—Returns PID-3.4 not PID-3.2 as you state.
Where am I wrong? 😉
-
February 11, 2016 at 5:25 pm #83607Albert SinhaParticipant
I will try it with the echo.
Really appreciate you guys help on this.
-
-
AuthorReplies
- The forum ‘Cloverleaf’ is closed to new topics and replies.