VAFHLRO1 ;BP/JRP - UTILITIES FOR BUILDING HL7 ROLE SEGMENT;11/18/1997
;;5.3;Registration;**160**;Aug 13, 1993
;
;
FIXLEN(INARR,OUTARR,MAXLEN,WORKSUB) ;Fixed length copy/collapse
;
;Input : INARR - Input array (full global reference)
; OUTARR - Output array (full global reference)
; MAXLEN - Maximum length (defaults to 245)
; WORKSUB - Subscript [in OUTARR] to begin from (defaults to 0)
;Output : None
; INARR() will be collapsed into OUTARR()
;Notes : Validity and existance of input is assumed
; : OUTARR() is not initialized (i.e. KILLed) on input
; : Sample input & output with maximum length of 4
; INARR(1)=12345 OUTARR(0)=1234
; INARR(1,2)=ABCD OUTARR(1)=5ABC
; INARR(2)=567 OUTARR(2)=D567
;
;
S MAXLEN=$G(MAXLEN)
S:(MAXLEN<1) MAXLEN=245
S WORKSUB=$G(WORKSUB)
S:(WORKSUB<1) WORKSUB=0
;Declare variables
N ROOT,VALUE,RESULT
;Declare variables for recursive portion of call
N LENVAL,LENRES,LEN,LENOVR
;Remember root of INARR
S ROOT=$$OREF^DILF(INARR)
;Work down INARR
S RESULT=""
F S INARR=$Q(@INARR) Q:((INARR="")!(INARR'[ROOT)) D
.;Grab value to append
.S VALUE=$G(@INARR)
.;Recusively do fix length copy/collapse
.D FIXLEN1
;If anything still left in RESULT, put into OUTARR()
S:(RESULT'="") @OUTARR@(WORKSUB)=RESULT
;Done
Q
;
FIXLEN1 ;Recursive portion of FIXLEN
;
;Input : VALUE - Value to append to RESULT
; RESULT - Working & resulting value
; OUTARR - Array to place max length results into (full global)
; WORKSUB - Working subscript in OUTARR (where to put results)
; MAXLEN - Maximum length for RESULT
;Output : None
; If max length was exceeded, then OUTARR(WORKSUB) will contain
; the leading portion of appending, WORKSUB will be incremented
; by 1, and RESULT will contain what was left. If max length
; was not exceeded, then VALUE will be appended to RESULT and
; OUTARR(WORKSUB) will be left unchanged.
;Notes : Validity and existance of input is assumed
; : Declarations done in FIXLEN
; : VALUE may be modified by this call
;
;VALUE is null - done
Q:(VALUE="")
;Get lengths of VAL & RES
S LENVAL=$L(VALUE)
S LENRES=$L(RESULT)
;Determine what resulting length will be
S LEN=LENRES+LENVAL
;Max length will not be exceeded - append and quit
I (LEN<MAXLEN) S RESULT=RESULT_VALUE Q
I (LEN=MAXLEN) S RESULT=RESULT_VALUE Q
;Determine exceeding length
S LENOVR=LEN-MAXLEN
;Put non-exceeding portion into output array
S @OUTARR@(WORKSUB)=RESULT_$E(VALUE,1,(LENVAL-LENOVR))
;Increment working subscript
S WORKSUB=WORKSUB+1
;Put exceeding portion into RESULT
; Use recursion to account for further exceeding
S RESULT=""
S VALUE=$E(VALUE,((LENVAL-LENOVR)+1),LENVAL)
D FIXLEN1
;Done
Q
;
GETATT(SEQ) ;Get element attributes
;
;Input : SEQ - Sequence number
;Output : Role segment attributes (as defined by HL7 standard)
; SEQ^LEN^DT^OPT^RP/#^TBL#^ITEM#^ELEMENT NAME
;Notes : Null is returned on bad input
;
;Get/return attributes
S SEQ="S"_$G(SEQ)
Q $P($T(@SEQ),";;",2,999)
;
SEQREQ(SEQ) ;Required element ?
;
;Input : SEQ - Sequence number
;Output : 1 = Yes 0 = No
;Notes : 0 (no) is returned on bad input
;
;Declare variables
N TMP
;Get attributes
S TMP=$$GETATT($G(SEQ))
;Required/optional attribute lists required
Q:($P(TMP,"^",4)="R") 1
;Optional
Q 0
;
ERROR(SEQ,OUTARR,ERROR) ;Add error node to output array
;
;Input : SEQ - Sequence number
; OUTARR - Output array
; ERROR - Error text to include
;Output : None
; Required Element
; OUTARR("ERROR",SEQ,x) = Error text
; Optional Element
; OUTARR("WARNING",SEQ,x) = Error text
;Notes : Input error text (ERROR) will be appended to text stating
; whether element is required/optional and the element name
;
N ATTRIB,REQUIRED,ELEMENT,TEXT
;Get attributes
S ATTRIB=$$GETATT($G(SEQ))
;Required/Optional
S REQUIRED=0
S:($P(ATTRIB,"^",4)="R") REQUIRED=1
;Element name
S ELEMENT=$P(ATTRIB,"^",8)
S:(ELEMENT="") ELEMENT="Unknown (seq #"_SEQ_")"
;Build blanket error text
S TEXT=$S(REQUIRED:"Required",1:"Optional")
S TEXT=TEXT_" data element '"_ELEMENT_"'"
;Append input error text (if present)
S:($G(ERROR)'="") TEXT=TEXT_" "_ERROR
;Use WARNING node for optional element & ERROR node for required
S:('REQUIRED) OUTARR=$NA(@OUTARR@("WARNING"))
S:(REQUIRED) OUTARR=$NA(@OUTARR@("ERROR"))
;Get next subscript in ouput array
S ATTRIB=1+$O(@OUTARR@(SEQ,""),-1)
;Place error text into output array
S @OUTARR@(SEQ,ATTRIB)=TEXT
;Done
Q
;
;
;Role segment attributes (as defined by HL7 standard)
ATTRIB ;;SEQ^LEN^DT^OPT^RP/#^TBL#^ITEM#^ELEMENT NAME
S1 ;;1^60^EI^R^^^01206^Role Instance ID
S2 ;;2^2^ID^R^^0287^00816^Action Code
S3 ;;3^80^CE^R^^^01197^Role
S4 ;;4^80^XCN^R^^^01198^Role Person
S5 ;;5^26^TS^O^^^01199^Role Begin Date/Time
S6 ;;6^26^TS^O^^^01200^Role End Date/Time
S7 ;;7^80^CE^O^^^01201^Role Duration
S8 ;;8^80^CE^O^^^01205^Role Action Reason
VAFHLRO1 ;BP/JRP - UTILITIES FOR BUILDING HL7 ROLE SEGMENT;11/18/1997
+1 ;;5.3;Registration;**160**;Aug 13, 1993
+2 ;
+3 ;
FIXLEN(INARR,OUTARR,MAXLEN,WORKSUB) ;Fixed length copy/collapse
+1 ;
+2 ;Input : INARR - Input array (full global reference)
+3 ; OUTARR - Output array (full global reference)
+4 ; MAXLEN - Maximum length (defaults to 245)
+5 ; WORKSUB - Subscript [in OUTARR] to begin from (defaults to 0)
+6 ;Output : None
+7 ; INARR() will be collapsed into OUTARR()
+8 ;Notes : Validity and existance of input is assumed
+9 ; : OUTARR() is not initialized (i.e. KILLed) on input
+10 ; : Sample input & output with maximum length of 4
+11 ; INARR(1)=12345 OUTARR(0)=1234
+12 ; INARR(1,2)=ABCD OUTARR(1)=5ABC
+13 ; INARR(2)=567 OUTARR(2)=D567
+14 ;
+15 ;
+16 SET MAXLEN=$GET(MAXLEN)
+17 IF (MAXLEN<1)
SET MAXLEN=245
+18 SET WORKSUB=$GET(WORKSUB)
+19 IF (WORKSUB<1)
SET WORKSUB=0
+20 ;Declare variables
+21 NEW ROOT,VALUE,RESULT
+22 ;Declare variables for recursive portion of call
+23 NEW LENVAL,LENRES,LEN,LENOVR
+24 ;Remember root of INARR
+25 SET ROOT=$$OREF^DILF(INARR)
+26 ;Work down INARR
+27 SET RESULT=""
+28 FOR
SET INARR=$QUERY(@INARR)
IF ((INARR="")!(INARR'[ROOT))
QUIT
Begin DoDot:1
+29 ;Grab value to append
+30 SET VALUE=$GET(@INARR)
+31 ;Recusively do fix length copy/collapse
+32 DO FIXLEN1
End DoDot:1
+33 ;If anything still left in RESULT, put into OUTARR()
+34 IF (RESULT'="")
SET @OUTARR@(WORKSUB)=RESULT
+35 ;Done
+36 QUIT
+37 ;
FIXLEN1 ;Recursive portion of FIXLEN
+1 ;
+2 ;Input : VALUE - Value to append to RESULT
+3 ; RESULT - Working & resulting value
+4 ; OUTARR - Array to place max length results into (full global)
+5 ; WORKSUB - Working subscript in OUTARR (where to put results)
+6 ; MAXLEN - Maximum length for RESULT
+7 ;Output : None
+8 ; If max length was exceeded, then OUTARR(WORKSUB) will contain
+9 ; the leading portion of appending, WORKSUB will be incremented
+10 ; by 1, and RESULT will contain what was left. If max length
+11 ; was not exceeded, then VALUE will be appended to RESULT and
+12 ; OUTARR(WORKSUB) will be left unchanged.
+13 ;Notes : Validity and existance of input is assumed
+14 ; : Declarations done in FIXLEN
+15 ; : VALUE may be modified by this call
+16 ;
+17 ;VALUE is null - done
+18 IF (VALUE="")
QUIT
+19 ;Get lengths of VAL & RES
+20 SET LENVAL=$LENGTH(VALUE)
+21 SET LENRES=$LENGTH(RESULT)
+22 ;Determine what resulting length will be
+23 SET LEN=LENRES+LENVAL
+24 ;Max length will not be exceeded - append and quit
+25 IF (LEN<MAXLEN)
SET RESULT=RESULT_VALUE
QUIT
+26 IF (LEN=MAXLEN)
SET RESULT=RESULT_VALUE
QUIT
+27 ;Determine exceeding length
+28 SET LENOVR=LEN-MAXLEN
+29 ;Put non-exceeding portion into output array
+30 SET @OUTARR@(WORKSUB)=RESULT_$EXTRACT(VALUE,1,(LENVAL-LENOVR))
+31 ;Increment working subscript
+32 SET WORKSUB=WORKSUB+1
+33 ;Put exceeding portion into RESULT
+34 ; Use recursion to account for further exceeding
+35 SET RESULT=""
+36 SET VALUE=$EXTRACT(VALUE,((LENVAL-LENOVR)+1),LENVAL)
+37 DO FIXLEN1
+38 ;Done
+39 QUIT
+40 ;
GETATT(SEQ) ;Get element attributes
+1 ;
+2 ;Input : SEQ - Sequence number
+3 ;Output : Role segment attributes (as defined by HL7 standard)
+4 ; SEQ^LEN^DT^OPT^RP/#^TBL#^ITEM#^ELEMENT NAME
+5 ;Notes : Null is returned on bad input
+6 ;
+7 ;Get/return attributes
+8 SET SEQ="S"_$GET(SEQ)
+9 QUIT $PIECE($TEXT(@SEQ),";;",2,999)
+10 ;
SEQREQ(SEQ) ;Required element ?
+1 ;
+2 ;Input : SEQ - Sequence number
+3 ;Output : 1 = Yes 0 = No
+4 ;Notes : 0 (no) is returned on bad input
+5 ;
+6 ;Declare variables
+7 NEW TMP
+8 ;Get attributes
+9 SET TMP=$$GETATT($GET(SEQ))
+10 ;Required/optional attribute lists required
+11 IF ($PIECE(TMP,"^",4)="R")
QUIT 1
+12 ;Optional
+13 QUIT 0
+14 ;
ERROR(SEQ,OUTARR,ERROR) ;Add error node to output array
+1 ;
+2 ;Input : SEQ - Sequence number
+3 ; OUTARR - Output array
+4 ; ERROR - Error text to include
+5 ;Output : None
+6 ; Required Element
+7 ; OUTARR("ERROR",SEQ,x) = Error text
+8 ; Optional Element
+9 ; OUTARR("WARNING",SEQ,x) = Error text
+10 ;Notes : Input error text (ERROR) will be appended to text stating
+11 ; whether element is required/optional and the element name
+12 ;
+13 NEW ATTRIB,REQUIRED,ELEMENT,TEXT
+14 ;Get attributes
+15 SET ATTRIB=$$GETATT($GET(SEQ))
+16 ;Required/Optional
+17 SET REQUIRED=0
+18 IF ($PIECE(ATTRIB,"^",4)="R")
SET REQUIRED=1
+19 ;Element name
+20 SET ELEMENT=$PIECE(ATTRIB,"^",8)
+21 IF (ELEMENT="")
SET ELEMENT="Unknown (seq #"_SEQ_")"
+22 ;Build blanket error text
+23 SET TEXT=$SELECT(REQUIRED:"Required",1:"Optional")
+24 SET TEXT=TEXT_" data element '"_ELEMENT_"'"
+25 ;Append input error text (if present)
+26 IF ($GET(ERROR)'="")
SET TEXT=TEXT_" "_ERROR
+27 ;Use WARNING node for optional element & ERROR node for required
+28 IF ('REQUIRED)
SET OUTARR=$NAME(@OUTARR@("WARNING"))
+29 IF (REQUIRED)
SET OUTARR=$NAME(@OUTARR@("ERROR"))
+30 ;Get next subscript in ouput array
+31 SET ATTRIB=1+$ORDER(@OUTARR@(SEQ,""),-1)
+32 ;Place error text into output array
+33 SET @OUTARR@(SEQ,ATTRIB)=TEXT
+34 ;Done
+35 QUIT
+36 ;
+37 ;
+38 ;Role segment attributes (as defined by HL7 standard)
ATTRIB ;;SEQ^LEN^DT^OPT^RP/#^TBL#^ITEM#^ELEMENT NAME
S1 ;;1^60^EI^R^^^01206^Role Instance ID
S2 ;;2^2^ID^R^^0287^00816^Action Code
S3 ;;3^80^CE^R^^^01197^Role
S4 ;;4^80^XCN^R^^^01198^Role Person
S5 ;;5^26^TS^O^^^01199^Role Begin Date/Time
S6 ;;6^26^TS^O^^^01200^Role End Date/Time
S7 ;;7^80^CE^O^^^01201^Role Duration
S8 ;;8^80^CE^O^^^01205^Role Action Reason