- DIKC ;SFISC/MKO-FIRE INDEX FILE CROSS REFERENCES ;24OCT2012
- ;;22.0;VA FileMan;**1,22,11,68,95,146,167**;Mar 30, 1999;Build 20
- ;Per VHA Directive 2004-038, this routine should not be modified.
- ;
- INDEX(DIFILE,DIREC,DIFLD,DIXREF,DICTRL) ;Fire Index file xrefs
- N DA,DIF,DIKACT,DIKCT,DIKERR,DIKLOCK,DIKLOG,DIKON,DIKRFIL
- N DIKTMP,DIKVAL,DIMF,DIROOT
- ;
- ;Initialization
- S DIF=$E("D",$G(DICTRL)["D")
- I DIF["D",'$D(DIQUIET) N DIQUIET S DIQUIET=1
- I DIF["D",'$D(DIFM) N DIFM S DIFM=1 D INIZE^DIEFU
- ;
- ;Check (and convert) input parameters
- D CHK^DIKC2 G:$G(DIKERR)]"" EXIT
- ;
- ;Setup variables
- S DIKCT=$E("C",$G(DICTRL)["C")_$E("T",$G(DICTRL)["T")
- S DIKLOG=$E("K",$G(DICTRL)["K")_$E("S",$G(DICTRL)["S")
- S:DIKLOG="" DIKLOG=$E("K",DIKCT'["C")_$E("S",DIKCT'["T")
- S DIKACT=$E("R",$G(DICTRL)["R")_$E("I",$G(DICTRL)["I")
- S DIKRFIL=$S($G(DICTRL)["W":+$P(DICTRL,"W",2),1:DIFILE)
- I $G(DICTRL)["k" D
- . S DIKLOCK=+$P(DICTRL,"k",2)\1
- . S:DIKLOCK<0 DIKLOCK=-DIKLOCK
- . S:$E($P(DICTRL,"k",2))="-" DIKLOCK("STOP")=1
- E S DIKLOCK=1
- ;
- LOAD ;Load xref information into @DIKTMP
- S DIKTMP=$G(DICTRL("LOGIC"))
- I $G(DIKTMP)="" D
- . S DIKTMP=$$GETTMP^DIKC1("DIKC")
- . I $G(DIXREF)?."^" D
- .. I $G(DIFLD) D
- ...D LOADFLD^DIKC1(DIKRFIL,DIFLD,DIKLOG_"W",DIKACT,DIKVAL,DIKTMP,DIKTMP,$E("i",$G(DICTRL)["i"),,$E("x",$G(DICTRL)["x"))
- .. E D LOADALL^DIKC1(DIKRFIL,DIKLOG,DIKACT,DIKVAL,DIKTMP,$E("s",$G(DICTRL)["s")_$E("i",$G(DICTRL)["i")_$E("x",$G(DICTRL)["x"),.DIMF)
- . E D LOADXREF^DIKC1(DIKRFIL,$G(DIFLD),DIKLOG,.DIXREF,DIKVAL,DIKTMP)
- ;
- D:DIKRFIL'=DIFILE SBINFO^DIKCU(DIKRFIL,.DIMF)
- ;
- ;Fire the xrefs for all records or the record specified in DA
- I 'DA D
- . L +@DIROOT:DIKLOCK E D Q:$G(DIKLOCK("STOP"))
- .. S DIKLOCK=""
- .. D:DIF["D" ERR^DIKCU2(112,DIFILE)
- . D FIREALL(DIFILE,.DA,DIROOT,DIKLOG,.DIMF,DIKTMP,DIKON,"",DIKCT)
- . L:DIKLOCK]"" -@DIROOT
- E D
- . L +@DIROOT@(DA):DIKLOCK E D Q:$G(DIKLOCK("STOP"))
- .. S DIKLOCK=""
- .. D:DIF["D" ERR^DIKCU2(110,DIFILE,$$IENS^DIKCU(DIFILE,.DA))
- . D:$D(@DIKTMP@(DIFILE)) FIRE(DIFILE,.DA,DIKLOG,DIKTMP,DIKON,"",DIKCT)
- . D:$D(DIMF(DIFILE)) FIRESUB(DIFILE,.DA,DIROOT,DIKLOG,.DIMF,DIKTMP,DIKON,"",DIKCT)
- . L:DIKLOCK]"" -@DIROOT@(DA)
- ;
- ;Cleanup ^TMP
- K @DIKTMP
- ;
- EXIT ;Move error messages if necessary
- I DIF["D",$G(DIERR),$G(DICTRL("MSG"))]"" D CALLOUT^DIEFU(DICTRL("MSG"))
- Q
- ;
- FIREALL(DIFILE,DA,DIROOT,DILOG,DIMF,DIKTMP,DIKON,DIKEY,DIKCT) ;Fire xrefs, all recs
- N DICNT,DIIENS,DILAST,DIXR
- S DILOG=$G(DILOG),DIKON=$G(DIKON)
- S DIIENS=$$IENS^DIKCU(DIFILE,.DA)
- ;
- ;Kill entire indexes
- I DILOG["K",$D(@DIKTMP@("KW",DIFILE)) D XECKW(DIFILE,.DA,$D(DIMF(DIFILE))>0)
- I '$D(@DIKTMP@(DIFILE)),'$D(DIMF(DIFILE)) Q
- ;
- ;Loop through all records in the file
- S (DICNT,DA)=0 F S DA=$O(@DIROOT@(DA)) Q:DA'=+DA D
- . S $P(DIIENS,",")=DA
- . S DICNT=DICNT+1
- . D:$D(@DIKTMP@(DIFILE)) FIRE(DIFILE,.DA,DILOG,DIKTMP,DIKON,.DIKEY,DIKCT,DIIENS)
- . D:$D(DIMF(DIFILE)) FIRESUB(DIFILE,.DA,DIROOT,DILOG,.DIMF,DIKTMP,DIKON,.DIKEY,DIKCT)
- ;
- ;Update header node
- I $D(@DIROOT@(0))#2 D
- . S DILAST=$O(@DIROOT@(" "),-1) S:'DILAST DILAST=""
- . S:'DICNT DICNT=""
- . S $P(@DIROOT@(0),U,4)=DICNT ;**DI*22*146
- Q
- ;
- FIRE(DIFILE,DA,DILOG,DIKTMP,DIKON,DIKEY,DIKCT,DIIENS) ;Fire xrefs, one record
- N DI01,DIKCLOG,DINULL,DION,DIXR,I,J,X,X2,XN
- S DILOG=$G(DILOG),DIKON=$G(DIKON)
- S:$G(DIIENS)="" DIIENS=$$IENS^DIKCU(DIFILE,.DA)
- ;
- I DIKON="" S DIXR=0 F S DIXR=$O(@DIKTMP@(DIFILE,DIXR)) Q:DIXR'=+DIXR D
- . D SETXARR(DIFILE,DIXR,DIKTMP,.DINULL) Q:DINULL
- . I $G(DIKCT)="" D XECUTE(DIFILE,DIXR,DILOG,.X,.X,DIKTMP) Q
- . ;
- . K XN S XN="",I=0 F S I=$O(X(I)) Q:'I S XN(I)=""
- . I $G(DIKCT)="C" D XECUTE(DIFILE,DIXR,"S",.XN,.X,DIKTMP) Q
- . I $G(DIKCT)="T" D XECUTE(DIFILE,DIXR,"K",.X,.XN,DIKTMP) Q
- ;
- E S DIXR=0 F S DIXR=$O(@DIKTMP@(DIFILE,DIXR)) Q:DIXR'=+DIXR D
- . K DINFLD
- . S DIKCLOG=""
- . ;
- . ;Set X2 array to new values
- . S DION=$P(DIKON,U,2)
- . D SETXARR(DIFILE,DIXR,DIKTMP,.DINULL,DION) M X2=X
- . ;
- . ;If SET requested, make sure no new values are null
- . I DILOG["S" D
- .. I 'DINULL S DIKCLOG="S"
- .. E I $P(DIKON,U,4)="N" S I=0 F S I=$O(^DD("KEY","AU",DIXR,I)) Q:'I D
- ... S DIKEY(DIFILE,I,DIIENS)="n"
- ... S J=0 F S J=$O(DINULL(J)) Q:'J S DIKEY(DIFILE,I,DIIENS,$P(DINULL(J),U),$P(DINULL(J),U,2))=$P(DINULL(J),U,3)
- . ;
- . ;Set X array to old values
- . S DION=$P(DIKON,U)
- . D SETXARR(DIFILE,DIXR,DIKTMP,.DINULL,DION,.DI01)
- . ;
- . ;If KILL requested, make sure no old values are null
- . I DILOG["K",'DINULL S DIKCLOG="K"_DIKCLOG
- . ;
- . ;If "C" flag, set old .01 value to null
- . I $G(DIKCT)="C",$D(DI01) D
- .. S I=0 F S I=$O(DI01(I)) Q:'I S X(I)=""
- .. S:$O(DI01(0))=$O(X(0)) X=""
- .. S DIKCLOG=$TR(DIKCLOG,"K")
- . ;
- . ;If "T" flag, set all new values to null
- . I $G(DIKCT)="T" S X2="",I=0 F S I=$O(X2(I)) Q:'I S X2(I)=""
- . ;
- . ;Execute the kill and set logic
- . D XECUTE(DIFILE,DIXR,DIKCLOG,.X,.X2,DIKTMP)
- . ;
- . I DIKCLOG["S",$P(DIKON,U,3)="K",$D(^DD("KEY","AU",DIXR)) D
- .. Q:$$UNIQUE^DIKK2(DIFILE,DIXR,.X2,.DA,DIKTMP)
- .. S I=0 F S I=$O(^DD("KEY","AU",DIXR,I)) Q:'I S DIKEY(DIFILE,I,DIIENS)=""
- Q
- ;
- FIRESUB(DIFILE,DA,DIROOT,DILOG,DIMF,DIKTMP,DIKON,DIKEY,DIKCT) ;Fire xrefs for
- ;all subfiles under DIFILE, for all subrecords under DA
- Q:'$D(DIMF(DIFILE))
- N DIMULTF,DISBFILE,DISBROOT,X
- S DILOG=$G(DILOG),DIKON=$G(DIKON)
- ;
- ;Push down the DA array
- D PUSHDA^DIKCU(.DA)
- ;
- ;Loop through DIMF array and fire xrefs for subfiles
- S DIMULTF=0 F S DIMULTF=$O(DIMF(DIFILE,DIMULTF)) Q:'DIMULTF D
- . S DISBROOT=$NA(@DIROOT@(DA(1),DIMF(DIFILE,DIMULTF))) Q:'$D(@DISBROOT)
- . S DISBFILE=DIMF(DIFILE,DIMULTF,0)
- . D FIREALL(DISBFILE,.DA,DISBROOT,DILOG,.DIMF,DIKTMP,DIKON,.DIKEY,DIKCT)
- ;
- ;Pop the DA array
- D POPDA^DIKCU(.DA)
- Q
- ;
- XECUTE(DIFILE,DIXR,DILOG,DIKCX1,DIKCX2,DIKTMP) ;Xecute the logic in ^TMP
- Q:$G(DILOG)=""
- N DIKCOD,DIKCON,X,X1,X2
- ;
- ;Execute kill logic
- I DILOG["K" D
- . S DIKCOD=$G(@DIKTMP@(DIFILE,DIXR,"K")) Q:DIKCOD?."^"
- . S DIKCON=$G(@DIKTMP@(DIFILE,DIXR,"KC"))
- . I DIKCON'?."^" M X=DIKCX1,X1=DIKCX1,X2=DIKCX2 X DIKCON Q:'$G(X) K X,X1,X2
- . M X=DIKCX1,X1=DIKCX1,X2=DIKCX2
- . X DIKCOD K X,X1,X2
- ;
- ;Execute set logic
- I DILOG["S" D
- . S DIKCOD=$G(@DIKTMP@(DIFILE,DIXR,"S")) Q:DIKCOD?."^"
- . S DIKCON=$G(@DIKTMP@(DIFILE,DIXR,"SC"))
- . I DIKCON'?."^" M X=DIKCX2,X1=DIKCX1,X2=DIKCX2 X DIKCON Q:'$G(X) K X,X1,X2
- . M X=DIKCX2,X1=DIKCX1,X2=DIKCX2
- . X DIKCOD
- Q
- ;
- XECKW(DIFILE,DA,DIKSUB) ;Execute the logic to kill the entire index
- N DIKFIL,DIKKW,DIKKW0,DIKLDIF,DIXR
- ;
- S DIXR=0 F S DIXR=$O(@DIKTMP@("KW",DIFILE,DIXR)) Q:DIXR'=+DIXR D
- . S DIKKW=$G(@DIKTMP@("KW",DIFILE,DIXR)) Q:DIKKW?."^"
- . S DIKKW0=$G(@DIKTMP@("KW",DIFILE,DIXR,0))
- . ;
- . ;If not a whole file xref, kill the entire index and quit
- . I DIKKW0="" X DIKKW D Q
- .. I '$D(@DIKTMP@(DIFILE,DIXR,"S")) K @DIKTMP@(DIFILE,DIXR)
- .. E K @DIKTMP@(DIFILE,DIXR,"K"),@DIKTMP@(DIFILE,DIXR,"KC")
- . ;
- . ;Quit if this isn't a whole file xref or we're not doing subfiles
- . Q:$P(DIKKW0,U)'="W"!'$G(DIKSUB)
- . ;
- . ;Kill the whole index after pushing DA the appropriate amount
- . S DIKFIL=$P(DIKKW0,U,2),DIKLDIF=$P(DIKKW0,U,3)
- . D PUSHDA^DIKCU(.DA,DIKLDIF)
- . X DIKKW
- . I '$D(@DIKTMP@(DIKFIL,DIXR,"S")) K @DIKTMP@(DIKFIL,DIXR)
- . E K @DIKTMP@(DIKFIL,DIXR,"K"),@DIKTMP@(DIKFIL,DIXR,"KC")
- . D POPDA^DIKCU(.DA,DIKLDIF)
- Q
- ;
- SETXARR(DIFILE,DIXR,DIKTMP,DINULL,DION,DI01) ;Loop through DIKTMP and set X array.
- ;If any values used as subscripts are null, return
- ; DINULL=1
- ; DINULL(order#) = ""
- ; or file^field^levDiff (for field type subscripts)
- ; DI01(order#) = "" if order # is .01 field
- ;
- N DIKCX,DIKF,DIKO,X1,X2
- K X,DI01,DINULL
- S DINULL=0,(DIKF,DIKO)=$O(@DIKTMP@(DIFILE,DIXR,0)) Q:'DIKF
- ;
- S:$G(DION)="" DION=U
- F D S DIKO=$O(@DIKTMP@(DIFILE,DIXR,DIKO)) Q:'DIKO
- . K DIKCX M DIKCX=X
- . X $G(@DIKTMP@(DIFILE,DIXR,DIKO))
- . I $G(X)]"",$D(@DIKTMP@(DIFILE,DIXR,DIKO,"T")) X @DIKTMP@(DIFILE,DIXR,DIKO,"T")
- . S:$D(X)#2 (DIKCX,DIKCX(DIKO))=X K X M X=DIKCX
- . S:$P($G(@DIKTMP@(DIFILE,DIXR,DIKO,"F")),U,2)=.01 DI01(DIKO)=""
- . I $G(X(DIKO))="",$G(@DIKTMP@(DIFILE,DIXR,DIKO,"SS")) S DINULL=1 S:$G(@DIKTMP@(DIFILE,DIXR,DIKO,"F")) DINULL(DIKO)=@DIKTMP@(DIFILE,DIXR,DIKO,"F")
- ;
- S:$D(X(DIKF))#2 X=$G(X(DIKF))
- Q
- ;
- ;#110 The record is currently locked.
- ;#112 The file is currently locked.
- DIKC ;SFISC/MKO-FIRE INDEX FILE CROSS REFERENCES ;24OCT2012
- +1 ;;22.0;VA FileMan;**1,22,11,68,95,146,167**;Mar 30, 1999;Build 20
- +2 ;Per VHA Directive 2004-038, this routine should not be modified.
- +3 ;
- INDEX(DIFILE,DIREC,DIFLD,DIXREF,DICTRL) ;Fire Index file xrefs
- +1 NEW DA,DIF,DIKACT,DIKCT,DIKERR,DIKLOCK,DIKLOG,DIKON,DIKRFIL
- +2 NEW DIKTMP,DIKVAL,DIMF,DIROOT
- +3 ;
- +4 ;Initialization
- +5 SET DIF=$EXTRACT("D",$GET(DICTRL)["D")
- +6 IF DIF["D"
- IF '$DATA(DIQUIET)
- NEW DIQUIET
- SET DIQUIET=1
- +7 IF DIF["D"
- IF '$DATA(DIFM)
- NEW DIFM
- SET DIFM=1
- DO INIZE^DIEFU
- +8 ;
- +9 ;Check (and convert) input parameters
- +10 DO CHK^DIKC2
- IF $GET(DIKERR)]""
- GOTO EXIT
- +11 ;
- +12 ;Setup variables
- +13 SET DIKCT=$EXTRACT("C",$GET(DICTRL)["C")_$EXTRACT("T",$GET(DICTRL)["T")
- +14 SET DIKLOG=$EXTRACT("K",$GET(DICTRL)["K")_$EXTRACT("S",$GET(DICTRL)["S")
- +15 IF DIKLOG=""
- SET DIKLOG=$EXTRACT("K",DIKCT'["C")_$EXTRACT("S",DIKCT'["T")
- +16 SET DIKACT=$EXTRACT("R",$GET(DICTRL)["R")_$EXTRACT("I",$GET(DICTRL)["I")
- +17 SET DIKRFIL=$SELECT($GET(DICTRL)["W":+$PIECE(DICTRL,"W",2),1:DIFILE)
- +18 IF $GET(DICTRL)["k"
- Begin DoDot:1
- +19 SET DIKLOCK=+$PIECE(DICTRL,"k",2)\1
- +20 IF DIKLOCK<0
- SET DIKLOCK=-DIKLOCK
- +21 IF $EXTRACT($PIECE(DICTRL,"k",2))="-"
- SET DIKLOCK("STOP")=1
- End DoDot:1
- +22 IF '$TEST
- SET DIKLOCK=1
- +23 ;
- LOAD ;Load xref information into @DIKTMP
- +1 SET DIKTMP=$GET(DICTRL("LOGIC"))
- +2 IF $GET(DIKTMP)=""
- Begin DoDot:1
- +3 SET DIKTMP=$$GETTMP^DIKC1("DIKC")
- +4 IF $GET(DIXREF)?."^"
- Begin DoDot:2
- +5 IF $GET(DIFLD)
- Begin DoDot:3
- +6 DO LOADFLD^DIKC1(DIKRFIL,DIFLD,DIKLOG_"W",DIKACT,DIKVAL,DIKTMP,DIKTMP,$EXTRACT("i",$GET(DICTRL)["i"),,$EXTRACT("x",$GET(DICTRL)["x"))
- End DoDot:3
- +7 IF '$TEST
- DO LOADALL^DIKC1(DIKRFIL,DIKLOG,DIKACT,DIKVAL,DIKTMP,$EXTRACT("s",$GET(DICTRL)["s")_$EXTRACT("i",$GET(DICTRL)["i")_$EXTRACT("x",$GET(DICTRL)["x"),.DIMF)
- End DoDot:2
- +8 IF '$TEST
- DO LOADXREF^DIKC1(DIKRFIL,$GET(DIFLD),DIKLOG,.DIXREF,DIKVAL,DIKTMP)
- End DoDot:1
- +9 ;
- +10 IF DIKRFIL'=DIFILE
- DO SBINFO^DIKCU(DIKRFIL,.DIMF)
- +11 ;
- +12 ;Fire the xrefs for all records or the record specified in DA
- +13 IF 'DA
- Begin DoDot:1
- +14 LOCK +@DIROOT:DIKLOCK
- IF '$TEST
- Begin DoDot:2
- +15 SET DIKLOCK=""
- +16 IF DIF["D"
- DO ERR^DIKCU2(112,DIFILE)
- End DoDot:2
- IF $GET(DIKLOCK("STOP"))
- QUIT
- +17 DO FIREALL(DIFILE,.DA,DIROOT,DIKLOG,.DIMF,DIKTMP,DIKON,"",DIKCT)
- +18 IF DIKLOCK]""
- LOCK -@DIROOT
- End DoDot:1
- +19 IF '$TEST
- Begin DoDot:1
- +20 LOCK +@DIROOT@(DA):DIKLOCK
- IF '$TEST
- Begin DoDot:2
- +21 SET DIKLOCK=""
- +22 IF DIF["D"
- DO ERR^DIKCU2(110,DIFILE,$$IENS^DIKCU(DIFILE,.DA))
- End DoDot:2
- IF $GET(DIKLOCK("STOP"))
- QUIT
- +23 IF $DATA(@DIKTMP@(DIFILE))
- DO FIRE(DIFILE,.DA,DIKLOG,DIKTMP,DIKON,"",DIKCT)
- +24 IF $DATA(DIMF(DIFILE))
- DO FIRESUB(DIFILE,.DA,DIROOT,DIKLOG,.DIMF,DIKTMP,DIKON,"",DIKCT)
- +25 IF DIKLOCK]""
- LOCK -@DIROOT@(DA)
- End DoDot:1
- +26 ;
- +27 ;Cleanup ^TMP
- +28 KILL @DIKTMP
- +29 ;
- EXIT ;Move error messages if necessary
- +1 IF DIF["D"
- IF $GET(DIERR)
- IF $GET(DICTRL("MSG"))]""
- DO CALLOUT^DIEFU(DICTRL("MSG"))
- +2 QUIT
- +3 ;
- FIREALL(DIFILE,DA,DIROOT,DILOG,DIMF,DIKTMP,DIKON,DIKEY,DIKCT) ;Fire xrefs, all recs
- +1 NEW DICNT,DIIENS,DILAST,DIXR
- +2 SET DILOG=$GET(DILOG)
- SET DIKON=$GET(DIKON)
- +3 SET DIIENS=$$IENS^DIKCU(DIFILE,.DA)
- +4 ;
- +5 ;Kill entire indexes
- +6 IF DILOG["K"
- IF $DATA(@DIKTMP@("KW",DIFILE))
- DO XECKW(DIFILE,.DA,$DATA(DIMF(DIFILE))>0)
- +7 IF '$DATA(@DIKTMP@(DIFILE))
- IF '$DATA(DIMF(DIFILE))
- QUIT
- +8 ;
- +9 ;Loop through all records in the file
- +10 SET (DICNT,DA)=0
- FOR
- SET DA=$ORDER(@DIROOT@(DA))
- IF DA'=+DA
- QUIT
- Begin DoDot:1
- +11 SET $PIECE(DIIENS,",")=DA
- +12 SET DICNT=DICNT+1
- +13 IF $DATA(@DIKTMP@(DIFILE))
- DO FIRE(DIFILE,.DA,DILOG,DIKTMP,DIKON,.DIKEY,DIKCT,DIIENS)
- +14 IF $DATA(DIMF(DIFILE))
- DO FIRESUB(DIFILE,.DA,DIROOT,DILOG,.DIMF,DIKTMP,DIKON,.DIKEY,DIKCT)
- End DoDot:1
- +15 ;
- +16 ;Update header node
- +17 IF $DATA(@DIROOT@(0))#2
- Begin DoDot:1
- +18 SET DILAST=$ORDER(@DIROOT@(" "),-1)
- IF 'DILAST
- SET DILAST=""
- +19 IF 'DICNT
- SET DICNT=""
- +20 ;**DI*22*146
- SET $PIECE(@DIROOT@(0),U,4)=DICNT
- End DoDot:1
- +21 QUIT
- +22 ;
- FIRE(DIFILE,DA,DILOG,DIKTMP,DIKON,DIKEY,DIKCT,DIIENS) ;Fire xrefs, one record
- +1 NEW DI01,DIKCLOG,DINULL,DION,DIXR,I,J,X,X2,XN
- +2 SET DILOG=$GET(DILOG)
- SET DIKON=$GET(DIKON)
- +3 IF $GET(DIIENS)=""
- SET DIIENS=$$IENS^DIKCU(DIFILE,.DA)
- +4 ;
- +5 IF DIKON=""
- SET DIXR=0
- FOR
- SET DIXR=$ORDER(@DIKTMP@(DIFILE,DIXR))
- IF DIXR'=+DIXR
- QUIT
- Begin DoDot:1
- +6 DO SETXARR(DIFILE,DIXR,DIKTMP,.DINULL)
- IF DINULL
- QUIT
- +7 IF $GET(DIKCT)=""
- DO XECUTE(DIFILE,DIXR,DILOG,.X,.X,DIKTMP)
- QUIT
- +8 ;
- +9 KILL XN
- SET XN=""
- SET I=0
- FOR
- SET I=$ORDER(X(I))
- IF 'I
- QUIT
- SET XN(I)=""
- +10 IF $GET(DIKCT)="C"
- DO XECUTE(DIFILE,DIXR,"S",.XN,.X,DIKTMP)
- QUIT
- +11 IF $GET(DIKCT)="T"
- DO XECUTE(DIFILE,DIXR,"K",.X,.XN,DIKTMP)
- QUIT
- End DoDot:1
- +12 ;
- +13 IF '$TEST
- SET DIXR=0
- FOR
- SET DIXR=$ORDER(@DIKTMP@(DIFILE,DIXR))
- IF DIXR'=+DIXR
- QUIT
- Begin DoDot:1
- +14 KILL DINFLD
- +15 SET DIKCLOG=""
- +16 ;
- +17 ;Set X2 array to new values
- +18 SET DION=$PIECE(DIKON,U,2)
- +19 DO SETXARR(DIFILE,DIXR,DIKTMP,.DINULL,DION)
- MERGE X2=X
- +20 ;
- +21 ;If SET requested, make sure no new values are null
- +22 IF DILOG["S"
- Begin DoDot:2
- +23 IF 'DINULL
- SET DIKCLOG="S"
- +24 IF '$TEST
- IF $PIECE(DIKON,U,4)="N"
- SET I=0
- FOR
- SET I=$ORDER(^DD("KEY","AU",DIXR,I))
- IF 'I
- QUIT
- Begin DoDot:3
- +25 SET DIKEY(DIFILE,I,DIIENS)="n"
- +26 SET J=0
- FOR
- SET J=$ORDER(DINULL(J))
- IF 'J
- QUIT
- SET DIKEY(DIFILE,I,DIIENS,$PIECE(DINULL(J),U),$PIECE(DINULL(J),U,2))=$PIECE(DINULL(J),U,3)
- End DoDot:3
- End DoDot:2
- +27 ;
- +28 ;Set X array to old values
- +29 SET DION=$PIECE(DIKON,U)
- +30 DO SETXARR(DIFILE,DIXR,DIKTMP,.DINULL,DION,.DI01)
- +31 ;
- +32 ;If KILL requested, make sure no old values are null
- +33 IF DILOG["K"
- IF 'DINULL
- SET DIKCLOG="K"_DIKCLOG
- +34 ;
- +35 ;If "C" flag, set old .01 value to null
- +36 IF $GET(DIKCT)="C"
- IF $DATA(DI01)
- Begin DoDot:2
- +37 SET I=0
- FOR
- SET I=$ORDER(DI01(I))
- IF 'I
- QUIT
- SET X(I)=""
- +38 IF $ORDER(DI01(0))=$ORDER(X(0))
- SET X=""
- +39 SET DIKCLOG=$TRANSLATE(DIKCLOG,"K")
- End DoDot:2
- +40 ;
- +41 ;If "T" flag, set all new values to null
- +42 IF $GET(DIKCT)="T"
- SET X2=""
- SET I=0
- FOR
- SET I=$ORDER(X2(I))
- IF 'I
- QUIT
- SET X2(I)=""
- +43 ;
- +44 ;Execute the kill and set logic
- +45 DO XECUTE(DIFILE,DIXR,DIKCLOG,.X,.X2,DIKTMP)
- +46 ;
- +47 IF DIKCLOG["S"
- IF $PIECE(DIKON,U,3)="K"
- IF $DATA(^DD("KEY","AU",DIXR))
- Begin DoDot:2
- +48 IF $$UNIQUE^DIKK2(DIFILE,DIXR,.X2,.DA,DIKTMP)
- QUIT
- +49 SET I=0
- FOR
- SET I=$ORDER(^DD("KEY","AU",DIXR,I))
- IF 'I
- QUIT
- SET DIKEY(DIFILE,I,DIIENS)=""
- End DoDot:2
- End DoDot:1
- +50 QUIT
- +51 ;
- FIRESUB(DIFILE,DA,DIROOT,DILOG,DIMF,DIKTMP,DIKON,DIKEY,DIKCT) ;Fire xrefs for
- +1 ;all subfiles under DIFILE, for all subrecords under DA
- +2 IF '$DATA(DIMF(DIFILE))
- QUIT
- +3 NEW DIMULTF,DISBFILE,DISBROOT,X
- +4 SET DILOG=$GET(DILOG)
- SET DIKON=$GET(DIKON)
- +5 ;
- +6 ;Push down the DA array
- +7 DO PUSHDA^DIKCU(.DA)
- +8 ;
- +9 ;Loop through DIMF array and fire xrefs for subfiles
- +10 SET DIMULTF=0
- FOR
- SET DIMULTF=$ORDER(DIMF(DIFILE,DIMULTF))
- IF 'DIMULTF
- QUIT
- Begin DoDot:1
- +11 SET DISBROOT=$NAME(@DIROOT@(DA(1),DIMF(DIFILE,DIMULTF)))
- IF '$DATA(@DISBROOT)
- QUIT
- +12 SET DISBFILE=DIMF(DIFILE,DIMULTF,0)
- +13 DO FIREALL(DISBFILE,.DA,DISBROOT,DILOG,.DIMF,DIKTMP,DIKON,.DIKEY,DIKCT)
- End DoDot:1
- +14 ;
- +15 ;Pop the DA array
- +16 DO POPDA^DIKCU(.DA)
- +17 QUIT
- +18 ;
- XECUTE(DIFILE,DIXR,DILOG,DIKCX1,DIKCX2,DIKTMP) ;Xecute the logic in ^TMP
- +1 IF $GET(DILOG)=""
- QUIT
- +2 NEW DIKCOD,DIKCON,X,X1,X2
- +3 ;
- +4 ;Execute kill logic
- +5 IF DILOG["K"
- Begin DoDot:1
- +6 SET DIKCOD=$GET(@DIKTMP@(DIFILE,DIXR,"K"))
- IF DIKCOD?."^"
- QUIT
- +7 SET DIKCON=$GET(@DIKTMP@(DIFILE,DIXR,"KC"))
- +8 IF DIKCON'?."^"
- MERGE X=DIKCX1,X1=DIKCX1,X2=DIKCX2
- XECUTE DIKCON
- IF '$GET(X)
- QUIT
- KILL X,X1,X2
- +9 MERGE X=DIKCX1,X1=DIKCX1,X2=DIKCX2
- +10 XECUTE DIKCOD
- KILL X,X1,X2
- End DoDot:1
- +11 ;
- +12 ;Execute set logic
- +13 IF DILOG["S"
- Begin DoDot:1
- +14 SET DIKCOD=$GET(@DIKTMP@(DIFILE,DIXR,"S"))
- IF DIKCOD?."^"
- QUIT
- +15 SET DIKCON=$GET(@DIKTMP@(DIFILE,DIXR,"SC"))
- +16 IF DIKCON'?."^"
- MERGE X=DIKCX2,X1=DIKCX1,X2=DIKCX2
- XECUTE DIKCON
- IF '$GET(X)
- QUIT
- KILL X,X1,X2
- +17 MERGE X=DIKCX2,X1=DIKCX1,X2=DIKCX2
- +18 XECUTE DIKCOD
- End DoDot:1
- +19 QUIT
- +20 ;
- XECKW(DIFILE,DA,DIKSUB) ;Execute the logic to kill the entire index
- +1 NEW DIKFIL,DIKKW,DIKKW0,DIKLDIF,DIXR
- +2 ;
- +3 SET DIXR=0
- FOR
- SET DIXR=$ORDER(@DIKTMP@("KW",DIFILE,DIXR))
- IF DIXR'=+DIXR
- QUIT
- Begin DoDot:1
- +4 SET DIKKW=$GET(@DIKTMP@("KW",DIFILE,DIXR))
- IF DIKKW?."^"
- QUIT
- +5 SET DIKKW0=$GET(@DIKTMP@("KW",DIFILE,DIXR,0))
- +6 ;
- +7 ;If not a whole file xref, kill the entire index and quit
- +8 IF DIKKW0=""
- XECUTE DIKKW
- Begin DoDot:2
- +9 IF '$DATA(@DIKTMP@(DIFILE,DIXR,"S"))
- KILL @DIKTMP@(DIFILE,DIXR)
- +10 IF '$TEST
- KILL @DIKTMP@(DIFILE,DIXR,"K"),@DIKTMP@(DIFILE,DIXR,"KC")
- End DoDot:2
- QUIT
- +11 ;
- +12 ;Quit if this isn't a whole file xref or we're not doing subfiles
- +13 IF $PIECE(DIKKW0,U)'="W"!'$GET(DIKSUB)
- QUIT
- +14 ;
- +15 ;Kill the whole index after pushing DA the appropriate amount
- +16 SET DIKFIL=$PIECE(DIKKW0,U,2)
- SET DIKLDIF=$PIECE(DIKKW0,U,3)
- +17 DO PUSHDA^DIKCU(.DA,DIKLDIF)
- +18 XECUTE DIKKW
- +19 IF '$DATA(@DIKTMP@(DIKFIL,DIXR,"S"))
- KILL @DIKTMP@(DIKFIL,DIXR)
- +20 IF '$TEST
- KILL @DIKTMP@(DIKFIL,DIXR,"K"),@DIKTMP@(DIKFIL,DIXR,"KC")
- +21 DO POPDA^DIKCU(.DA,DIKLDIF)
- End DoDot:1
- +22 QUIT
- +23 ;
- SETXARR(DIFILE,DIXR,DIKTMP,DINULL,DION,DI01) ;Loop through DIKTMP and set X array.
- +1 ;If any values used as subscripts are null, return
- +2 ; DINULL=1
- +3 ; DINULL(order#) = ""
- +4 ; or file^field^levDiff (for field type subscripts)
- +5 ; DI01(order#) = "" if order # is .01 field
- +6 ;
- +7 NEW DIKCX,DIKF,DIKO,X1,X2
- +8 KILL X,DI01,DINULL
- +9 SET DINULL=0
- SET (DIKF,DIKO)=$ORDER(@DIKTMP@(DIFILE,DIXR,0))
- IF 'DIKF
- QUIT
- +10 ;
- +11 IF $GET(DION)=""
- SET DION=U
- +12 FOR
- Begin DoDot:1
- +13 KILL DIKCX
- MERGE DIKCX=X
- +14 XECUTE $GET(@DIKTMP@(DIFILE,DIXR,DIKO))
- +15 IF $GET(X)]""
- IF $DATA(@DIKTMP@(DIFILE,DIXR,DIKO,"T"))
- XECUTE @DIKTMP@(DIFILE,DIXR,DIKO,"T")
- +16 IF $DATA(X)#2
- SET (DIKCX,DIKCX(DIKO))=X
- KILL X
- MERGE X=DIKCX
- +17 IF $PIECE($GET(@DIKTMP@(DIFILE,DIXR,DIKO,"F")),U,2)=.01
- SET DI01(DIKO)=""
- +18 IF $GET(X(DIKO))=""
- IF $GET(@DIKTMP@(DIFILE,DIXR,DIKO,"SS"))
- SET DINULL=1
- IF $GET(@DIKTMP@(DIFILE,DIXR,DIKO,"F"))
- SET DINULL(DIKO)=@DIKTMP@(DIFILE,DIXR,DIKO,"F")
- End DoDot:1
- SET DIKO=$ORDER(@DIKTMP@(DIFILE,DIXR,DIKO))
- IF 'DIKO
- QUIT
- +19 ;
- +20 IF $DATA(X(DIKF))#2
- SET X=$GET(X(DIKF))
- +21 QUIT
- +22 ;
- +23 ;#110 The record is currently locked.
- +24 ;#112 The file is currently locked.