我正在尝试在 Access 中提供一个用户界面来显示计划的 AS400 作业的状态,将它们显示为挂起、正在运行或已完成。
我继承了一些代码来调度多个作业,运行良好 - 但用户无法看到作业状态是什么,它们有时会挂起。
完成当前通过作业更新的表中保存的数字计数器发出信号,并且有一个表单计时器事件会定期检查完成情况。
使用此方法,代码可以判断AS400上的处理何时完成,但不能判断AS400上的处理是否挂起或失败,或者服务器是否负载过重且运行缓慢。
我试图在互联网上找到代码示例,但画了一个空白。我能找到的有用的是IBM数据库手册(pdf和在线)和IBM的Troy C Bleeker的题为"iSeries Access ActiveX Development"的pdf幻灯片。
使用这些资源,我使用 IBM i Access for Windows ActiveX Object Library (cwbx) 编写了一些代码,以便与工作正常的 AS400 进行通信,并且可以发出 WRKUSRJOB 命令来检查作业状态,但我无法弄清楚如何(甚至是否)查看命令的结果。
有没有办法做到这一点,如果有,如何做?
Dim SysNames As New cwbx.SystemNames
Dim SvrName As String
Dim Svr As New cwbx.AS400System
Dim Svc As cwbx.cwbcoServiceEnum
Dim Cmd As New cwbx.Command
Dim x As New cwbx.DataQueue
'Set server name
SvrName = SysNames.DefaultSystem
Debug.Print SvrName
Svr.Define SvrName
'Set service type
Svc = cwbcoServiceRemoteCmd
'Connect and test
Svr.Connect Svc
Debug.Print Svr.IsConnected(Svc)
'Command
Set Cmd.System = Svr
Debug.Print "WRKUSRJOB"
Cmd.Run "WRKUSRJOB"
```
'How to get results of the command? Nothing in Errors
Debug.Print SprintF("Errors: %s", Cmd.Errors.Count)
```
'Tidy up
Svr.Disconnect Svc
'Object destruction
Set Cmd = Nothing
Set Svr = Nothing
Set SysNames = Nothing
如果例如 Errors 集合包含命令的结果,或者如果它们可以通过管道传输或重定向到 ActiveX 可以读取的文件或队列,那就太好了,但我一直画一个空白。
编辑:我的客户端已安装 v7r1 并正在逐步淘汰 db2,因此不可能升级到更新的版本。
假设您使用的是受支持的 IBM i 版本,
看一下 Db2 for i 服务...
特别是
QSYS2。ACTIVE_JOB_INFO()
QSYS2.GET_JOB_INFO()
例:
select *
from table (QSYS2.GET_JOB_INFO('123456/MYUSER/MYJOB')) as X;
经过大量的试验和错误,我想我终于破解了它。
解决方案是使用两个直通查询:
- 使用 CL 命令 DSPJOBLOG 将作业日志转储到文件
- 读取新创建文件的内容
CALL QSYS2.QCMDEXC('DSPJOBLOG OUTPUT(*OUTFILE) OUTFILE(XXXXXXXX/TEST1)',50)
SELECT * FROM XXXXXXXX.TEST1
非常感谢您的建议和指点,特别是 Charles 提供的所有详细的 DB2 知识,以及 Mandy 提供的重要澄清。
@Charles 我赞成你的答案,但不幸的是,我的声誉还不够高,无法公开展示。
AS400 没有返回作业状态的命令吗?
我不知道 as400,但是像 WRKACTJOB 这样的东西,或者列出作业的任何命令都必须存在吗?我认为没有任何理由使用一些特殊的API。
如果您具有或可以在 as400 中设置命令以返回作业状态,则在 Access 中,您只需将该命令用作 sql 文本的 PT 查询即可。
不清楚您是要查询特定作业,还是仅显示所有作业?因此,如果您有一些返回作业状态的 as400 代码或命令,请将该命令放在 PT 查询中,并将表单基于该 PT 查询。然后,您可以添加一个计时器以重新显示一次,例如每 5 秒或任何您想要的内容。通过在 Access 中使用 PT 查询,那么几乎不需要在 Access 中编写任何代码。