DICL2 ;SEA/TOAD,SF/TKW-VA FileMan: Lookup: Lister, Part 3 ;12/13/99 09:17 [ 04/02/2003 8:25 AM ]
;;22.0;VA FileMan;**1001**;APR 1, 2003
;;22.0;VA FileMan;**20**;Mar 30, 1999
;Per VHA Directive 10-93-142, this routine should not be modified.
SCREEN(DIFILE,DIEN,DIFLAGS,DIFIEN,DISCREEN,DINDEX,DI0NODE) ;
;
; return 1 if entry should be screened out
;
S1 ; entries tagged for archiving, or missing the .01 or already on
; the list should be screened out.
;
I DIFILE'<2,'$$VMINUS9^DIEFU(DIFILE,","_DIEN_DIFIEN) Q 1
I $P(DI0NODE,U)="" Q 1
I DIFLAGS[4 N DIREC D I 'DIREC Q 1
. S DIREC=DIEN I DIFLAGS["v" S DIREC=DIREC_";"_$P(DIFILE(DIFILE,"O"),U,2)
. I $D(@DILIST@("B",($E($P(DI0NODE,U),1,DINDEX("MAXSUB"))_"^"_DIREC))) S DIREC=0
. Q
;
S2 ; execute any screen on transformed lookup values
;
N DISKIP S DISKIP=0
I DIFLAGS[4 N DISUB F DISUB=1:1:DINDEX("#") D Q:DISKIP
. N DISCR2 S DISCR2=+$G(DINDEX(DISUB,"FOUND"))
. Q:'$D(DISCREEN(DISUB,DISCR2))
. N DIVAL,D S @DINDEX(DISUB,"GET"),D=DINDEX
. X DISCREEN(DISUB,DISCR2) S DISKIP='$T
. Q
I DISKIP Q DISKIP
N DISCR
S3 ; Additional screening for using an alternate index for loop through file.
I $D(DISCREEN("X")) F DISCR=0:0 S DISCR=$O(DISCREEN("X",DISCR)) Q:'DISCR D Q:DISKIP
. N D,DIPART,DISUB,DIVAL,X
. X DISCREEN("X",DISCR,"GET") I DIVAL="" S DISKIP=1 Q
. F DISUB=0:0 S DISUB=$O(DISCREEN("VAL",DISCR,DISUB)) Q:'DISUB D Q:'DISKIP
. . S D="",DISKIP=1
. . S DIPART=DISCREEN("VAL",DISCR,DISUB) Q:$P(DIVAL,DIPART)'=""
. . S X=$G(DISCREEN("X",DISCR,DISUB)) I X]"" X X Q:'$T
. . S DISKIP=0 Q
. Q
I DISKIP Q DISKIP
S4 ; Execute Screen parameter, whole file screen.
F DISCR="F","S" I $G(DISCREEN(DISCR))'="" D Q:DISKIP
. N %,D S D=$G(DINDEX)
. N DIC S DIC=DIFILE(DIFILE,"O")
. I DIFLAGS[4 S DIC(0)=$TR(DIFLAGS,"2^fqlpqtuv4PQU")
. E S DIC(0)=$TR(DIFLAGS,"2^fpq3BIMPQ")
. N Y M Y=DIEN
. N Y1 S Y1=DIEN_DIFIEN
. N X S X=$G(@DIFILE(DIFILE)@(DIEN,0)),X=$P(X,U)
. I DIFLAGS[4,DIFLAGS["p" N I S I=DIEN
. D
. . N DIFILE,DIXV,DIY,DIYX
. . I 1 X DISCREEN(DISCR) S DISKIP='$T
.
S5 . ; if the screen returned DIERR, id the error's source with a second
. ; error and exit
.
. I $G(DIERR) D
. . S DISKIP=1
. . N DICONTXT
. . S DICONTXT=$S(DISCR["F":"Whole File Screen",1:"Screen Parameter")
. . D ERR^DICF4(120,DIFILE,DIEN,"",DICONTXT)
Q DISKIP
;
ACCEPT(DIFILE,DIEN,DIFLAGS,DIFIEN,DINDEX,DIDENT,DILIST,DI0NODE) ;
; accept an entry into the output list
;
A1 ; if we're doing the final pass (just looking to see if there are any
; more entries), we don't actually add it to the list, just note what
; we found and quit
;
I DIDENT(-1,"JUST LOOKING") D Q
. S DIDENT(-1,"JUST LOOKING")=0
. S DIDENT(-1,"MORE?")=1
. Q:DIFLAGS[4
. N DISAME,I S DISAME=0
. F I=1:1 Q:I>DINDEX("#") D Q:DISAME<I
. . I DIDENT(-1,"LAST",I,"I")'=DINDEX(I) Q
. . S DISAME=I Q
. F I=1:1:(DINDEX("#")+1) K DIDENT(-1,"LAST",I,"I")
. Q:DISAME=DINDEX("#")
. F I=(DISAME+2):1:(DINDEX("#")+1) S DIDENT(-1,"LAST",I)=""
. S DIDENT(-1,"LAST","IEN")="" Q
;
A2 ; increment the number found; if it's the max, we flag to make the
; next pass a final just looking pass
;
S DIDENT(-1)=DIDENT(-1)+1
I DIDENT(-1)=DIDENT(-1,"MAX") D
. S DIDENT(-1,"JUST LOOKING")=1
. Q:DIFLAGS[4
. N I F I=1:1:(DINDEX("#")+1) D
. . S (DIDENT(-1,"LAST",I),DIDENT(-1,"LAST",I,"I"))=DINDEX(I)
. . I I=1,"VP"[DINDEX(I,"TYPE"),'$D(DINDEX("ROOTCNG",1)) S DIDENT(-1,"LAST",I)=DINDEX0(1)
. . Q
. S DIDENT(-1,"LAST")=DIDENT(-1,"LAST",1)
. S DIDENT(-1,"LAST","IEN")=DIEN
. Q
;
A3 ; increment (or decrement) the output list subscript
;
S DILIST("ORDER")=$S(DIFLAGS[4:DIDENT(-1),1:DILIST("ORDER")+DINDEX("WAY"))
N DA M DA=DIEN
;
A4 ; output the specified values of the record
;
I DIFLAGS'["f" D
. D IDS^DICU2(.DIFILE,DIEN_DIFIEN,.DIFLAGS,.DINDEX,DILIST("ORDER"),.DIDENT,DILIST,.DI0NODE)
. Q
Q:DIFLAGS'[4
N DIREC S DIREC=DIEN I DIFLAGS["v" S DIREC=DIREC_";"_$P(DIFILE(DIFILE,"O"),U,2)
I DIFLAGS["f",DIFLAGS'["p" S @DILIST@(DIDENT(-1))=DIREC
S @DILIST@("B",($E($P(DI0NODE,U),1,DINDEX("MAXSUB"))_U_DIREC))=""
Q
;
; Possible output messages
; 202 The input parameter that identifies the |1
;
DICL2 ;SEA/TOAD,SF/TKW-VA FileMan: Lookup: Lister, Part 3 ;12/13/99 09:17 [ 04/02/2003 8:25 AM ]
+1 ;;22.0;VA FileMan;**1001**;APR 1, 2003
+2 ;;22.0;VA FileMan;**20**;Mar 30, 1999
+3 ;Per VHA Directive 10-93-142, this routine should not be modified.
SCREEN(DIFILE,DIEN,DIFLAGS,DIFIEN,DISCREEN,DINDEX,DI0NODE) ;
+1 ;
+2 ; return 1 if entry should be screened out
+3 ;
S1 ; entries tagged for archiving, or missing the .01 or already on
+1 ; the list should be screened out.
+2 ;
+3 IF DIFILE'<2
IF '$$VMINUS9^DIEFU(DIFILE,","_DIEN_DIFIEN)
QUIT 1
+4 IF $PIECE(DI0NODE,U)=""
QUIT 1
+5 IF DIFLAGS[4
NEW DIREC
Begin DoDot:1
+6 SET DIREC=DIEN
IF DIFLAGS["v"
SET DIREC=DIREC_";"_$PIECE(DIFILE(DIFILE,"O"),U,2)
+7 IF $DATA(@DILIST@("B",($EXTRACT($PIECE(DI0NODE,U),1,DINDEX("MAXSUB"))_"^"_DIREC)))
SET DIREC=0
+8 QUIT
End DoDot:1
IF 'DIREC
QUIT 1
+9 ;
S2 ; execute any screen on transformed lookup values
+1 ;
+2 NEW DISKIP
SET DISKIP=0
+3 IF DIFLAGS[4
NEW DISUB
FOR DISUB=1:1:DINDEX("#")
Begin DoDot:1
+4 NEW DISCR2
SET DISCR2=+$GET(DINDEX(DISUB,"FOUND"))
+5 IF '$DATA(DISCREEN(DISUB,DISCR2))
QUIT
+6 NEW DIVAL,D
SET @DINDEX(DISUB,"GET")
SET D=DINDEX
+7 XECUTE DISCREEN(DISUB,DISCR2)
SET DISKIP='$TEST
+8 QUIT
End DoDot:1
IF DISKIP
QUIT
+9 IF DISKIP
QUIT DISKIP
+10 NEW DISCR
S3 ; Additional screening for using an alternate index for loop through file.
+1 IF $DATA(DISCREEN("X"))
FOR DISCR=0:0
SET DISCR=$ORDER(DISCREEN("X",DISCR))
IF 'DISCR
QUIT
Begin DoDot:1
+2 NEW D,DIPART,DISUB,DIVAL,X
+3 XECUTE DISCREEN("X",DISCR,"GET")
IF DIVAL=""
SET DISKIP=1
QUIT
+4 FOR DISUB=0:0
SET DISUB=$ORDER(DISCREEN("VAL",DISCR,DISUB))
IF 'DISUB
QUIT
Begin DoDot:2
+5 SET D=""
SET DISKIP=1
+6 SET DIPART=DISCREEN("VAL",DISCR,DISUB)
IF $PIECE(DIVAL,DIPART)'=""
QUIT
+7 SET X=$GET(DISCREEN("X",DISCR,DISUB))
IF X]""
XECUTE X
IF '$TEST
QUIT
+8 SET DISKIP=0
QUIT
End DoDot:2
IF 'DISKIP
QUIT
+9 QUIT
End DoDot:1
IF DISKIP
QUIT
+10 IF DISKIP
QUIT DISKIP
S4 ; Execute Screen parameter, whole file screen.
+1 FOR DISCR="F","S"
IF $GET(DISCREEN(DISCR))'=""
Begin DoDot:1
+2 NEW %,D
SET D=$GET(DINDEX)
+3 NEW DIC
SET DIC=DIFILE(DIFILE,"O")
+4 IF DIFLAGS[4
SET DIC(0)=$TRANSLATE(DIFLAGS,"2^fqlpqtuv4PQU")
+5 IF '$TEST
SET DIC(0)=$TRANSLATE(DIFLAGS,"2^fpq3BIMPQ")
+6 NEW Y
MERGE Y=DIEN
+7 NEW Y1
SET Y1=DIEN_DIFIEN
+8 NEW X
SET X=$GET(@DIFILE(DIFILE)@(DIEN,0))
SET X=$PIECE(X,U)
+9 IF DIFLAGS[4
IF DIFLAGS["p"
NEW I
SET I=DIEN
+10 Begin DoDot:2
+11 NEW DIFILE,DIXV,DIY,DIYX
+12 IF 1
XECUTE DISCREEN(DISCR)
SET DISKIP='$TEST
End DoDot:2
+13 S5 ; if the screen returned DIERR, id the error's source with a second
+1 ; error and exit
+2 +3 IF $GET(DIERR)
Begin DoDot:2
+4 SET DISKIP=1
+5 NEW DICONTXT
+6 SET DICONTXT=$SELECT(DISCR["F":"Whole File Screen",1:"Screen Parameter")
+7 DO ERR^DICF4(120,DIFILE,DIEN,"",DICONTXT)
End DoDot:2
End DoDot:1
IF DISKIP
QUIT
+8 QUIT DISKIP
+9 ;
ACCEPT(DIFILE,DIEN,DIFLAGS,DIFIEN,DINDEX,DIDENT,DILIST,DI0NODE) ;
+1 ; accept an entry into the output list
+2 ;
A1 ; if we're doing the final pass (just looking to see if there are any
+1 ; more entries), we don't actually add it to the list, just note what
+2 ; we found and quit
+3 ;
+4 IF DIDENT(-1,"JUST LOOKING")
Begin DoDot:1
+5 SET DIDENT(-1,"JUST LOOKING")=0
+6 SET DIDENT(-1,"MORE?")=1
+7 IF DIFLAGS[4
QUIT
+8 NEW DISAME,I
SET DISAME=0
+9 FOR I=1:1
IF I>DINDEX("#")
QUIT
Begin DoDot:2
+10 IF DIDENT(-1,"LAST",I,"I")'=DINDEX(I)
QUIT
+11 SET DISAME=I
QUIT
End DoDot:2
IF DISAME<I
QUIT
+12 FOR I=1:1:(DINDEX("#")+1)
KILL DIDENT(-1,"LAST",I,"I")
+13 IF DISAME=DINDEX("#")
QUIT
+14 FOR I=(DISAME+2):1:(DINDEX("#")+1)
SET DIDENT(-1,"LAST",I)=""
+15 SET DIDENT(-1,"LAST","IEN")=""
QUIT
End DoDot:1
QUIT
+16 ;
A2 ; increment the number found; if it's the max, we flag to make the
+1 ; next pass a final just looking pass
+2 ;
+3 SET DIDENT(-1)=DIDENT(-1)+1
+4 IF DIDENT(-1)=DIDENT(-1,"MAX")
Begin DoDot:1
+5 SET DIDENT(-1,"JUST LOOKING")=1
+6 IF DIFLAGS[4
QUIT
+7 NEW I
FOR I=1:1:(DINDEX("#")+1)
Begin DoDot:2
+8 SET (DIDENT(-1,"LAST",I),DIDENT(-1,"LAST",I,"I"))=DINDEX(I)
+9 IF I=1
IF "VP"[DINDEX(I,"TYPE")
IF '$DATA(DINDEX("ROOTCNG",1))
SET DIDENT(-1,"LAST",I)=DINDEX0(1)
+10 QUIT
End DoDot:2
+11 SET DIDENT(-1,"LAST")=DIDENT(-1,"LAST",1)
+12 SET DIDENT(-1,"LAST","IEN")=DIEN
+13 QUIT
End DoDot:1
+14 ;
A3 ; increment (or decrement) the output list subscript
+1 ;
+2 SET DILIST("ORDER")=$SELECT(DIFLAGS[4:DIDENT(-1),1:DILIST("ORDER")+DINDEX("WAY"))
+3 NEW DA
MERGE DA=DIEN
+4 ;
A4 ; output the specified values of the record
+1 ;
+2 IF DIFLAGS'["f"
Begin DoDot:1
+3 DO IDS^DICU2(.DIFILE,DIEN_DIFIEN,.DIFLAGS,.DINDEX,DILIST("ORDER"),.DIDENT,DILIST,.DI0NODE)
+4 QUIT
End DoDot:1
+5 IF DIFLAGS'[4
QUIT
+6 NEW DIREC
SET DIREC=DIEN
IF DIFLAGS["v"
SET DIREC=DIREC_";"_$PIECE(DIFILE(DIFILE,"O"),U,2)
+7 IF DIFLAGS["f"
IF DIFLAGS'["p"
SET @DILIST@(DIDENT(-1))=DIREC
+8 SET @DILIST@("B",($EXTRACT($PIECE(DI0NODE,U),1,DINDEX("MAXSUB"))_U_DIREC))=""
+9 QUIT
+10 ;
+11 ; Possible output messages
+12 ; 202 The input parameter that identifies the |1
+13 ;