| 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
 | 
|---|