有没有办法从VBA查询AS400作业的状态?

问题描述 投票:1回答:3

我正在尝试在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,因此无法升级到更新版本。

vba ms-access access-vba db2 ibm-midrange
3个回答
4
投票

假设您使用的是受支持的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;  

1
投票

经过大量的反复试验,我想我终于破解了它。

解决方案是使用两个passthrough查询:

  1. 使用CL命令DSPJOBLOG将作业日志转储到文件
  2. 阅读新创建的文件的内容
CALL QSYS2.QCMDEXC('DSPJOBLOG OUTPUT(*OUTFILE) OUTFILE(XXXXXXXX/TEST1)',50)

SELECT * FROM XXXXXXXX.TEST1

非常感谢建议和指针,尤其是查尔斯所有详细的DB2知识,以及Mandy的重要说明。

@Charles我赞成你的答案,但不幸的是我没有足够的声誉,因为它公开展示。


-1
投票

AS400没有返回作业状态的命令吗?

我不知道as400,但是像WRKACTJOB或任何列出工作的命令必须存在?我没有看到任何使用某些特殊API的理由。

如果您已经或可以在as400中设置命令以返回作业状态,那么在访问中您只需使用带有该命令的PT查询作为sql文本。

您不确定是要查询特定作​​业,还是只显示所有作业?因此,如果您有一些返回作业状态的as400代码或命令,则将该命令放在PT查询中,并将表单基于该PT查询。然后,您可以添加一个计时器来重新显示每5秒或任何您想要的内容。通过在Access中使用PT查询,如果需要在Access中编写任何代码,那么实际上很少。

© www.soinside.com 2019 - 2024. All rights reserved.