顯示具有 JRN 標籤的文章。 顯示所有文章
顯示具有 JRN 標籤的文章。 顯示所有文章

星期三, 11月 08, 2023

2012-06-06 如何於 AS400 系統中因應個資法,紀錄使用者何時取得機密敏感的資訊?


如何於 AS400 系統中因應個資法,紀錄使用者何時取得機密敏感的資訊?

於 OS400 V6R1 以前,要利用系統所提供的 Trigger read 事件功能來達成。
詳細資訊請參照:Creating trigger programs

從 OS400 V7R1 以後,還可以使用 V7R1 新增加的 Field Procedure 功能來完成,可以透過程式運作來達到指定欄位的加解密或遮罩。
詳細資訊請參照:Defining field procedures

此次範例使用系統所提供的 Trigger read 事件功能來達成。並將讀取的資訊紀錄於日誌中。


File  : QRPGLESRC

Member: TRGREADJRN

Type  : RPGLE

Usage : CRTBNDRPG QGPL/TRGREADJRN

        於使用前須建立所要使用的日誌 DVMJRN 設定如下:
        1. CRTJRNRCV JRNRCV(QGPL/DVMJRNRCV)
        2. CRTJRN JRN(QGPL/DVMJRN) JRNRCV(QGPL/DVMJRNRCV)
        
        3. 將 Trigger 程式連結至檔案
           ADDPFTRG FILE(lib/file) TRGTIME(*AFTER) TRGEVENT(*READ) PGM(QGPL/TRGREADJRN) TRG(TRGREADJRN)
           DSPFD lib/file 檢視所加入的 Trigger Description。
           若要移除 Trigger 程式連結
           RMVPFTRG FILE(LIB/FILE) TRGTIME(*AFTER) TRGEVENT(*READ)
           
        5. 使用 STRDFU 或其他程式讀取 lib/file
        6. DSPJRN JRN(QGPL/DVMJRN) 會得到類似如下的畫面:
===============================================================================
                           Display Journal Entries                          
                                                                            
Journal  . . . . . . :   DVMJRN          Library  . . . . . . :   QGPL   
Largest sequence number on this screen  . . . . . . : 00000000000000000012  
Type options, press Enter.                                                  
  5=Display entire entry                                                    
                                                                            
                                                                            
Opt    Sequence  Code  Type  Object      Library     Job         Time       
              1   J     PR                           QPADEV000F  11:40:08   
              2   U     DV                           QPADEV000F  11:41:08   
              3   U     DV                           QPADEV000F  11:41:08   
              4   U     DV                           QPADEV000F  11:41:09   
 5            5   U     DV                           QPADEV000F  11:41:09   
              6   U     DV                           QPADEV000F  11:41:09   
              7   U     DV                           QPADEV000F  13:41:46   
              8   U     DV                           QPADEV000F  13:41:47   
              9   U     DV                           QPADEV000F  13:41:47   
             10   U     DV                           QPADEV000F  13:41:48   
             11   U     DV                           QPADEV000F  13:41:50   
             12   U     DV                           QPADEV000F  13:41:50   
==============================================================================
                             Display Journal Entry                              
                                                                                
 Object . . . . . . . :                   Library  . . . . . . :                
 Member . . . . . . . :                                                         
 Incomplete data  . . :   No              Minimized entry data :   *NONE        
 Sequence . . . . . . :   50                                                    
 Code . . . . . . . . :   U  - User generated entry                             
 Type . . . . . . . . :   DV                                                    
                                                                                
             Entry specific data                                                
 Column      *...+....1....+....2....+....3....+....4....+....5                 
 00001      'QPADEV000FVENGOAL   941887VENGOAL   QCUSTCDTC VENG'                
 00051      'OAL   QCUSTCDTC 000000000520120604161956QDZTD00001'                
 00101      'QTEMP     397267Tyron   W E13 Myrtle Dr HectorNY14'                
 00151      '84110001000000000000 < <          '                                
                                                                                
                                                                                
                                                                                
                                                                         Bottom 
===============================================================================
所記錄的資訊目前是定義如下:
     D JrnEntDtaDs     Ds         32767
     D  jjob                         10
     D  juser                        10
     D  jjobnbr                       6
     D  jcurusr                      10
     D  jfile                        10
     D  jfilelib                     10
     D  jfileMbr                     10
     D  jrrn                         10S 0
     D  jdate                         8
     D  jtime                         6
     D  jpgm                         10
     D  jpgmlib                      10
     D* filedata

     前 110 位資訊如上,111位以後目前為所讀取的檔案資訊,可以依照需求修改紀錄檔案中那些資訊。 
     


     **
     **  Program . . : TRGREADJRN
     **  Description : Trigger read event to jiurnal
     **  Author  . . : Vengoal Chang
     **  Published . : AS400 ePaper
     **  Date  . . . : June 4, 2012
     **
     **
     **  Program summary
     **  ---------------
     **
     **  Journal & commit API:
     **    QJOSJRNE       Send journal entry   Writes a single journal entry to a
     **                                        specific journal.  The entry can
     **                                        contain any information.  You can
     **                                        assign an entry type to the
     **                                        journal entry.
     **
     **
     **  Compile and setup instructions:
     **    CrtBndRpg   Pgm( TRGREADJRN )
     **
     **
     **-- Control specifications:  -------------------------------------------**
     H Debug  Option(*SrcStmt:*NoDebugIo) DftActGrp(*NO)
     **-- API error information:
     D ERRC0100        Ds                  Qualified
     D  BytPro                       10i 0 Inz( %Size( ERRC0100 ))
     D  BytAvl                       10i 0
     D  MsgId                         7a
     D                                1a
     D  MsgDta                      256a
     **-- System information:
     D PgmSts         SDs                  Qualified
     D  PgmNam           *Proc
     D  MsgId                         7a   Overlay( PgmSts:  40 )
     D  Msg                          80a   Overlay( PgmSts:  91 )
     D  CurJob                       10a   Overlay( PgmSts: 244 )
     D  UsrPrf                       10a   Overlay( PgmSts: 254 )
     D  JobNbr                        6a   Overlay( PgmSts: 264 )
     D  CurUsr                       10a   Overlay( PgmSts: 358 )
     **-- Send program message:
     D SndPgmMsg       Pr                  ExtPgm( 'QMHSNDPM' )
     D  SpMsgId                       7a   Const
     D  SpMsgFq                      20a   Const
     D  SpMsgDta                    128a   Const
     D  SpMsgDtaLen                  10i 0 Const
     D  SpMsgTyp                     10a   Const
     D  SpCalStkE                    10a   Const  Options( *VarSize )
     D  SpCalStkCtr                  10i 0 Const
     D  SpMsgKey                      4a
     D  SpError                   32767a          Options( *VarSize )
     **-- Send journal entry:
     D SndJrnE         Pr                  ExtPgm( 'QJOSJRNE' )
     D  SjJrnNamQ                    20a   Const
     D  SjJrnEntInf                4096a   Const  Options( *VarSize )
     D  SjEntDta                  32766a   Const  Options( *VarSize )
     D  SjEntDtaLen                  10i 0 Const
     D  SjError                   32767a          Options( *VarSize )
     **
     D JrnEntInf       Ds                  Qualified
     D  InfEntRcds                   10i 0 Inz( 1 )
     D  InfKey1                      10i 0 Inz( 1 )
     D  InfLen1                      10i 0 Inz( %Size( JrnEntInf.InfDta1))
     D  InfDta1                       2a
     D* InfKey2                      10i 0 Inz( 2 )
     D* InfLen2                      10i 0 Inz( %Size( JrnEntInf.InfDta2))
     D* InfDta2                      20a
     D* InfKey3                      10i 0 Inz( 3 )
     D* InfLen3                      10i 0 Inz( %Size( JrnEntInf.InfDta3))
     D* InfDta3                      10a
     **
     **-- Send escape message:
     D SndEscMsg       Pr            10i 0
     D  PxMsgDta                    512a   Const  Varying

     **-- Trigger buffer:
     D trgBuffer       DS         32767
     D  tbFile                       10
     D  tbLib                        10
     D  tbMbr                        10
     D  tbEvnt                        1
     D  tbTime                        1
     D  tbComt                        1
     D  tbFill01                      3
     D  tbCCSID                      10I 0
     D  tbRRN                        10I 0
     D  tbFill02                      4
     D  tbOldOffset                  10I 0
     D  tbOldLength                  10I 0
     D  tbOldNullOff                 10I 0
     D  tbOldNullLen                 10I 0
     D  tbNewOffset                  10I 0
     D  tbNewLength                  10I 0
     D  tbNewNullOff                 10I 0
     D  tbNewNullLen                 10I 0
     **
     D JrnEntDtaDs     Ds         32767
     D  jjob                         10
     D  juser                        10
     D  jjobnbr                       6
     D  jcurusr                      10
     D  jfile                        10
     D  jfilelib                     10
     D  jfileMbr                     10
     D  jrrn                         10S 0
     D  jdate                         8
     D  jtime                         6
     D  jpgm                         10
     D  jpgmlib                      10
     **
     ** Trigger Buffer Length Field
     D trgBufferLen    S             10I 0

     ** Constants
     ** Possible values for Event
     D DbActIns        C                   '1'
     D DbActDlt        C                   '2'
     D DbActUpd        C                   '3'
     D DbActRead       C                   '4'
     ** Possible values for Time
     D DbTimBfr        C                   '1'
     D DbTimAft        C                   '2'
     ** Possible values for Commitlocklev
     D Cmtnone         C                   '0'
     D Cmtchange       C                   '1'
     D Cmtcs           C                   '2'
     D Cmtall          C                   '3'
     **
     D GetCaller       PR                  Extpgm('QWVRCSTK')
     D  Var                        2000
     D  VarLen                       10I 0
     D  CStkFmt                       8    CONST
     D  JobIdInfo                    56
     D  JobIdFmt                      8    CONST
     D  ApiErr                       15
     **
     D Var             DS          2000
     D  BytAvl                       10I 0
     D  BytRtn                       10I 0
     D  Entries                      10I 0
     D  Offset                       10I 0
     ** Stand Alone variables
     D VarLen          S             10I 0 Inz(%size(Var))
     D ApiErr          S             15
     D Doffset         S             10I 0
     **
     D JobIdInf        DS
     D  JIDQName                     26    Inz('*')
     D  JIDIntID                     16
     D  JIDRes3                       2    Inz(*loval)
     D  JIDThreadInd                 10I 0 Inz(1)
     D  JIDThread                     8    Inz(*loval)
     **
     D Entry           DS           256
     D  EntryLen                     10I 0
     D  PgmNam                       10    Overlay(Entry:25)
     D  PgmLib                       10    Overlay(Entry:35)
     **
     D i               S              5  0
     D JIDUser         S             10    inz(*user)
     D JIDDate         S               D   Inz(*sys)
     D JIDTime         S               t   inz(*sys)
     D MsgKey          s              4a

      **********************************************************************
      *
      *                  PLISTS
      *
      **********************************************************************
     C     *Entry        plist
     C                   parm                    trgBuffer
     C                   parm                    trgBufferLen

      **********************************************************************
      *
      *                  Main lines
      *
      **********************************************************************
      /free
       ExSr      GetCallerID;
       if  tbEvnt = DbActRead;
             jjob     = PgmSts.CurJob;
             jUser    = PgmSts.UsrPrf;
             jJobNbr  = PgmSts.JobNbr;
             jCurUsr  = PgmSts.CurUsr;
             jfile    = tbFile;
             jfilelib = tbLib;
             jfileMbr = tbMbr;
             jrrn     = tbRRN;
             jdate    = %char(JIDDate:*iso0) ;
             jtime    = %char(JIDTime:*hms0) ;
             jpgm     = PgmNam ;
             jpgmlib  = PgmLib ;

             JrnEntInf.InfDta1 = 'DV';
          // JrnEntInf.InfDta2 = tbFile  + tbLib;
          // JrnEntInf.InfDta3 = tbMbr;
             %SubSt(JrnEntDtaDS : 111) =
                    %SubSt(trgBuffer : tbOldOffset + 1 : tbOldLength);

             SndJrnE( 'DVMJRN    *LIBL '
                    : JrnEntInf
                    : JrnEntDtaDs
                    : tbOldLength + 110
                    : ERRC0100
                    );
             if (ERRC0100.BytAvl > 0);
                 SndEscMsg( ERRC0100.MsgID + ERRC0100.MsgDta );
             endIf;
       endif;

       return;
      /end-free
      *=====================================================================
      *
      *             Get Caller ID
      *
      *=====================================================================
     C     GetCallerID   begsr

     C                   callp     GetCaller(Var:VarLen:'CSTK0100':JobIdInf
     C                                       :'JIDF0100':ApiErr)
     C                   FOR       i = 1 TO Entries
     C                   eval      Entry = %subst(Var:Offset + 1)
     C                   if        pgmnam <> PgmSts.PgmNam  and
     C                             pgmlib <> 'QSYS'
     C                   leave
     C                   endif
     C                   eval      Offset = Offset + EntryLen
     C                   Endfor

     C*    pgmnam        dsply
     C*    pgmlib        dsply

     C                   endsr
     **-- Send escape message:  ----------------------------------------------**
     P SndEscMsg       B
     D                 Pi            10i 0
     D  PxMsgDta                    512a   Const  Varying

      /Free

        SndPgmMsg( 'CPF9898'
                 : 'QCPFMSG   *LIBL'
                 : PxMsgDta
                 : %Len( PxMsgDta )
                 : '*ESCAPE'
                 : '*PGMBDY'
                 : 1
                 : MsgKey
                 : ERRC0100
                 );

        If  ERRC0100.BytAvl > *Zero;
          Return  -1;

        Else;
          Return  0;

        EndIf;

      /End-Free

     P SndEscMsg       E








2008-03-29 如何取得 Journal 的屬性?(Command RTVJRNA with API QjoRetrieveJournalInformation)


如何取得 Journal 的屬性?(Command RTVJRNA with API QjoRetrieveJournalInformation)


File   : QCLSRC
Member : RTVJRNA
Type   : CLLE
Usage  : CRTBNDCL PGM(RTVJRNA)


/*  ===============================================================  */
/*  = Command RtvJrnA    CPP                                      =  */
/*  =   RtvJrnA    CLLE                                           =  */
/*  ===============================================================  */
/*  = Date  : 2008/03/14                                          =  */
/*  = Author: Vengoal Chang                                       =  */
/*  ===============================================================  */

PGM PARM(&QUALJRN &RTNLIB &ASP &MSGQ &MSGQLIB &MNGRCV &DLTRCV +
         &MNGRCVDLY &DLTRCVDLY &JRNTYP &JRNSTS &JRNDLVMODE +
         &RCVSIZMFIX                      +
         &RCVSIZRMVI                      +
         &RCVSIZOPT1                      +
         &RCVSIZOPT2                      +
         &RCVSIZOPT3                      +
         &NBRRCV                          +
         &ATCJRNRCV                       +
         &ATCJRNRCVL                      +
         &JRNCACHE                        +
         &RMTJRNTYP                       +
         &JRNOBJ                          +
         &JRNOBJLMT                       +
         &MINJRNENTD                      +
         &MINJRNENTF                      +
         &JRNRCVCNT                       +
         &TEXT                            )

     DCL VAR(&QUALJRN) TYPE(*CHAR) LEN(20)
     DCL VAR(&JRNNAME) TYPE(*CHAR) LEN(10)
     DCL VAR(&JRNLIB) TYPE(*CHAR) LEN(10)
     DCL VAR(&RTNLIB) TYPE(*CHAR) LEN(10)      /* STR  LEN*/
     DCL VAR(&ASP   ) TYPE(*DEC ) LEN(3 0)     /*  33    4*/
     DCL VAR(&MSGQ  ) TYPE(*CHAR) LEN(10)      /*  37   10*/
     DCL VAR(&MSGQLIB) TYPE(*CHAR) LEN(10)     /*  47   10*/
     DCL VAR(&MNGRCV ) TYPE(*CHAR) LEN(10)     /*  57    1*/
     DCL VAR(&DLTRCV ) TYPE(*CHAR) LEN( 4)     /*  58    1*/
     DCL VAR(&MNGRCVDLY) TYPE(*DEC) LEN(7 0)   /* 257    4*/
     DCL VAR(&DLTRCVDLY) TYPE(*DEC) LEN(7 0)   /* 261    4*/
     DCL VAR(&JRNTYP   ) TYPE(*CHAR) LEN(10)   /*  66    1*/
     DCL VAR(&JRNSTS   ) TYPE(*CHAR) LEN(10)   /*  68    1*/
     DCL VAR(&JRNDLVMODE) TYPE(*CHAR) LEN(10)  /*  69    1*/
     DCL VAR(&RCVSIZMFIX) TYPE(*CHAR) LEN( 4)  /*  60    1*/
     DCL VAR(&RCVSIZRMVI) TYPE(*CHAR) LEN( 4)  /*  59    1*/
     DCL VAR(&RCVSIZOPT1) TYPE(*CHAR) LEN( 4)  /*  61    1*/
     DCL VAR(&RCVSIZOPT2) TYPE(*CHAR) LEN( 4)  /*  62    1*/
     DCL VAR(&RCVSIZOPT3) TYPE(*CHAR) LEN( 4)  /*  63    1*/
     DCL VAR(&NBRRCV    ) TYPE(*DEC ) LEN(5 0) /* 197    4*/
     DCL VAR(&ATCJRNRCV ) TYPE(*CHAR) LEN(10)  /* 201   10*/
     DCL VAR(&ATCJRNRCVL) TYPE(*CHAR) LEN(10)  /* 211   10*/
     DCL VAR(&JRNCACHE  ) TYPE(*CHAR) LEN( 4)  /* 196    1*/
     DCL VAR(&RMTJRNTYP ) TYPE(*CHAR) LEN(10)  /*  67    1*/
     DCL VAR(&JRNOBJ    ) TYPE(*DEC ) LEN(15 0)/* 309    4*/
     DCL VAR(&JRNOBJLMT ) TYPE(*CHAR) LEN(1)   /* 308    1*/
     DCL VAR(&MINJRNENTD) TYPE(*CHAR) LEN(1)   /* 186    1*/
     DCL VAR(&MINJRNENTF) TYPE(*CHAR) LEN(1)   /* 187    1*/
     DCL VAR(&JRNRCVCNT ) TYPE(*DEC ) LEN(11 0)/* 341    4*/
     DCL VAR(&TEXT      ) TYPE(*CHAR) LEN(50)  /* 136   50*/

     DCL        VAR(&WORK) TYPE(*CHAR) LEN(4)
     DCL VAR(&RCVRNAME) TYPE(*CHAR) LEN(10)
     DCL VAR(&RCVRLIB) TYPE(*CHAR) LEN(10)

     DCL VAR(&RCV) TYPE(*CHAR) LEN(512)
     DCL VAR(&RCVLEN) TYPE(*CHAR) LEN(4)
     DCL VAR(&JRNRCV) TYPE(*CHAR) LEN(20)
     DCL VAR(&SEQNBR) TYPE(*CHAR) LEN(20)
     DCL VAR(&RCVRINFO) TYPE(*CHAR) LEN(20)

     DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)
     DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(256)
     DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)
     DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
     DCL        VAR(&MSGTXT) TYPE(*CHAR) LEN(256)

     MONMSG     MSGID(CPF0000 MCH0000) EXEC(GOTO CMDLBL(ERROR))

     CHGVAR     VAR(&JRNNAME) VALUE(%SST(&QUALJRN  1 10))
     CHGVAR     VAR(&JRNLIB) VALUE(%SST(&QUALJRN 11 10))
     CHKOBJ     OBJ(&JRNLIB/&JRNNAME) OBJTYPE(*JRN)

     IF (&JRNLIB *EQ '*LIBL') Do
             RTVOBJD    OBJ(&JRNLIB/&JRNNAME) OBJTYPE(*JRN) +
                          RTNLIB(&RTNLIB)
             MONMSG     MCH3601
     EndDo
     Else Do
             CHGVAR     VAR(&RTNLIB) VALUE(&JRNLIB)
             MONMSG     MCH3601
     EndDo

     CHGVAR   VAR( %bin(&RCVLEN ))  VALUE(512)
     CHGVAR   %SST(&RCVRINFO 1 10) &JRNNAME
     CHGVAR   %SST(&RCVRINFO 11 10) &JRNLIB

     CALLPRC PRC('QjoRetrieveJournalInformation') +
          PARM((&RCV) (&RCVLEN) (&RCVRINFO) +
          ('RJRN0100') (X'00000000') +
          (*OMIT))
/* ASP */
     CHGVAR VAR(&JRNRCV) VALUE(%SST(&RCV 201 20))
     CHGVAR     VAR(&WORK) VALUE(%SST(&RCV 33 4))
     CHGVAR     VAR(&ASP) VALUE(%BIN(&WORK))
     MONMSG     MCH3601

     CHGVAR VAR(&MSGQ    ) VALUE(%SST(&RCV 37  10))
     MONMSG     MCH3601
     CHGVAR VAR(&MSGQLIB) VALUE(%SST(&RCV  47 10))
     MONMSG     MCH3601
     CHGVAR VAR(&ATCJRNRCV)  VALUE(%SST(&RCV 201 10))
     MONMSG     MCH3601
     CHGVAR VAR(&ATCJRNRCVL) VALUE(%SST(&RCV 211 10))
     MONMSG     MCH3601
     CHGVAR VAR(&ATCJRNRCVL) VALUE(%SST(&RCV 211 10))
     MONMSG     MCH3601
     CHGVAR VAR(&JRNOBJLMT ) VALUE(%SST(&RCV 308  1))
     MONMSG     MCH3601
     CHGVAR VAR(&MINJRNENTD) VALUE(%SST(&RCV 186  1))
     MONMSG     MCH3601
     CHGVAR VAR(&MINJRNENTF) VALUE(%SST(&RCV 187  1))
     MONMSG     MCH3601

/* MNGRCV ' '   remote journal */
/*        '0'   user manage    */
/*        '1'   system manage  */
     If (%SST(&RCV 57  1 ) *EQ '1')  Do
       CHGVAR VAR(&MNGRCV  ) VALUE('*SYSTEM')
       MONMSG     MCH3601
     EndDo
     If (%SST(&RCV 57  1 ) *EQ '0')  Do
       CHGVAR VAR(&MNGRCV  ) VALUE('*USER')
       MONMSG     MCH3601
     EndDo
     If (%SST(&RCV 57  1 ) *EQ ' ')  Do
       CHGVAR VAR(&MNGRCV  ) VALUE(' ')
       MONMSG     MCH3601
     EndDo

     If (%SST(&RCV 58  1 ) *EQ '1')  Do
       CHGVAR VAR(&DLTRCV ) VALUE('*YES')
       MONMSG     MCH3601
     EndDo
     Else Do
       CHGVAR VAR(&DLTRCV ) VALUE('*NO')
       MONMSG     MCH3601
     EndDo

     CHGVAR     VAR(&WORK) VALUE(%SST(&RCV 257 4))
     CHGVAR     VAR(&MNGRCVDLY) VALUE(%BIN(&WORK))
     MONMSG     MCH3601

     CHGVAR     VAR(&WORK) VALUE(%SST(&RCV 261 4))
     CHGVAR     VAR(&DLTRCVDLY) VALUE(%BIN(&WORK))
     MONMSG     MCH3601

/* Journal type          */
     If (%SST(&RCV 66  1 ) *EQ '1')  Do
       CHGVAR VAR(&JRNTYP ) VALUE('*REMOTE')
       MONMSG     MCH3601
     EndDo
     Else Do
       CHGVAR VAR(&JRNTYP ) VALUE('*LOCAL')
       MONMSG     MCH3601
     EndDo

/* Journal state         */
     If (%SST(&RCV 68  1 ) *EQ '0')  Do
       CHGVAR VAR(&JRNSTS ) VALUE('*INACTIVE')
       MONMSG     MCH3601
     EndDo
     If (%SST(&RCV 68  1 ) *EQ '1')  Do
       CHGVAR VAR(&JRNSTS ) VALUE('*ACTIVE')
       MONMSG     MCH3601
     EndDo
     If (%SST(&RCV 68  1 ) *EQ '2')  Do
       CHGVAR VAR(&JRNSTS ) VALUE('*FAILED')
       MONMSG     MCH3601
     EndDo
     If (%SST(&RCV 68  1 ) *EQ '4')  Do
       CHGVAR VAR(&JRNSTS ) VALUE('*INACTPEND')
       MONMSG     MCH3601
     EndDo
     If (%SST(&RCV 68  1 ) *EQ '5')  Do
       CHGVAR VAR(&JRNSTS ) VALUE('*STANDBY')
       MONMSG     MCH3601
     EndDo

/* Journal delivery mode */
     If (%SST(&RCV 69  1 ) *EQ '0')  Do
       CHGVAR VAR(&JRNDLVMODE) VALUE('*NA'   )
       MONMSG     MCH3601
     EndDo
     If (%SST(&RCV 69  1 ) *EQ '1')  Do
       CHGVAR VAR(&JRNDLVMODE) VALUE('*ASYNC')
       MONMSG     MCH3601
     EndDo
     If (%SST(&RCV 69  1 ) *EQ '2')  Do
       CHGVAR VAR(&JRNDLVMODE) VALUE('*SYNC')
       MONMSG     MCH3601
     EndDo
     If (%SST(&RCV 69  1 ) *EQ '3')  Do
       CHGVAR VAR(&JRNDLVMODE) VALUE('*ASYNCPEND')
       MONMSG     MCH3601
     EndDo
     If (%SST(&RCV 69  1 ) *EQ '4')  Do
       CHGVAR VAR(&JRNDLVMODE) VALUE('*SYNCPEND')
       MONMSG     MCH3601
     EndDo

/* Receiver size option *RMVINTENT */
     If (%SST(&RCV 59  1 ) *EQ '1')  Do
       CHGVAR VAR(&RCVSIZRMVI ) VALUE('*YES')
       MONMSG     MCH3601
     EndDo
     Else Do
       CHGVAR VAR(&RCVSIZRMVI ) VALUE('*NO')
       MONMSG     MCH3601
     EndDo

/* Receiver size option *MINFIXLEN */
     If (%SST(&RCV 60  1 ) *EQ '1')  Do
       CHGVAR VAR(&RCVSIZMFIX ) VALUE('*YES')
       MONMSG     MCH3601
     EndDo
     Else Do
       CHGVAR VAR(&RCVSIZMFIX ) VALUE('*NO')
       MONMSG     MCH3601
     EndDo
/* Receiver size option *MAXOPT1   */
     If (%SST(&RCV 61  1 ) *EQ '1')  Do
       CHGVAR VAR(&RCVSIZOPT1 ) VALUE('*YES')
       MONMSG     MCH3601
     EndDo
     Else Do
       CHGVAR VAR(&RCVSIZOPT1 ) VALUE('*NO')
       MONMSG     MCH3601
     EndDo
/* Receiver size option *MAXOPT2   */
     If (%SST(&RCV 62  1 ) *EQ '1')  Do
       CHGVAR VAR(&RCVSIZOPT2 ) VALUE('*YES')
       MONMSG     MCH3601
     EndDo
     Else Do
       CHGVAR VAR(&RCVSIZOPT2 ) VALUE('*NO')
       MONMSG     MCH3601
     EndDo
/* Receiver size option *MAXOPT3   */
     If (%SST(&RCV 63  1 ) *EQ '1')  Do
       CHGVAR VAR(&RCVSIZOPT3 ) VALUE('*YES')
       MONMSG     MCH3601
     EndDo
     Else Do
       CHGVAR VAR(&RCVSIZOPT3 ) VALUE('*NO')
       MONMSG     MCH3601
     EndDo

/* Number of receiver  */
     CHGVAR     VAR(&WORK) VALUE(%SST(&RCV 197 4))
     CHGVAR     VAR(&NBRRCV   ) VALUE(%BIN(&WORK))
     MONMSG     MCH3601

/* Journal cache       */
/*        ' '   remote journal */
/*        '0'   no cache       */
/*        '1'   cache          */
     If (%SST(&RCV 196 1 ) *EQ ' ')  Do
       CHGVAR VAR(&JRNCACHE) VALUE('*NA' )
       MONMSG     MCH3601
     EndDo
     If (%SST(&RCV 196 1 ) *EQ '1')  Do
       CHGVAR VAR(&JRNCACHE) VALUE('*YES')
       MONMSG     MCH3601
     EndDo
     If (%SST(&RCV 196 1 ) *EQ '0')  Do
       CHGVAR VAR(&JRNCACHE ) VALUE('*NO')
       MONMSG     MCH3601
     EndDo

/* Remote journal type */
     If (%SST(&RCV 67 1 ) *EQ '0')  Do
       CHGVAR VAR(&RMTJRNTYP) VALUE('*LOCAL')
       MONMSG     MCH3601
     EndDo
     If (%SST(&RCV 67 1 ) *EQ '1')  Do
       CHGVAR VAR(&RMTJRNTYP) VALUE('*TYPE1')
       MONMSG     MCH3601
     EndDo
     If (%SST(&RCV 67 1 ) *EQ '2')  Do
       CHGVAR VAR(&RMTJRNTYP) VALUE('*TYPE2')
       MONMSG     MCH3601
     EndDo

/* Number of object journaled */
     CHGVAR     VAR(&WORK) VALUE(%SST(&RCV 309 4))
     CHGVAR     VAR(&JRNOBJ   ) VALUE(%BIN(&WORK))
     MONMSG     MCH3601
/* Journal recovery count from V5R4   */
     CHGVAR     VAR(&WORK) VALUE(%SST(&RCV 341 4))
     CHGVAR     VAR(&JRNRCVCNT) VALUE(%BIN(&WORK))
     MONMSG     MCH3601

     Return

/*  ===============================================================  */
/*  = Error routine                                               =  */
/*  ===============================================================  */

Error:

  RcvMsg     MsgType( *Excp )                                         +
             MsgDta( &MsgDta )                                        +
             MsgID( &MsgID )                                          +
             MsgF( &MsgF )                                            +
             MsgFLib( &MsgFLib )
  MonMsg     ( CPF0000 MCH0000 )

SndMsg:

  SndPgmMsg  MsgID( &MsgID )                                          +
             MsgF( &MsgFLib/&MsgF )                                   +
             MsgDta( &MsgDta )                                        +
             MsgType( *Escape )
  MonMsg     ( CPF0000 MCH0000 )

/*  ===============================================================  */
/*  = End of program                                              =  */
/*  ===============================================================  */

ENDPGM


File   : QCMDSRC
Member : RTVJRNA
Type   : CMD
Usage  : CRTCMD CMD(your-lib/RTVJRNA) PGM(your-lib/RTVJRNA) ALLOW(*IPGM *BPGM) 

/*  ===============================================================  */
/*  = Command....... RtvJrnA                                      =  */
/*  = CPP........... RtvJrnA    CLLE                              =  */
/*  = Description... Retrieve journal attributes                  =  */
/*  =                                                             =  */
/*  = CrtCmd      Cmd( RtvJrnA    )                               =  */
/*  =             Pgm( RtvJrnA    )                               =  */
/*  =             Pgm( RtvJrnA    )                               =  */
/*  =             SrcFile( YourSourceFile )                       =  */
/*  =             Allow(*Ipgm *Bpgm)                              =  */
/*  ===============================================================  */
/*  = Date  : 2008/03/14                                          =  */
/*  = Author: Vengoal Chang                                       =  */
/*  ===============================================================  */
/*  = Parameter     Description                                   =  */
/*  =   JRN         The qualified name of the journal to be retrieved*/
/*  =   RTNLIB      The library containing the journal.           =  */
/*  =   ASP         The Auxiliary Storage pool containing the     =  */
/*  =               journal.                                      =  */
/*  =   MSGQ        The Message Queue where messages from the     =  */
/*  =               journal sent.such as if the threshold has     =  */
/*  =               been reached.                                 =  */
/*  =   MSGQLIB     The Message Queue Library where messages from =  */
/*  =               the journal are sent such as if the threshold =  */
/*  =               has been reached.                             =  */
/*  =   MNGRCV      The Manage Receiver option as specified on    =  */
/*  =               CRTJRN. Either *USER or *SYSTEM is returned.  =  */
/*  =   DLTRCV      The Delete Receiver option as specified on    =  */
/*  =               CRTJRN. Either *NO or *YES is returned.       =  */
/*  =   MNGRCVDLY   The time in  minutes to be used to delay the  =  */
/*  =               attempt to delete a journal receiver, if the  =  */
/*  =               system cannot allocate it and  DLTRCV(*YES)   =  */
/*  =               is  specified.                                =  */
/*  =   DLTRCVDLY   The time in  minutes to be used to delay the  =  */
/*  =               next attempt to attach a new journal receiver =  */
/*  =               for system managed receivers.                 =  */
/*  =   JRNTYP      The type of journal.                          =  */
/*  =               *LOCAL or *REMOTE is returned.                =  */
/*  =   JRNSTS      The status of the journal.                    =  */
/*  =               *INACTIVE, *ACTIVE, *FAILED, or *INACTPEND    =  */
/*  =               will be returned.                             =  */
/*  =   JRNDLVMODE  The delivery mode of the journal.             =  */
/*  =               *NA  if it is not applicable, such as local   =  */
/*  =               journal.                                      =  */
/*  =               *ASYNC, *SYNC, *ASYNCPEND, and *SYNCPEND will =  */
/*  =               will be returned for remote journal.          =  */
/*  =   RCVSIZMFIX  The CRTJRN RCVSIZOPT(*MINFIXLEN) option.      =  */
/*  =               Blank is returned for remote journal.         =  */
/*  =               *YES or *NO is returned depending on whether  =  */
/*  =               *MINFIXLEN  was specified.                    =  */
/*  =   RCVSIZRMVI  The CRTJRN RCVSIZOPT(*RMVINTENT) option.      =  */
/*  =               Blank is returned for remote journal.         =  */
/*  =               *YES or *NO is returned depending on whether  =  */
/*  =               *RMVINTENT  was specified.                    =  */
/*  =   RCVSIZOPT1  The CRTJRN RCVSIZOPT(*MAXOPT1)   option.      =  */
/*  =               Blank is returned for remote journal.         =  */
/*  =               *YES or *NO is returned depending on whether  =  */
/*  =               *MAXOPT1    was specified.                    =  */
/*  =   RCVSIZOPT2  The CRTJRN RCVSIZOPT(*MAXOPT2)   option.      =  */
/*  =               Blank is returned for remote journal.         =  */
/*  =               *YES or *NO is returned depending on whether  =  */
/*  =               *MAXOPT2    was specified.                    =  */
/*  =   RCVSIZOPT3  The CRTJRN RCVSIZOPT(*MAXOPT3)   option.      =  */
/*  =               Blank is returned for remote journal.         =  */
/*  =               *YES or *NO is returned depending on whether  =  */
/*  =               *MAXOPT3    was specified.                    =  */
/*  =   NBRRCV      The number of receivers currently attached.   =  */
/*  =   ACTJRNRCV   The name of the current attached journal      =  */
/*  =               receiver.                                     =  */
/*  =   ACTJRNRCVL  The name of the library of the attached       =  */
/*  =               journal receiver.                             =  */
/*  =   JRNCACHE    Whether journal entries will be cached, before=  */
/*  =               being written out to disk.                    =  */
/*  =               *NA for remote journal, *YES, *NO will be     =  */
/*  =               returned.                                     =  */
/*  =   RMTJRNTYP   The type of Remote Journal. *LOCAL, *TYPE1    =  */
/*  =               or *TYPE2 will be returned.                   =  */
/*  =   JRNOBJ      The total number of objects being journaled   =  */
/*  =               to the journal.                               =  */
/*  =   JRNOBJLMT   The maximum number of objects that may be     =  */
/*  =               journaled to the journal.(From V5R4)          =  */
/*  =   MINJRNENTD  Whether journal entries to data areas will be =  */
/*  =               minimized in size.                            =  */
/*  =   MINJRNENTF  Whether journal entries to files will be      =  */
/*  =               minimized in size.                            =  */
/*  =   JRNRCVCNT   Journal recovery count (From V5R4)            =  */
/*  =               Describes whether a faster abnormal IPL will  =  */
/*  =               occur.                                        =  */
/*  =   TEXT        The text description of the Journal.          =  */
/*  =                                                             =  */
/*  ===============================================================  */
             CMD        PROMPT('Retrieve Journal Attributes')

             PARM       KWD(JRN) TYPE(QUAL) MIN(1) +
                          PROMPT('Journal')

             PARM       KWD(RTNLIB) TYPE(*CHAR) LEN(10) RTNVAL(*YES) +
                          PROMPT('CL var for RTNLIB       (10)')
             PARM       KWD(ASP) TYPE(*DEC) LEN(3 0) RTNVAL(*YES) +
                          PROMPT('CL var for ASP         (3 0)')
             PARM       KWD(MSGQ  ) TYPE(*CHAR) LEN(10) RTNVAL(*YES) +
                          PROMPT('CL var for MSGQ         (10)')
             PARM       KWD(MSGQLIB) TYPE(*CHAR) LEN(10) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          MSGQLIB      (10)')
             PARM       KWD(MNGRCV ) TYPE(*CHAR) LEN(10) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          MNGRCV       (10)')
             PARM       KWD(DLTRCV) TYPE(*CHAR) LEN( 4) RTNVAL(*YES) +
                          PROMPT('CL var for DLTRCV       (10)')
             PARM       KWD(MNGRCVDLY) TYPE(*DEC) LEN( 7 0) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          MNGRCVDLY  (15 0)')
             PARM       KWD(DLTRCVDLY) TYPE(*DEC) LEN( 7 0) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          DLTRCVDLY  (15 0)')
             PARM       KWD(JRNTYP ) TYPE(*CHAR) LEN(10) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          JRNTYP       (10)')
             PARM       KWD(JRNSTS ) TYPE(*CHAR) LEN(10) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          JRNSTS       (10)')
             PARM       KWD(JRNDLVMODE ) TYPE(*CHAR) LEN(10) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          JRNDLVMODE   (10)')
             PARM       KWD(RCVSIZMFIX ) TYPE(*CHAR) LEN( 4) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          RCVSIZMFIX   ( 4)')
             PARM       KWD(RCVSIZRMVI ) TYPE(*CHAR) LEN( 4) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          RCVSIZRMVI   ( 4)')
             PARM       KWD(RCVSIZOPT1 ) TYPE(*CHAR) LEN( 4) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          RCVSIZOPT1   ( 4)')
             PARM       KWD(RCVSIZOPT2 ) TYPE(*CHAR) LEN( 4) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          RCVSIZOPT2   ( 4)')
             PARM       KWD(RCVSIZOPT3 ) TYPE(*CHAR) LEN( 4) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          RCVSIZOPT3   ( 4)')
             PARM       KWD(NBRRCV    ) TYPE(*DEC) LEN( 5 0) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          NBRRCV      (5 0)')
             PARM       KWD(ACTJRNRCV ) TYPE(*CHAR) LEN(10) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          ACTJRNRCV    (10)')
             PARM       KWD(ACTJRNRCVL) TYPE(*CHAR) LEN(10) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          ACTJRNRCVL   (10)')
             PARM       KWD(JRNCACHE  ) TYPE(*CHAR) LEN( 4) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          JRNCACHE     ( 4)')
             PARM       KWD(RMTJRNTYP ) TYPE(*CHAR) LEN(10) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          RMTJRNTYP    (10)')
             PARM       KWD(JRNOBJ   ) TYPE(*DEC) LEN(15 0) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          JRNOBJ     (15 0)')
             PARM       KWD(JRNOBJLMT ) TYPE(*CHAR) LEN( 1) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          JRNOBJLMT    ( 1)')
             PARM       KWD(MINJRNENTD ) TYPE(*CHAR) LEN( 1) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          MINJRNENTD   ( 1)')
             PARM       KWD(MINJRNENTF ) TYPE(*CHAR) LEN( 1) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          MINJRNENTF   ( 1)')
             PARM       KWD(JRNRCVCNT) TYPE(*DEC) LEN(11 0) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          JRNRCVCNT  (11 0)')
             PARM       KWD(TEXT     ) TYPE(*CHAR) LEN(50) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          TEXT         (50)')


 QUAL:       QUAL       TYPE(*NAME) LEN(10) SPCVAL((*ALL)) EXPR(*YES)
             QUAL       TYPE(*NAME) LEN(10) DFT(*LIBL) +
                          SPCVAL((*LIBL) (*CURLIB)) EXPR(*YES) +
                          PROMPT('Library')




File   : QCLSRC
Member : RTVJRNAT
Type   : CLP
Usage  : 測試程式 
         CRTCLPGM RTVJRNAT
         CALL RTVJRNRCVT 

PGM
     DCL VAR(&JRNNAME) TYPE(*CHAR) LEN(10)
     DCL VAR(&JRNLIB) TYPE(*CHAR) LEN(10)
     DCL VAR(&RTNLIB) TYPE(*CHAR) LEN(10)   /*STR  LEN*/
     DCL VAR(&ASP   ) TYPE(*DEC ) LEN(3 0)  /* 33    4*/
     DCL VAR(&MSGQ  ) TYPE(*CHAR) LEN(10)   /* 37   10*/
     DCL VAR(&MSGQLIB) TYPE(*CHAR) LEN(10)  /* 47   10*/
     DCL VAR(&MNGRCV ) TYPE(*CHAR) LEN(10)  /* 57    1*/
     DCL VAR(&DLTRCV ) TYPE(*CHAR) LEN( 4)  /* 58    1*/
     DCL VAR(&MNGRCVDLY) TYPE(*DEC) LEN(7 0) /* 257  4*/
     DCL VAR(&DLTRCVDLY) TYPE(*DEC) LEN(7 0) /* 261  4*/
     DCL VAR(&JRNTYP   ) TYPE(*CHAR) LEN(10)/* 66    1*/
     DCL VAR(&JRNSTS   ) TYPE(*CHAR) LEN(10)/* 68    1*/
     DCL VAR(&JRNDLVMODE) TYPE(*CHAR) LEN(10)/* 69    1*/
     DCL VAR(&RCVSIZMFIX) TYPE(*CHAR) LEN( 4)/* 60    1*/
     DCL VAR(&RCVSIZRMVI) TYPE(*CHAR) LEN( 4)/* 59    1*/
     DCL VAR(&RCVSIZOPT1) TYPE(*CHAR) LEN( 4)/* 61    1*/
     DCL VAR(&RCVSIZOPT2) TYPE(*CHAR) LEN( 4)/* 62    1*/
     DCL VAR(&RCVSIZOPT3) TYPE(*CHAR) LEN( 4)/* 63    1*/
     DCL VAR(&NBRRCV    ) TYPE(*DEC ) LEN(5 0)/* 197    4*/
     DCL VAR(&ATCJRNRCV ) TYPE(*CHAR) LEN(10)/* 201   10*/
     DCL VAR(&ATCJRNRCVL) TYPE(*CHAR) LEN(10)/* 211   10*/
     DCL VAR(&JRNCACHE  ) TYPE(*CHAR) LEN( 4)/* 196    1*/
     DCL VAR(&RMTJRNTYP ) TYPE(*CHAR) LEN(10)/*  67    1*/
     DCL VAR(&JRNOBJ    ) TYPE(*DEC ) LEN(15 0)/* 309  4*/
     DCL VAR(&JRNOBJLMT ) TYPE(*CHAR) LEN(1)   /* 308  1*/
     DCL VAR(&MINJRNENTD) TYPE(*CHAR) LEN(1)   /* 186  1*/
     DCL VAR(&MINJRNENTF) TYPE(*CHAR) LEN(1)   /* 187  1*/
     DCL VAR(&JRNRCVCNT ) TYPE(*DEC ) LEN(11 0)   /* 341  4*/
     DCL VAR(&TEXT      ) TYPE(*CHAR) LEN(50)  /* 136 50*/

             RTVJRNA    JRN(QAUDJRN) RTNLIB(&RTNLIB) ASP(&ASP) +
                          MSGQ(&MSGQ) MSGQLIB(&MSGQLIB) +
                          MNGRCV(&MNGRCV) DLTRCV(&DLTRCV) +
                          MNGRCVDLY(&MNGRCVDLY) +
                          DLTRCVDLY(&DLTRCVDLY) JRNTYP(&JRNTYP) +
                          JRNSTS(&JRNSTS) JRNDLVMODE(&JRNDLVMODE) +
                          RCVSIZMFIX(&RCVSIZMFIX) +
                          RCVSIZRMVI(&RCVSIZRMVI) +
                          RCVSIZOPT1(&RCVSIZOPT1) +
                          RCVSIZOPT2(&RCVSIZOPT2) +
                          RCVSIZOPT3(&RCVSIZOPT3) NBRRCV(&NBRRCV) +
                          ACTJRNRCV(&ATCJRNRCV) +
                          ACTJRNRCVL(&ATCJRNRCVL) +
                          JRNCACHE(&JRNCACHE) RMTJRNTYP(&RMTJRNTYP) +
                          JRNOBJ(&JRNOBJ) JRNOBJLMT(&JRNOBJLMT) +
                          MINJRNENTD(&MINJRNENTD) +
                          MINJRNENTF(&MINJRNENTF) +
                          JRNRCVCNT(&JRNRCVCNT) TEXT(&TEXT)

   DMPCLPGM

ENDPGM


                        




2008-03-28 如何取得 Journal Receiver 的屬性?(Command RTVJRNRCVA with API QjoRtvJrnReceiverInformation)


如何取得 Journal Receiver 的屬性?(Command RTVJRNRCVA with API QjoRtvJrnReceiverInformation)

如何取得 Journal Receiver 的屬性?(Command RTVJRNRCVA with API QjoRtvJrnReceiverInformation)


File   : QCLSRC
Member : RTVJRNRCVA
Type   : CLLE
Usage  : CRTBNDCL PGM(RTVJRNRCVA)


/*  ===============================================================  */
/*  = Command RtvJrnRcvA CPP                                      =  */
/*  =   RtvJrnRcvA CLLE                                           =  */
/*  ===============================================================  */
/*  = Date  : 2008/03/14                                          =  */
/*  = Author: Vengoal Chang                                       =  */
/*  ===============================================================  */

PGM PARM(&QUALRCVR &RTNLIB &STATUS &ASP &THRESHOLD &SIZE &NBRENTP +
         &MAXNULIND &MAXENTLEN &MAXENTLENP &RCVMAXOPT +
         &FSTSEQNBRP &LSTSEQNBRP &ACTDATTIM &DACTDATTIM &SAVDATTIM +
         &JRNNAME &JRNLIB &TEXT)

             DCL        VAR(&QUALRCVR) TYPE(*CHAR) LEN(20)
             DCL        VAR(&RCVRNAME) TYPE(*CHAR) LEN(10)
             DCL        VAR(&RCVRLIB) TYPE(*CHAR) LEN(10)
             DCL        VAR(&RTNLIB ) TYPE(*CHAR) LEN(10)
             DCL        VAR(&JRNNAME) TYPE(*CHAR) LEN(10)
             DCL        VAR(&JRNLIB) TYPE(*CHAR) LEN(10)
             DCL        VAR(&THRESHOLD) TYPE(*DEC) LEN( 7 0)
             DCL        VAR(&SIZE)      TYPE(*DEC) LEN( 7 0)
             DCL        VAR(&ASP )      TYPE(*DEC) LEN(3 0)
             DCL        VAR(&NBRENT   ) TYPE(*DEC) LEN(10 0)
             DCL        VAR(&NBRENTP  ) TYPE(*DEC) LEN(15 0)
             DCL        VAR(&NBRENT2  ) TYPE(*CHAR) LEN(20)
             DCL        VAR(&MAXENTLEN) TYPE(*DEC) LEN( 7 0)
             DCL        VAR(&MAXENTLENP) TYPE(*DEC) LEN(15 0)
             DCL        VAR(&MAXENTLEN2) TYPE(*CHAR) LEN(20)
             DCL        VAR(&MAXNULIND) TYPE(*DEC) LEN(15 0)
             DCL        VAR(&MINDTAARA) TYPE(*CHAR) LEN(1)
             DCL        VAR(&MINDTAFLE) TYPE(*CHAR) LEN(1)
             DCL        VAR(&RCVMAXOPT) TYPE(*CHAR) LEN(1)
             DCL        VAR(&FSTSEQNBR) TYPE(*DEC) LEN(15 0)
             DCL        VAR(&LSTSEQNBR) TYPE(*DEC) LEN(15 0)
             DCL        VAR(&FSTSEQNBRP) TYPE(*DEC) LEN(15 0)
             DCL        VAR(&FSTSEQNBRL) TYPE(*CHAR) LEN(20)
             DCL        VAR(&LSTSEQNBRP) TYPE(*DEC) LEN(15 0)
             DCL        VAR(&LSTSEQNBRL) TYPE(*CHAR) LEN(20)

             DCL        VAR(&STATUS) TYPE(*CHAR) LEN(1)
         /*   1  *ATTACHED   Currently attached                     */
         /*   2  *ONLINE     On line, detached, but not saved       */
         /*   3  *SAVED      On line, detached, and saved           */
         /*   4  *FREED      On line, detached, saved and stg freed */
         /*   5  *PARTIAL    See note                               */
         /*   6  *EMPTY      Never attached                         */

             DCL        VAR(&ACTDATTIM) TYPE(*CHAR) LEN(13)
                        /* CYYMMDDHHMMSS */
             DCL        VAR(&DACTDATTIM) TYPE(*CHAR) LEN(13)
             DCL        VAR(&SAVDATTIM) TYPE(*CHAR) LEN(13)
             DCL        VAR(&TEXT) TYPE(*CHAR) LEN(50)

             DCL        VAR(&RCV) TYPE(*CHAR) LEN(512)
             DCL        VAR(&RCVLEN) TYPE(*CHAR) LEN(4)
             DCL        VAR(&JRNRCV) TYPE(*CHAR) LEN(20)
             DCL        VAR(&FSTSEQNBRC) TYPE(*CHAR) LEN(20)
             DCL        VAR(&LSTSEQNBRC) TYPE(*CHAR) LEN(20)
             DCL        VAR(&RCVRINFO) TYPE(*CHAR) LEN(20)
             DCL        VAR(&WORK) TYPE(*CHAR) LEN(4)

             DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)
             DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(256)
             DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)
             DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
             DCL        VAR(&MSGTXT) TYPE(*CHAR) LEN(256)

          MONMSG     MSGID(CPF0000 MCH0000) EXEC(GOTO CMDLBL(ERROR))

             CHGVAR     VAR(&RCVRNAME) VALUE(%SST(&QUALRCVR  1 10))
             CHGVAR     VAR(&RCVRLIB ) VALUE(%SST(&QUALRCVR 11 10))
             CHKOBJ     OBJ(&RCVRLIB/&RCVRNAME) OBJTYPE(*JRNRCV)
             If         (&RCVRLIB *EQ '*LIBL') Do
             RTVOBJD    OBJ(&RCVRLIB/&RCVRNAME) OBJTYPE(&JRNRCV) +
                          RTNLIB(&RTNLIB)
             MONMSG     MCH3601
             EndDo
             Else Do
             CHGVAR     VAR(&RTNLIB) VALUE(&RCVRLIB)
             MONMSG     MCH3601
             EndDo

             CHGVAR     VAR(%BIN(&RCVLEN)) VALUE(512)
             CHGVAR     VAR(&JRNRCV) VALUE(&RCVRNAME *CAT &RCVRLIB)
             CALLPRC PRC('QjoRtvJrnReceiverInformation') +
                        PARM((&RCV) (&RCVLEN) (&JRNRCV) +
                        ('RRCV0100') (*OMIT))
             CHGVAR     VAR(&JRNNAME) VALUE(%SST(&RCV 29 10))
             MONMSG     MCH3601
             CHGVAR     VAR(&JRNLIB) VALUE(%SST(&RCV 39 10))
             MONMSG     MCH3601
             CHGVAR     VAR(&WORK) VALUE(%SST(&RCV 49 4))
             CHGVAR     VAR(&THRESHOLD) VALUE(%BIN(&WORK))
             MONMSG     MCH3601
             CHGVAR     VAR(&WORK) VALUE(%SST(&RCV 53 4))
             CHGVAR     VAR(&SIZE) VALUE(%BIN(&WORK))
             MONMSG     MCH3601
             CHGVAR     VAR(&WORK) VALUE(%SST(&RCV 57 4))
             CHGVAR     VAR(&ASP) VALUE(%BIN(&WORK))
             MONMSG     MCH3601
             CHGVAR     VAR(&WORK) VALUE(%SST(&RCV 61 4))
             CHGVAR     VAR(&NBRENT) VALUE(%BIN(&WORK))
             MONMSG     MCH3601
             CHGVAR     VAR(&WORK) VALUE(%SST(&RCV 65 4))
             CHGVAR     VAR(&MAXENTLEN) VALUE(%BIN(&WORK))
             MONMSG     MCH3601
             CHGVAR     VAR(&WORK) VALUE(%SST(&RCV 69 4))
             CHGVAR     VAR(&MAXNULIND) VALUE(%BIN(&WORK))
             MONMSG     MCH3601
             CHGVAR     VAR(&WORK) VALUE(%SST(&RCV 73 4))
             CHGVAR     VAR(&FSTSEQNBR) VALUE(%BIN(&WORK))
             CHGVAR     VAR(&MINDTAARA) VALUE(%SST(&RCV 77 1))
             CHGVAR     VAR(&MINDTAFLE) VALUE(%SST(&RCV 78 1))
             CHGVAR     VAR(&WORK) VALUE(%SST(&RCV 81 4))
             CHGVAR     VAR(&LSTSEQNBR) VALUE(%BIN(&WORK))
             CHGVAR     VAR(&STATUS) VALUE(%SST(&RCV 89 1))
             MONMSG     MCH3601
             CHGVAR     VAR(&RCVMAXOPT) VALUE(%SST(&RCV 89 1))
             MONMSG     MCH3601
             CHGVAR     VAR(&ACTDATTIM) VALUE(%SST(&RCV 96 13))
             MONMSG     MCH3601
             CHGVAR     VAR(&DACTDATTIM) VALUE(%SST(&RCV 109 13))
             MONMSG     MCH3601
             CHGVAR     VAR(&SAVDATTIM) VALUE(%SST(&RCV 122 13))
             MONMSG     MCH3601
             CHGVAR     VAR(&NBRENT2) VALUE(%SST(&RCV 373 20))
             CHGVAR     VAR(&NBRENTP) VALUE(&NBRENT2)
             MONMSG     MCH3601
             CHGVAR     VAR(&MAXENTLEN2) VALUE(%SST(&RCV 393 20))
             CHGVAR     VAR(&MAXENTLENP) VALUE(&MAXENTLEN2)
             MONMSG     MCH3601
             CHGVAR     VAR(&FSTSEQNBRL) VALUE(%SST(&RCV 413 20))
             CHGVAR     VAR(&FSTSEQNBRP) VALUE(&FSTSEQNBRL)
             MONMSG     MCH3601
             CHGVAR     VAR(&LSTSEQNBRL) VALUE(%SST(&RCV 433 20))
             CHGVAR     VAR(&LSTSEQNBRP) VALUE(&LSTSEQNBRL)
             MONMSG     MCH3601
             CHGVAR     VAR(&TEXT) VALUE(%SST(&RCV 135 50))
             MONMSG     MCH3601

             Return

/*  ===============================================================  */
/*  = Error routine                                               =  */
/*  ===============================================================  */

Error:

  RcvMsg     MsgType( *Excp )                                         +
             MsgDta( &MsgDta )                                        +
             MsgID( &MsgID )                                          +
             MsgF( &MsgF )                                            +
             MsgFLib( &MsgFLib )
  MonMsg     ( CPF0000 MCH0000 )

SndMsg:

  SndPgmMsg  MsgID( &MsgID )                                          +
             MsgF( &MsgFLib/&MsgF )                                   +
             MsgDta( &MsgDta )                                        +
             MsgType( *Escape )
  MonMsg     ( CPF0000 MCH0000 )

/*  ===============================================================  */
/*  = End of program                                              =  */
/*  ===============================================================  */

ENDPGM



File   : QCMDSRC
Member : RTVJRNRCVA
Type   : CMD
Usage  : CRTCMD CMD(your-lib/RTVJRNRCVA) PGM(your-lib/RTVJRNRCVA) ALLOW(*IPGM *BPGM) 

/*  ===============================================================  */
/*  = Command....... RtvJrnrcvA                                   =  */
/*  = CPP........... RtvJrnRcvA CLLE                              =  */
/*  = Description... Retrieve journal receiver attributes         =  */
/*  =                                                             =  */
/*  = CrtCmd      Cmd( RtvJrnrcvA )                               =  */
/*  =             Pgm( RtvJrnrcvA )                               =  */
/*  =             SrcFile( YourSourceFile )                       =  */
/*  =             Allow(*Ipgm *Bpgm)                              =  */
/*  ===============================================================  */
/*  = Date  : 2008/03/14                                          =  */
/*  = Author: Vengoal Chang                                       =  */
/*  ===============================================================  */
/*  = Parameter     Description                                   =  */
/*  =   JRNRCV      The qualified name of the journal receiver to =  */
/*  =               be retrieved.                                 =  */
/*  =   RTNLIB      The library containing the journal receiver.  =  */
/*  =   STATUS      The status of the journal receiver. One of the=  */
/*  =               following values will be returned:            =  */
/*  =               *ATTACHED   Currently attached                =  */
/*  =               *ONLINE     On line, detached, but not saved  =  */
/*  =               *SAVED      On line, detached, and saved      =  */
/*  =               *FREED      On line, detached, saved and stg  =  */
/*  =                           freed.                            =  */
/*  =               *PARTIAL    See API detail                    =  */
/*  =                           QjoRetrieveJournalInformation     =  */
/*  =               *EMPTY      Never attached                    =  */
/*  =   ASP         The Auxiliary Storage pool containing the     =  */
/*  =               journal.                                      =  */
/*  =   THRESHOLD   The value of the THRESHOLD parameter specified=  */
/*  =               on CRTJRNRCV                                  =  */
/*  =   SIZE        The size of the journal receiver.specified    =  */
/*  =               The value is in KB.                           =  */
/*  =   NBRENT      The number of entries in the journal receiver.=  */
/*  =   MAXNULLIND  The maximum number of null value indicators   =  */
/*  =               among all journal entries in this journal     =  */
/*  =               receiver.                                     =  */
/*  =   MAXENTLEN   The maximum length of the entry specific data =  */
/*  =               for any journal entry, If the value exceeds   =  */
/*  =               99999, zero willbe returned.(use MAXENTLEN2). =  */
/*  =   MAXENTLEN2  The maximum length of the entry specific data =  */
/*  =               for any journal entry                         =  */
/*  =   RCVMAXOPT   Indicates the journal receiver sequence number=  */
/*  =               and size options.                             =  */
/*  =               Blank means the journal receiver has not yet  =  */
/*  =               been attached. A description of the codes can =  */
/*  =               be found in QjoRtvJrnReceiverInformation API. =  */
/*  =   FSTSEQNBR   The first journal sequence number in the      =  */
/*  =               receiver.                                     =  */
/*  =   LSTSEQNBR   The last journal sequence number in the       =  */
/*  =               receiver.                                     =  */
/*  =   ATCDATTIM   The date the journal receiver was attached in =  */
/*  =               the format CYYMMDDHHMMSS                      =  */
/*  =   DATCDATTIM  The date the journal receiver was detached in =  */
/*  =               the format CYYMMDDHHMMSS                      =  */
/*  =   SAVDATTIM   The date the journal receiver was saved    in =  */
/*  =               the format CYYMMDDHHMMSS                      =  */
/*  =   JRN         The journal the receiver is or was attached to=  */
/*  =               If never attached, the value will be blank.   =  */
/*  =   JRNLIB      The library of the journal the receiver is or =  */
/*  =               was attached to. If never attached, the value =  */
/*  =               will be blank.                                =  */
/*  =   TEXT        The text description of the journal receiver. =  */
/*  ===============================================================  */
             CMD        PROMPT('Retrieve Journal Receiver Atr')

             PARM       KWD(JRNRCV) TYPE(QUAL) MIN(1) +
                          PROMPT('Journal receiver')

             PARM       KWD(RTNLIB) TYPE(*CHAR) LEN(10) RTNVAL(*YES) +
                          PROMPT('CL var for RTNLIB       (10)')
             PARM       KWD(STATUS) TYPE(*CHAR) LEN(1) RTNVAL(*YES) +
                          PROMPT('CL var for STATUS       ( 1)')
             PARM       KWD(ASP) TYPE(*DEC) LEN(3 0) RTNVAL(*YES) +
                          PROMPT('CL var for ASP         (3 0)')
             PARM       KWD(THRESHOLD) TYPE(*DEC) LEN(7 0) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          THRESHOLD   (7 0)')
             PARM       KWD(SIZE) TYPE(*DEC) LEN(7 0) RTNVAL(*YES) +
                          PROMPT('CL var for SIZE        (7 0)')
             PARM       KWD(NBRENT) TYPE(*DEC) LEN(15 0) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          NBRENT     (15 0)')
             PARM       KWD(MAXNULLIND) TYPE(*DEC) LEN(15 0) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          MAXNULLIND (15 0)')
             PARM       KWD(MAXENTLEN) TYPE(*DEC) LEN( 7 0) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          MAXENTLEN  (15 0)')
             PARM       KWD(MAXENTLEN2) TYPE(*DEC) LEN(15 0) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          MAXENTLEN2 (15 0)')
             PARM       KWD(RCVMAXOPT ) TYPE(*CHAR) LEN(1) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          RCVMAXOPT     (1)')
             PARM       KWD(FSTSEQNBR) TYPE(*DEC) LEN(15 0) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          FSTSEQNBR  (15 0)')
             PARM       KWD(LSTSEQNBR) TYPE(*DEC) LEN(15 0) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          LSTSEQNBR  (15 0)')
             PARM       KWD(ACTDATTIM) TYPE(*CHAR) LEN(13) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          ACTDATTIM    (13)')
             PARM       KWD(DACTDATTIM) TYPE(*CHAR) LEN(13) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          DACTDATTIM   (13)')
             PARM       KWD(SAVDATTIM) TYPE(*CHAR) LEN(13) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          SAVDATTIM    (13)')
             PARM       KWD(JRN) TYPE(*CHAR) LEN(10) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          JRN          (10)')
             PARM       KWD(JRNLIB) TYPE(*CHAR) LEN(10) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          JRNLIB       (10)')
             PARM       KWD(TEXT) TYPE(*CHAR) LEN(50) +
                          RTNVAL(*YES) PROMPT('CL var for +
                          TEXT         (50)')


 QUAL:       QUAL       TYPE(*NAME) LEN(10) SPCVAL((*ALL)) EXPR(*YES)
             QUAL       TYPE(*NAME) LEN(10) DFT(*LIBL) +
                          SPCVAL((*LIBL) (*CURLIB)) EXPR(*YES) +
                          PROMPT('Library')



File   : QCLSRC
Member : RTVJRNRCVT
Type   : CLP
Usage  : 測試程式 
         CRTCLPGM RTVJRNRCVT
         CALL RTVJRNRCVT 

PGM
     DCL &FSTSEQNBR *DEC 15 0
     DCL &LSTSEQNBR *DEC 15 0
     DCL &RTNLIB    *CHAR 10
     DCL &STATUS    *CHAR 1
     DCL &ASP       *DEC  3 0
     DCL &THRESHOLD *DEC  7 0
     DCL &SIZE      *DEC  7 0
     DCL &NBRENT    *DEC 15 0
     DCL &MAXENTLEN *DEC 7 0
     DCL &MAXENTLEN2 *DEC 15 0
     DCL &MAXNULIND  *DEC 15 0
     DCL &RCVMAXOPT  *CHAR 50
     DCL &ACTDATTIM  *CHAR 13
     DCL &DACTDATTIM  *CHAR 13
     DCL &SAVDATTIM  *CHAR 13
     DCL &JRN        *CHAR 10
     DCL &JRNLIB     *CHAR 10
     DCL &TEXT       *CHAR 50
     DCL &RCVRNAME *CHAR 10    'AUDRCV0075'
     DCL &RCVRLIB  *CHAR 10    'PMEDHJRN'
  /* DCL &RCVRLIB  *CHAR 10    '*LIBL'      */
             RTVJRNRCVA JRNRCV(&RCVRLIB/&RCVRNAME) RTNLIB(&RTNLIB) +
                          STATUS(&STATUS) ASP(&ASP) +
                          THRESHOLD(&THRESHOLD) SIZE(&SIZE) +
                          NBRENT(&NBRENT) MAXNULLIND(&MAXNULIND) +
                          MAXENTLEN(&MAXENTLEN) +
                          MAXENTLEN2(&MAXENTLEN2) +
                          RCVMAXOPT(&RCVMAXOPT) +
                          FSTSEQNBR(&FSTSEQNBR) +
                          LSTSEQNBR(&LSTSEQNBR) +
                          ACTDATTIM(&ACTDATTIM) +
                          DACTDATTIM(&DACTDATTIM) +
                          SAVDATTIM(&SAVDATTIM) JRN(&JRN) +
                          JRNLIB(&JRNLIB) TEXT(&TEXT)
     DMPCLPGM


ENDPGM