| 1 | DICL3 ;SF/TKW-VA FileMan: Lookup: Lister, Part 4 ;1/26/99  08:32
 | 
|---|
| 2 |  ;;22.0;VA FileMan;**3**;Mar 30, 1999
 | 
|---|
| 3 |  ;Per VHA Directive 10-93-142, this routine should not be modified.
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 | FOLLOW(DIFILE,DIF,DIDEF,DICHNNO,DILVL,DIFRFILE,DIFIELD,DIDXFILE,DIVPTR,DISUB,DISCREEN) ;
 | 
|---|
| 6 |  ;
 | 
|---|
| 7 |  ; follow pointer/vp chains to end, building stack along the way
 | 
|---|
| 8 |  ;
 | 
|---|
| 9 | F1 ; increment stack level, loop increments at top
 | 
|---|
| 10 |  ; if pointing file lacks B index, store that in stack
 | 
|---|
| 11 |  ;
 | 
|---|
| 12 |  S DILVL=DILVL+1
 | 
|---|
| 13 |  I DILVL=1 S DIF(1,DIFILE)=U_DIDXFILE
 | 
|---|
| 14 |  I DILVL>1 D
 | 
|---|
| 15 |  . S DIF(DILVL,DIFILE)=DIFRFILE_U_DIVPTR
 | 
|---|
| 16 |  . I '$D(@DIFILE(DIFILE)@("B")) S DIFILE(DIFILE,"NO B")=""
 | 
|---|
| 17 |  . S DIFILE(DIFILE,"O")=$$OREF^DIQGU(DIFILE(DIFILE))
 | 
|---|
| 18 |  . Q
 | 
|---|
| 19 | F2 ; Find data type of .01 field of pointed-to file, process
 | 
|---|
| 20 |  ; end of pointer chain.
 | 
|---|
| 21 |  N T S T=$P(DIDEF,U,2)
 | 
|---|
| 22 |  I T'["P",T'["V" D  Q
 | 
|---|
| 23 |  . S DIFILE("STACKEND",DICHNNO)=DILVL_U_DIFILE
 | 
|---|
| 24 |  . N L,F F L=DILVL:-1:1 D
 | 
|---|
| 25 |  . . S DIFILE("STACK",DICHNNO,L,DIFILE)=DIFRFILE_U_DIVPTR
 | 
|---|
| 26 |  . . Q:L=1
 | 
|---|
| 27 |  . . S DIFILE=+DIF(L,DIFILE)
 | 
|---|
| 28 |  . . S F=DIF(L-1,DIFILE),DIFRFILE=$P(F,U),DIVPTR=$P(F,U,2)
 | 
|---|
| 29 |  . S DICHNNO=DICHNNO+1
 | 
|---|
| 30 |  . Q
 | 
|---|
| 31 | F3 ; Advance file number, Process regular pointers within pointer chain.
 | 
|---|
| 32 |  N DIFRFILE S DIFRFILE=DIFILE
 | 
|---|
| 33 |  I T["P" D  Q
 | 
|---|
| 34 |  . S DIFILE=+$P($P(DIDEF,U,2),"P",2)
 | 
|---|
| 35 |  . S DIFILE(DIFILE)=$$CREF^DIQGU(U_$P(DIDEF,U,3))
 | 
|---|
| 36 |  . S DIDEF=$G(^DD(DIFILE,.01,0))
 | 
|---|
| 37 |  . D FOLLOW(.DIFILE,.DIF,DIDEF,.DICHNNO,.DILVL,DIFRFILE,"","",0)
 | 
|---|
| 38 |  . Q
 | 
|---|
| 39 | F4 ; Process variable pointers within the pointer chain.
 | 
|---|
| 40 |  N DIVP,G
 | 
|---|
| 41 |  S:'$G(DIFIELD) DIFIELD=.01
 | 
|---|
| 42 |  F DIVP=0:0 S DIVP=$O(^DD(DIFILE,DIFIELD,"V",DIVP)) Q:'DIVP  S G=$G(^(DIVP,0)) D
 | 
|---|
| 43 |  . Q:'G
 | 
|---|
| 44 |  . S DIFILE=+G,G=$G(^DIC(DIFILE,0,"GL")) I G="" S DIFILE=DIFRFILE Q
 | 
|---|
| 45 |  . I DILVL=1,$D(DISCREEN("V",DISUB)),'$D(DINDEX(DISUB,"VP",G)) S DIFILE=DIFRFILE Q
 | 
|---|
| 46 |  . S DIFILE(DIFILE)=$$CREF^DIQGU(G)
 | 
|---|
| 47 |  . S DIDEF=$G(^DD(DIFILE,.01,0))
 | 
|---|
| 48 |  . N DISAVL S DISAVL=DILVL
 | 
|---|
| 49 |  . D FOLLOW(.DIFILE,.DIF,DIDEF,.DICHNNO,.DILVL,DIFRFILE,"","",1)
 | 
|---|
| 50 |  . S DILVL=DISAVL,DIFILE=DIFRFILE
 | 
|---|
| 51 |  Q
 | 
|---|
| 52 |  ;
 | 
|---|
| 53 | BACKTRAK(DIFLAGS,DIFILE,DISTACK,DIEN,DIFIEN,DINDEX0,DINDEX,DIDENT,DISCREEN,DILIST) ;
 | 
|---|
| 54 |  ;
 | 
|---|
| 55 |  ; Back up on pointer stack until we get back to home file.
 | 
|---|
| 56 |  ;
 | 
|---|
| 57 | B1 ; back up one level on stack, recover file #, root, and index file,
 | 
|---|
| 58 |  ; and set value to match equal to the previous level's ien value
 | 
|---|
| 59 |  ;
 | 
|---|
| 60 |  N F,DIVPTR S F=DIFILE("STACK",+DISTACK,+$P(DISTACK,U,2),+$P(DISTACK,U,3))
 | 
|---|
| 61 |  S DIVPTR=$P(F,U,2),F=+F
 | 
|---|
| 62 |  N DIVALUE D
 | 
|---|
| 63 |  . I 'DIVPTR S DIVALUE=DIEN Q
 | 
|---|
| 64 |  . S DIVALUE=DIEN_";"_$P(DIFILE(+$P(DISTACK,U,3),"O"),U,2)
 | 
|---|
| 65 |  . Q
 | 
|---|
| 66 |  S DISTACK=(+DISTACK)_U_($P(DISTACK,U,2)-1)_U_F
 | 
|---|
| 67 |  I $P(DISTACK,U,2)=1 D  Q
 | 
|---|
| 68 |  . N DIROOT1 S DIROOT1=$S($D(DIFILE(F,"NO B")):DIFILE(F,"NO B"),1:DIFILE(F,"O")_"DINDEX0")_")"
 | 
|---|
| 69 |  . I $O(@DIROOT1@(DIVALUE,""))="" S DIEN="" Q
 | 
|---|
| 70 |  . S DINDEX0(1)=DIVALUE,DIEN=""
 | 
|---|
| 71 |  . S DIFILE=+F
 | 
|---|
| 72 |  . S F=$TR(DIFLAGS,"vp")
 | 
|---|
| 73 |  . D WALK^DICLIX(F,.DINDEX0,.DIDENT,.DIFILE,.DIEN,.DIFIEN,.DISCREEN,.DILIST,.DINDEX,"",.DIC)
 | 
|---|
| 74 |  . S DIFILE=+$P(DIFILE("STACK"),U,3)
 | 
|---|
| 75 |  . Q
 | 
|---|
| 76 |  ;
 | 
|---|
| 77 | B2 ; loop through matches on pointer index,
 | 
|---|
| 78 |  ; quit when no matches, if not back to root of pointer chain yet,
 | 
|---|
| 79 |  ; make another recursive call to BACKTRAK to unwind to pointing
 | 
|---|
| 80 |  ; file's matches
 | 
|---|
| 81 |  ;
 | 
|---|
| 82 |  S DIEN="" F  D  Q:DIEN=""!($G(DIERR))
 | 
|---|
| 83 |  . N DIROOT1 S DIROOT1=$S($D(DIFILE(F,"NO B")):DIFILE(F,"NO B"),1:DIFILE(F,"O")_"""B""")_")"
 | 
|---|
| 84 |  . S DIEN=$O(@DIROOT1@(DIVALUE,DIEN))
 | 
|---|
| 85 |  . Q:DIEN=""
 | 
|---|
| 86 |  . D BACKTRAK(.DIFLAGS,.DIFILE,DISTACK,DIEN,DIFIEN,.DINDEX0,.DINDEX,.DIDENT,.DISCREEN,.DILIST)
 | 
|---|
| 87 |  . Q
 | 
|---|
| 88 |  Q
 | 
|---|
| 89 |  ;
 | 
|---|
| 90 | SETB ; Set temporary "B" index on pointed-to files.
 | 
|---|
| 91 |  Q:'$O(DIFILE("STACK",0))
 | 
|---|
| 92 |  N I,J,DIFL,DITEMP
 | 
|---|
| 93 |  F I=0:0 S I=$O(DIFILE("STACK",I)) Q:'I  F J=0:0 S J=$O(DIFILE("STACK",I,J)) Q:'J  F DIFL=0:0 S DIFL=$O(DIFILE("STACK",I,J,DIFL)) Q:'DIFL  I $D(DIFILE(DIFL,"NO B")) D
 | 
|---|
| 94 |  . D TMPB^DICUIX1(.DITEMP,DIFL)
 | 
|---|
| 95 |  . S DIFILE(DIFL,"NO B")=DITEMP
 | 
|---|
| 96 |  . D BLDB^DICUIX1(DIFILE(DIFL),DITEMP)
 | 
|---|
| 97 |  . Q
 | 
|---|
| 98 |  Q
 | 
|---|
| 99 |  ;
 | 
|---|