ECXTRT1 ;ALB/JAP Treating Specialty Change Extract (cont) ; July 22, 1998
 ;;3.0;DSS EXTRACTS;**8**;Dec 22, 1997
 ;
PREVTRT(ECXLOC,ECXDATE1,ECXDATE2,ECXTRTL,ECXLOS) ;find the date on which the change to the losing treat. spec. occurred
 ;   input
 ;   ECXLOC   = local array built from ATS index on file #405 (passed by reference); required
 ;   ECXDATE1 = inverse date of current (new) ts movement; required)
 ;   ECXDATE2 = inverse date of previous (losing) ts movement; required
 ;   ECXTRTL  = pointer value to file #45.7 for previous facility 
 ;              treating specialty; required
 ;   output
 ;   ECXLOS  = patients length of stay on previous (losing) ts (passed by reference)
 ;
 N DATE,DATE3,X,X1,X2
 S DATE=ECXDATE2,DATE3="",ECXLOS=0
 F  S DATE=$O(ECXLOC(DATE)) Q:DATE=""  S TRT=$O(ECXLOC(DATE,0)) Q:TRT'=ECXTRTL
 ;if date=null, then get immediately previous date by reverse $o
 ;if date=null, this gets the last date in ecxloc array, i.e., the admission ts movement
 S DATE3=$O(ECXLOC(DATE),-1)
 S X1=9999999.9999999-ECXDATE1,X2=9999999.9999999-DATE3 D ^%DTC
 S ECXLOS=X S:ECXLOS>9999 ECXLOS=9999
 Q
 ;
PREVATT(ECXLOC,ECXDATE1,ECXATTN,ECXDATE2,ECXATTL,ECXLOS) ;find the date on which the change to the losing attending occurred
 ;   input
 ;   ECXLOC   = local array built from ATS index on file #405 (passed by reference); required
 ;   ECXDATE1 = inverse date of current (new) attending; required)
 ;   ECXATTN  = specifier for current (new) attending; required
 ;   ECXDATE2 = inverse date of previous (losing) attending; required
 ;   ECXATTL  = specifier for previous (losing) attending (passed by reference); required
 ;   output
 ;   ECXLOSA  = patients length of stay with previous (losing) attending (passed by reference)
 ;
 N DATE,DATE3,X,X1,X2,TRT,REC,ATT,OUT
 S (DATE,DATE3)=ECXDATE2,ECXLOSA="",OUT=0
 I ECXATTL'="" D
 .F  S DATE=$O(ECXLOC(DATE)) Q:DATE=""  S TRT=$O(ECXLOC(DATE,0)),REC=$O(ECXLOC(DATE,TRT,0)) D  Q:OUT=1
 ..S ATT=$P(ECXLOC(DATE,TRT,REC),U,3)
 ..;if provider is changed, then quit without resetting date3, and quit loop
 ..I ATT'="",ATT'=ECXATTL S OUT=1
 ..;there's probably always data on attending, so this may not be needed;
 ..;but if att=null, then dont know if provider in ecxattl was attending or not, so don't reset date3;
 ..;reset date3 only if know for sure
 ..I ATT=ECXATTL S DATE3=DATE
 .;so date3 is earliest known date for attending specified in ecxattl
 .S X1=9999999.9999999-ECXDATE1,X2=9999999.9999999-DATE3 D ^%DTC
 .S ECXLOSA=X
 ;theres probably always data on attending, so this may not be needed;
 ;but if ecxattl is null, then need to find valid previous attending
 I ECXATTL="" D
 .;ecxattn will also be null if evaluating discharge movements
 .F  S DATE=$O(ECXLOC(DATE)) Q:DATE=""  S TRT=$O(ECXLOC(DATE,0)),REC=$O(ECXLOC(DATE,TRT,0)) D  Q:OUT=1
 ..S ATT=$P(ECXLOC(DATE,TRT,REC),U,3)
 ..;if no change in attending, then keep ecxlosa=null
 ..I ATT'="",ATT=ECXATTN S OUT=1
 ..I ATT'="",ATT'=ECXATTN D
 ...;reset ecxattl to send back to caller and calculate los
 ...S OUT=1,ECXATTL=ATT,DATE3=DATE
 ...S X1=99999999.9999999-ECXDATE1,X2=9999999.9999999-DATE3 D ^%DTC
 ...S ECXLOSA=X
 ;it is possible that ecxattl and ecxlosa will still be null
 S:ECXLOSA>9999 ECXLOSA=9999
 Q
 ;
PREVPRV(ECXLOC,ECXDATE1,ECXPRVN,ECXDATE2,ECXPRVL,ECXLOS) ;find the date on which the change to the losing primary provider occurred
 ;   input
 ;   ECXLOC   = local array built from ATS index on file #405 (passed by reference); required
 ;   ECXDATE1 = inverse date of current (new) primary provider; required)
 ;   ECXPRVN  = specifier for current (new) primary provider; required
 ;   ECXDATE2 = inverse date of previous (losing) primary provider; required
 ;   ECXPRVL  = specifier for previous (losing) primary provider 9passed by reference); required
 ;   output
 ;   ECXLOSP  = patients length of stay with previous (losing) primary provider (passed by reference)
 ;
 N DATE,DATE3,X,X1,X2,TRT,REC,PRV,OUT
 S (DATE,DATE3)=ECXDATE2,ECXLOSP="",OUT=0
 I ECXPRVL'="" D
 .F  S DATE=$O(ECXLOC(DATE)) Q:DATE=""  S TRT=$O(ECXLOC(DATE,0)),REC=$O(ECXLOC(DATE,TRT,0)) D  Q:OUT=1
 ..S PRV=$P(ECXLOC(DATE,TRT,REC),U,2)
 ..;if provider is changed, then quit without resetting date3, and quit loop
 ..I PRV'="",PRV'=ECXPRVL S OUT=1
 ..;if prv=null, then don't know if provider in ecxprvl was patient's provider or not, so don't reset date3;
 ..;reset date3 only if know for sure
 ..I PRV=ECXPRVL S DATE3=DATE
 .;so date3 is earliest known date for attending specified in ecxattl
 .S X1=9999999.9999999-ECXDATE1,X2=9999999.9999999-DATE3 D ^%DTC
 .S ECXLOSP=X
 ;if ecxprvl is null, then need to find valid previous primary provider
 I ECXPRVL="" D
 .;ecxprvn will also be null if evaluating discharge movements
 .F  S DATE=$O(ECXLOC(DATE)) Q:DATE=""  S TRT=$O(ECXLOC(DATE,0)),REC=$O(ECXLOC(DATE,TRT,0)) D  Q:OUT=1
 ..S PRV=$P(ECXLOC(DATE,TRT,REC),U,2)
 ..;if no change in primary provider, then keep ecxlosp=null
 ..I PRV'="",PRV=ECXPRVN S OUT=1
 ..I PRV'="",PRV'=ECXPRVN D
 ...;reset ecxprvl to send back to caller and calculate los
 ...S OUT=1,ECXPRVL=PRV,DATE3=DATE
 ...S X1=99999999.9999999-ECXDATE1,X2=9999999.9999999-DATE3 D ^%DTC
 ...S ECXLOSP=X
 ;it is possible that ecxprvl and ecxlosp will still be null
 S:ECXLOSP>9999 ECXLOSP=9999
 Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HECXTRT1   5381     printed  Sep 23, 2025@19:30:13                                                                                                                                                                                                     Page 2
ECXTRT1   ;ALB/JAP Treating Specialty Change Extract (cont) ; July 22, 1998
 +1       ;;3.0;DSS EXTRACTS;**8**;Dec 22, 1997
 +2       ;
PREVTRT(ECXLOC,ECXDATE1,ECXDATE2,ECXTRTL,ECXLOS) ;find the date on which the change to the losing treat. spec. occurred
 +1       ;   input
 +2       ;   ECXLOC   = local array built from ATS index on file #405 (passed by reference); required
 +3       ;   ECXDATE1 = inverse date of current (new) ts movement; required)
 +4       ;   ECXDATE2 = inverse date of previous (losing) ts movement; required
 +5       ;   ECXTRTL  = pointer value to file #45.7 for previous facility 
 +6       ;              treating specialty; required
 +7       ;   output
 +8       ;   ECXLOS  = patients length of stay on previous (losing) ts (passed by reference)
 +9       ;
 +10       NEW DATE,DATE3,X,X1,X2
 +11       SET DATE=ECXDATE2
           SET DATE3=""
           SET ECXLOS=0
 +12       FOR 
               SET DATE=$ORDER(ECXLOC(DATE))
               if DATE=""
                   QUIT 
               SET TRT=$ORDER(ECXLOC(DATE,0))
               if TRT'=ECXTRTL
                   QUIT 
 +13      ;if date=null, then get immediately previous date by reverse $o
 +14      ;if date=null, this gets the last date in ecxloc array, i.e., the admission ts movement
 +15       SET DATE3=$ORDER(ECXLOC(DATE),-1)
 +16       SET X1=9999999.9999999-ECXDATE1
           SET X2=9999999.9999999-DATE3
           DO ^%DTC
 +17       SET ECXLOS=X
           if ECXLOS>9999
               SET ECXLOS=9999
 +18       QUIT 
 +19      ;
PREVATT(ECXLOC,ECXDATE1,ECXATTN,ECXDATE2,ECXATTL,ECXLOS) ;find the date on which the change to the losing attending occurred
 +1       ;   input
 +2       ;   ECXLOC   = local array built from ATS index on file #405 (passed by reference); required
 +3       ;   ECXDATE1 = inverse date of current (new) attending; required)
 +4       ;   ECXATTN  = specifier for current (new) attending; required
 +5       ;   ECXDATE2 = inverse date of previous (losing) attending; required
 +6       ;   ECXATTL  = specifier for previous (losing) attending (passed by reference); required
 +7       ;   output
 +8       ;   ECXLOSA  = patients length of stay with previous (losing) attending (passed by reference)
 +9       ;
 +10       NEW DATE,DATE3,X,X1,X2,TRT,REC,ATT,OUT
 +11       SET (DATE,DATE3)=ECXDATE2
           SET ECXLOSA=""
           SET OUT=0
 +12       IF ECXATTL'=""
               Begin DoDot:1
 +13               FOR 
                       SET DATE=$ORDER(ECXLOC(DATE))
                       if DATE=""
                           QUIT 
                       SET TRT=$ORDER(ECXLOC(DATE,0))
                       SET REC=$ORDER(ECXLOC(DATE,TRT,0))
                       Begin DoDot:2
 +14                       SET ATT=$PIECE(ECXLOC(DATE,TRT,REC),U,3)
 +15      ;if provider is changed, then quit without resetting date3, and quit loop
 +16                       IF ATT'=""
                               IF ATT'=ECXATTL
                                   SET OUT=1
 +17      ;there's probably always data on attending, so this may not be needed;
 +18      ;but if att=null, then dont know if provider in ecxattl was attending or not, so don't reset date3;
 +19      ;reset date3 only if know for sure
 +20                       IF ATT=ECXATTL
                               SET DATE3=DATE
                       End DoDot:2
                       if OUT=1
                           QUIT 
 +21      ;so date3 is earliest known date for attending specified in ecxattl
 +22               SET X1=9999999.9999999-ECXDATE1
                   SET X2=9999999.9999999-DATE3
                   DO ^%DTC
 +23               SET ECXLOSA=X
               End DoDot:1
 +24      ;theres probably always data on attending, so this may not be needed;
 +25      ;but if ecxattl is null, then need to find valid previous attending
 +26       IF ECXATTL=""
               Begin DoDot:1
 +27      ;ecxattn will also be null if evaluating discharge movements
 +28               FOR 
                       SET DATE=$ORDER(ECXLOC(DATE))
                       if DATE=""
                           QUIT 
                       SET TRT=$ORDER(ECXLOC(DATE,0))
                       SET REC=$ORDER(ECXLOC(DATE,TRT,0))
                       Begin DoDot:2
 +29                       SET ATT=$PIECE(ECXLOC(DATE,TRT,REC),U,3)
 +30      ;if no change in attending, then keep ecxlosa=null
 +31                       IF ATT'=""
                               IF ATT=ECXATTN
                                   SET OUT=1
 +32                       IF ATT'=""
                               IF ATT'=ECXATTN
                                   Begin DoDot:3
 +33      ;reset ecxattl to send back to caller and calculate los
 +34                                   SET OUT=1
                                       SET ECXATTL=ATT
                                       SET DATE3=DATE
 +35                                   SET X1=99999999.9999999-ECXDATE1
                                       SET X2=9999999.9999999-DATE3
                                       DO ^%DTC
 +36                                   SET ECXLOSA=X
                                   End DoDot:3
                       End DoDot:2
                       if OUT=1
                           QUIT 
               End DoDot:1
 +37      ;it is possible that ecxattl and ecxlosa will still be null
 +38       if ECXLOSA>9999
               SET ECXLOSA=9999
 +39       QUIT 
 +40      ;
PREVPRV(ECXLOC,ECXDATE1,ECXPRVN,ECXDATE2,ECXPRVL,ECXLOS) ;find the date on which the change to the losing primary provider occurred
 +1       ;   input
 +2       ;   ECXLOC   = local array built from ATS index on file #405 (passed by reference); required
 +3       ;   ECXDATE1 = inverse date of current (new) primary provider; required)
 +4       ;   ECXPRVN  = specifier for current (new) primary provider; required
 +5       ;   ECXDATE2 = inverse date of previous (losing) primary provider; required
 +6       ;   ECXPRVL  = specifier for previous (losing) primary provider 9passed by reference); required
 +7       ;   output
 +8       ;   ECXLOSP  = patients length of stay with previous (losing) primary provider (passed by reference)
 +9       ;
 +10       NEW DATE,DATE3,X,X1,X2,TRT,REC,PRV,OUT
 +11       SET (DATE,DATE3)=ECXDATE2
           SET ECXLOSP=""
           SET OUT=0
 +12       IF ECXPRVL'=""
               Begin DoDot:1
 +13               FOR 
                       SET DATE=$ORDER(ECXLOC(DATE))
                       if DATE=""
                           QUIT 
                       SET TRT=$ORDER(ECXLOC(DATE,0))
                       SET REC=$ORDER(ECXLOC(DATE,TRT,0))
                       Begin DoDot:2
 +14                       SET PRV=$PIECE(ECXLOC(DATE,TRT,REC),U,2)
 +15      ;if provider is changed, then quit without resetting date3, and quit loop
 +16                       IF PRV'=""
                               IF PRV'=ECXPRVL
                                   SET OUT=1
 +17      ;if prv=null, then don't know if provider in ecxprvl was patient's provider or not, so don't reset date3;
 +18      ;reset date3 only if know for sure
 +19                       IF PRV=ECXPRVL
                               SET DATE3=DATE
                       End DoDot:2
                       if OUT=1
                           QUIT 
 +20      ;so date3 is earliest known date for attending specified in ecxattl
 +21               SET X1=9999999.9999999-ECXDATE1
                   SET X2=9999999.9999999-DATE3
                   DO ^%DTC
 +22               SET ECXLOSP=X
               End DoDot:1
 +23      ;if ecxprvl is null, then need to find valid previous primary provider
 +24       IF ECXPRVL=""
               Begin DoDot:1
 +25      ;ecxprvn will also be null if evaluating discharge movements
 +26               FOR 
                       SET DATE=$ORDER(ECXLOC(DATE))
                       if DATE=""
                           QUIT 
                       SET TRT=$ORDER(ECXLOC(DATE,0))
                       SET REC=$ORDER(ECXLOC(DATE,TRT,0))
                       Begin DoDot:2
 +27                       SET PRV=$PIECE(ECXLOC(DATE,TRT,REC),U,2)
 +28      ;if no change in primary provider, then keep ecxlosp=null
 +29                       IF PRV'=""
                               IF PRV=ECXPRVN
                                   SET OUT=1
 +30                       IF PRV'=""
                               IF PRV'=ECXPRVN
                                   Begin DoDot:3
 +31      ;reset ecxprvl to send back to caller and calculate los
 +32                                   SET OUT=1
                                       SET ECXPRVL=PRV
                                       SET DATE3=DATE
 +33                                   SET X1=99999999.9999999-ECXDATE1
                                       SET X2=9999999.9999999-DATE3
                                       DO ^%DTC
 +34                                   SET ECXLOSP=X
                                   End DoDot:3
                       End DoDot:2
                       if OUT=1
                           QUIT 
               End DoDot:1
 +35      ;it is possible that ecxprvl and ecxlosp will still be null
 +36       if ECXLOSP>9999
               SET ECXLOSP=9999
 +37       QUIT