【问题标题】:Is there a way to interrogate the status of AS400 jobs from VBA?有没有办法从 VBA 询问 AS400 作业的状态?
【发布时间】:2019-04-18 13:07:24
【问题描述】:

我正在尝试在 Access 中提供一个用户界面来显示计划的 AS400 作业的状态,以将它们显示为挂起、运行或完成。

我继承了一些安排多个作业的代码,这些作业运行良好 - 但用户无法看到作业状态,有时它们会挂起。

目前通过作业更新的表中的数字计数器发出完成信号,并且有一个定期检查完成的表单计时器事件。

使用此方法,代码可以判断 AS400 上的处理何时完成,但无法判断它是否挂起或失败,或者服务器是否负载过重且运行缓慢。

我试图在 Internet 上查找代码示例,但结果一片空白。我能找到的只有 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

如果错误集合包含命令的结果,或者它们可以通过管道传输或重定向到 ActiveX 可以读取的文件或队列,那就太好了,但我一直画一个空白。

编辑:我的客户端安装了 v7r1 并且正在逐步淘汰 db2,因此不可能升级到更新的版本。

【问题讨论】:

    标签: ms-access vba db2 ibm-midrange


    【解决方案1】:

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

    【讨论】:

    • 感谢 Charles,这听起来像是一条有希望的途径——至少它应该将记录集返回给 ODBC。我尝试运行SELECT * FROM TABLE (QSYS2.ACTIVE_JOB_INFO()) X,但出现错误:“ODBC--调用失败。[IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0204 - QSYS2 类型 *N 中的 ACTIVE_JOB_INFO 未找到。(#-204 )”。这是否意味着我们没有使用受支持的 IBM i 版本?如果是这样,有没有办法使用 API 解决这个问题,或者这也注定要失败?
    • @Belladonna 似乎您使用的是过时版本的操作系统,也许是 v7.1?在这种情况下,work management APIs 是您唯一的选择。您也许可以将它们作为外部存储过程直接调用,但如果创建了 RPG/CL/COBOL 包装器供您调用,则使用它们会容易得多。
    • 感谢查尔斯,另一个有用的指针。我找到了一个article,它说我可以使用以下语法来调用 CL 命令:call qsys2.qcmdexc('STRDBG UPDPROD(*YES)',20)。这是我继承的代码中使用的方法,所以我知道它有效,这是令人鼓舞的。我在想,如果有一个 CL 命令将作业列表打印到文件(而不是控制台),那么我可以检索文件内容......但我很难在文档中找到一个。有什么想法吗?
    • 例如,如果CALL QSYS.QCMDEXC('WRKUSRJOB USER(XXXXX) OUTPUT(*OUTFILE) OUTFILE(QTEMP/TEST1)',59) 可以工作,那就太好了,但不幸的是,WRKUSRJOB 不允许将其输出重定向到文件。
    【解决方案2】:

    经过多次反复试验,我想我终于破解了它。

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

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

    非常感谢您的建议和指点,特别感谢 Charles 提供的所有详细 DB2 知识,以及 Mandy 的重要澄清。

    @Charles 我赞成你的回答,但不幸的是,我还没有足够高的声誉来公开展示它。

    【讨论】:

    • 如果你打算做更多这样的事情,你确实需要进入 Charles 所描述的服务,但是,这是 IBM 明确的前进方向,我怀疑 CL 命令是缺少 outfile 支持现在会得到它。
    • 谢谢曼迪,我绝对同意,如果查尔斯的建议可以在我们的平台上使用,我会很乐意使用它们!不幸的是,这里的 db2 在我的客户站点上逐渐被淘汰,所以我只需要使用他们所拥有的。我今天早上发现了一些东西,表明我们有 v7r1,考虑到 - 令人沮丧 - 在 v7r2 中添加了 ACTIVE_JOB_INFO 和 GET_JOB_INFO,这是有道理的。
    【解决方案3】:

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

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

    如果您有或可以在 as400 中设置命令以返回作业状态,那么在访问中您可以简单地使用 PT 查询将该命令作为 sql 文本。

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

    【讨论】:

    • 我已经尝试过了,但它不起作用,我得到 ODBC - 调用失败,令牌 WRKACTJOB 无效。有效令牌:(END GET SET...等。如果它有效,那就太优雅了!为了回答你的问题,我正在寻找几个特定的​​工作,并拥有提交它们的用户名,以及工作。
    • 好吧,我们假设 PT 查询适用于一些赞扬?活动作业必须有某种 SELECT 类型的返回值。
    • WRKACTJOB 希望有一个绿色屏幕来显示其输出,就像所有已发布的 WRK...CL 命令一样,因此即使您以某种方式从 SQL 调用它,您也不会得到任何有用的返回。 @Charles 的回答是获得您建议的结果集的正确方法。
    • 正如@MandyShaw 所说,WRKACTJOB 输出到 5250 屏幕。如果您想以编程方式处理工作信息,您可以使用旧式 API 或更新的 Db2 for i SQL 服务。在 VBA 中,SQL 服务是最简单的。 OP 可能需要一个 RPG/COBOL/CL 包装器才能使用 API
    • 但是不是简单地输入查询也只是输出到屏幕上吗? Access 中的传递查询无论如何都会发送您在命令提示符下键入的任何内容。因此,如果您可以设置程序、命令或其他任何内容,并将数据行返回到屏幕,则只需将其发送到访问。
    猜你喜欢
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 2021-06-28
    • 2016-07-19
    • 2020-06-29
    • 1970-01-01
    • 2020-04-15
    • 2017-09-23
    相关资源
    最近更新 更多