| 1 | IBDFRPC2 ;ALB/AAS - Return list of selections, broker call ;29-JAN-96 | 
|---|
| 2 | ;;3.0;AUTOMATED INFO COLLECTION SYS;**34,38**;APR 24, 1997 | 
|---|
| 3 | ; | 
|---|
| 4 | SEL(RESULT,IBDF) ; -- Procedure | 
|---|
| 5 | ; -- called by ibdfrpc1, returns list for one selection list | 
|---|
| 6 | ;    see ibdfrpc1 for complete input/output lists | 
|---|
| 7 | ; -- Input  IBDF("IEN")    := pointer to selection list (357.2) | 
|---|
| 8 | ;           IBDF("PI")     := pointer to package interface (357.6) (optional) | 
|---|
| 9 | ;           IBDF("DFN")    := pointer to patient (2) (optional) | 
|---|
| 10 | ;           IBDF("CLINIC") := pointer to clinic (44) (optional) | 
|---|
| 11 | ; | 
|---|
| 12 | N OTEXT,TEXT,SC,TERM,COUNT,DCODE,SECOND,THIRD | 
|---|
| 13 | I $E($G(RESULT),1)="^" S ARRY=RESULT | 
|---|
| 14 | E  S ARRY="RESULT" | 
|---|
| 15 | S COUNT=+$G(@ARRY@(0)) | 
|---|
| 16 | ; | 
|---|
| 17 | S @ARRY@(0)="List not found" | 
|---|
| 18 | G:'$G(IBDF("IEN")) SELQ | 
|---|
| 19 | G:$G(^IBE(357.2,IBDF("IEN"),0))="" SELQ | 
|---|
| 20 | ;K ^TMP("IBD-DUP",$J) | 
|---|
| 21 | ; | 
|---|
| 22 | ; -- copy list | 
|---|
| 23 | I '$G(IBDF("RULE-ONLY")) D COPYLIST(.RESULT,IBDF("IEN"),.COUNT) | 
|---|
| 24 | ;I COUNT D URH | 
|---|
| 25 | ; | 
|---|
| 26 | S @ARRY@(0)=COUNT_"^LIST^" | 
|---|
| 27 | D GETQLF | 
|---|
| 28 | SELQ Q | 
|---|
| 29 | ; | 
|---|
| 30 | GETQLF ; -- add selection rule and qualifiers from marking area | 
|---|
| 31 | ;    subcolumns to results(0) node, but only for bubbles | 
|---|
| 32 | N SC,NODE,BUBB,BUBBCNT | 
|---|
| 33 | S SC=0,BUBBCNT=0,BUBB=$O(^IBE(357.91,"B","BUBBLE (use for scanning)",0)) Q:'BUBB | 
|---|
| 34 | F  S SC=$O(^IBE(357.2,IBDF("IEN"),2,SC)) Q:'SC  D | 
|---|
| 35 | .S NODE=$G(^IBE(357.2,IBDF("IEN"),2,SC,0)) | 
|---|
| 36 | .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)_"::" | 
|---|
| 37 | ; | 
|---|
| 38 | ; -- if no bubbles then kill off array, leave zero node for reports | 
|---|
| 39 | I BUBBCNT<1 S SC=@ARRY@(0) K @ARRY S @ARRY@(0)="0^"_$P(SC,"^",2,3) S $P(@ARRY@(0),"^",4)=1 | 
|---|
| 40 | Q | 
|---|
| 41 | ; | 
|---|
| 42 | COPYLIST(RESULT,LIST,COUNT) ;copies the entries from LIST to @ARY, starting subscript at COUNT+1 | 
|---|
| 43 | ; | 
|---|
| 44 | N SLCTN,SUBCOL,TEXT,IEN,NODE,TSUBCOL,NOTREAL,GROUP,ORDER,HDR,CSUBCOL,DCODE,QUANTITY,SECOND,THIRD | 
|---|
| 45 | ; | 
|---|
| 46 | I $E($G(RESULT),1)="^" S ARRY=RESULT | 
|---|
| 47 | E  S ARRY="RESULT" | 
|---|
| 48 | ; | 
|---|
| 49 | S SUBCOL=$$SUBCOL(LIST),TSUBCOL=+SUBCOL,CSUBCOL=+$P(SUBCOL,"^",2) | 
|---|
| 50 | ; | 
|---|
| 51 | S PRNT="" | 
|---|
| 52 | F  S PRNT=$O(^IBE(357.4,"APO",LIST,PRNT)) Q:PRNT=""  D | 
|---|
| 53 | . S GROUP="" | 
|---|
| 54 | . F  S GROUP=$O(^IBE(357.4,"APO",LIST,PRNT,GROUP)) Q:GROUP=""  D | 
|---|
| 55 | .. S HDR=$P($G(^IBE(357.4,GROUP,0)),"^") | 
|---|
| 56 | .. I $P($G(^IBE(357.4,GROUP,0)),"^",4)="I" S HDR="   " | 
|---|
| 57 | .. I HDR="BLANK" S HDR="   " | 
|---|
| 58 | .. S COUNT=COUNT+1,@ARRY@(COUNT)=HDR_"^^^^^^0" | 
|---|
| 59 | .. S ORDER="" | 
|---|
| 60 | .. F  S ORDER=$O(^IBE(357.3,"APO",LIST,GROUP,ORDER)) Q:ORDER=""  D | 
|---|
| 61 | ... S SLCTN=0 | 
|---|
| 62 | ... F  S SLCTN=$O(^IBE(357.3,"APO",LIST,GROUP,ORDER,SLCTN)) Q:'SLCTN  D | 
|---|
| 63 | .... S (TEXT,DCODE,OTEXT,TERM,NOTREAL,IEN,SECOND,THIRD)="" | 
|---|
| 64 | .... S NODE=$G(^IBE(357.3,SLCTN,0)),IEN=$P(NODE,"^") | 
|---|
| 65 | .... S QUANTITY=$P(NODE,"^",9) | 
|---|
| 66 | .... ; | 
|---|
| 67 | .... ; -- handle place holder as headers | 
|---|
| 68 | .... S NOTREAL=$P(NODE,"^",2) | 
|---|
| 69 | .... I NOTREAL,$P(NODE,"^",6)'="" D  Q | 
|---|
| 70 | ..... I $P(NODE,"^",7) S COUNT=COUNT+1,HDR=$P(NODE,"^",6),@ARRY@(COUNT)=HDR_"^^^^^^0" Q | 
|---|
| 71 | ..... I $P(NODE,"^",8) S COUNT=COUNT+1,HDR="   ",@ARRY@(COUNT)=HDR_"^^^^^^0" Q | 
|---|
| 72 | .....; | 
|---|
| 73 | .... ; -- find text for entry | 
|---|
| 74 | .... S SUBCOL=$O(^IBE(357.3,SLCTN,1,"B",+TSUBCOL,0)) | 
|---|
| 75 | .... S NODE=$G(^IBE(357.3,+SLCTN,1,+SUBCOL,0)) | 
|---|
| 76 | .... S:$P(NODE,"^")=TSUBCOL TEXT=$P(NODE,"^",2) | 
|---|
| 77 | .... ; | 
|---|
| 78 | .... ; -- find display code for entry | 
|---|
| 79 | .... S SUBCOL=$O(^IBE(357.3,+SLCTN,1,"B",+CSUBCOL,0)) | 
|---|
| 80 | .... S NODE=$G(^IBE(357.3,+SLCTN,1,+SUBCOL,0)) | 
|---|
| 81 | .... S:$P(NODE,"^")=CSUBCOL DCODE=$P(NODE,"^",2) | 
|---|
| 82 | .... ; | 
|---|
| 83 | .... ; -- find optional caption and lexicon pointer | 
|---|
| 84 | .... S NODE=$G(^IBE(357.3,SLCTN,2)) | 
|---|
| 85 | .... S OTEXT=$P(NODE,"^"),TERM=$P(NODE,"^",2) | 
|---|
| 86 | .... ; | 
|---|
| 87 | .... ; -- find optional second and third codes | 
|---|
| 88 | .... S SECOND=$P(NODE,"^",3),THIRD=$P(NODE,"^",4) | 
|---|
| 89 | .... ; | 
|---|
| 90 | .... ; -- add to array.  Is dup ien or ien+text??? | 
|---|
| 91 | .... I $L(TEXT) S COUNT=COUNT+1 D BLDA Q | 
|---|
| 92 | .... ;I $L(TEXT),'$D(IBDUP(IEN_"^"_TEXT)) S COUNT=COUNT+1,IBDUP(IEN_"^"_TEXT)="" D BLDA Q  ;this line checks ien+text for duplicates | 
|---|
| 93 | ; | 
|---|
| 94 | K ^TMP("IBD-DUP",$J) | 
|---|
| 95 | Q | 
|---|
| 96 | ; | 
|---|
| 97 | SUBCOL(LIST) ; -- function | 
|---|
| 98 | ; -- returns the subcolumn containing the text | 
|---|
| 99 | ;    input  LIST := selection list internal entry | 
|---|
| 100 | ; -- Assumes data returned by the package interface, piece 2 is the description | 
|---|
| 101 | ; | 
|---|
| 102 | N SC,TSUBCOL,CSUBCOL | 
|---|
| 103 | S (TSUBCOL,CSUBCOL)="" | 
|---|
| 104 | S SC=0 | 
|---|
| 105 | F  S SC=$O(^IBE(357.2,LIST,2,SC)) Q:'SC  D | 
|---|
| 106 | .Q:$P($G(^IBE(357.2,LIST,2,SC,0)),"^",4)=2  ;is a marking area | 
|---|
| 107 | .I $P($G(^IBE(357.2,LIST,2,SC,0)),"^",5)=2 S TSUBCOL=$P(^(0),"^") Q  ;data piece 2 is usually text subcol | 
|---|
| 108 | .I $P($G(^IBE(357.2,LIST,2,SC,0)),"^",5)=1 S CSUBCOL=$P(^(0),"^") Q  ; data piece 1 is always code | 
|---|
| 109 | .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 | 
|---|
| 110 | .I CSUBCOL="",$P($G(^IBE(357.2,LIST,2,SC,0)),"^",5)>2 S CSUBCOL=$P(^(0),"^") Q | 
|---|
| 111 | Q TSUBCOL_"^"_CSUBCOL | 
|---|
| 112 | ; | 
|---|
| 113 | BLDA ; -- build results array | 
|---|
| 114 | S @ARRY@(COUNT)=TEXT ;B  ;; | 
|---|
| 115 | S $P(@ARRY@(COUNT),"^",2)=$G(DCODE) | 
|---|
| 116 | S $P(@ARRY@(COUNT),"^",3)=$S($G(NOTREAL):"",1:$G(IEN)) | 
|---|
| 117 | S $P(@ARRY@(COUNT),"^",4)="" | 
|---|
| 118 | S $P(@ARRY@(COUNT),"^",5)=$G(OTEXT) | 
|---|
| 119 | S $P(@ARRY@(COUNT),"^",6)=$G(TERM) | 
|---|
| 120 | S $P(@ARRY@(COUNT),"^",7)=$S($G(NOTREAL):0,1:1) | 
|---|
| 121 | S $P(@ARRY@(COUNT),"^",9)=$G(QUANTITY) | 
|---|
| 122 | S $P(@ARRY@(COUNT),"^",10)=$G(SECOND) | 
|---|
| 123 | S $P(@ARRY@(COUNT),"^",11)=$G(THIRD) | 
|---|
| 124 | ;--added for  slctn to be passed also | 
|---|
| 125 | S $P(@ARRY@(COUNT),"^",12)=$G(SLCTN) | 
|---|
| 126 | Q | 
|---|
| 127 | ; | 
|---|
| 128 | URH ; -- UnReferenced Headers removal | 
|---|
| 129 | ;    if a header doesn't have any data under it, then remove the header | 
|---|
| 130 | N X,HDR | 
|---|
| 131 | S X=0 F  S X=$O(@ARRY@(X)) Q:'X  D | 
|---|
| 132 | .I '$D(HDR),$P(@ARRY@(X),"^",1)="" S HDR=X Q  ;find a header | 
|---|
| 133 | .I $P(@ARRY@(X),"^",1)="" K HDR Q  ; is item under header | 
|---|
| 134 | .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 | 
|---|
| 135 | 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 | 
|---|
| 136 | Q | 
|---|
| 137 | ; | 
|---|
| 138 | DYN(RESULT,IBDF) ; -- Procedure | 
|---|
| 139 | ; -- called by ibdfrpc1 to return selection list for dynamic selections | 
|---|
| 140 | ;    see ibdfrpc1 for complete input/output lists | 
|---|
| 141 | ; -- Input  IBDF("PI")     := pointer to package interface (357.6) | 
|---|
| 142 | ;           IBDF("IEN")    := pointer to selection list (357.2) | 
|---|
| 143 | ;           IBDF("DFN")    := pointer to patient (2) (optional for provider selections) | 
|---|
| 144 | ;           IBDF("CLINIC") := pointer to clinic (44) (optional for active problem selections) | 
|---|
| 145 | ; | 
|---|
| 146 | N PI,DFN,CNT,COUNT,NAME,RTN,IBARY,IBCLINIC | 
|---|
| 147 | I $E($G(RESULT),1)="^" S ARRY=RESULT | 
|---|
| 148 | E  S ARRY="RESULT" | 
|---|
| 149 | S COUNT=+$G(@ARRY@(0)) | 
|---|
| 150 | I '$G(IBDF("DFN")) S @ARRY@(0)="-1^Patient not defined" G DYNQ | 
|---|
| 151 | I $G(^DPT(+IBDF("DFN"),0))="" S @ARRY@(0)="-1^Patient not Found" G DYNQ | 
|---|
| 152 | S DFN=+$G(IBDF("DFN")) | 
|---|
| 153 | I $G(IBDF("RULE-ONLY")) G RULE | 
|---|
| 154 | ; | 
|---|
| 155 | S @ARRY@(0)="List not found" | 
|---|
| 156 | G:'$G(IBDF("IEN")) SELQ | 
|---|
| 157 | G:$G(^IBE(357.2,IBDF("IEN"),0))="" DYNQ | 
|---|
| 158 | ; | 
|---|
| 159 | S @ARRY@(0)="-1^Package Interface Not found" | 
|---|
| 160 | S PI=$G(^IBE(357.6,+$G(IBDF("PI")),0)) I PI="" G DYNQ | 
|---|
| 161 | ; | 
|---|
| 162 | S IBCLINIC=$G(IBDF("CLINIC")) | 
|---|
| 163 | I +IBCLINIC'=IBCLINIC,IBCLINIC'="" S IBCLINIC=$O(^SC("B",IBCLINIC,0)) | 
|---|
| 164 | I +IBCLINIC=0 S @ARRY@(0)="Clinic Not Specified" | 
|---|
| 165 | ; | 
|---|
| 166 | S NAME=$P(PI,"^"),RTN=$P(PI,"^",2,3) I RTN=""!(RTN="^") G DYNQ | 
|---|
| 167 | I NAME["ACTIVE PROBLEM" S NAME="GMP SELECT PATIENT ACTIVE PROBLEMS" | 
|---|
| 168 | S IBARY="^TMP(""IB"",$J,""INTERFACES"","""_NAME_""")" | 
|---|
| 169 | D @RTN | 
|---|
| 170 | ; | 
|---|
| 171 | S @ARRY@(0)=+$G(@IBARY@(0))_"^LIST^" | 
|---|
| 172 | RULE I $G(IBDF("RULE-ONLY")) S @ARRY@(0)="1^DYNLIST^" | 
|---|
| 173 | ;G DYNQ:@ARRY@(0)<1 | 
|---|
| 174 | D GETQLF | 
|---|
| 175 | G:$G(IBDF("RULE-ONLY")) DYNQ | 
|---|
| 176 | ; | 
|---|
| 177 | S CNT=0 F  S CNT=$O(@IBARY@(CNT)) Q:'CNT  D | 
|---|
| 178 | .Q:$G(@IBARY@(CNT))="" | 
|---|
| 179 | .; | 
|---|
| 180 | .; -- Process provider lists | 
|---|
| 181 | .I NAME["PROVIDER" D  Q | 
|---|
| 182 | ..I IBCLINIC<1 Q | 
|---|
| 183 | ..S @ARRY@(CNT)=$P(@IBARY@(CNT),"^",2)_"^^"_$P(@IBARY@(CNT),"^",1)_"^^^^1" Q | 
|---|
| 184 | .; | 
|---|
| 185 | .; -- process patient active problem lists | 
|---|
| 186 | .I NAME["ACTIVE PROBLEMS" D  Q | 
|---|
| 187 | ..S @ARRY@(CNT)=$P(@IBARY@(CNT),"^",2)_"^"_$P(@IBARY@(CNT),"^",3)_"^"_+@IBARY@(CNT)_"^^^^1" | 
|---|
| 188 | .I '$D(@ARRY@(CNT)) S @ARRY@(CNT)=@IBARY@(CNT) | 
|---|
| 189 | ; | 
|---|
| 190 | DYNQ Q | 
|---|
| 191 | ; | 
|---|
| 192 | ; -- here are some sample tests for different lists | 
|---|
| 193 | TEST K VAR,IBDF | 
|---|
| 194 | S IBDF("IEN")=489 | 
|---|
| 195 | D SEL(.VAR,.IBDF) | 
|---|
| 196 | X "ZW VAR" | 
|---|
| 197 | Q | 
|---|
| 198 | ; | 
|---|
| 199 | TEST1 K VAR,IBDF | 
|---|
| 200 | S IBDF("IEN")=488 | 
|---|
| 201 | D SEL(.VAR,.IBDF) | 
|---|
| 202 | X "ZW VAR" | 
|---|
| 203 | Q | 
|---|
| 204 | ; | 
|---|
| 205 | TESTD ; -- Test dynamic | 
|---|
| 206 | K VAR,IBDF | 
|---|
| 207 | ;S IBDF("PI")=71,IBDF("IEN")=103 ;provider, 1577 FEX | 
|---|
| 208 | ;S IBDF("PI")=73 ;patient active problems | 
|---|
| 209 | ;S IBDF("CLINIC")=300 | 
|---|
| 210 | S IBDF("PI")=7,IBDF("IEN")=14 ;provider, 1577 FEX | 
|---|
| 211 | ;S IBDF("PI")=73 ;patient active problems | 
|---|
| 212 | S IBDF("DFN")=7169761 | 
|---|
| 213 | S IBDF("CLINIC")=88 | 
|---|
| 214 | D DYN(.VAR,.IBDF) | 
|---|
| 215 | X "ZW VAR" | 
|---|