Homepage › Clovertech Forums › Read Only Archives › Cloverleaf › Cloverleaf › tcl OBX append
- This topic has 24 replies, 5 voices, and was last updated 6 years, 1 month ago by Jim Kosloskey.
-
CreatorTopic
-
August 31, 2017 at 12:47 pm #55482Lina PatelParticipant
Would someone be kind enough to assist with existing tcl code OBX append. – 3 new OBX stmts need to be appended to last OBX if exists
– need to then add text and variable info to each OBX.
Thank you in advance for your help.
Lina
-
CreatorTopic
-
AuthorReplies
-
-
August 31, 2017 at 1:56 pm #85482Charlie BursellParticipant
Simple enough
# Get location of all OBX in a list
set loclist [lsearch -all -regexp $segList {^OBX}]
set last [lindex $loclist end]
Now just linsert after the last location. If last is empty then no OBX
-
August 31, 2017 at 6:03 pm #85483Lina PatelParticipant
Thank you!
What is good practice to keep count and add the next OBX(x) ID with the linsert command?
-
September 3, 2017 at 5:15 am #85484Charlie BursellParticipant
You have location of last OBX. Get number from it and simply increment for each one added
To help more you would have to be more specific. What text, what variables, etc
-
September 3, 2017 at 9:40 pm #85485Lina PatelParticipant
If obx exists, add 3 additional obx segments with correct obx numbering
If obx(1) exists, add below info
obx(2)||H|@var1|xx|
obx(3)||DW|@var2|yy|
obx(4))|AW|@var3|zz|
-
September 4, 2017 at 7:09 am #85486Charlie BursellParticipant
Try this.
I did not do a lot of testing so I may have fat-fingered something.
A 15 minute proc 😀
I am not married to it. Modify as you see fit
-
September 5, 2017 at 7:39 pm #85487Lina PatelParticipant
Thanks! Hugh help.
Works in most cases except when equal to 4 OBX or more then run into the error below at the end after values are mapped:
expected integer but got “^~&”
-
September 6, 2017 at 4:54 am #85488Charlie BursellParticipant
Works fine for me. I told you I did do a lot of testing or error catching. I figured I would leave that up to you.
I suggest you look at your data. It looks like you have an OBX with MSH fields.
The proc simply pulls from the last OBX.1 field to get the number. If blank I set to 0 but do not check for invalid data. As I said “^~&” is field one of an MSH segment.
I tested it with 6 OBX segments and got: (Converted CR to LF to make it readable)
MSH|^~&|PSCRIBE|001|RADIS1|001|20080527093606||ORU|20080527093600-2|P|2.3|146968|||||||
PID|||000883421||TEST^TESTING^T.||19540507|M||||||||||2626476|222-32-1111|||||||||||
PV1||O|2C^2308^0||||02620^THORNE^KEITH|||||||||||O||||||||||||||||||||||||||200805270632|||||||||
ORC|RE||||||||||||||||||
OBR|1||5155447336|4270001^CATHZ LT HEART PERC|||200805270905|||||||||02620^THORNE^KEITH||||||200805270935|||F|||||||02620^Thorne, M.D.^Keith|02620||||||||||
OBX|1|FT|CATHZ LT HEART PERC&BODY||DICTATING PHYSICIAN: Thorne, M.D., Keith ||||||F|||20080527093534|||
OBX|2|FT|CATHZ LT HEART PERC&BODY|| ||||||F|||20080527093534|||
OBX|3|FT|CATHZ LT HEART PERC&BODY||DICTATING PHYSICIAN: Thorne, M.D., Keith ||||||F|||20080527093534|||
OBX|4|FT|CATHZ LT HEART PERC&BODY||DICTATING PHYSICIAN: Thorne, M.D., Keith ||||||F|||20080527093534|||
OBX|5|FT|CATHZ LT HEART PERC&BODY|| ||||||F|||20080527093534|||
OBX|6|FT|CATHZ LT HEART PERC&BODY|| ||||||F|||20080527093534|||
OBX|7||H|var1|xx
OBX|8||DW|var2|yy
OBX|9|AW|var3|zz
NTE|1|FT|CATHZ
-
September 6, 2017 at 4:09 pm #85489Lina PatelParticipant
Thanks Charlie,
As always, appreciate your insight and help.
🙂
-
September 19, 2017 at 6:10 pm #85490Lina PatelParticipant
Works in most cases except when equal to 4 OBX or more then run into the error below at the end after values are mapped:
expected integer but got “^~&”
while executing
“incr OBXnum”
Tried setting below in multiple places but did not help.
set OBXnum 0
This error occurs when there is no OBX segment in message[
-
September 19, 2017 at 11:21 pm #85491Lina PatelParticipant
Below code works if OBX segment is available.
Message errors as OBX number check is encoding characters
# The OBX segs to add
set add1 {
-
}
set add2 {
-
}
set add3 {
-
}
# Parse msg and get last OBX location
set segList [split $msg r]
# Location of last OBX
set loclist [lsearch -all -regexp $segList {^OBX}]
# Location of last OBX set OBXnum to 1
if {$loclist eq “”} {set OBXnum 1}
else {
# Get location Of last OBX
set OBXloc [lindex $loclist end]
# Get last OBX and get number – OBX.1
set OBX [split [lindex $segList $OBXloc] $fldSep]
# Get OBX.1
set OBXnum [lindex $OBX 1]
echo “OBXnumelse:” $OBXnum
}
#Works with one OBX
#
# Get OBX.1
#set OBXnum [lindex $OBX 1]
## if {[string trim $OBXnum] eq “”} {set OBXnum 0}
#Works with one OBX- END
if $OBXnum > 1
echo “$OBXnum after:” $OBXnum
# Incrment OBX.1
{ incr OBXnum }
# Set the segments
set first [join [subst $add1] $fldSep]
if $OBXnum > 1 incr OBXnum
set second [join [subst $add2] $fldSep]
if $OBXnum > 1 incr OBXnum
set third [join [subst $add3] $fldSep]
# Just insert them after last OBX
# The linsert command inserts just before the index so we incr
# OBXloc by one
incr OBXloc
set segList [linsert $segList $OBXloc $first $second $third]
set msg [join $segList r]
msgset $mh “$msg”
lappend dispList “CONTINUE $mh”
}
-
September 20, 2017 at 4:36 am #85492Charlie BursellParticipant
Somehow OBXnum is getting set to MSH.1 instead of OBX.1. I cannot see how. I have run it multiple times here with 4 or more OBX segments without fail.
Please send me a copy of the proc. Perhaps something has changed.
Also, if you make the test message just test data, you could send that. Please do not send real data
You could do a work around like:
In the checkMsg proc:
Change
# Just in case
if {[string trim $OBXnum] eq “”} {set OBXnum 0}
To
# Just in case
if {![string is integer -strict $OBXnum]} {set OBXnum 0}
However if you are getting an MSH where you should be getting an OBX something else will surely fail
-
September 20, 2017 at 10:27 am #85493Lina PatelParticipant
Thank you Charlie!
Check above worked for OBXnum
Added same check of OBXloc
OBX counter will not increment and there is an extra space after last segment and new added OBX (below) segments.
RXR|IV|||Med
OBX|0||ActWeight||112|kg
OBX|0||DosWeight||102|kg
OBX|0||Height||189|cm’
-
September 20, 2017 at 11:10 pm #85494Lina PatelParticipant
Attached is an example if no obx in message then 3 OBX added after MSH.
If OBX available then works correctly.
-
September 21, 2017 at 12:29 am #85495Charlie BursellParticipant
Looks like you tried to incorporate what I sent you into another proc. Why do everything inline? Use subprocs and namespaces foe easier maintenance and trouble shooting.
Note in what I sent you:
# If no OBX simply return 0
if {$locs eq “”} {return 0}
And the messages is continued as is.
When I get time I will look at what you have in more detail. It is sort of convoluted and not easy to troubleshoot. I don’t have the databases available.
Do this. If you still have it, run the proc I sent you originally. If it runs without error, begin a line by line compare and see what is wrong. I would strongly suggest you break it into modules. If you do that most of what I sent will plug into what you have.
-
September 21, 2017 at 1:34 am #85496Lina PatelParticipant
Was not sure how to incorporate the SQL variables component that is why it is one long proc.
Still have your code – will continue to work on this.
Thanks!
-
September 21, 2017 at 12:38 pm #85497Lina PatelParticipant
Here is a version with subprocs – no obx and variables need to be passed to the subprocs
-
September 21, 2017 at 12:42 pm #85498Lina PatelParticipant
Test data with no obx
-
September 23, 2017 at 2:45 am #85499Charlie BursellParticipant
Here is my final try at this using namespaces.
You do not need to set ODBC environment with each message.
This assumes each message makes a new connection to DB
I did not use the same ODBC statements as you. I used some generic subroutines I had. I did not understand the use of the SQLBindParameter statement which uses PID.18. It is defined as Input but uses output buffer.
If you still need the Prepare and Bind just change the query routine to use them instead.
Note the queries were all the same except for a code so I made one dynamic query.
I tested a bit using ODBC and a sqlite database but nowhere near the very convoluted queries you have. But notice I did change the queries so they are readable and maintainable.
If no OBX, message is continued as is.
I put some error checking but not enough. More would be better
This is a model and not meant as final product. Change as you see fit.
Good luck with it
-
September 23, 2017 at 6:40 pm #85500Lina PatelParticipant
Thanks Charlie – will check it out!
Appreciate all your help.
-
November 1, 2017 at 10:40 pm #85501Lina PatelParticipant
Hello,
Have a request to copy pid-2 to pid3 if different for this working tclproc below:
-
August 20, 2018 at 7:19 pm #85502Steven SiegfriedParticipant
This code helped me!
-
August 20, 2018 at 9:20 pm #85503Jim KosloskeyParticipant
Just FYI.
Based on the requirements described this coul be done inside an Xlate easily – with no Tcl.
email: jim.kosloskey@jim-kosloskey.com 29+ years Cloverleaf, 59 years IT - old fart.
-
August 21, 2018 at 9:01 am #85504Daniel MurphyParticipant
Jim, I am curious as to how to ADD an OBX (or any segment) using Xlate.
I was trying to figure that out, but ended up writing my own Tcl to handle it. Which doesn’t look like this, but that’s the beauty of programming 🙂
-
August 21, 2018 at 11:10 am #85505Jim KosloskeyParticipant
Daniel,
How that is done is to have your own Iteration Counter whch you maintain using Xlate Actions and prepending a $ to the counter name (like $%s99).
Depending on the circumstances you would keep that in synch with the IB Counter and adjust it when logically necessary. Then use your counter in the OB Address Path in the appropriate location.
Of course you need to provide the data for the additional segment.
I cover this in my Xlate ITERATE class. If you would like to discuss this tehnique more email me and we can chat.
email: jim.kosloskey@jim-kosloskey.com 29+ years Cloverleaf, 59 years IT - old fart.
-
-
AuthorReplies
- The forum ‘Cloverleaf’ is closed to new topics and replies.