IBDFRPC2 ;ALB/AAS - Return list of selections, broker call ;29-JAN-96
;;3.0;AUTOMATED INFO COLLECTION SYS;**34,38**;APR 24, 1997
;
SEL(RESULT,IBDF) ; -- Procedure
; -- called by ibdfrpc1, returns list for one selection list
; see ibdfrpc1 for complete input/output lists
; -- Input IBDF("IEN") := pointer to selection list (357.2)
; IBDF("PI") := pointer to package interface (357.6) (optional)
; IBDF("DFN") := pointer to patient (2) (optional)
; IBDF("CLINIC") := pointer to clinic (44) (optional)
;
N OTEXT,TEXT,SC,TERM,COUNT,DCODE,SECOND,THIRD
I $E($G(RESULT),1)="^" S ARRY=RESULT
E S ARRY="RESULT"
S COUNT=+$G(@ARRY@(0))
;
S @ARRY@(0)="List not found"
G:'$G(IBDF("IEN")) SELQ
G:$G(^IBE(357.2,IBDF("IEN"),0))="" SELQ
;K ^TMP("IBD-DUP",$J)
;
; -- copy list
I '$G(IBDF("RULE-ONLY")) D COPYLIST(.RESULT,IBDF("IEN"),.COUNT)
;I COUNT D URH
;
S @ARRY@(0)=COUNT_"^LIST^"
D GETQLF
SELQ Q
;
GETQLF ; -- add selection rule and qualifiers from marking area
; subcolumns to results(0) node, but only for bubbles
N SC,NODE,BUBB,BUBBCNT
S SC=0,BUBBCNT=0,BUBB=$O(^IBE(357.91,"B","BUBBLE (use for scanning)",0)) Q:'BUBB
F S SC=$O(^IBE(357.2,IBDF("IEN"),2,SC)) Q:'SC D
.S NODE=$G(^IBE(357.2,IBDF("IEN"),2,SC,0))
.I $P(NODE,"^",4)=2,$P(NODE,"^",6)=BUBB S BUBBCNT=BUBBCNT+1,@ARRY@(0)=@ARRY@(0)_$P($G(^IBD(357.98,+$P(NODE,"^",9),0)),"^")_";;"_+$P(NODE,"^",10)_"::"
;
; -- if no bubbles then kill off array, leave zero node for reports
I BUBBCNT<1 S SC=@ARRY@(0) K @ARRY S @ARRY@(0)="0^"_$P(SC,"^",2,3) S $P(@ARRY@(0),"^",4)=1
Q
;
COPYLIST(RESULT,LIST,COUNT) ;copies the entries from LIST to @ARY, starting subscript at COUNT+1
;
N SLCTN,SUBCOL,TEXT,IEN,NODE,TSUBCOL,NOTREAL,GROUP,ORDER,HDR,CSUBCOL,DCODE,QUANTITY,SECOND,THIRD
;
I $E($G(RESULT),1)="^" S ARRY=RESULT
E S ARRY="RESULT"
;
S SUBCOL=$$SUBCOL(LIST),TSUBCOL=+SUBCOL,CSUBCOL=+$P(SUBCOL,"^",2)
;
S PRNT=""
F S PRNT=$O(^IBE(357.4,"APO",LIST,PRNT)) Q:PRNT="" D
. S GROUP=""
. F S GROUP=$O(^IBE(357.4,"APO",LIST,PRNT,GROUP)) Q:GROUP="" D
.. S HDR=$P($G(^IBE(357.4,GROUP,0)),"^")
.. I $P($G(^IBE(357.4,GROUP,0)),"^",4)="I" S HDR=" "
.. I HDR="BLANK" S HDR=" "
.. S COUNT=COUNT+1,@ARRY@(COUNT)=HDR_"^^^^^^0"
.. S ORDER=""
.. F S ORDER=$O(^IBE(357.3,"APO",LIST,GROUP,ORDER)) Q:ORDER="" D
... S SLCTN=0
... F S SLCTN=$O(^IBE(357.3,"APO",LIST,GROUP,ORDER,SLCTN)) Q:'SLCTN D
.... S (TEXT,DCODE,OTEXT,TERM,NOTREAL,IEN,SECOND,THIRD)=""
.... S NODE=$G(^IBE(357.3,SLCTN,0)),IEN=$P(NODE,"^")
.... S QUANTITY=$P(NODE,"^",9)
.... ;
.... ; -- handle place holder as headers
.... S NOTREAL=$P(NODE,"^",2)
.... I NOTREAL,$P(NODE,"^",6)'="" D Q
..... I $P(NODE,"^",7) S COUNT=COUNT+1,HDR=$P(NODE,"^",6),@ARRY@(COUNT)=HDR_"^^^^^^0" Q
..... I $P(NODE,"^",8) S COUNT=COUNT+1,HDR=" ",@ARRY@(COUNT)=HDR_"^^^^^^0" Q
.....;
.... ; -- find text for entry
.... S SUBCOL=$O(^IBE(357.3,SLCTN,1,"B",+TSUBCOL,0))
.... S NODE=$G(^IBE(357.3,+SLCTN,1,+SUBCOL,0))
.... S:$P(NODE,"^")=TSUBCOL TEXT=$P(NODE,"^",2)
.... ;
.... ; -- find display code for entry
.... S SUBCOL=$O(^IBE(357.3,+SLCTN,1,"B",+CSUBCOL,0))
.... S NODE=$G(^IBE(357.3,+SLCTN,1,+SUBCOL,0))
.... S:$P(NODE,"^")=CSUBCOL DCODE=$P(NODE,"^",2)
.... ;
.... ; -- find optional caption and lexicon pointer
.... S NODE=$G(^IBE(357.3,SLCTN,2))
.... S OTEXT=$P(NODE,"^"),TERM=$P(NODE,"^",2)
.... ;
.... ; -- find optional second and third codes
.... S SECOND=$P(NODE,"^",3),THIRD=$P(NODE,"^",4)
.... ;
.... ; -- add to array. Is dup ien or ien+text???
.... I $L(TEXT) S COUNT=COUNT+1 D BLDA Q
.... ;I $L(TEXT),'$D(IBDUP(IEN_"^"_TEXT)) S COUNT=COUNT+1,IBDUP(IEN_"^"_TEXT)="" D BLDA Q ;this line checks ien+text for duplicates
;
K ^TMP("IBD-DUP",$J)
Q
;
SUBCOL(LIST) ; -- function
; -- returns the subcolumn containing the text
; input LIST := selection list internal entry
; -- Assumes data returned by the package interface, piece 2 is the description
;
N SC,TSUBCOL,CSUBCOL
S (TSUBCOL,CSUBCOL)=""
S SC=0
F S SC=$O(^IBE(357.2,LIST,2,SC)) Q:'SC D
.Q:$P($G(^IBE(357.2,LIST,2,SC,0)),"^",4)=2 ;is a marking area
.I $P($G(^IBE(357.2,LIST,2,SC,0)),"^",5)=2 S TSUBCOL=$P(^(0),"^") Q ;data piece 2 is usually text subcol
.I $P($G(^IBE(357.2,LIST,2,SC,0)),"^",5)=1 S CSUBCOL=$P(^(0),"^") Q ; data piece 1 is always code
.I TSUBCOL="",$P($G(^IBE(357.2,LIST,2,SC,0)),"^",5)>2 S TSUBCOL=$P(^(0),"^") Q ; -- see if other than data piece two is text subcolumn
.I CSUBCOL="",$P($G(^IBE(357.2,LIST,2,SC,0)),"^",5)>2 S CSUBCOL=$P(^(0),"^") Q
Q TSUBCOL_"^"_CSUBCOL
;
BLDA ; -- build results array
S @ARRY@(COUNT)=TEXT ;B ;;
S $P(@ARRY@(COUNT),"^",2)=$G(DCODE)
S $P(@ARRY@(COUNT),"^",3)=$S($G(NOTREAL):"",1:$G(IEN))
S $P(@ARRY@(COUNT),"^",4)=""
S $P(@ARRY@(COUNT),"^",5)=$G(OTEXT)
S $P(@ARRY@(COUNT),"^",6)=$G(TERM)
S $P(@ARRY@(COUNT),"^",7)=$S($G(NOTREAL):0,1:1)
S $P(@ARRY@(COUNT),"^",9)=$G(QUANTITY)
S $P(@ARRY@(COUNT),"^",10)=$G(SECOND)
S $P(@ARRY@(COUNT),"^",11)=$G(THIRD)
;--added for slctn to be passed also
S $P(@ARRY@(COUNT),"^",12)=$G(SLCTN)
Q
;
URH ; -- UnReferenced Headers removal
; if a header doesn't have any data under it, then remove the header
N X,HDR
S X=0 F S X=$O(@ARRY@(X)) Q:'X D
.I '$D(HDR),$P(@ARRY@(X),"^",1)="" S HDR=X Q ;find a header
.I $P(@ARRY@(X),"^",1)="" K HDR Q ; is item under header
.I $D(HDR),$P(@ARRY@(X),"^",1)="" K @ARRY@(HDR) S COUNT=COUNT-1,HDR=X ;hdr doesn't have any items, kill hdr node and reset header to next header
I $D(HDR) S X=$O(@ARRY@(""),-1) I $P(@ARRY@(X),"^",1)="" K @ARRY@(X) S COUNT=COUNT-1,HDR=X ;last item in list is a header
Q
;
DYN(RESULT,IBDF) ; -- Procedure
; -- called by ibdfrpc1 to return selection list for dynamic selections
; see ibdfrpc1 for complete input/output lists
; -- Input IBDF("PI") := pointer to package interface (357.6)
; IBDF("IEN") := pointer to selection list (357.2)
; IBDF("DFN") := pointer to patient (2) (optional for provider selections)
; IBDF("CLINIC") := pointer to clinic (44) (optional for active problem selections)
;
N PI,DFN,CNT,COUNT,NAME,RTN,IBARY,IBCLINIC
I $E($G(RESULT),1)="^" S ARRY=RESULT
E S ARRY="RESULT"
S COUNT=+$G(@ARRY@(0))
I '$G(IBDF("DFN")) S @ARRY@(0)="-1^Patient not defined" G DYNQ
I $G(^DPT(+IBDF("DFN"),0))="" S @ARRY@(0)="-1^Patient not Found" G DYNQ
S DFN=+$G(IBDF("DFN"))
I $G(IBDF("RULE-ONLY")) G RULE
;
S @ARRY@(0)="List not found"
G:'$G(IBDF("IEN")) SELQ
G:$G(^IBE(357.2,IBDF("IEN"),0))="" DYNQ
;
S @ARRY@(0)="-1^Package Interface Not found"
S PI=$G(^IBE(357.6,+$G(IBDF("PI")),0)) I PI="" G DYNQ
;
S IBCLINIC=$G(IBDF("CLINIC"))
I +IBCLINIC'=IBCLINIC,IBCLINIC'="" S IBCLINIC=$O(^SC("B",IBCLINIC,0))
I +IBCLINIC=0 S @ARRY@(0)="Clinic Not Specified"
;
S NAME=$P(PI,"^"),RTN=$P(PI,"^",2,3) I RTN=""!(RTN="^") G DYNQ
I NAME["ACTIVE PROBLEM" S NAME="GMP SELECT PATIENT ACTIVE PROBLEMS"
S IBARY="^TMP(""IB"",$J,""INTERFACES"","""_NAME_""")"
D @RTN
;
S @ARRY@(0)=+$G(@IBARY@(0))_"^LIST^"
RULE I $G(IBDF("RULE-ONLY")) S @ARRY@(0)="1^DYNLIST^"
;G DYNQ:@ARRY@(0)<1
D GETQLF
G:$G(IBDF("RULE-ONLY")) DYNQ
;
S CNT=0 F S CNT=$O(@IBARY@(CNT)) Q:'CNT D
.Q:$G(@IBARY@(CNT))=""
.;
.; -- Process provider lists
.I NAME["PROVIDER" D Q
..I IBCLINIC<1 Q
..S @ARRY@(CNT)=$P(@IBARY@(CNT),"^",2)_"^^"_$P(@IBARY@(CNT),"^",1)_"^^^^1" Q
.;
.; -- process patient active problem lists
.I NAME["ACTIVE PROBLEMS" D Q
..S @ARRY@(CNT)=$P(@IBARY@(CNT),"^",2)_"^"_$P(@IBARY@(CNT),"^",3)_"^"_+@IBARY@(CNT)_"^^^^1"
.I '$D(@ARRY@(CNT)) S @ARRY@(CNT)=@IBARY@(CNT)
;
DYNQ Q
;
; -- here are some sample tests for different lists
TEST K VAR,IBDF
S IBDF("IEN")=489
D SEL(.VAR,.IBDF)
X "ZW VAR"
Q
;
TEST1 K VAR,IBDF
S IBDF("IEN")=488
D SEL(.VAR,.IBDF)
X "ZW VAR"
Q
;
TESTD ; -- Test dynamic
K VAR,IBDF
;S IBDF("PI")=71,IBDF("IEN")=103 ;provider, 1577 FEX
;S IBDF("PI")=73 ;patient active problems
;S IBDF("CLINIC")=300
S IBDF("PI")=7,IBDF("IEN")=14 ;provider, 1577 FEX
;S IBDF("PI")=73 ;patient active problems
S IBDF("DFN")=7169761
S IBDF("CLINIC")=88
D DYN(.VAR,.IBDF)
X "ZW VAR"
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HIBDFRPC2 8358 printed Oct 16, 2024@18:54:05 Page 2
IBDFRPC2 ;ALB/AAS - Return list of selections, broker call ;29-JAN-96
+1 ;;3.0;AUTOMATED INFO COLLECTION SYS;**34,38**;APR 24, 1997
+2 ;
SEL(RESULT,IBDF) ; -- Procedure
+1 ; -- called by ibdfrpc1, returns list for one selection list
+2 ; see ibdfrpc1 for complete input/output lists
+3 ; -- Input IBDF("IEN") := pointer to selection list (357.2)
+4 ; IBDF("PI") := pointer to package interface (357.6) (optional)
+5 ; IBDF("DFN") := pointer to patient (2) (optional)
+6 ; IBDF("CLINIC") := pointer to clinic (44) (optional)
+7 ;
+8 NEW OTEXT,TEXT,SC,TERM,COUNT,DCODE,SECOND,THIRD
+9 IF $EXTRACT($GET(RESULT),1)="^"
SET ARRY=RESULT
+10 IF '$TEST
SET ARRY="RESULT"
+11 SET COUNT=+$GET(@ARRY@(0))
+12 ;
+13 SET @ARRY@(0)="List not found"
+14 if '$GET(IBDF("IEN"))
GOTO SELQ
+15 if $GET(^IBE(357.2,IBDF("IEN"),0))=""
GOTO SELQ
+16 ;K ^TMP("IBD-DUP",$J)
+17 ;
+18 ; -- copy list
+19 IF '$GET(IBDF("RULE-ONLY"))
DO COPYLIST(.RESULT,IBDF("IEN"),.COUNT)
+20 ;I COUNT D URH
+21 ;
+22 SET @ARRY@(0)=COUNT_"^LIST^"
+23 DO GETQLF
SELQ QUIT
+1 ;
GETQLF ; -- add selection rule and qualifiers from marking area
+1 ; subcolumns to results(0) node, but only for bubbles
+2 NEW SC,NODE,BUBB,BUBBCNT
+3 SET SC=0
SET BUBBCNT=0
SET BUBB=$ORDER(^IBE(357.91,"B","BUBBLE (use for scanning)",0))
if 'BUBB
QUIT
+4 FOR
SET SC=$ORDER(^IBE(357.2,IBDF("IEN"),2,SC))
if 'SC
QUIT
Begin DoDot:1
+5 SET NODE=$GET(^IBE(357.2,IBDF("IEN"),2,SC,0))
+6 IF $PIECE(NODE,"^",4)=2
IF $PIECE(NODE,"^",6)=BUBB
SET BUBBCNT=BUBBCNT+1
SET @ARRY@(0)=@ARRY@(0)_$PIECE($GET(^IBD(357.98,+$PIECE(NODE,"^",9),0)),"^")_";;"_+$PIECE(NODE,"^",10)_"::"
End DoDot:1
+7 ;
+8 ; -- if no bubbles then kill off array, leave zero node for reports
+9 IF BUBBCNT<1
SET SC=@ARRY@(0)
KILL @ARRY
SET @ARRY@(0)="0^"_$PIECE(SC,"^",2,3)
SET $PIECE(@ARRY@(0),"^",4)=1
+10 QUIT
+11 ;
COPYLIST(RESULT,LIST,COUNT) ;copies the entries from LIST to @ARY, starting subscript at COUNT+1
+1 ;
+2 NEW SLCTN,SUBCOL,TEXT,IEN,NODE,TSUBCOL,NOTREAL,GROUP,ORDER,HDR,CSUBCOL,DCODE,QUANTITY,SECOND,THIRD
+3 ;
+4 IF $EXTRACT($GET(RESULT),1)="^"
SET ARRY=RESULT
+5 IF '$TEST
SET ARRY="RESULT"
+6 ;
+7 SET SUBCOL=$$SUBCOL(LIST)
SET TSUBCOL=+SUBCOL
SET CSUBCOL=+$PIECE(SUBCOL,"^",2)
+8 ;
+9 SET PRNT=""
+10 FOR
SET PRNT=$ORDER(^IBE(357.4,"APO",LIST,PRNT))
if PRNT=""
QUIT
Begin DoDot:1
+11 SET GROUP=""
+12 FOR
SET GROUP=$ORDER(^IBE(357.4,"APO",LIST,PRNT,GROUP))
if GROUP=""
QUIT
Begin DoDot:2
+13 SET HDR=$PIECE($GET(^IBE(357.4,GROUP,0)),"^")
+14 IF $PIECE($GET(^IBE(357.4,GROUP,0)),"^",4)="I"
SET HDR=" "
+15 IF HDR="BLANK"
SET HDR=" "
+16 SET COUNT=COUNT+1
SET @ARRY@(COUNT)=HDR_"^^^^^^0"
+17 SET ORDER=""
+18 FOR
SET ORDER=$ORDER(^IBE(357.3,"APO",LIST,GROUP,ORDER))
if ORDER=""
QUIT
Begin DoDot:3
+19 SET SLCTN=0
+20 FOR
SET SLCTN=$ORDER(^IBE(357.3,"APO",LIST,GROUP,ORDER,SLCTN))
if 'SLCTN
QUIT
Begin DoDot:4
+21 SET (TEXT,DCODE,OTEXT,TERM,NOTREAL,IEN,SECOND,THIRD)=""
+22 SET NODE=$GET(^IBE(357.3,SLCTN,0))
SET IEN=$PIECE(NODE,"^")
+23 SET QUANTITY=$PIECE(NODE,"^",9)
+24 ;
+25 ; -- handle place holder as headers
+26 SET NOTREAL=$PIECE(NODE,"^",2)
+27 IF NOTREAL
IF $PIECE(NODE,"^",6)'=""
Begin DoDot:5
+28 IF $PIECE(NODE,"^",7)
SET COUNT=COUNT+1
SET HDR=$PIECE(NODE,"^",6)
SET @ARRY@(COUNT)=HDR_"^^^^^^0"
QUIT
+29 IF $PIECE(NODE,"^",8)
SET COUNT=COUNT+1
SET HDR=" "
SET @ARRY@(COUNT)=HDR_"^^^^^^0"
QUIT
+30 ;
End DoDot:5
QUIT
+31 ; -- find text for entry
+32 SET SUBCOL=$ORDER(^IBE(357.3,SLCTN,1,"B",+TSUBCOL,0))
+33 SET NODE=$GET(^IBE(357.3,+SLCTN,1,+SUBCOL,0))
+34 if $PIECE(NODE,"^")=TSUBCOL
SET TEXT=$PIECE(NODE,"^",2)
+35 ;
+36 ; -- find display code for entry
+37 SET SUBCOL=$ORDER(^IBE(357.3,+SLCTN,1,"B",+CSUBCOL,0))
+38 SET NODE=$GET(^IBE(357.3,+SLCTN,1,+SUBCOL,0))
+39 if $PIECE(NODE,"^")=CSUBCOL
SET DCODE=$PIECE(NODE,"^",2)
+40 ;
+41 ; -- find optional caption and lexicon pointer
+42 SET NODE=$GET(^IBE(357.3,SLCTN,2))
+43 SET OTEXT=$PIECE(NODE,"^")
SET TERM=$PIECE(NODE,"^",2)
+44 ;
+45 ; -- find optional second and third codes
+46 SET SECOND=$PIECE(NODE,"^",3)
SET THIRD=$PIECE(NODE,"^",4)
+47 ;
+48 ; -- add to array. Is dup ien or ien+text???
+49 IF $LENGTH(TEXT)
SET COUNT=COUNT+1
DO BLDA
QUIT
+50 ;I $L(TEXT),'$D(IBDUP(IEN_"^"_TEXT)) S COUNT=COUNT+1,IBDUP(IEN_"^"_TEXT)="" D BLDA Q ;this line checks ien+text for duplicates
End DoDot:4
End DoDot:3
End DoDot:2
End DoDot:1
+51 ;
+52 KILL ^TMP("IBD-DUP",$JOB)
+53 QUIT
+54 ;
SUBCOL(LIST) ; -- function
+1 ; -- returns the subcolumn containing the text
+2 ; input LIST := selection list internal entry
+3 ; -- Assumes data returned by the package interface, piece 2 is the description
+4 ;
+5 NEW SC,TSUBCOL,CSUBCOL
+6 SET (TSUBCOL,CSUBCOL)=""
+7 SET SC=0
+8 FOR
SET SC=$ORDER(^IBE(357.2,LIST,2,SC))
if 'SC
QUIT
Begin DoDot:1
+9 ;is a marking area
if $PIECE($GET(^IBE(357.2,LIST,2,SC,0)),"^",4)=2
QUIT
+10 ;data piece 2 is usually text subcol
IF $PIECE($GET(^IBE(357.2,LIST,2,SC,0)),"^",5)=2
SET TSUBCOL=$PIECE(^(0),"^")
QUIT
+11 ; data piece 1 is always code
IF $PIECE($GET(^IBE(357.2,LIST,2,SC,0)),"^",5)=1
SET CSUBCOL=$PIECE(^(0),"^")
QUIT
+12 ; -- see if other than data piece two is text subcolumn
IF TSUBCOL=""
IF $PIECE($GET(^IBE(357.2,LIST,2,SC,0)),"^",5)>2
SET TSUBCOL=$PIECE(^(0),"^")
QUIT
+13 IF CSUBCOL=""
IF $PIECE($GET(^IBE(357.2,LIST,2,SC,0)),"^",5)>2
SET CSUBCOL=$PIECE(^(0),"^")
QUIT
End DoDot:1
+14 QUIT TSUBCOL_"^"_CSUBCOL
+15 ;
BLDA ; -- build results array
+1 ;B ;;
SET @ARRY@(COUNT)=TEXT
+2 SET $PIECE(@ARRY@(COUNT),"^",2)=$GET(DCODE)
+3 SET $PIECE(@ARRY@(COUNT),"^",3)=$SELECT($GET(NOTREAL):"",1:$GET(IEN))
+4 SET $PIECE(@ARRY@(COUNT),"^",4)=""
+5 SET $PIECE(@ARRY@(COUNT),"^",5)=$GET(OTEXT)
+6 SET $PIECE(@ARRY@(COUNT),"^",6)=$GET(TERM)
+7 SET $PIECE(@ARRY@(COUNT),"^",7)=$SELECT($GET(NOTREAL):0,1:1)
+8 SET $PIECE(@ARRY@(COUNT),"^",9)=$GET(QUANTITY)
+9 SET $PIECE(@ARRY@(COUNT),"^",10)=$GET(SECOND)
+10 SET $PIECE(@ARRY@(COUNT),"^",11)=$GET(THIRD)
+11 ;--added for slctn to be passed also
+12 SET $PIECE(@ARRY@(COUNT),"^",12)=$GET(SLCTN)
+13 QUIT
+14 ;
URH ; -- UnReferenced Headers removal
+1 ; if a header doesn't have any data under it, then remove the header
+2 NEW X,HDR
+3 SET X=0
FOR
SET X=$ORDER(@ARRY@(X))
if 'X
QUIT
Begin DoDot:1
+4 ;find a header
IF '$DATA(HDR)
IF $PIECE(@ARRY@(X),"^",1)=""
SET HDR=X
QUIT
+5 ; is item under header
IF $PIECE(@ARRY@(X),"^",1)=""
KILL HDR
QUIT
+6 ;hdr doesn't have any items, kill hdr node and reset header to next header
IF $DATA(HDR)
IF $PIECE(@ARRY@(X),"^",1)=""
KILL @ARRY@(HDR)
SET COUNT=COUNT-1
SET HDR=X
End DoDot:1
+7 ;last item in list is a header
IF $DATA(HDR)
SET X=$ORDER(@ARRY@(""),-1)
IF $PIECE(@ARRY@(X),"^",1)=""
KILL @ARRY@(X)
SET COUNT=COUNT-1
SET HDR=X
+8 QUIT
+9 ;
DYN(RESULT,IBDF) ; -- Procedure
+1 ; -- called by ibdfrpc1 to return selection list for dynamic selections
+2 ; see ibdfrpc1 for complete input/output lists
+3 ; -- Input IBDF("PI") := pointer to package interface (357.6)
+4 ; IBDF("IEN") := pointer to selection list (357.2)
+5 ; IBDF("DFN") := pointer to patient (2) (optional for provider selections)
+6 ; IBDF("CLINIC") := pointer to clinic (44) (optional for active problem selections)
+7 ;
+8 NEW PI,DFN,CNT,COUNT,NAME,RTN,IBARY,IBCLINIC
+9 IF $EXTRACT($GET(RESULT),1)="^"
SET ARRY=RESULT
+10 IF '$TEST
SET ARRY="RESULT"
+11 SET COUNT=+$GET(@ARRY@(0))
+12 IF '$GET(IBDF("DFN"))
SET @ARRY@(0)="-1^Patient not defined"
GOTO DYNQ
+13 IF $GET(^DPT(+IBDF("DFN"),0))=""
SET @ARRY@(0)="-1^Patient not Found"
GOTO DYNQ
+14 SET DFN=+$GET(IBDF("DFN"))
+15 IF $GET(IBDF("RULE-ONLY"))
GOTO RULE
+16 ;
+17 SET @ARRY@(0)="List not found"
+18 if '$GET(IBDF("IEN"))
GOTO SELQ
+19 if $GET(^IBE(357.2,IBDF("IEN"),0))=""
GOTO DYNQ
+20 ;
+21 SET @ARRY@(0)="-1^Package Interface Not found"
+22 SET PI=$GET(^IBE(357.6,+$GET(IBDF("PI")),0))
IF PI=""
GOTO DYNQ
+23 ;
+24 SET IBCLINIC=$GET(IBDF("CLINIC"))
+25 IF +IBCLINIC'=IBCLINIC
IF IBCLINIC'=""
SET IBCLINIC=$ORDER(^SC("B",IBCLINIC,0))
+26 IF +IBCLINIC=0
SET @ARRY@(0)="Clinic Not Specified"
+27 ;
+28 SET NAME=$PIECE(PI,"^")
SET RTN=$PIECE(PI,"^",2,3)
IF RTN=""!(RTN="^")
GOTO DYNQ
+29 IF NAME["ACTIVE PROBLEM"
SET NAME="GMP SELECT PATIENT ACTIVE PROBLEMS"
+30 SET IBARY="^TMP(""IB"",$J,""INTERFACES"","""_NAME_""")"
+31 DO @RTN
+32 ;
+33 SET @ARRY@(0)=+$GET(@IBARY@(0))_"^LIST^"
RULE IF $GET(IBDF("RULE-ONLY"))
SET @ARRY@(0)="1^DYNLIST^"
+1 ;G DYNQ:@ARRY@(0)<1
+2 DO GETQLF
+3 if $GET(IBDF("RULE-ONLY"))
GOTO DYNQ
+4 ;
+5 SET CNT=0
FOR
SET CNT=$ORDER(@IBARY@(CNT))
if 'CNT
QUIT
Begin DoDot:1
+6 if $GET(@IBARY@(CNT))=""
QUIT
+7 ;
+8 ; -- Process provider lists
+9 IF NAME["PROVIDER"
Begin DoDot:2
+10 IF IBCLINIC<1
QUIT
+11 SET @ARRY@(CNT)=$PIECE(@IBARY@(CNT),"^",2)_"^^"_$PIECE(@IBARY@(CNT),"^",1)_"^^^^1"
QUIT
End DoDot:2
QUIT
+12 ;
+13 ; -- process patient active problem lists
+14 IF NAME["ACTIVE PROBLEMS"
Begin DoDot:2
+15 SET @ARRY@(CNT)=$PIECE(@IBARY@(CNT),"^",2)_"^"_$PIECE(@IBARY@(CNT),"^",3)_"^"_+@IBARY@(CNT)_"^^^^1"
End DoDot:2
QUIT
+16 IF '$DATA(@ARRY@(CNT))
SET @ARRY@(CNT)=@IBARY@(CNT)
End DoDot:1
+17 ;
DYNQ QUIT
+1 ;
+2 ; -- here are some sample tests for different lists
TEST KILL VAR,IBDF
+1 SET IBDF("IEN")=489
+2 DO SEL(.VAR,.IBDF)
+3 XECUTE "ZW VAR"
+4 QUIT
+5 ;
TEST1 KILL VAR,IBDF
+1 SET IBDF("IEN")=488
+2 DO SEL(.VAR,.IBDF)
+3 XECUTE "ZW VAR"
+4 QUIT
+5 ;
TESTD ; -- Test dynamic
+1 KILL VAR,IBDF
+2 ;S IBDF("PI")=71,IBDF("IEN")=103 ;provider, 1577 FEX
+3 ;S IBDF("PI")=73 ;patient active problems
+4 ;S IBDF("CLINIC")=300
+5 ;provider, 1577 FEX
SET IBDF("PI")=7
SET IBDF("IEN")=14
+6 ;S IBDF("PI")=73 ;patient active problems
+7 SET IBDF("DFN")=7169761
+8 SET IBDF("CLINIC")=88
+9 DO DYN(.VAR,.IBDF)
+10 XECUTE "ZW VAR"