XQ12 ;SEA/LUKE,ISD/HGW - MENU MANAGER UTILITIES ;01/10/13 15:09
;;8.0;KERNEL;**9,20,46,157,253,593,614**;Jul 10, 1995;Build 12
;Per VHA Directive 2004-038, this routine should not be modified.
;
DVARS ;Set up (or reset) necessary variables. From ^XQ1 and ^XQT1.
S U="^" I '$D(DUZ)#2 S DUZ=^XUTL("XQ",$J,"DUZ")
S:'$D(DUZ(0))#2 DUZ(0)="" I DUZ(0)="" S:$D(^VA(200,DUZ,0)) DUZ(0)=$P(^(0),U,4)
I '$D(DT) D ^XQDATE S DT=$P(%,".")
I '$D(DUZ("AG")),$D(^XTV(8989.3,1,0)) S DUZ("AG")=$P(^(0),U,8)
I '$D(IOS) S IOS=$S($D(^XUTL("XQ",$J,"IOS"))#2:^("IOS"),1:"")
I '$D(DTIME) S DTIME=$$DTIME^XUP(DUZ,IOS)
I '$D(DUZ("AUTO")) S I=$S($D(^VA(200,DUZ,200)):$P(^(200),U,6),1:"") S:'$L(I) I=$S($D(^%ZIS(1,$I,"XUS")):$P(^("XUS"),U,6),1:"") S:'$L(I) I=$S($D(^XTV(8989.3,1,"XUS")):$P(^("XUS"),U,6),1:"") S:'$L(I) I=1 S DUZ("AUTO")=I
I '$D(DUZ("TEST"))&'$$PROD^XUPROD D
.S DUZ("TEST")=$$GET^XPAR("SYS","XQ MENUMANAGER PROMPT",1,"Q")
.I $L($G(DUZ("TEST")))<3 S DUZ("TEST")=" <TEST ACCOUNT>"
Q
;
INIT ;Entry for new logon, called from the top of ^XQ and ^XQ1
K DIC,Y Q:$D(DUZ)[0 Q:'$D(^VA(200,DUZ,0))
;S:'$D(XQY) XQY=^VA(200,DUZ,201)
I '$D(XQUSER) S XQUSER=$P($P(^VA(200,DUZ,0),U),",",2)_" "_$P($P(^(0),U),",")
;
;Select device tied option, primary menu, or primary window
;
S:'$D(XQY) XQY=""
S %=$G(^VA(200,DUZ,201)),^XUTL("XQ",$J,"XQM")=+%,^("XQW")=$P(%,"^",2)
D:'$D(IO) HOME^%ZIS
I IO]"" S %=$G(^%ZIS(1,IO,201)) I %]"" S XQY=%
I XQY']"" D
.S %=$G(^VA(200,DUZ,201))
.S XQPM=$P(%,U),XQPW=$P(%,U,2),XQSD=$P(%,U,3)
.I XQPW']"" S XQY=XQPM Q
.I XQSD="M" S XQY=XQPM
.E S XQY=XQPW
.Q
;
D SET^XQCHK
S ^XUTL("XQ",$J,1)=XQY_"P"_XQY_"^"_XQY0,^("T")=1
S XQDIC=XQY,XQPSM="P"_XQY
;
; P593 Run XU USER START-UP menu option for terminal sessions only
I $E($G(IOST),1,2)="C-" S XUSQUIT=$$STARTUP() G:XUSQUIT HALT
;
;D MERGE,MGPXU,MGSEC ;get the menu trees this user will need to jump
;
;Fire LOGIN menu template if they have one and its the first login
;of the day. XQXFLG("LLOG") is copy of ^VA(200,DUZ,1.1) before it's
;updated at XUS1+47
I $D(^VA(200,DUZ,19.8,"B","LOGIN")) D
.Q:'$D(XQXFLG("LLOG"))
.S XQLAST=$P($P(XQXFLG("LLOG"),U),".") ;Get last login DT
.Q:+XQLAST<1
.I XQLAST<DT S XQUR="[LOGIN",XQJS=3
.K XQLAST
.Q
K XQXFLG("LLOG")
;
UI ;Entry for TaskMan (DUZ may = 0), from ZTSK^XQ1
D DVARS I '$D(^XUTL("XQ",$J,0)) D ^XQDATE S ^XUTL("XQ",$J,0)=%_U_%Y
S:'$D(XQDIC) XQDIC="P"_XQY
S:'$D(XQPSM) XQPSM="P"_XQY
S:'$D(XQJS)&'$D(ZTQUEUED) XQY0=^DIC(19,XQY,0),^XUTL("XQ",$J,"T")=0,^("DUZ")=DUZ,^("XQM")=XQY,XQPSM="P"_XQY
S XQCY=XQY D ^XQCHK I XQCY<1 D
.S XQPRMN=1,XQL=0
.D:'$D(ZTQUEUED) MES^XQCHK,PAUSE^XQ6
.S XQY=-1
.Q
S XQM3="" I $P(XQY0,U,4)'="A",$P(XQY0,U,14),$D(^DIC(19,XQY,20)),$L(^(20)) X ^(20) ;W " ==> XQ12+59"
I $D(XQUIT),'$D(ZTQUEUED) D PM^XQUIT I $D(XQUIT) S XQY=-1 G ^XUSCLEAN
ABT ;WARNING: XQXFLG is also used by OERR test sites.
S U="^"
S $P(XQXFLG,U)=$S($O(^XTV(8989.3,1,"ABPKG",0))>0:1,1:0)
CMP S $P(XQXFLG,U,2)=$S('$D(^XTV(8989.3,1,"XUCP")):0,1:^("XUCP")="Y")
K %,%Y,PGM,X,XQCY,XQPM,XQPXU,XQPW,XQSD
Q
MERGE ;Merge in the menu trees that this user needs, start with Primary Menu
Q:'$D(^DIC(19,"AXQ",XQPSM))
I $D(^XUTL("XQO","XQMERGED",XQPSM)) D OLDF(XQPSM)
Q:$D(^XUTL("XQO","XQMERGED",XQPSM)) ;It's already being done
;
L +^XUTL("XQO",XQPSM):DILOCKTM Q:'$T
S ^XUTL("XQO","XQMERGED",XQPSM)=$H
;
K ^XUTL("XQO",XQPSM)
M ^XUTL("XQO",XQPSM)=^DIC(19,"AXQ",XQPSM)
;
L -^XUTL("XQO",XQPSM)
K ^XUTL("XQO","XQMERGED",XQPSM)
Q
;
MGPXU ;Check for XUCOMMAND
Q:'$D(^DIC(19,"AXQ","PXU"))
I $D(^XUTL("XQO","XQMERGED","PXU")) D OLDF("PXU")
Q:$D(^XUTL("XQO","XQMERGED","PXU")) ;Already being merged
;
L +^XUTL("XQO","PXU"):DILOCKTM Q:'$T
S ^XUTL("XQO","XQMERGED","PXU")=$H
;
K ^XUTL("XQO","PXU")
M ^XUTL("XQO","PXU")=^DIC(19,"AXQ","PXU")
;
L -^XUTL("XQO","PXU")
K ^XUTL("XQO","XQMERGED","PXU")
Q
;
MGSEC ;Now the Secondary Menu trees
N %,%1
F %=0:0 S %=$O(^VA(200,DUZ,203,"B",%)) Q:%'=+% D
.S %1="P"_%
.I '$D(^XUTL("XQO",%1)),$D(^DIC(19,"AXQ",%1)) D
..I $D(^XUTL("XQO","XQMERGED",%1)) D OLDF(%1)
..Q:$D(^XUTL("XQO","XQMERGED",%1)) ;Already merging as we speak
..S ^XUTL("XQO","XQMERGED",%1)=$H
..L +^XUTL("XQO",%1):DILOCKTM Q:'$T
..I '$D(^XUTL("XQO",%1)) D
...K ^XUTL("XQO",%1)
...M ^XUTL("XQO",%1)=^DIC(19,"AXQ",%1)
...Q
..L -^XUTL("XQO",%1)
..K ^XUTL("XQO","XQMERGED",%1)
..Q
.Q
Q
;
OLDF(X) ;See if this flag is au current, if not KILL it
;X is the P name of the tree, e.g., P9 might be EVE
S:'$D(XQPXU) XQPXU=$G(^DIC(19,"AXQ","PXU",0))
I XQPXU="" S XQPXU=$H ;Assume it's rebuilding now
N Y,Z
S Y=$G(^XUTL("XQO","XQMERGED",X)) Q:Y="" ;Flag's gone
S Z=$$HDIFF^XLFDT(XQPXU,Y,2)
I Z<3600 K ^XUTL("XQO","XQMERGED",X) ;Old Flag
Q
;
LOGOPT ;Option audit
S:'$D(XQLTL) XQLTL=""
S %=$P($H,",",2),%=DT_(%\60#60/100+(%\3600)+(%#60/10000)/100)
I XQLTL S $P(^XUSEC(19,XQLTL,0),U,5)=%,XQLTL=0
S I=1 I XQAUDIT'=1 S I=0 F J=1:2 S K1=$P(XQAUDIT,U,J),K2=$P(XQAUDIT,U,J+1) Q:'$L(K1)!I I K1=2&(K2=XQY)!(K1=3&($E($P(XQY0,U,1),1,$L(K2))=K2)) S I=1
Q:'I S XQLTL=% L +^XUSEC(19,0):0 S %=^XUSEC(19,0),XQLTL=XQLTL+(.00000001*$S(XQLTL'=$E($P(%,U,3),1,14):10,1:$E($P(%,U,3),15,16)+1)),$P(^(0),U,3,4)=XQLTL_"^"_($P(%,U,4)+1) L -^XUSEC(19,0)
D GETENV^%ZOSV S XUVOL=$P(Y,U,2),^XUSEC(19,XQLTL,0)=XQY_U_DUZ_U_$I_U_$J_"^^"_XUVOL
K K1,K2
Q
XPRMP D CHK^XM W !!,"Do you really want to ",$S(XQUR="REST":"restart",1:"halt"),"? YES// " R X:10 S:'$L(X) X="Y"
I "Yy"'[$E(X) S Y=1 S:^XUTL("XQ",$J,"T")>1 Y=^("T")-1 S ^("T")=Y,Y=^(Y),XQY0=$P(Y,U,2,99),XQPSM=$P(Y,U,1),(XQY,XQDIC)=+XQPSM,XQPSM=$P(XQPSM,XQY,2,3),XQAA="Select "_$P(XQY0,U,2)_$G(DUZ("TEST"))_" Option: " W ! G ASK^XQ
G REST:XQUR="REST",HALT:XQUR'="CON"
;
CON ;Continue option logic. Enter from ASK^XQ on timeout.
W !!,"Do you want to halt and continue with this option later? YES// " R XQUR:20 S:(XQUR="")!('$T) XQUR="Y"
I "YyNn"'[$E(XQUR,1) W !!," If you enter 'Y' or 'RETURN' you will halt and continue here next time",!," you logon to the computer.",!," If you enter 'N' you will resume processing where you were." G CON
I "Nn"[$E(XQUR,1) W ! S XQUR=0,Y=^XUTL("XQ",$J,"T"),Y=^(Y),XQY0=$P(Y,U,2,99),XQPSM=$P(Y,U,1),(XQY,XQDIC)=+XQPSM,XQPSM=$P(XQPSM,XQY,2,3),XQAA="Select "_$P(XQY0,U,2)_$G(DUZ("TEST"))_" Option: " G ASK^XQ
S X=^XUTL("XQ",$J,^XUTL("XQ",$J,"T")),Y=^("XQM") I (+X'=+Y) S XQM="P"_+Y S XQPSM=$S($D(^XUTL("XQO",XQM,"^",+X)):XQM,$D(^XUTL("XQO","PXU","^",+X)):"PXU",1:"") D:XQPSM="" SS S:XQPSM'="" ^VA(200,DUZ,202.1)=+X_XQPSM
S X=$P($H,",",2),X=(X>41400&(X<46800))
W !!,$P("HMM^OK^ALL RIGHT^WELL CERTAINLY^FINE","^",$R(5)+1),"... ",$P("SEE YOU LATER^I'LL BE READY WHEN YOU ARE.^HURRY BACK!^HAVE A GOOD LUNCH BREAK!","^",$R(3)+X+1)
HALT ;
G H^XUS
REST S XQNOHALT=1 D ^XUSCLEAN G ^XUS
;
SS ;Search Secondaries for a particular option.
Q:'$D(^VA(200,DUZ,203,0)) Q:$P(^VA(200,DUZ,203,0),U,4)<1
S Y=0 F XQI=1:1 Q:XQPSM'="" S Y=$O(^VA(200,DUZ,203,Y)) Q:Y'>0 S %=^(Y,0) I $D(^XUTL("XQO","P"_%,"^",+X)) S XQPSM="U"_DUZ_",P"_%
Q
ABLOG S %2=0 F %3=0:0 S %2=$O(^XTV(8989.3,1,"ABPKG",%2)) Q:%2'>0 F %=0:0 S %=$O(^XTV(8989.3,1,"ABPKG",%2,1,%)) Q:%'>0 S %1=$P(^(%,0),U) I $E(XQY0,1,$L(%1))=%1,$E(XQY0,$L(%1)+1)'="Z" D ABLOG1
K %,%1,%2,%3,%4
Q
ABLOG1 F %4=0:0 S %4=$O(^XTV(8989.3,1,"ABPKG",%2,1,%,1,%4)) Q:%4'>0 S %1=$P(^(%4,0),U) I $E(XQY0,1,$L(%1))=%1 Q
I %4'>0 S:'$D(^XTV(8989.3,1,"ABOPT",0)) ^(0)="^8989.333P^" S:'$D(^(XQY)) %4=+$P(^(0),U,3),$P(^(0),U,3,4)=$S(XQY>%4:XQY,1:%4)_U_($P(^(0),U,4)+1) S ^(0)=XQY_U_($S($D(^(XQY,0)):$P(^(0),U,2),1:0)+1),%2="A"
Q
STARTUP() ; P593 Run XU USER START-UP option
N XUSER,XUSQUIT,XUDISV ;Protect ourself.
S DIC="^DIC(19,",X="XU USER START-UP",XUSQUIT=0
S XUDISV=$G(^DISV(DUZ,"^DIC(19,")) ;p614 Save OPTION value for <spacebar><return>
D EN^XQOR
I $G(XUDISV)>0 S ^DISV(DUZ,"^DIC(19,")=XUDISV ;p614 Restore OPTION value for <spacebar><return>
K X,DIC
Q XUSQUIT ;If option set XUSQUIT will stop sign-on.
SAMPLE ; P593 sample start-up option
N DA
S DA=+DUZ
W !!," Sample: Testing XU USER START-UP option for patch XU*8.0*593"
W !!," Sample: Prompt to edit fields in NEW PERSON file (#200)",!
S DA=+DUZ,DIE="^VA(200,",DR="20.2;20.3;.132;.138" D ^DIE
W !!," Sample: Yes(Y) or No(N) prompt."
W !," Entering Y will set the variable XUSQUIT to 1 and end your session."
W !," Entering anything else (including ^ or <CR>) will continue."
W !," Do you want to end your session now" D YN^DICN I %=1 S XUSQUIT=%
W !!," Sample: End of sample script."
Q
XQ12 ;SEA/LUKE,ISD/HGW - MENU MANAGER UTILITIES ;01/10/13 15:09
+1 ;;8.0;KERNEL;**9,20,46,157,253,593,614**;Jul 10, 1995;Build 12
+2 ;Per VHA Directive 2004-038, this routine should not be modified.
+3 ;
DVARS ;Set up (or reset) necessary variables. From ^XQ1 and ^XQT1.
+1 SET U="^"
IF '$DATA(DUZ)#2
SET DUZ=^XUTL("XQ",$JOB,"DUZ")
+2 IF '$DATA(DUZ(0))#2
SET DUZ(0)=""
IF DUZ(0)=""
IF $DATA(^VA(200,DUZ,0))
SET DUZ(0)=$PIECE(^(0),U,4)
+3 IF '$DATA(DT)
DO ^XQDATE
SET DT=$PIECE(%,".")
+4 IF '$DATA(DUZ("AG"))
IF $DATA(^XTV(8989.3,1,0))
SET DUZ("AG")=$PIECE(^(0),U,8)
+5 IF '$DATA(IOS)
SET IOS=$SELECT($DATA(^XUTL("XQ",$JOB,"IOS"))#2:^("IOS"),1:"")
+6 IF '$DATA(DTIME)
SET DTIME=$$DTIME^XUP(DUZ,IOS)
+7 IF '$DATA(DUZ("AUTO"))
SET I=$SELECT($DATA(^VA(200,DUZ,200)):$PIECE(^(200),U,6),1:"")
IF '$LENGTH(I)
SET I=$SELECT($DATA(^%ZIS(1,$IO,"XUS")):$PIECE(^("XUS"),U,6),1:"")
IF '$LENGTH(I)
SET I=$SELECT($DATA(^XTV(8989.3,1,"XUS")):$PIECE(^("XUS"),U,6),1:"")
IF '$LENGTH(I)
SET I=1
SET DUZ("AUTO")=I
+8 IF '$DATA(DUZ("TEST"))&'$$PROD^XUPROD
Begin DoDot:1
+9 SET DUZ("TEST")=$$GET^XPAR("SYS","XQ MENUMANAGER PROMPT",1,"Q")
+10 IF $LENGTH($GET(DUZ("TEST")))<3
SET DUZ("TEST")=" <TEST ACCOUNT>"
End DoDot:1
+11 QUIT
+12 ;
INIT ;Entry for new logon, called from the top of ^XQ and ^XQ1
+1 KILL DIC,Y
IF $DATA(DUZ)[0
QUIT
IF '$DATA(^VA(200,DUZ,0))
QUIT
+2 ;S:'$D(XQY) XQY=^VA(200,DUZ,201)
+3 IF '$DATA(XQUSER)
SET XQUSER=$PIECE($PIECE(^VA(200,DUZ,0),U),",",2)_" "_$PIECE($PIECE(^(0),U),",")
+4 ;
+5 ;Select device tied option, primary menu, or primary window
+6 ;
+7 IF '$DATA(XQY)
SET XQY=""
+8 SET %=$GET(^VA(200,DUZ,201))
SET ^XUTL("XQ",$JOB,"XQM")=+%
SET ^("XQW")=$PIECE(%,"^",2)
+9 IF '$DATA(IO)
DO HOME^%ZIS
+10 IF IO]""
SET %=$GET(^%ZIS(1,IO,201))
IF %]""
SET XQY=%
+11 IF XQY']""
Begin DoDot:1
+12 SET %=$GET(^VA(200,DUZ,201))
+13 SET XQPM=$PIECE(%,U)
SET XQPW=$PIECE(%,U,2)
SET XQSD=$PIECE(%,U,3)
+14 IF XQPW']""
SET XQY=XQPM
QUIT
+15 IF XQSD="M"
SET XQY=XQPM
+16 IF '$TEST
SET XQY=XQPW
+17 QUIT
End DoDot:1
+18 ;
+19 DO SET^XQCHK
+20 SET ^XUTL("XQ",$JOB,1)=XQY_"P"_XQY_"^"_XQY0
SET ^("T")=1
+21 SET XQDIC=XQY
SET XQPSM="P"_XQY
+22 ;
+23 ; P593 Run XU USER START-UP menu option for terminal sessions only
+24 IF $EXTRACT($GET(IOST),1,2)="C-"
SET XUSQUIT=$$STARTUP()
IF XUSQUIT
GOTO HALT
+25 ;
+26 ;D MERGE,MGPXU,MGSEC ;get the menu trees this user will need to jump
+27 ;
+28 ;Fire LOGIN menu template if they have one and its the first login
+29 ;of the day. XQXFLG("LLOG") is copy of ^VA(200,DUZ,1.1) before it's
+30 ;updated at XUS1+47
+31 IF $DATA(^VA(200,DUZ,19.8,"B","LOGIN"))
Begin DoDot:1
+32 IF '$DATA(XQXFLG("LLOG"))
QUIT
+33 ;Get last login DT
SET XQLAST=$PIECE($PIECE(XQXFLG("LLOG"),U),".")
+34 IF +XQLAST<1
QUIT
+35 IF XQLAST<DT
SET XQUR="[LOGIN"
SET XQJS=3
+36 KILL XQLAST
+37 QUIT
End DoDot:1
+38 KILL XQXFLG("LLOG")
+39 ;
UI ;Entry for TaskMan (DUZ may = 0), from ZTSK^XQ1
+1 DO DVARS
IF '$DATA(^XUTL("XQ",$JOB,0))
DO ^XQDATE
SET ^XUTL("XQ",$JOB,0)=%_U_%Y
+2 IF '$DATA(XQDIC)
SET XQDIC="P"_XQY
+3 IF '$DATA(XQPSM)
SET XQPSM="P"_XQY
+4 IF '$DATA(XQJS)&'$DATA(ZTQUEUED)
SET XQY0=^DIC(19,XQY,0)
SET ^XUTL("XQ",$JOB,"T")=0
SET ^("DUZ")=DUZ
SET ^("XQM")=XQY
SET XQPSM="P"_XQY
+5 SET XQCY=XQY
DO ^XQCHK
IF XQCY<1
Begin DoDot:1
+6 SET XQPRMN=1
SET XQL=0
+7 IF '$DATA(ZTQUEUED)
DO MES^XQCHK
DO PAUSE^XQ6
+8 SET XQY=-1
+9 QUIT
End DoDot:1
+10 ;W " ==> XQ12+59"
SET XQM3=""
IF $PIECE(XQY0,U,4)'="A"
IF $PIECE(XQY0,U,14)
IF $DATA(^DIC(19,XQY,20))
IF $LENGTH(^(20))
XECUTE ^(20)
+11 IF $DATA(XQUIT)
IF '$DATA(ZTQUEUED)
DO PM^XQUIT
IF $DATA(XQUIT)
SET XQY=-1
GOTO ^XUSCLEAN
ABT ;WARNING: XQXFLG is also used by OERR test sites.
+1 SET U="^"
+2 SET $PIECE(XQXFLG,U)=$SELECT($ORDER(^XTV(8989.3,1,"ABPKG",0))>0:1,1:0)
CMP SET $PIECE(XQXFLG,U,2)=$SELECT('$DATA(^XTV(8989.3,1,"XUCP")):0,1:^("XUCP")="Y")
+1 KILL %,%Y,PGM,X,XQCY,XQPM,XQPXU,XQPW,XQSD
+2 QUIT
MERGE ;Merge in the menu trees that this user needs, start with Primary Menu
+1 IF '$DATA(^DIC(19,"AXQ",XQPSM))
QUIT
+2 IF $DATA(^XUTL("XQO","XQMERGED",XQPSM))
DO OLDF(XQPSM)
+3 ;It's already being done
IF $DATA(^XUTL("XQO","XQMERGED",XQPSM))
QUIT
+4 ;
+5 LOCK +^XUTL("XQO",XQPSM):DILOCKTM
IF '$TEST
QUIT
+6 SET ^XUTL("XQO","XQMERGED",XQPSM)=$HOROLOG
+7 ;
+8 KILL ^XUTL("XQO",XQPSM)
+9 MERGE ^XUTL("XQO",XQPSM)=^DIC(19,"AXQ",XQPSM)
+10 ;
+11 LOCK -^XUTL("XQO",XQPSM)
+12 KILL ^XUTL("XQO","XQMERGED",XQPSM)
+13 QUIT
+14 ;
MGPXU ;Check for XUCOMMAND
+1 IF '$DATA(^DIC(19,"AXQ","PXU"))
QUIT
+2 IF $DATA(^XUTL("XQO","XQMERGED","PXU"))
DO OLDF("PXU")
+3 ;Already being merged
IF $DATA(^XUTL("XQO","XQMERGED","PXU"))
QUIT
+4 ;
+5 LOCK +^XUTL("XQO","PXU"):DILOCKTM
IF '$TEST
QUIT
+6 SET ^XUTL("XQO","XQMERGED","PXU")=$HOROLOG
+7 ;
+8 KILL ^XUTL("XQO","PXU")
+9 MERGE ^XUTL("XQO","PXU")=^DIC(19,"AXQ","PXU")
+10 ;
+11 LOCK -^XUTL("XQO","PXU")
+12 KILL ^XUTL("XQO","XQMERGED","PXU")
+13 QUIT
+14 ;
MGSEC ;Now the Secondary Menu trees
+1 NEW %,%1
+2 FOR %=0:0
SET %=$ORDER(^VA(200,DUZ,203,"B",%))
IF %'=+%
QUIT
Begin DoDot:1
+3 SET %1="P"_%
+4 IF '$DATA(^XUTL("XQO",%1))
IF $DATA(^DIC(19,"AXQ",%1))
Begin DoDot:2
+5 IF $DATA(^XUTL("XQO","XQMERGED",%1))
DO OLDF(%1)
+6 ;Already merging as we speak
IF $DATA(^XUTL("XQO","XQMERGED",%1))
QUIT
+7 SET ^XUTL("XQO","XQMERGED",%1)=$HOROLOG
+8 LOCK +^XUTL("XQO",%1):DILOCKTM
IF '$TEST
QUIT
+9 IF '$DATA(^XUTL("XQO",%1))
Begin DoDot:3
+10 KILL ^XUTL("XQO",%1)
+11 MERGE ^XUTL("XQO",%1)=^DIC(19,"AXQ",%1)
+12 QUIT
End DoDot:3
+13 LOCK -^XUTL("XQO",%1)
+14 KILL ^XUTL("XQO","XQMERGED",%1)
+15 QUIT
End DoDot:2
+16 QUIT
End DoDot:1
+17 QUIT
+18 ;
OLDF(X) ;See if this flag is au current, if not KILL it
+1 ;X is the P name of the tree, e.g., P9 might be EVE
+2 IF '$DATA(XQPXU)
SET XQPXU=$GET(^DIC(19,"AXQ","PXU",0))
+3 ;Assume it's rebuilding now
IF XQPXU=""
SET XQPXU=$HOROLOG
+4 NEW Y,Z
+5 ;Flag's gone
SET Y=$GET(^XUTL("XQO","XQMERGED",X))
IF Y=""
QUIT
+6 SET Z=$$HDIFF^XLFDT(XQPXU,Y,2)
+7 ;Old Flag
IF Z<3600
KILL ^XUTL("XQO","XQMERGED",X)
+8 QUIT
+9 ;
LOGOPT ;Option audit
+1 IF '$DATA(XQLTL)
SET XQLTL=""
+2 SET %=$PIECE($HOROLOG,",",2)
SET %=DT_(%\60#60/100+(%\3600)+(%#60/10000)/100)
+3 IF XQLTL
SET $PIECE(^XUSEC(19,XQLTL,0),U,5)=%
SET XQLTL=0
+4 SET I=1
IF XQAUDIT'=1
SET I=0
FOR J=1:2
SET K1=$PIECE(XQAUDIT,U,J)
SET K2=$PIECE(XQAUDIT,U,J+1)
IF '$LENGTH(K1)!I
QUIT
IF K1=2&(K2=XQY)!(K1=3&($EXTRACT($PIECE(XQY0,U,1),1,$LENGTH(K2))=K2))
SET I=1
+5 IF 'I
QUIT
SET XQLTL=%
LOCK +^XUSEC(19,0):0
SET %=^XUSEC(19,0)
SET XQLTL=XQLTL+(.00000001*$SELECT(XQLTL'=$EXTRACT($PIECE(%,U,3),1,14):10,1:$EXTRACT($PIECE(%,U,3),15,16)+1))
SET $PIECE(^(0),U,3,4)=XQLTL_"^"_($PIECE(%,U,4)+1)
LOCK -^XUSEC(19,0)
+6 DO GETENV^%ZOSV
SET XUVOL=$PIECE(Y,U,2)
SET ^XUSEC(19,XQLTL,0)=XQY_U_DUZ_U_$IO_U_$JOB_"^^"_XUVOL
+7 KILL K1,K2
+8 QUIT
XPRMP DO CHK^XM
WRITE !!,"Do you really want to ",$SELECT(XQUR="REST":"restart",1:"halt"),"? YES// "
READ X:10
IF '$LENGTH(X)
SET X="Y"
+1 IF "Yy"'[$EXTRACT(X)
SET Y=1
IF ^XUTL("XQ",$JOB,"T")>1
SET Y=^("T")-1
SET ^("T")=Y
SET Y=^(Y)
SET XQY0=$PIECE(Y,U,2,99)
SET XQPSM=$PIECE(Y,U,1)
SET (XQY,XQDIC)=+XQPSM
SET XQPSM=$PIECE(XQPSM,XQY,2,3)
SET XQAA="Select "_$PIECE(XQY0,U,2)_$GET(DUZ("TEST"))_" Option: "
WRITE !
GOTO ASK^XQ
+2 IF XQUR="REST"
GOTO REST
IF XQUR'="CON"
GOTO HALT
+3 ;
CON ;Continue option logic. Enter from ASK^XQ on timeout.
+1 WRITE !!,"Do you want to halt and continue with this option later? YES// "
READ XQUR:20
IF (XQUR="")!('$TEST)
SET XQUR="Y"
+2 IF "YyNn"'[$EXTRACT(XQUR,1)
WRITE !!," If you enter 'Y' or 'RETURN' you will halt and continue here next time",!," you logon to the computer.",!," If you enter 'N' you will resume processing where you were."
GOTO CON
+3 IF "Nn"[$EXTRACT(XQUR,1)
WRITE !
SET XQUR=0
SET Y=^XUTL("XQ",$JOB,"T")
SET Y=^(Y)
SET XQY0=$PIECE(Y,U,2,99)
SET XQPSM=$PIECE(Y,U,1)
SET (XQY,XQDIC)=+XQPSM
SET XQPSM=$PIECE(XQPSM,XQY,2,3)
SET XQAA="Select "_$PIECE(XQY0,U,2)_$GET(DUZ("TEST"))_" Option: "
GOTO ASK^XQ
+4 SET X=^XUTL("XQ",$JOB,^XUTL("XQ",$JOB,"T"))
SET Y=^("XQM")
IF (+X'=+Y)
SET XQM="P"_+Y
SET XQPSM=$SELECT($DATA(^XUTL("XQO",XQM,"^",+X)):XQM,$DATA(^XUTL("XQO","PXU","^",+X)):"PXU",1:"")
IF XQPSM=""
DO SS
IF XQPSM'=""
SET ^VA(200,DUZ,202.1)=+X_XQPSM
+5 SET X=$PIECE($HOROLOG,",",2)
SET X=(X>41400&(X<46800))
+6 WRITE !!,$PIECE("HMM^OK^ALL RIGHT^WELL CERTAINLY^FINE","^",$RANDOM(5)+1),"... ",$PIECE("SEE YOU LATER^I'LL BE READY WHEN YOU ARE.^HURRY BACK!^HAVE A GOOD LUNCH BREAK!","^",$RANDOM(3)+X+1)
HALT ;
+1 GOTO H^XUS
REST SET XQNOHALT=1
DO ^XUSCLEAN
GOTO ^XUS
+1 ;
SS ;Search Secondaries for a particular option.
+1 IF '$DATA(^VA(200,DUZ,203,0))
QUIT
IF $PIECE(^VA(200,DUZ,203,0),U,4)<1
QUIT
+2 SET Y=0
FOR XQI=1:1
IF XQPSM'=""
QUIT
SET Y=$ORDER(^VA(200,DUZ,203,Y))
IF Y'>0
QUIT
SET %=^(Y,0)
IF $DATA(^XUTL("XQO","P"_%,"^",+X))
SET XQPSM="U"_DUZ_",P"_%
+3 QUIT
ABLOG SET %2=0
FOR %3=0:0
SET %2=$ORDER(^XTV(8989.3,1,"ABPKG",%2))
IF %2'>0
QUIT
FOR %=0:0
SET %=$ORDER(^XTV(8989.3,1,"ABPKG",%2,1,%))
IF %'>0
QUIT
SET %1=$PIECE(^(%,0),U)
IF $EXTRACT(XQY0,1,$LENGTH(%1))=%1
IF $EXTRACT(XQY0,$LENGTH(%1)+1)'="Z"
DO ABLOG1
+1 KILL %,%1,%2,%3,%4
+2 QUIT
ABLOG1 FOR %4=0:0
SET %4=$ORDER(^XTV(8989.3,1,"ABPKG",%2,1,%,1,%4))
IF %4'>0
QUIT
SET %1=$PIECE(^(%4,0),U)
IF $EXTRACT(XQY0,1,$LENGTH(%1))=%1
QUIT
+1 IF %4'>0
IF '$DATA(^XTV(8989.3,1,"ABOPT",0))
SET ^(0)="^8989.333P^"
IF '$DATA(^(XQY))
SET %4=+$PIECE(^(0),U,3)
SET $PIECE(^(0),U,3,4)=$SELECT(XQY>%4:XQY,1:%4)_U_($PIECE(^(0),U,4)+1)
SET ^(0)=XQY_U_($SELECT($DATA(^(XQY,0)):$PIECE(^(0),U,2),1:0)+1)
SET %2="A"
+2 QUIT
STARTUP() ; P593 Run XU USER START-UP option
+1 ;Protect ourself.
NEW XUSER,XUSQUIT,XUDISV
+2 SET DIC="^DIC(19,"
SET X="XU USER START-UP"
SET XUSQUIT=0
+3 ;p614 Save OPTION value for <spacebar><return>
SET XUDISV=$GET(^DISV(DUZ,"^DIC(19,"))
+4 DO EN^XQOR
+5 ;p614 Restore OPTION value for <spacebar><return>
IF $GET(XUDISV)>0
SET ^DISV(DUZ,"^DIC(19,")=XUDISV
+6 KILL X,DIC
+7 ;If option set XUSQUIT will stop sign-on.
QUIT XUSQUIT
SAMPLE ; P593 sample start-up option
+1 NEW DA
+2 SET DA=+DUZ
+3 WRITE !!," Sample: Testing XU USER START-UP option for patch XU*8.0*593"
+4 WRITE !!," Sample: Prompt to edit fields in NEW PERSON file (#200)",!
+5 SET DA=+DUZ
SET DIE="^VA(200,"
SET DR="20.2;20.3;.132;.138"
DO ^DIE
+6 WRITE !!," Sample: Yes(Y) or No(N) prompt."
+7 WRITE !," Entering Y will set the variable XUSQUIT to 1 and end your session."
+8 WRITE !," Entering anything else (including ^ or <CR>) will continue."
+9 WRITE !," Do you want to end your session now"
DO YN^DICN
IF %=1
SET XUSQUIT=%
+10 WRITE !!," Sample: End of sample script."
+11 QUIT