| 1 | DIKC1 ;SFISC/MKO-LOAD XREF INFO ;8:19 AM  2 Aug 1999
 | 
|---|
| 2 |  ;;22.0;VA FileMan;**11**;Mar 30, 1999
 | 
|---|
| 3 |  ;Per VHA Directive 10-93-142, this routine should not be modified.
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 |  ;============================================
 | 
|---|
| 6 |  ; LOADALL(File,Log,Activ,ValRt,Tmp,Flag,.MF)
 | 
|---|
| 7 |  ;============================================
 | 
|---|
| 8 |  ;Load all xrefs for a file. Uses the "AC" index on Root File.
 | 
|---|
| 9 |  ;In:
 | 
|---|
| 10 |  ; RFIL  = Root File #
 | 
|---|
| 11 |  ; LOG   [ K : load kill logic
 | 
|---|
| 12 |  ;       [ S : load set logic
 | 
|---|
| 13 |  ; ACT   = Codes: IR
 | 
|---|
| 14 |  ;          If ACT '= null, a xref is picked up only if ACT
 | 
|---|
| 15 |  ;          and the Activity field (#.41) have codes in common.
 | 
|---|
| 16 |  ; VALRT = Array Ref where old/new values are located
 | 
|---|
| 17 |  ; TMP   = Root to store xref info
 | 
|---|
| 18 |  ; FLAG  [ s : don't include subfiles under file
 | 
|---|
| 19 |  ;       [ i : don't load index-type xrefs (only load whole file xrefs)
 | 
|---|
| 20 |  ;       [ f : don't load field-type xrefs
 | 
|---|
| 21 |  ;       [ r : don't load record-type xrefs
 | 
|---|
| 22 |  ;
 | 
|---|
| 23 |  ;Out:
 | 
|---|
| 24 |  ; MF(file#,mField#)   = multiple node
 | 
|---|
| 25 |  ; MF(file#,mField#,0) = subfile#
 | 
|---|
| 26 |  ;   Set only for those files/multiples that have xrefs
 | 
|---|
| 27 |  ;   and only if FLAG '[ "s"
 | 
|---|
| 28 |  ;
 | 
|---|
| 29 | LOADALL(RFIL,LOG,ACT,VALRT,TMP,FLAG,MF) ;
 | 
|---|
| 30 |  N XR
 | 
|---|
| 31 |  ;
 | 
|---|
| 32 |  ;Loop through "AC" index
 | 
|---|
| 33 |  S XR=0 F  S XR=$O(^DD("IX","AC",RFIL,XR)) Q:'XR  D
 | 
|---|
| 34 |  . ;Skip if no .01, wrong Activity, wrong Type, or wrong Execution
 | 
|---|
| 35 |  . I $P($G(^DD("IX",XR,0)),U)="" K ^DD("IX","AC",RFIL,XR) Q
 | 
|---|
| 36 |  . I $G(ACT)]"",$TR(ACT,$P(^DD("IX",XR,0),U,7),$TR($J("",$L($P(^(0),U,7)))," ","*"))'["*" Q
 | 
|---|
| 37 |  . I $G(FLAG)["i",$P(^DD("IX",XR,0),U,8)="I" Q
 | 
|---|
| 38 |  . I $G(FLAG)["f",$P(^DD("IX",XR,0),U,6)="F" Q
 | 
|---|
| 39 |  . I $G(FLAG)["r",$P(^DD("IX",XR,0),U,6)="R" Q
 | 
|---|
| 40 |  . ;
 | 
|---|
| 41 |  . ;Load xref
 | 
|---|
| 42 |  . D CRV^DIKC2(XR,$G(VALRT),TMP)
 | 
|---|
| 43 |  . D:$G(LOG)]"" LOG^DIKC2(XR,LOG,TMP)
 | 
|---|
| 44 |  . D:$G(LOG)["K" KW^DIKC2(XR,TMP)
 | 
|---|
| 45 |  Q:$G(FLAG)["s"
 | 
|---|
| 46 |  ;
 | 
|---|
| 47 |  ;Build info for all subfiles under FILE into arrays SB and MF
 | 
|---|
| 48 |  N CHK,FIL,MFLD,PAR,SB
 | 
|---|
| 49 |  D SUBFILES^DIKCU(RFIL,.SB,.MF)
 | 
|---|
| 50 |  ;
 | 
|---|
| 51 |  ;Load xref for each subfile
 | 
|---|
| 52 |  S:$G(FLAG)'["s" FLAG=$G(FLAG)_"s"
 | 
|---|
| 53 |  S SB=0 F  S SB=$O(SB(SB)) Q:'SB  D
 | 
|---|
| 54 |  . D LOADALL(SB,$G(LOG),$G(ACT),$G(VALRT),TMP,FLAG)
 | 
|---|
| 55 |  . Q:'$D(@TMP@(SB))
 | 
|---|
| 56 |  . ;
 | 
|---|
| 57 |  . ;Set CHK(f)="" flag for subfile and its antecedents
 | 
|---|
| 58 |  . S PAR=SB F  Q:$D(CHK(PAR))  S CHK(PAR)=1,PAR=$G(SB(PAR)) Q:PAR=""
 | 
|---|
| 59 |  ;
 | 
|---|
| 60 |  ;Use the CHK array to get rid of unneeded elements in MF
 | 
|---|
| 61 |  S FIL=0 F  S FIL=$O(MF(FIL)) Q:'FIL  D
 | 
|---|
| 62 |  . S MFLD=0 F  S MFLD=$O(MF(FIL,MFLD)) Q:'MFLD  D
 | 
|---|
| 63 |  .. K:'$D(CHK(MF(FIL,MFLD,0))) MF(FIL,MFLD)
 | 
|---|
| 64 |  Q
 | 
|---|
| 65 |  ;
 | 
|---|
| 66 |  ;========================================
 | 
|---|
| 67 |  ; LOADXREF(File,Fld,Log,.XRef,ValRt,Tmp)
 | 
|---|
| 68 |  ;========================================
 | 
|---|
| 69 |  ;Load specified xrefs. Uses the "AC" index on Root file if Index
 | 
|---|
| 70 |  ;Names are passed in. Also, uses the "F" index, if Field is passed in.
 | 
|---|
| 71 |  ;In:
 | 
|---|
| 72 |  ;  RFIL  = if FLD is not passed in : Root File or subfile#
 | 
|---|
| 73 |  ;                                    (required if XREF contains names)
 | 
|---|
| 74 |  ;          if FLD is passed in : The file of the field
 | 
|---|
| 75 |  ;                                (defaults to Root file of XREF)
 | 
|---|
| 76 |  ;  FLD   = Field # (optional) (if passed in, a specified index is
 | 
|---|
| 77 |  ;          loaded only if FLD is one of the cross-reference values.
 | 
|---|
| 78 |  ;  LOG   [ K : load kill logic (incl. whole kill)
 | 
|---|
| 79 |  ;        [ S : load set logic
 | 
|---|
| 80 |  ; .XREF  = ^-delimited list of xref names or numbers;
 | 
|---|
| 81 |  ;          (overflow in XREF(n) where n=1,2,...)
 | 
|---|
| 82 |  ;  VALRT = Array Ref where old/new values are located
 | 
|---|
| 83 |  ;  TMP   = Root to store info
 | 
|---|
| 84 |  ;
 | 
|---|
| 85 | LOADXREF(RFIL,FLD,LOG,XREF,VALRT,TMP) ;
 | 
|---|
| 86 |  N I,N,PC,RF,XR,XRLIST
 | 
|---|
| 87 |  ;
 | 
|---|
| 88 |  ;Loop through XREF array
 | 
|---|
| 89 |  S N=0,XRLIST=$G(XREF) F  Q:XRLIST=""  D
 | 
|---|
| 90 |  . ;
 | 
|---|
| 91 |  . ;Loop through each xref in XRLIST
 | 
|---|
| 92 |  . F PC=1:1:$L(XRLIST,U) K XR S XR=$P(XRLIST,U,PC) D:XR]""
 | 
|---|
| 93 |  .. ;
 | 
|---|
| 94 |  .. ;Convert xref name to number, if necessary
 | 
|---|
| 95 |  .. I XR'=+$P(XR,"E") D  Q:$D(XR)<2
 | 
|---|
| 96 |  ... S I=0 F  S I=$O(^DD("IX","AC",RFIL,I)) Q:'I  D
 | 
|---|
| 97 |  .... S:$P($G(^DD("IX",I,0)),U,2)=XR XR(I)=""
 | 
|---|
| 98 |  .. E  Q:$P($G(^DD("IX",XR,0)),U)=""  S XR(XR)=""
 | 
|---|
| 99 |  .. ;
 | 
|---|
| 100 |  .. ;Load code from Cross-Reference Values multiple
 | 
|---|
| 101 |  .. S XR=0 F  S XR=$O(XR(XR)) Q:'XR  D
 | 
|---|
| 102 |  ... S RF=$P(^DD("IX",XR,0),U,9)
 | 
|---|
| 103 |  ... I $G(FLD) Q:'$D(^DD("IX","F",$S($G(RFIL):RFIL,1:RF),FLD,XR))
 | 
|---|
| 104 |  ... E  I $G(RFIL) Q:RFIL'=RF
 | 
|---|
| 105 |  ... D CRV^DIKC2(XR,$G(VALRT),TMP)
 | 
|---|
| 106 |  ... D:$G(LOG)]"" LOG^DIKC2(XR,LOG,TMP)
 | 
|---|
| 107 |  ... D:$G(LOG)["K" KW^DIKC2(XR,TMP)
 | 
|---|
| 108 |  . ;
 | 
|---|
| 109 |  . ;Process next overflow
 | 
|---|
| 110 |  . S N=$O(XREF(N)),XRLIST=$S(N:$G(XREF(N)),1:"")
 | 
|---|
| 111 |  Q
 | 
|---|
| 112 |  ;
 | 
|---|
| 113 |  ;================================================================
 | 
|---|
| 114 |  ; LOADFLD(File,Field,Log,Activ,ValRt,TmpF,TmpR,FList,RList,Flag)
 | 
|---|
| 115 |  ;================================================================
 | 
|---|
| 116 |  ;Get all xrefs for a field. Uses the "F" index on file/field.
 | 
|---|
| 117 |  ;In:
 | 
|---|
| 118 |  ; FIL   = File #
 | 
|---|
| 119 |  ; FLD   = Field #
 | 
|---|
| 120 |  ; LOG   [ K : load kill logic
 | 
|---|
| 121 |  ;       [ S : load set logic
 | 
|---|
| 122 |  ;       [ W : load entire kill logic (if LOG also [ "K")
 | 
|---|
| 123 |  ; ACT   = codes: IR
 | 
|---|
| 124 |  ;          If ACT is not null, a xref is picked up only if ACT
 | 
|---|
| 125 |  ;          and the Activity field (#.41) have codes in common.
 | 
|---|
| 126 |  ; VALRT = Array Ref where old/new values are located
 | 
|---|
| 127 |  ; TMPF  = Root to store field-level xref info
 | 
|---|
| 128 |  ; TMPR  = Root to store record-level xref info
 | 
|---|
| 129 |  ; FLAG  [ i : don't load index-type xrefs (only load whole file xrefs)
 | 
|---|
| 130 |  ;       [ f : don't load field-type xrefs
 | 
|---|
| 131 |  ;       [ r : don't load record-type xrefs
 | 
|---|
| 132 |  ;Out:
 | 
|---|
| 133 |  ; .FLIST = ^-delimited list of field xrefs (overflow in FLIST(n))
 | 
|---|
| 134 |  ; .RLIST = ^-delimited list of record xrefs (overflow in RLIST(n))
 | 
|---|
| 135 |  ;
 | 
|---|
| 136 | LOADFLD(FIL,FLD,LOG,ACT,VALRT,TMPF,TMPR,FLIST,RLIST,FLAG) ;
 | 
|---|
| 137 |  N EXECFLD,TMP,XR
 | 
|---|
| 138 |  K FLIST,RLIST S (FLIST,RLIST)=0,(FLIST(0),RLIST(0))=""
 | 
|---|
| 139 |  S:$G(TMPR)="" TMPR=TMPF
 | 
|---|
| 140 |  ;
 | 
|---|
| 141 |  ;Loop through "F" index and pick up xrefs
 | 
|---|
| 142 |  S XR=0 F  S XR=$O(^DD("IX","F",FIL,FLD,XR)) Q:'XR  D
 | 
|---|
| 143 |  . I $P($G(^DD("IX",XR,0)),U)="" K ^DD("IX","F",FIL,FLD,XR) Q
 | 
|---|
| 144 |  . S EXECFLD=$P(^DD("IX",XR,0),U,6)
 | 
|---|
| 145 |  . I $G(ACT)]"",$TR(ACT,$P(^DD("IX",XR,0),U,7),$TR($J("",$L($P(^(0),U,7)))," ","*"))'["*" Q
 | 
|---|
| 146 |  . I $G(FLAG)["i",$P(^DD("IX",XR,0),U,8)="I" Q
 | 
|---|
| 147 |  . I $G(FLAG)["f",$P(^DD("IX",XR,0),U,6)="F" Q
 | 
|---|
| 148 |  . I $G(FLAG)["r",$P(^DD("IX",XR,0),U,6)="R" Q
 | 
|---|
| 149 |  . ;
 | 
|---|
| 150 |  . ;Set TMP, RLIST, and FLIST
 | 
|---|
| 151 |  . K TMP
 | 
|---|
| 152 |  . I EXECFLD="R" D
 | 
|---|
| 153 |  .. S TMP=$G(TMPR)
 | 
|---|
| 154 |  .. I $L(RLIST(RLIST))+$L(XR)+1>255 S RLIST=RLIST+1,RLIST(RLIST)=""
 | 
|---|
| 155 |  .. S RLIST(RLIST)=RLIST(RLIST)_$E(U,RLIST(RLIST)]"")_XR
 | 
|---|
| 156 |  . E  D
 | 
|---|
| 157 |  .. S TMP=$G(TMPF)
 | 
|---|
| 158 |  .. I $L(FLIST(FLIST))+$L(XR)+1>255 S FLIST=FLIST+1,FLIST(FLIST)=""
 | 
|---|
| 159 |  .. S FLIST(FLIST)=FLIST(FLIST)_$E(U,FLIST(FLIST)]"")_XR
 | 
|---|
| 160 |  . ;
 | 
|---|
| 161 |  . ;Load xref
 | 
|---|
| 162 |  . Q:$G(TMP)=""  Q:$D(@TMP@(FIL,XR))
 | 
|---|
| 163 |  . D CRV^DIKC2(XR,$G(VALRT),TMP)
 | 
|---|
| 164 |  . D:$G(LOG)]"" LOG^DIKC2(XR,LOG,TMP)
 | 
|---|
| 165 |  . I $G(LOG)["K",$G(LOG)["W" D KW^DIKC2(XR,TMP)
 | 
|---|
| 166 |  ;
 | 
|---|
| 167 |  I FLIST(0)]"" S FLIST=FLIST(0) K FLIST(0)
 | 
|---|
| 168 |  E  K FLIST S FLIST=""
 | 
|---|
| 169 |  I RLIST(0)]"" S RLIST=RLIST(0) K RLIST(0)
 | 
|---|
| 170 |  E  K RLIST S RLIST=""
 | 
|---|
| 171 |  Q
 | 
|---|
| 172 |  ;
 | 
|---|
| 173 | GETTMP(DIKC) ;Find next available root in ^TMP(DIKC)
 | 
|---|
| 174 |  ;Time stamp ^TMP(DIKC,J)
 | 
|---|
| 175 |  ;Out:
 | 
|---|
| 176 |  ; Name of available ^TMP root; e.g. ^TMP("DIKC",$J+.01)
 | 
|---|
| 177 |  ;
 | 
|---|
| 178 |  N DAY,FREE,J
 | 
|---|
| 179 |  S FREE=0 F J=$J:.01 D  Q:FREE
 | 
|---|
| 180 |  . S DAY=$G(^TMP(DIKC,J))
 | 
|---|
| 181 |  . I DAY<($H-1) K ^TMP(DIKC,J) S ^TMP(DIKC,J)=$H,FREE=1
 | 
|---|
| 182 |  Q $NA(^TMP(DIKC,J))
 | 
|---|