我正在尝试在Access中提供用户界面以显示已调度AS400作业的状态,以将其显示为待处理,正在运行或已完成。
我继承了一些调度几个工作的代码,这些代码运行正常 - 但是用户无法看到工作状态是什么,有时他们会挂起。
目前通过工作表更新的表中保存的数字计数器发出完成信号,并且有一个Form Timer事件定期检查完成情况。
使用此方法,代码可以判断AS400上的处理何时完成,但是如果挂起或发生故障,或者服务器负载很重并且运行缓慢。
我试图在互联网上找到代码示例,但画了一个空白。我所能找到的只有IBM数据库手册(pdf和在线)以及IBM的Troy C Bleeker的题为“iSeries Access ActiveX Development”的pdf幻灯片。
使用这些资源,我使用IBM i Access for Windows ActiveX对象库(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 Services ......
特别是 QSYS2.ACTIVE_JOB_INFO() QSYS2.GET_JOB_INFO()
例:
select *
from table (QSYS2.GET_JOB_INFO('123456/MYUSER/MYJOB')) as X;
经过大量的反复试验,我想我终于破解了它。
解决方案是使用两个passthrough查询:
CALL QSYS2.QCMDEXC('DSPJOBLOG OUTPUT(*OUTFILE) OUTFILE(XXXXXXXX/TEST1)',50)
SELECT * FROM XXXXXXXX.TEST1
非常感谢建议和指针,尤其是查尔斯所有详细的DB2知识,以及Mandy的重要说明。
@Charles我赞成你的答案,但不幸的是我没有足够的声誉,因为它公开展示。
AS400没有返回作业状态的命令吗?
我不知道as400,但是像WRKACTJOB或任何列出工作的命令必须存在?我没有看到任何使用某些特殊API的理由。
如果您已经或可以在as400中设置命令以返回作业状态,那么在访问中您只需使用带有该命令的PT查询作为sql文本。
您不确定是要查询特定作业,还是只显示所有作业?因此,如果您有一些返回作业状态的as400代码或命令,则将该命令放在PT查询中,并将表单基于该PT查询。然后,您可以添加一个计时器来重新显示每5秒或任何您想要的内容。通过在Access中使用PT查询,如果需要在Access中编写任何代码,那么实际上很少。