I got this working thanks to your help.
Thanks
John
-----Original Message-----
From: CRPence [mailto:CRPbottle@xxxxxxxxx]
Sent: Wednesday, January 29, 2014 2:23 PM
To: rpg400-l@xxxxxxxxxxxx
Subject: Re: Question about using QMHRCVM and QMHRMVM Apis
On 28-Jan-2014 06:22 -0800, John Allen wrote:
CRPence on Friday, January 17, 2014 7:17 AM wrote:
<<SNIP>>
Seems the intent is to effect the same as "F16=Remove all
except
unanswered" from the Display Messages panel.?
<<SNIP>>
<<SNIP>>
This sounds like it will work. I will try it and see.
I have some code in CL using RCVMSG and RMVMSG [instead
of the APIs], that already does effectively what "F16=Remove
all except unanswered"
does, and is at least somewhat tested. There is a
simplistic version, and then there is a slightly more
complex version.
The latter version ensures the order of processing mimics
the visual presentation of messages in the queue. That is,
replies are processed directly after their inquiries,
because each inquiry is checked to see if there is a reply
to that inquiry message, rather than the replies being
processed in the order each reply was\if eventually sent.
The ordering could be significant, for example, if the
intent is to make an effective copy of the DSPMSG
presentation; that is what my original code did, for some
testing purposes.
When the order is irrelevant however, looking for a reply
to any particular inquiry message is moot. The reply
messages will eventually get removed when they are
encountered later [per order by time of receipt rather than
immediately after the inquiry], and thus also their
corresponding inquiry will be deleted, as the implicit side
effect of having removed the reply. In that processing, all
inquiries can simply be ignored, such that all inquiries
without a reply will remain in the MSGQ. My code doing just
that, follows in a code snippet below, just after some
necessary setup to effect a test. Obviously the work behind
the CpyMsg label is optional, and could be replaced by
whatever work might be required for the context of the OP:
setup: crtmsgq qtemp/qfrom
crtmsgq qtemp/qcopy
snd... /* populate qtemp/qfrom with test messages
*/
<code>
dcl &mq *char 10 qfrom
dcl &ml *char 10 qtemp
dcl &cq *char 10 qcopy
dcl &cl *char 10 qtemp
dcl &msgkey *char 4
dcl &curkey *char 4
dcl &msgtyp *char 2
dcl &curtyp *char 2
dcl &msgtxt *char 132
dcl &rpytxt *char 32
TopMsg:
rcvmsg () (&ml/&mq) (*NEXT) (*TOP) rmv(*no) +
keyvar(&MSGKEY) msg(&MSGTXT) rtntype(&MSGTYP)
PrcMsgs: /* for every message in from-msgq */
DoWhile (&MsgKey *NE ' ') /* inputs: MsgKey MsgTyp MsgTxt
*/
CpyMsg: /* Copy Msg Txt of this message to the other MsqQ
*/
sndpgmmsg () (cpf9897) (qcpfmsg) (&msgtyp *bcat
&msgtxt) +
tomsgq(&cl/&cq) msgtype(*info)
CurMsg: /* save details about the current msg being
processed */
chgvar &curkey &msgkey
chgvar &curtyp &msgtyp
NxtMsg: /* get next relative message; must be done before
RmvMsg! */
rcvmsg msgq(&ml/&mq) msgtype(*next) msgkey(&CURKEY)
rmv(*no) +
keyvar(&MSGKEY) msg(&MSGTXT) rtntype(&MSGTYP)
RmvMsg: /* remove any non-Inqmsg; deleting a Rpy removes
its Inq */
if (&curtyp *ne '05') then(do) /* Do not delete
Inquiries! */
rmvmsg msgq(&ML/&MQ) msgkey(&CURKEY) clear(*bykey)
enddo
EndDo /* EndWhile MsgKey is found */
NoMore:
return
</code>
The revision to the above latter version of the code to
effect the former [more complex] version of the code which
orders processing of the reply message immediately after its
corresponding inquiry, adds the code snippet immediately
following just before the NxtMsg label and the replaces the
activity under the CpyMsg label with the next code snippet
that simply conditions the SNDPGMMSG to avoid copying a
duplicate of the
reply:
<code>
if (&curtyp *eq '05') then(do) /* processing an Inq msg
*/
GetRpy: /* look for a reply to this inquiry */
rcvmsg () (&ml/&mq) (*RPY) (&CURKEY) rmv(*no)
msg(&RPYTXT) +
rtntype(&msgtyp)
if (&msgtyp *eq ' ') then(do) /* blank means no *rpy
msgtype */
NfyRpyPnd: /* no rpy to copy; indicate reply is pending */
sndpgmmsg () (cpf9897) (qcpfmsg) ('** awaiting reply
**') +
tomsgq(&cl/&cq) msgtype(*info)
enddo
else do
CpyRpy: /* like CpyMsg; copy reply to the other msgq */
sndpgmmsg () (cpf9897) (qcpfmsg) (&msgtyp *bcat
&rpytxt) +
tomsgq(&cl/&cq) msgtype(*info)
enddo
enddo /* An inquiry message */
</code>
<code>
if ( *not ( (%sst(&msgtyp 1 1) *eq '2') *and +
(%sst(&msgtyp 2 1) *ge '1') *and +
(%sst(&msgtyp 2 1) *le '6') ) ) then(do)
/* Rpy msgs ignored here else copied both in GetRpy and
here */
sndpgmmsg () (cpf9897) (qcpfmsg) (&msgtyp *bcat
&msgtxt) +
tomsgq(&cl/&cq) msgtype(*info)
enddo
</code>
--
Regards, Chuck
--
This is the RPG programming on the IBM i (AS/400 and
iSeries) (RPG400-L) mailing list To post a message email:
RPG400-L@xxxxxxxxxxxx To subscribe, unsubscribe, or change
list options,
visit:
http://lists.midrange.com/mailman/listinfo/rpg400-l
or email: RPG400-L-request@xxxxxxxxxxxx
Before posting, please take a moment to review the archives
at
http://archive.midrange.com/rpg400-l.
As an Amazon Associate we earn from qualifying purchases.