Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: LA7UTILC

LA7UTILC.m

Go to the documentation of this file.
  1. LA7UTILC ;DALOI/JDB - Browse UI message <cont> ;05/01/09 15:59
  1. ;;5.2;AUTOMATED LAB INSTRUMENTS;**74**;Sep 27, 1994;Build 229
  1. ;
  1. Q
  1. ;
  1. ;
  1. BRO(LA7HDR,LA7DOC,LA7IEN,LA7J) ; Setup text for browser.
  1. ; Called from DQ^LA7UTILA
  1. ;
  1. N LA7,LA7DT,LA7X,I,J,K,X,Y,EOS,SEGIN
  1. ;
  1. K ^TMP($$RTNNM,$J,"SEG")
  1. K ^TMP($$RTNNM,$J,"COMP")
  1. ;
  1. D GETS^DIQ(62.49,LA7IEN,".01:149;151:161;162*","ENR","LA7") ; Retrieve data from file 62.49
  1. S J=$G(LA7J,1)
  1. D ADDTEXT(" ["_$$CJ^XLFSTR(" Message Statistics ",IOM-4,"*")_"]")
  1. D ADDTEXT(" ")
  1. ;
  1. S I="LA7(62.49)",K=0,J(0)=J
  1. F S I=$Q(@I) Q:I="" Q:$E($QS(I,1),1,5)'=62.49 D
  1. . S X=$QS(I,3)_": "_@I
  1. . I K=0,$L(X)>((IOM\2)-1) S K=1,Y=""
  1. . I K=0 S K=1,Y=$$LJ^XLFSTR(X,(IOM\2)+2)
  1. . E S K=0 D ADDTEXT(Y_$QS(I,3)_": "_@I)
  1. I K=1 D ADDTEXT(Y)
  1. I J(0)=J D ADDTEXT($$CJ^XLFSTR(" [None Found]",IOM-1))
  1. S LA7X=$G(^LAHM(62.49,LA7IEN,0))
  1. S LA7DT=$P(LA7X,"^",5) ; Date/time message received
  1. S LA7DT(0)=LA7DT\1 ; Date message received.
  1. S LA7DT(1)=LA7DT#1 ; Time message received.
  1. S K="LA7ERR^"_(LA7DT(0)-.1)
  1. D ADDTEXT(" ")
  1. D ADDTEXT(" ["_$$CJ^XLFSTR(" Error Message ",IOM-4,"*")_"]")
  1. D ADDTEXT(" ")
  1. ;
  1. ; Save value of "J", determine if any error message found.
  1. S J(0)=J
  1. F S K=$O(^XTMP(K)) Q:K=""!($P(K,"^")'="LA7ERR") D
  1. . I LA7DT(0)=$P(K,"^",2) S I=LA7DT(1)-.01 S:I<0 I=0 ; Start looking after date/time of message.
  1. . E S I=0
  1. . F S I=$O(^XTMP(K,I)) Q:'I D
  1. . . S X=^XTMP(K,I)
  1. . . I $P(X,"^",2)=LA7IEN D
  1. . . . D ADDTEXT("Date: "_$$FMTE^XLFDT($P(K,"^",2)+I,1))
  1. . . . S X=$P(X,"^",4)
  1. . . . S X=$$DECODEUP^XMCU1(X)
  1. . . . D ADDTEXT("Text: "_X) ; Get error message.
  1. . . . D ADDTEXT(" ")
  1. ;
  1. I J(0)=J D ADDTEXT($$CJ^XLFSTR("[None Found]",IOM-1))
  1. D ADDTEXT(" ")
  1. D ADDTEXT(" ["_$$CJ^XLFSTR(" Text of Message ",IOM-4,"*")_"]")
  1. D ADDTEXT(" ")
  1. D HLIN("^LAHM(62.49,LA7IEN,150,")
  1. ;
  1. ; If linked to another entry go parse that entry also
  1. I $P(LA7X,"^",7) D BRO("LA7 UI Message Display",LA7DOC,$P(LA7X,"^",7),J)
  1. ;
  1. ; Setup document list.
  1. S LA7HDR=LA7HDR_" Msg #"_LA7DOC_" - "_$P(^LAHM(62.49,LA7DOC,0),"^",6)
  1. S ^TMP($J,"LIST",LA7HDR)="^TMP(""DDB"",$J,"_LA7DOC_")"
  1. Q
  1. ;
  1. ;
  1. HLIN(GBL) ;
  1. ; Retrieve/Parse HL7 message from global.
  1. ; Uses LA7DOC,J,LA7X,LA7PASR in symtbl
  1. ; Can be called separately to populate ^TMP("DDB",$J
  1. ; Inputs
  1. ; GBL: Open global root where HL7 message is stored
  1. ; : Format must be ^GBL(subscripts,seq,0)=data
  1. ; : ie ^LAHM(62.49,LA7IEN,150,
  1. ;
  1. N EOS,HLFS,HLECH,CNT,I,SEGIN
  1. I $D(LA7DOC)[0 N LA7DOC S LA7DOC=""
  1. I $D(LA7X)[0 N LA7X S LA7X=""
  1. I $D(J)[0 N J S J=0
  1. S J(0)=J
  1. S I=0
  1. S EOS=0 ;End of Segment flag
  1. ; HL7 message text. Segments are separated by empty
  1. ; lines in the WP field. Segments can be greater than
  1. ; global line storage limit (continuation).
  1. ; Each HL7 segment is stored (one at a time) in
  1. ; ^TMP($$NMSPC,$J,"SEG",#) for passing to SEG2FLD API
  1. ;
  1. K ^TMP($$RTNNM(),$J,"SEG")
  1. ;
  1. ; Segments are stored one at a time here for SEG2FLD API
  1. S SEGIN="^TMP("""_$$RTNNM()_""",$J,""SEG"")"
  1. S CNT=0
  1. S GBL=$G(GBL)
  1. Q:GBL=""
  1. S GBL=GBL_"I)"
  1. S I=0
  1. F S I=$O(@GBL) Q:'I D
  1. . S CNT=CNT+1
  1. . S GBL(0)=$E(GBL,1,$L(GBL)-1)
  1. . S GBL(0)=GBL(0)_",0)"
  1. . S X=$G(@GBL(0))
  1. . I $G(HLFS)="" I $E(X,1,3)="MSH" S HLFS=$E(X,4,4),HLECH=$E(X,5,8)
  1. . D ADDTEXT(X)
  1. . I X="" S EOS=1 ;end of segment indicated by blank line
  1. . E S EOS=0
  1. . ; Parse each message segment.
  1. . I '$G(LA7PARS) Q
  1. . I 'EOS S ^TMP($$RTNNM,$J,"SEG",CNT)=X
  1. . I EOS D ;
  1. . . N HLARR,HLOARR
  1. . . M HLARR=^TMP($$RTNNM,$J,"SEG")
  1. . . D HL2HLO(,.HLARR,HLFS_HLECH,.HLOARR)
  1. . . K HLARR
  1. . . D PF
  1. . . S EOS=0
  1. . . K ^TMP($$RTNNM,$J,"SEG")
  1. . . K ^TMP("LA7VHLU7-S2F",$J,"SEG")
  1. . ;
  1. ;
  1. I J(0)=J D ADDTEXT($$CJ^XLFSTR("[None Found]",IOM-1))
  1. Q
  1. ;
  1. ;
  1. PF ;
  1. ; Parse Fields
  1. ; HLO compatible array in HLOARR
  1. ; Symbol Table
  1. ; HLFS defined (HL7 Field Separator)
  1. ;
  1. N NODE,NODEN,SUB,FLD,FLDCNT,FLDLAST,STR,SEG,CNT,ISCOMP,ISMSH,DATA
  1. N SHOWNULL,SHOWFLD,SEG2FLD,PROCFLD
  1. N COMP,I,NXTFLD,NXTCOMP,OUT,REP,SEGID,SUB,OUT
  1. ;
  1. S FLDCNT=0 ;field count
  1. S FLDLAST=1 ; last field #
  1. S CNT=0
  1. K ^TMP($$RTNNM,$J,"COMP")
  1. S SEG="UNKNOWN" ;segment name
  1. S ISCOMP=0 ; is a component field
  1. S ISMSH=0 ; is the MSH segment
  1. S SHOWNULL='+$P($G(LA7PARS),"^",2) ;User wants to show empty fields
  1. S SHOWFLD=1 ; show field (1=yes 0=no)
  1. S SEG2FLD="LA7VHLU7-S2F" ; ^TMP subscript where SEG2FLD outputs
  1. ;
  1. S NODE="HLOARR(1)"
  1. S SEGID=$G(HLOARR(0,1,1,1))
  1. I SEGID="MSH" S ISMSH=1
  1. ;
  1. F S NODE=$Q(@NODE) Q:NODE="" D ;
  1. . S STR=""
  1. . S CNT=CNT+1
  1. . S FLD=$QS(NODE,1) ;field #
  1. . S REP=$QS(NODE,2)
  1. . S COMP=$QS(NODE,3)
  1. . S SUB=$QS(NODE,4) ; sub # (a field starts at 0)
  1. . S DATA=@NODE
  1. . S NXTFLD=FLD
  1. . S NXTCOMP=COMP
  1. . ;look ahead
  1. . S X=$Q(@NODE)
  1. . ;W !,"X=",X
  1. . I X'="" S NXTFLD=$QS(X,1) S NXTCOMP=$QS(X,3)
  1. . I '$D(FLD(FLD,"ISREP")) D ;
  1. . . S X=$O(HLOARR(FLD,1))
  1. . . I X S FLD(FLD,"ISREP")=1
  1. . . E S FLD(FLD,"ISREP")=0
  1. . ;
  1. . ; display field if component field
  1. . I FLD=NXTFLD I NXTCOMP'=COMP I $G(FLD(FLD))'=1 D ;
  1. . . K OUT
  1. . . S X=$$HLO2STR(.HLOARR,FLD,HLFS_HLECH,.OUT)
  1. . . I '$D(OUT) S OUT(0)=X K X
  1. . . S I=""
  1. . . F S I=$O(OUT(I)) Q:I="" D ;
  1. . . . I I=0 D ADDTEXT(SEGID_"-"_FLD_" = "_OUT(I))
  1. . . . I I D ADDTEXT(OUT(I),1)
  1. . . S FLD(FLD)=1 ;full field has been displayed
  1. . . K OUT
  1. . ;
  1. . S STR=SEGID_"-"_FLD
  1. . I REP=1 I FLD(FLD,"ISREP") S STR=STR_".1"
  1. . I REP>1 S STR=STR_"."_REP
  1. . I COMP>1 S STR=STR_"-"_COMP
  1. . I COMP=1 D
  1. . . S X=$Q(@NODE)
  1. . . I X'="",$QS(X,1)=FLD,$QS(X,2)=REP,$QS(X,3)'=COMP,$QS(X,4)=SUB S STR=STR_"-"_COMP
  1. . I SUB>1 S STR=STR_"-"_SUB
  1. . I SUB=1 D
  1. . . S X=$Q(@NODE)
  1. . . I X'="",$QS(X,1)=FLD,$QS(X,2)=REP,$QS(X,3)=COMP,$QS(X,4)'=SUB S STR=STR_"-"_SUB
  1. . S STR=STR_" = "_DATA
  1. . D ADDTEXT(STR)
  1. ;
  1. ; Separate segments with blank line.
  1. D ADDTEXT("")
  1. Q
  1. ;
  1. ;
  1. PC(SEGNAM,FLDNUM,SHOWNULL) ;
  1. ; Parse Components
  1. ; In Symbol table:
  1. ; HLECH defined (HL7 encoding characters)
  1. ; ^TMP($$RTNNM,$J,"COMP") already has the field's data from PF above
  1. ;
  1. N IN,STR,COMPNUM,NODE,DATA,COMP,SUB,SEG2FLD
  1. S SEGNAM=$G(SEGNAM)
  1. S SHOWNULL=+$G(SHOWNULL)
  1. S SEG2FLD=$$RTNNM()
  1. S IN="^TMP("""_$$RTNNM_""","_$J_",""COMP"")"
  1. ; will return components in ^TMP("LA7VHLU7-S2F",$J,"COMP",1,0)
  1. K ^TMP("LA7VHLU7-S2F",$J,"COMP")
  1. D SEG2FLDS^LA7VHLU7(IN,"COMP",$E(HLECH,1,1))
  1. S NODE="^TMP(""LA7VHLU7-S2F"",$J,""COMP"")"
  1. F S NODE=$Q(@NODE) Q:NODE="" Q:$QS(NODE,1)'="LA7VHLU7-S2F" Q:$QS(NODE,2)'=$J Q:$QS(NODE,3)'="COMP" D ;
  1. . S DATA=@NODE
  1. . I 'SHOWNULL,DATA="" Q ;
  1. . S COMP=$QS(NODE,4)
  1. . S SUB=$QS(NODE,5)
  1. . S STR=SEGNAM_"-"_FLDNUM_"-"_COMP_" = "_DATA
  1. . I SEGNAM="MSH" I FLDNUM=2 S STR="" ;dont decode MSH-2
  1. . I STR'="" D ADDTEXT(STR)
  1. K ^TMP("LA7VHLU7-S2F",$J,"COMP")
  1. Q
  1. ;
  1. ;
  1. ADDTEXT(STR,APPEND) ;
  1. S STR=$G(STR)
  1. S APPEND=+$G(APPEND)
  1. N X
  1. Q:$G(LA7DOC)=""
  1. ; FM Browser does not like holes in the global subscript
  1. ; ie ^TMP("DDB",1) -> ^TMP("DDB",3) (missing #2 sub)
  1. ; will cause Browser to stop display
  1. S X=+$O(^TMP("DDB",$J,LA7DOC,"A"),-1)
  1. I 'APPEND D ;
  1. . S X=X+1
  1. . S ^TMP("DDB",$J,LA7DOC,X)=$G(STR)
  1. . S J=J+1
  1. I APPEND D ;
  1. . S ^TMP("DDB",$J,LA7DOC,X)=$G(^TMP("DDB",$J,LA7DOC,X))_STR
  1. Q
  1. ;
  1. RTNNM() ;
  1. Q $T(+0)
  1. ;
  1. ;
  1. STRBUF(BUFF,ADD,MAXSTR,OUT) ;
  1. ; Breaks a long string into an array based on MAXSTR.
  1. ; Leftover string is in BUF after call.
  1. ; This method is recursive.
  1. ; Used in HLO2STR API.
  1. ; Inputs
  1. ; BUFF:<byref> Buffer (should be empty at start)
  1. ; ADD:<byref> New text to add (is consumed by process)
  1. ; MAXSTR: Max string length <dflt=245>
  1. ; OUT:<byref> See Outputs
  1. ; Outputs
  1. ; BUFF: Any leftover portion of the string.
  1. ; OUT: The array that holds the portions of the string,
  1. ; starting at node 0.
  1. ;
  1. N AVAIL,IDX,I,II
  1. S ADD=$G(ADD)
  1. S MAXSTR=$G(MAXSTR,245)
  1. S AVAIL=MAXSTR-$L(BUFF)
  1. I AVAIL<0 S AVAIL=0
  1. I 'AVAIL D ;
  1. . I '$D(OUT) S IDX=0
  1. . E S IDX=+$O(OUT("A"),-1)+1
  1. . S OUT(IDX)=BUFF
  1. . S BUFF=""
  1. ; max out buffer
  1. S AVAIL=MAXSTR-$L(BUFF)
  1. S BUFF=BUFF_$E(ADD,1,AVAIL)
  1. S $E(ADD,1,AVAIL)=""
  1. ; finish off
  1. S II=$L(ADD)/MAXSTR
  1. I II["." S II=II+1 S II=$P(II,".",1)
  1. F I=1:1:II D ;
  1. . N I,II
  1. . D STRBUF(.BUFF,.ADD,MAXSTR,.OUT)
  1. Q
  1. ;
  1. ;
  1. HLO2STR(SEGARR,FIELD,FSECH,OUT,MAXSTR) ;
  1. ; Convert an HLO segment array to a segment string.
  1. ; Useful when calling APIs that work with a segment string.
  1. ; Inputs
  1. ; SEGARR:<byref> The HLO segment array
  1. ; FIELD:<opt> The field number to extract <dflt=all>
  1. ; FSECH: The HL7 field sep and encoding characters
  1. ; OUT:<byref> See Outputs
  1. ; MAXSTR:<opt><dflt=245>
  1. ; Outputs
  1. ; Returns either the segment string or the segment length.
  1. ; If the string cant fit in one "node" the string is
  1. ; broken up into smaller sections and returned in OUT(i)
  1. N BUF,C,CC,EC,ECH,F,FLD,FLDS,FS,I,IDX,MAX,MAXSTR,NODE,R,RC,S,SC,SIZE
  1. N STOP,STR,STR2,STRF,STRC,STRR,STRS,TYPE,TXT,VAL
  1. S MAXSTR=$G(MAXSTR)
  1. I MAXSTR<1 S MAXSTR=245
  1. S FIELD=$G(FIELD)
  1. I FIELD<1 S FIELD=0
  1. S FLD=FIELD
  1. K OUT
  1. S FS=$E(FSECH,1,1) ;field sep
  1. S ECH=$E(FSECH,2,5) ;enc chars
  1. S CC=$E(ECH,1,1) ;comp char
  1. S RC=$E(ECH,2,2) ;repeat char
  1. S EC=$E(ECH,3,3) ; escape char
  1. S SC=$E(ECH,4,4) ; sub char
  1. S F(0)=0
  1. ; SEGARR(FLD,REP,C,S)=val
  1. S STR=""
  1. S STOP=0
  1. S NODE="SEGARR(FLD)"
  1. F S NODE=$Q(@NODE) Q:NODE="" D Q:STOP ;
  1. . Q:$QL(NODE)'=4
  1. . I +$QS(NODE,1)'=$QS(NODE,1) S STOP=1 Q ;end if not field #
  1. . S F=$QS(NODE,1)
  1. . I FIELD I F Q:F<FIELD I F>FIELD S F=FIELD S STOP=1 Q ; Q ;S STOP=1 Q
  1. . I F(0) I F'=F(0) D ;
  1. . . S FLDS(F(0))=$P(STR,FS,F(0))
  1. . . I FLDS(F(0))="" K FLDS(F(0))
  1. . . S STR=""
  1. . S R=$QS(NODE,2) ;rep #
  1. . S C=$QS(NODE,3) ;comp #
  1. . S S=$QS(NODE,4) ;sub #
  1. . S VAL=@NODE
  1. . I F=0 I R=1 I C=1 I S=1 S TYPE=VAL Q ;seg type
  1. . S VAL=$$CHKDATA^LA7VHLU3(VAL,FSECH)
  1. . S STRF=$P(STR,FS,F) ;field string
  1. . S STRR=$P(STRF,RC,R) ;rep string
  1. . S STRC=$P(STRR,CC,C) ;comp string
  1. . S STRS=$P(STRC,SC,S) ;sub string
  1. . S $P(STRS,SC,S)=VAL
  1. . ; remove extra HL7 chars
  1. . S STRS=$$TRIM^XLFSTR(STRS,"LR",SC)
  1. . S STRC=$$TRIM^XLFSTR(STRC,"LR",CC)
  1. . S STRR=$$TRIM^XLFSTR(STRR,"LR",RC)
  1. . S STRF=$$TRIM^XLFSTR(STRF,"LR",FS)
  1. . S $P(STRC,SC,S)=STRS K STRS
  1. . S $P(STRR,CC,C)=STRC K STRC
  1. . S $P(STRF,RC,R)=STRR K STRR
  1. . S $P(STR,FS,F)=STRF K STRF
  1. . S F(0)=F ;last field #
  1. ;
  1. ; store last one
  1. I STR'="" D ;
  1. . S FLDS(F)=$P(STR,FS,F)
  1. . I FLDS(F)="" K FLDS(F)
  1. ;
  1. S TYPE=$G(TYPE)
  1. I TYPE="" S TYPE=$G(SEGARR(0,1,1,1))
  1. I TYPE="" S TYPE="xxx"
  1. ;
  1. ; calculate size
  1. S SIZE=$L(TYPE) ;seg name
  1. S I=0
  1. F FLD=1:1:$O(FLDS("A"),-1) D ;
  1. . S SIZE=SIZE+1+$L($G(FLDS(FLD)))
  1. ;
  1. ; quit STR if not too big
  1. S STR=""
  1. I SIZE'>MAXSTR D Q STR
  1. . S I=0
  1. . F S I=$O(FLDS(I)) Q:'I D ;
  1. . . S $P(STR,FS,I)=FLDS(I)
  1. . ;
  1. . S STR=TYPE_FS_STR ;prepend seg name
  1. . ; only return field data if requested
  1. . I FIELD S STR=$P(STR,FS,$L(STR,FS))
  1. ;
  1. ; Create array to pass long string back
  1. S STR=""
  1. ;S BUF=TYPE ;prepend seg name
  1. I FIELD D ;
  1. . S BUF=""
  1. . S TXT=$G(FLDS(FIELD))
  1. . D STRBUF(.BUF,.TXT,MAXSTR,.OUT)
  1. ;
  1. I 'FIELD S BUF=TYPE F FLD=1:1:$O(FLDS("A"),-1) D ;
  1. . S TXT=FS_$G(FLDS(FLD))
  1. . D STRBUF(.BUF,.TXT,MAXSTR,.OUT)
  1. ;
  1. I BUF'="" D ;
  1. . S IDX=$O(OUT("A"),-1)+1
  1. . S OUT(IDX)=BUF
  1. ;
  1. Q SIZE
  1. ;
  1. ;
  1. HL2HLO(STR,IN,FSECH,OUT) ;
  1. ; Convert an HL7 segment string into HLO segment array
  1. ; Inputs
  1. ; STR:<opt> Complete HL7 string segment.
  1. ; IN:<opt><byref> Local array that holds HL7 segment.
  1. ; (Must be subscripted).
  1. ; FSECH: Original field sep and encoding chars.
  1. ; OUT:<byref> See Outputs
  1. ; Outputs
  1. ; OUT array (Segment array built by SET^HLOAPI)
  1. N Z,I
  1. S STR=$G(STR)
  1. K OUT
  1. I STR="" I $D(IN) D ;
  1. . N NODE
  1. . S NODE="IN("""")"
  1. . F S NODE=$Q(@NODE) Q:NODE="" D ;
  1. . . S STR=STR_@NODE
  1. . ;I '$O(IN(0)) S STR=$G(IN(0)) Q
  1. . ;S I=""
  1. . ;F S I=$O(IN(I)) Q:I="" S STR=STR_IN(I)
  1. ;
  1. D HL2ARR(STR,FSECH,.Z)
  1. D ARR2HLO(.Z,.OUT,FSECH)
  1. Q
  1. ;
  1. ;
  1. HL2ARR(STR,FSECH,OUT) ;
  1. ; Deconstructs an entire HL7 segment string into an array compatible
  1. ; with the ARR2HLO function.
  1. ; Inputs
  1. ; STR: The HL7 string segment to be parsed.
  1. ; FSECH: The original HL7 field sep and encoding characters.
  1. ; OUT:<byref> See Outputs. Kills on entry.
  1. ; Outputs
  1. ; OUT: The array that can be used with the ARR2HLO function.
  1. ; OUT(field#,component#,subcomp#)=value
  1. ; Repeating fields are stored in decimals ie OUT(1.01)
  1. ; FS=| EC=^#!@ STR="PID|a^b^A@B@C"
  1. ; OUT(0,1)="PID" OUT(1,1)="a" OUT(1,2)="b" OUT(1,3)="A@B@C"
  1. ; OUT(1,3,1)="A" OUT(1,3,2)="B" OUT(1,3,3)="C"
  1. ;
  1. N FLD,FS,D1,D2,X,REP,REPC,ISREP,SEGID
  1. K OUT
  1. S FS=$E(FSECH,1,1)
  1. S REPC=$E(FSECH,3,3)
  1. S SEGID=$P(STR,FS,1)
  1. S ISREP=0
  1. I SEGID="MSH" S STR="MSH"_$E(FSECH)_$E(FSECH)_$E(FSECH)_$P(STR,$E(FSECH),3,$L(STR))
  1. F FLD=0:1:$L(STR,FS)-1 S D1=$P(STR,FS,FLD+1) D ;
  1. . I SEGID="MSH" I '$D(OUT(0)) D Q ;
  1. . . S OUT(0,1)="MSH"
  1. . . S OUT(1,1)=$E(FSECH,1,1)
  1. . . S OUT(2,1)=$E(FSECH,2,$L(FSECH))
  1. . . S FLD=2
  1. . ;
  1. . S ISREP=0
  1. . I D1[REPC S ISREP=1
  1. . I ISREP F REP=1:1:$L(D1,REPC) S D2=$P(D1,REPC,REP) D ;
  1. . . D FLD2ARR^LA7VHLU7(.D2,FSECH)
  1. . . S X=FLD+(REP/100)
  1. . . M OUT(X)=D2
  1. . . S OUT(X)=""
  1. . . K D2
  1. . ;
  1. . I 'ISREP D ;
  1. . . D FLD2ARR^LA7VHLU7(.D1,FSECH)
  1. . . M OUT(FLD)=D1
  1. . . S OUT(FLD)=""
  1. . . K D1
  1. . ;
  1. Q
  1. ;
  1. ;
  1. ARR2HLO(ARR,SEG,FSECH) ;
  1. ; Builds the HLO segment array from the HL2ARR array
  1. ; using the SET^HLOAPI function.
  1. ; Deletes ARR nodes as it goes & sets top levels to null to
  1. ; save space.
  1. ; Inputs
  1. ; ARR: The array built from HL2ARR.
  1. ; SEG:<byref> See Outputs.
  1. ; FSECH: The original HL7 field sep and encoding chars.
  1. ; Outputs
  1. ; SEG: The HLO SEG array.
  1. ;
  1. N NODE,FLD,COMP,SUB,VAL,REP,ISREP,FLDX
  1. S NODE="ARR(0)"
  1. F S NODE=$Q(@NODE) Q:NODE="" D ;
  1. . I $QL(NODE)=1 S @NODE="" Q
  1. . S (FLD,FLDX)=$QS(NODE,1)
  1. . S COMP=$QS(NODE,2)
  1. . S ISREP=0
  1. . I FLD#1>0 S ISREP=1
  1. . ;dont file top level if child nodes exist
  1. . I $QL(NODE)=2 I $O(ARR(FLDX,COMP,0)) S @NODE="" Q
  1. . S VAL=@NODE
  1. . Q:VAL=""
  1. . I VAL[$E(FSECH,3,3) D ;
  1. . . S VAL=$$UNESC^LA7VHLU3(VAL,FSECH)
  1. . S SUB=1
  1. . I $QL(NODE)>2 S SUB=$QS(NODE,3)
  1. . I 'ISREP D SET^HLOAPI(.SEG,VAL,FLD,COMP,SUB)
  1. . I ISREP D ;
  1. . . S REP=(FLD#1)*100
  1. . . D SET^HLOAPI(.SEG,VAL,(FLD\1),COMP,SUB,REP)
  1. . K @NODE
  1. . ;
  1. Q