DIU1 ;SFISC/GFT-REINDEX A FILE ;6NOV2012
;;22.0;VA FileMan;**41,167**;Mar 30, 1999;Build 20
;Per VHA Directive 2004-038, this routine should not be modified.
4 ;RE-CROSS-REFERENCING -- UTILITY OPTION 4
N DIUCNT,DIUTYPE,DV,DU,DW,DINO,DIKJ ;COME IN WITH I,J,N DEFINED
W !! K ^UTILITY("DIK",$J),X S DIK=DIU,X=0 D DISKIPIN^DIK(.DINO) S DW=0,DIUF=DI ;USED TO CALL D DD^DIK
DW S DW=$O(^UTILITY("DIK",$J,DW)),DV=0 S:DW="" DW=-1
I DW>0 S DU=0 F S DV=$O(^UTILITY("DIK",$J,DW,DV)),DH=0 G DW:DV="" S Y=0 F S DH=$O(^UTILITY("DIK",$J,DW,DV,DH)) Q:DH="" D
.S Y=^UTILITY("DIK",$J,DW,DV,DH),X=X+1,X(X)=Y,X(X,0)=DW_U_DV S:$P(Y,U,3)=""&'Y&$D(^(DH,0)) X(X)=^(0)
D GETXR^DIKCUTL2(DI,.DIUCNT,"xM")
F %=1:1:X I $G(X(%))="S DIIX=4 D:$G(DIK(0))'[""A"" AUDIT" K X(%) S X=X-1 F Y=%:1:X M X(Y)=X(Y+1) K X(Y+1) S %=%-1
K ^UTILITY("DIK",$J) G DD:'(X+DIUCNT),ONE:(X+DIUCNT)>1
ALL W "OK, ARE YOU SURE YOU WANT TO KILL OFF THE EXISTING "
I X=0,DIUCNT=1 W "'"_$P(DIUCNT($O(DIUCNT(""))),U,3)_"' INDEX"
E I X=1,DIUCNT=0 W $P(^DD(+X(1,0),$P(X(1,0),U,2),0),U,1)_" INDEX"
E W X+DIUCNT_" INDICES"
S %=2 D YN^DICN G:%-1 NO:%,Q W !,"DO YOU THEN WANT TO 'RE-CROSS-REFERENCE'" D YN^DICN G NO:%<1 S N=%=1 D WAIT^DICD
F X=X:-1:1 S %=$P(X(X),U,2) I %]"",+X(X)=DI K @(DIK_"%)") K:$P(X(X),U,3)'="MUMPS" X(X)
;THE REMAINING NODES OF 'X' SAY THAT WE HAVE TO KILL SOME INDIVIDUALLY.
;DIK(0)="AB" MEANS 'DON'T AUDIT & DON'T DO BULLETINS';X=2 MEANS DO KILLING. THAT OCCURS IN CNT^DIK1
S DIK(0)="ABX" I $O(X(0))]"" S X=2,(DA,DCNT)=0 D DISKIPIN^DIK(.DINO),CNT^DIK1
D:DIUCNT INDEX^DIKC(DIUF,"","","","KR") ;NOW DELETE THE NEW-STYLES, IF ANY
K X I N W !,$C(7),"FILE WILL NOW BE 'RE-CROSS-REFERENCED'..." H 5 D DD S DIK=^DIC(DIUF,0,"GL") D IXALL^DIK
K DIK,DIC Q
;
DD S DIK="^DD(DI,",DA(1)=DI K ^DD(DI,"B"),^("GL"),^("IX"),^("RQ"),^("GR"),^("SB")
W "." D IXALL^DIK:$D(^(0))#2 S DI=$O(^DD(DI)) S:DI="" DI=-1 I DI>0,DI<$O(^DIC(DIUF)) G DD ;RE-DOES THE DATA DICTIONARY, NOT THE DATA
Q
;
ONE S %=2 W "THERE ARE "_(X+DIUCNT)_$P(" RE-RUNNABLE",U,DINO>0)_" INDICES WITHIN THIS FILE",!,"DO YOU WISH TO RE-CROSS-REFERENCE ONE PARTICULAR INDEX" D YN^DICN W ! I %-1 G ALL:%=2,NO:%,Q
S DIUTYPE=$S('$G(DIUCNT):1,'$G(X):2,1:$$TYPE^DIKCUTL2)
G NO:DIUTYPE=""
I DIUTYPE=2 K DIUCNT D ONEXR(DI) Q
K X S X="CRW" D DI^DIU G NO:Y<0 S (DA,DL)=+Y,DICD="RE-CROSS-REFERENCE" D CHIX^DICD G NO:'DICD
S X=$P(I,U,2),%=$S(X]"":"THE '"_X_"' INDEX",1:"THIS TRIGGER") I $G(^DD(DI,DA,1,DICD,"NOREINDEX")) W !,"SORRY. ",%," IS LISTED AS NOT RE-RUNNABLE" G NO
W !,"ARE YOU SURE YOU WANT TO DELETE AND RE-CROSS-REFERENCE "_% S %=2 D YN^DICN G NO:%-1
G IND:X="" F %=0:0 S %=$O(^DD(+I,0,"IX",X,%)) Q:%="" F %Y=0:0 S %Y=$O(^DD(+I,0,"IX",X,%,%Y)) Q:%Y="" I %Y-DA!(%-DI) G IND
I +I=DIUF,$P(I,U,3)="",X]"" K @(DIK_"X)") G REDO
IND I $P(I,U,3)="",X]"" D KWREG(DIU,0,.I,.J) G REDO
S X=^DD(J(N),DA,1,DICD,2) D DD^DICD:"Q"'[X S DIU=^DIC(DIUF,0,"GL")
REDO S X=^DD(J(N),DL,1,DICD,1) D DD^DICD:"Q"'[X W $C(7)," ...DONE!" Q
;
Q F I=1:1:X W !,"FIELD " S %=X(I,0),J=$P(%,U,2) W J_" ('"_$P(^DD(+%,J,0),U,1)_"'" W:%-DI ", "_$O(^DD(+%,0,"NM",0))_" SUBFILE" W ") IS ",$S(X(I):"'"_$P(X(I),U,2)_"' INDEX",1:$P(X(I),U,3)) D UP
W !! D LIST^DIKCUTL2(.DIUCNT,"INDEX FILE CROSS-REFERENCES:")
G 4
UP I X(I),X(I)-DI S %=$D(^DD(+X(I),0,"UP")) W " OF "_$O(^("NM",0))_" "_$P("SUB",U,%>0)_"FILE" Q
S %=+$P(X(I),U,4),(%F,Y)=+$P(X(I),U,5) I %,$D(^DD(%,Y,0)) W:$X>44 ! W " OF " D WR^DIDH
Q
;
NO W !?7,$C(7),"<NO ACTION TAKEN>" K DICD,X,DH
Q
;
KWREG(ROOT,LEV,I,J) ;Kill entire regular index
;In:
; ROOT = open root of file or subfile
; LEV = level # of ROOT
; I = ^DD(file#,field#,1,xref#,0) [xref header node] = rfile#^name
; I(N) = node on which multiple at level n resides (for N>0)
; J(N) = level N subfile #
;
N CROOT
S CROOT=$$CREF^DILF(ROOT)
Q:'$D(@CROOT)
I J(LEV)=+I K @CROOT@($P(I,U,2)) Q
;
N DA
S DA=0
F S DA=$O(@CROOT@(DA)) Q:'DA D:$D(@CROOT@(DA,0))#2 KWREG(ROOT_DA_","_I(LEV+1)_",",LEV+1,.I,.J)
Q
;
;==============
; ONEXR(file#)
;==============
;Prompt for file/subfile and Index; run kill/set logic for that Index
;In:
; DI = top level file #
;
ONEXR(DI) ;Re-index one cross reference
;Prompt for subfile
N DIUCNT,DIUCTRL,DIUFILE,DIULOG,DIUXR
W !!?10,"File: "_$O(^DD(DI,0,"NM",""))_" (#"_DI_")"
S DIUFILE=$$SUB^DIKCU(DI) G:DIUFILE="" NO
;
;Prompt for xref
D GETXR^DIKCUTL2(DIUFILE,.DIUCNT,"x")
W ! D LIST^DIKCUTL2(.DIUCNT)
S DIUXR=$$CHOOSE^DIKCUTL2(.DIUCNT,"re-cross-reference")
G:'DIUXR NO
;
;Run kill and/or set
S DIUCTRL=$$LOGIC($P(DIUCNT(DIUXR),U,3))
G:DIUCTRL="" NO
;
S:DI'=DIUFILE DIUCTRL=DIUCTRL_"W"_DIUFILE
D INDEX^DIKC(DI,"","",DIUXR,DIUCTRL_"R")
W $C(7)_" ...DONE!"
Q
;
;====================
; $$LOGIC(indexName)
;====================
;Prompt for whether kill and/or set logic should be run.
;In:
; DIUNAME = name of xref (used in prompt)
;Return value:
; [ K : if kill logic should be run
; [ S : if set logic should be run
;
LOGIC(DIUNAME) ;
N DIULOG,DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
S DIULOG=""
;
;Ask whether kill logic should be executed
S DIR(0)="Y"
S DIR("A")="Do you want to delete the existing '"_DIUNAME_"' cross-reference"
S DIR("?")=" Enter 'YES' if you want to run the kill logic for this cross-reference."
W ! D ^DIR K DIR Q:$D(DIRUT) ""
S:Y DIULOG="K"
;
;Ask whether set logic should be executed
S DIR(0)="Y"
S DIR("A")="Do you want to re-build the '"_DIUNAME_"' cross reference"
S DIR("?")=" Enter 'YES' if you want to run the set logic for this cross reference."
D ^DIR K DIR Q:$D(DIRUT) ""
S:Y DIULOG=DIULOG_"S"
Q DIULOG
DIU1 ;SFISC/GFT-REINDEX A FILE ;6NOV2012
+1 ;;22.0;VA FileMan;**41,167**;Mar 30, 1999;Build 20
+2 ;Per VHA Directive 2004-038, this routine should not be modified.
4 ;RE-CROSS-REFERENCING -- UTILITY OPTION 4
+1 ;COME IN WITH I,J,N DEFINED
NEW DIUCNT,DIUTYPE,DV,DU,DW,DINO,DIKJ
+2 ;USED TO CALL D DD^DIK
WRITE !!
KILL ^UTILITY("DIK",$JOB),X
SET DIK=DIU
SET X=0
DO DISKIPIN^DIK(.DINO)
SET DW=0
SET DIUF=DI
DW SET DW=$ORDER(^UTILITY("DIK",$JOB,DW))
SET DV=0
IF DW=""
SET DW=-1
+1 IF DW>0
SET DU=0
FOR
SET DV=$ORDER(^UTILITY("DIK",$JOB,DW,DV))
SET DH=0
IF DV=""
GOTO DW
SET Y=0
FOR
SET DH=$ORDER(^UTILITY("DIK",$JOB,DW,DV,DH))
IF DH=""
QUIT
Begin DoDot:1
+2 SET Y=^UTILITY("DIK",$JOB,DW,DV,DH)
SET X=X+1
SET X(X)=Y
SET X(X,0)=DW_U_DV
IF $PIECE(Y,U,3)=""&'Y&$DATA(^(DH,0))
SET X(X)=^(0)
End DoDot:1
+3 DO GETXR^DIKCUTL2(DI,.DIUCNT,"xM")
+4 FOR %=1:1:X
IF $GET(X(%))="S DIIX=4 D:$G(DIK(0))'[""A"" AUDIT"
KILL X(%)
SET X=X-1
FOR Y=%:1:X
MERGE X(Y)=X(Y+1)
KILL X(Y+1)
SET %=%-1
+5 KILL ^UTILITY("DIK",$JOB)
IF '(X+DIUCNT)
GOTO DD
IF (X+DIUCNT)>1
GOTO ONE
ALL WRITE "OK, ARE YOU SURE YOU WANT TO KILL OFF THE EXISTING "
+1 IF X=0
IF DIUCNT=1
WRITE "'"_$PIECE(DIUCNT($ORDER(DIUCNT(""))),U,3)_"' INDEX"
+2 IF '$TEST
IF X=1
IF DIUCNT=0
WRITE $PIECE(^DD(+X(1,0),$PIECE(X(1,0),U,2),0),U,1)_" INDEX"
+3 IF '$TEST
WRITE X+DIUCNT_" INDICES"
+4 SET %=2
DO YN^DICN
IF %-1
IF %
GOTO NO
GOTO Q
WRITE !,"DO YOU THEN WANT TO 'RE-CROSS-REFERENCE'"
DO YN^DICN
IF %<1
GOTO NO
SET N=%=1
DO WAIT^DICD
+5 FOR X=X:-1:1
SET %=$PIECE(X(X),U,2)
IF %]""
IF +X(X)=DI
KILL @(DIK_"%)")
IF $PIECE(X(X),U,3)'="MUMPS"
KILL X(X)
+6 ;THE REMAINING NODES OF 'X' SAY THAT WE HAVE TO KILL SOME INDIVIDUALLY.
+7 ;DIK(0)="AB" MEANS 'DON'T AUDIT & DON'T DO BULLETINS';X=2 MEANS DO KILLING. THAT OCCURS IN CNT^DIK1
+8 SET DIK(0)="ABX"
IF $ORDER(X(0))]""
SET X=2
SET (DA,DCNT)=0
DO DISKIPIN^DIK(.DINO)
DO CNT^DIK1
+9 ;NOW DELETE THE NEW-STYLES, IF ANY
IF DIUCNT
DO INDEX^DIKC(DIUF,"","","","KR")
+10 KILL X
IF N
WRITE !,$CHAR(7),"FILE WILL NOW BE 'RE-CROSS-REFERENCED'..."
HANG 5
DO DD
SET DIK=^DIC(DIUF,0,"GL")
DO IXALL^DIK
+11 KILL DIK,DIC
QUIT
+12 ;
DD SET DIK="^DD(DI,"
SET DA(1)=DI
KILL ^DD(DI,"B"),^("GL"),^("IX"),^("RQ"),^("GR"),^("SB")
+1 ;RE-DOES THE DATA DICTIONARY, NOT THE DATA
WRITE "."
IF $DATA(^(0))#2
DO IXALL^DIK
SET DI=$ORDER(^DD(DI))
IF DI=""
SET DI=-1
IF DI>0
IF DI<$ORDER(^DIC(DIUF))
GOTO DD
+2 QUIT
+3 ;
ONE SET %=2
WRITE "THERE ARE "_(X+DIUCNT)_$PIECE(" RE-RUNNABLE",U,DINO>0)_" INDICES WITHIN THIS FILE",!,"DO YOU WISH TO RE-CROSS-REFERENCE ONE PARTICULAR INDEX"
DO YN^DICN
WRITE !
IF %-1
IF %=2
GOTO ALL
IF %
GOTO NO
GOTO Q
+1 SET DIUTYPE=$SELECT('$GET(DIUCNT):1,'$GET(X):2,1:$$TYPE^DIKCUTL2)
+2 IF DIUTYPE=""
GOTO NO
+3 IF DIUTYPE=2
KILL DIUCNT
DO ONEXR(DI)
QUIT
+4 KILL X
SET X="CRW"
DO DI^DIU
IF Y<0
GOTO NO
SET (DA,DL)=+Y
SET DICD="RE-CROSS-REFERENCE"
DO CHIX^DICD
IF 'DICD
GOTO NO
+5 SET X=$PIECE(I,U,2)
SET %=$SELECT(X]"":"THE '"_X_"' INDEX",1:"THIS TRIGGER")
IF $GET(^DD(DI,DA,1,DICD,"NOREINDEX"))
WRITE !,"SORRY. ",%," IS LISTED AS NOT RE-RUNNABLE"
GOTO NO
+6 WRITE !,"ARE YOU SURE YOU WANT TO DELETE AND RE-CROSS-REFERENCE "_%
SET %=2
DO YN^DICN
IF %-1
GOTO NO
+7 IF X=""
GOTO IND
FOR %=0:0
SET %=$ORDER(^DD(+I,0,"IX",X,%))
IF %=""
QUIT
FOR %Y=0:0
SET %Y=$ORDER(^DD(+I,0,"IX",X,%,%Y))
IF %Y=""
QUIT
IF %Y-DA!(%-DI)
GOTO IND
+8 IF +I=DIUF
IF $PIECE(I,U,3)=""
IF X]""
KILL @(DIK_"X)")
GOTO REDO
IND IF $PIECE(I,U,3)=""
IF X]""
DO KWREG(DIU,0,.I,.J)
GOTO REDO
+1 SET X=^DD(J(N),DA,1,DICD,2)
IF "Q"'[X
DO DD^DICD
SET DIU=^DIC(DIUF,0,"GL")
REDO SET X=^DD(J(N),DL,1,DICD,1)
IF "Q"'[X
DO DD^DICD
WRITE $CHAR(7)," ...DONE!"
QUIT
+1 ;
Q FOR I=1:1:X
WRITE !,"FIELD "
SET %=X(I,0)
SET J=$PIECE(%,U,2)
WRITE J_" ('"_$PIECE(^DD(+%,J,0),U,1)_"'"
IF %-DI
WRITE ", "_$ORDER(^DD(+%,0,"NM",0))_" SUBFILE"
WRITE ") IS ",$SELECT(X(I):"'"_$PIECE(X(I),U,2)_"' INDEX",1:$PIECE(X(I),U,3))
DO UP
+1 WRITE !!
DO LIST^DIKCUTL2(.DIUCNT,"INDEX FILE CROSS-REFERENCES:")
+2 GOTO 4
UP IF X(I)
IF X(I)-DI
SET %=$DATA(^DD(+X(I),0,"UP"))
WRITE " OF "_$ORDER(^("NM",0))_" "_$PIECE("SUB",U,%>0)_"FILE"
QUIT
+1 SET %=+$PIECE(X(I),U,4)
SET (%F,Y)=+$PIECE(X(I),U,5)
IF %
IF $DATA(^DD(%,Y,0))
IF $X>44
WRITE !
WRITE " OF "
DO WR^DIDH
+2 QUIT
+3 ;
NO WRITE !?7,$CHAR(7),"<NO ACTION TAKEN>"
KILL DICD,X,DH
+1 QUIT
+2 ;
KWREG(ROOT,LEV,I,J) ;Kill entire regular index
+1 ;In:
+2 ; ROOT = open root of file or subfile
+3 ; LEV = level # of ROOT
+4 ; I = ^DD(file#,field#,1,xref#,0) [xref header node] = rfile#^name
+5 ; I(N) = node on which multiple at level n resides (for N>0)
+6 ; J(N) = level N subfile #
+7 ;
+8 NEW CROOT
+9 SET CROOT=$$CREF^DILF(ROOT)
+10 IF '$DATA(@CROOT)
QUIT
+11 IF J(LEV)=+I
KILL @CROOT@($PIECE(I,U,2))
QUIT
+12 ;
+13 NEW DA
+14 SET DA=0
+15 FOR
SET DA=$ORDER(@CROOT@(DA))
IF 'DA
QUIT
IF $DATA(@CROOT@(DA,0))#2
DO KWREG(ROOT_DA_","_I(LEV+1)_",",LEV+1,.I,.J)
+16 QUIT
+17 ;
+18 ;==============
+19 ; ONEXR(file#)
+20 ;==============
+21 ;Prompt for file/subfile and Index; run kill/set logic for that Index
+22 ;In:
+23 ; DI = top level file #
+24 ;
ONEXR(DI) ;Re-index one cross reference
+1 ;Prompt for subfile
+2 NEW DIUCNT,DIUCTRL,DIUFILE,DIULOG,DIUXR
+3 WRITE !!?10,"File: "_$ORDER(^DD(DI,0,"NM",""))_" (#"_DI_")"
+4 SET DIUFILE=$$SUB^DIKCU(DI)
IF DIUFILE=""
GOTO NO
+5 ;
+6 ;Prompt for xref
+7 DO GETXR^DIKCUTL2(DIUFILE,.DIUCNT,"x")
+8 WRITE !
DO LIST^DIKCUTL2(.DIUCNT)
+9 SET DIUXR=$$CHOOSE^DIKCUTL2(.DIUCNT,"re-cross-reference")
+10 IF 'DIUXR
GOTO NO
+11 ;
+12 ;Run kill and/or set
+13 SET DIUCTRL=$$LOGIC($PIECE(DIUCNT(DIUXR),U,3))
+14 IF DIUCTRL=""
GOTO NO
+15 ;
+16 IF DI'=DIUFILE
SET DIUCTRL=DIUCTRL_"W"_DIUFILE
+17 DO INDEX^DIKC(DI,"","",DIUXR,DIUCTRL_"R")
+18 WRITE $CHAR(7)_" ...DONE!"
+19 QUIT
+20 ;
+21 ;====================
+22 ; $$LOGIC(indexName)
+23 ;====================
+24 ;Prompt for whether kill and/or set logic should be run.
+25 ;In:
+26 ; DIUNAME = name of xref (used in prompt)
+27 ;Return value:
+28 ; [ K : if kill logic should be run
+29 ; [ S : if set logic should be run
+30 ;
LOGIC(DIUNAME) ;
+1 NEW DIULOG,DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
+2 SET DIULOG=""
+3 ;
+4 ;Ask whether kill logic should be executed
+5 SET DIR(0)="Y"
+6 SET DIR("A")="Do you want to delete the existing '"_DIUNAME_"' cross-reference"
+7 SET DIR("?")=" Enter 'YES' if you want to run the kill logic for this cross-reference."
+8 WRITE !
DO ^DIR
KILL DIR
IF $DATA(DIRUT)
QUIT ""
+9 IF Y
SET DIULOG="K"
+10 ;
+11 ;Ask whether set logic should be executed
+12 SET DIR(0)="Y"
+13 SET DIR("A")="Do you want to re-build the '"_DIUNAME_"' cross reference"
+14 SET DIR("?")=" Enter 'YES' if you want to run the set logic for this cross reference."
+15 DO ^DIR
KILL DIR
IF $DATA(DIRUT)
QUIT ""
+16 IF Y
SET DIULOG=DIULOG_"S"
+17 QUIT DIULOG