是否可以使AS400(IBM i)使用QINACTITV系统值捕获自上次用户活动以来的分钟,并从计划的作业中读取这些值以编写我们自己的定制代码?此信息是否保存在特定的系统表中?
谢谢
是。有可能的。否。没有系统表。
您不需要预定的作业或表格即可执行自定义代码。创建一个消息队列,将QINACTMSGQ设置为指向该消息队列。然后,一个永无止境的批处理作业需要监视CPI1126消息。如果成功,则可以执行自定义代码。
IBM文档包含example。或者搜索“ QINACTMSGQ”。还有其他几个示例。
这是IBM页面中的CL示例:
下面是执行以下操作的示例CL程序:
可以对该程序进行增强,以执行其他操作,包括从文件中提取用户,工作站和操作的列表,因此无需在每次更改时都重新编译该程序。
PGM
DCL &THEQUEUE *CHAR 20 /* QINACTMSGQ SYSTEM VALUE */
DCL &INACTLIB *CHAR 10 /* QUEUE'S LIBRARY */
DCL &INACTQUEUE *CHAR 10 /* QUEUE NAME */
DCL &INACTDATA *CHAR 100 /* RAW MESSAGE DATA */
DCL &JOBNAME *CHAR 10 /* INACTIVE JOB NAME */
DCL &USER *CHAR 10 /* INACTIVE JOB USER */
DCL &NUMBER *CHAR 6 /* INACTIVE JOB NUMBER */
DCL &MSGDTALEN *DEC (5 0)
DCL &MSGID *CHAR 7 /* MESSAGE TAKEN FROM THE QUEUE*/
/* */
/* GET THE NAME OF THE QUEUE TO MONITOR FROM THE SYSTEM VALUE */
/* */
RTVSYSVAL SYSVAL(QINACTMSGQ) RTNVAR(&THEQUEUE)
CHGVAR &INACTQUEUE %SUBSTRING(&THEQUEUE 1 10)
CHGVAR &INACTLIB %SUBSTRING(&THEQUEUE 11 10)
/* */
/* MAIN LOOP. */
/* */
LOOP:
/* */
/* WAIT FOR MESSAGE ON THE MESSAGE QUEUE */
/* */
RCVMSG MSGQ(&INACTLIB/&INACTQUEUE) WAIT(*MAX) +
MSGDTA(&INACTDATA) MSGDTALEN(&MSGDTALEN) +
MSGID(&MSGID)
/* */
/* CHECK TO SEE IF IT IS THE RIGHT MESSAGE, IF NOT, SKIP IT. */
/* */
IF (&MSGID *NE 'CPI1126') THEN(GOTO SKIP)
CHGVAR &JOBNAME %SUBSTRING(&INACTDATA 1 10) /* GET JOB NAME */
CHGVAR &USER %SUBSTRING(&INACTDATA 11 10) /* GET USER NAME*/
CHGVAR &NUMBER %SUBSTRING(&INACTDATA 21 6) /* GET JOB NUM */
/* */
/* SPECIAL USERS */
/* */
IF (&USER *EQ 'TAA') THEN(GOTO SKIP) /* leave alone*/
IF (&JOBNAME *EQ 'DSP01') THEN(GOTO SKIP) /* console */
IF (&USER *EQ 'CKOUR') THEN(GOTO ACTION1)
IF (&USER *EQ 'CHANTHA') THEN(GOTO ACTION1)
IF (&JOBNAME *EQ 'P002039') THEN(GOTO ACTION2)
/* */
/* DEFAULT ACTION */
/* */
DSCJOB JOB(&NUMBER/&USER/&JOBNAME)
MONMSG CPF0000 /* VIRTUAL TERMINALS CANNOT BE DISCONNECTED */
/* SO IGNORE ANY MESSAGES THAT MAY CAUSE */
GOTO SKIP
/* */
ACTION1:
SNDBRKMSG MSG('Chantha, you left your terminal on AGAIN!') +
TOMSGQ(&JOBNAME)
GOTO SKIP
/* */
ACTION2:
ENDJOB JOB(&NUMBER/&USER/&JOBNAME)
GOTO SKIP
/* */
/* OTHER ACTIONS GO HERE */
/* */
SKIP:
GOTO LOOP /* GO GET MORE MESSAGES ABOUT OTHER TERMINALS */
ENDPGM