| 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 | 
|---|