| [613] | 1 | RORX012A ;HCIOFO/SG - COMBINED MEDS AND LABS (QUERY & STORE) ; 12/8/05 10:39am | 
|---|
|  | 2 | ;;1.5;CLINICAL CASE REGISTRIES;;Feb 17, 2006 | 
|---|
|  | 3 | ; | 
|---|
|  | 4 | Q | 
|---|
|  | 5 | ; | 
|---|
|  | 6 | ;***** LAB SEARCH CALLBACK | 
|---|
|  | 7 | ; | 
|---|
|  | 8 | ; .ROR8DST      Reference to the ROR8DST parameter. | 
|---|
|  | 9 | ; | 
|---|
|  | 10 | ; INVDT         IEN of the Lab test (inverted date) | 
|---|
|  | 11 | ; | 
|---|
|  | 12 | ; .RESULT       Reference to a local variable, which contains | 
|---|
|  | 13 | ;               the result (see the $$LTSEARCH^RORUTL10). | 
|---|
|  | 14 | ; | 
|---|
|  | 15 | ; Return Values: | 
|---|
|  | 16 | ;       <0  Error code (the search will be aborted) | 
|---|
|  | 17 | ;        0  Ok | 
|---|
|  | 18 | ;        1  Skip this result | 
|---|
|  | 19 | ;        2  Skip this and all remaining results | 
|---|
|  | 20 | ; | 
|---|
|  | 21 | LTSCB(ROR8DST,INVDT,RESULT) ; | 
|---|
|  | 22 | N DATE,IEN,NAME,RC,TMP,VAL | 
|---|
|  | 23 | S IEN=+RESULT(2)           Q:IEN'>0 1   ; IEN of the Lab test | 
|---|
|  | 24 | S NAME=$P(RESULT(2),U,2)   Q:NAME="" 1  ; Name of the test | 
|---|
|  | 25 | S DATE=+$P(RESULT(1),U,2)  Q:DATE'>0 1  ; Date of the test | 
|---|
|  | 26 | S ROR8DST("RORUTIL")=1 | 
|---|
|  | 27 | ;--- Check the result range if necessary | 
|---|
|  | 28 | I $D(RORLTRV(IEN))>1  S RC=1  D  Q:RC RC | 
|---|
|  | 29 | . S VAL=$$CLRNMVAL^RORUTL18($P(RESULT(1),U,3)) | 
|---|
|  | 30 | . ;--- Skip a non-numeric result | 
|---|
|  | 31 | . Q:'$$NUMERIC^RORUTL05(VAL) | 
|---|
|  | 32 | . ;--- Check the range | 
|---|
|  | 33 | . I $G(RORLTRV(IEN,"L"))'=""  Q:VAL<RORLTRV(IEN,"L") | 
|---|
|  | 34 | . I $G(RORLTRV(IEN,"H"))'=""  Q:VAL>RORLTRV(IEN,"H") | 
|---|
|  | 35 | . S RC=0 | 
|---|
|  | 36 | ;--- Store the result | 
|---|
|  | 37 | S @ROR8DST@(DATE,NAME,IEN)=$P(RESULT(1),U,3) | 
|---|
|  | 38 | Q 0 | 
|---|
|  | 39 | ; | 
|---|
|  | 40 | ;***** QUERIES THE REGISTRY | 
|---|
|  | 41 | ; | 
|---|
|  | 42 | ; FLAGS         Flags for the $$SKIP^RORXU005 | 
|---|
|  | 43 | ; .NSPT         Number of selected patients is returned here | 
|---|
|  | 44 | ; | 
|---|
|  | 45 | ; Return Values: | 
|---|
|  | 46 | ;       <0  Error code | 
|---|
|  | 47 | ;        0  Ok | 
|---|
|  | 48 | ;       >0  Number of non-fatal errors | 
|---|
|  | 49 | ; | 
|---|
|  | 50 | QUERY(FLAGS,NSPT) ; | 
|---|
|  | 51 | N RORLDST       ; Descriptor for Lab search API | 
|---|
|  | 52 | N RORPTN        ; Number of patients in the registry | 
|---|
|  | 53 | N RORXDST       ; Descriptor for pharmacy search API | 
|---|
|  | 54 | ; | 
|---|
|  | 55 | N CNT,ECNT,IEN,IENS,LTEDT,LTSDT,PATIEN,RC,RXEDT,SKIP,SKIPEDT,SKIPSDT,TMP,UTEDT,UTIL,UTSDT,VA,VADM,XREFNODE | 
|---|
|  | 56 | S XREFNODE=$NA(^RORDATA(798,"AC",+RORREG)) | 
|---|
|  | 57 | S (CNT,ECNT,NSPT,RC)=0,(SKIPEDT,SKIPSDT)=0 | 
|---|
|  | 58 | ;--- Utilization date range | 
|---|
|  | 59 | D:$$PARAM^RORTSK01("PATIENTS","CAREONLY") | 
|---|
|  | 60 | . S UTSDT=$$PARAM^RORTSK01("DATE_RANGE_3","START")\1 | 
|---|
|  | 61 | . S UTEDT=$$PARAM^RORTSK01("DATE_RANGE_3","END")\1 | 
|---|
|  | 62 | . ;--- Combined date range | 
|---|
|  | 63 | . S SKIPSDT=$$DTMIN^RORUTL18(SKIPSDT,UTSDT) | 
|---|
|  | 64 | . S SKIPEDT=$$DTMAX^RORUTL18(SKIPEDT,UTEDT) | 
|---|
|  | 65 | ;--- Number of patients in the registry | 
|---|
|  | 66 | S RORPTN=$$REGSIZE^RORUTL02(+RORREG)  S:RORPTN<0 RORPTN=0 | 
|---|
|  | 67 | ; | 
|---|
|  | 68 | ;--- Setup the descriptors for callback API's | 
|---|
|  | 69 | I RORLAB  D | 
|---|
|  | 70 | . I RORLTST'="*",$D(@RORLTST)<10  S RORLAB=0  Q | 
|---|
|  | 71 | . S RORLDST("RORCB")="$$LTSCB^RORX012A" | 
|---|
|  | 72 | . ;--- Labs date range | 
|---|
|  | 73 | . S LTSDT=$$PARAM^RORTSK01("DATE_RANGE_2","START")\1 | 
|---|
|  | 74 | . S LTEDT=$$PARAM^RORTSK01("DATE_RANGE_2","END")\1 | 
|---|
|  | 75 | . ;--- Combined date range | 
|---|
|  | 76 | . S SKIPSDT=$$DTMIN^RORUTL18(SKIPSDT,LTSDT) | 
|---|
|  | 77 | . S SKIPEDT=$$DTMAX^RORUTL18(SKIPEDT,LTEDT) | 
|---|
|  | 78 | . ;--- Shift the Labs end date | 
|---|
|  | 79 | . S LTEDT=$$FMADD^XLFDT(LTEDT,1) | 
|---|
|  | 80 | I RORPHARM  D | 
|---|
|  | 81 | . I RORXL'="*",$D(@RORXL)<10  S RORPHARM=0  Q | 
|---|
|  | 82 | . S RORXDST("RORCB")="$$RXSCB^RORX012A" | 
|---|
|  | 83 | . S RORXDST("GENERIC")=$$PARAM^RORTSK01("DRUGS","AGGR_GENERIC") | 
|---|
|  | 84 | . ;--- Combined date range | 
|---|
|  | 85 | . S SKIPSDT=$$DTMIN^RORUTL18(SKIPSDT,RORXSDT) | 
|---|
|  | 86 | . S SKIPEDT=$$DTMAX^RORUTL18(SKIPEDT,RORXEDT) | 
|---|
|  | 87 | . ;--- Shift the Meds end date | 
|---|
|  | 88 | . S RXEDT=$$FMADD^XLFDT(RORXEDT\1,1) | 
|---|
|  | 89 | Q:'(RORLAB!RORPHARM) 0 | 
|---|
|  | 90 | ; | 
|---|
|  | 91 | ;--- Browse through the registry records | 
|---|
|  | 92 | S IEN=0 | 
|---|
|  | 93 | F  S IEN=$O(@XREFNODE@(IEN))  Q:IEN'>0  D  Q:RC<0 | 
|---|
|  | 94 | . S TMP=$S(RORPTN>0:CNT/RORPTN,1:"") | 
|---|
|  | 95 | . S RC=$$LOOP^RORTSK01(TMP)  Q:RC<0 | 
|---|
|  | 96 | . S IENS=IEN_",",CNT=CNT+1 | 
|---|
|  | 97 | . ;--- Check if the patient should be skipped | 
|---|
|  | 98 | . Q:$$SKIP^RORXU005(IEN,FLAGS,SKIPSDT,SKIPEDT) | 
|---|
|  | 99 | . S SKIP=1,UTIL=0 | 
|---|
|  | 100 | . ; | 
|---|
|  | 101 | . ;--- Get the patient IEN (DFN) | 
|---|
|  | 102 | . S PATIEN=$$PTIEN^RORUTL01(IEN)  Q:PATIEN'>0 | 
|---|
|  | 103 | . ; | 
|---|
|  | 104 | . D  I RC<0  S ECNT=ECNT+1,RC=0  Q | 
|---|
|  | 105 | . . ;--- Search for pharmacy data | 
|---|
|  | 106 | . . I RORPHARM  D  Q:RC'>0 | 
|---|
|  | 107 | . . . M RORXDST("RORXGRP")=RORXGRP("C") | 
|---|
|  | 108 | . . . S RORXDST=$NA(^TMP("RORX012",$J,"PAT",PATIEN,"RX")) | 
|---|
|  | 109 | . . . K RORXDST("RORUTIL") | 
|---|
|  | 110 | . . . S RC=$$RXSEARCH^RORUTL14(PATIEN,RORXL,.RORXDST,"EIOV",RORXSDT,RXEDT) | 
|---|
|  | 111 | . . . Q:RC<0 | 
|---|
|  | 112 | . . . ;S:$G(RORXDST("RORUTIL")) UTIL=1 | 
|---|
|  | 113 | . . . I RC>0  S:$D(RORXDST("RORXGRP"))>1 RC=0 | 
|---|
|  | 114 | . . . ;--- Invert the result if the "Did Not" logic was selected | 
|---|
|  | 115 | . . . I RORPHARM<0  S RC='RC  K @RORXDST | 
|---|
|  | 116 | . . ;--- Search for Lab data | 
|---|
|  | 117 | . . I RORLAB  D  Q:RC'>0 | 
|---|
|  | 118 | . . . S RORLDST=$NA(^TMP("RORX012",$J,"PAT",PATIEN,"LR")) | 
|---|
|  | 119 | . . . K RORLDST("RORUTIL") | 
|---|
|  | 120 | . . . S RC=$$LTSEARCH^RORUTL10(PATIEN,RORLTST,.RORLDST,,LTSDT,LTEDT) | 
|---|
|  | 121 | . . . Q:RC<0 | 
|---|
|  | 122 | . . . ;S:$G(RORLDST("RORUTIL")) UTIL=1 | 
|---|
|  | 123 | . . . ;--- Invert the result if the "Did Not" logic was selected | 
|---|
|  | 124 | . . . S:RORLAB<0 RC='RC | 
|---|
|  | 125 | . . ;--- | 
|---|
|  | 126 | . . S SKIP=0 | 
|---|
|  | 127 | . ; | 
|---|
|  | 128 | . ;--- Check for any utilization in the corresponding date range | 
|---|
|  | 129 | . I 'SKIP  D:$$PARAM^RORTSK01("PATIENTS","CAREONLY") | 
|---|
|  | 130 | . . K TMP  S TMP("ALL")=1 | 
|---|
|  | 131 | . . S UTIL=+$$UTIL^RORXU003(UTSDT,UTEDT,PATIEN,.TMP) | 
|---|
|  | 132 | . . S:'UTIL SKIP=1 | 
|---|
|  | 133 | . ; | 
|---|
|  | 134 | . ;--- Skip the patient if not all search criteria have been met | 
|---|
|  | 135 | . I SKIP  K ^TMP("RORX012",$J,"PAT",PATIEN)  Q | 
|---|
|  | 136 | . ; | 
|---|
|  | 137 | . ;--- Get and store the patient's data | 
|---|
|  | 138 | . D VADEM^RORUTL05(PATIEN,1) | 
|---|
|  | 139 | . S TMP=$$DATE^RORXU002(VADM(6)\1) | 
|---|
|  | 140 | . S ^TMP("RORX012",$J,"PAT",PATIEN)=VA("BID")_U_VADM(1)_U_TMP | 
|---|
|  | 141 | . S NSPT=NSPT+1 | 
|---|
|  | 142 | ; | 
|---|
|  | 143 | ;--- | 
|---|
|  | 144 | Q $S(RC<0:RC,1:ECNT) | 
|---|
|  | 145 | ; | 
|---|
|  | 146 | ;***** CALLBACK FUNCTION FOR THE PHARMACY SEARCH API | 
|---|
|  | 147 | RXSCB(ROR8DST,ORDER,ORDFLG,DRUG,DATE) ; | 
|---|
|  | 148 | N GRP,IEN,NAME,TMP | 
|---|
|  | 149 | S ROR8DST("RORUTIL")=1 | 
|---|
|  | 150 | ;=== Check the drug groups | 
|---|
|  | 151 | S TMP=$$RXGRPCHK^RORXU007(.ROR8DST,+DRUG,RORXL) | 
|---|
|  | 152 | Q:TMP TMP | 
|---|
|  | 153 | ;--- Get the drug data | 
|---|
|  | 154 | I ROR8DST("GENERIC")  D | 
|---|
|  | 155 | . S IEN=+ROR8DST("RORXGEN"),NAME=$P(ROR8DST("RORXGEN"),U,2) | 
|---|
|  | 156 | E  S IEN=+DRUG,NAME=$P(DRUG,U,2) | 
|---|
|  | 157 | Q:(IEN'>0)!(NAME="") 1 | 
|---|
|  | 158 | ;--- Output the data | 
|---|
|  | 159 | S @ROR8DST@(NAME,IEN)="" | 
|---|
|  | 160 | Q 0 | 
|---|
|  | 161 | ; | 
|---|
|  | 162 | ;***** STORES THE REPORT DATA | 
|---|
|  | 163 | ; | 
|---|
|  | 164 | ; REPORT        IEN of the REPORT element | 
|---|
|  | 165 | ; NSPT          Number of selected patients | 
|---|
|  | 166 | ; | 
|---|
|  | 167 | ; Return Values: | 
|---|
|  | 168 | ;       <0  Error code | 
|---|
|  | 169 | ;        0  Ok | 
|---|
|  | 170 | ;       >0  Number of non-fatal errors | 
|---|
|  | 171 | ; | 
|---|
|  | 172 | STORE(REPORT,NSPT) ; | 
|---|
|  | 173 | N CNT,DATE,DFN,DOD,ECNT,IEN,ITEM,LAST4,LTLST,NAME,NODE,PTCNT,PTLST,PTNAME,RC,RXLST,TMP,VAL | 
|---|
|  | 174 | S (ECNT,RC)=0,(LTLST,PTLST,RXLST)=-1 | 
|---|
|  | 175 | ;--- Force the "patient data" note in the output | 
|---|
|  | 176 | D ADDVAL^RORTSK11(RORTSK,"PATIENT",,REPORT) | 
|---|
|  | 177 | ;--- Create lab test list | 
|---|
|  | 178 | I RORLAB  D  Q:LTLST<0 LTLST | 
|---|
|  | 179 | . S LTLST=$$ADDVAL^RORTSK11(RORTSK,"LABTESTS",,REPORT) | 
|---|
|  | 180 | . D ADDATTR^RORTSK11(RORTSK,LTLST,"TABLE","LABTESTS") | 
|---|
|  | 181 | ;--- Create pharmacy list | 
|---|
|  | 182 | I RORPHARM>0  D  Q:RXLST<0 RXLST | 
|---|
|  | 183 | . S RXLST=$$ADDVAL^RORTSK11(RORTSK,"DRUGS",,REPORT) | 
|---|
|  | 184 | . D ADDATTR^RORTSK11(RORTSK,RXLST,"TABLE","DRUGS") | 
|---|
|  | 185 | ;--- Create patient list | 
|---|
|  | 186 | I (RORLAB<0)!(RORPHARM<0)  D  Q:PTLST<0 PTLST | 
|---|
|  | 187 | . S PTLST=$$ADDVAL^RORTSK11(RORTSK,"PATIENTS",,REPORT) | 
|---|
|  | 188 | . D ADDATTR^RORTSK11(RORTSK,PTLST,"TABLE","PATIENTS") | 
|---|
|  | 189 | ;--- | 
|---|
|  | 190 | S (CNT,DFN,PTCNT)=0 | 
|---|
|  | 191 | F  S DFN=$O(^TMP("RORX012",$J,"PAT",DFN))  Q:DFN'>0  D  Q:RC<0 | 
|---|
|  | 192 | . S TMP=$S(NSPT>0:CNT/NSPT,1:"") | 
|---|
|  | 193 | . S RC=$$LOOP^RORTSK01(TMP)  Q:RC<0 | 
|---|
|  | 194 | . S CNT=CNT+1,NODE=$NA(^TMP("RORX012",$J,"PAT",DFN)) | 
|---|
|  | 195 | . ;--- Patient's data | 
|---|
|  | 196 | . S TMP=$G(@NODE) | 
|---|
|  | 197 | . S LAST4=$P(TMP,U),PTNAME=$P(TMP,U,2),DOD=$P(TMP,U,3) | 
|---|
|  | 198 | . ;--- Patient list | 
|---|
|  | 199 | . S TMP=$S(LTLST<0:1,1:$D(@NODE@("LR"))<10) | 
|---|
|  | 200 | . I TMP,$S(RXLST<0:1,1:$D(@NODE@("RX"))<10)  D  Q | 
|---|
|  | 201 | . . S ITEM=$$ADDVAL^RORTSK11(RORTSK,"PATIENT",,PTLST,,DFN) | 
|---|
|  | 202 | . . D ADDVAL^RORTSK11(RORTSK,"NAME",PTNAME,ITEM,1) | 
|---|
|  | 203 | . . D ADDVAL^RORTSK11(RORTSK,"LAST4",LAST4,ITEM,2) | 
|---|
|  | 204 | . . D ADDVAL^RORTSK11(RORTSK,"DOD",DOD,ITEM,1) | 
|---|
|  | 205 | . . S PTCNT=PTCNT+1 | 
|---|
|  | 206 | . ;--- List of Lab tests | 
|---|
|  | 207 | . S DATE="" | 
|---|
|  | 208 | . F  S DATE=$O(@NODE@("LR",DATE))  Q:DATE=""  D | 
|---|
|  | 209 | . . S NAME="" | 
|---|
|  | 210 | . . F  S NAME=$O(@NODE@("LR",DATE,NAME))  Q:NAME=""  D | 
|---|
|  | 211 | . . . S IEN="" | 
|---|
|  | 212 | . . . F  S IEN=$O(@NODE@("LR",DATE,NAME,IEN))  Q:IEN=""  D | 
|---|
|  | 213 | . . . . S ITEM=$$ADDVAL^RORTSK11(RORTSK,"LT",,LTLST,,DFN) | 
|---|
|  | 214 | . . . . D ADDVAL^RORTSK11(RORTSK,"NAME",PTNAME,ITEM,1) | 
|---|
|  | 215 | . . . . D ADDVAL^RORTSK11(RORTSK,"LAST4",LAST4,ITEM,2) | 
|---|
|  | 216 | . . . . D ADDVAL^RORTSK11(RORTSK,"DOD",DOD,ITEM,1) | 
|---|
|  | 217 | . . . . D ADDVAL^RORTSK11(RORTSK,"DATE",DATE\1,ITEM,1) | 
|---|
|  | 218 | . . . . D ADDVAL^RORTSK11(RORTSK,"LTNAME",NAME,ITEM,1) | 
|---|
|  | 219 | . . . . S VAL=$G(@NODE@("LR",DATE,NAME,IEN)) | 
|---|
|  | 220 | . . . . S TMP=$S($$NUMERIC^RORUTL05(VAL):3,1:1) | 
|---|
|  | 221 | . . . . D ADDVAL^RORTSK11(RORTSK,"RESULT",VAL,ITEM,TMP) | 
|---|
|  | 222 | . ;--- List of drugs | 
|---|
|  | 223 | . S NAME="" | 
|---|
|  | 224 | . F  S NAME=$O(@NODE@("RX",NAME))  Q:NAME=""  D | 
|---|
|  | 225 | . . S ITEM=$$ADDVAL^RORTSK11(RORTSK,"DRUG",,RXLST,,DFN) | 
|---|
|  | 226 | . . D ADDVAL^RORTSK11(RORTSK,"NAME",PTNAME,ITEM,1) | 
|---|
|  | 227 | . . D ADDVAL^RORTSK11(RORTSK,"LAST4",LAST4,ITEM,2) | 
|---|
|  | 228 | . . D ADDVAL^RORTSK11(RORTSK,"DOD",DOD,ITEM,1) | 
|---|
|  | 229 | . . D ADDVAL^RORTSK11(RORTSK,"RXNAME",NAME,ITEM,1) | 
|---|
|  | 230 | ;--- Inactivate the patient list tag if the list is empty | 
|---|
|  | 231 | D:PTCNT'>0 UPDVAL^RORTSK11(RORTSK,PTLST,,,1) | 
|---|
|  | 232 | ;--- | 
|---|
|  | 233 | Q ECNT | 
|---|