DICLIX1 ;SEA/TOAD,SF/TKW-FileMan: Lister, Search Compound Indexes (cont.) ;11/5/99 15:13 [ 04/02/2003 8:25 AM ]
;;22.0;VA FileMan;**1001**;APR 1, 2003
;;22.0;VA FileMan;**17**;Mar 30, 1999;
;Per VHA Directive 10-93-142, this routine should not be modified.
;
BLDTMP(DINDEX,DISCREEN,DIFLAGS,DIDENT) ; Build temporary index of external values when pointer/vp subscript is encountered.
N DISUB,DIXSAV,DIX,DIDOUT S DIDOUT=0
S DIX("AT")=DINDEX("AT") K @DINDEX(DIX("AT"),"ROOT")
N I S I=$S(DIX("AT")=1:1,1:DIX("AT")-1)
F DISUB=I:1:DINDEX("#")+1 D
. S (DIXSAV(DISUB),DIX(DISUB))=DINDEX(DISUB)
. I "VP"[$G(DINDEX(DISUB,"TYPE")) S DIX(DISUB)=""
D BT1
F DISUB=DINDEX("AT"):1:DINDEX("#")+1 S DINDEX(DISUB)=DIXSAV(DISUB)
Q
;
BT1 N DISUB S DISUB=DIX("AT")
N DIVAL,DISINT,DIDONE,DIPART,DIMORE S DISINT=DIX(DISUB),DIDONE=0
F D Q:DIDONE
. S DISINT=$O(@DINDEX(DISUB,"IXROOT")@(DISINT),DINDEX(DISUB,"WAY"))
. S:DISINT="" DIDONE=1 Q:DIDONE
. I DISUB'>DINDEX("#") D Q
. . S DIVAL=DISINT,DIPART=$G(DINDEX(DISUB,"PART")),DIMORE=$G(DINDEX(DISUB,"MORE?"))
. . I DINDEX(DISUB,"TYPE")="V",$G(DISCREEN("V",DISUB))]"" D Q:DIVAL=""
. . . N G S G="^"_$P(DISINT,";",2) Q:G="^"
. . . S:'$D(DINDEX(DISUB,"VP",G)) DIVAL="" Q
. . I "VP"[DINDEX(DISUB,"TYPE") D I DIVAL="" S DIDONE=1 Q
. . . S DIVAL=$$EXTERNAL^DIDU(DINDEX(DISUB,"FILE"),DINDEX(DISUB,"FIELD"),"i",DIVAL)
. . . Q:'$G(DIERR)
. . . I DIFLAGS["h" K DIERR,^TMP("DIERR",$J) Q
. . . S DIVAL="",DINDEX("DONE")=1 Q
. . D CHK^DICLIX I DIDONE D Q
. . . I $G(DINDEX("DONE")) S DIDOUT=1 Q
. . . S:DIVAL]"" DIDONE=0 Q
. . I DISUB=1,"VP"[DINDEX(1,"TYPE") S @DINDEX(1,"ROOT")@(DIVAL)=DISINT
. . S DINDEX(DISUB)=DIVAL,DIX(DISUB)=DISINT,DIX("AT")=DISUB+1
. . D BT1
. . S DIX("AT")=DISUB
. . I $G(DIDOUT) S DIDONE=1
. . Q
. Q:DIDONE
. I $G(DINDEX(DISUB,"TO")) D Q:DIDONE
. . D BACKPAST(DIFLAGS,.DINDEX,DISUB,DISINT,.DIDONE)
. . S:DIDONE DIDOUT=1 Q
. S @DINDEX(DISUB,"ROOT")@(DISINT)=""
S DIX(DISUB)="" Q
;
BACKPAST(DIFLAGS,DINDEX,DISUB,DIVAL,DIDONE) ; Have we gone past TO value? Lister only.
N I,DIOUT S DIOUT=0
F I=1:1:DISUB D Q:DIOUT
. N V S V=$S(I=DISUB:DIVAL,1:DINDEX(I))
. I I=1,DIFLAGS'["p","PV"[DINDEX(1,"TYPE") S V=DINDEX(I,"EXT")
. Q:V=DINDEX(I,"TO")
. I DINDEX(I,"WAY")=1,DINDEX(I,"TO")]]V S DIOUT=1 Q
. I DINDEX(I,"WAY")=-1,V]]DINDEX(I,"TO") S DIOUT=1 Q
. S DIVAL="",(DIOUT,DIDONE,DINDEX("DONE"))=1 Q
. Q
Q:DIOUT
S DIVAL="",(DIDONE,DINDEX("DONE"))=1 Q
;
;
DICLIX1 ;SEA/TOAD,SF/TKW-FileMan: Lister, Search Compound Indexes (cont.) ;11/5/99 15:13 [ 04/02/2003 8:25 AM ]
+1 ;;22.0;VA FileMan;**1001**;APR 1, 2003
+2 ;;22.0;VA FileMan;**17**;Mar 30, 1999;
+3 ;Per VHA Directive 10-93-142, this routine should not be modified.
+4 ;
BLDTMP(DINDEX,DISCREEN,DIFLAGS,DIDENT) ; Build temporary index of external values when pointer/vp subscript is encountered.
+1 NEW DISUB,DIXSAV,DIX,DIDOUT
SET DIDOUT=0
+2 SET DIX("AT")=DINDEX("AT")
KILL @DINDEX(DIX("AT"),"ROOT")
+3 NEW I
SET I=$SELECT(DIX("AT")=1:1,1:DIX("AT")-1)
+4 FOR DISUB=I:1:DINDEX("#")+1
Begin DoDot:1
+5 SET (DIXSAV(DISUB),DIX(DISUB))=DINDEX(DISUB)
+6 IF "VP"[$GET(DINDEX(DISUB,"TYPE"))
SET DIX(DISUB)=""
End DoDot:1
+7 DO BT1
+8 FOR DISUB=DINDEX("AT"):1:DINDEX("#")+1
SET DINDEX(DISUB)=DIXSAV(DISUB)
+9 QUIT
+10 ;
BT1 NEW DISUB
SET DISUB=DIX("AT")
+1 NEW DIVAL,DISINT,DIDONE,DIPART,DIMORE
SET DISINT=DIX(DISUB)
SET DIDONE=0
+2 FOR
Begin DoDot:1
+3 SET DISINT=$ORDER(@DINDEX(DISUB,"IXROOT")@(DISINT),DINDEX(DISUB,"WAY"))
+4 IF DISINT=""
SET DIDONE=1
IF DIDONE
QUIT
+5 IF DISUB'>DINDEX("#")
Begin DoDot:2
+6 SET DIVAL=DISINT
SET DIPART=$GET(DINDEX(DISUB,"PART"))
SET DIMORE=$GET(DINDEX(DISUB,"MORE?"))
+7 IF DINDEX(DISUB,"TYPE")="V"
IF $GET(DISCREEN("V",DISUB))]""
Begin DoDot:3
+8 NEW G
SET G="^"_$PIECE(DISINT,";",2)
IF G="^"
QUIT
+9 IF '$DATA(DINDEX(DISUB,"VP",G))
SET DIVAL=""
QUIT
End DoDot:3
IF DIVAL=""
QUIT
+10 IF "VP"[DINDEX(DISUB,"TYPE")
Begin DoDot:3
+11 SET DIVAL=$$EXTERNAL^DIDU(DINDEX(DISUB,"FILE"),DINDEX(DISUB,"FIELD"),"i",DIVAL)
+12 IF '$GET(DIERR)
QUIT
+13 IF DIFLAGS["h"
KILL DIERR,^TMP("DIERR",$JOB)
QUIT
+14 SET DIVAL=""
SET DINDEX("DONE")=1
QUIT
End DoDot:3
IF DIVAL=""
SET DIDONE=1
QUIT
+15 DO CHK^DICLIX
IF DIDONE
Begin DoDot:3
+16 IF $GET(DINDEX("DONE"))
SET DIDOUT=1
QUIT
+17 IF DIVAL]""
SET DIDONE=0
QUIT
End DoDot:3
QUIT
+18 IF DISUB=1
IF "VP"[DINDEX(1,"TYPE")
SET @DINDEX(1,"ROOT")@(DIVAL)=DISINT
+19 SET DINDEX(DISUB)=DIVAL
SET DIX(DISUB)=DISINT
SET DIX("AT")=DISUB+1
+20 DO BT1
+21 SET DIX("AT")=DISUB
+22 IF $GET(DIDOUT)
SET DIDONE=1
+23 QUIT
End DoDot:2
QUIT
+24 IF DIDONE
QUIT
+25 IF $GET(DINDEX(DISUB,"TO"))
Begin DoDot:2
+26 DO BACKPAST(DIFLAGS,.DINDEX,DISUB,DISINT,.DIDONE)
+27 IF DIDONE
SET DIDOUT=1
QUIT
End DoDot:2
IF DIDONE
QUIT
+28 SET @DINDEX(DISUB,"ROOT")@(DISINT)=""
End DoDot:1
IF DIDONE
QUIT
+29 SET DIX(DISUB)=""
QUIT
+30 ;
BACKPAST(DIFLAGS,DINDEX,DISUB,DIVAL,DIDONE) ; Have we gone past TO value? Lister only.
+1 NEW I,DIOUT
SET DIOUT=0
+2 FOR I=1:1:DISUB
Begin DoDot:1
+3 NEW V
SET V=$SELECT(I=DISUB:DIVAL,1:DINDEX(I))
+4 IF I=1
IF DIFLAGS'["p"
IF "PV"[DINDEX(1,"TYPE")
SET V=DINDEX(I,"EXT")
+5 IF V=DINDEX(I,"TO")
QUIT
+6 IF DINDEX(I,"WAY")=1
IF DINDEX(I,"TO")]]V
SET DIOUT=1
QUIT
+7 IF DINDEX(I,"WAY")=-1
IF V]]DINDEX(I,"TO")
SET DIOUT=1
QUIT
+8 SET DIVAL=""
SET (DIOUT,DIDONE,DINDEX("DONE"))=1
QUIT
+9 QUIT
End DoDot:1
IF DIOUT
QUIT
+10 IF DIOUT
QUIT
+11 SET DIVAL=""
SET (DIDONE,DINDEX("DONE"))=1
QUIT
+12 ;
+13 ;