| 1 | PXRMEXID ;SLC/PJH - Reminder Dialog Exchange Install Routine.;08/16/2007
 | 
|---|
| 2 |  ;;2.0;CLINICAL REMINDERS;**6**;Feb 04, 2005;Build 123
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ;==================================================
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 |  ;Install all dialog components in an exchange file entry
 | 
|---|
| 7 |  ;------------------------------------------------
 | 
|---|
| 8 | INSALL N ALL,DIROUT,DIRUT,DTOUT,DUOUT,IND,PXRMDONE
 | 
|---|
| 9 |  ;
 | 
|---|
| 10 |  ;Set the install date and time.
 | 
|---|
| 11 |  S IND="",PXRMDONE=0
 | 
|---|
| 12 |  ;
 | 
|---|
| 13 |  ;Go to full screen mode.
 | 
|---|
| 14 |  D FULL^VALM1
 | 
|---|
| 15 |  ;
 | 
|---|
| 16 |  ;Check if all or none exists - option to install all unchanged
 | 
|---|
| 17 |  N DNAME
 | 
|---|
| 18 |  S DNAME=$G(^TMP("PXRMEXTMP",$J,"PXRMDNAM"))
 | 
|---|
| 19 |  D EXIST^PXRMEXIX(.ALL,DNAME,"reminder dialog","")
 | 
|---|
| 20 |  I ALL=0 D DISP^PXRMEXLD(PXRMMODE) Q
 | 
|---|
| 21 |  ;
 | 
|---|
| 22 |  ;Lock the entire file
 | 
|---|
| 23 |  Q:'$$LOCK
 | 
|---|
| 24 |  F  S IND=$O(^TMP("PXRMEXLD",$J,"SEL",IND),-1) Q:(IND="")!(PXRMDONE)  D
 | 
|---|
| 25 |  .D INSCOM(IND,1)
 | 
|---|
| 26 |  ;
 | 
|---|
| 27 |  ;Clear lock
 | 
|---|
| 28 |  D UNLOCK
 | 
|---|
| 29 |  ;
 | 
|---|
| 30 |  ;Rebuild display workfile
 | 
|---|
| 31 |  D DISP^PXRMEXLD(PXRMMODE)
 | 
|---|
| 32 |  ;
 | 
|---|
| 33 |  K PXRMNMCH
 | 
|---|
| 34 |  Q
 | 
|---|
| 35 |  ;
 | 
|---|
| 36 |  ;Build list of descendents names
 | 
|---|
| 37 |  ;-------------------------------
 | 
|---|
| 38 | INSBLD(NAME,INAME) ;
 | 
|---|
| 39 |  N DNAME,IDATA,ISEQ
 | 
|---|
| 40 |  S ISEQ=0
 | 
|---|
| 41 |  F  S ISEQ=$O(^TMP("PXRMEXTMP",$J,"DMAP",NAME,ISEQ)) Q:'ISEQ  D
 | 
|---|
| 42 |  .S IDATA=$G(^TMP("PXRMEXTMP",$J,"DMAP",NAME,ISEQ)) Q:IDATA=""
 | 
|---|
| 43 |  .S DNAME=$P(IDATA,U) Q:DNAME=""
 | 
|---|
| 44 |  .;
 | 
|---|
| 45 |  .I $D(^TMP("PXRMEXTMP",$J,"DREPL"))>0 D
 | 
|---|
| 46 |  ..S REPL=$$CHKREPL^PXRMEXD1(NAME) I REPL>0 D INSREPL(NAME,REPL,.INAME)
 | 
|---|
| 47 |  .S INAME(DNAME)=""
 | 
|---|
| 48 |  .;Q:$$PXRM(DNAME)  S INAME(DNAME)=""
 | 
|---|
| 49 |  .;Check for descendants
 | 
|---|
| 50 |  .I $D(^TMP("PXRMEXTMP",$J,"DMAP",DNAME)) D INSBLD(DNAME,.INAME)
 | 
|---|
| 51 |  Q
 | 
|---|
| 52 |  ;Build list of replacement names
 | 
|---|
| 53 |  ;-------------------------------
 | 
|---|
| 54 | INSREPL(NAME,REPL,INAME) ;
 | 
|---|
| 55 |  N DNAME,IDATA,ISEQ
 | 
|---|
| 56 |  S ISEQ=0
 | 
|---|
| 57 |  S IDATA=$G(^TMP("PXRMEXTMP",$J,"DREPL",REPL,NAME)) Q:IDATA=""
 | 
|---|
| 58 |  S DNAME=$P(IDATA,U) Q:DNAME=""  S INAME(DNAME)=""
 | 
|---|
| 59 |  ;S DNAME=$P(IDATA,U) Q:DNAME=""  Q:$$PXRM(DNAME)  S INAME(DNAME)=""
 | 
|---|
| 60 |  ;Check for descendants
 | 
|---|
| 61 |  I $D(^TMP("PXRMEXTMP",$J,"DMAP",DNAME)) D INSBLD(DNAME,.INAME)
 | 
|---|
| 62 |  Q
 | 
|---|
| 63 |  ;
 | 
|---|
| 64 |  ;Install component IND
 | 
|---|
| 65 |  ;---------------------
 | 
|---|
| 66 | INSCOM(IND,SILENT) ;
 | 
|---|
| 67 |  N ACTION,ATTR,CSUM,DTYP,EXIEN,END,EXISTS,FILENUM,IND120,JND120
 | 
|---|
| 68 |  N NEWPT01,PT01,START,REPL,SAME,TEMP
 | 
|---|
| 69 |  S TEMP=^TMP("PXRMEXLD",$J,"SEL",IND),FILENUM=$P(TEMP,U,1)
 | 
|---|
| 70 |  S EXISTS=$P(TEMP,U,4),START=$P(TEMP,U,2),END=$P(TEMP,U,3) Q:START=""
 | 
|---|
| 71 |  S JND120=$P(TEMP,U,6) Q:'JND120
 | 
|---|
| 72 |  S IND120=$P(TEMP,U,5) Q:'IND120
 | 
|---|
| 73 |  S TEMP=^PXD(811.8,PXRMRIEN,100,START,0),PT01=$P(TEMP,"~",2) Q:PT01=""
 | 
|---|
| 74 |  S DTYP=$G(^TMP("PXRMEXTMP",$J,"DTYP",PT01))
 | 
|---|
| 75 |  I DTYP="dialog" S DTYP="reminder dialog"
 | 
|---|
| 76 |  ;
 | 
|---|
| 77 |  ;Go to full screen mode.
 | 
|---|
| 78 |  D FULL^VALM1
 | 
|---|
| 79 |  ;
 | 
|---|
| 80 |  ;Check for descendents
 | 
|---|
| 81 |  S REPL=$$CHKREPL^PXRMEXD1(PT01)
 | 
|---|
| 82 |  I 'SILENT&($$INSDSC(PT01)!(REPL>0)) D  Q:PXRMDONE
 | 
|---|
| 83 |  .N ANS,INDS,TEXT
 | 
|---|
| 84 |  .S TEXT(1)=PT01_" ("_DTYP_") contains sub-components."
 | 
|---|
| 85 |  .S TEXT="Install all sub-components with the "_DTYP_": "
 | 
|---|
| 86 |  .;Give option to install all descendents
 | 
|---|
| 87 |  .D ASK^PXRMEXIX(.ANS,.TEXT,1) Q:PXRMDONE
 | 
|---|
| 88 |  .I $G(ANS)="N" S PXRMDONE=1 Q
 | 
|---|
| 89 |  .I $G(ANS)="Y" D
 | 
|---|
| 90 |  ..S INDS=IND
 | 
|---|
| 91 |  ..N IDATA,INAME,IND
 | 
|---|
| 92 |  ..I REPL>0 D INSREPL(PT01,REPL,.INAME)
 | 
|---|
| 93 |  ..;Build list of decendents to install
 | 
|---|
| 94 |  ..D INSBLD(PT01,.INAME)
 | 
|---|
| 95 |  ..;Check if all or none exists - option to install all unchanged
 | 
|---|
| 96 |  ..D EXIST^PXRMEXIX(.ALL,PT01,DTYP,.INAME) Q:PXRMDONE
 | 
|---|
| 97 |  ..;Start at the end of the list
 | 
|---|
| 98 |  ..S IND=""
 | 
|---|
| 99 |  ..F  S IND=$O(^TMP("PXRMEXLD",$J,"SEL",IND),-1) Q:PXRMDONE!(IND=INDS)  D
 | 
|---|
| 100 |  ...N PT01,START,TEMP
 | 
|---|
| 101 |  ...S TEMP=^TMP("PXRMEXLD",$J,"SEL",IND),START=$P(TEMP,U,2) Q:START=""
 | 
|---|
| 102 |  ...S PT01=$P(^PXD(811.8,PXRMRIEN,100,START,0),"~",2) Q:PT01=""
 | 
|---|
| 103 |  ...;Ignore namechanges
 | 
|---|
| 104 |  ...I $D(PXRMNMCH(801.41,PT01)) Q
 | 
|---|
| 105 |  ...;Only install descendents
 | 
|---|
| 106 |  ...I $D(INAME(PT01)) D INSCOM(IND,1)
 | 
|---|
| 107 |  ;
 | 
|---|
| 108 | SETENTRY ;
 | 
|---|
| 109 |  D SETATTR^PXRMEXFI(.ATTR,FILENUM,PT01)
 | 
|---|
| 110 |  S ACTION=""
 | 
|---|
| 111 |  ;Double check that it hasn't been installed
 | 
|---|
| 112 |  S EXIEN=$$EXISTS^PXRMEXIU(801.41,PT01)
 | 
|---|
| 113 |  I EXIEN,'EXISTS S EXISTS=1
 | 
|---|
| 114 |  I EXISTS D
 | 
|---|
| 115 |  . D CHECKSUM^PXRMEXCS(.ATTR,START,END)
 | 
|---|
| 116 |  . S CSUM=$$FILE^PXRMEXCS(ATTR("FILE NUMBER"),EXIEN)
 | 
|---|
| 117 |  . S SAME=$S(ATTR("CHECKSUM")=CSUM:1,1:0)
 | 
|---|
| 118 |  . I SAME D FEIMSG^PXRMEXFI(SAME,.ATTR) S ACTION="S",(PXRMNMCH,NEWPT01)=""
 | 
|---|
| 119 |  I ACTION="" D
 | 
|---|
| 120 |  .;If all components installed the default is 'Install or Overwrite'
 | 
|---|
| 121 |  . S:ALL ACTION=$S(EXISTS:"O",1:"I"),(PXRMNMCH,NEWPT01)=""
 | 
|---|
| 122 |  . S:'ALL ACTION=$$GETFACT^PXRMEXFI(PT01,.ATTR,.NEWPT01,.PXRMNMCH,EXIEN)
 | 
|---|
| 123 |  ;Save what was done for the installation summary.
 | 
|---|
| 124 |  S ^TMP("PXRMEXIAD",$J,IND,ATTR("FILE NAME"),ATTR("PT01"),ACTION)=NEWPT01
 | 
|---|
| 125 |  ;Clear heading
 | 
|---|
| 126 |  S VALMHDR(2)=""
 | 
|---|
| 127 |  ;If the ACTION is Quit then quit the entire install.
 | 
|---|
| 128 |  I ACTION="Q" S PXRMDONE=1 S VALMHDR(2)="Install not completed" Q
 | 
|---|
| 129 |  ;If the ACTION is Skip then skip this component.
 | 
|---|
| 130 |  I ACTION="S" S VALMBCK="R" Q
 | 
|---|
| 131 |  ;If the ACTION is Replace then skip this component.
 | 
|---|
| 132 |  I ACTION="P" S VALMBCK="R",VALMHDR(2)=PT01_" replaced with "_NEWPT01 Q
 | 
|---|
| 133 |  ;Install this component.
 | 
|---|
| 134 |  D FILE^PXRMEXIC(PXRMRIEN,EXIEN,IND120,JND120,ACTION,.ATTR,.PXRMNMCH)
 | 
|---|
| 135 |  S VALMBCK="R"
 | 
|---|
| 136 |  I PXRMDONE S VALMHDR(2)="Install aborted" Q
 | 
|---|
| 137 |  I NEWPT01="" S VALMHDR(2)=PT01_" ("_DTYP_") installed from exchange file."
 | 
|---|
| 138 |  I NEWPT01'="" S VALMHDR(2)=PT01_" installed as "_NEWPT01_"."
 | 
|---|
| 139 |  ;If reminder dialog - disable and give option to link
 | 
|---|
| 140 |  I DTYP="reminder dialog" D
 | 
|---|
| 141 |  .N DNAME
 | 
|---|
| 142 |  .S DNAME=PT01
 | 
|---|
| 143 |  .I NEWPT01'="" S DNAME=NEWPT01
 | 
|---|
| 144 |  .D INSLNK(DNAME)
 | 
|---|
| 145 |  Q
 | 
|---|
| 146 |  ;
 | 
|---|
| 147 |  ;Check for descendents (either elements or prompts)
 | 
|---|
| 148 |  ;--------------------------------------------------
 | 
|---|
| 149 | INSDSC(NAME) ;
 | 
|---|
| 150 |  N DATA,DFOUND,SUB
 | 
|---|
| 151 |  S DFOUND=0,SUB=0
 | 
|---|
| 152 |  F  S SUB=$O(^TMP("PXRMEXTMP",$J,"DMAP",NAME,SUB)) Q:'SUB  D  Q:DFOUND
 | 
|---|
| 153 |  .S DATA=$G(^TMP("PXRMEXTMP",$J,"DMAP",NAME,SUB)) Q:DATA=""
 | 
|---|
| 154 |  .S DFOUND=1
 | 
|---|
| 155 |  .;I '$$PXRM($P(DATA,U)) S DFOUND=1
 | 
|---|
| 156 |  Q DFOUND
 | 
|---|
| 157 |  ;
 | 
|---|
| 158 | INSREPL1(NAME) ;
 | 
|---|
| 159 |  N DATA,DFOUND,SUB
 | 
|---|
| 160 |  S DFOUND=0,SUB=0
 | 
|---|
| 161 |  F  S SUB=$O(^TMP("PXRMEXTMP",$J,"DREPL",NAME,SUB)) Q:'SUB  D  Q:DFOUND
 | 
|---|
| 162 |  .S DATA=$G(^TMP("PXRMEXTMP",$J,"DREPL",NAME,SUB)) Q:DATA=""
 | 
|---|
| 163 |  .S DFOUND=1
 | 
|---|
| 164 |  Q DFOUND
 | 
|---|
| 165 |  ;Option to link dialog to a reminder
 | 
|---|
| 166 |  ;-----------------------------------
 | 
|---|
| 167 | INSLNK(DNAME) ;
 | 
|---|
| 168 |  N DIEN,DISABLE,DSRC,RNAME
 | 
|---|
| 169 |  N DA,DIE,DR
 | 
|---|
| 170 |  ;Disable
 | 
|---|
| 171 |  S DIEN=$O(^PXRMD(801.41,"B",DNAME,"")) Q:'DIEN
 | 
|---|
| 172 |  ;Set dialog as disabled
 | 
|---|
| 173 |  S DISABLE="DISABLED IN EXCHANGE"
 | 
|---|
| 174 |  ;Except for National dialogs
 | 
|---|
| 175 |  I $P(^PXRMD(801.41,DIEN,100),U)="N" S DISABLE=""
 | 
|---|
| 176 |  ;
 | 
|---|
| 177 |  S DR="3///^S X=DISABLE",DIE="^PXRMD(801.41,",DA=$P(DIEN,U)
 | 
|---|
| 178 |  D ^DIE
 | 
|---|
| 179 |  ;
 | 
|---|
| 180 |  ;Quit if already linked
 | 
|---|
| 181 |  I $D(^PXD(811.9,"AG",DIEN)) Q
 | 
|---|
| 182 |  ;
 | 
|---|
| 183 |  S RNAME=""
 | 
|---|
| 184 |  ;If reminder was renamed use as default
 | 
|---|
| 185 |  I $D(PXRMNMCH(811.9)) D
 | 
|---|
| 186 |  .S RNAME=$O(PXRMNMCH(811.9,"")) Q:RNAME=""
 | 
|---|
| 187 |  .S RNAME=$G(PXRMNMCH(811.9,RNAME))
 | 
|---|
| 188 |  ;Otherwise use original reminder name as default
 | 
|---|
| 189 |  I RNAME="" D
 | 
|---|
| 190 |  .N DATA,FOUND,RIEN,SUB
 | 
|---|
| 191 |  .;Rebuild ^TMP("PXRMEXLC",$J
 | 
|---|
| 192 |  .D CDISP^PXRMEXLC(PXRMRIEN)
 | 
|---|
| 193 |  .;
 | 
|---|
| 194 |  .S SUB="",FOUND=0
 | 
|---|
| 195 |  .F  S SUB=$O(^TMP("PXRMEXLC",$J,"SEL",SUB),-1) Q:'SUB  Q:FOUND  D
 | 
|---|
| 196 |  ..S DATA=$G(^TMP("PXRMEXLC",$J,"SEL",SUB)) Q:$P(DATA,U)'=811.9
 | 
|---|
| 197 |  ..S RIEN=$P(DATA,U,4),FOUND=1 Q:'RIEN
 | 
|---|
| 198 |  ..S RNAME=$P($G(^PXD(811.9,RIEN,0)),U)
 | 
|---|
| 199 |  ;
 | 
|---|
| 200 | TAG W !!,"Reminder Dialog "_DNAME_" is not linked to a reminder.",!
 | 
|---|
| 201 |  ;Select reminder to link
 | 
|---|
| 202 |  S IEN=$$SELECT^PXRMINQ("^PXD(811.9,","Select Reminder to Link: ",RNAME)
 | 
|---|
| 203 |  ;Update reminder link in #811.9
 | 
|---|
| 204 |  I $P(IEN,U)'=-1 D
 | 
|---|
| 205 |  .N DA,DIE,DIK,DR
 | 
|---|
| 206 |  .;Set reminder to dialog pointer
 | 
|---|
| 207 |  .S DR="51///^S X=DNAME",DIE="^PXD(811.9,",DA=$P(IEN,U)
 | 
|---|
| 208 |  .D ^DIE
 | 
|---|
| 209 |  .;If source reminder is null replace with linked reminder
 | 
|---|
| 210 |  .S DSRC=$P($G(^PXRMD(801.41,DIEN,0)),U,2) Q:DSRC
 | 
|---|
| 211 |  .S DSRC=$P(IEN,U)
 | 
|---|
| 212 |  .S DR="2///^S X=DSRC",DIE="^PXRMD(801.41,",DA=$P(DIEN,U)
 | 
|---|
| 213 |  .D ^DIE
 | 
|---|
| 214 |  Q
 | 
|---|
| 215 |  ;
 | 
|---|
| 216 |  ;Install Selected Components
 | 
|---|
| 217 |  ;---------------------------
 | 
|---|
| 218 | INSSEL N ALL,IND,PXRMDONE,VALMY
 | 
|---|
| 219 |  N DIROUT,DIRUT,DTOUT,DUOUT
 | 
|---|
| 220 |  N VALMBG,VALMLST
 | 
|---|
| 221 |  S VALMBG=1,VALMLST=+$O(^TMP("PXRMEXLD",$J,"IDX",""),-1)
 | 
|---|
| 222 |  ;Get the list to install.
 | 
|---|
| 223 |  D EN^VALM2(XQORNOD(0))
 | 
|---|
| 224 |  ;
 | 
|---|
| 225 |  ;Set the install date and time.
 | 
|---|
| 226 |  S ALL="",PXRMDONE=0
 | 
|---|
| 227 |  ;
 | 
|---|
| 228 |  ;Lock the entire file
 | 
|---|
| 229 |  Q:'$$LOCK
 | 
|---|
| 230 |  ;
 | 
|---|
| 231 |  S IND=0
 | 
|---|
| 232 |  F  S IND=$O(VALMY(IND)) Q:(+IND=0)!(PXRMDONE)  D INSCOM(IND,0)
 | 
|---|
| 233 |  ;
 | 
|---|
| 234 |  ;Clear locks
 | 
|---|
| 235 |  D UNLOCK
 | 
|---|
| 236 |  ;
 | 
|---|
| 237 |  ;Rebuild workfile
 | 
|---|
| 238 |  D DISP^PXRMEXLD(PXRMMODE)
 | 
|---|
| 239 |  Q
 | 
|---|
| 240 |  ;
 | 
|---|
| 241 |  ;Install the exchange entry PXRMRIEN
 | 
|---|
| 242 |  ;-----------------------------------
 | 
|---|
| 243 | INSTALL N IEN,IND,VALMY
 | 
|---|
| 244 |  ;Make sure the component list exists for this entry. PXRMRIEN is
 | 
|---|
| 245 |  ;set in INSTALL^PXRMEXLR.
 | 
|---|
| 246 |  I '$D(^PXD(811.8,PXRMRIEN,120)) D CLIST^PXRMEXU1(.PXRMRIEN)
 | 
|---|
| 247 |  I PXRMRIEN=-1 Q
 | 
|---|
| 248 |  ;Format the component list for display.
 | 
|---|
| 249 |  D CDISP^PXRMEXLC(PXRMRIEN)
 | 
|---|
| 250 |  S VALMBCK="R",VALMCNT=$O(^TMP("PXRMEXLD",$J,"IDX"),-1)
 | 
|---|
| 251 |  Q
 | 
|---|
| 252 |  ;
 | 
|---|
| 253 | PXRM(NAME) ;Validate prompts
 | 
|---|
| 254 |  ;
 | 
|---|
| 255 |  ;Ignore non-PXRM
 | 
|---|
| 256 |  I $E(NAME,1,4)'="PXRM" Q 0
 | 
|---|
| 257 |  N DIEN,RESULT
 | 
|---|
| 258 |  I $G(PXRMINST)=1 D  Q RESULT
 | 
|---|
| 259 |  .S RESULT=0
 | 
|---|
| 260 |  .S DIEN=$O(^PXRMD(801.41,"B",NAME,"")) I 'DIEN Q
 | 
|---|
| 261 |  .I $P($G(^PXRMD(801.41,DIEN,100)),U)'="N" Q
 | 
|---|
| 262 |  .I ($P($G(^PXRMD(801.41,DIEN,0)),U,4)="P")!($P($G(^PXRMD(801.41,DIEN,0)),U,4)="F") S RESULT=1
 | 
|---|
| 263 |  ;
 | 
|---|
| 264 |  ;Check if this is a national code
 | 
|---|
| 265 |  S DIEN=$O(^PXRMD(801.41,"B",NAME,""))
 | 
|---|
| 266 |  ;If not found abort
 | 
|---|
| 267 |  I 'DIEN Q 0
 | 
|---|
| 268 |  ;if result group/element quit
 | 
|---|
| 269 |  I $P($G(^PXRMD(801.41,DIEN,0)),U,4)="S"!($P($G(^PXRMD(801.41,DIEN,0)),U,4)="T") Q 0
 | 
|---|
| 270 |  ;Check class
 | 
|---|
| 271 |  I $P($G(^PXRMD(801.41,DIEN,100)),U)="N" Q 1
 | 
|---|
| 272 |  ;Otherwise local
 | 
|---|
| 273 |  Q 0
 | 
|---|
| 274 |  ;
 | 
|---|
| 275 |  ;Lock the dialog file
 | 
|---|
| 276 | LOCK() ;
 | 
|---|
| 277 |  L +^PXRMD(801.41):0 I  Q 1
 | 
|---|
| 278 |  E  W !,"Another user is editing this file, try later" H 2
 | 
|---|
| 279 |  Q 0
 | 
|---|
| 280 |  ;
 | 
|---|
| 281 |  ;Clear lock
 | 
|---|
| 282 | UNLOCK L -^PXRMD(801.41)
 | 
|---|
| 283 |  Q
 | 
|---|