- LRPXCHK ;SLC/STAFF - Lab PXRMINDX Index Validation ;3/30/04 12:01
- ;;5.2;LAB SERVICE;**295,445**;Sep 27, 1994;Build 6
- ;
- PATS ; select patients for index check
- N DFN,ERR,REPAIR
- D CLEAN
- F D GETPT^LRPXAPPU(.DFN,.ERR) Q:ERR D
- . S ^TMP("LRLOG PATS",$J,DFN)=""
- D
- . I '$O(^TMP("LRLOG PATS",$J,0)) Q
- . D GETREP(.REPAIR,.ERR) I ERR Q
- . D CHECK(REPAIR)
- D CLEAN
- Q
- ;
- DATES ; check indexes for a date range of patient collections
- N CNT,DATE1,DATE2,DFN,LRDFN,LRIDT,OK,REPAIR,START,STOP,SUB
- D CLEAN
- D GETDATE^LRPXAPPU(.DATE1,.DATE2,.ERR) I ERR Q
- D GETREP(.REPAIR,.ERR) I ERR Q
- S STOP=$$LRIDT^LRPXAPIU(DATE1)
- S START=$$LRIDT^LRPXAPIU(DATE2)
- S CNT=0
- S LRDFN=0
- F S LRDFN=$O(^LR(LRDFN)) Q:LRDFN<1 D
- . S OK=0
- . F SUB="CH","MI","CY","SP","EM" D Q:OK
- .. S LRIDT=START
- .. F S LRIDT=$O(^LR(LRDFN,SUB,LRIDT)) Q:LRIDT<1 Q:LRIDT>STOP D Q:OK
- ... S DFN=$$DFN^LRPXAPIU(LRDFN)
- ... I 'DFN Q
- ... S ^TMP("LRLOG PATS",$J,DFN)=""
- ... S OK=1,CNT=CNT+1
- W !,CNT," Patients to check"
- D CHECK(REPAIR)
- D CLEAN
- Q
- ;
- CHECK(REPAIR) ;
- N CNT,DFN
- S REPAIR=$G(REPAIR)
- S DFN=0
- F S DFN=$O(^TMP("LRLOG PATS",$J,DFN)) Q:DFN<1 D
- . W !,"DFN: ",DFN," LRDFN: ",$$LRDFN^LRPXAPIU(DFN)
- . D CHKPAT(DFN)
- S CNT=0
- S DFN=0
- F S DFN=$O(^TMP("LRLOG",$J,DFN)) Q:DFN<1 D
- . S CNT=CNT+1
- I 'CNT W !,"Indexes were valid" Q
- W !,CNT," Patients with invalid indexes"
- I REPAIR D REPAIR
- Q
- ;
- ALL ; check all patient indexes
- ; this takes a very long time
- ; to be used in small test accounts
- ; START and STOP determine range of DFNs to check
- Q ; for testing
- N DFN,ERR,REPAIR,START,STOP
- D CLEAN
- W !,"WARNING - checking ALL patients",!
- D GETREP(.REPAIR,.ERR) I ERR Q
- S START=1
- S STOP=10000000000000
- S DFN=START-.1
- F S DFN=$O(^DPT(DFN)) Q:DFN<1 Q:DFN>STOP D
- . W !,"DFN: ",DFN," LRDFN: ",$$LRDFN^LRPXAPIU(DFN)
- . D CHKPAT(DFN)
- I REPAIR D REPAIR
- D CLEAN
- Q
- ;
- CHKPAT(DFN) ; from LRLOG
- ; find bad nodes,
- ; store as ^TMP("LRLOG",$J,DFN,DATE,ITEM,INDEX)=NODE
- ; only when ^TMP("LRLOG PATS",$J) is present
- ; if ^TMP("LRLOG PATS",$J) is not present, write to screen
- N ITEM,LRDFN
- K ^TMP("LRPXCHK",$J)
- S LRDFN=$$LRDFN^LRPXAPIU(DFN)
- I 'LRDFN Q
- M ^TMP("LRPXCHK",$J,"LR",LRDFN)=^LR(LRDFN)
- M ^TMP("LRPXCHK",$J,"PI",DFN)=^PXRMINDX(63,"PI",DFN)
- M ^TMP("LRPXCHK",$J,"PDI",DFN)=^PXRMINDX(63,"PDI",DFN)
- S ITEM=""
- F S ITEM=$O(^PXRMINDX(63,"IP",ITEM)) Q:ITEM="" D
- . I $D(^PXRMINDX(63,"IP",ITEM,DFN)) D
- . M ^TMP("LRPXCHK",$J,"IP",ITEM,DFN)=^PXRMINDX(63,"IP",ITEM,DFN)
- D INTEG(DFN)
- D CHKLR(DFN)
- D CHKPI(DFN,LRDFN)
- K ^TMP("LRPXCHK",$J)
- Q
- ;
- INTEG(DFN) ; make sure "PI", "IP", and "PDI" are consistent
- N DATE,ITEM,NODE
- S DATE=0
- F S DATE=$O(^TMP("LRPXCHK",$J,"PDI",DFN,DATE)) Q:DATE<1 D
- . S ITEM="A"
- . F S ITEM=$O(^TMP("LRPXCHK",$J,"PDI",DFN,DATE,ITEM)) Q:ITEM="" D
- .. S NODE=""
- .. F S NODE=$O(^TMP("LRPXCHK",$J,"PDI",DFN,DATE,ITEM,NODE)) Q:NODE="" D
- ... I '$D(^TMP("LRPXCHK",$J,"PI",DFN,ITEM,DATE,NODE)) D
- .... D BAD("PDI-PI",DFN,ITEM,DATE,NODE)
- ... I '$D(^TMP("LRPXCHK",$J,"IP",ITEM,DFN,DATE,NODE)) D
- .... D BAD("PDI-IP",DFN,ITEM,DATE,NODE)
- S ITEM=""
- F S ITEM=$O(^TMP("LRPXCHK",$J,"PI",DFN,ITEM)) Q:ITEM="" D
- . S DATE=0
- . F S DATE=$O(^TMP("LRPXCHK",$J,"PI",DFN,ITEM,DATE)) Q:DATE<1 D
- .. S NODE=""
- .. F S NODE=$O(^TMP("LRPXCHK",$J,"PI",DFN,ITEM,DATE,NODE)) Q:NODE="" D
- ... I '$D(^TMP("LRPXCHK",$J,"IP",ITEM,DFN,DATE,NODE)) D
- .... D BAD("PI-IP",DFN,ITEM,DATE,NODE)
- ... I 'ITEM,'$D(^TMP("LRPXCHK",$J,"PDI",DFN,DATE,ITEM,NODE)) D
- .... D BAD("PI-PDI",DFN,ITEM,DATE,NODE)
- S ITEM=""
- F S ITEM=$O(^TMP("LRPXCHK",$J,"IP",ITEM)) Q:ITEM="" D
- . S DATE=0
- . F S DATE=$O(^TMP("LRPXCHK",$J,"IP",ITEM,DFN,DATE)) Q:DATE<1 D
- .. S NODE=""
- .. F S NODE=$O(^TMP("LRPXCHK",$J,"IP",ITEM,DFN,DATE,NODE)) Q:NODE="" D
- ... I '$D(^TMP("LRPXCHK",$J,"PI",DFN,ITEM,DATE,NODE)) D
- .... D BAD("IP-PI",DFN,ITEM,DATE,NODE)
- ... I 'ITEM,'$D(^TMP("LRPXCHK",$J,"PDI",DFN,DATE,ITEM,NODE)) D
- .... D BAD("IP-PDI",DFN,ITEM,DATE,NODE)
- Q
- ;
- CHKLR(DFN) ; go thru "PI" to make sure ^LR is consistent
- N DATE,ITEM,NODE
- S ITEM=""
- F S ITEM=$O(^TMP("LRPXCHK",$J,"PI",DFN,ITEM)) Q:ITEM="" D
- . S DATE=0
- . F S DATE=$O(^TMP("LRPXCHK",$J,"PI",DFN,ITEM,DATE)) Q:DATE<1 D
- .. S NODE=""
- .. F S NODE=$O(^TMP("LRPXCHK",$J,"PI",DFN,ITEM,DATE,NODE)) Q:NODE="" D
- ... I '$$REFVAL(NODE) D BAD("LR",DFN,ITEM,DATE,NODE) Q
- Q
- ;
- CHKPI(DFN,LRDFN) ; go thru ^LR to make sure "PI" is consistent
- N DATE,ITEM,LRIDT,LRDN,NODE,ZERO
- S LRIDT=0
- F S LRIDT=$O(^TMP("LRPXCHK",$J,"LR",LRDFN,"CH",LRIDT)) Q:LRIDT<1 D
- . S ZERO=$G(^TMP("LRPXCHK",$J,"LR",LRDFN,"CH",LRIDT,0))
- . S DATE=+ZERO I 'DATE Q
- . I '$P(ZERO,U,3) Q
- . S LRDN=1
- . F S LRDN=$O(^TMP("LRPXCHK",$J,"LR",LRDFN,"CH",LRIDT,LRDN)) Q:LRDN<1 D
- .. S ITEM=$$TEST^LRPXAPIU(LRDN)
- .. I 'ITEM Q
- .. S NODE=LRDFN_";CH;"_LRIDT_";"_LRDN
- .. I '$D(^PXRMINDX(63,"PI",DFN,ITEM,DATE,NODE)) D BAD("CH",DFN,ITEM,DATE,NODE)
- D MI^LRPXCHKM(DFN,LRDFN)
- D AP^LRPXCHKA(DFN,LRDFN)
- Q
- ;
- TMPCHK(DFN,DATE,ITEM,NODE) ;
- I '$D(^PXRMINDX(63,"PI",DFN,ITEM,DATE,NODE)) D BAD(NODE,DFN,ITEM,DATE,NODE)
- Q
- ;
- BAD(INDEX,DFN,ITEM,DATE,NODE) ; write error to screen, collect in global
- W !,?5,INDEX," ",DFN," ",ITEM," ",DATE," ",NODE
- S ^TMP("LRLOG",$J,DFN,DATE,ITEM,INDEX)=NODE
- Q
- ;
- CLEAN ; clear tmp globals
- ; "LRLOG" collects invalid nodes, "LRLOG PATS" are patients checked
- K ^TMP("LRLOG",$J)
- K ^TMP("LRLOG PATS",$J)
- Q
- ;
- REFVAL(REF) ; $$(reference location in ^LR) -> if ref exists 1, else 0
- N SUB
- I REF'[";" Q ""
- S SUB=$P(REF,";",2)
- S SUB=""""_SUB_""""
- S $P(REF,";",2)=SUB
- S REF=$TR(REF,";",",")
- S REF="^LR("_REF_")"
- I $D(@REF) Q 1
- Q 0
- ;
- REPAIR ; correct invalid indexes
- ; kill off bad indexes
- ; reset all indexes at date of bad index
- N DATE,DFN,DOD,INDEX,ITEM,NODE,REPAIR K REPAIR
- S DFN=0
- F S DFN=$O(^TMP("LRLOG",$J,DFN)) Q:DFN<1 D
- . S LRDFN=$$LRDFN^LRPXAPIU(DFN)
- . S DOD=$$DOD^LRPXAPIU(DFN)
- . S DATE=0
- . F S DATE=$O(^TMP("LRLOG",$J,DFN,DATE)) Q:DATE<1 D
- .. S LRIDT=$$LRIDT^LRPXAPIU(DATE)
- .. K REPAIR
- .. S ITEM=""
- .. F S ITEM=$O(^TMP("LRLOG",$J,DFN,DATE,ITEM)) Q:ITEM="" D
- ... S INDEX=""
- ... F S INDEX=$O(^TMP("LRLOG",$J,DFN,DATE,ITEM,INDEX)) Q:INDEX="" D
- .... S NODE=^TMP("LRLOG",$J,DFN,DATE,ITEM,INDEX)
- .... I '$L(NODE) Q
- .... S REPAIR($P(NODE,";",2))=""
- .... D KLAB^LRPX(DFN,DATE,ITEM,NODE)
- .. S SUB=""
- .. F S SUB=$O(REPAIR(SUB)) Q:SUB="" D
- ... I SUB="CH" D CH(DFN,LRDFN,DATE,LRIDT) Q
- ... I SUB="MI" D MICRO(DFN,LRDFN,DATE,LRIDT) Q
- ... D AP(DFN,LRDFN,DATE,LRIDT,SUB)
- .. I DATE=DOD D AU(DFN,LRDFN,DATE) Q
- Q
- ;
- CH(DFN,LRDFN,DATE,LRIDT) ;
- N DAT,LRDN,NODE,TEMP,TEST
- I '$$VERIFIED^LRPXAPI(LRDFN,LRIDT) Q
- S DAT=LRDFN_";CH;"_LRIDT
- S LRDN=1
- F S LRDN=$O(^LR(LRDFN,"CH",LRIDT,LRDN)) Q:LRDN<1 D
- . S NODE=DAT_";"_LRDN
- . S TEMP=^LR(LRDFN,"CH",LRIDT,LRDN)
- . S TEST=+$P($P(TEMP,U,3),"!",7)
- . I 'TEST S TEST=$$TEST^LRPXAPIU(LRDN)
- . I 'TEST Q
- . D SLAB^LRPX(DFN,DATE,TEST,NODE)
- Q
- ;
- MICRO(DFN,LRDFN,DATE,LRIDT) ;
- K ^TMP("LRPX",$J)
- M ^TMP("LRPX",$J,"AR")=^LR(LRDFN,"MI",LRIDT)
- M ^TMP("LRPX",$J,"B")=^PXRMINDX(63,"PDI",DFN,DATE)
- D MICRO^LRPXRM(DFN,LRDFN,DATE,LRIDT)
- K ^TMP("LRPX",$J)
- Q
- ;
- AP(DFN,LRDFN,DATE,LRIDT,SUB) ;
- K ^TMP("LRPX",$J)
- M ^TMP("LRPX",$J,"AR")=^LR(LRDFN,SUB,LRIDT)
- M ^TMP("LRPX",$J,"B")=^PXRMINDX(63,"PDI",DFN,DATE)
- D AP^LRPXRM(DFN,LRDFN,DATE,LRIDT,SUB)
- K ^TMP("LRPX",$J)
- Q
- ;
- AU(DFN,LRDFN,DATE) ;
- I '+$G(^LR(LRDFN,"AU")) Q
- I '($P(^LR(LRDFN,"AU"),U,3)&($P(^("AU"),U,15))) Q
- K ^TMP("LRPX",$J)
- M ^TMP("LRPX",$J,"AR","AY")=^LR(LRDFN,"AY")
- M ^TMP("LRPX",$J,"AR",80)=^LR(LRDFN,80)
- M ^TMP("LRPX",$J,"AR",33)=^LR(LRDFN,33)
- M ^TMP("LRPX",$J,"B")=^PXRMINDX(63,"PDI",DFN,DATE)
- D AUTOPSY^LRPXRM(LRDFN)
- K ^TMP("LRPX",$J)
- Q
- ;
- GETREP(REPAIR,ERR) ;
- ; asks to repair indexes
- N DIR,DIRUT,DTOUT,X,Y K DIR
- S ERR=0,REPAIR=""
- S DIR(0)="YAO"
- S DIR("A")="Repair invalid indexes? "
- S DIR("B")="YES"
- D ^DIR K DIR
- I Y[U!$D(DTOUT) S ERR=1 Q
- S REPAIR=Y
- W !
- Q
- ;
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HLRPXCHK 8112 printed Mar 13, 2025@21:24:07 Page 2
- LRPXCHK ;SLC/STAFF - Lab PXRMINDX Index Validation ;3/30/04 12:01
- +1 ;;5.2;LAB SERVICE;**295,445**;Sep 27, 1994;Build 6
- +2 ;
- PATS ; select patients for index check
- +1 NEW DFN,ERR,REPAIR
- +2 DO CLEAN
- +3 FOR
- DO GETPT^LRPXAPPU(.DFN,.ERR)
- if ERR
- QUIT
- Begin DoDot:1
- +4 SET ^TMP("LRLOG PATS",$JOB,DFN)=""
- End DoDot:1
- +5 Begin DoDot:1
- +6 IF '$ORDER(^TMP("LRLOG PATS",$JOB,0))
- QUIT
- +7 DO GETREP(.REPAIR,.ERR)
- IF ERR
- QUIT
- +8 DO CHECK(REPAIR)
- End DoDot:1
- +9 DO CLEAN
- +10 QUIT
- +11 ;
- DATES ; check indexes for a date range of patient collections
- +1 NEW CNT,DATE1,DATE2,DFN,LRDFN,LRIDT,OK,REPAIR,START,STOP,SUB
- +2 DO CLEAN
- +3 DO GETDATE^LRPXAPPU(.DATE1,.DATE2,.ERR)
- IF ERR
- QUIT
- +4 DO GETREP(.REPAIR,.ERR)
- IF ERR
- QUIT
- +5 SET STOP=$$LRIDT^LRPXAPIU(DATE1)
- +6 SET START=$$LRIDT^LRPXAPIU(DATE2)
- +7 SET CNT=0
- +8 SET LRDFN=0
- +9 FOR
- SET LRDFN=$ORDER(^LR(LRDFN))
- if LRDFN<1
- QUIT
- Begin DoDot:1
- +10 SET OK=0
- +11 FOR SUB="CH","MI","CY","SP","EM"
- Begin DoDot:2
- +12 SET LRIDT=START
- +13 FOR
- SET LRIDT=$ORDER(^LR(LRDFN,SUB,LRIDT))
- if LRIDT<1
- QUIT
- if LRIDT>STOP
- QUIT
- Begin DoDot:3
- +14 SET DFN=$$DFN^LRPXAPIU(LRDFN)
- +15 IF 'DFN
- QUIT
- +16 SET ^TMP("LRLOG PATS",$JOB,DFN)=""
- +17 SET OK=1
- SET CNT=CNT+1
- End DoDot:3
- if OK
- QUIT
- End DoDot:2
- if OK
- QUIT
- End DoDot:1
- +18 WRITE !,CNT," Patients to check"
- +19 DO CHECK(REPAIR)
- +20 DO CLEAN
- +21 QUIT
- +22 ;
- CHECK(REPAIR) ;
- +1 NEW CNT,DFN
- +2 SET REPAIR=$GET(REPAIR)
- +3 SET DFN=0
- +4 FOR
- SET DFN=$ORDER(^TMP("LRLOG PATS",$JOB,DFN))
- if DFN<1
- QUIT
- Begin DoDot:1
- +5 WRITE !,"DFN: ",DFN," LRDFN: ",$$LRDFN^LRPXAPIU(DFN)
- +6 DO CHKPAT(DFN)
- End DoDot:1
- +7 SET CNT=0
- +8 SET DFN=0
- +9 FOR
- SET DFN=$ORDER(^TMP("LRLOG",$JOB,DFN))
- if DFN<1
- QUIT
- Begin DoDot:1
- +10 SET CNT=CNT+1
- End DoDot:1
- +11 IF 'CNT
- WRITE !,"Indexes were valid"
- QUIT
- +12 WRITE !,CNT," Patients with invalid indexes"
- +13 IF REPAIR
- DO REPAIR
- +14 QUIT
- +15 ;
- ALL ; check all patient indexes
- +1 ; this takes a very long time
- +2 ; to be used in small test accounts
- +3 ; START and STOP determine range of DFNs to check
- +4 ; for testing
- QUIT
- +5 NEW DFN,ERR,REPAIR,START,STOP
- +6 DO CLEAN
- +7 WRITE !,"WARNING - checking ALL patients",!
- +8 DO GETREP(.REPAIR,.ERR)
- IF ERR
- QUIT
- +9 SET START=1
- +10 SET STOP=10000000000000
- +11 SET DFN=START-.1
- +12 FOR
- SET DFN=$ORDER(^DPT(DFN))
- if DFN<1
- QUIT
- if DFN>STOP
- QUIT
- Begin DoDot:1
- +13 WRITE !,"DFN: ",DFN," LRDFN: ",$$LRDFN^LRPXAPIU(DFN)
- +14 DO CHKPAT(DFN)
- End DoDot:1
- +15 IF REPAIR
- DO REPAIR
- +16 DO CLEAN
- +17 QUIT
- +18 ;
- CHKPAT(DFN) ; from LRLOG
- +1 ; find bad nodes,
- +2 ; store as ^TMP("LRLOG",$J,DFN,DATE,ITEM,INDEX)=NODE
- +3 ; only when ^TMP("LRLOG PATS",$J) is present
- +4 ; if ^TMP("LRLOG PATS",$J) is not present, write to screen
- +5 NEW ITEM,LRDFN
- +6 KILL ^TMP("LRPXCHK",$JOB)
- +7 SET LRDFN=$$LRDFN^LRPXAPIU(DFN)
- +8 IF 'LRDFN
- QUIT
- +9 MERGE ^TMP("LRPXCHK",$JOB,"LR",LRDFN)=^LR(LRDFN)
- +10 MERGE ^TMP("LRPXCHK",$JOB,"PI",DFN)=^PXRMINDX(63,"PI",DFN)
- +11 MERGE ^TMP("LRPXCHK",$JOB,"PDI",DFN)=^PXRMINDX(63,"PDI",DFN)
- +12 SET ITEM=""
- +13 FOR
- SET ITEM=$ORDER(^PXRMINDX(63,"IP",ITEM))
- if ITEM=""
- QUIT
- Begin DoDot:1
- +14 IF $DATA(^PXRMINDX(63,"IP",ITEM,DFN))
- Begin DoDot:2
- End DoDot:2
- +15 MERGE ^TMP("LRPXCHK",$JOB,"IP",ITEM,DFN)=^PXRMINDX(63,"IP",ITEM,DFN)
- End DoDot:1
- +16 DO INTEG(DFN)
- +17 DO CHKLR(DFN)
- +18 DO CHKPI(DFN,LRDFN)
- +19 KILL ^TMP("LRPXCHK",$JOB)
- +20 QUIT
- +21 ;
- INTEG(DFN) ; make sure "PI", "IP", and "PDI" are consistent
- +1 NEW DATE,ITEM,NODE
- +2 SET DATE=0
- +3 FOR
- SET DATE=$ORDER(^TMP("LRPXCHK",$JOB,"PDI",DFN,DATE))
- if DATE<1
- QUIT
- Begin DoDot:1
- +4 SET ITEM="A"
- +5 FOR
- SET ITEM=$ORDER(^TMP("LRPXCHK",$JOB,"PDI",DFN,DATE,ITEM))
- if ITEM=""
- QUIT
- Begin DoDot:2
- +6 SET NODE=""
- +7 FOR
- SET NODE=$ORDER(^TMP("LRPXCHK",$JOB,"PDI",DFN,DATE,ITEM,NODE))
- if NODE=""
- QUIT
- Begin DoDot:3
- +8 IF '$DATA(^TMP("LRPXCHK",$JOB,"PI",DFN,ITEM,DATE,NODE))
- Begin DoDot:4
- +9 DO BAD("PDI-PI",DFN,ITEM,DATE,NODE)
- End DoDot:4
- +10 IF '$DATA(^TMP("LRPXCHK",$JOB,"IP",ITEM,DFN,DATE,NODE))
- Begin DoDot:4
- +11 DO BAD("PDI-IP",DFN,ITEM,DATE,NODE)
- End DoDot:4
- End DoDot:3
- End DoDot:2
- End DoDot:1
- +12 SET ITEM=""
- +13 FOR
- SET ITEM=$ORDER(^TMP("LRPXCHK",$JOB,"PI",DFN,ITEM))
- if ITEM=""
- QUIT
- Begin DoDot:1
- +14 SET DATE=0
- +15 FOR
- SET DATE=$ORDER(^TMP("LRPXCHK",$JOB,"PI",DFN,ITEM,DATE))
- if DATE<1
- QUIT
- Begin DoDot:2
- +16 SET NODE=""
- +17 FOR
- SET NODE=$ORDER(^TMP("LRPXCHK",$JOB,"PI",DFN,ITEM,DATE,NODE))
- if NODE=""
- QUIT
- Begin DoDot:3
- +18 IF '$DATA(^TMP("LRPXCHK",$JOB,"IP",ITEM,DFN,DATE,NODE))
- Begin DoDot:4
- +19 DO BAD("PI-IP",DFN,ITEM,DATE,NODE)
- End DoDot:4
- +20 IF 'ITEM
- IF '$DATA(^TMP("LRPXCHK",$JOB,"PDI",DFN,DATE,ITEM,NODE))
- Begin DoDot:4
- +21 DO BAD("PI-PDI",DFN,ITEM,DATE,NODE)
- End DoDot:4
- End DoDot:3
- End DoDot:2
- End DoDot:1
- +22 SET ITEM=""
- +23 FOR
- SET ITEM=$ORDER(^TMP("LRPXCHK",$JOB,"IP",ITEM))
- if ITEM=""
- QUIT
- Begin DoDot:1
- +24 SET DATE=0
- +25 FOR
- SET DATE=$ORDER(^TMP("LRPXCHK",$JOB,"IP",ITEM,DFN,DATE))
- if DATE<1
- QUIT
- Begin DoDot:2
- +26 SET NODE=""
- +27 FOR
- SET NODE=$ORDER(^TMP("LRPXCHK",$JOB,"IP",ITEM,DFN,DATE,NODE))
- if NODE=""
- QUIT
- Begin DoDot:3
- +28 IF '$DATA(^TMP("LRPXCHK",$JOB,"PI",DFN,ITEM,DATE,NODE))
- Begin DoDot:4
- +29 DO BAD("IP-PI",DFN,ITEM,DATE,NODE)
- End DoDot:4
- +30 IF 'ITEM
- IF '$DATA(^TMP("LRPXCHK",$JOB,"PDI",DFN,DATE,ITEM,NODE))
- Begin DoDot:4
- +31 DO BAD("IP-PDI",DFN,ITEM,DATE,NODE)
- End DoDot:4
- End DoDot:3
- End DoDot:2
- End DoDot:1
- +32 QUIT
- +33 ;
- CHKLR(DFN) ; go thru "PI" to make sure ^LR is consistent
- +1 NEW DATE,ITEM,NODE
- +2 SET ITEM=""
- +3 FOR
- SET ITEM=$ORDER(^TMP("LRPXCHK",$JOB,"PI",DFN,ITEM))
- if ITEM=""
- QUIT
- Begin DoDot:1
- +4 SET DATE=0
- +5 FOR
- SET DATE=$ORDER(^TMP("LRPXCHK",$JOB,"PI",DFN,ITEM,DATE))
- if DATE<1
- QUIT
- Begin DoDot:2
- +6 SET NODE=""
- +7 FOR
- SET NODE=$ORDER(^TMP("LRPXCHK",$JOB,"PI",DFN,ITEM,DATE,NODE))
- if NODE=""
- QUIT
- Begin DoDot:3
- +8 IF '$$REFVAL(NODE)
- DO BAD("LR",DFN,ITEM,DATE,NODE)
- QUIT
- End DoDot:3
- End DoDot:2
- End DoDot:1
- +9 QUIT
- +10 ;
- CHKPI(DFN,LRDFN) ; go thru ^LR to make sure "PI" is consistent
- +1 NEW DATE,ITEM,LRIDT,LRDN,NODE,ZERO
- +2 SET LRIDT=0
- +3 FOR
- SET LRIDT=$ORDER(^TMP("LRPXCHK",$JOB,"LR",LRDFN,"CH",LRIDT))
- if LRIDT<1
- QUIT
- Begin DoDot:1
- +4 SET ZERO=$GET(^TMP("LRPXCHK",$JOB,"LR",LRDFN,"CH",LRIDT,0))
- +5 SET DATE=+ZERO
- IF 'DATE
- QUIT
- +6 IF '$PIECE(ZERO,U,3)
- QUIT
- +7 SET LRDN=1
- +8 FOR
- SET LRDN=$ORDER(^TMP("LRPXCHK",$JOB,"LR",LRDFN,"CH",LRIDT,LRDN))
- if LRDN<1
- QUIT
- Begin DoDot:2
- +9 SET ITEM=$$TEST^LRPXAPIU(LRDN)
- +10 IF 'ITEM
- QUIT
- +11 SET NODE=LRDFN_";CH;"_LRIDT_";"_LRDN
- +12 IF '$DATA(^PXRMINDX(63,"PI",DFN,ITEM,DATE,NODE))
- DO BAD("CH",DFN,ITEM,DATE,NODE)
- End DoDot:2
- End DoDot:1
- +13 DO MI^LRPXCHKM(DFN,LRDFN)
- +14 DO AP^LRPXCHKA(DFN,LRDFN)
- +15 QUIT
- +16 ;
- TMPCHK(DFN,DATE,ITEM,NODE) ;
- +1 IF '$DATA(^PXRMINDX(63,"PI",DFN,ITEM,DATE,NODE))
- DO BAD(NODE,DFN,ITEM,DATE,NODE)
- +2 QUIT
- +3 ;
- BAD(INDEX,DFN,ITEM,DATE,NODE) ; write error to screen, collect in global
- +1 WRITE !,?5,INDEX," ",DFN," ",ITEM," ",DATE," ",NODE
- +2 SET ^TMP("LRLOG",$JOB,DFN,DATE,ITEM,INDEX)=NODE
- +3 QUIT
- +4 ;
- CLEAN ; clear tmp globals
- +1 ; "LRLOG" collects invalid nodes, "LRLOG PATS" are patients checked
- +2 KILL ^TMP("LRLOG",$JOB)
- +3 KILL ^TMP("LRLOG PATS",$JOB)
- +4 QUIT
- +5 ;
- REFVAL(REF) ; $$(reference location in ^LR) -> if ref exists 1, else 0
- +1 NEW SUB
- +2 IF REF'[";"
- QUIT ""
- +3 SET SUB=$PIECE(REF,";",2)
- +4 SET SUB=""""_SUB_""""
- +5 SET $PIECE(REF,";",2)=SUB
- +6 SET REF=$TRANSLATE(REF,";",",")
- +7 SET REF="^LR("_REF_")"
- +8 IF $DATA(@REF)
- QUIT 1
- +9 QUIT 0
- +10 ;
- REPAIR ; correct invalid indexes
- +1 ; kill off bad indexes
- +2 ; reset all indexes at date of bad index
- +3 NEW DATE,DFN,DOD,INDEX,ITEM,NODE,REPAIR
- KILL REPAIR
- +4 SET DFN=0
- +5 FOR
- SET DFN=$ORDER(^TMP("LRLOG",$JOB,DFN))
- if DFN<1
- QUIT
- Begin DoDot:1
- +6 SET LRDFN=$$LRDFN^LRPXAPIU(DFN)
- +7 SET DOD=$$DOD^LRPXAPIU(DFN)
- +8 SET DATE=0
- +9 FOR
- SET DATE=$ORDER(^TMP("LRLOG",$JOB,DFN,DATE))
- if DATE<1
- QUIT
- Begin DoDot:2
- +10 SET LRIDT=$$LRIDT^LRPXAPIU(DATE)
- +11 KILL REPAIR
- +12 SET ITEM=""
- +13 FOR
- SET ITEM=$ORDER(^TMP("LRLOG",$JOB,DFN,DATE,ITEM))
- if ITEM=""
- QUIT
- Begin DoDot:3
- +14 SET INDEX=""
- +15 FOR
- SET INDEX=$ORDER(^TMP("LRLOG",$JOB,DFN,DATE,ITEM,INDEX))
- if INDEX=""
- QUIT
- Begin DoDot:4
- +16 SET NODE=^TMP("LRLOG",$JOB,DFN,DATE,ITEM,INDEX)
- +17 IF '$LENGTH(NODE)
- QUIT
- +18 SET REPAIR($PIECE(NODE,";",2))=""
- +19 DO KLAB^LRPX(DFN,DATE,ITEM,NODE)
- End DoDot:4
- End DoDot:3
- +20 SET SUB=""
- +21 FOR
- SET SUB=$ORDER(REPAIR(SUB))
- if SUB=""
- QUIT
- Begin DoDot:3
- +22 IF SUB="CH"
- DO CH(DFN,LRDFN,DATE,LRIDT)
- QUIT
- +23 IF SUB="MI"
- DO MICRO(DFN,LRDFN,DATE,LRIDT)
- QUIT
- +24 DO AP(DFN,LRDFN,DATE,LRIDT,SUB)
- End DoDot:3
- +25 IF DATE=DOD
- DO AU(DFN,LRDFN,DATE)
- QUIT
- End DoDot:2
- End DoDot:1
- +26 QUIT
- +27 ;
- CH(DFN,LRDFN,DATE,LRIDT) ;
- +1 NEW DAT,LRDN,NODE,TEMP,TEST
- +2 IF '$$VERIFIED^LRPXAPI(LRDFN,LRIDT)
- QUIT
- +3 SET DAT=LRDFN_";CH;"_LRIDT
- +4 SET LRDN=1
- +5 FOR
- SET LRDN=$ORDER(^LR(LRDFN,"CH",LRIDT,LRDN))
- if LRDN<1
- QUIT
- Begin DoDot:1
- +6 SET NODE=DAT_";"_LRDN
- +7 SET TEMP=^LR(LRDFN,"CH",LRIDT,LRDN)
- +8 SET TEST=+$PIECE($PIECE(TEMP,U,3),"!",7)
- +9 IF 'TEST
- SET TEST=$$TEST^LRPXAPIU(LRDN)
- +10 IF 'TEST
- QUIT
- +11 DO SLAB^LRPX(DFN,DATE,TEST,NODE)
- End DoDot:1
- +12 QUIT
- +13 ;
- MICRO(DFN,LRDFN,DATE,LRIDT) ;
- +1 KILL ^TMP("LRPX",$JOB)
- +2 MERGE ^TMP("LRPX",$JOB,"AR")=^LR(LRDFN,"MI",LRIDT)
- +3 MERGE ^TMP("LRPX",$JOB,"B")=^PXRMINDX(63,"PDI",DFN,DATE)
- +4 DO MICRO^LRPXRM(DFN,LRDFN,DATE,LRIDT)
- +5 KILL ^TMP("LRPX",$JOB)
- +6 QUIT
- +7 ;
- AP(DFN,LRDFN,DATE,LRIDT,SUB) ;
- +1 KILL ^TMP("LRPX",$JOB)
- +2 MERGE ^TMP("LRPX",$JOB,"AR")=^LR(LRDFN,SUB,LRIDT)
- +3 MERGE ^TMP("LRPX",$JOB,"B")=^PXRMINDX(63,"PDI",DFN,DATE)
- +4 DO AP^LRPXRM(DFN,LRDFN,DATE,LRIDT,SUB)
- +5 KILL ^TMP("LRPX",$JOB)
- +6 QUIT
- +7 ;
- AU(DFN,LRDFN,DATE) ;
- +1 IF '+$GET(^LR(LRDFN,"AU"))
- QUIT
- +2 IF '($PIECE(^LR(LRDFN,"AU"),U,3)&($PIECE(^("AU"),U,15)))
- QUIT
- +3 KILL ^TMP("LRPX",$JOB)
- +4 MERGE ^TMP("LRPX",$JOB,"AR","AY")=^LR(LRDFN,"AY")
- +5 MERGE ^TMP("LRPX",$JOB,"AR",80)=^LR(LRDFN,80)
- +6 MERGE ^TMP("LRPX",$JOB,"AR",33)=^LR(LRDFN,33)
- +7 MERGE ^TMP("LRPX",$JOB,"B")=^PXRMINDX(63,"PDI",DFN,DATE)
- +8 DO AUTOPSY^LRPXRM(LRDFN)
- +9 KILL ^TMP("LRPX",$JOB)
- +10 QUIT
- +11 ;
- GETREP(REPAIR,ERR) ;
- +1 ; asks to repair indexes
- +2 NEW DIR,DIRUT,DTOUT,X,Y
- KILL DIR
- +3 SET ERR=0
- SET REPAIR=""
- +4 SET DIR(0)="YAO"
- +5 SET DIR("A")="Repair invalid indexes? "
- +6 SET DIR("B")="YES"
- +7 DO ^DIR
- KILL DIR
- +8 IF Y[U!$DATA(DTOUT)
- SET ERR=1
- QUIT
- +9 SET REPAIR=Y
- +10 WRITE !
- +11 QUIT
- +12 ;