Note --- The RPG Send Message tool is very flexible, but requires a
few steps to include the code in your program. There are other
simple solutions provided by the TAA Tools:
- SNDESCMSG - Send escape message
- SNDSTSMSG - Send status message
- SNDDIAGMSG - Send diagnostic message
- SNDCOMPMSG - Send completion message
The RPG Send Message tool provides the basic RPG code needed to send
a message using the QMHSNDPM API. The advantage of the API is that
you do not need a CL program to send messages.
The intent of the tool is that you would access this member from the
SEU browse function and copy in the code when you want the function.
The source is in the proper format for an RPG program (You must
remove the **NEWPAGE line). The E spec and the array data must be
placed in the proper place in the program. The sample MOVE and EXSR
specs show how to use the subroutine. You must provide the message
text as array data. See the sample.
The ZMSBR subroutine is written so that it is a 'black box'. You
should not need to make any changes to the subroutine. The code in
the subroutine uses the CAT operation to generate hex 4 byte binary
values required by the API and some other unusual techniques to
simplify the interface.
E* Arrays used for RPGSNDMSG TAA Tool
E ZMC 1 50 3 ZMT 68 Msg code/text
C* Sample of MOVE and EXSR to invoke the 'Send msg' subroutine
C MOVE 'Z01' ZMERID Set msg code
C EXSR ZMSBR Msg subr
C****************************************************************
C* Subroutine to send a message using the QMHSNDPM API
C* This code was copied from the TAA Tool RPGSNDMSG
C ZMSBR BEGSR Msg subr
C* Initialize fields on first use
C ZMFST IFEQ *BLANK If 1st time
C *LIKE DEFN ZMC ZMERID Msg ID
C *LIKE DEFN ZMT ZMMSG2 Addl txt fld
C X'0000' CAT X'0000' ZMERRC Error code
C* Set the message data length to 256
C X'0000' CAT X'00FF' ZMMDLN Msg dta len
C* If Stack count is 1, it goes to the calling pgm's msg queue
C X'0000' CAT X'0001' ZMSTKC Stack ctr
C MOVE 'X' ZMFST 1 1st time sw
C ENDIF If 1st time
C* If Msg ID is blank or CPF9898 use, standard message
C ZMMID IFEQ *BLANKS If blank
C ZMMID OREQ 'CPF9898' or CPF9898
C MOVE 'CPF9898' ZMMID Msg ID
C 'QCPFMSG' CAT '*LIBL':3 ZMQLF P Qlfd msg fil
C ENDIF If blank
C* If the message type is *STATUS, make the pgmq = *EXT
C ZMMTYP IFEQ '*STATUS' If *STATUS
C MOVEL'*EXT' ZMPGMQ Pgm queue
C ENDIF If *STATUS
C* If the message type is blank, make it an escape
C ZMMTYP IFEQ *BLANKS No msg type
C MOVEL'*ESCAPE' ZMMTYP P Msg type
C ENDIF No msg type
C* If the message queue is blank, move an *
C ZMPGMQ IFEQ *BLANKS No msgq
C MOVEL'*' ZMPGMQ Pgm queue
C ENDIF No msgq
C* Lookup message ID
C Z-ADD1 ZMX 30 Msg index
C ZMERID LOKUPZMC,ZMX 20 Lookup
C* If not found, generate a special message
C N20 DO Not found
C 'No text 'CAT 'ZMERID ='ZMMDTA P No txt msg
C CAT ZMERID:1 ZMMDTA No txt msg
C GOTO ZMSND Branch
C ENDDO Not found
C* If found, assemble message text from one or more lines
C MOVELZMT,ZMX ZMMDTA Msg data
C* Check for additional message text lines
C DO 4 Do 4 times
C ADD 1 ZMX Bump
C* If not same ID, branch to send the message
C ZMERID CABNEZMC,ZMX ZMSND Branch NE
C* If same ID, concatenate the message
C MOVE ZMT,ZMX ZMMSG2 Addl text
C CAT ZMMSG2:0 ZMMDTA Concat
C ENDDO Do 4 times
C* Send escape message using the API
C ZMSND TAG Send point
C CALL 'QMHSNDPM' Call API
C PARM ZMMID 7 Message ID
C PARM ZMQLF 20 Qlfd msgf
C PARM ZMMDTA256 Msg dta
C PARM ZMMDLN 4 Msg dta len
C PARM ZMMTYP 10 Msg type
C PARM ZMPGMQ 10 Pgm queue
C PARM ZMSTKC 4 Stack cntr
C PARM ZMMKEY 4 Msg key
C PARM ZMERRC 4 Error code
C ENDSR Msg subr
C****************************************************************
** ERC and ERT - Message code and text (Text ends in 71)
Z01Sample message with only one line of text
Z02Sample complex message covering multiple lines which will be
Z02 concatenated together. Start each additional line with the
Z02 same code and a blank in the first position of text.
Z02 You can have up to 4 lines for a maximum of 256 bytes
XXXAllow at least one dummy entry at the end of the array
Sending a simple escape message
-------------------------------
The subroutine defaults to send message text of you choice as an
escape message using the CPF9898 message. The message is sent to the
program that called the RPG program. The message text exists in an
array in the RPG program. You supply the text to be used.
Sending a simple status message
-------------------------------
To send the CPF9898 message as a status message, you do the following
before the EXSR statement:
C MOVEL'*STATUS' ZMMTYP Msg type
You must supply the message text as array data.
Sending other message IDs, etc.
-------------------------------
You can also send any message from any message file of any message
type by setting the values for the following fields:
ZMMID Message ID - 7 bytes
ZMQLF Qualified message file - 20 bytes
ZMMTYP Message type - 10 bytes
ZMPGMQ Program queue - 10 bytes
(Use an * for typical use)
If you are not sending the CPF9898 message, you must set the array
data to cause the proper message data for the message.
Entering message text
---------------------
Each message you want to send must have a unique 3 character
identifier. The message text is entered as array data and can be up
to 4 lines of source (a maximum of 256 bytes). The text is
concatenated together if the additional message lines have the same
Message ID. See the example for ID Z02 to see how to construct a
message that is more than one line.
If you send the CPF9898 message, the system adds a period as the last
character.
You must have at least one dummy message as the last array entry (or
just define the array to be larger than the number of source
statements provided).
Command parameters *CMD
------------------
No command is provided.
Restrictions
------------
None.
Prerequisites
-------------
None.
Implementation
--------------
None. The code only exists in the QATTINFO member.
Objects used by the tool
------------------------
None. The code only exists in the QATTINFO member.
|