DIK ;SFISC/GFT,YJK,XAK-GATHER A FILE'S XREFS TO EXECUTE ;8NOV2014
;;22.2;VA FileMan;;Jan 05, 2016;Build 42
;;Per VA Directive 6402, this routine should not be modified.
;;Submitted to OSEHRA 5 January 2015 by the VISTA Expertise Network.
;;Based on Medsphere Systems Corporation's MSC FileMan 1051.
;;Licensed under the terms of the Apache License, Version 2.0.
;
Q:"(,"'[$E($RE(DIK)) Q:'$G(DA) Q:'$D(@(DIK_"DA)")) Q:$P($G(^DD($$GLO^DILIBF(DIK),0,"DI")),U,2)["Y"&'$D(DIOVRD)&'$G(DIFROM) Q:DA'>0
N DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIAU,DIKALLR
D CHKS I $D(DIKZ1) N DIKIL S DIKIL=1 G @DIKGP
S X=2 D DD G ^DIK1
;
DD1 N DISKIPIN D D,A Q
;
;
DISKIPIN(DISKIPIN) ;ALSO CALLED FROM DIU1
K DISKIPIN S DISKIPIN=1 D DDGO
F DV=0:0 S DV=$O(^DD("IX","B",+$P($G(@(DIK_"0)")),U,2),DV)) Q:'DV I $G(^DD("IX",DV,"NOREINDEX")) S DISKIPIN=DISKIPIN+1
S DISKIPIN=DISKIPIN-1 Q ;RETURN THE NUMBER OF SKIPPED INDEXES
;
DD ;CALLED FROM DIKZ0
N DISKIPIN
DDGO D DIKJ N DIKCHK S DIKCHK=1,DV=0 D D,A
I $G(DIK(0))["s" S DU=1 Q
E S DV=$O(^DD(DH,"SB",DV))
I DV>0 S DU=$O(^(DV,0)) G E:'$D(^DD(DV,.01,0)),E:$P(^(0),U,2)["W" S DW=$P($P(^DD(DH,DU,0),U,4),";") S:+DW'=DW DW=""""_DW_"""" S DV(DH,DU)=DW,DV(DH,DU,0)=DV,DU(DV)=DH D:$D(DIK0) CRT^DIKZ2 G E
Q:$D(DIK0)
DH S DH=$O(DU(DH)) G:DH>0 DH:$D(DV(DH)),E
F DH=DH(1):0 S DH=$O(DU(DH)) Q:DH'>0 D D,A
DV S DH=0 F S DH=$O(DV(DH)) Q:'DH S DU=0 F S DU=$O(DV(DH,DU)) Q:'DU I $G(DIKCHK),'$G(DIKCHK(DV(DH,DU,0))) S DV(DH,DU,"NOLOOP")=""
S DU=1
Q
;
DW I $O(^UTILITY("DIK",DIKJ,DH,DV,0))="" K ^UTILITY("DIK",DIKJ,DH,DV)
D S DV=$O(^DD(DH,"IX",DV)) Q:DV'>0 I '$D(^DD(DH,DV,0)) K ^DD(DH,"IX",DV) G D
D 0
I F DW=0:0 S DW=$O(^DD(DH,DV,1,DW)) G DW:DW'>0 I $D(^(DW,X)),"Q"'[^(X),$D(^(0)) S %=^(0) D
.I $G(^("NOREINDEX")),$G(DISKIPIN) S DISKIPIN(DISKIPIN)=%,DISKIPIN=DISKIPIN+1 Q
.D INX
;
INX I %["TRIGGER" S %=^(X),^UTILITY("DIK",DIKJ,DH,DV,DW)="D RCR",^(DW,0)=% Q
I %["BULLETIN MESSAGE",$G(DIK(0))["B" S %=$P("CREA^DELE",U,X)_"TE VALUE" W:$D(^(%)) !,"...('"_^(%)_"' BULLETIN WILL NOT BE TRIGGERED)..." Q
I '$D(DIK0),X=2,$P(%,U),$P(%,U,2)]"",$P(%,U,3)="",+%=DH(1)&$G(DIKALLR)!$D(DU(+%)) D
. S ^UTILITY("DIK",DIKJ,"KW",+%,$P(%,U,2))=DH_U_DV_U_DW
. D CHK($G(DU(+%)),.DU,.DIKCHK)
E D
. S ^UTILITY("DIK",DIKJ,DH,DV,DW)=^DD(DH,DV,1,DW,X)
. D CHK(DH,.DU,.DIKCHK)
Q
CHK(F,DU,DIKCHK) ;Set DIKCHK(f) for file F and its parents
Q:$D(DIK0)!'$G(DIKCHK)
F Q:'F Q:$D(DIKCHK(F)) S DIKCHK(F)=1,F=$G(DU(F))
Q
;
A F DV=0:0 S DV=$O(^DD(DH,"AUDIT",DV)) Q:DV'>0 D A1 ;FIND AUDITED FIELDS
Q
A1 D 0 S ^UTILITY("DIK",DIKJ,DH,DV,99)="S DIIX="_(4-X)_" D:$G(DIK(0))'[""A"" AUDIT" D CHK(DH,.DU,.DIKCHK) Q
;
0 ;REMEMBER HOW TO GRAB THE FIELD'S VALUE
S DW=$P(^DD(DH,DV,0),U,4),^UTILITY("DIK",DIKJ,DH,DV)=$P(DW,";",1),DW=$P(DW,";",2)
S ^UTILITY("DIK",DIKJ,DH,DV,0)=$S(DW:"S X=$P($G(^(X)),U,"_DW_")",1:"S X=$E($G(^(X)),"_+$E(DW,2,9)_","_$P(DW,",",2)_")"),DW=0
Q
;
IX ;One entry, all fields, KILL then SET
N DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKALLR
D DIK0,CHKS I $D(DIKZ1) N DIKKS S DIKKS=1 D @DIKGP G Q
S X=2,DIKNM=1 D DD,1^DIK1
IX1 ;One entry, all fields, SET (X=1)
N DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKSET,DIKALLR
D DIK0 I '$D(DIKNM) D CHKS I $D(DIKZ1) N DIKST S DIKST=1 D @DIKGP G Q
S X=1,DIKSET=1 D DD,1^DIK1
;
D INDEX^DIKC(DIK,.DA,"","",$E("K",$D(DIKNM)#2)_"S"_$E("RI",$D(DIFROM)#2+1)_$E("s",$G(DIK(0))["s"))
G Q
;
IX2 ;One entry, all fields, KILL (X=2)
Q:$D(@(DIK_"0)"))[0
N DIKJ,DIKS,DIN,DH,DU,DV,DW,DIKDA,DIKALLR
S X=2 D DIK0,DD,1^DIK1
D INDEX^DIKC(DIK,.DA,"","","K"_$E("RI",$D(DIFROM)#2+1)_$E("s",$G(DIK(0))["s"))
G Q
;
IXALL ;All entries, SET (X=1)
N DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKSET,DIKALLR
N DINO S X=1 D DIK0,DISKIPIN(.DINO)
D CHKS I $D(DIKZ1),'$G(DINO) N DIKSAT S DIKSAT=1,DA=0 D @DIKGP G Q ;CAN'T DO COMPILED ROUTINE IF THERE ARE SOME WE MUST SKIP
;
N DIKDASV,DIKSAVE
M DIKDASV=DA S DIKDASV=0,DIKSAVE=DIK
S (DA,DCNT)=0,X=1,DIKSET=1 D CNT^DIK1
;NOW FIRE NEW-STYLE SETS
D INDEX^DIKC(DIKSAVE,.DIKDASV,"","","Sx"_$E("RI",$D(DIFROM)#2+1)_$E("s",$G(DIK(0))["s"))
G Q
;
IXALL2 ;All entries, KILL (X=2)
Q:$D(@(DIK_"0)"))[0
N DIKJ,DIKS,DIN,DH,DU,DV,DW,DIKDA,DIKDASV,DIKSAVE,DIKALLR
N DINO S X=2 D DIK0,DISKIPIN(.DINO)
M DIKDASV=DA S DIKDASV=0,DIKSAVE=DIK
S DIKALLR=1,(DA,DCNT)=0,X=2 D CNT^DIK1
;NOW FIRE NEW-STYLE KILLS
D INDEX^DIKC(DIKSAVE,.DIKDASV,"","","Kx"_$E("RI",$D(DIFROM)#2+1)_$E("s",$G(DIK(0))["s"))
G Q
;
EN ;One entry, KILL then SET
N DIKCRFIL,DIKCDIK,DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKALLR
D DIK0,N(1) G:'$D(DH)!'$D(DA) Q ;re-indexing
S DIKCRFIL=DH M DIKCDIK=DIK
S DIKNM=1,X=2 D:$D(DIKNX) PR,1^DIK1
;
EN1 ;One entry, SET (X=1)
N DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKALLR
D DIK0 D @$S('$D(DIKNM):"N(1)",1:"DIKJ") G:'$D(DH)!'$D(DA) Q ;re-indexing
I '$D(DIKNM) N DIKCRFIL,DIKCDIK S DIKCRFIL=DH M DIKCDIK=DIK
S X=1 D:$D(DIKNX) PR,1^DIK1
I $D(^DD("IX","AC",DIKCRFIL)) M DIK=DIKCDIK D INDEX^DIKC(DIKCRFIL,.DA,$P(DIK(1),U),$P(DIK(1),U,2,999),$E("K",$D(DIKNM))_"S"_$E("RI",$D(DIFROM)#2+1))
G Q
;
EN2 ;One entry, KILL (X=2)
N DIKCRFIL,DIKCDIK,DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKALLR
D DIK0,N(1) G:'$D(DH)!'$D(DA) Q ;re-indexing
S DIKCRFIL=DH M DIKCDIK=DIK
S X=2 D:$D(DIKNX) PR,1^DIK1
I $D(^DD("IX","AC",DIKCRFIL)) M DIK=DIKCDIK D INDEX^DIKC(DIKCRFIL,.DA,$P(DIK(1),U),$P(DIK(1),U,2,999),"K"_$E("RI",$D(DIFROM)#2+1))
G Q
;
ENALL ;All entries, SET (X=1)
N DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKXREF,DIKDASV,DIKSAVE,DHSAVE,DIKALLR
D DIK0,N(0) G:'$D(DH) Q ;no re-indexing
M DIKDASV=DA,DIKSAVE=DIK,DHSAVE=DH S DIKDASV=0
S (DA,DCNT)=0,X=1 D PR,CNT^DIK1
D:$D(^DD("IX","AC",DHSAVE)) INDEX^DIKC(DHSAVE,.DIKDASV,$P(DIKSAVE(1),U),$P(DIKSAVE(1),U,2,999),"Sx"_$E("RI",$D(DIFROM)#2+1))
G Q
;
ENALL2 ;All entries, KILL (X=2)
N DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKXREF,DIKDASV,DIKSAVE,DHSAVE,DIKALLR
D DIK0,N(0) G:'$D(DH) Q ;no re-indexing
M DIKDASV=DA,DIKSAVE=DIK,DHSAVE=DH S DIKDASV=0
S DIKALLR=1,(DA,DCNT)=0,X=2 D PR,CNT^DIK1
D:$D(^DD("IX","AC",DHSAVE)) INDEX^DIKC(DHSAVE,.DIKDASV,$P(DIKSAVE(1),U),$P(DIKSAVE(1),U,2,999),"Kx"_$E("RI",$D(DIFROM)#2+1))
G Q
;
;
N(REINDOK) Q:'$D(DIK)!'$D(DIK(1))!'$D(@(DIK_"0)")) D DIKJ S DIKND=$P(DIK(1),U)
I '$D(^DD(DH,"IX",DIKND)) K:'$D(^DD("IX","F",DH,DIKND)) DH Q
I $P(DIK(1),U,2)="" D
. S %=0 F A1=1:1 S %=$O(^DD(DH,DIKND,1,%)) Q:'% I '$G(^(%,"NOREINDEX"))!REINDOK S DIKNX(A1)=% ;SKIP NON-RERUNNABLE INDEX IF NOT SPECIFIED PRECISELY AND IF THIS IS A MASS REINDEX
E F A1=1:1 Q:$P(DIK(1),U,A1+1)="" S DIKNX(A1)=$P(DIK(1),U,A1+1)
K A1,% Q
;
PR S DV=DIKND I '$D(^DD(DH,"IX",DV)),'$D(^DD(DH,"AUDIT",DV)) Q
D 0 S DIKZ1=$O(DIKNX(0)) D:DIKZ1 CK K DIKZ1 ; - VEN/SMH
D:$D(^DD(DH,"AUDIT",DV)) A1 S DU=1 Q
;
CK Q:'$D(DIKNX(+DIKZ1))
F DW=0:0 S DW=$O(^DD(DH,DV,1,DW)) Q:DW'>0 I $D(^(DW,0)),(DW=DIKNX(DIKZ1))!($P(^(0),U,2)=DIKNX(DIKZ1)),$D(^(X)),"Q"'[^(X) S %=^(0) D INX
S DIKZ1=$O(DIKNX(+DIKZ1)) G CK
;
FREE(X) N V S V=$G(^UTILITY("DIK",X)) I 'V Q 1
Q $H-1>V
;
DIKJ F DIKJ=$J:.01 I $$FREE(DIKJ) K ^UTILITY("DIK",DIKJ) S ^UTILITY("DIK",DIKJ)=$H Q ;TO ENABLE RECURSIVE CALL, FIND A "$J" THAT'S UNUSED
INT K DIKS,DIN,DH,DU,DV,DW S U="^",DH=+$P(@(DIK_"0)"),U,2),DH(1)=DH Q
;
CHKS ;
I $D(@(DIK_"0)"))[0 S DIKZ1=1,DIKGP="Q^DIK1" Q
S DIKZ1=+$P(^(0),"^",2) I DIKZ1,$D(^DD(DIKZ1,0,"DIK")),$$ROUEXIST^DILIBF(^("DIK")) S DIKGP="^"_^DD(DIKZ1,0,"DIK") Q
K DIKZ1 Q
;
DIK0 I '$D(DIK(0)) S DIK(0)="A666" ;MASS CROSS-REFERENCES SHOULD NOT FILL UP THE AUDIT FILE (^DIA)
Q
;
Q K:$G(DIK(0))["A666" DIK(0) K DIKND,DIKNX,DIKZ1,DIKNM,DIAU,DIG,DIH,DIV,DIW,%,DH Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HDIK 7710 printed Oct 16, 2024@18:49:11 Page 2
DIK ;SFISC/GFT,YJK,XAK-GATHER A FILE'S XREFS TO EXECUTE ;8NOV2014
+1 ;;22.2;VA FileMan;;Jan 05, 2016;Build 42
+2 ;;Per VA Directive 6402, this routine should not be modified.
+3 ;;Submitted to OSEHRA 5 January 2015 by the VISTA Expertise Network.
+4 ;;Based on Medsphere Systems Corporation's MSC FileMan 1051.
+5 ;;Licensed under the terms of the Apache License, Version 2.0.
+6 ;
+7 if "(,"'[$EXTRACT($REVERSE(DIK))
QUIT
if '$GET(DA)
QUIT
if '$DATA(@(DIK_"DA)"))
QUIT
if $PIECE($GET(^DD($$GLO^DILIBF(DIK),0,"DI")),U,2)["Y"&'$DATA(DIOVRD)&'$GET(DIFROM)
QUIT
if DA'>0
QUIT
+8 NEW DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIAU,DIKALLR
+9 DO CHKS
IF $DATA(DIKZ1)
NEW DIKIL
SET DIKIL=1
GOTO @DIKGP
+10 SET X=2
DO DD
GOTO ^DIK1
+11 ;
DD1 NEW DISKIPIN
DO D
DO A
QUIT
+1 ;
+2 ;
DISKIPIN(DISKIPIN) ;ALSO CALLED FROM DIU1
+1 KILL DISKIPIN
SET DISKIPIN=1
DO DDGO
+2 FOR DV=0:0
SET DV=$ORDER(^DD("IX","B",+$PIECE($GET(@(DIK_"0)")),U,2),DV))
if 'DV
QUIT
IF $GET(^DD("IX",DV,"NOREINDEX"))
SET DISKIPIN=DISKIPIN+1
+3 ;RETURN THE NUMBER OF SKIPPED INDEXES
SET DISKIPIN=DISKIPIN-1
QUIT
+4 ;
DD ;CALLED FROM DIKZ0
+1 NEW DISKIPIN
DDGO DO DIKJ
NEW DIKCHK
SET DIKCHK=1
SET DV=0
DO D
DO A
+1 IF $GET(DIK(0))["s"
SET DU=1
QUIT
E SET DV=$ORDER(^DD(DH,"SB",DV))
+1 IF DV>0
SET DU=$ORDER(^(DV,0))
if '$DATA(^DD(DV,.01,0))
GOTO E
if $PIECE(^(0),U,2)["W"
GOTO E
SET DW=$PIECE($PIECE(^DD(DH,DU,0),U,4),";")
if +DW'=DW
SET DW=""""_DW_""""
SET DV(DH,DU)=DW
SET DV(DH,DU,0)=DV
SET DU(DV)=DH
if $DATA(DIK0)
DO CRT^DIKZ2
GOTO E
+2 if $DATA(DIK0)
QUIT
DH SET DH=$ORDER(DU(DH))
if DH>0
if $DATA(DV(DH))
GOTO DH
GOTO E
+1 FOR DH=DH(1):0
SET DH=$ORDER(DU(DH))
if DH'>0
QUIT
DO D
DO A
DV SET DH=0
FOR
SET DH=$ORDER(DV(DH))
if 'DH
QUIT
SET DU=0
FOR
SET DU=$ORDER(DV(DH,DU))
if 'DU
QUIT
IF $GET(DIKCHK)
IF '$GET(DIKCHK(DV(DH,DU,0)))
SET DV(DH,DU,"NOLOOP")=""
+1 SET DU=1
+2 QUIT
+3 ;
DW IF $ORDER(^UTILITY("DIK",DIKJ,DH,DV,0))=""
KILL ^UTILITY("DIK",DIKJ,DH,DV)
D SET DV=$ORDER(^DD(DH,"IX",DV))
if DV'>0
QUIT
IF '$DATA(^DD(DH,DV,0))
KILL ^DD(DH,"IX",DV)
GOTO D
+1 DO 0
I FOR DW=0:0
SET DW=$ORDER(^DD(DH,DV,1,DW))
if DW'>0
GOTO DW
IF $DATA(^(DW,X))
IF "Q"'[^(X)
IF $DATA(^(0))
SET %=^(0)
Begin DoDot:1
+1 IF $GET(^("NOREINDEX"))
IF $GET(DISKIPIN)
SET DISKIPIN(DISKIPIN)=%
SET DISKIPIN=DISKIPIN+1
QUIT
+2 DO INX
End DoDot:1
+3 ;
INX IF %["TRIGGER"
SET %=^(X)
SET ^UTILITY("DIK",DIKJ,DH,DV,DW)="D RCR"
SET ^(DW,0)=%
QUIT
+1 IF %["BULLETIN MESSAGE"
IF $GET(DIK(0))["B"
SET %=$PIECE("CREA^DELE",U,X)_"TE VALUE"
if $DATA(^(%))
WRITE !,"...('"_^(%)_"' BULLETIN WILL NOT BE TRIGGERED)..."
QUIT
+2 IF '$DATA(DIK0)
IF X=2
IF $PIECE(%,U)
IF $PIECE(%,U,2)]""
IF $PIECE(%,U,3)=""
IF +%=DH(1)&$GET(DIKALLR)!$DATA(DU(+%))
Begin DoDot:1
+3 SET ^UTILITY("DIK",DIKJ,"KW",+%,$PIECE(%,U,2))=DH_U_DV_U_DW
+4 DO CHK($GET(DU(+%)),.DU,.DIKCHK)
End DoDot:1
+5 IF '$TEST
Begin DoDot:1
+6 SET ^UTILITY("DIK",DIKJ,DH,DV,DW)=^DD(DH,DV,1,DW,X)
+7 DO CHK(DH,.DU,.DIKCHK)
End DoDot:1
+8 QUIT
CHK(F,DU,DIKCHK) ;Set DIKCHK(f) for file F and its parents
+1 if $DATA(DIK0)!'$GET(DIKCHK)
QUIT
+2 FOR
if 'F
QUIT
if $DATA(DIKCHK(F))
QUIT
SET DIKCHK(F)=1
SET F=$GET(DU(F))
+3 QUIT
+4 ;
A ;FIND AUDITED FIELDS
FOR DV=0:0
SET DV=$ORDER(^DD(DH,"AUDIT",DV))
if DV'>0
QUIT
DO A1
+1 QUIT
A1 DO 0
SET ^UTILITY("DIK",DIKJ,DH,DV,99)="S DIIX="_(4-X)_" D:$G(DIK(0))'[""A"" AUDIT"
DO CHK(DH,.DU,.DIKCHK)
QUIT
+1 ;
0 ;REMEMBER HOW TO GRAB THE FIELD'S VALUE
+1 SET DW=$PIECE(^DD(DH,DV,0),U,4)
SET ^UTILITY("DIK",DIKJ,DH,DV)=$PIECE(DW,";",1)
SET DW=$PIECE(DW,";",2)
+2 SET ^UTILITY("DIK",DIKJ,DH,DV,0)=$SELECT(DW:"S X=$P($G(^(X)),U,"_DW_")",1:"S X=$E($G(^(X)),"_+$EXTRACT(DW,2,9)_","_$PIECE(DW,",",2)_")")
SET DW=0
+3 QUIT
+4 ;
IX ;One entry, all fields, KILL then SET
+1 NEW DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKALLR
+2 DO DIK0
DO CHKS
IF $DATA(DIKZ1)
NEW DIKKS
SET DIKKS=1
DO @DIKGP
GOTO Q
+3 SET X=2
SET DIKNM=1
DO DD
DO 1^DIK1
IX1 ;One entry, all fields, SET (X=1)
+1 NEW DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKSET,DIKALLR
+2 DO DIK0
IF '$DATA(DIKNM)
DO CHKS
IF $DATA(DIKZ1)
NEW DIKST
SET DIKST=1
DO @DIKGP
GOTO Q
+3 SET X=1
SET DIKSET=1
DO DD
DO 1^DIK1
+4 ;
+5 DO INDEX^DIKC(DIK,.DA,"","",$EXTRACT("K",$DATA(DIKNM)#2)_"S"_$EXTRACT("RI",$DATA(DIFROM)#2+1)_$EXTRACT("s",$GET(DIK(0))["s"))
+6 GOTO Q
+7 ;
IX2 ;One entry, all fields, KILL (X=2)
+1 if $DATA(@(DIK_"0)"))[0
QUIT
+2 NEW DIKJ,DIKS,DIN,DH,DU,DV,DW,DIKDA,DIKALLR
+3 SET X=2
DO DIK0
DO DD
DO 1^DIK1
+4 DO INDEX^DIKC(DIK,.DA,"","","K"_$EXTRACT("RI",$DATA(DIFROM)#2+1)_$EXTRACT("s",$GET(DIK(0))["s"))
+5 GOTO Q
+6 ;
IXALL ;All entries, SET (X=1)
+1 NEW DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKSET,DIKALLR
+2 NEW DINO
SET X=1
DO DIK0
DO DISKIPIN(.DINO)
+3 ;CAN'T DO COMPILED ROUTINE IF THERE ARE SOME WE MUST SKIP
DO CHKS
IF $DATA(DIKZ1)
IF '$GET(DINO)
NEW DIKSAT
SET DIKSAT=1
SET DA=0
DO @DIKGP
GOTO Q
+4 ;
+5 NEW DIKDASV,DIKSAVE
+6 MERGE DIKDASV=DA
SET DIKDASV=0
SET DIKSAVE=DIK
+7 SET (DA,DCNT)=0
SET X=1
SET DIKSET=1
DO CNT^DIK1
+8 ;NOW FIRE NEW-STYLE SETS
+9 DO INDEX^DIKC(DIKSAVE,.DIKDASV,"","","Sx"_$EXTRACT("RI",$DATA(DIFROM)#2+1)_$EXTRACT("s",$GET(DIK(0))["s"))
+10 GOTO Q
+11 ;
IXALL2 ;All entries, KILL (X=2)
+1 if $DATA(@(DIK_"0)"))[0
QUIT
+2 NEW DIKJ,DIKS,DIN,DH,DU,DV,DW,DIKDA,DIKDASV,DIKSAVE,DIKALLR
+3 NEW DINO
SET X=2
DO DIK0
DO DISKIPIN(.DINO)
+4 MERGE DIKDASV=DA
SET DIKDASV=0
SET DIKSAVE=DIK
+5 SET DIKALLR=1
SET (DA,DCNT)=0
SET X=2
DO CNT^DIK1
+6 ;NOW FIRE NEW-STYLE KILLS
+7 DO INDEX^DIKC(DIKSAVE,.DIKDASV,"","","Kx"_$EXTRACT("RI",$DATA(DIFROM)#2+1)_$EXTRACT("s",$GET(DIK(0))["s"))
+8 GOTO Q
+9 ;
EN ;One entry, KILL then SET
+1 NEW DIKCRFIL,DIKCDIK,DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKALLR
+2 ;re-indexing
DO DIK0
DO N(1)
if '$DATA(DH)!'$DATA(DA)
GOTO Q
+3 SET DIKCRFIL=DH
MERGE DIKCDIK=DIK
+4 SET DIKNM=1
SET X=2
if $DATA(DIKNX)
DO PR
DO 1^DIK1
+5 ;
EN1 ;One entry, SET (X=1)
+1 NEW DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKALLR
+2 ;re-indexing
DO DIK0
DO @$SELECT('$DATA(DIKNM):"N(1)",1:"DIKJ")
if '$DATA(DH)!'$DATA(DA)
GOTO Q
+3 IF '$DATA(DIKNM)
NEW DIKCRFIL,DIKCDIK
SET DIKCRFIL=DH
MERGE DIKCDIK=DIK
+4 SET X=1
if $DATA(DIKNX)
DO PR
DO 1^DIK1
+5 IF $DATA(^DD("IX","AC",DIKCRFIL))
MERGE DIK=DIKCDIK
DO INDEX^DIKC(DIKCRFIL,.DA,$PIECE(DIK(1),U),$PIECE(DIK(1),U,2,999),$EXTRACT("K",$DATA(DIKNM))_"S"_$EXTRACT("RI",$DATA(DIFROM)#2+1))
+6 GOTO Q
+7 ;
EN2 ;One entry, KILL (X=2)
+1 NEW DIKCRFIL,DIKCDIK,DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKALLR
+2 ;re-indexing
DO DIK0
DO N(1)
if '$DATA(DH)!'$DATA(DA)
GOTO Q
+3 SET DIKCRFIL=DH
MERGE DIKCDIK=DIK
+4 SET X=2
if $DATA(DIKNX)
DO PR
DO 1^DIK1
+5 IF $DATA(^DD("IX","AC",DIKCRFIL))
MERGE DIK=DIKCDIK
DO INDEX^DIKC(DIKCRFIL,.DA,$PIECE(DIK(1),U),$PIECE(DIK(1),U,2,999),"K"_$EXTRACT("RI",$DATA(DIFROM)#2+1))
+6 GOTO Q
+7 ;
ENALL ;All entries, SET (X=1)
+1 NEW DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKXREF,DIKDASV,DIKSAVE,DHSAVE,DIKALLR
+2 ;no re-indexing
DO DIK0
DO N(0)
if '$DATA(DH)
GOTO Q
+3 MERGE DIKDASV=DA,DIKSAVE=DIK,DHSAVE=DH
SET DIKDASV=0
+4 SET (DA,DCNT)=0
SET X=1
DO PR
DO CNT^DIK1
+5 if $DATA(^DD("IX","AC",DHSAVE))
DO INDEX^DIKC(DHSAVE,.DIKDASV,$PIECE(DIKSAVE(1),U),$PIECE(DIKSAVE(1),U,2,999),"Sx"_$EXTRACT("RI",$DATA(DIFROM)#2+1))
+6 GOTO Q
+7 ;
ENALL2 ;All entries, KILL (X=2)
+1 NEW DIKJ,DIKS,DIKZ1,DIN,DH,DU,DV,DW,DIKDA,DIKXREF,DIKDASV,DIKSAVE,DHSAVE,DIKALLR
+2 ;no re-indexing
DO DIK0
DO N(0)
if '$DATA(DH)
GOTO Q
+3 MERGE DIKDASV=DA,DIKSAVE=DIK,DHSAVE=DH
SET DIKDASV=0
+4 SET DIKALLR=1
SET (DA,DCNT)=0
SET X=2
DO PR
DO CNT^DIK1
+5 if $DATA(^DD("IX","AC",DHSAVE))
DO INDEX^DIKC(DHSAVE,.DIKDASV,$PIECE(DIKSAVE(1),U),$PIECE(DIKSAVE(1),U,2,999),"Kx"_$EXTRACT("RI",$DATA(DIFROM)#2+1))
+6 GOTO Q
+7 ;
+8 ;
N(REINDOK) if '$DATA(DIK)!'$DATA(DIK(1))!'$DATA(@(DIK_"0)"))
QUIT
DO DIKJ
SET DIKND=$PIECE(DIK(1),U)
+1 IF '$DATA(^DD(DH,"IX",DIKND))
if '$DATA(^DD("IX","F",DH,DIKND))
KILL DH
QUIT
+2 IF $PIECE(DIK(1),U,2)=""
Begin DoDot:1
+3 ;SKIP NON-RERUNNABLE INDEX IF NOT SPECIFIED PRECISELY AND IF THIS IS A MASS REINDEX
SET %=0
FOR A1=1:1
SET %=$ORDER(^DD(DH,DIKND,1,%))
if '%
QUIT
IF '$GET(^(%,"NOREINDEX"))!REINDOK
SET DIKNX(A1)=%
End DoDot:1
+4 IF '$TEST
FOR A1=1:1
if $PIECE(DIK(1),U,A1+1)=""
QUIT
SET DIKNX(A1)=$PIECE(DIK(1),U,A1+1)
+5 KILL A1,%
QUIT
+6 ;
PR SET DV=DIKND
IF '$DATA(^DD(DH,"IX",DV))
IF '$DATA(^DD(DH,"AUDIT",DV))
QUIT
+1 ; - VEN/SMH
DO 0
SET DIKZ1=$ORDER(DIKNX(0))
if DIKZ1
DO CK
KILL DIKZ1
+2 if $DATA(^DD(DH,"AUDIT",DV))
DO A1
SET DU=1
QUIT
+3 ;
CK if '$DATA(DIKNX(+DIKZ1))
QUIT
+1 FOR DW=0:0
SET DW=$ORDER(^DD(DH,DV,1,DW))
if DW'>0
QUIT
IF $DATA(^(DW,0))
IF (DW=DIKNX(DIKZ1))!($PIECE(^(0),U,2)=DIKNX(DIKZ1))
IF $DATA(^(X))
IF "Q"'[^(X)
SET %=^(0)
DO INX
+2 SET DIKZ1=$ORDER(DIKNX(+DIKZ1))
GOTO CK
+3 ;
FREE(X) NEW V
SET V=$GET(^UTILITY("DIK",X))
IF 'V
QUIT 1
+1 QUIT $HOROLOG-1>V
+2 ;
DIKJ ;TO ENABLE RECURSIVE CALL, FIND A "$J" THAT'S UNUSED
FOR DIKJ=$JOB:.01
IF $$FREE(DIKJ)
KILL ^UTILITY("DIK",DIKJ)
SET ^UTILITY("DIK",DIKJ)=$HOROLOG
QUIT
INT KILL DIKS,DIN,DH,DU,DV,DW
SET U="^"
SET DH=+$PIECE(@(DIK_"0)"),U,2)
SET DH(1)=DH
QUIT
+1 ;
CHKS ;
+1 IF $DATA(@(DIK_"0)"))[0
SET DIKZ1=1
SET DIKGP="Q^DIK1"
QUIT
+2 SET DIKZ1=+$PIECE(^(0),"^",2)
IF DIKZ1
IF $DATA(^DD(DIKZ1,0,"DIK"))
IF $$ROUEXIST^DILIBF(^("DIK"))
SET DIKGP="^"_^DD(DIKZ1,0,"DIK")
QUIT
+3 KILL DIKZ1
QUIT
+4 ;
DIK0 ;MASS CROSS-REFERENCES SHOULD NOT FILL UP THE AUDIT FILE (^DIA)
IF '$DATA(DIK(0))
SET DIK(0)="A666"
+1 QUIT
+2 ;
Q if $GET(DIK(0))["A666"
KILL DIK(0)
KILL DIKND,DIKNX,DIKZ1,DIKNM,DIAU,DIG,DIH,DIV,DIW,%,DH
QUIT