Vous voulez répondre à un message dans la file d’attente QSYSOPR dans un de vos développements.
Vous devez utiliser la commande SNDRPY,
vous pouvez lui indiquer la réponse souhaitée, mais vous devez connaître la clé du message.
Cette clé est unique sur 4 caractères c’est le système qui la génère à l’envoi
Vous aurez donc souvent dans votre clp
DCL &key *char 4
RCVMSG … MSGKEY(&key)
SNDRPY …MSGKEY(&key)
Mais comment faire en SQL
Vous avez une vue qui vous permet de lire les messages d’une file (QSYS2.MESSAGE_QUEUE_INFO) et donc de récupérer la clé nécessaire.
Exemple
-- message avec réponse
SELECT MESSAGE_KEY
FROM QSYS2.MESSAGE_QUEUE_INFO
WHERE MESSAGE_QUEUE_NAME = 'QSYSOPR'
AND MESSAGE_TYPE = 'INQUIRY';
-- message avec réponse pas encore répondu
WITH REPLIED_MSGS (KEY) AS (
SELECT A.MESSAGE_KEY
FROM QSYS2.MESSAGE_QUEUE_INFO A
INNER JOIN QSYS2.MESSAGE_QUEUE_INFO B
ON A.MESSAGE_KEY = B.ASSOCIATED_MESSAGE_KEY
WHERE A.MESSAGE_QUEUE_NAME = 'QSYSOPR'
AND A.MESSAGE_QUEUE_LIBRARY = 'QSYS'
AND B.MESSAGE_QUEUE_NAME = 'QSYSOPR'
AND B.MESSAGE_QUEUE_LIBRARY = 'QSYS'
ORDER BY B.MESSAGE_TIMESTAMP DESC)
SELECT HEX(A.MESSAGE_KEY) AS MSGKEY
FROM QSYS2.MESSAGE_QUEUE_INFO A
LEFT EXCEPTION JOIN REPLIED_MSGS B
ON A.MESSAGE_KEY = B.KEY
WHERE MESSAGE_QUEUE_NAME = 'QSYSOPR'
AND MESSAGE_QUEUE_LIBRARY = 'QSYS'
AND MESSAGE_TYPE = 'INQUIRY'
ORDER BY MESSAGE_TIMESTAMP DESC;
Vous pourrez alors utiliser la fonction QCMDEXC pour lancer un SNDRPY paramétré
-- Avec Réponse au message
WITH REPLIED_MSGS (KEY) AS (
SELECT A.MESSAGE_KEY
FROM QSYS2.MESSAGE_QUEUE_INFO A
INNER JOIN QSYS2.MESSAGE_QUEUE_INFO B
ON A.MESSAGE_KEY = B.ASSOCIATED_MESSAGE_KEY
WHERE A.MESSAGE_QUEUE_NAME = 'QSYSOPR'
AND A.MESSAGE_QUEUE_LIBRARY = 'QSYS'
AND B.MESSAGE_QUEUE_NAME = 'QSYSOPR'
AND B.MESSAGE_QUEUE_LIBRARY = 'QSYS'
ORDER BY B.MESSAGE_TIMESTAMP DESC)
SELECT QCMDEXC(
'QSYS/SNDRPY MSGKEY(X''' CONCAT HEX(MESSAGE_KEY) CONCAT ''') MSGQ('
CONCAT MESSAGE_QUEUE_LIBRARY CONCAT '/'
CONCAT MESSAGE_QUEUE_NAME CONCAT ') RPY(''C'') RMV(*NO)')
FROM QSYS2.MESSAGE_QUEUE_INFO A
LEFT EXCEPTION JOIN REPLIED_MSGS B
ON A.MESSAGE_KEY = B.KEY
WHERE MESSAGE_QUEUE_NAME = 'QSYSOPR'
AND MESSAGE_QUEUE_LIBRARY = 'QSYS'
AND MESSAGE_TYPE = 'INQUIRY'
ORDER BY MESSAGE_TIMESTAMP DESC;
On a choisit de répondre C et de ne pas enlever le message dans la file
Mais les équipes de Scott on eu pitié de vous et dans SYSTOOLS vous avez la fonction REPLY_INQUIRY_MESSAGES
Voici comment elle s’utilise :
-- réponse sur un message sans MSGID par exemple envoyé par un SNDMSG ou SNDUSRMSG
-- le texte est obligatoire pour filtrer
VALUES SYSTOOLS.REPLY_INQUIRY_MESSAGES(
MESSAGE_ID => '*IMMED',
SEARCH_MESSAGE_TEXT => 'TESTPLB',
RESPONSE => 'C',
REMOVE_MESSAGE => 'NO'
);
-- réponse sur un message MSGID c'est toujours CPA0702
-- vous devez indiquer ensuite votre MSGID
VALUES SYSTOOLS.REPLY_INQUIRY_MESSAGES(
MESSAGE_ID => 'CPA0702', -- toujours ce message pour l'envoi
SEARCH_MESSAGE_TEXT => 'CPF0001', -- message applicatif
RESPONSE => 'C',
REMOVE_MESSAGE => 'NO'
);
-- réponse sur un texte de message ici erreur PGM
-- vous devez indiquer ensuite votre TEXT
VALUES SYSTOOLS.REPLY_INQUIRY_MESSAGES(
MESSAGE_ID => 'CPA0702',
SEARCH_MESSAGE_TEXT => 'ERREURPGM', -- filtré
RESPONSE => 'C',
REMOVE_MESSAGE => 'NO'
);

Remarque :
Vous pouvez extraire le source de la fonction de SYSTOOLS pour la personnaliser, ailleurs de préférence
Rappel :
Ce n’est pas parce que c’est possible qu’il faut le faire, des fois ne pas répondre peut être le bon réflexe.
Pour ne savoir plus :

