| 1 | TMGXPDR   ;TMG/kst/Altered version of XPDR ;03/25/06
 | 
|---|
| 2 |          ;;1.0;TMG-LIB;**1**;7/25/05
 | 
|---|
| 3 |  
 | 
|---|
| 4 |  ;"TMGXPDR -- a custom version of XPDR
 | 
|---|
| 5 |  ;"K. Toppenberg, MD 7-25-05
 | 
|---|
| 6 |  
 | 
|---|
| 7 | XPDR    ;SFISC/RSD - Routine File Edit ;09/17/96  10:05
 | 
|---|
| 8 |         ;;8.0;KERNEL;**1,2,44**;Jul 10, 1995
 | 
|---|
| 9 |         Q
 | 
|---|
| 10 |  
 | 
|---|
| 11 | UPDT        ;update routine file
 | 
|---|
| 12 |         new DIR,DIRUT,XPD,XPDI,XPDJ
 | 
|---|
| 13 |         new XPDN  ;"array of included (1 node) and excluded (0 node) namespaces
 | 
|---|
| 14 |         new X,X1,Y,Y1,%
 | 
|---|
| 15 |         new addCount set addCount=0
 | 
|---|
| 16 |  
 | 
|---|
| 17 |         write !!
 | 
|---|
| 18 |         write "** ROUTINE File Updater **",!
 | 
|---|
| 19 |         write "(Allows addition of selected routines to ROUTINE file)",!
 | 
|---|
| 20 |         write "-----------------------------------------------------------",!
 | 
|---|
| 21 |         write !
 | 
|---|
| 22 |         write "Enter namespace of routines to add (e.g. TIU), or",!
 | 
|---|
| 23 |         write "routines to exclude from addition (e.g. -TIU)",!!
 | 
|---|
| 24 |  
 | 
|---|
| 25 |         set DIR(0)="FO^1:9^K:X'?.1""-""1U.7UNP X"
 | 
|---|
| 26 |         set DIR("A")="Routine Namespace ([ENTER] if done)"
 | 
|---|
| 27 |         set DIR("?")="Enter 1 to 8 characters, preceed with ""-"" to exclude namespace"
 | 
|---|
| 28 |  
 | 
|---|
| 29 |         ;"XPDN(0=excluded names or 1=include names, namespace)=""
 | 
|---|
| 30 |         for  do  quit:$data(DIRUT)
 | 
|---|
| 31 |         . do ^DIR
 | 
|---|
| 32 |         . quit:$data(DIRUT)
 | 
|---|
| 33 |         . set X=($extract(Y,$L(Y))="*")
 | 
|---|
| 34 |         . set %=($extract(Y)="-")
 | 
|---|
| 35 |         . set XPDN('%,$extract(Y,%+1,$length(Y)-X))=""
 | 
|---|
| 36 |  
 | 
|---|
| 37 |         if ('$data(XPDN))!($data(DTOUT))!($data(DUOUT)) write ! goto UPDTQ
 | 
|---|
| 38 |         ;"quit:'$data(XPDN)!$data(DTOUT)!$data(DUOUT)
 | 
|---|
| 39 |         write !!,"NAMESPACE  INCLUDE",?35,"EXCLUDE",!,?11,"-------",?35,"-------"
 | 
|---|
| 40 |         set (X,Y)=""
 | 
|---|
| 41 |         set (X1,Y1)=1
 | 
|---|
| 42 |         for  do  write !?11,X,?35,Y quit:'X1&'Y1
 | 
|---|
| 43 |         . set:X1 X=$O(XPDN(1,X)),X1=X]""
 | 
|---|
| 44 |         . set:Y1 Y=$O(XPDN(0,Y)),Y1=Y]""
 | 
|---|
| 45 |  
 | 
|---|
| 46 |         kill DIR
 | 
|---|
| 47 |         set DIR(0)="Y"
 | 
|---|
| 48 |         set DIR("A")="OK to continue"
 | 
|---|
| 49 |         set DIR("B")="YES"
 | 
|---|
| 50 |         do ^DIR
 | 
|---|
| 51 |  
 | 
|---|
| 52 |         quit:'Y!$data(DIRUT)
 | 
|---|
| 53 |         write !
 | 
|---|
| 54 |         set DIR(0)="Y"
 | 
|---|
| 55 |         set DIR("A")="Want me to clean up the Routine File before updating"
 | 
|---|
| 56 |         set DIR("?")="YES means you want to go throught the Routine file and delete any routine name that no longer exists on the system."
 | 
|---|
| 57 |         do ^DIR
 | 
|---|
| 58 |  
 | 
|---|
| 59 |         quit:$data(DIRUT)
 | 
|---|
| 60 |         do WAIT^DICD
 | 
|---|
| 61 |         write !
 | 
|---|
| 62 |         do DELRTN:Y
 | 
|---|
| 63 |  
 | 
|---|
| 64 |         ;"----------------------------------------------------------------------------
 | 
|---|
| 65 |         ;"Replacement code for below...
 | 
|---|
| 66 |         new XPDArray
 | 
|---|
| 67 |         merge XPDArray=XPDN(1)  ;"node 1=>included namespaces
 | 
|---|
| 68 |         ;"ensure that all entries end with "*" (e.g. "TMG*" not "TMG")
 | 
|---|
| 69 |         set XPDI=$order(XPDArray(""))
 | 
|---|
| 70 |         if XPDI'="" for  do  quit:XPDI=""
 | 
|---|
| 71 |         . new node set node=XPDI
 | 
|---|
| 72 |         . set XPDI=$order(XPDArray(node))
 | 
|---|
| 73 |         . if ($extract(node,$length(node))'="*") do
 | 
|---|
| 74 |         . . kill XPDArray(node)
 | 
|---|
| 75 |         . . set XPDArray(node_"*")=""
 | 
|---|
| 76 |  
 | 
|---|
| 77 |         do NOINT^%RSEL("XPDArray")  ;"creates %ZR - an array of existing routines matching input request
 | 
|---|
| 78 |         set XPDJ=""
 | 
|---|
| 79 |         for  do  quit:XPDJ=""
 | 
|---|
| 80 |         . set XPDJ=$order(%ZR(XPDJ))
 | 
|---|
| 81 |         . if XPDJ="" quit
 | 
|---|
| 82 |         . if $data(XPDN(0,XPDJ)) quit ;"if name XPDJ is in the exclude list, skip
 | 
|---|
| 83 |         . if $order(^DIC(9.8,"B",XPDJ,0)) quit  ;"if name XPDJ is already in Routine file, skip
 | 
|---|
| 84 |         . ;"check if XPDJ is refered in the EXCLUDED namespace by checking the subscript before XPDJ
 | 
|---|
| 85 |         . set %=$order(XPDN(0,XPDJ),-1)
 | 
|---|
| 86 |         . ;"if sub exist and $piece(XPDJ,sub)="" then it is part of the namespace, quit
 | 
|---|
| 87 |         . if ($length(%)>0)&($piece(XPDJ,%)="") quit
 | 
|---|
| 88 |         . ;"Add routine to ROUTINE file
 | 
|---|
| 89 |         . new XPD
 | 
|---|
| 90 |         . set XPD(9.8,"+1,",.01)=XPDJ
 | 
|---|
| 91 |         . set XPD(9.8,"+1,",1)="R"
 | 
|---|
| 92 |         . do ADD^DICA("","XPD")
 | 
|---|
| 93 |         . write "Added: ",XPDJ,!
 | 
|---|
| 94 |         . set addCount=addCount+1
 | 
|---|
| 95 | UPDTQ
 | 
|---|
| 96 |         write "    ...Done.",!
 | 
|---|
| 97 |         if addCount=0 write "ROUTINE file already up to date.  No additions needed.",!
 | 
|---|
| 98 |         else  write addCount," entries added to ROUTINE file.",!
 | 
|---|
| 99 |         write "Leaving ROUTINE File Updater.",!
 | 
|---|
| 100 |         quit
 | 
|---|
| 101 |  
 | 
|---|
| 102 |         ;"----------------------------------------------------------------------------
 | 
|---|
| 103 |  
 | 
|---|
| 104 |         ;"loop thru include list XPDN(1,*), i.e. included nodes-->requested namespaces
 | 
|---|
| 105 |         ;"Goal: to consider each requested namespace...
 | 
|---|
| 106 |  
 | 
|---|
| 107 |         ;"Pseudocode:
 | 
|---|
| 108 |         ;"          loop  (through all requested namespaces)
 | 
|---|
| 109 |         ;"            XPDI = currently considered namespace
 | 
|---|
| 110 |         ;"            loop (through all available routines--starting at XPDI)
 | 
|---|
| 111 |         ;"              XPDJ is current routine name being considered -- from all available routines
 | 
|---|
| 112 |         ;"              if current routine name (XPDJ) is in exclude list, skip
 | 
|---|
| 113 |         ;"              if current routine name (XPDJ) is already in the ROUTINE file, then skip
 | 
|---|
| 114 |         ;"              ... (to be completed)
 | 
|---|
| 115 |  
 | 
|---|
| 116 |         ;set XPDI=""
 | 
|---|
| 117 |         ;for  do  quit:XPDI=""
 | 
|---|
| 118 |         ;. set XPDI=$order(XPDN(1,XPDI))
 | 
|---|
| 119 |         ;. quit:XPDI=""
 | 
|---|
| 120 |         ;. set XPDJ=XPDI
 | 
|---|
| 121 |         ;. if '$data(^$routine(XPDJ)) quit
 | 
|---|
| 122 |         ;. for  set XPDJ=$order(^$routine(XPDJ)) quit:(XPDJ="")!($piece(XPDJ,XPDI)]"")  do
 | 
|---|
| 123 |         ;. . if $data(XPDN(0,XPDJ)) quit ;"if name XPDJ is in the exclude list, XPDN(0,XPDJ) quit
 | 
|---|
| 124 |         ;. . if $order(^DIC(9.8,"B",XPDJ,0)) quit  ;"if name XPDJ is in Routine file, quit
 | 
|---|
| 125 |         ;. . ;"check if XPDJ is refered in the EXCLUDED namespace by checking the subscript before XPDJ
 | 
|---|
| 126 |         ;. . set %=$order(XPDN(0,XPDJ),-1)
 | 
|---|
| 127 |         ;. . ;"if sub exist and $piece(XPDJ,sub)="" then it is part of the namespace, quit
 | 
|---|
| 128 |         ;. . if ($length(%)>0)&($piece(XPDJ,%)="") quit ;"e.g $piece("TMGTEST",
 | 
|---|
| 129 |         ;. . new XPD
 | 
|---|
| 130 |         ;. . set XPD(9.8,"+1,",.01)=XPDJ
 | 
|---|
| 131 |         ;. . set XPD(9.8,"+1,",1)="R"
 | 
|---|
| 132 |         ;. . do ADD^DICA("","XPD")
 | 
|---|
| 133 |         ;write "    ...Done.",!
 | 
|---|
| 134 |         ;quit
 | 
|---|
| 135 |  
 | 
|---|
| 136 | VER        ;verify Routine file
 | 
|---|
| 137 |         N DIR,DIRUT,X,Y
 | 
|---|
| 138 |         W !,"I will delete all entries in the ROUTINE file in which",!,"the Routine no longer exist on this system!",!
 | 
|---|
| 139 |         S DIR(0)="Y",DIR("A")="OK to continue",DIR("B")="YES" D ^DIR
 | 
|---|
| 140 |         Q:'Y!$D(DIRUT)  D DELRTN
 | 
|---|
| 141 |         W "    ...Done.",!
 | 
|---|
| 142 |         Q
 | 
|---|
| 143 | DELRTN        ;delete routine file entries
 | 
|---|
| 144 |         N DA,DIK,Y,count,max,delNum
 | 
|---|
| 145 |         S DIK="^DIC(9.8,",DA=0,count=0,max=0,delNum=0
 | 
|---|
| 146 |  ;"        F  S DA=$O(^DIC(9.8,DA)) Q:'DA  S Y=$G(^(DA,0)) I $P(Y,U,2)="R",$T(^@$P(Y,U))="" D ^DIK
 | 
|---|
| 147 |         do INIT^XPDID
 | 
|---|
| 148 |         for  set DA=$order(^DIC(9.8,DA)) quit:'DA  set max=max+1
 | 
|---|
| 149 |         if max=0 set max=1
 | 
|---|
| 150 |         set XPDIDTOT=max
 | 
|---|
| 151 |         do TITLE^XPDID("Scanning for Entries to Remove...")
 | 
|---|
| 152 |         set DA=0
 | 
|---|
| 153 |         write !,"Starting search...",!
 | 
|---|
| 154 |         for  set DA=$order(^DIC(9.8,DA)) quit:'DA  do
 | 
|---|
| 155 |         . set count=count+1
 | 
|---|
| 156 |         . if count#50=0 do UPDATE^XPDID(count)
 | 
|---|
| 157 |         . set Y=$G(^(DA,0))
 | 
|---|
| 158 |         . if ($piece(Y,U,2)="R")&($text(^@$piece(Y,U))="") do
 | 
|---|
| 159 |         . . write "Removing: ",$piece(Y,U),!
 | 
|---|
| 160 |         . . set delNum=delNum+1
 | 
|---|
| 161 |         . . do ^DIK
 | 
|---|
| 162 |         write !
 | 
|---|
| 163 |         if delNum>0 do
 | 
|---|
| 164 |         . new temp
 | 
|---|
| 165 |         . write "Done scanning.  ",delNum," Entries removed.",!
 | 
|---|
| 166 |         . read "Please press [ENTER] to continue.",temp:$get(DTIME,3600),!
 | 
|---|
| 167 |         do EXIT^XPDID()
 | 
|---|
| 168 |         quit
 | 
|---|
| 169 | PURGE        ;purge file
 | 
|---|
| 170 |         N DA,DIK,DIR,DIRUT,X,XPD,XPDF,XPDI,XPDJ,XPDL,XPDN,XPDPG,XPDS,XPDUL,Y,Z
 | 
|---|
| 171 |         S DIR("?")="Enter the file you want to purge the data from.",DIR(0)="SM^B:Build;I:Install;ALL:Build & Install",DIR("A")="Purge from what file(s)"
 | 
|---|
| 172 |         D ^DIR Q:$D(DIRUT)
 | 
|---|
| 173 |         S XPDF=$S(Y="I":9.7,1:9.6) S:Y="ALL" XPDF(1)=9.7
 | 
|---|
| 174 |         K DIR S DIR("?")="Enter the number of Versions to keep in the file, for each package",DIR(0)="N^0:100:0",DIR("A")="Versions to Retain",DIR("B")=1
 | 
|---|
| 175 |         D ^DIR Q:$D(DIRUT)  S XPDN=Y
 | 
|---|
| 176 |         K DIR
 | 
|---|
| 177 |         S DIR(0)="FO^3:30",DIR("?")="^D PURGEH^XPDR",DIR("A")="Package Name",DIR("B")="ALL"
 | 
|---|
| 178 |         F  D ^DIR Q:$D(DIRUT)  S XPD(X)="" Q:X="ALL"  K DIR("B") S DIR("A")="Another Package Name"
 | 
|---|
| 179 |         Q:'$D(XPD)
 | 
|---|
| 180 |         ;if they want all, make sure all is the only one
 | 
|---|
| 181 |         I $D(XPD("ALL")) K XPD S XPD("ALL")=""
 | 
|---|
| 182 |         ;XPDF(1) is defined if doing both files, do purge twice
 | 
|---|
| 183 |         K ^TMP($J) D PURGE1(XPDF),PURGE1($G(XPDF(1))):$D(XPDF(1))
 | 
|---|
| 184 |         I '$D(^TMP($J)) W !!,"No match found" Q
 | 
|---|
| 185 |         K XPD,DIR
 | 
|---|
| 186 |         S DIR(0)="E",$P(XPDUL,"-",IOM)=""
 | 
|---|
| 187 |         ;if ALL, reset XPDF to next file and Do, then reset back to 9.6
 | 
|---|
| 188 |         D  I $D(XPDF(1)) D ^DIR I Y S XPDF=XPDF(1) D  S XPDF=9.6
 | 
|---|
| 189 |         .S XPD="^TMP("_$J_","_XPDF,XPDS=XPD_",",XPD=XPD_")",XPDL=$L(XPDS),XPDPG=1,Y=1
 | 
|---|
| 190 |         .W @IOF D HDR
 | 
|---|
| 191 |         .;loop thru ^TMP($J,file,package) & show list, quit if user "^"
 | 
|---|
| 192 |         .F  S XPD=$Q(@XPD) Q:XPD=""!($E(XPD,1,XPDL)'=XPDS)  D  Q:'Y
 | 
|---|
| 193 |         ..S Z=@XPD W $P(Z,"^"),$S($P(Z,"^",3):"  (duplicates)",1:""),! Q:$Y<(IOSL-4)
 | 
|---|
| 194 |         ..D ^DIR Q:'Y
 | 
|---|
| 195 |         ..S XPDPG=XPDPG+1 W @IOF D HDR
 | 
|---|
| 196 |         S DIR(0)="Y",DIR("A")="OK to DELETE these entries",DIR("B")="NO"
 | 
|---|
| 197 |         W !! D ^DIR
 | 
|---|
| 198 |         I $D(DIRUT)!'Y W !!,"Nothing Purged" Q
 | 
|---|
| 199 |         ;loop thru and delete
 | 
|---|
| 200 |         D  I $D(XPDF(1)) S XPDF=XPDF(1) D
 | 
|---|
| 201 |         .S DIK="^XPD("_XPDF_",",XPD="^TMP("_$J_","_XPDF,XPDS=XPD_",",XPD=XPD_")",XPDL=$L(XPDS)
 | 
|---|
| 202 |         .F  S XPD=$Q(@XPD) Q:XPD=""!($E(XPD,1,XPDL)'=XPDS)  D
 | 
|---|
| 203 |         ..S XPDI=@XPD F XPDJ=2:1 S DA=$P(XPDI,"^",XPDJ) Q:'DA  D ^DIK
 | 
|---|
| 204 |         Q
 | 
|---|
| 205 |         ;
 | 
|---|
| 206 | PURGE1(XPDF)        ;XPDF=file #
 | 
|---|
| 207 |         N XPDFL,XPDI,XPDJ,XPDP,XPDV,Y,Z
 | 
|---|
| 208 |         W "."
 | 
|---|
| 209 |         ;if All, loop thru B x-ref
 | 
|---|
| 210 |         I $D(XPD("ALL")) D
 | 
|---|
| 211 |         .S XPDI=""
 | 
|---|
| 212 |         .F  S XPDI=$O(^XPD(XPDF,"B",XPDI)) Q:XPDI=""  D
 | 
|---|
| 213 |         ..S X=$$PKG^XPDUTL(XPDI) D PURGE2(X)
 | 
|---|
| 214 |         ..W "."
 | 
|---|
| 215 |         E  S XPDI="" F  S XPDI=$O(XPD(XPDI)) Q:XPDI=""  D
 | 
|---|
| 216 |         .D PURGE2(XPDI)
 | 
|---|
| 217 |         .W "."
 | 
|---|
| 218 |         ;loop thru each package, XPDP=package name
 | 
|---|
| 219 |         S XPDP="" F  S XPDP=$O(^TMP($J,XPDF,XPDP)) Q:XPDP=""  D
 | 
|---|
| 220 |         .S XPDV="",XPDL=XPDN
 | 
|---|
| 221 |         .;the last is the most recent, XPDN = number to retain, XPDV=version
 | 
|---|
| 222 |         .;XPDS=type (T/V/Z)
 | 
|---|
| 223 |         .F  S XPDV=$O(^TMP($J,XPDF,XPDP,XPDV),-1),XPDS="" Q:'XPDV!'XPDL  F  S XPDS=$O(^TMP($J,XPDF,XPDP,XPDV,XPDS),-1) Q:XPDS=""!'XPDL  D
 | 
|---|
| 224 |         ..S Y="" F  S Y=$O(^TMP($J,XPDF,XPDP,XPDV,XPDS,Y),-1) Q:Y=""!'XPDL  D
 | 
|---|
| 225 |         ...I $D(^TMP($J,XPDF,XPDP,XPDV,XPDS,Y))#2 K ^(Y) S XPDL=XPDL-1 Q
 | 
|---|
| 226 |         ...S Z="" F  S Z=$O(^TMP($J,XPDF,XPDP,XPDV,XPDS,Y,Z),-1) Q:Z=""!'XPDL  K ^(Z) S XPDL=XPDL-1
 | 
|---|
| 227 |         Q
 | 
|---|
| 228 |         ;
 | 
|---|
| 229 | PURGE2(XPDX)        ;XPDX=package name
 | 
|---|
| 230 |         ;XPDFL=1 this is not a patch, quit when we find a patch during loop
 | 
|---|
| 231 |         S XPDS=XPDX,XPDL=$L(XPDX),XPDFL=XPDX'["*"
 | 
|---|
| 232 |         ;loop and find matches
 | 
|---|
| 233 |         D  F  S XPDS=$O(^XPD(XPDF,"B",XPDS)) Q:XPDS=""!($E(XPDS,1,XPDL)'=XPDX)!($S(XPDFL:XPDS["*",1:0))  D
 | 
|---|
| 234 |         .S Y=$O(^XPD(XPDF,"B",XPDS,0)) Q:'Y
 | 
|---|
| 235 |         .Q:'$D(^XPD(XPDF,Y,0))  S Z=^(0),Y=XPDS_"^"_Y
 | 
|---|
| 236 |         .;can't delete Installs that status isn't 'Install Completed'
 | 
|---|
| 237 |         .I XPDF=9.7 Q:$P(Z,U,9)<3
 | 
|---|
| 238 |         .S XPDV=$$VER^XPDUTL(XPDS)
 | 
|---|
| 239 |         .;TMP($J,file,package name,version,"*","T/V/Z",num,patch)=NAME^DA^duplicat DAs
 | 
|---|
| 240 |         .I XPDS["*" D  Q
 | 
|---|
| 241 |         ..I XPDV?1.2N1"."1.2N S ^TMP($J,XPDF,$$PKG^XPDUTL(XPDS),+XPDV,"*Z",0,+$P(XPDS,"*",3))=Y_$$DUP(XPDS,$P(Y,"^",2)) Q
 | 
|---|
| 242 |         ..I XPDV["T" S ^TMP($J,XPDF,$$PKG^XPDUTL(XPDS),+XPDV,"*T",+$P(XPDV,"T",2),+$P(XPDS,"*",3))=Y_$$DUP(XPDS,$P(Y,"^",2)) Q
 | 
|---|
| 243 |         ..I XPDV["V" S ^TMP($J,XPDF,$$PKG^XPDUTL(XPDS),+XPDV,"*V",+$P(XPDV,"V",2),+$P(XPDS,"*",3))=Y_$$DUP(XPDS,$P(Y,"^",2)) Q
 | 
|---|
| 244 |         ..S ^TMP($J,XPDF,$$PKG^XPDUTL(XPDS),+XPDV,"*",+$P(XPDS,"*",3))=Y_$$DUP(XPDS,$P(Y,"^",2))
 | 
|---|
| 245 |         .;TMP($J,file,package name,version,"Z",0)=NAME^DA^duplicate DAs
 | 
|---|
| 246 |         .I XPDV?1.2N1"."1.2N S ^TMP($J,XPDF,$$PKG^XPDUTL(XPDS),+XPDV,"Z",0)=Y_$$DUP(XPDS,$P(Y,"^",2)) Q
 | 
|---|
| 247 |         .;TMP($J,file,package name,version,"T/V",num)=NAME^DA^dup DAs
 | 
|---|
| 248 |         .I XPDV["T" S ^TMP($J,XPDF,$$PKG^XPDUTL(XPDS),+XPDV,"T",+$P(XPDV,"T",2))=Y_$$DUP(XPDS,$P(Y,"^",2)) Q
 | 
|---|
| 249 |         .I XPDV["V" S ^TMP($J,XPDF,$$PKG^XPDUTL(XPDS),+XPDV,"V",+$P(XPDV,"V",2))=Y_$$DUP(XPDS,$P(Y,"^",2)) Q
 | 
|---|
| 250 |         Q
 | 
|---|
| 251 | PURGEH        ;executable help from DIR call at PURGE+8
 | 
|---|
| 252 |         W:$E(DIR("A"),1)="P" !,"Enter 'ALL' to purge all packages, or"
 | 
|---|
| 253 |         W !,"Enter the name of the Package you want to Purge.",!," i.e. KERNEL 8.0  will purge version 8.0Tx and 8.0Vx",!,"      XU*8.0 will purge all patches for 8.0",!
 | 
|---|
| 254 |         N DIR,X,Y
 | 
|---|
| 255 |         S DIR(0)="Y",DIR("A")="Want to see the "_$S(XPDF=9.7:"Install File",$D(XPDF(1)):"Build & Install Files",1:"Build File")_" List",DIR("B")="Y"
 | 
|---|
| 256 |         D ^DIR Q:'Y!$D(DIRUT)
 | 
|---|
| 257 |         D PURGEH1("^XPD(9.6,"):XPDF=9.6,PURGEH1("^XPD(9.7,"):XPDF=9.7!$D(XPDF(1))
 | 
|---|
| 258 |         Q
 | 
|---|
| 259 |         ;
 | 
|---|
| 260 | DUP(Z,Z1)        ;find duplicate, Z=NAME, Z1=last ien
 | 
|---|
| 261 |         ;returns Y=DA^dup DA^dup DA...
 | 
|---|
| 262 |         N Y S Y=""
 | 
|---|
| 263 |         F  S Z1=$O(^XPD(XPDF,"B",Z,Z1)) Q:'Z1  S Y=Y_"^"_Z1
 | 
|---|
| 264 |         Q Y
 | 
|---|
| 265 |         ;
 | 
|---|
| 266 | PURGEH1(DIC)        ;
 | 
|---|
| 267 |         W !!,$S(DIC[9.6:"BUILD ",1:"INSTALL ")_"File"
 | 
|---|
| 268 |         S DIC(0)="QE",X="??" D ^DIC
 | 
|---|
| 269 |         Q
 | 
|---|
| 270 |         ;
 | 
|---|
| 271 | HDR        W !,"Package(s) in ",$S(XPDF=9.7:"INSTALL",1:"BUILD")," File, "
 | 
|---|
| 272 |         I XPDN W "Retain last ",$S(XPDN=1:"version",1:XPDN_" versions")
 | 
|---|
| 273 |         E  W "Don't retain any versions"
 | 
|---|
| 274 |         W ?70,"PAGE ",XPDPG,!,XPDUL,!
 | 
|---|
| 275 |         Q
 | 
|---|