| [613] | 1 | RORUPD04 ;HCIOFO/SG - PROCESSING OF THE LAB DATA  ; 12/8/05 8:20am
 | 
|---|
 | 2 |  ;;1.5;CLINICAL CASE REGISTRIES;;Feb 17, 2006
 | 
|---|
 | 3 |  ;
 | 
|---|
 | 4 |  Q
 | 
|---|
 | 5 |  ;
 | 
|---|
 | 6 |  ;***** CHECKS AN INDICATOR CONDITION
 | 
|---|
 | 7 |  ;
 | 
|---|
 | 8 |  ; LSI           Indicator (internal value)
 | 
|---|
 | 9 |  ; VAL           Indicated value
 | 
|---|
 | 10 |  ; .RESULT(      Result value
 | 
|---|
 | 11 |  ;   "RH")       Reference high
 | 
|---|
 | 12 |  ;   "RL")       Reference low
 | 
|---|
 | 13 |  ;
 | 
|---|
 | 14 |  ; Return Values:
 | 
|---|
 | 15 |  ;        0  False
 | 
|---|
 | 16 |  ;       >0  True
 | 
|---|
 | 17 |  ;
 | 
|---|
 | 18 | CHKIND(LSI,VAL,RESULT) ;
 | 
|---|
 | 19 |  S RESULT=$$UP^XLFSTR(RESULT)
 | 
|---|
 | 20 |  ;--- Reference Range
 | 
|---|
 | 21 |  I LSI=1  D  Q LSI
 | 
|---|
 | 22 |  . I $G(RESULT("RL"))'=""  Q:RESULT<RESULT("RL")
 | 
|---|
 | 23 |  . I $G(RESULT("RH"))'=""  Q:RESULT>RESULT("RH")
 | 
|---|
 | 24 |  . S LSI=0
 | 
|---|
 | 25 |  ;--- Positive Result
 | 
|---|
 | 26 |  I LSI=6  S VAL=0  D  Q VAL
 | 
|---|
 | 27 |  . I (RESULT="P")!(RESULT="R")  S VAL=1  Q
 | 
|---|
 | 28 |  . I RESULT'["POS",RESULT'["REA",RESULT'["DETEC"  Q
 | 
|---|
 | 29 |  . I RESULT'["NEG",RESULT'["NO",RESULT'["IND"  S VAL=1
 | 
|---|
 | 30 |  ;--- Compare to the value
 | 
|---|
 | 31 |  Q:VAL="" 0
 | 
|---|
 | 32 |  I LSI=3  Q (RESULT>VAL)
 | 
|---|
 | 33 |  I LSI=4  Q (RESULT<VAL)
 | 
|---|
 | 34 |  S VAL=$$UP^XLFSTR(VAL)
 | 
|---|
 | 35 |  I LSI=2  Q (RESULT[VAL)
 | 
|---|
 | 36 |  I LSI=5  Q (RESULT=VAL)
 | 
|---|
 | 37 |  Q 0
 | 
|---|
 | 38 |  ;
 | 
|---|
 | 39 |  ;***** PROCESSING OF THE 'LAB DATA' FILE
 | 
|---|
 | 40 |  ;
 | 
|---|
 | 41 |  ; UPDSTART      Date of the earliest update (DO NOT pass by
 | 
|---|
 | 42 |  ;               reference)
 | 
|---|
 | 43 |  ; PATIEN        Patient IEN
 | 
|---|
 | 44 |  ;
 | 
|---|
 | 45 |  ; Return values:
 | 
|---|
 | 46 |  ;       <0  Error code
 | 
|---|
 | 47 |  ;        0  Continue processing of the current patient
 | 
|---|
 | 48 |  ;        1  Stop processing
 | 
|---|
 | 49 |  ;
 | 
|---|
 | 50 | LAB(UPDSTART,PATIEN) ;
 | 
|---|
 | 51 |  N RORFILE       ; File number
 | 
|---|
 | 52 |  ;
 | 
|---|
 | 53 |  N DM,DSEND,LABIENS,RC,RORLAB,TMP
 | 
|---|
 | 54 |  S RORFILE=63,DSEND=RORUPD("DSEND")
 | 
|---|
 | 55 |  K RORVALS("LS")
 | 
|---|
 | 56 |  ;--- If the start date is more than 60 days in the past, results
 | 
|---|
 | 57 |  ;    should be loaded using collection dates. Otherwise, dates of
 | 
|---|
 | 58 |  ;--- the results are used).
 | 
|---|
 | 59 |  S DM=$S($$FMDIFF^XLFDT(DT,UPDSTART)>60:"^CD",1:"^RAD")
 | 
|---|
 | 60 |  ;--- Check the event references if the events are enabled
 | 
|---|
 | 61 |  I $G(RORUPD("FLAGS"))["E"  D  Q:RC'>0 RC
 | 
|---|
 | 62 |  . S RC=$$GET^RORUPP02(PATIEN,1,.UPDSTART,.DSEND)
 | 
|---|
 | 63 |  . ;--- If dates have been modified according to the event references,
 | 
|---|
 | 64 |  . ;--- they are the collection dates/times.
 | 
|---|
 | 65 |  . S:RC>1 UPDSTART=UPDSTART\1,DSEND=$$FMADD^XLFDT(DSEND\1,1),DM="^CD"
 | 
|---|
 | 66 |  ;---
 | 
|---|
 | 67 |  S TMP=$$LABREF^RORUTL18(PATIEN)  Q:TMP'>0 TMP
 | 
|---|
 | 68 |  S LABIENS=TMP_",",RC=0
 | 
|---|
 | 69 |  ;
 | 
|---|
 | 70 |  S RORLAB=$$ALLOC^RORTMP()  D  D FREE^RORTMP(RORLAB)
 | 
|---|
 | 71 |  . ;--- Load the Lab results
 | 
|---|
 | 72 |  . S RC=$$LABRSLTS^RORUTL02(PATIEN,UPDSTART_DM,DSEND_DM,RORLAB)
 | 
|---|
 | 73 |  . I RC<0  D INCEC^RORUPDUT(.RC)  Q
 | 
|---|
 | 74 |  . ;--- Process the results
 | 
|---|
 | 75 |  . Q:$$RESULTS(PATIEN,RORLAB)<0
 | 
|---|
 | 76 |  . ;--- Load necessary data elements
 | 
|---|
 | 77 |  . I $D(RORUPD("SR",RORFILE,"F"))>1  D  I TMP<0  D INCEC^RORUPDUT()  Q
 | 
|---|
 | 78 |  . . S TMP=$$LOAD(LABIENS)
 | 
|---|
 | 79 |  . ;--- Apply "before" rules
 | 
|---|
 | 80 |  . S RC=$$APLRULES^RORUPDUT(RORFILE,LABIENS,"B")
 | 
|---|
 | 81 |  . I RC  D INCEC^RORUPDUT(.RC)  Q
 | 
|---|
 | 82 |  . ;--- Apply "after" rules
 | 
|---|
 | 83 |  . S RC=$$APLRULES^RORUPDUT(RORFILE,LABIENS,"A")
 | 
|---|
 | 84 |  . I RC  D INCEC^RORUPDUT(.RC)  Q
 | 
|---|
 | 85 |  ;
 | 
|---|
 | 86 |  D CLRDES^RORUPDUT(RORFILE)
 | 
|---|
 | 87 |  Q RC
 | 
|---|
 | 88 |  ;
 | 
|---|
 | 89 |  ;***** LOAD DATA ELEMENTS
 | 
|---|
 | 90 |  ;
 | 
|---|
 | 91 |  ; IENS          IENS of the current record
 | 
|---|
 | 92 |  ;
 | 
|---|
 | 93 |  ; Return values:
 | 
|---|
 | 94 |  ;       <0  Error code
 | 
|---|
 | 95 |  ;        0  Ok
 | 
|---|
 | 96 |  ;
 | 
|---|
 | 97 | LOAD(IENS) ;
 | 
|---|
 | 98 |  N RC  S RC=0
 | 
|---|
 | 99 |  ;--- API #1
 | 
|---|
 | 100 |  I $D(RORUPD("SR",RORFILE,"F",1))  D  Q:RC<0 RC
 | 
|---|
 | 101 |  . S RC=$$LOADFLDS^RORUPDUT(RORFILE,IENS)
 | 
|---|
 | 102 |  ;--- API #2
 | 
|---|
 | 103 |  Q 0
 | 
|---|
 | 104 |  ;
 | 
|---|
 | 105 |  ;***** EXTRACTS PROPER RESULT CODE FROM THE OBSERVATION ID
 | 
|---|
 | 106 |  ;
 | 
|---|
 | 107 |  ; OID           Observation ID in HL7 format
 | 
|---|
 | 108 |  ; CS            HL7 component separator
 | 
|---|
 | 109 |  ;
 | 
|---|
 | 110 |  ; Return values:
 | 
|---|
 | 111 |  ;           Lab result code (see the LA7SC parameter of
 | 
|---|
 | 112 |  ;           the GCPR^LA7QRY entry point)
 | 
|---|
 | 113 |  ;             ^1: Result code
 | 
|---|
 | 114 |  ;             ^2: Coding system ("LN" or "NLT")
 | 
|---|
 | 115 |  ;           Or an empty string if coding system is unknown or there
 | 
|---|
 | 116 |  ;           are no active search indicators exist for this code.
 | 
|---|
 | 117 |  ;
 | 
|---|
 | 118 | RESCODE(OID,CS) ;
 | 
|---|
 | 119 |  N CODE,I,RESCODE,TYPE
 | 
|---|
 | 120 |  S RESCODE=""
 | 
|---|
 | 121 |  F I=1,4  D  Q:RESCODE'=""
 | 
|---|
 | 122 |  . S CODE=$P(OID,CS,I),TYPE=$P(OID,CS,I+2)             Q:CODE=""
 | 
|---|
 | 123 |  . S TYPE=$S(TYPE="LN":"LN",TYPE="99VA64":"NLT",1:"")  Q:TYPE=""
 | 
|---|
 | 124 |  . ;--- Check if the search indicators exist for this code
 | 
|---|
 | 125 |  . S RESCODE=CODE_U_TYPE
 | 
|---|
 | 126 |  . S:$D(@RORUPDPI@("LS",RESCODE))<10 RESCODE=""
 | 
|---|
 | 127 |  Q RESCODE
 | 
|---|
 | 128 |  ;
 | 
|---|
 | 129 |  ;***** LOADS AND PROCESSES RESULTS OF THE TESTS
 | 
|---|
 | 130 |  ;
 | 
|---|
 | 131 |  ; PATIEN        Patient IEN
 | 
|---|
 | 132 |  ; ROR8LAB       Closed root of the HL7 message created by GCPR^LA7QRY
 | 
|---|
 | 133 |  ;
 | 
|---|
 | 134 |  ; Return values:
 | 
|---|
 | 135 |  ;       <0  Error code
 | 
|---|
 | 136 |  ;        0  Ok
 | 
|---|
 | 137 |  ;
 | 
|---|
 | 138 | RESULTS(PATIEN,ROR8LAB) ;
 | 
|---|
 | 139 |  N CS,DATE,FS,I,ISEG,LOCATION,LSIEN,LSNODE,RC,RESCODE,RESVAL,RORHL,SEG,SEGTYPE,TMP
 | 
|---|
 | 140 |  S ISEG="",RC=0
 | 
|---|
 | 141 |  F  S ISEG=$O(@ROR8LAB@(ISEG))  Q:ISEG=""  D  Q:RC<0
 | 
|---|
 | 142 |  . S SEG=$G(@ROR8LAB@(ISEG))
 | 
|---|
 | 143 |  . ;--- Extract separators from the MSH segment
 | 
|---|
 | 144 |  . I $E(SEG,1,3)="MSH"  D  Q
 | 
|---|
 | 145 |  . . S (RORHL("FS"),FS)=$E(SEG,4),TMP=$P(SEG,FS,2)
 | 
|---|
 | 146 |  . . S CS=$E(TMP,1)
 | 
|---|
 | 147 |  . ;--- Skip all segments except OBX
 | 
|---|
 | 148 |  . S SEGTYPE=$P(SEG,FS)
 | 
|---|
 | 149 |  . Q:SEGTYPE'="OBX"
 | 
|---|
 | 150 |  . ;--- Get lab result code
 | 
|---|
 | 151 |  . S RESCODE=$$RESCODE($P(SEG,FS,4),CS)  Q:RESCODE=""
 | 
|---|
 | 152 |  . ;--- Load the full segment
 | 
|---|
 | 153 |  . D LOADSEG^RORHL7A(.SEG,$NA(@ROR8LAB@(ISEG)))
 | 
|---|
 | 154 |  . ;--- Get the result data
 | 
|---|
 | 155 |  . S RESVAL=$G(SEG(5)),TMP=$G(SEG(7))
 | 
|---|
 | 156 |  . S RESVAL("RL")=$P(TMP,"-",1) ; Reference Low
 | 
|---|
 | 157 |  . S RESVAL("RH")=$P(TMP,"-",2) ; Reference High
 | 
|---|
 | 158 |  . S DATE=$$HL7TFM^XLFDT($G(SEG(14)),"L")\1
 | 
|---|
 | 159 |  . ;--- Analyze the result
 | 
|---|
 | 160 |  . K LOCATION
 | 
|---|
 | 161 |  . S LSNODE=$NA(@RORUPDPI@("LS",RESCODE))
 | 
|---|
 | 162 |  . S LSIEN=""
 | 
|---|
 | 163 |  . F  S LSIEN=$O(@LSNODE@(LSIEN))  Q:LSIEN=""  D  Q:RC<0
 | 
|---|
 | 164 |  . . S I="",RC=0
 | 
|---|
 | 165 |  . . F  S I=$O(@LSNODE@(LSIEN,I))  Q:I=""  D  Q:RC
 | 
|---|
 | 166 |  . . . S TMP=$G(@LSNODE@(LSIEN,I))
 | 
|---|
 | 167 |  . . . S RC=$$CHKIND(+TMP,$P(TMP,U,2),.RESVAL)
 | 
|---|
 | 168 |  . . Q:RC'>0
 | 
|---|
 | 169 |  . . S TMP=+$G(RORVALS("LS",LSIEN))
 | 
|---|
 | 170 |  . . I TMP  Q:(DATE'>0)!(DATE'<TMP)
 | 
|---|
 | 171 |  . . S:'$D(LOCATION) LOCATION=$$IEN^XUAF4($P($G(SEG(15)),CS))
 | 
|---|
 | 172 |  . . S RORVALS("LS",LSIEN)=DATE_U_LOCATION
 | 
|---|
 | 173 |  ;---
 | 
|---|
 | 174 |  Q $S(RC<0:RC,1:0)
 | 
|---|
 | 175 |  ;
 | 
|---|
 | 176 |  ;***** IMPLEMENTATION OF THE SELECTION RULE
 | 
|---|
 | 177 |  ;
 | 
|---|
 | 178 |  ; LSIEN         Lab Search IEN
 | 
|---|
 | 179 |  ;
 | 
|---|
 | 180 |  ; Return values:
 | 
|---|
 | 181 |  ;        0  Skip the patient
 | 
|---|
 | 182 |  ;        1  Add the patient
 | 
|---|
 | 183 |  ;
 | 
|---|
 | 184 | RULE(LSIEN) ;
 | 
|---|
 | 185 |  Q:'$D(RORVALS("LS",LSIEN)) 0
 | 
|---|
 | 186 |  N DATE,LOC,SRDT
 | 
|---|
 | 187 |  S DATE=+$G(RORVALS("LS",LSIEN))
 | 
|---|
 | 188 |  D:DATE>0
 | 
|---|
 | 189 |  . S LOC=$P($G(RORVALS("LS",LSIEN)),U,2)
 | 
|---|
 | 190 |  . S SRDT=$$GETVAL^RORUPDUT("ROR SRDT")
 | 
|---|
 | 191 |  . I (DATE<SRDT)!(SRDT'>0)  D  Q
 | 
|---|
 | 192 |  . . S RORVALS("SV","ROR SRDT")=DATE
 | 
|---|
 | 193 |  . . S RORVALS("SV","ROR SRLOC")=LOC
 | 
|---|
 | 194 |  . I DATE=SRDT  D:$$GETVAL^RORUPDUT("ROR SRLOC")=""  Q
 | 
|---|
 | 195 |  . . S RORVALS("SV","ROR SRLOC")=LOC
 | 
|---|
 | 196 |  Q 1
 | 
|---|