Есть ли способ опросить статус заданий AS400 от VBA? - PullRequest
1 голос
/ 18 апреля 2019

Я пытаюсь предоставить пользовательский интерфейс в Access для отображения состояния запланированных заданий AS400, чтобы они отображались как ожидающие, выполняемые или завершенные.

Я унаследовал некоторый код, который планирует несколько заданий, который работает нормально, но пользователь никак не может увидеть, каков статус задания, и они иногда зависают.

Завершение в настоящее время сигнализируется с помощью числового счетчика, хранящегося в таблицах, которые обновляют задания, и есть событие Таймера формы, которое регулярно проверяет завершение.

Используя этот метод, код может сообщать о завершении обработки на AS400, но не о том, завис он или произошел сбой, или если сервер сильно загружен и работает медленно.

Я пытался найти примеры кода в интернете, но нарисовал пустое место. Все, что я мог найти, это помогло - Руководство по базам данных IBM (pdf и онлайн) и слайд-шоу в формате pdf под названием «Разработка ActiveX iSeries Access» Троя Си Бликер из IBM.

Используя эти ресурсы, я написал некоторый код с использованием библиотеки объектов ActiveX IBM i Access для Windows (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, поэтому нет возможности обновления до более поздней версии.

Ответы [ 3 ]

4 голосов
/ 18 апреля 2019

Если вы используете поддерживаемую версию IBM i,

Взгляните на Db2 для i Services ...

В частности,
QSYS2.ACTIVE_JOB_INFO ()
QSYS2.GET_JOB_INFO ()

пример:

select *
from table (QSYS2.GET_JOB_INFO('123456/MYUSER/MYJOB')) as X;  
1 голос
/ 24 апреля 2019

После долгих проб и ошибок, думаю, я наконец-то взломал его.

Решение состоит в том, чтобы использовать два сквозных запроса:

  1. Создать дамп журнала работ в файл с помощью команды CL DSPJOBLOG
  2. Считать содержимое вновь созданного файла
CALL QSYS2.QCMDEXC('DSPJOBLOG OUTPUT(*OUTFILE) OUTFILE(XXXXXXXX/TEST1)',50)

SELECT * FROM XXXXXXXX.TEST1

Большое спасибо за предложения и советы, в частности Чарльзу за все подробные знания DB2 и Мэнди за решающее разъяснение.

@ Чарльз Я проголосовал за твой ответ, но, к сожалению, у меня пока недостаточно высокая репутация, чтобы его можно было публично показать.

0 голосов
/ 18 апреля 2019

Нет ли какой-либо команды для AS400, которая возвращает статус задания?

Я не знаю as400, но что-то вроде WRKACTJOB или какая-либо команда для перечисления заданий должна существовать?Я не вижу никакой причины использовать какой-либо специальный API.

Если у вас есть или вы можете настроить команду as400 для возврата статуса (ов) заданий, то при доступе вы можете просто использовать запрос PT с этимкоманда как текст sql.

Непонятно, хотите ли вы запросить конкретное задание или просто отобразить все задания?Итак, если у вас есть какой-либо код или команда as400, которая возвращает статус задания, поместите эту команду в запрос PT и основывайте свою форму на этом запросе PT.Затем вы можете добавить таймер для повторного отображения, скажем, каждые 5 секунд или что угодно.Используя PT-запрос в Access, очень мало кода нужно написать в Access.

...