Get Last Joblog Messages

From MidrangeWiki
Jump to: navigation, search

Summary

The following are the RPG/LE fully free-form definitions and instructions needed for using the Get Last Joblog Messages service procedure. This service procedure simply allows the caller to get the last nn messages from the current joblog.

By Dave Clark

Service Prototype

Place the following in a separate copybook for inclusion in both the caller and the service program source members.

**free

//******************************************************************************
// Get information about the last nn messages in the current joblog.
// If the requested message count is zero, then only the last exception
// message is retrieved from the joblog.
//******************************************************************************
dcl-pr GenUtl_GetLastJoblogMessages;
  pMsgCnt               packed(5:0);
  pMsgInfo              likeds(GenUtl_MsgInfo)
                        dim(%elem(GenUtl_MsgInfo))
                                       options(*varsize);
end-pr;

/include qsysinc/qrpglesrc,qgyoljbl              // QGYOLJBL API structures

// data structure to return message information
dcl-ds GenUtl_MsgInfo   qualified dim(20);
  Id                    char(7);
  Type                  char(10);
  File                  char(10);
  FLib                  char(10);
  Data                  varchar(3000)  inz;
end-ds;

Service Procedure

Place the following in a service program source member.

**free
ctl-opt NoMain AlwNull(*UsrCtl) Debug Option(*SrcStmt:*NoDebugIo)
        DatFmt(*ISO) TimFmt(*ISO);

//******************************************************************************
// Get information about the last nn messages in the current joblog.
// If the requested message count is zero, then only the last exception
// message is retrieved from the joblog.
//******************************************************************************
dcl-proc GenUtl_GetLastJoblogMessages  export;
  dcl-pi *n;
    pMsgCnt             packed(5:0);
    pMsgInfo            likeds(GenUtl_MsgInfo)
                        dim(%elem(GenUtl_MsgInfo))
                                       options(*varsize);
  end-pi;

  dcl-s  iMsgCnt        like(pMsgCnt);
  dcl-s  curmsg         like(pMsgCnt);
  dcl-s  idx            like(pMsgCnt);
  dcl-s  ofs            int(10);
  dcl-s  ofs2           like(ofs);
  dcl-s  iCaller        char(10);
  dcl-s  msgtyp         char(10);
  dcl-s  msgfile        char(10)  inz('QCPFMSG');
  dcl-s  ListRcvr       char(32767);
  dcl-ds selinfo        qualified;
    MSI                 likeds(QGYOMSI);
    QGYFID              int(10)   dim(1);
    QGYCMQN             char(10);
  end-ds;

  iMsgCnt = pMsgCnt;                   // number of messages requested
  if iMsgCnt < 1;                      // if last *EXCP message requested
    iMsgCnt = 1;                       // default to 1 message
  endif;

  GenUtl_CSTKE = GenUtl_FindCallStackEntry('*PRV':PROC_PGM);
  iCaller = GenUtl_CSTKE.QWVPGMN;      // save caller name

  clear selinfo;                       // clear selection information ds
  selinfo.MSI.QGYLD = '*PRV';          // get most recent messages first
  selinfo.MSI.QGYJN = '*';             // from this job's joblog
  selinfo.MSI.QGYSMK = *hival;         // starting at end of joblog
  selinfo.MSI.QGYIDO = %len(selinfo.MSI); // offset to selection criteria
  selinfo.MSI.QGYNBRF00 = 1;           // number of field id's
  selinfo.MSI.QGYQO = selinfo.MSI.QGYIDO
                    + %size(selinfo.QGYFID:*ALL); // offset to message queue name
  selinfo.MSI.QGYMQNS = %len(selinfo.QGYCMQN); // length of message queue name
  selinfo.QGYFID(1) = 0201;            // replacement data or impromptu message text
  selinfo.QGYCMQN   = '*';             // call stack message queue name

  callp IBMAPI_ListJobLogMessages( ListRcvr: %len(ListRcvr): QGYOLI
                                 : 1: selinfo: %len(selinfo): ApiErrC );
  if ApiErrC.BytAvail > *zero;         // if API error, report it
    if %subst(ApiErrC.MsgId:1:3) = 'GUI'; // different msgfile?
      msgfile = 'QGUIMSG';             // supply it
    endif;
    callp GenUtl_Escape( ApiErrC.MsgId
                       : %subst(ApiErrC.MsgData: 1: ApiErrC.BytAvail - 16)
                       : msgfile: *omit: iCaller );
  endif;

  curmsg = 1;                          // set message counter
  idx = *zero;                         // set message index

  dow idx < iMsgCnt                    // load requested number of messages
  and ApiErrC.MsgId <> 'GUI0006';      // unless end of message list exceeded
    QGYORV = %subst(ListRcvr: 1: %len(QGYORV)); // map message header
    ofs = QGYOTFR + 1;                 // set offset to field identifier (FID)
    QGYOIDFI = %subst(ListRcvr: ofs: %len(QGYOIDFI)); // map FID header
    ofs2 = ofs + %len(QGYOIDFI);       // set offset to data associated with FID

    select;                            // interpret message type
      when QGYMT = '01';               // completion
        msgtyp = '*COMP';
      when QGYMT = '02';               // diagnostic
        msgtyp = '*DIAG';
      when QGYMT = '04';               // informational
        msgtyp = '*INFO';
      when QGYMT = '05';               // inquiry
        msgtyp = '*INQ';
      when QGYMT = '06';               // sender's copy
        msgtyp = '*COPY';
      when QGYMT = '08';               // request
        msgtyp = '*RQS';
      when QGYMT = '10';               // request with prompting
        msgtyp = '*RQS';
      when QGYMT = '14';               // notify, exception already handled
        msgtyp = '*NOTIFY';
      when QGYMT = '15';               // escape, exception already handled
        msgtyp = '*ESCAPE';
      when QGYMT = '16';               // notify, exception not yet handled
        msgtyp = '*NOTIFY';
      when QGYMT = '17';               // escape, exception not yet handled
        msgtyp = '*ESCAPE';
      other;                           // unknown
        msgtyp = '*MT' + QGYMT;
    endsl;

    if pMsgCnt > *zero                 // if all msg types requested
    and (QGYMID > *blank               // and msg id present
    or msgtyp <> '*RQS')               // or not request-type message
    or pMsgCnt = *zero                 // or only exception messages
    and msgtyp = '*ESCAPE';            // and this is an exception msg
      idx += 1;                        // then increment message index
      pMsgInfo(idx).Id = QGYMID;       // and load message id
      pMsgInfo(idx).Type = msgtyp;     // message type
      pMsgInfo(idx).File = QGYMFILN;   // message file name
      pMsgInfo(idx).FLib = QGYML;      // message file library name
      pMsgInfo(idx).Data = %trimr(%subst(ListRcvr: ofs2: QGYDL)); // repl. data
      if QGYML <= *blanks or QGYML = '*LIBL';
        select;                        // if message file library is missing
        when QGYMFILN = 'CP_MSGF';     // if a known message file
          pMsgInfo(idx).FLib = 'COOLSPV7R1'; // supply the library name
        when QGYMFILN = 'QZSHMSGF';    // if a known message file
          pMsgInfo(idx).FLib = 'QSHELL'; // supply the library name
        other;                         // else
          pMsgInfo(idx).FLib = '*LIBL'; // hope it is in the liblist
        endsl;
      endif;
    endif;

    if idx < iMsgCnt;                  // max requested not exceeded?
      curmsg += 1;                     // increment message counter
      callp IBMAPI_GetListEntries( ListRcvr: %len(ListRcvr): QGYRH00
                                 : QGYOLI: 1: curmsg: ApiErrC ); // get prev. msg
      if ApiErrC.BytAvail > *zero      // if API error, report it
      and ApiErrC.MsgId <> 'GUI0006';  // unless it is end of list
        if %subst(ApiErrC.MsgId:1:3) = 'GUI'; // different msgfile?
          msgfile = 'QGUIMSG';         // supply it
        endif;
        callp GenUtl_Escape( ApiErrC.MsgId
                           : %subst(ApiErrC.MsgData: 1: ApiErrC.BytAvail - 16)
                           : msgfile: *omit: iCaller );
      endif;
    endif;
  enddo;                               // loop on message count

  callp IBMAPI_CloseList(QGYRH00: ApiErrC); // close the list
  if ApiErrC.BytAvail > *zero;         // if API error, report it
    if %subst(ApiErrC.MsgId:1:3) = 'GUI'; // different msgfile?
      msgfile = 'QGUIMSG';             // supply it
    endif;
    callp GenUtl_Escape( ApiErrC.MsgId
                       : %subst(ApiErrC.MsgData: 1: ApiErrC.BytAvail - 16)
                       : msgfile: *omit: iCaller );
  endif;

  pMsgCnt = idx;                       // pass back no. of messages retrieved
  return;                              // return to caller
end-proc;

References