Использование QCMDEXC для вызова QEZSNDMG через хранимую процедуру DB2

Работаю над дополнительным проектом, в котором я использую набор представлений для выявления конфликтов записей в наборе физических файлов iSeries.

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

Я нашел API QEZSNDMG. Достаточно просто для интерактивного использования, но я пытаюсь собрать команду, которая будет использоваться вместе с QCMDEXC API, чтобы вызвать QEZSNDMG и предупредить пользователя о том, что они блокируют запись.

Изучив документацию IBM по QEZSNDMG API, я видите, что есть два набора параметров параметров, но ничего необходимого (что мне кажется странным, но это другая тема для другого дня). Но я продолжаю получать ошибку «Параметры, переданные при CALL, не соответствуют требуемым».

Вот несколько примеров, которые я пробовал до сих пор из командной строки:

  1. ВЫЗОВ PGM (QEZSNDMG) PARM ('* INFO' '* BREAK' 'TEST' '4' 'DOUGLAS' '1' '1' '-4')
  2. ВЫЗОВ PGM (QEZSNDMG) PARM ('* INFO' '* BREAK' 'TEST' '4' 'DOUGLAS')
  3. ВЫЗОВ PGM (QEZSNDMG) PARM ('* INFO' '* BREAK' 'TEST' '4' 'DOUGLAS' '1')

Примечание: я хотел бы по возможности избегать использования программ CL или RPG, но понимаю, что это может случиться, используя один из многих примеров, которые я нашел перед публикацией. Просто хочу исчерпать этот вариант, прежде чем идти по этому пути.

Обновление. Войдя в систему, я использовал WRKMSGQ для просмотра очередей сообщений, назначенных моей станции. Их было два: QSYS / DOUGLAS и QUSRSYS / DOUGLAS. Затем я выполнил SNDBRKMSG, не повлияв на мою рабочую станцию ​​(IE, сообщение не прервало мой сеанс):

  • SNDBRKMSG MSG (ТЕСТИРОВАНИЕ) TOMSGQ (QSYS / DOUGLAS)
  • SNDBRKMSG MSG (ТЕСТИРОВАНИЕ) TOMSGQ (QUSRSYS / DOUGLAS)

Я понял, что если я укажу имя сеанса рабочей станции в параметре TOMSG, это сработает:

  • SNDBRKMSG MSG (ТЕСТИРОВАНИЕ) TOMSGQ (* LIBL / QPADEV0003)

person Douglas Korinke    schedule 26.07.2018    source источник
comment
Есть ли причина, по которой вы не можете использовать SNDMSG или SNDBRKMSG для этой цели?   -  person Player1st    schedule 26.07.2018
comment
@ Player1st: Пожалуйста, поправьте меня, если я ошибаюсь, но в SNDMSG нет функции прерывания, мне нужно, чтобы пользователь был прерван. Для SNDBRKMSG я не верю, что вы можете указать конкретного пользователя, он отправляет всем активным пользователям или иным образом.   -  person Douglas Korinke    schedule 26.07.2018
comment
Я думаю, вы можете указать имя очереди сообщений и библиотеку, которые могут сузить ее до одного пользователя. ibm.com/support/knowledgecenter/en/ssw_ibm_i_72/cl/ \   -  person Mike    schedule 26.07.2018
comment
@Mike: WRKMSGQ показывает две очереди сообщений в моем сеансе. Когда я поставляю оба, я получаю сообщение о том, что сообщение не сломалось. Я обновлю свой вопрос, указав, что я сделал, и результаты.   -  person Douglas Korinke    schedule 26.07.2018
comment
@Mike: Итак, я обнаружил, что могу передать идентификатор рабочей станции команде SNDBRKMSG. Мне просто нужно убедиться, что у меня есть идентификатор рабочей станции, доступный в моих проверках QSYS2 / RCD_LCK, и я должен быть в порядке.   -  person Douglas Korinke    schedule 26.07.2018
comment
В качестве дополнительной информации, когда вы вызываете QEZSNDMG с помощью команды CALL, на самом деле у него нет никаких параметров. Это программа, использующая API, которая предназначена для интерактивного использования. В конечном итоге у вас есть QEZSNDMG API, который вам нужно будет написать свою собственную программу для использования, или у вас есть программа QEZSNDMG, которую вы используете в интерактивном режиме для отправки сообщения.   -  person Player1st    schedule 26.07.2018
comment
Хорошо, что ты справился сам. Эти API действительно сложно вызвать из командной строки, и он может вообще не работать, но вы должны научиться передавать шестнадцатеричные числа. например, чтобы передать 4 двоичных 0, это что-то вроде CALL PGM (QEZSNDMG) PARM ('* INFO' '* BREAK' 'TEST' x'04 '...   -  person danny117    schedule 28.07.2018


Ответы (1)


Я искал использование SNDBRKMSG.

Некоторые толчки в правильном направлении привели меня к пониманию, что идентификатор сеанса рабочей станции находится в QSYS2.RCD_LOCK в поле JOB_NAME (номер задания / имя пользователя / рабочая станция).

Извлечение идентификатора рабочей станции позволило мне создать правильно отформатированную команду SNDBRKMSG для QCMDEXC и предупредить пользователя о том, что они блокируют запись, необходимую другому процессу.

person Douglas Korinke    schedule 26.07.2018