[613] | 1 | DMSQP6 ;SFISC/EZ-DISPLAY TABLE GROUPINGS ;10/30/97 17:51
|
---|
| 2 | ;;22.0;VA FileMan;;Mar 30, 1999
|
---|
| 3 | ;Per VHA Directive 10-93-142, this routine should not be modified.
|
---|
| 4 | INIT ; initialize variables and clear tmp arrays
|
---|
| 5 | D DT^DICRW
|
---|
| 6 | S DMUCI="" I $D(^%ZOSF("UCI"))#2 X ^%ZOSF("UCI") S DMUCI=Y
|
---|
| 7 | CLEAR K ^TMP("DMPAIRS",$J),^TMP("DMCNT",$J),^TMP("DMLIST",$J)
|
---|
| 8 | K ^TMP("DMFLAT",$J),^TMP("DMFIN",$J),^TMP("DMSHR",$J)
|
---|
| 9 | Q
|
---|
| 10 | EXIT ; kill vars
|
---|
| 11 | K DMANS,DMFILE,DMFTIEN,DMTTIEN,DMFK,DMDM,DMTR,DM3,J
|
---|
| 12 | K DMCT,DM,DM1,DM2,DMX,DMX1,DMGRP,DMGCNT,DMG,DMAX,DMT,DMTOT,DMQ
|
---|
| 13 | K DMSHRC,DMUCI,DMSPEC,DMSPECN,DMSPECG,DMQQ
|
---|
| 14 | Q
|
---|
| 15 | PREASK ; confirm that it's okay to wait for interactive processing
|
---|
| 16 | S DIR(0)="Y",DIR("A")="This can take 5-10 minutes. Continue"
|
---|
| 17 | S DIR("B")="NO" D ^DIR K DIR S:Y=0 DMQQ=1
|
---|
| 18 | Q
|
---|
| 19 | ASK ; ask for a cutoff on pointed-to file references
|
---|
| 20 | S DIR(0)="NO^0:1000",DIR("A")="Maximum pointing references",DIR("B")=5
|
---|
| 21 | S DIR("?",1)="This cutoff is used as an upper limit on pointer links. Tables with"
|
---|
| 22 | S DIR("?",2)="more links than this upper limit are displayed as the set of shared tables.",DIR("?",3)=" "
|
---|
| 23 | S DIR("?",4)="Others with common pointer links are then grouped together. The resulting"
|
---|
| 24 | S DIR("?",5)="subsets could be used in SQL Grant statements.",DIR("?",6)=" "
|
---|
| 25 | S DIR("?")="Try using cutoffs between 3 and 10, comparing results."
|
---|
| 26 | D ^DIR K DIR S DMANS=Y S:$D(DIRUT) DMQQ=1
|
---|
| 27 | Q
|
---|
| 28 | ASK1 ; ask for a specific table of interest
|
---|
| 29 | S DIC="1.5215",DIC(0)="QEAM",DIC("S")="I '$P(^(0),U,4)"
|
---|
| 30 | S DIC("A")="Select a Table of Special Interest (Optional): "
|
---|
| 31 | D ^DIC K DIC S DMSPEC=$S(Y=-1:"",1:+Y) S:$D(DTOUT)!$D(DUOUT) DMQQ=1
|
---|
| 32 | S:DMSPEC DMSPECN=$P(^DMSQ("T",DMSPEC,0),U,1) S DMSPECG=""
|
---|
| 33 | Q
|
---|
| 34 | EN ; find groups of tables that point to one another
|
---|
| 35 | I '$O(^DMSQ("S",0)) W !?5,"Sorry, SQLI files are empty.",! Q
|
---|
| 36 | I $$WAIT^DMSQT1 D Q
|
---|
| 37 | . W !?5,"Try later. SQLI is being re-built right now."
|
---|
| 38 | S DMQQ="" D PREASK I $D(DIRUT)!(DMQQ) K DMQQ Q
|
---|
| 39 | D D CLEAR,EXIT
|
---|
| 40 | . D INIT,ASK Q:DMQQ D ASK1 Q:DMQQ
|
---|
| 41 | . D PAIRS,CNT,OTH,GRP,PRT D:DMSPEC PRT3 D PRT2
|
---|
| 42 | Q
|
---|
| 43 | PRT ; print shared table list
|
---|
| 44 | W !!,?9,"LISTING OF SHARED TABLES"
|
---|
| 45 | S DIC="1.5215",L=0
|
---|
| 46 | S DHD="SHARED TABLES = "_DMSHRC_" (CUTOFF OF "_DMANS_") "_DMUCI
|
---|
| 47 | S FLDS=".01;C5;"""","" (""_INTERNAL(#6)_"")"";X"
|
---|
| 48 | S BY(0)="^TMP(""DMSHR"",$J,",L(0)=2
|
---|
| 49 | D EN1^DIP Q
|
---|
| 50 | PRT1 ; detailed report showing pointer links within groups
|
---|
| 51 | W !!,?9,"DETAILED GROUP REPORT"
|
---|
| 52 | S DIC="1.5215",L=0
|
---|
| 53 | S DHD="DETAIL OF GROUPS = "_DMGCNT_" (CUTOFF OF "_DMANS_") "_DMUCI
|
---|
| 54 | S FLDS="""FROM TABLE: "";C5,.01;X,"" (""_INTERNAL(#6)_"")"";X"
|
---|
| 55 | S BY(0)="^TMP(""DMLIST"",$J,",L(0)=3
|
---|
| 56 | S DISPAR(0,1)="^;""GROUP: "";S2"
|
---|
| 57 | S DISPAR(0,1,"OUT")="S Y=$P(^DMSQ(""T"",Y,0),U,1)_"" (""_$P(^(0),U,7)_"")"""
|
---|
| 58 | S DISPAR(0,2)="^;""TO TABLE: "";S;C1"
|
---|
| 59 | S DISPAR(0,2,"OUT")="S Y=$P(^DMSQ(""T"",Y,0),U,1)_"" (""_$P(^(0),U,7)_"")"""
|
---|
| 60 | D EN1^DIP Q
|
---|
| 61 | PRT2 ; print final list of tables by group
|
---|
| 62 | W !!,?9,"COMPLETE REPORT OF ALL GROUPS"
|
---|
| 63 | S DIC="1.5215",L=0
|
---|
| 64 | S DHD="TABLE GROUPS = "_DMGCNT_" (CUTOFF OF "_DMANS_") "_DMUCI
|
---|
| 65 | S FLDS=".01;C5;"""","" (""_INTERNAL(#6)_"")"";X"
|
---|
| 66 | S BY(0)="^TMP(""DMFIN"",$J,",L(0)=4
|
---|
| 67 | S DISPAR(0,2)="^;""TABLE COUNT="";C1;S2"
|
---|
| 68 | S DISPAR(0,3)="^;""GROUP: "";C15"
|
---|
| 69 | S DISPAR(0,3,"OUT")="S Y=$P(^DMSQ(""T"",Y,0),U,1)_"" (""_$P(^(0),U,7)_"")"""
|
---|
| 70 | D EN1^DIP Q
|
---|
| 71 | PRT3 ; just show the group that includes the specified table
|
---|
| 72 | W !!,?9,"PRINT OF JUST ONE GROUP (INCLUDING THE SPECIFIED TABLE)"
|
---|
| 73 | I 'DMSPECG&$D(^TMP("DMCNT",$J,DMSPEC)) W !!,"The selected table doesn't fall in a group; see the shared set." Q
|
---|
| 74 | I 'DMSPECG W !!,"There isn't a group for the selected table; it doesn't have pointer links." Q
|
---|
| 75 | S DIC="1.5215",L=0
|
---|
| 76 | S DHD="GROUP INCLUDING "_DMSPECN_" (CUTOFF OF "_DMANS_") "_DMUCI
|
---|
| 77 | S FLDS=".01;C5;"""","" (""_INTERNAL(#6)_"")"";X"
|
---|
| 78 | S BY(0)="^TMP(""DMFIN"",$J,",L(0)=4
|
---|
| 79 | S DISPAR(0,2)="^;""TABLE COUNT="";C1;S2"
|
---|
| 80 | S DISPAR(0,3)="^;""GROUP: "";C15",(FR(0,3),TO(0,3))=DMSPECG
|
---|
| 81 | S DISPAR(0,3,"OUT")="S Y=$P(^DMSQ(""T"",Y,0),U,1)_"" (""_$P(^(0),U,7)_"")"""
|
---|
| 82 | D EN1^DIP Q
|
---|
| 83 | PAIRS ; build array with to-table and from-tables that link
|
---|
| 84 | S DMFILE=0
|
---|
| 85 | W !,"...... Please wait. Reports take a few minutes to process ...... "
|
---|
| 86 | F S DMFILE=$O(^DMSQ("T","C",DMFILE)) Q:DMFILE'>0 D
|
---|
| 87 | . S DMFTIEN=$O(^DMSQ("T","C",DMFILE,0))
|
---|
| 88 | . S DMFK=0
|
---|
| 89 | . F S DMFK=$O(^DMSQ("E","F",DMFTIEN,"F",DMFK)) Q:DMFK'>0 D
|
---|
| 90 | .. S DMDM=$P(^DMSQ("E",DMFK,0),U,2)
|
---|
| 91 | .. S DMTTIEN=$P(^DMSQ("DM",DMDM,0),U,4)
|
---|
| 92 | .. S:(DMTTIEN'=DMFTIEN) ^TMP("DMPAIRS",$J,DMTTIEN,DMFTIEN)=""
|
---|
| 93 | Q
|
---|
| 94 | CNT ; get reference counts
|
---|
| 95 | S DM1=0
|
---|
| 96 | F S DM1=$O(^TMP("DMPAIRS",$J,DM1)) Q:DM1'>0 D
|
---|
| 97 | . S DM2=0,DMCT=0,DMFILE=$P(^DMSQ("T",DM1,0),U,7)
|
---|
| 98 | . F S DM2=$O(^TMP("DMPAIRS",$J,DM1,DM2)) Q:DM2'>0 D
|
---|
| 99 | .. S DMCT=DMCT+1
|
---|
| 100 | . S ^TMP("DMCNT",$J,DM1)=DMCT
|
---|
| 101 | Q
|
---|
| 102 | GRP ; group the sets of shared tables
|
---|
| 103 | S DMGRP=0
|
---|
| 104 | F S DMGRP=$O(^TMP("DMPAIRS",$J,DMGRP)) Q:DMGRP'>0 W "." D
|
---|
| 105 | . K DMSCR S DMSCR(DMGRP)="" F J=1:1:5 D
|
---|
| 106 | .. S DM1=0 F S DM1=$O(^TMP("DMPAIRS",$J,DM1)) Q:DM1'>0 D
|
---|
| 107 | ... S DM2=0 F S DM2=$O(^TMP("DMPAIRS",$J,DM1,DM2)) Q:DM2'>0 D
|
---|
| 108 | .... S (DMX,DMQ)=0
|
---|
| 109 | .... F Q:DMQ S DMX=$O(DMSCR(DMX)) Q:DMX'>0 D
|
---|
| 110 | ..... S:DMX=DM1 DMSCR(DM2)="",DMQ=1
|
---|
| 111 | ..... S:DMX=DM2 DMSCR(DM1)="",DMQ=1
|
---|
| 112 | .... I DMQ D
|
---|
| 113 | ..... S ^TMP("DMLIST",$J,DMGRP,DM1,DM2)=""
|
---|
| 114 | ..... S ^TMP("DMFLAT",$J,DMGRP,DM1)="",^TMP("DMFLAT",$J,DMGRP,DM2)=""
|
---|
| 115 | ..... K ^TMP("DMPAIRS",$J,DM1,DM2)
|
---|
| 116 | S (DMGCNT,DM)=0
|
---|
| 117 | F S DM=$O(^TMP("DMLIST",$J,DM)) Q:DM'>0 S DMGCNT=DMGCNT+1
|
---|
| 118 | S DM=0 F S DM=$O(^TMP("DMFLAT",$J,DM)) Q:DM'>0 D
|
---|
| 119 | . S (DMX,DMT,DMAX)=0 F S DMX=$O(^TMP("DMFLAT",$J,DM,DMX)) Q:DMX'>0 D
|
---|
| 120 | .. S DMTOT=$G(^TMP("DMCNT",$J,DMX)),DMT=DMT+1
|
---|
| 121 | .. I DMTOT>DMAX S DMAX=DMTOT,DMG=DMX
|
---|
| 122 | . S DMX1=0 F S DMX1=$O(^TMP("DMFLAT",$J,DM,DMX1)) Q:DMX1'>0 D
|
---|
| 123 | .. S DMTR=99999999-DMT,^TMP("DMFIN",$J,DMTR,DMT,DMG,DMX1)=""
|
---|
| 124 | .. S:DMSPEC=DMX1 DMSPECG=DMG
|
---|
| 125 | Q
|
---|
| 126 | OTH ; process with other factor, i.e. cutoff on pointer link limit
|
---|
| 127 | S (DM1,DMSHRC)=0,^TMP("DMSHR",$J,0,0)=""
|
---|
| 128 | F S DM1=$O(^TMP("DMPAIRS",$J,DM1)) Q:DM1'>0 D
|
---|
| 129 | . I $G(^TMP("DMCNT",$J,DM1))>DMANS D
|
---|
| 130 | .. S DM2=0,DMSHRC=DMSHRC+1
|
---|
| 131 | .. S ^TMP("DMSHR",$J,99999-($G(^TMP("DMCNT",$J,DM1))),DM1)=""
|
---|
| 132 | .. F S DM2=$O(^TMP("DMPAIRS",$J,DM1,DM2)) Q:DM2'>0 D
|
---|
| 133 | ... K ^TMP("DMPAIRS",$J,DM1,DM2)
|
---|
| 134 | .. S DM2=0 F S DM2=$O(^TMP("DMPAIRS",$J,DM2)) Q:DM2'>0 D
|
---|
| 135 | ... S DM3=0 F S DM3=$O(^TMP("DMPAIRS",$J,DM2,DM3)) Q:DM3'>0 D
|
---|
| 136 | .... I DM1=DM3 K ^TMP("DMPAIRS",$J,DM2,DM3)
|
---|
| 137 | Q
|
---|