- SCMSVUT4 ;BPFO/JRP - IEMM Utilities (cont);6/18/2002
- ;;5.3;Scheduling;**245,1015**;Aug 13, 1993;Build 21
- ;
- Q
- ;
- CNVRTHLQ(STRING,HLQ) ;Convert HL7 null designation to null
- ;Input : STRING - String to perform conversion on
- ; HLQ - HL7 null designation (defaults to "")
- ;Output : STRING with HLQ converted to null
- ;
- ;Declare variables
- N X,L
- S STRING=$G(STRING)
- I (STRING="") Q ""
- S:('$D(HLQ)) HLQ=$C(34,34)
- S:HLQ="" HLQ=$C(34,34)
- S L=$L(HLQ)
- ;Convert by removing all instances of HLQ
- F S X=$F(STRING,HLQ) Q:'X D
- .S STRING=$E(STRING,1,(X-L-1))_$E(STRING,X,$L(STRING))
- Q STRING
- ;
- PARFLD(FLD,OUTARR,HL,SUBS) ;Parse HL7 field by component
- ;Input : FLD - Field to parse
- ; OUTARR - Array to put parsed field into (pass by value)
- ; HL - Array containing HL7 variables (pass by reference)
- ; Using HL("FS"), HL("ECH"), HL("Q")
- ; This is output by $$INIT^HLFNC2()
- ; SUBS - Flag indicating if sub-components should also
- ; be broken out
- ; 0 = No (default)
- ; 1 = Yes
- ;Output : None
- ; OUTARR = Value (if field not broken into components)
- ; OUTARR(Cmp#) = Value
- ; OUTARR(Cmp#,Sub#) = Value (if sub-component requested)
- ;Notes : Existance and validity of input is assumed
- ; : OUTARR initialized (KILLed) on entry
- ; : FLD can not be a repeating field
- ;Declare variables
- N CS,COMP,SS,VALUE,SUB
- S FLD=$G(FLD)
- Q:FLD=""
- Q:'$D(HL)
- S CNVRT=+$G(CNVRT)
- K @OUTARR
- ;Get component & sub-component separators
- S CS=$E(HL("ECH"),1)
- S SS=$E(HL("ECH"),4)
- ;No components - set field at main level
- I FLD'[CS S @OUTARR=FLD Q
- ;Parse out components
- F COMP=1:1:$L(FLD,CS) D
- .S VALUE=$P(FLD,CS,COMP)
- .I 'SUBS S @OUTARR@(COMP)=VALUE Q
- .;Parse out sub-components
- .I VALUE'[SS S @OUTARR@(COMP)=VALUE Q
- .F SUB=1:1:$L(VALUE,SS) D
- ..S @OUTARR@(COMP,SUB)=$P(VALUE,SS,SUB)
- Q
- ;
- PARSEG(SEGARR,OUTARR,HL,PARCOMP,CNVRT) ;Parse HL7 segment by field
- ;Input : SEGARR - Array containing segment (pass by value)
- ; SEGARR = First 245 characters of segment
- ; SEGARR(1..n) = Continuation nodes
- ; OR
- ; SEGARR(0) = First 245 characters of segment
- ; SEGARR(1..n) = Continuation nodes
- ; OUTARR - Array to put parsed segment into (pass by value)
- ; HL - Array containing HL7 variables (pass by reference)
- ; Using HL("FS"), HL("ECH"), HL("Q")
- ; This is output by $$INIT^HLFNC2()
- ; PARCOMP - Flag indicating if fields should be parsed into
- ; their components
- ; 0 = No (default)
- ; 10 = Yes - components only
- ; 11 = Yes - component and sub-components
- ; CNVRT - Flag indicating if HL7 null designation should be
- ; converted to MUMPS null (optional)
- ; 0 = No (default)
- ; 1 = Yes
- ;Output : None
- ; OUTARR will be in the following format:
- ; OUTARR(0) = Segment name
- ; OUTARR(Seq#,Rpt#) = Value
- ; OUTARR(Seq#,Rpt#,Cmp#) = Value
- ; OUTARR(Seq#,Rpt#,Cmp#,Sub#) = Value
- ;
- ;Notes : Existance and validity of input is assumed
- ; : OUTARR initialized (KILLed) on entry
- ; : Assumes no field in segment greater than 245 characters
- ; : Data stored with the least number of subscripts in OUTARR.
- ; If field not broken into components then the component
- ; subscript will not be used. Same is true of the
- ; sub-component subscript.
- ;
- ;Declare variables
- N SEQ,CURNODE,CURDATA,NXTNODE,NXTDATA,VALUE,RS,REP,STOP,SEG
- Q:'$D(SEGARR)
- Q:'$D(@SEGARR)
- Q:'$D(OUTARR)
- Q:'$D(HL)
- S PARCOMP=+$G(PARCOMP)
- S CNVRT=+$G(CNVRT)
- K @OUTARR
- ;Get repetition separator
- S RS=$E(HL("ECH"),2)
- ;Get initial and next nodes
- S CURNODE=$S($D(@SEGARR)#2:"",1:$O(@SEGARR@("")))
- S CURDATA=$S(CURNODE="":@SEGARR,1:@SEGARR@(CURNODE))
- S NXTNODE=$O(@SEGARR@(CURNODE))
- S NXTDATA=$S(NXTNODE="":"",1:$G(@SEGARR@(NXTNODE)))
- ;Get/strip segment name
- S SEG=$P(CURDATA,HL("FS"),1)
- Q:($L(SEG)'=3)
- S CURDATA=$P(CURDATA,HL("FS"),2,99999)
- S @OUTARR@(0)=SEG
- ;Parse out fields
- S STOP=0
- S SEQ=1
- F D Q:STOP
- .S VALUE=$P(CURDATA,HL("FS"),1)
- .;Account for continuation of data on next node
- .I CURDATA'[HL("FS") D
- ..S VALUE=VALUE_$P(NXTDATA,HL("FS"),1)
- ..S NXTDATA=$P(NXTDATA,HL("FS"),2,99999)
- .;Convert HL7 null to MUMPS null
- .I CNVRT S VALUE=$$CNVRTHLQ(VALUE,HL("Q"))
- .;Parse out repetitions
- .F REP=1:1:$L(VALUE,RS) D
- ..;Parse out components
- ..I PARCOMP D Q
- ...D PARFLD($P(VALUE,RS,REP),$NA(@OUTARR@(SEQ,REP)),.HL,(PARCOMP#2))
- ..;Don't parse out components
- ..S @OUTARR@(SEQ,REP)=$P(VALUE,RS,REP)
- .;Increment sequence number
- .S SEQ=SEQ+1
- .;No more fields on current node - move to next node
- .I CURDATA'[HL("FS") D Q
- ..;No more fields - stop parsing
- ..I NXTDATA="" S STOP=1 Q
- ..;Update current node and get next node
- ..S CURDATA=NXTDATA
- ..S CURNODE=NXTNODE
- ..S NXTNODE=$O(@SEGARR@(CURNODE))
- ..S NXTDATA=$S(NXTNODE="":"",1:$G(@SEGARR@(NXTNODE)))
- .;Remove current field from node
- .S CURDATA=$P(CURDATA,HL("FS"),2,99999)
- Q
- ;
- PARMSG(MSGARR,OUTARR,HL,PARCOMP,CNVRT) ;Parse HL7 message by segment
- ; and field
- ;Input : MSGARR - Array containing message (pass by value)
- ; MSGARR(x) = First 245 characters of Xth segment
- ; MSGARR(x,1..n) = Continuation nodes for Xth segment
- ; OUTARR - Array to put parsed message into (pass by value)
- ; HL - Array containing HL7 variables (pass by reference)
- ; Using HL("FS"), HL("ECH"), HL("Q")
- ; This is output by $$INIT^HLFNC2()
- ; PARCOMP - Flag indicating if fields should be parsed into
- ; their components
- ; 0 = No (default)
- ; 1 = Yes
- ; CNVRT - Flag indicating if HL7 null designation should be
- ; converted to MUMPS null (optional)
- ; 0 = No (default)
- ; 10 = Yes - components only
- ; 11 = Yes - component and sub-components
- ;Output : None
- ; OUTARR will be in the following format:
- ; OUTARR(0) = Segment name
- ; OUTARR(SegName,Rpt#)=Seg#
- ; OUTARR(Seg#,Seq#,Rpt#) = Value
- ; OUTARR(Seg#,Seq#,Rpt#,Cmp#) = Value
- ; OUTARR(Seg#,Seq#,Rpt#,Cmp#,Sub#) = Value
- ;
- ;Notes : Existance and validity of input is assumed
- ; : OUTARR initialized (KILLed) on entry
- ; : Assumes no field in segment greater than 245 characters
- ; : Data stored with the least number of subscripts in OUTARR.
- ; If field not broken into components then the component
- ; subscript will not be used. Same is true of the
- ; sub-component subscript.
- ;
- ;Declare variables
- N SEG,SEGNAME,REP
- Q:'$D(MSGARR)
- Q:'$D(@MSGARR)
- Q:'$D(OUTARR)
- Q:'$D(HL)
- S PARCOMP=+$G(PARCOMP)
- S CNVRT=+$G(CNVRT)
- K @OUTARR
- ;Parse message by segment
- S SEG=""
- F S SEG=$O(@MSGARR@(SEG)) Q:SEG="" D
- .;Parse segment
- .D PARSEG($NA(@MSGARR@(SEG)),$NA(@OUTARR@(SEG)),.HL,PARCOMP,CNVRT)
- .;Set up segment index
- .S SEGNAME=$G(@OUTARR@(SEG,0))
- .Q:SEGNAME=""
- .S REP=$O(@OUTARR@(SEGNAME,""),-1)+1
- .S @OUTARR@(SEGNAME,REP)=SEG
- Q
- SCMSVUT4 ;BPFO/JRP - IEMM Utilities (cont);6/18/2002
- +1 ;;5.3;Scheduling;**245,1015**;Aug 13, 1993;Build 21
- +2 ;
- +3 QUIT
- +4 ;
- CNVRTHLQ(STRING,HLQ) ;Convert HL7 null designation to null
- +1 ;Input : STRING - String to perform conversion on
- +2 ; HLQ - HL7 null designation (defaults to "")
- +3 ;Output : STRING with HLQ converted to null
- +4 ;
- +5 ;Declare variables
- +6 NEW X,L
- +7 SET STRING=$GET(STRING)
- +8 IF (STRING="")
- QUIT ""
- +9 IF ('$DATA(HLQ))
- SET HLQ=$CHAR(34,34)
- +10 IF HLQ=""
- SET HLQ=$CHAR(34,34)
- +11 SET L=$LENGTH(HLQ)
- +12 ;Convert by removing all instances of HLQ
- +13 FOR
- SET X=$FIND(STRING,HLQ)
- IF 'X
- QUIT
- Begin DoDot:1
- +14 SET STRING=$EXTRACT(STRING,1,(X-L-1))_$EXTRACT(STRING,X,$LENGTH(STRING))
- End DoDot:1
- +15 QUIT STRING
- +16 ;
- PARFLD(FLD,OUTARR,HL,SUBS) ;Parse HL7 field by component
- +1 ;Input : FLD - Field to parse
- +2 ; OUTARR - Array to put parsed field into (pass by value)
- +3 ; HL - Array containing HL7 variables (pass by reference)
- +4 ; Using HL("FS"), HL("ECH"), HL("Q")
- +5 ; This is output by $$INIT^HLFNC2()
- +6 ; SUBS - Flag indicating if sub-components should also
- +7 ; be broken out
- +8 ; 0 = No (default)
- +9 ; 1 = Yes
- +10 ;Output : None
- +11 ; OUTARR = Value (if field not broken into components)
- +12 ; OUTARR(Cmp#) = Value
- +13 ; OUTARR(Cmp#,Sub#) = Value (if sub-component requested)
- +14 ;Notes : Existance and validity of input is assumed
- +15 ; : OUTARR initialized (KILLed) on entry
- +16 ; : FLD can not be a repeating field
- +17 ;Declare variables
- +18 NEW CS,COMP,SS,VALUE,SUB
- +19 SET FLD=$GET(FLD)
- +20 IF FLD=""
- QUIT
- +21 IF '$DATA(HL)
- QUIT
- +22 SET CNVRT=+$GET(CNVRT)
- +23 KILL @OUTARR
- +24 ;Get component & sub-component separators
- +25 SET CS=$EXTRACT(HL("ECH"),1)
- +26 SET SS=$EXTRACT(HL("ECH"),4)
- +27 ;No components - set field at main level
- +28 IF FLD'[CS
- SET @OUTARR=FLD
- QUIT
- +29 ;Parse out components
- +30 FOR COMP=1:1:$LENGTH(FLD,CS)
- Begin DoDot:1
- +31 SET VALUE=$PIECE(FLD,CS,COMP)
- +32 IF 'SUBS
- SET @OUTARR@(COMP)=VALUE
- QUIT
- +33 ;Parse out sub-components
- +34 IF VALUE'[SS
- SET @OUTARR@(COMP)=VALUE
- QUIT
- +35 FOR SUB=1:1:$LENGTH(VALUE,SS)
- Begin DoDot:2
- +36 SET @OUTARR@(COMP,SUB)=$PIECE(VALUE,SS,SUB)
- End DoDot:2
- End DoDot:1
- +37 QUIT
- +38 ;
- PARSEG(SEGARR,OUTARR,HL,PARCOMP,CNVRT) ;Parse HL7 segment by field
- +1 ;Input : SEGARR - Array containing segment (pass by value)
- +2 ; SEGARR = First 245 characters of segment
- +3 ; SEGARR(1..n) = Continuation nodes
- +4 ; OR
- +5 ; SEGARR(0) = First 245 characters of segment
- +6 ; SEGARR(1..n) = Continuation nodes
- +7 ; OUTARR - Array to put parsed segment into (pass by value)
- +8 ; HL - Array containing HL7 variables (pass by reference)
- +9 ; Using HL("FS"), HL("ECH"), HL("Q")
- +10 ; This is output by $$INIT^HLFNC2()
- +11 ; PARCOMP - Flag indicating if fields should be parsed into
- +12 ; their components
- +13 ; 0 = No (default)
- +14 ; 10 = Yes - components only
- +15 ; 11 = Yes - component and sub-components
- +16 ; CNVRT - Flag indicating if HL7 null designation should be
- +17 ; converted to MUMPS null (optional)
- +18 ; 0 = No (default)
- +19 ; 1 = Yes
- +20 ;Output : None
- +21 ; OUTARR will be in the following format:
- +22 ; OUTARR(0) = Segment name
- +23 ; OUTARR(Seq#,Rpt#) = Value
- +24 ; OUTARR(Seq#,Rpt#,Cmp#) = Value
- +25 ; OUTARR(Seq#,Rpt#,Cmp#,Sub#) = Value
- +26 ;
- +27 ;Notes : Existance and validity of input is assumed
- +28 ; : OUTARR initialized (KILLed) on entry
- +29 ; : Assumes no field in segment greater than 245 characters
- +30 ; : Data stored with the least number of subscripts in OUTARR.
- +31 ; If field not broken into components then the component
- +32 ; subscript will not be used. Same is true of the
- +33 ; sub-component subscript.
- +34 ;
- +35 ;Declare variables
- +36 NEW SEQ,CURNODE,CURDATA,NXTNODE,NXTDATA,VALUE,RS,REP,STOP,SEG
- +37 IF '$DATA(SEGARR)
- QUIT
- +38 IF '$DATA(@SEGARR)
- QUIT
- +39 IF '$DATA(OUTARR)
- QUIT
- +40 IF '$DATA(HL)
- QUIT
- +41 SET PARCOMP=+$GET(PARCOMP)
- +42 SET CNVRT=+$GET(CNVRT)
- +43 KILL @OUTARR
- +44 ;Get repetition separator
- +45 SET RS=$EXTRACT(HL("ECH"),2)
- +46 ;Get initial and next nodes
- +47 SET CURNODE=$SELECT($DATA(@SEGARR)#2:"",1:$ORDER(@SEGARR@("")))
- +48 SET CURDATA=$SELECT(CURNODE="":@SEGARR,1:@SEGARR@(CURNODE))
- +49 SET NXTNODE=$ORDER(@SEGARR@(CURNODE))
- +50 SET NXTDATA=$SELECT(NXTNODE="":"",1:$GET(@SEGARR@(NXTNODE)))
- +51 ;Get/strip segment name
- +52 SET SEG=$PIECE(CURDATA,HL("FS"),1)
- +53 IF ($LENGTH(SEG)'=3)
- QUIT
- +54 SET CURDATA=$PIECE(CURDATA,HL("FS"),2,99999)
- +55 SET @OUTARR@(0)=SEG
- +56 ;Parse out fields
- +57 SET STOP=0
- +58 SET SEQ=1
- +59 FOR
- Begin DoDot:1
- +60 SET VALUE=$PIECE(CURDATA,HL("FS"),1)
- +61 ;Account for continuation of data on next node
- +62 IF CURDATA'[HL("FS")
- Begin DoDot:2
- +63 SET VALUE=VALUE_$PIECE(NXTDATA,HL("FS"),1)
- +64 SET NXTDATA=$PIECE(NXTDATA,HL("FS"),2,99999)
- End DoDot:2
- +65 ;Convert HL7 null to MUMPS null
- +66 IF CNVRT
- SET VALUE=$$CNVRTHLQ(VALUE,HL("Q"))
- +67 ;Parse out repetitions
- +68 FOR REP=1:1:$LENGTH(VALUE,RS)
- Begin DoDot:2
- +69 ;Parse out components
- +70 IF PARCOMP
- Begin DoDot:3
- +71 DO PARFLD($PIECE(VALUE,RS,REP),$NAME(@OUTARR@(SEQ,REP)),.HL,(PARCOMP#2))
- End DoDot:3
- QUIT
- +72 ;Don't parse out components
- +73 SET @OUTARR@(SEQ,REP)=$PIECE(VALUE,RS,REP)
- End DoDot:2
- +74 ;Increment sequence number
- +75 SET SEQ=SEQ+1
- +76 ;No more fields on current node - move to next node
- +77 IF CURDATA'[HL("FS")
- Begin DoDot:2
- +78 ;No more fields - stop parsing
- +79 IF NXTDATA=""
- SET STOP=1
- QUIT
- +80 ;Update current node and get next node
- +81 SET CURDATA=NXTDATA
- +82 SET CURNODE=NXTNODE
- +83 SET NXTNODE=$ORDER(@SEGARR@(CURNODE))
- +84 SET NXTDATA=$SELECT(NXTNODE="":"",1:$GET(@SEGARR@(NXTNODE)))
- End DoDot:2
- QUIT
- +85 ;Remove current field from node
- +86 SET CURDATA=$PIECE(CURDATA,HL("FS"),2,99999)
- End DoDot:1
- IF STOP
- QUIT
- +87 QUIT
- +88 ;
- PARMSG(MSGARR,OUTARR,HL,PARCOMP,CNVRT) ;Parse HL7 message by segment
- +1 ; and field
- +2 ;Input : MSGARR - Array containing message (pass by value)
- +3 ; MSGARR(x) = First 245 characters of Xth segment
- +4 ; MSGARR(x,1..n) = Continuation nodes for Xth segment
- +5 ; OUTARR - Array to put parsed message into (pass by value)
- +6 ; HL - Array containing HL7 variables (pass by reference)
- +7 ; Using HL("FS"), HL("ECH"), HL("Q")
- +8 ; This is output by $$INIT^HLFNC2()
- +9 ; PARCOMP - Flag indicating if fields should be parsed into
- +10 ; their components
- +11 ; 0 = No (default)
- +12 ; 1 = Yes
- +13 ; CNVRT - Flag indicating if HL7 null designation should be
- +14 ; converted to MUMPS null (optional)
- +15 ; 0 = No (default)
- +16 ; 10 = Yes - components only
- +17 ; 11 = Yes - component and sub-components
- +18 ;Output : None
- +19 ; OUTARR will be in the following format:
- +20 ; OUTARR(0) = Segment name
- +21 ; OUTARR(SegName,Rpt#)=Seg#
- +22 ; OUTARR(Seg#,Seq#,Rpt#) = Value
- +23 ; OUTARR(Seg#,Seq#,Rpt#,Cmp#) = Value
- +24 ; OUTARR(Seg#,Seq#,Rpt#,Cmp#,Sub#) = Value
- +25 ;
- +26 ;Notes : Existance and validity of input is assumed
- +27 ; : OUTARR initialized (KILLed) on entry
- +28 ; : Assumes no field in segment greater than 245 characters
- +29 ; : Data stored with the least number of subscripts in OUTARR.
- +30 ; If field not broken into components then the component
- +31 ; subscript will not be used. Same is true of the
- +32 ; sub-component subscript.
- +33 ;
- +34 ;Declare variables
- +35 NEW SEG,SEGNAME,REP
- +36 IF '$DATA(MSGARR)
- QUIT
- +37 IF '$DATA(@MSGARR)
- QUIT
- +38 IF '$DATA(OUTARR)
- QUIT
- +39 IF '$DATA(HL)
- QUIT
- +40 SET PARCOMP=+$GET(PARCOMP)
- +41 SET CNVRT=+$GET(CNVRT)
- +42 KILL @OUTARR
- +43 ;Parse message by segment
- +44 SET SEG=""
- +45 FOR
- SET SEG=$ORDER(@MSGARR@(SEG))
- IF SEG=""
- QUIT
- Begin DoDot:1
- +46 ;Parse segment
- +47 DO PARSEG($NAME(@MSGARR@(SEG)),$NAME(@OUTARR@(SEG)),.HL,PARCOMP,CNVRT)
- +48 ;Set up segment index
- +49 SET SEGNAME=$GET(@OUTARR@(SEG,0))
- +50 IF SEGNAME=""
- QUIT
- +51 SET REP=$ORDER(@OUTARR@(SEGNAME,""),-1)+1
- +52 SET @OUTARR@(SEGNAME,REP)=SEG
- End DoDot:1
- +53 QUIT