| 1 | ECXTRT1 ;ALB/JAP Treating Specialty Change Extract (cont) ; July 22, 1998
 | 
|---|
| 2 |  ;;3.0;DSS EXTRACTS;**8**;Dec 22, 1997
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 | PREVTRT(ECXLOC,ECXDATE1,ECXDATE2,ECXTRTL,ECXLOS) ;find the date on which the change to the losing treat. spec. occurred
 | 
|---|
| 5 |  ;   input
 | 
|---|
| 6 |  ;   ECXLOC   = local array built from ATS index on file #405 (passed by reference); required
 | 
|---|
| 7 |  ;   ECXDATE1 = inverse date of current (new) ts movement; required)
 | 
|---|
| 8 |  ;   ECXDATE2 = inverse date of previous (losing) ts movement; required
 | 
|---|
| 9 |  ;   ECXTRTL  = pointer value to file #45.7 for previous facility 
 | 
|---|
| 10 |  ;              treating specialty; required
 | 
|---|
| 11 |  ;   output
 | 
|---|
| 12 |  ;   ECXLOS  = patients length of stay on previous (losing) ts (passed by reference)
 | 
|---|
| 13 |  ;
 | 
|---|
| 14 |  N DATE,DATE3,X,X1,X2
 | 
|---|
| 15 |  S DATE=ECXDATE2,DATE3="",ECXLOS=0
 | 
|---|
| 16 |  F  S DATE=$O(ECXLOC(DATE)) Q:DATE=""  S TRT=$O(ECXLOC(DATE,0)) Q:TRT'=ECXTRTL
 | 
|---|
| 17 |  ;if date=null, then get immediately previous date by reverse $o
 | 
|---|
| 18 |  ;if date=null, this gets the last date in ecxloc array, i.e., the admission ts movement
 | 
|---|
| 19 |  S DATE3=$O(ECXLOC(DATE),-1)
 | 
|---|
| 20 |  S X1=9999999.9999999-ECXDATE1,X2=9999999.9999999-DATE3 D ^%DTC
 | 
|---|
| 21 |  S ECXLOS=X S:ECXLOS>9999 ECXLOS=9999
 | 
|---|
| 22 |  Q
 | 
|---|
| 23 |  ;
 | 
|---|
| 24 | PREVATT(ECXLOC,ECXDATE1,ECXATTN,ECXDATE2,ECXATTL,ECXLOS) ;find the date on which the change to the losing attending occurred
 | 
|---|
| 25 |  ;   input
 | 
|---|
| 26 |  ;   ECXLOC   = local array built from ATS index on file #405 (passed by reference); required
 | 
|---|
| 27 |  ;   ECXDATE1 = inverse date of current (new) attending; required)
 | 
|---|
| 28 |  ;   ECXATTN  = specifier for current (new) attending; required
 | 
|---|
| 29 |  ;   ECXDATE2 = inverse date of previous (losing) attending; required
 | 
|---|
| 30 |  ;   ECXATTL  = specifier for previous (losing) attending (passed by reference); required
 | 
|---|
| 31 |  ;   output
 | 
|---|
| 32 |  ;   ECXLOSA  = patients length of stay with previous (losing) attending (passed by reference)
 | 
|---|
| 33 |  ;
 | 
|---|
| 34 |  N DATE,DATE3,X,X1,X2,TRT,REC,ATT,OUT
 | 
|---|
| 35 |  S (DATE,DATE3)=ECXDATE2,ECXLOSA="",OUT=0
 | 
|---|
| 36 |  I ECXATTL'="" D
 | 
|---|
| 37 |  .F  S DATE=$O(ECXLOC(DATE)) Q:DATE=""  S TRT=$O(ECXLOC(DATE,0)),REC=$O(ECXLOC(DATE,TRT,0)) D  Q:OUT=1
 | 
|---|
| 38 |  ..S ATT=$P(ECXLOC(DATE,TRT,REC),U,3)
 | 
|---|
| 39 |  ..;if provider is changed, then quit without resetting date3, and quit loop
 | 
|---|
| 40 |  ..I ATT'="",ATT'=ECXATTL S OUT=1
 | 
|---|
| 41 |  ..;there's probably always data on attending, so this may not be needed;
 | 
|---|
| 42 |  ..;but if att=null, then dont know if provider in ecxattl was attending or not, so don't reset date3;
 | 
|---|
| 43 |  ..;reset date3 only if know for sure
 | 
|---|
| 44 |  ..I ATT=ECXATTL S DATE3=DATE
 | 
|---|
| 45 |  .;so date3 is earliest known date for attending specified in ecxattl
 | 
|---|
| 46 |  .S X1=9999999.9999999-ECXDATE1,X2=9999999.9999999-DATE3 D ^%DTC
 | 
|---|
| 47 |  .S ECXLOSA=X
 | 
|---|
| 48 |  ;theres probably always data on attending, so this may not be needed;
 | 
|---|
| 49 |  ;but if ecxattl is null, then need to find valid previous attending
 | 
|---|
| 50 |  I ECXATTL="" D
 | 
|---|
| 51 |  .;ecxattn will also be null if evaluating discharge movements
 | 
|---|
| 52 |  .F  S DATE=$O(ECXLOC(DATE)) Q:DATE=""  S TRT=$O(ECXLOC(DATE,0)),REC=$O(ECXLOC(DATE,TRT,0)) D  Q:OUT=1
 | 
|---|
| 53 |  ..S ATT=$P(ECXLOC(DATE,TRT,REC),U,3)
 | 
|---|
| 54 |  ..;if no change in attending, then keep ecxlosa=null
 | 
|---|
| 55 |  ..I ATT'="",ATT=ECXATTN S OUT=1
 | 
|---|
| 56 |  ..I ATT'="",ATT'=ECXATTN D
 | 
|---|
| 57 |  ...;reset ecxattl to send back to caller and calculate los
 | 
|---|
| 58 |  ...S OUT=1,ECXATTL=ATT,DATE3=DATE
 | 
|---|
| 59 |  ...S X1=99999999.9999999-ECXDATE1,X2=9999999.9999999-DATE3 D ^%DTC
 | 
|---|
| 60 |  ...S ECXLOSA=X
 | 
|---|
| 61 |  ;it is possible that ecxattl and ecxlosa will still be null
 | 
|---|
| 62 |  S:ECXLOSA>9999 ECXLOSA=9999
 | 
|---|
| 63 |  Q
 | 
|---|
| 64 |  ;
 | 
|---|
| 65 | PREVPRV(ECXLOC,ECXDATE1,ECXPRVN,ECXDATE2,ECXPRVL,ECXLOS) ;find the date on which the change to the losing primary provider occurred
 | 
|---|
| 66 |  ;   input
 | 
|---|
| 67 |  ;   ECXLOC   = local array built from ATS index on file #405 (passed by reference); required
 | 
|---|
| 68 |  ;   ECXDATE1 = inverse date of current (new) primary provider; required)
 | 
|---|
| 69 |  ;   ECXPRVN  = specifier for current (new) primary provider; required
 | 
|---|
| 70 |  ;   ECXDATE2 = inverse date of previous (losing) primary provider; required
 | 
|---|
| 71 |  ;   ECXPRVL  = specifier for previous (losing) primary provider 9passed by reference); required
 | 
|---|
| 72 |  ;   output
 | 
|---|
| 73 |  ;   ECXLOSP  = patients length of stay with previous (losing) primary provider (passed by reference)
 | 
|---|
| 74 |  ;
 | 
|---|
| 75 |  N DATE,DATE3,X,X1,X2,TRT,REC,PRV,OUT
 | 
|---|
| 76 |  S (DATE,DATE3)=ECXDATE2,ECXLOSP="",OUT=0
 | 
|---|
| 77 |  I ECXPRVL'="" D
 | 
|---|
| 78 |  .F  S DATE=$O(ECXLOC(DATE)) Q:DATE=""  S TRT=$O(ECXLOC(DATE,0)),REC=$O(ECXLOC(DATE,TRT,0)) D  Q:OUT=1
 | 
|---|
| 79 |  ..S PRV=$P(ECXLOC(DATE,TRT,REC),U,2)
 | 
|---|
| 80 |  ..;if provider is changed, then quit without resetting date3, and quit loop
 | 
|---|
| 81 |  ..I PRV'="",PRV'=ECXPRVL S OUT=1
 | 
|---|
| 82 |  ..;if prv=null, then don't know if provider in ecxprvl was patient's provider or not, so don't reset date3;
 | 
|---|
| 83 |  ..;reset date3 only if know for sure
 | 
|---|
| 84 |  ..I PRV=ECXPRVL S DATE3=DATE
 | 
|---|
| 85 |  .;so date3 is earliest known date for attending specified in ecxattl
 | 
|---|
| 86 |  .S X1=9999999.9999999-ECXDATE1,X2=9999999.9999999-DATE3 D ^%DTC
 | 
|---|
| 87 |  .S ECXLOSP=X
 | 
|---|
| 88 |  ;if ecxprvl is null, then need to find valid previous primary provider
 | 
|---|
| 89 |  I ECXPRVL="" D
 | 
|---|
| 90 |  .;ecxprvn will also be null if evaluating discharge movements
 | 
|---|
| 91 |  .F  S DATE=$O(ECXLOC(DATE)) Q:DATE=""  S TRT=$O(ECXLOC(DATE,0)),REC=$O(ECXLOC(DATE,TRT,0)) D  Q:OUT=1
 | 
|---|
| 92 |  ..S PRV=$P(ECXLOC(DATE,TRT,REC),U,2)
 | 
|---|
| 93 |  ..;if no change in primary provider, then keep ecxlosp=null
 | 
|---|
| 94 |  ..I PRV'="",PRV=ECXPRVN S OUT=1
 | 
|---|
| 95 |  ..I PRV'="",PRV'=ECXPRVN D
 | 
|---|
| 96 |  ...;reset ecxprvl to send back to caller and calculate los
 | 
|---|
| 97 |  ...S OUT=1,ECXPRVL=PRV,DATE3=DATE
 | 
|---|
| 98 |  ...S X1=99999999.9999999-ECXDATE1,X2=9999999.9999999-DATE3 D ^%DTC
 | 
|---|
| 99 |  ...S ECXLOSP=X
 | 
|---|
| 100 |  ;it is possible that ecxprvl and ecxlosp will still be null
 | 
|---|
| 101 |  S:ECXLOSP>9999 ECXLOSP=9999
 | 
|---|
| 102 |  Q
 | 
|---|