如何於 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
A blog about IBM i (AS/400), MQ and other things developers or Admins need to know.
星期三, 11月 08, 2023
2012-06-06 如何於 AS400 系統中因應個資法,紀錄使用者何時取得機密敏感的資訊?
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
訂閱:
文章 (Atom)