VistA-FOIAVistA/r/CLINICAL_CASE_REGISTRIES-ROR/RORTSK.m

189 lines
6.5 KiB
Mathematica

RORTSK ;HCIOFO/SG - TASK MANAGER ; 1/22/06 6:26pm
;;1.5;CLINICAL CASE REGISTRIES;;Feb 17, 2006
;
Q
;
;***** CREATES AND SCHEDULES A TASK
;
; TYPE Type of the task (1 - Generic, 2 - Report)
;
; ZTRTN The entry point TaskMan will DO to start the task.
;
; This parameter can also have the $$TAG^ROUTINE
; format. In this case, the "proxy task" will be used.
; The value of the parameter will be saved in the
; RORTSK("EP") node and the "TASK^RORTSK01" will be
; assigned to the ZTRTN variable. See the TASK^RORTSK01
; for more details.
;
; [.PARAMS] Reference to a local variable that contains a list
; of name-value pairs of the task parameters.
; The parameters are passed to the task as sub-nodes
; of the "PARAMS" node of the RORTSK local variable.
;
; Examples:
;
; PARAMS("NUM")=10 ==> RORTSK("PARAMS","NUM")=10
; PARAMS("A(10)")="B" ==> RORTSK("PARAMS","A",10)="B"
;
; [REGIEN] Registry IEN (if $G(REGIEN)'>0 the task will not
; be associated with any particular registry).
;
; [REPORT] Code of the report (if the TYPE = 2).
;
; [SCHCODE] Rescheduling code for the task. By default (if
; $G(SCHCODE)=""), the task is executed once. See
; description of the $$SCH^XLFDT function for
; possible values of the parameter).
;
; [.RORTSKPP] Reference to a local variable that contains a task
; descriptor with already prepared task parameters
; (under the "PARAMS" subscript). These parameters
; are copied into the new task descriptor "as is".
;
; All other input variables used by the %ZTLOAD (except the ZTRTN)
; can be used to control the task. Modifications of the default
; behavior of some of those variables are described below.
;
; [ZTDESC] Task description
;
; [ZTDTH] Date/time to start the task (FileMan). By default
; (if $G(ZTDTH)=""), the task is scheduled to run
; with a 3 second delay.
;
; [ZTIO] Output device. By default (if $G(ZTIO)=""), the
; task is started without an output device.
;
; [ZTSAVE] List of variables that should be passed to the task.
; The CREATE^RORTSK function adds the "RORTSK(" item
; to the list if the task proxy is requested (see the
; ZTRTN parameter for details) or the PARAMS parameter
; is defined.
;
; Return values:
; <0 Error code
; >0 Task Number
;
CREATE(TYPE,ZTRTN,PARAMS,REGIEN,REPORT,SCHCODE,RORTSKPP) ;
N DESCR,IENS,RC,RORFDA,RORIEN,RORMSG,RORTSK,RPTIEN,TMP,ZTSK
S (RC,RPTIEN)=0
I $G(REGIEN)>0 D Q:RC<0 RC
. I TYPE=2 D I RPTIEN<0 S RC=RPTIEN Q
. . S RPTIEN=$$RPIEN^RORUTL08(REPORT,.DESCR)
E S REGIEN=0
;--- Task parameters
M RORTSK("PARAMS")=RORTSKPP("PARAMS")
I $D(PARAMS)>1 D Q:RC<0 RC
. S RC=$$PARAMS^RORTSK03(.PARAMS)
. ;--- If there is the TASK_DESCR parameter in
. ; the list use its value as the task description
. ;--- (if the ZTDESC variable is not defined)
. S TMP=$$PARAM^RORTSK01("TASK_DESCR")
. S:TMP'="" DESCR=$E(TMP,1,200)
;--- Registry IEN
D:'$D(RORTSK("PARAMS","REGIEN"))
. S RORTSK("PARAMS","REGIEN")=+$G(REGIEN)
;--- Prepare the task description
I $G(ZTDESC)="" D Q:RC<0 RC
. I $G(DESCR)'="" S ZTDESC=DESCR Q
. S DESCR=$$EXTERNAL^DILFD(798.8,.02,,TYPE,"RORMSG")
. I $G(DIERR) D Q
. . S RC=$$DBS^RORERR("RORMSG",-9,,,798.8)
. S (DESCR,ZTDESC)=DESCR_" Task started from the GUI"
E S DESCR=ZTDESC
S:$L(DESCR)>60 DESCR=$E(DESCR,1,57)_"..."
;--- Check if the task proxy should be used
I $E(ZTRTN,1,2)="$$" D S ZTRTN="TASK^RORTSK01"
. S RORTSK("EP")=ZTRTN Q:$G(SCHCODE)=""
. F TMP="TYPE","REGIEN","REPORT","SCHCODE" D
. . S RORTSK(TMP)=$G(@TMP)
;--- If the task is scheduled to run immediately, postpone the start
;--- for 3 seconds to make sure that the task record is created
S TMP=$$NOW^XLFDT
I $G(ZTDTH)>0,$$FMDIFF^XLFDT(ZTDTH,TMP,2)>3
E S ZTDTH=$$FMADD^XLFDT(TMP,,,,3)
;--- Schedule the task
S:'($D(ZTIO)#10) ZTIO=""
S ZTSAVE("RORTSK(")=""
D ^%ZTLOAD
Q:'$G(ZTSK) $$ERROR^RORERR(-82,,,,ZTRTN,ZTDTH)
S RORTSK=ZTSK
;--- Prepare data for the record in the ROR TASK file
S IENS="+1,"
S (RORFDA(798.8,IENS,.01),RORIEN(1))=RORTSK ; Task Number
S RORFDA(798.8,IENS,.02)=+TYPE ; Type
D:REGIEN>0
. S RORFDA(798.8,IENS,.03)=+REGIEN ; Registry
. S:RPTIEN RORFDA(798.8,IENS,.04)=RPTIEN ; IEN of report par.
S RORFDA(798.8,IENS,.05)=DESCR ; Description
S TMP=$$PARAM^RORTSK01("TASK_COMMENT")
S:TMP'?." " RORFDA(798.8,IENS,1.01)=TMP ; Comment
;--- Create the record
D UPDATE^DIE(,"RORFDA","RORIEN","RORMSG")
I $G(DIERR) D Q RC
. S RC=$$DBS^RORERR("RORMSG",-9,,,798.8,IENS)
. ;--- Try to unschedule the task if the record has not been created
. S ZTSK=RORTSK D DQ^%ZTLOAD
Q RORTSK
;
;***** DEQUEUES AND/OR DELETES THE TASK
;
; TASK Task number
;
; [DELETE] Delete the task from the Taskman and the task
; record from the ROR TASK file (#798.8) if this
; parameter has a non-zero value.
;
; Return Values:
; <0 Error code
; 0 Ok
; 1 No responce from the task
;
DEQUEUE(TASK,DELETE) ;
N DA,DIK,I,RC,STATUS,TASKNODE,ZTSK
S STATUS=+$$STATUS^RORTSK02(TASK,,1)
I STATUS<0 Q $S(STATUS=-83:0,1:STATUS)
S TASKNODE=$NA(^RORDATA(798.8,TASK))
;--- Unschedule the task
I STATUS=1 S ZTSK=TASK D DQ^%ZTLOAD
;--- Stop the task if it is running
S STATUS=+$$STATUS^RORTSK02(TASK)
S:(STATUS=2)!(STATUS=102) @TASKNODE@("A")=2
Q:'$G(DELETE) 0
;--- Wait for a response from the task
S STATUS=+$$STATUS^RORTSK02(TASK,3) Q:STATUS<0 STATUS
Q:STATUS=103 1
;--- Kill the REPORT ELEMENT multiple to avoid delays in ^DIK
K @TASKNODE@("RI")
;--- Delete the task record
S DIK="^RORDATA(798.8,",DA=TASK D ^DIK
Q 0
;
;***** RESUMES THE TASK
;
; TASK Task number
;
; Return Values:
; <0 Error code
; 0 Ok
;
RESUME(TASK) ;
N STATUS
S STATUS=+$$STATUS^RORTSK02(TASK,,1) Q:STATUS<0 STATUS
K ^RORDATA(798.8,TASK,"A")
Q 0
;
;***** SUSPENDS THE TASK
;
; TASK Task number
;
; Return Values:
; <0 Error code
; 0 Ok
;
SUSPEND(TASK) ;
N STATUS
S STATUS=+$$STATUS^RORTSK02(TASK,,1) Q:STATUS<0 STATUS
S:(STATUS=1)!(STATUS=2) ^RORDATA(798.8,TASK,"A")=1
Q 0