DIVRPTR ;GFT/GFT - CHECK POINTER FIELDS (PROGRAMMER CALL) ;28FEB2004
;;22.2;VA FileMan;;Jan 05, 2016;Build 42
;;Per VA Directive 6402, this routine should not be modified.
;;Submitted to OSEHRA 5 January 2015 by the VISTA Expertise Network.
;;Based on Medsphere Systems Corporation's MSC FileMan 1051.
;;Licensed under the terms of the Apache License, Version 2.0.
;
N DIB,DIC K DIRUT
D DT^DICRW,L^DICRW1 Q:'$D(DIC)
D ^%ZIS Q:POP U IO D HDR
F A=$O(^DD(+Y),-1):0 S A=$O(^DD(A)) Q:'A!$D(DIRUT) D IJ^DIUTL(A) Q:J(0)>DIB(1) F DIFLD=0:0 S DIFLD=$O(^DD(A,DIFLD)) Q:'DIFLD!$D(DIRUT) S X=$P($G(^(DIFLD,0)),U,2) I 'X F T="P","V" I X[T D CK(A,DIFLD,T) S X=""
D ^%ZISC Q
;
CK(A,DIFLD,T) ;CHECK FIELD DIFLD, DATA DICTIONARY A, TYPE T
N W,I,J,V,DIVTMP,DG,E,DIVZ,DE,DR,P4,M
K ^UTILITY("DIVR",$J)
D IJ^DIUTL(A) S V=$O(J(""),-1)
S DIVZ=$P(^DD(A,DIFLD,0),U,3),DR=$P(^(0),U,2),P4=$P(^(0),U,4)
I T="P" S DIVZ=$$CREF^DILF(U_DIVZ) I '$D(@DIVZ@(0)) D SUBHD W !,"POINTED-TO FILE (#",+$P(DR,"P",2),") IS MISSING!!",! Q
D 0 S X=P4,Y=$P(X,";",2),X=$P(X,";")
I +X'=X S X=""""_X_"""" I Y="" S DE=DE_"S X=DA D "_T G XEC
S M="S X=$S($D(^(DA,"_X_")):$"_$S(Y:"P(^("_X_"),U,"_Y,1:"E(^("_X_"),"_$E(Y,2,9))_"),1:"""") D "_T
I $L(M)+$L(DE)>250 S DE=DE_"X DE(1)",DE(1)=M
E S DE=DE_M
XEC K DIC,M,Y X DE
Q S M=$O(^UTILITY("DIVR",$J,0)),E=$O(^(M)),DK=J(0)
K ^UTILITY("DIVR",$J)
Q
;
;
0 ;
K DA
S Y=I(0),DE="",X=V
L S DA="DA" S:X DA=DA_"("_X_")" S Y=Y_DA,DE=DE_"F "_DA_"=0:0 Q:$D(DIRUT) ",%="S "_DA_"=$O("_Y_"))" I V>2 S DE(X+X)=%,DE=DE_"X DE("_(X+X)_")"
E S DE=DE_%
S DE=DE_" Q:"_DA_"'>0 S D"_(V-X)_"="_DA_" "
S X=X-1 Q:X<0 S Y=Y_","_I(V-X)_"," G L
;
;
;
;
V ;VARIABLE POINTER
Q:'X I $P(X,";",2)'?1A.AN1"(".ANP,$P(X,";",2)'?1"%".AN1"(".ANP S M=""""_X_""""_" has the wrong format" G X
S M=$S($D(@(U_$P(X,";",2)_"0)")):^(0),1:"")
I '$D(^DD(A,DIFLD,"V","B",+$P(M,U,2))) S M=$P(M,U)_" FILE not in the DD" G X
I '$D(@(U_$P(X,";",2)_+X_",0)")) S M=U_$P(X,";",2)_+X_",0) does not exist" G X
Q
;
P ;REGULAR POINTER
Q:'X I $D(@DIVZ@(X,0)) Q
S M="No '"_X_"' in "_$P(@DIVZ@(0),U)_" File"
X I $O(^UTILITY("DIVR",$J,0))="" D SUBHD
S ^UTILITY("DIVR",$J,X)="",M=">>"_M_"<<"
S DG=$$IENS^DILF(.DA),J=V
F J=V:-1:0 W !,?V-J*2,$O(^DD(J(V-J),0,"NM",0)),": `",+$P(DG,",",J+1),?V-J*2+10," " S W="E" D I W="" S W="I" D ;TRY EXTERNAL FORM FIRST, THEN INTERNAL
.S W=$$GET1^DIQ(J(V-J),$P(DG,",",J+1,99),.01,W) W W
W " " W:$X+$L(M)>IOM !?30 W M
D LF Q
;
;
LF ;Issue a line feed or EOP read
I $Y+3<IOSL W ! Q
I IOST?1"C-".E D
. N DIR,X,Y
. S DIR(0)="E" W ! D ^DIR
I '$D(DIRUT) D HDR,SUBHD W "continued",!
Q
;
HDR ;Print header
W @IOF,"DANGLING POINTER REPORT",!
Q
;
SUBHD N I,Y W !!!,"FILE ",J(0)," '",$$LABEL^DIALOGZ(A,DIFLD),"' ("
S Y=" File #"_J(0)
F I=1:1 Q:'$D(J(I)) S Y=" Sub-File #"_J(I)_" of"_Y
S Y="Field #"_DIFLD_" in"_Y
I $P($G(^DD(A,DIFLD,0)),U,2) S Y="Multiple "_Y
W Y,")"
Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HDIVRPTR 2981 printed Nov 22, 2024@18:04:46 Page 2
DIVRPTR ;GFT/GFT - CHECK POINTER FIELDS (PROGRAMMER CALL) ;28FEB2004
+1 ;;22.2;VA FileMan;;Jan 05, 2016;Build 42
+2 ;;Per VA Directive 6402, this routine should not be modified.
+3 ;;Submitted to OSEHRA 5 January 2015 by the VISTA Expertise Network.
+4 ;;Based on Medsphere Systems Corporation's MSC FileMan 1051.
+5 ;;Licensed under the terms of the Apache License, Version 2.0.
+6 ;
+7 NEW DIB,DIC
KILL DIRUT
+8 DO DT^DICRW
DO L^DICRW1
if '$DATA(DIC)
QUIT
+9 DO ^%ZIS
if POP
QUIT
USE IO
DO HDR
+10 FOR A=$ORDER(^DD(+Y),-1):0
SET A=$ORDER(^DD(A))
if 'A!$DATA(DIRUT)
QUIT
DO IJ^DIUTL(A)
if J(0)>DIB(1)
QUIT
FOR DIFLD=0:0
SET DIFLD=$ORDER(^DD(A,DIFLD))
if 'DIFLD!$DATA(DIRUT)
QUIT
SET X=$PIECE($GET(^(DIFLD,0)),U,2)
IF 'X
FOR T="P","V"
IF X[T
DO CK(A,DIFLD,T)
SET X=""
+11 DO ^%ZISC
QUIT
+12 ;
CK(A,DIFLD,T) ;CHECK FIELD DIFLD, DATA DICTIONARY A, TYPE T
+1 NEW W,I,J,V,DIVTMP,DG,E,DIVZ,DE,DR,P4,M
+2 KILL ^UTILITY("DIVR",$JOB)
+3 DO IJ^DIUTL(A)
SET V=$ORDER(J(""),-1)
+4 SET DIVZ=$PIECE(^DD(A,DIFLD,0),U,3)
SET DR=$PIECE(^(0),U,2)
SET P4=$PIECE(^(0),U,4)
+5 IF T="P"
SET DIVZ=$$CREF^DILF(U_DIVZ)
IF '$DATA(@DIVZ@(0))
DO SUBHD
WRITE !,"POINTED-TO FILE (#",+$PIECE(DR,"P",2),") IS MISSING!!",!
QUIT
+6 DO 0
SET X=P4
SET Y=$PIECE(X,";",2)
SET X=$PIECE(X,";")
+7 IF +X'=X
SET X=""""_X_""""
IF Y=""
SET DE=DE_"S X=DA D "_T
GOTO XEC
+8 SET M="S X=$S($D(^(DA,"_X_")):$"_$SELECT(Y:"P(^("_X_"),U,"_Y,1:"E(^("_X_"),"_$EXTRACT(Y,2,9))_"),1:"""") D "_T
+9 IF $LENGTH(M)+$LENGTH(DE)>250
SET DE=DE_"X DE(1)"
SET DE(1)=M
+10 IF '$TEST
SET DE=DE_M
XEC KILL DIC,M,Y
XECUTE DE
Q SET M=$ORDER(^UTILITY("DIVR",$JOB,0))
SET E=$ORDER(^(M))
SET DK=J(0)
+1 KILL ^UTILITY("DIVR",$JOB)
+2 QUIT
+3 ;
+4 ;
0 ;
+1 KILL DA
+2 SET Y=I(0)
SET DE=""
SET X=V
L SET DA="DA"
if X
SET DA=DA_"("_X_")"
SET Y=Y_DA
SET DE=DE_"F "_DA_"=0:0 Q:$D(DIRUT) "
SET %="S "_DA_"=$O("_Y_"))"
IF V>2
SET DE(X+X)=%
SET DE=DE_"X DE("_(X+X)_")"
+1 IF '$TEST
SET DE=DE_%
+2 SET DE=DE_" Q:"_DA_"'>0 S D"_(V-X)_"="_DA_" "
+3 SET X=X-1
if X<0
QUIT
SET Y=Y_","_I(V-X)_","
GOTO L
+4 ;
+5 ;
+6 ;
+7 ;
V ;VARIABLE POINTER
+1 if 'X
QUIT
IF $PIECE(X,";",2)'?1A.AN1"(".ANP
IF $PIECE(X,";",2)'?1"%".AN1"(".ANP
SET M=""""_X_""""_" has the wrong format"
GOTO X
+2 SET M=$SELECT($DATA(@(U_$PIECE(X,";",2)_"0)")):^(0),1:"")
+3 IF '$DATA(^DD(A,DIFLD,"V","B",+$PIECE(M,U,2)))
SET M=$PIECE(M,U)_" FILE not in the DD"
GOTO X
+4 IF '$DATA(@(U_$PIECE(X,";",2)_+X_",0)"))
SET M=U_$PIECE(X,";",2)_+X_",0) does not exist"
GOTO X
+5 QUIT
+6 ;
P ;REGULAR POINTER
+1 if 'X
QUIT
IF $DATA(@DIVZ@(X,0))
QUIT
+2 SET M="No '"_X_"' in "_$PIECE(@DIVZ@(0),U)_" File"
X IF $ORDER(^UTILITY("DIVR",$JOB,0))=""
DO SUBHD
+1 SET ^UTILITY("DIVR",$JOB,X)=""
SET M=">>"_M_"<<"
+2 SET DG=$$IENS^DILF(.DA)
SET J=V
+3 ;TRY EXTERNAL FORM FIRST, THEN INTERNAL
FOR J=V:-1:0
WRITE !,?V-J*2,$ORDER(^DD(J(V-J),0,"NM",0)),": `",+$PIECE(DG,",",J+1),?V-J*2+10," "
SET W="E"
Begin DoDot:1
+4 SET W=$$GET1^DIQ(J(V-J),$PIECE(DG,",",J+1,99),.01,W)
WRITE W
End DoDot:1
IF W=""
SET W="I"
Begin DoDot:1
End DoDot:1
+5 WRITE " "
if $X+$LENGTH(M)>IOM
WRITE !?30
WRITE M
+6 DO LF
QUIT
+7 ;
+8 ;
LF ;Issue a line feed or EOP read
+1 IF $Y+3<IOSL
WRITE !
QUIT
+2 IF IOST?1"C-".E
Begin DoDot:1
+3 NEW DIR,X,Y
+4 SET DIR(0)="E"
WRITE !
DO ^DIR
End DoDot:1
+5 IF '$DATA(DIRUT)
DO HDR
DO SUBHD
WRITE "continued",!
+6 QUIT
+7 ;
HDR ;Print header
+1 WRITE @IOF,"DANGLING POINTER REPORT",!
+2 QUIT
+3 ;
SUBHD NEW I,Y
WRITE !!!,"FILE ",J(0)," '",$$LABEL^DIALOGZ(A,DIFLD),"' ("
+1 SET Y=" File #"_J(0)
+2 FOR I=1:1
if '$DATA(J(I))
QUIT
SET Y=" Sub-File #"_J(I)_" of"_Y
+3 SET Y="Field #"_DIFLD_" in"_Y
+4 IF $PIECE($GET(^DD(A,DIFLD,0)),U,2)
SET Y="Multiple "_Y
+5 WRITE Y,")"
+6 QUIT