[613] | 1 | SCMSVUT4 ;BPFO/JRP - IEMM Utilities (cont);6/18/2002
|
---|
| 2 | ;;5.3;Scheduling;**245**;Aug 13, 1993
|
---|
| 3 | ;
|
---|
| 4 | Q
|
---|
| 5 | ;
|
---|
| 6 | CNVRTHLQ(STRING,HLQ) ;Convert HL7 null designation to null
|
---|
| 7 | ;Input : STRING - String to perform conversion on
|
---|
| 8 | ; HLQ - HL7 null designation (defaults to "")
|
---|
| 9 | ;Output : STRING with HLQ converted to null
|
---|
| 10 | ;
|
---|
| 11 | ;Declare variables
|
---|
| 12 | N X,L
|
---|
| 13 | S STRING=$G(STRING)
|
---|
| 14 | I (STRING="") Q ""
|
---|
| 15 | S:('$D(HLQ)) HLQ=$C(34,34)
|
---|
| 16 | S:HLQ="" HLQ=$C(34,34)
|
---|
| 17 | S L=$L(HLQ)
|
---|
| 18 | ;Convert by removing all instances of HLQ
|
---|
| 19 | F S X=$F(STRING,HLQ) Q:'X D
|
---|
| 20 | .S STRING=$E(STRING,1,(X-L-1))_$E(STRING,X,$L(STRING))
|
---|
| 21 | Q STRING
|
---|
| 22 | ;
|
---|
| 23 | PARFLD(FLD,OUTARR,HL,SUBS) ;Parse HL7 field by component
|
---|
| 24 | ;Input : FLD - Field to parse
|
---|
| 25 | ; OUTARR - Array to put parsed field into (pass by value)
|
---|
| 26 | ; HL - Array containing HL7 variables (pass by reference)
|
---|
| 27 | ; Using HL("FS"), HL("ECH"), HL("Q")
|
---|
| 28 | ; This is output by $$INIT^HLFNC2()
|
---|
| 29 | ; SUBS - Flag indicating if sub-components should also
|
---|
| 30 | ; be broken out
|
---|
| 31 | ; 0 = No (default)
|
---|
| 32 | ; 1 = Yes
|
---|
| 33 | ;Output : None
|
---|
| 34 | ; OUTARR = Value (if field not broken into components)
|
---|
| 35 | ; OUTARR(Cmp#) = Value
|
---|
| 36 | ; OUTARR(Cmp#,Sub#) = Value (if sub-component requested)
|
---|
| 37 | ;Notes : Existance and validity of input is assumed
|
---|
| 38 | ; : OUTARR initialized (KILLed) on entry
|
---|
| 39 | ; : FLD can not be a repeating field
|
---|
| 40 | ;Declare variables
|
---|
| 41 | N CS,COMP,SS,VALUE,SUB
|
---|
| 42 | S FLD=$G(FLD)
|
---|
| 43 | Q:FLD=""
|
---|
| 44 | Q:'$D(HL)
|
---|
| 45 | S CNVRT=+$G(CNVRT)
|
---|
| 46 | K @OUTARR
|
---|
| 47 | ;Get component & sub-component separators
|
---|
| 48 | S CS=$E(HL("ECH"),1)
|
---|
| 49 | S SS=$E(HL("ECH"),4)
|
---|
| 50 | ;No components - set field at main level
|
---|
| 51 | I FLD'[CS S @OUTARR=FLD Q
|
---|
| 52 | ;Parse out components
|
---|
| 53 | F COMP=1:1:$L(FLD,CS) D
|
---|
| 54 | .S VALUE=$P(FLD,CS,COMP)
|
---|
| 55 | .I 'SUBS S @OUTARR@(COMP)=VALUE Q
|
---|
| 56 | .;Parse out sub-components
|
---|
| 57 | .I VALUE'[SS S @OUTARR@(COMP)=VALUE Q
|
---|
| 58 | .F SUB=1:1:$L(VALUE,SS) D
|
---|
| 59 | ..S @OUTARR@(COMP,SUB)=$P(VALUE,SS,SUB)
|
---|
| 60 | Q
|
---|
| 61 | ;
|
---|
| 62 | PARSEG(SEGARR,OUTARR,HL,PARCOMP,CNVRT) ;Parse HL7 segment by field
|
---|
| 63 | ;Input : SEGARR - Array containing segment (pass by value)
|
---|
| 64 | ; SEGARR = First 245 characters of segment
|
---|
| 65 | ; SEGARR(1..n) = Continuation nodes
|
---|
| 66 | ; OR
|
---|
| 67 | ; SEGARR(0) = First 245 characters of segment
|
---|
| 68 | ; SEGARR(1..n) = Continuation nodes
|
---|
| 69 | ; OUTARR - Array to put parsed segment into (pass by value)
|
---|
| 70 | ; HL - Array containing HL7 variables (pass by reference)
|
---|
| 71 | ; Using HL("FS"), HL("ECH"), HL("Q")
|
---|
| 72 | ; This is output by $$INIT^HLFNC2()
|
---|
| 73 | ; PARCOMP - Flag indicating if fields should be parsed into
|
---|
| 74 | ; their components
|
---|
| 75 | ; 0 = No (default)
|
---|
| 76 | ; 10 = Yes - components only
|
---|
| 77 | ; 11 = Yes - component and sub-components
|
---|
| 78 | ; CNVRT - Flag indicating if HL7 null designation should be
|
---|
| 79 | ; converted to MUMPS null (optional)
|
---|
| 80 | ; 0 = No (default)
|
---|
| 81 | ; 1 = Yes
|
---|
| 82 | ;Output : None
|
---|
| 83 | ; OUTARR will be in the following format:
|
---|
| 84 | ; OUTARR(0) = Segment name
|
---|
| 85 | ; OUTARR(Seq#,Rpt#) = Value
|
---|
| 86 | ; OUTARR(Seq#,Rpt#,Cmp#) = Value
|
---|
| 87 | ; OUTARR(Seq#,Rpt#,Cmp#,Sub#) = Value
|
---|
| 88 | ;
|
---|
| 89 | ;Notes : Existance and validity of input is assumed
|
---|
| 90 | ; : OUTARR initialized (KILLed) on entry
|
---|
| 91 | ; : Assumes no field in segment greater than 245 characters
|
---|
| 92 | ; : Data stored with the least number of subscripts in OUTARR.
|
---|
| 93 | ; If field not broken into components then the component
|
---|
| 94 | ; subscript will not be used. Same is true of the
|
---|
| 95 | ; sub-component subscript.
|
---|
| 96 | ;
|
---|
| 97 | ;Declare variables
|
---|
| 98 | N SEQ,CURNODE,CURDATA,NXTNODE,NXTDATA,VALUE,RS,REP,STOP,SEG
|
---|
| 99 | Q:'$D(SEGARR)
|
---|
| 100 | Q:'$D(@SEGARR)
|
---|
| 101 | Q:'$D(OUTARR)
|
---|
| 102 | Q:'$D(HL)
|
---|
| 103 | S PARCOMP=+$G(PARCOMP)
|
---|
| 104 | S CNVRT=+$G(CNVRT)
|
---|
| 105 | K @OUTARR
|
---|
| 106 | ;Get repetition separator
|
---|
| 107 | S RS=$E(HL("ECH"),2)
|
---|
| 108 | ;Get initial and next nodes
|
---|
| 109 | S CURNODE=$S($D(@SEGARR)#2:"",1:$O(@SEGARR@("")))
|
---|
| 110 | S CURDATA=$S(CURNODE="":@SEGARR,1:@SEGARR@(CURNODE))
|
---|
| 111 | S NXTNODE=$O(@SEGARR@(CURNODE))
|
---|
| 112 | S NXTDATA=$S(NXTNODE="":"",1:$G(@SEGARR@(NXTNODE)))
|
---|
| 113 | ;Get/strip segment name
|
---|
| 114 | S SEG=$P(CURDATA,HL("FS"),1)
|
---|
| 115 | Q:($L(SEG)'=3)
|
---|
| 116 | S CURDATA=$P(CURDATA,HL("FS"),2,99999)
|
---|
| 117 | S @OUTARR@(0)=SEG
|
---|
| 118 | ;Parse out fields
|
---|
| 119 | S STOP=0
|
---|
| 120 | S SEQ=1
|
---|
| 121 | F D Q:STOP
|
---|
| 122 | .S VALUE=$P(CURDATA,HL("FS"),1)
|
---|
| 123 | .;Account for continuation of data on next node
|
---|
| 124 | .I CURDATA'[HL("FS") D
|
---|
| 125 | ..S VALUE=VALUE_$P(NXTDATA,HL("FS"),1)
|
---|
| 126 | ..S NXTDATA=$P(NXTDATA,HL("FS"),2,99999)
|
---|
| 127 | .;Convert HL7 null to MUMPS null
|
---|
| 128 | .I CNVRT S VALUE=$$CNVRTHLQ(VALUE,HL("Q"))
|
---|
| 129 | .;Parse out repetitions
|
---|
| 130 | .F REP=1:1:$L(VALUE,RS) D
|
---|
| 131 | ..;Parse out components
|
---|
| 132 | ..I PARCOMP D Q
|
---|
| 133 | ...D PARFLD($P(VALUE,RS,REP),$NA(@OUTARR@(SEQ,REP)),.HL,(PARCOMP#2))
|
---|
| 134 | ..;Don't parse out components
|
---|
| 135 | ..S @OUTARR@(SEQ,REP)=$P(VALUE,RS,REP)
|
---|
| 136 | .;Increment sequence number
|
---|
| 137 | .S SEQ=SEQ+1
|
---|
| 138 | .;No more fields on current node - move to next node
|
---|
| 139 | .I CURDATA'[HL("FS") D Q
|
---|
| 140 | ..;No more fields - stop parsing
|
---|
| 141 | ..I NXTDATA="" S STOP=1 Q
|
---|
| 142 | ..;Update current node and get next node
|
---|
| 143 | ..S CURDATA=NXTDATA
|
---|
| 144 | ..S CURNODE=NXTNODE
|
---|
| 145 | ..S NXTNODE=$O(@SEGARR@(CURNODE))
|
---|
| 146 | ..S NXTDATA=$S(NXTNODE="":"",1:$G(@SEGARR@(NXTNODE)))
|
---|
| 147 | .;Remove current field from node
|
---|
| 148 | .S CURDATA=$P(CURDATA,HL("FS"),2,99999)
|
---|
| 149 | Q
|
---|
| 150 | ;
|
---|
| 151 | PARMSG(MSGARR,OUTARR,HL,PARCOMP,CNVRT) ;Parse HL7 message by segment
|
---|
| 152 | ; and field
|
---|
| 153 | ;Input : MSGARR - Array containing message (pass by value)
|
---|
| 154 | ; MSGARR(x) = First 245 characters of Xth segment
|
---|
| 155 | ; MSGARR(x,1..n) = Continuation nodes for Xth segment
|
---|
| 156 | ; OUTARR - Array to put parsed message into (pass by value)
|
---|
| 157 | ; HL - Array containing HL7 variables (pass by reference)
|
---|
| 158 | ; Using HL("FS"), HL("ECH"), HL("Q")
|
---|
| 159 | ; This is output by $$INIT^HLFNC2()
|
---|
| 160 | ; PARCOMP - Flag indicating if fields should be parsed into
|
---|
| 161 | ; their components
|
---|
| 162 | ; 0 = No (default)
|
---|
| 163 | ; 1 = Yes
|
---|
| 164 | ; CNVRT - Flag indicating if HL7 null designation should be
|
---|
| 165 | ; converted to MUMPS null (optional)
|
---|
| 166 | ; 0 = No (default)
|
---|
| 167 | ; 10 = Yes - components only
|
---|
| 168 | ; 11 = Yes - component and sub-components
|
---|
| 169 | ;Output : None
|
---|
| 170 | ; OUTARR will be in the following format:
|
---|
| 171 | ; OUTARR(0) = Segment name
|
---|
| 172 | ; OUTARR(SegName,Rpt#)=Seg#
|
---|
| 173 | ; OUTARR(Seg#,Seq#,Rpt#) = Value
|
---|
| 174 | ; OUTARR(Seg#,Seq#,Rpt#,Cmp#) = Value
|
---|
| 175 | ; OUTARR(Seg#,Seq#,Rpt#,Cmp#,Sub#) = Value
|
---|
| 176 | ;
|
---|
| 177 | ;Notes : Existance and validity of input is assumed
|
---|
| 178 | ; : OUTARR initialized (KILLed) on entry
|
---|
| 179 | ; : Assumes no field in segment greater than 245 characters
|
---|
| 180 | ; : Data stored with the least number of subscripts in OUTARR.
|
---|
| 181 | ; If field not broken into components then the component
|
---|
| 182 | ; subscript will not be used. Same is true of the
|
---|
| 183 | ; sub-component subscript.
|
---|
| 184 | ;
|
---|
| 185 | ;Declare variables
|
---|
| 186 | N SEG,SEGNAME,REP
|
---|
| 187 | Q:'$D(MSGARR)
|
---|
| 188 | Q:'$D(@MSGARR)
|
---|
| 189 | Q:'$D(OUTARR)
|
---|
| 190 | Q:'$D(HL)
|
---|
| 191 | S PARCOMP=+$G(PARCOMP)
|
---|
| 192 | S CNVRT=+$G(CNVRT)
|
---|
| 193 | K @OUTARR
|
---|
| 194 | ;Parse message by segment
|
---|
| 195 | S SEG=""
|
---|
| 196 | F S SEG=$O(@MSGARR@(SEG)) Q:SEG="" D
|
---|
| 197 | .;Parse segment
|
---|
| 198 | .D PARSEG($NA(@MSGARR@(SEG)),$NA(@OUTARR@(SEG)),.HL,PARCOMP,CNVRT)
|
---|
| 199 | .;Set up segment index
|
---|
| 200 | .S SEGNAME=$G(@OUTARR@(SEG,0))
|
---|
| 201 | .Q:SEGNAME=""
|
---|
| 202 | .S REP=$O(@OUTARR@(SEGNAME,""),-1)+1
|
---|
| 203 | .S @OUTARR@(SEGNAME,REP)=SEG
|
---|
| 204 | Q
|
---|