1 | DMSQP3 ;SFISC/EZ-DISPLAY POINTER COUNTS ;10/30/97 17:42
|
---|
2 | ;;22.0;VA FileMan;;Mar 30, 1999
|
---|
3 | ;Per VHA Directive 10-93-142, this routine should not be modified.
|
---|
4 | EN ; show individual table counts of links
|
---|
5 | S DMQ="" D OK I DMQ K DMQ Q
|
---|
6 | D PREASK I $D(DIRUT)!(DMQ) K DMQ Q
|
---|
7 | D DT^DICRW,HOME^%ZIS
|
---|
8 | D ASK D:'DMQ ASK1 D:'DMQ CLEAR,PAIRS,CNT,BUILD,PRT D EXIT Q
|
---|
9 | EN1 ; show summary counts of table links
|
---|
10 | S DMQ="" D OK I DMQ K DMQ Q
|
---|
11 | D PREASK I $D(DIRUT)!(DMQ) K DMQ Q
|
---|
12 | D DT^DICRW,HOME^%ZIS D D EXIT
|
---|
13 | . D ASK2 Q:DMQ D CLEAR,PAIRS,CNT,BUILD,TOTS
|
---|
14 | . S DMDHD=$S(DMYN:"LISTING",1:"COUNTS")
|
---|
15 | . S DMFLDS=$S(DMYN:"!INTERNAL(#6);"""",.01;""""",1:"!(#.01);""""")
|
---|
16 | . S DMANS=""
|
---|
17 | . F D MENU Q:$D(DIRUT) D READ Q:$D(DIRUT)!(DMANS=9) D
|
---|
18 | .. D:DMANS=1 PRT3^DMSQP4
|
---|
19 | .. D:DMANS=2 PRT4^DMSQP4
|
---|
20 | .. D:DMANS=3 PRT5^DMSQP4
|
---|
21 | .. D:DMANS=4 PRT6^DMSQP4
|
---|
22 | .. D:DMANS=5 PRT7^DMSQP4
|
---|
23 | .. ; word-processing tables could be done calling PRT2^DMSQP4,
|
---|
24 | .. ; see commented code in BUILD for some ideas about how.
|
---|
25 | Q
|
---|
26 | MENU ; present a choice of reports, now that TMP arrays are built
|
---|
27 | S DIR(0)="E" D ^DIR K DIR Q:$D(DIRUT) W @IOF
|
---|
28 | W !!!!!?9,"(1) SELF Tables with Self-referential Pointers"
|
---|
29 | W !?9,"(2) UP Tables with Upward Links"
|
---|
30 | W !?9,"(3) DOWN Tables Linked from Below"
|
---|
31 | W !?9,"(4) OUT Tables Pointing Outward"
|
---|
32 | W !?9,"(5) IN Tables with Incoming Pointers"
|
---|
33 | W !!?9,"(9) QUIT Exit this Menu"
|
---|
34 | W !! Q
|
---|
35 | READ ; reader for the menu
|
---|
36 | S DIR(0)="SMA^1:SELF;2:UP;3:DOWN;4:OUT;5:IN;9:QUIT"
|
---|
37 | S DIR("A")="Select a report: " D ^DIR S DMANS=Y K DIR
|
---|
38 | Q
|
---|
39 | EXIT K DOT,DMANS,DMFILE,DMWP,DMFK,DMPFK,DMSR,DME,DMF,DMCOL,DMDM,DMYN
|
---|
40 | K DMX,DMY,DMCT,DMBFK,DMBPFK,DMQ,DMFN,DMFN1,DMTBL,DMCI,DMEI,DMDI
|
---|
41 | K DM1,DM2,DM3,DM4,DM5,DM6,DM7,DMDHD,DMFLDS
|
---|
42 | K DMC1,DMC2,DMC3,DMC4,DMC5,DMC6,DMC7
|
---|
43 | K DMCN2,DMCN3,DMCN4,DMCN5,DMCN6,DMCN7,DMCN8
|
---|
44 | CLEAR K ^TMP("DM",$J),^TMP("DMT",$J),^TMP("DMTN",$J)
|
---|
45 | K ^TMP("DMP1",$J),^TMP("DMP2",$J)
|
---|
46 | K ^TMP("DMCT1",$J),^TMP("DMCT2",$J),^TMP("DMFQ2",$J),^TMP("DMFQ3",$J)
|
---|
47 | K ^TMP("DMFQ4",$J),^TMP("DMFQ5",$J),^TMP("DMFQ6",$J),^TMP("DMFQ7",$J)
|
---|
48 | Q
|
---|
49 | OK ; check of okay to run
|
---|
50 | I '$O(^DMSQ("S",0)) W !?5,"Sorry, SQLI files are empty.",! S DMQ=1 Q
|
---|
51 | I $$WAIT^DMSQT1 D S DMQ=1 Q
|
---|
52 | . W !?5,"Try later. SQLI is being re-built right now."
|
---|
53 | Q
|
---|
54 | PREASK ; confirm that it's okay to wait for interactive processing
|
---|
55 | S DIR(0)="Y",DIR("A")="This can take 1-2 minutes. Continue"
|
---|
56 | S DIR("B")="NO" D ^DIR K DIR S:Y=0 DMQ=1
|
---|
57 | Q
|
---|
58 | ASK ; select file numbers
|
---|
59 | S DM1=$O(^DMSQ("T","C",0)),DM2=$O(^DMSQ("T","C",99999999999),-1)
|
---|
60 | S DIR(0)="NO^"_DM1_":"_DM2_":999999999",DIR("A")="Starting File Number"
|
---|
61 | S DIR("?")="Enter the number of the file, e.g. 200 or 1.5215"
|
---|
62 | S DIR("B")=.401 D ^DIR S:$D(DIRUT) DMQ=1 K DIR Q:DMQ S DMFN=Y
|
---|
63 | I '$D(^DMSQ("T","C",DMFN)) W !,"SQLI table not found." G ASK
|
---|
64 | Q
|
---|
65 | ASK1 S DIR("B")=DMFN ; default to one file (not a range)
|
---|
66 | S DIR(0)="NO^"_DM1_":"_DM2_":999999999",DIR("A")=" Ending File Number"
|
---|
67 | S DIR("?")="Optionally enter a larger number for a range, e.g. 1.5217"
|
---|
68 | D ^DIR S:$D(DTOUT)!$D(DUOUT) DMQ=1 K DIR Q:DMQ S DMFN1=Y
|
---|
69 | I '$D(^DMSQ("T","C",DMFN1)) D G ASK1
|
---|
70 | . W !!?5,"There isn't a table for the file number you've entered."
|
---|
71 | . W !?5,"(The highest possible number is "_DM2_".)",!
|
---|
72 | I DMFN1'=DMFN,DMFN1'>DMFN D G ASK1
|
---|
73 | . W !!?5,"Enter a LARGER number to get a range."
|
---|
74 | . W !?5,"The highest possible number here is "_DM2_".",!
|
---|
75 | Q
|
---|
76 | ASK2 ; prompt for style of listing (summary counts or detail)
|
---|
77 | S DIR("A")="These reports show counts. Or would you prefer details"
|
---|
78 | S DIR(0)="Y",DIR("B")="NO" D ^DIR K DIR S DMYN=Y S:$D(DIRUT) DMQ=1
|
---|
79 | Q
|
---|
80 | BUILD ;
|
---|
81 | S (DOT,DMFILE)=0
|
---|
82 | F S DMFILE=$O(^DMSQ("T","C",DMFILE)) Q:DMFILE'>0 D
|
---|
83 | . S DOT=DOT+1 W:DOT#20=1 "."
|
---|
84 | . S (DMWP,DMFK,DMPFK,DMSR)=0,DMX=$O(^DMSQ("T","C",DMFILE,0))
|
---|
85 | . I '$D(^DMSQ("E","F",DMX,"F")) D DEFINE Q
|
---|
86 | . ;word-processing domains are character, so DMWP never set
|
---|
87 | . ;perhaps use dbs field retriever to get type (e.g. wp)
|
---|
88 | . ;S DMCI=$O(^DMSQ("C","D",DMFILE,.01,0)) D:DMCI
|
---|
89 | . ;. S DMEI=$P(^DMSQ("C",DMCI,0),U,1)
|
---|
90 | . ;. S DMDI=$P(^DMSQ("E",DMEI,0),U,2)
|
---|
91 | . ;. S:DMDI=$O(^DMSQ("DM","B","WORD_PROCESSING",0)) DMWP=DMWP+1
|
---|
92 | . S DME=0 F S DME=$O(^DMSQ("E","F",DMX,"F",DME)) Q:DME'>0 D
|
---|
93 | .. S DMF=$O(^DMSQ("F","B",DME,0))
|
---|
94 | .. S DMCOL=$P(^DMSQ("F",DMF,0),U,3)
|
---|
95 | .. S:$P(^DMSQ("C",DMCOL,0),U,5) DMFK=DMFK+1
|
---|
96 | .. S:'$P(^DMSQ("C",DMCOL,0),U,5) DMPFK=DMPFK+1
|
---|
97 | .. S DMDM=$P(^DMSQ("E",DME,0),U,2)
|
---|
98 | .. S DMY=$P(^DMSQ("DM",DMDM,0),U,4)
|
---|
99 | .. S:DMX=DMY DMSR=DMSR+1
|
---|
100 | .. D:$O(^DMSQ("E","F",DMX,"F",DME))="" DEFINE
|
---|
101 | Q
|
---|
102 | DEFINE ;
|
---|
103 | S DMBFK=0 S:$D(^TMP("DMCT1",$J,DMX))=1 DMBFK=^(DMX)
|
---|
104 | S DMBPFK=0 S:$D(^TMP("DMCT2",$J,DMX))=1 DMBPFK=^(DMX)
|
---|
105 | S ^TMP("DM",$J,DMFILE,DMWP,DMSR,DMPFK,DMBPFK,DMFK,DMBFK,DMX)=""
|
---|
106 | Q
|
---|
107 | TOTS ;
|
---|
108 | S (DOT,DM1,DMC1,DMC2,DMC3,DMC4,DMC5,DMC6,DMC7)=0
|
---|
109 | S (DMCN2,DMCN3,DMCN4,DMCN5,DMCN6,DMCN7,DMCN8)=0
|
---|
110 | F S DM1=$O(^TMP("DM",$J,DM1)) Q:DM1="" D
|
---|
111 | . S DOT=DOT+1 W:DOT#20=1 "."
|
---|
112 | . S DMTBL=$O(^DMSQ("T","C",DM1,0)),DMC1=DMC1+1,DM2=""
|
---|
113 | . F S DM2=$O(^TMP("DM",$J,DM1,DM2)) Q:DM2="" D
|
---|
114 | .. S ^TMP("DMFQ2",$J,999-DM2,DM2,DMTBL)=""
|
---|
115 | .. S:DM2 DMCN2=DMCN2+1 S DMC2=DMC2+DM2,DM3=""
|
---|
116 | .. F S DM3=$O(^TMP("DM",$J,DM1,DM2,DM3)) Q:DM3="" D
|
---|
117 | ... S ^TMP("DMFQ3",$J,9999-DM3,DM3,DMTBL)=""
|
---|
118 | ... S:DM3 DMCN3=DMCN3+1 S DMC3=DMC3+DM3,DM4=""
|
---|
119 | ... F S DM4=$O(^TMP("DM",$J,DM1,DM2,DM3,DM4)) Q:DM4="" D
|
---|
120 | .... S ^TMP("DMFQ4",$J,DM2,9999-DM4,DM4,DMTBL)=""
|
---|
121 | .... S:DM4 DMCN4=DMCN4+1 S DMC4=DMC4+DM4,DM5=""
|
---|
122 | .... F S DM5=$O(^TMP("DM",$J,DM1,DM2,DM3,DM4,DM5)) Q:DM5="" D
|
---|
123 | ..... S ^TMP("DMFQ5",$J,9999-DM5,DM5,DMTBL)=""
|
---|
124 | ..... S:DM5 DMCN5=DMCN5+1 S DMC5=DMC5+DM5,DM6=""
|
---|
125 | ..... F S DM6=$O(^TMP("DM",$J,DM1,DM2,DM3,DM4,DM5,DM6)) Q:DM6="" D
|
---|
126 | ...... S ^TMP("DMFQ6",$J,9999-DM6,DM6,DMTBL)=""
|
---|
127 | ...... S:DM6 DMCN6=DMCN6+1 S DMC6=DMC6+DM6,DM7=""
|
---|
128 | ...... F S DM7=$O(^TMP("DM",$J,DM1,DM2,DM3,DM4,DM5,DM6,DM7)) Q:DM7="" D
|
---|
129 | ....... S ^TMP("DMFQ7",$J,9999-DM7,DM7,DMTBL)=""
|
---|
130 | ....... S:DM7 DMCN7=DMCN7+1 S DMC7=DMC7+DM7
|
---|
131 | ....... S:'(DM4+DM5+DM6+DM7) DMCN8=DMCN8+1
|
---|
132 | S ^TMP("DMTN",$J,DMC1,DMCN2,DMCN3,DMCN4,DMCN5,DMCN6,DMCN7,DMCN8)=""
|
---|
133 | S ^TMP("DMT",$J,DMC1,DMC2,DMC3,DMC4,DMC5,DMC6,DMC7)=""
|
---|
134 | Q
|
---|
135 | PAIRS ; build array with to-table and from-tables that point
|
---|
136 | S (DOT,DMFILE)=0 W !,"Please wait..."
|
---|
137 | F S DMFILE=$O(^DMSQ("T","C",DMFILE)) Q:DMFILE'>0 D
|
---|
138 | . S DOT=DOT+1 W:DOT#20=1 "."
|
---|
139 | . S DMX=$O(^DMSQ("T","C",DMFILE,0))
|
---|
140 | . S DME=0 F S DME=$O(^DMSQ("E","F",DMX,"F",DME)) Q:DME'>0 D
|
---|
141 | .. S DMDM=$P(^DMSQ("E",DME,0),U,2)
|
---|
142 | .. S DMY=$P(^DMSQ("DM",DMDM,0),U,4)
|
---|
143 | .. S DMF=$O(^DMSQ("F","B",DME,0)) ; get foreign key ien
|
---|
144 | .. S DMCOL=$P(^DMSQ("F",DMF,0),U,3) ; get column pointer
|
---|
145 | .. I $P(^DMSQ("C",DMCOL,0),U,5) S ^TMP("DMP1",$J,DMY,DMX,DMF)=""
|
---|
146 | .. E S ^TMP("DMP2",$J,DMY,DMX)=""
|
---|
147 | Q
|
---|
148 | CNT ; get reference counts
|
---|
149 | S DM1=0 W "." F S DM1=$O(^TMP("DMP1",$J,DM1)) Q:DM1'>0 D
|
---|
150 | . S (DM2,DMCT)=0
|
---|
151 | . F S DM2=$O(^TMP("DMP1",$J,DM1,DM2)) Q:DM2'>0 D
|
---|
152 | .. S DM3=0
|
---|
153 | .. F S DM3=$O(^TMP("DMP1",$J,DM1,DM2,DM3)) Q:DM3'>0 S DMCT=DMCT+1
|
---|
154 | .. S ^TMP("DMCT1",$J,DM1)=DMCT
|
---|
155 | S DM1=0 F S DM1=$O(^TMP("DMP2",$J,DM1)) Q:DM1'>0 D
|
---|
156 | . S (DM2,DMCT)=0
|
---|
157 | . F S DM2=$O(^TMP("DMP2",$J,DM1,DM2)) Q:DM2'>0 S DMCT=DMCT+1
|
---|
158 | . S ^TMP("DMCT2",$J,DM1)=DMCT
|
---|
159 | Q
|
---|
160 | PRT ;
|
---|
161 | S DIC="1.5215",L=0,DHD="SQLI TABLE POINTER COUNTS"
|
---|
162 | S FLDS="""SQLI TABLE NAME: "";C28;S,.01;X"
|
---|
163 | S BY(0)="^TMP(""DM"",$J,",L(0)=8,FR(0,1)=DMFN,TO(0,1)=DMFN1
|
---|
164 | S DISPAR(0,1)="^;""FILE/SUBFILE: "";C1;S"
|
---|
165 | S DISPAR(0,1,"OUT")="S Y=Y_"" ""_$S($D(^DIC(Y)):$P(^(Y,0),U),1:$O(^DD(Y,0,""NM"",0)))"
|
---|
166 | ;S DISPAR(0,2)="^;""WORD-PROCESSING TABLE? "";C50"
|
---|
167 | ;S DISPAR(0,2,"OUT")="S Y=$S(+Y:""YES"",1:""NO"")"
|
---|
168 | S DISPAR(0,3)="^;""SELF-REFERENTIAL POINTERS: "";C18"
|
---|
169 | S DISPAR(0,4)="^;""POINTERS DOWNWARD TO THIS SUBFILE: "";C10;S"
|
---|
170 | S DISPAR(0,5)="^;""POINTERS UPWARD FROM DEEPER SUBFILES: "";C7"
|
---|
171 | S DISPAR(0,6)="^;""POINTERS OUTWARD TO OTHER FILES: "";C12;S"
|
---|
172 | S DISPAR(0,7)="^;""POINTERS INWARD FROM OTHER FILES: "";C11"
|
---|
173 | D EN1^DIP Q
|
---|