Note, only some of the list APIs are supported. The general procedure is:
1. Call the special version of the list API to start a server job that builds the list in the background.
2. Call an API to receive from the server job an item from the list.
3. Repeat step 2 as needed to receive other items or to re-receive items.
4. Close the list. This cleans up the server job by freeing its internal storage. The server job can then be used to process another open list.
d #IgnoreErr c Const(x'0000000800000000')
d #ResendErr c Const(x'0000000000000000')
d RcvrLen s 10i 0 Inz(0)
d SelectDS ds
d Direction 10 Inz('*NEXT')
d QJobName 26 Inz('*')
d IntJobID 16
d StartKey 4 Inz(x'00000000')
d MaxMsgLen 10i 0 Inz(-1)
d MaxHelpLen 10i 0 Inz(0)
d OSFieldIDs 10i 0 Inz(84)
d NbrFldIDs 10i 0 Inz(%Elem(FldIDArr))
d OSCallMsgQ 10i 0 Inz(88)
d LenCalMsgQ 10i 0 Inz(1)
d FldIDArr 85 88b 0 Dim(1) Inz(302)
d CallMsgQ 89 90 Inz('*')
d LenSelctDS s 10i 0 Inz(%Size(SelectDS))
d ListInfoDS ds
d TotalRecs 10i 0
d RecsRtrnd 10i 0
d Handle 4
d RecLength 10i 0
d InfoComplt 1
d DateTime 13
d ListStatus 1
d 1
d InfoLength 10i 0
d FirstRec 10i 0
d 40
d Recs2Rtrn s 10i 0
d Rec#2Rtrn s 10i 0
d MsgEntry ds
d OSNextMsg 1 4b 0
d OSFields 5 8b 0
d OSNbrFlds 9 12b 0
d MsgSev 13 16b 0
d MsgID 7
d MsgType 2
d MsgKey 4
d MsgFile 10
d MsgFileLib 10
d DateSent 7
d TimeSent 6
d EntryArr 1 32767 Dim(32767)
d EntryFlds ds Based(pEntryFlds)
d OSNextFld 1 4b 0
d LenFldInfo 5 8b 0
d FieldID 9 12b 0
d TypeOfData 1
d StsOfData 1
d 14
d LenOfData 10i 0
d Data 32000
d FieldsArr 1 32767 Dim(32767)
* Start server job to generate job log messages in the
* background (ie, asynchronously). API QGYOLJBL is the
* sepcial version of the QMHLJOBL API.
c Call 'QGYOLJBL'
c Parm Rcvr 1
c Parm 0 RcvrLen
c Parm ListInfoDS
c Parm 0 Recs2Rtrn
c Parm SelectDS
c Parm LenSelctDS
c Parm #ResendErr Error 8
* At this point, the program can do something else while the list
* is being generated in the background, or it can begin processing
* the list immediately.
* Process list of messages.
c Eval Rec#2Rtrn = 1
c DoW ListStatus <> '2' or
c Rec#2Rtrn <= TotalRecs
* Get a message.
c Eval RcvrLen = %Size(MsgEntry)
c DoU RecsRtrnd > 0
c Call 'QGYGTLE'
c Parm MsgEntry
c Parm RcvrLen
c Parm Handle
c Parm ListInfoDS
c Parm 1 Recs2Rtrn
c Parm Rec#2Rtrn
c Parm #ResendErr Error 8
c EndDo
* Point pEntryFlds to the beginning of the fields for
* the current message.
c Eval pEntryFlds = %Addr(EntryArr(OSFields+1))
* Display message.
c If LenOfData > 50
c Z-Add 50 m 5 0
c Else
c Z-Add LenOfData m
c EndIf
c m Subst(P) Data MsgDsply 50
c MsgDsply Dsply r 1
c Eval Rec#2Rtrn = Rec#2Rtrn + 1
c EndDo
* Close list (ie, cleanup server job).
c Call 'QGYCLST'
c Parm Handle
c Parm #ResendErr Error 8
c MoveL '1' *InLR
c Return
This was first published in January 2006