| 1 | DICFIX ;SEA/TOAD,SF/TKW-FileMan: Finder, Search Compound Indexes ;5/26/99  14:40
 | 
|---|
| 2 |  ;;22.0;VA FileMan;**4**;Mar 30, 1999;
 | 
|---|
| 3 |  ;Per VHA Directive 10-93-142, this routine should not be modified.
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 | WALK(DIFLAGS,DINDEX,DIDENT,DIFILE,DIEN,DIFIEN,DISCREEN,DILIST,DIC,DIY,DIYX) ;
 | 
|---|
| 6 |  ;
 | 
|---|
| 7 |  ; a walker to traverse a compound index, taking actions
 | 
|---|
| 8 |  ; DINDEX is an array describing the index and how to walk it
 | 
|---|
| 9 |  ;
 | 
|---|
| 10 | PREP ; prepare to loop through subscript
 | 
|---|
| 11 |  ;
 | 
|---|
| 12 |  N DISUB S DISUB=DINDEX("AT")
 | 
|---|
| 13 |  N DIVAL S DIVAL=DINDEX(DISUB)
 | 
|---|
| 14 |  N DIPART,DIMORE S DIPART=$G(DINDEX(DISUB,"PART")),DIMORE=+$G(DINDEX(DISUB,"MORE?"))
 | 
|---|
| 15 |  N DITRXNO S DITRXNO=DIDENT(-4)
 | 
|---|
| 16 |  I $G(DINDEX(DISUB,"USE")),DIVAL'="" D
 | 
|---|
| 17 |  . S DIVAL=$O(@DINDEX(DISUB,"ROOT")@(DIVAL),-DINDEX(DISUB,"WAY"))
 | 
|---|
| 18 |  ;
 | 
|---|
| 19 | LOOP ; loop through subscripts
 | 
|---|
| 20 |  ;
 | 
|---|
| 21 |  N DIDONE,DISKIP S DIDONE=0 F  D  Q:DIDONE!$G(DIERR)
 | 
|---|
| 22 |  . S DIVAL=$O(@DINDEX(DISUB,"ROOT")@(DIVAL),DINDEX(DISUB,"WAY"))
 | 
|---|
| 23 |  .
 | 
|---|
| 24 | DATA . ; if we're in the data subscripts, we need to walk further
 | 
|---|
| 25 |  .
 | 
|---|
| 26 |  . I DISUB'>DINDEX("#") D  Q
 | 
|---|
| 27 |  . . S DISKIP=0
 | 
|---|
| 28 |  . . I DIVAL'="",'$D(DINDEX(DISUB,"IXROOT")) D CHK Q:DISKIP
 | 
|---|
| 29 |  . . S:DIVAL="" DIDONE=1
 | 
|---|
| 30 |  . . I DIDONE Q:'DITRXNO  D  Q:DIDONE!(DISKIP)
 | 
|---|
| 31 |  . . . S DITRXNO=$O(DINDEX(DISUB,DITRXNO)) Q:'DITRXNO
 | 
|---|
| 32 |  . . . S (DIVAL,DIPART)=DINDEX(DISUB,DITRXNO)
 | 
|---|
| 33 |  . . . I DITRXNO=3!(DITRXNO=4),DIDENT(-1)>DINDEX("TOTAL") S DISKIP=1
 | 
|---|
| 34 |  . . . S DIDONE=0
 | 
|---|
| 35 |  . . . Q
 | 
|---|
| 36 |  . . S DINDEX(DISUB)=DIVAL,DINDEX("AT")=DISUB+1
 | 
|---|
| 37 |  . . S DINDEX(DISUB,"FOUND")=DITRXNO,DIDENT(-4)=1
 | 
|---|
| 38 |  . . I DISUB=1,$D(DINDEX(1,"IXROOT")) S DINDEX(1)=$P(DIVAL,U,2)
 | 
|---|
| 39 |  . . D WALK(.DIFLAGS,.DINDEX,.DIDENT,.DIFILE,.DIEN,DIFIEN,.DISCREEN,.DILIST,.DIC,.DIY,.DIYX)
 | 
|---|
| 40 |  . . S DINDEX("AT")=DISUB
 | 
|---|
| 41 |  . . S DIDENT(-4)=DITRXNO
 | 
|---|
| 42 |  . . I DISUB=1,$D(DINDEX(1,"IXROOT")) S DINDEX(1)=DIVAL
 | 
|---|
| 43 |  . . I $G(DINDEX("DONE"))!$G(DIERR) S DIDONE=1
 | 
|---|
| 44 |  .
 | 
|---|
| 45 | IEN . ; otherwise, we're in the IEN subscripts & need to process
 | 
|---|
| 46 |  .
 | 
|---|
| 47 |  . I DIVAL="" S DIDONE=1 Q
 | 
|---|
| 48 |  . I DINDEX="B" N DIMNEM D
 | 
|---|
| 49 |  . . I $D(@DINDEX(DISUB,"ROOT")@(DIVAL))#2 Q:'^(DIVAL)
 | 
|---|
| 50 |  . . E  Q:'$O(@DINDEX(DISUB,"ROOT")@(DIVAL,""))
 | 
|---|
| 51 |  . . S DIMNEM="" Q
 | 
|---|
| 52 |  . D TRY
 | 
|---|
| 53 |  . Q
 | 
|---|
| 54 | CLEAN ; clean up after loop, exit
 | 
|---|
| 55 |  S DINDEX(DISUB)=$S(DISUB<(DINDEX("#")+1):$G(DINDEX(DISUB,"FROM")),1:"")
 | 
|---|
| 56 |  S DIDENT(-4)=1
 | 
|---|
| 57 |  Q
 | 
|---|
| 58 |  ;
 | 
|---|
| 59 | CHK ; See whether we have a match or are at the end of the subscripts.
 | 
|---|
| 60 |  I DISUB>1,"VP"[DINDEX(DISUB,"TYPE"),DIFLAGS'["Q" D  Q
 | 
|---|
| 61 |  . N DIFL,DIFLD,DIV
 | 
|---|
| 62 |  . S DIFL=DINDEX(DISUB,"FILE"),DIFLD=DINDEX(DISUB,"FIELD"),DIV=DIVAL
 | 
|---|
| 63 |  . I DINDEX(DISUB,"TYPE")="V",$G(DISCREEN("V",DISUB))]"" D  Q:DISKIP
 | 
|---|
| 64 |  . . N G S G="^"_$P(DIV,";",2) Q:G="^"
 | 
|---|
| 65 |  . . S:'$D(DINDEX(DISUB,"VP",G)) DISKIP=1 Q
 | 
|---|
| 66 |  . N DIVAL S DIVAL=$$EXTERNAL^DIDU(DIFL,DIFLD,"i",DIV)
 | 
|---|
| 67 |  . I $G(DIERR),DIFLAGS["l" K DIERR,^TMP("DIERR",$J) S DIVAL=DIV
 | 
|---|
| 68 |  . I DIVAL="" S DIDONE=1 Q
 | 
|---|
| 69 |  . F DITRXNO=0:0 S DITRXNO=$O(DINDEX(DISUB,DITRXNO)) Q:'DITRXNO  D  Q:'DIDONE
 | 
|---|
| 70 |  . . S DIPART=DINDEX(DISUB,DITRXNO),DIDONE=0
 | 
|---|
| 71 |  . . D MATCH I DIDONE,'$G(DINDEX("DONE")),DIMORE,DIFLAGS'["X" D
 | 
|---|
| 72 |  . . . S DIDONE=0 D FINDMORE^DICLIX0(DISUB,.DIVAL,DIPART,.DINDEX,.DIMORE) I DIVAL="" S DIDONE=1 Q
 | 
|---|
| 73 |  . . . D MATCH Q
 | 
|---|
| 74 |  . . Q:DIDONE
 | 
|---|
| 75 |  . . S DINDEX(DISUB,"EXT")=$$EXTERNAL^DIDU(DIFL,DIFLD,"",DIV)
 | 
|---|
| 76 |  . . I $G(DIERR),DIFLAGS["l" K DIERR,^TMP("DIERR",$J) S DINDEX(DISUB,"EXT")=DIV
 | 
|---|
| 77 |  . . Q
 | 
|---|
| 78 |  . I DIDONE S DIDONE=0,DISKIP=1
 | 
|---|
| 79 |  . Q
 | 
|---|
| 80 |  D MATCH I DIDONE,'$G(DINDEX("DONE")),DIMORE,DIFLAGS'["X" D
 | 
|---|
| 81 |  . S DIDONE=0 D FINDMORE^DICLIX0(DISUB,.DIVAL,DIPART,.DINDEX,.DIMORE) I DIVAL="" S DIDONE=1 Q
 | 
|---|
| 82 |  . D MATCH Q
 | 
|---|
| 83 |  Q
 | 
|---|
| 84 |  ;
 | 
|---|
| 85 | MATCH ; No more subscripts or partial matches, or past our TO value?
 | 
|---|
| 86 |  Q:DIVAL=""  I DIFLAGS["l",DINDEX(DISUB,DITRXNO)="" Q
 | 
|---|
| 87 |  I DIFLAGS["X",DIVAL'=DINDEX(DISUB,DITRXNO) S DIDONE=1 Q
 | 
|---|
| 88 |  I $P(DIVAL,$G(DIPART))'="" S DIDONE=1 Q
 | 
|---|
| 89 |  I $G(DINDEX(DISUB,+DITRXNO,"c"))]"" D  Q:DIDONE!(DISKIP)
 | 
|---|
| 90 |  . D NXTNAM^DICFIX1(.DIVAL,DIPART,.DINDEX,.DISKIP,.DIDONE) Q
 | 
|---|
| 91 |  Q
 | 
|---|
| 92 |  ;
 | 
|---|
| 93 | TRY ; Apply screens to entry.  If passed, add entry to output.
 | 
|---|
| 94 |  S (DIEN,DINDEX(DISUB))=DIVAL
 | 
|---|
| 95 |  N DI0NODE S DI0NODE=$G(@DIFILE(DIFILE)@(DIEN,0))
 | 
|---|
| 96 |  Q:$$SCREEN^DICL2(.DIFILE,.DIEN,DIFLAGS,DIFIEN,.DISCREEN,.DINDEX,DI0NODE)
 | 
|---|
| 97 |  ; If called from ^DIC, special processing.
 | 
|---|
| 98 |  I DIFLAGS["l" D DICLIST Q
 | 
|---|
| 99 |  ; Else, add entry to output list.
 | 
|---|
| 100 |  D ACCEPT^DICL2(.DIFILE,.DIEN,.DIFLAGS,DIFIEN,.DINDEX,.DIDENT,.DILIST,DI0NODE)
 | 
|---|
| 101 |  Q:$G(DIERR)
 | 
|---|
| 102 |  I DIDENT(-1)=DIDENT(-1,"MAX"),'DIDENT(-1,"JUST LOOKING") S DIDONE=1,DINDEX("DONE")=1
 | 
|---|
| 103 |  Q
 | 
|---|
| 104 |  ;
 | 
|---|
| 105 | DICLIST ; Build output list when Finder is called from ^DIC.
 | 
|---|
| 106 |  ; Display entries and allow selection if screen is filled.
 | 
|---|
| 107 |  K DTOUT,DUOUT N D,DIX,DIFINDR,DIFILE,X,Y I DIC(0)["E" N DIQUIET
 | 
|---|
| 108 |  S Y=DIEN,D=DINDEX,DIX=DINDEX(1),DIFINDR=1
 | 
|---|
| 109 |  S X=$S("VP"[DINDEX(1,"TYPE"):DIX,1:DINDEX(1,DINDEX(1,"FOUND")))
 | 
|---|
| 110 |  I "VP"[DINDEX(1,"TYPE") S DS(0,"DICRS")=1
 | 
|---|
| 111 |  I "D"[DINDEX(1,"TYPE") S DS(0,"DIDA")=1
 | 
|---|
| 112 |  D MN^DIC3 Q:'$T
 | 
|---|
| 113 |  D K^DIC3
 | 
|---|
| 114 |  I DS(0) S (DIDONE,DINDEX("DONE"))=1
 | 
|---|
| 115 |  Q
 | 
|---|
| 116 |  ;
 | 
|---|
| 117 |  ;
 | 
|---|