Retrieve Last Spooled file ID with API QSPRILSP
擷取 Job 最後產生的報表資訊 API QSPRILSP
pgm
dcl &SplfNbr1 *int 4
dcl &SplfNbr2 *int 4
dcl &RcvVar *char 70
dcl &BytesAvail *int 4 stg(*defined) defvar(&RcvVar 1)
dcl &BytesRtn *int 4 stg(*defined) defvar(&RcvVar 5)
dcl &SplfName *char 10 stg(*defined) defvar(&RcvVar 9)
dcl &JobName *char 10 stg(*defined) defvar(&RcvVar 19)
dcl &UserName *char 10 stg(*defined) defvar(&RcvVar 29)
dcl &JobNbr *char 6 stg(*defined) defvar(&RcvVar 39)
dcl &SplfNbr *int 4 stg(*defined) defvar(&RcvVar 45)
dcl &SysName *char 8 stg(*defined) defvar(&RcvVar 49)
dcl &SplfCrtDat *char 7 stg(*defined) defvar(&RcvVar 57)
dcl &SplfCrtTim *char 6 stg(*defined) defvar(&RcvVar 65)
dcl &RcvVarLen *int 4 value(70)
dcl &FmtName *char 10
dcl &ErrorCode *char 8
dcl &Stat *lgl
dcl &SplfExists *lgl
callsubr subr(RtvSplfNbr) rtnval(&SplfNbr1)
call pgm1
callsubr subr(RtvSplfNbr) rtnval(&SplfNbr2)
/* If pgm1 created a report, continue with other tasks. */
if (&SplfNbr2 *ne &SplfNbr1) do
call pgm2
call pgm3
call pgm4
enddo
return
subr subr(RtvSplfNbr)
chgvar &BytesAvail 70
chgvar &FmtName 'SPRL0100'
chgvar &ErrorCode x'0000000000000000'
chgvar &SplfExists '1'
call QSPRILSP (&RcvVar &RcvVarLen &FmtName &ErrorCode)
monmsg cpf333a exec(chgvar &SplfExists '0')
if (&SplfExists) then
else do
chgvar &SplfNbr 0
enddo
endsubr rtnval(&SplfNbr)
endpgm
Copy from https://www.itjungle.com/2006/02/08/fhg020806-story01/
A blog about IBM i (AS/400), MQ and other things developers or Admins need to know.
星期一, 11月 13, 2023
2023-11-13 Retrieve Current job last spooled file ID with API QSPRILSP
星期四, 11月 09, 2023
2018-12-03 Check Daily Batch Jobs started or not
Check Daily Batch Jobs started or not
CHKBCHJOB CLP read file CHKBCHJOBP and check current time >= start time and current time < end time and chkflg ='Y',
then call API get the job active information, If job does not active, then send the job not acticve message to sysopr.
If job active, but status is MSGW, also send message to sysopr.
File : QDDSSRC
Member: CHKBCHJOBP
Type : PF
Usage : CrtPF File(CHKBCHJOBP)
A*****************************************************************
A* FUNCTION : CHKBCHJOB monitor batch job file
A* FILE : CHKBCHJOBP
A* AUTHOR : Vengoal Chang
A* DATE : 2018/12/03
A*****************************************************************
A UNIQUE
A R BCHJOBR TEXT('Batch job record')
A JOBNAME 10A COLHDG(' JOB NAME')
A JOBUSER 10A COLHDG(' USER')
A STRTIME 6S 0 COLHDG('start time')
A ENDTIME 6S 0 COLHDG('end time')
A CHKFLAG 1A COLHDG('check Y/N')
A NOTE 32O COLHDG('note')
A UPDDATE 8S 0 COLHDG('update date')
A UPDTIME 6S 0 COLHDG('update time')
A*----------------------------------------------------------------
A K JOBNAME
File : QCLSRC
Member: CHKBCHJOBC
Type : CLP
OS400 : V5R4 above
Usage : CrtClPgm Pgm(ChkBCHJOBC)
/* =============================================================== */
/* = Program ChkBchJobC = */
/* = ChkBchJob CLP = */
/* = Paramater notes: = */
/* = Read CHKBCHJOBP file to check daily job active or not = */
/* =============================================================== */
/* = Date : 2018/12/03 = */
/* = Author: Vengoal Chang = */
/* =============================================================== */
PGM
DCL &CURTIMEC *CHAR 6
DCL &STRTIMEC *CHAR 6
DCL &ENDTIMEC *CHAR 6
DCL &CURTIME *DEC (6 0)
DCL &MSGTEXT *CHAR 256
DCL &USP_NAME *CHAR 10
DCL &USP_LIB *CHAR 10
DCL &USP_QUAL *CHAR 20
DCL &USP_TYPE *CHAR 10
DCL &USP_SIZE *CHAR 4
DCL &USP_FILL *CHAR 1
DCL &USP_AUT *CHAR 10
DCL &USP_TEXT *CHAR 50
DCL &API_USQUAL *CHAR 20
DCL &API_JBQUAL *CHAR 26
DCL &API_JBNAM *CHAR 10
DCL &API_USER *CHAR 10
DCL &API_JOBNR *CHAR 6
DCL &API_STATUS *CHAR 10
DCL &STARTPOS *CHAR 4
DCL &DATALEN *CHAR 4
DCL &HEADER *CHAR 150
DCL &LST_OFFSET *DEC (10 0)
DCL &LST_SIZE *DEC (10 0)
DCL &LST_DATA *CHAR 4096
DCL &LST_NBR *DEC (5 0)
DCL &LST_LEN *DEC (5 0)
DCL &LST_LENBIN *CHAR 4
DCL &LST_POSBIN *CHAR 4
DCL &LST_COUNT *DEC (5 0) VALUE(0)
DCL &EXC_COUNT *DEC (5 0) VALUE(0)
DCL &TYPE *CHAR 1 VALUE('*')
DCL &NBRTORTN *CHAR 4
DCL &KEYSTORTN *CHAR 16
DCL &KEY1 *CHAR 4
DCL &KEY2 *CHAR 4
DCL &KEY3 *CHAR 4
DCL &KEY4 *CHAR 4
DCL &SBSSYS *CHAR 20
DCL &WRKSTS *CHAR 4
DCL &MSGRPLY *CHAR 1
DCL &USER *CHAR 10
DCL &CURUSR *CHAR 10
DCL &JOBNBR *CHAR 6
DCL &STATUS *CHAR 10
DCL &JOBTYPE *CHAR 1
DCL &SUBTYPE *CHAR 1
DCLF CHKBCHJOBP
MONMSG (CPF0000 MCH0000) *NONE GOTO ERROR
READF:
RCVF
MONMSG CPF0864 *N GOTO ENDF
RTVSYSVAL SYSVAL(QTIME) RTNVAR(&CURTIMEC)
CHGVAR &CURTIME &CURTIMEC
IF (&CURTIME >= &STRTIME *AND +
&CURTIME < &ENDTIME *AND +
&CHKFLAG = 'Y') Do
CallSubR SubR(ListJob)
If (&LST_NBR *EQ 0) Do
CHGVAR &STRTIMEC &STRTIME
CHGVAR &ENDTIMEC &ENDTIME
CHGVAR &MSGTEXT +
('* Bctch Job=' *CAT +
&JOBNAME *CAT 'run time : ' *CAT +
&STRTIMEC *BCAT '~' *BCAT &ENDTIMEC *CAT +
', program not started !')
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) +
MSGDTA(&MSGTEXT) TOMSGQ(*SYSOPR)
EndDo
EndDo
Goto READF
ENDF:
Return
Error:
Call QMHMOVPM ( ' ' +
'*DIAG' +
x'00000001' +
'*PGMBDY' +
x'00000001' +
x'0000000800000000' +
)
Call QMHRSNEM ( ' ' +
x'0000000800000000' +
)
/****************************************************************/
/* Sub routine ListJob */
/****************************************************************/
SUBR SUBR(ListJob)
CHGVAR VAR(%BIN(&NBRTORTN)) VALUE(4)
/* 0101 -- Ststus as WRKACTJOB */
CHGVAR VAR(%BIN(&KEY1 )) VALUE(0101)
/* 1906 -- Subsystem */
CHGVAR VAR(%BIN(&KEY2 )) VALUE(1906)
/* 1307 -- Message Reply */
CHGVAR VAR(%BIN(&KEY3 )) VALUE(1307)
/* 0305 -- Current user profile */
CHGVAR VAR(%BIN(&KEY4 )) VALUE(0305)
CHGVAR VAR(&KEYSTORTN) VALUE(&KEY1 *CAT &KEY2 *CAT +
&KEY3 *CAT &KEY4)
CHGVAR VAR(&USP_NAME) VALUE('CHKJOBNAME')
CHGVAR VAR(&USP_LIB) VALUE('QTEMP')
CHGVAR VAR(&USP_QUAL) VALUE(&USP_NAME *CAT +
&USP_LIB)
CHGVAR VAR(&USP_TYPE) VALUE('MYTYPE')
CHGVAR VAR(%BIN(&USP_SIZE)) VALUE(128000)
CHGVAR VAR(&USP_FILL) VALUE(' ')
CHGVAR VAR(&USP_AUT) VALUE('*USE')
CHGVAR VAR(&USP_TEXT) VALUE('my user space')
DLTUSRSPC USRSPC(&USP_LIB/&USP_NAME)
MONMSG CPF0000
CALL PGM(QUSCRTUS) PARM(&USP_QUAL &USP_TYPE +
&USP_SIZE &USP_FILL &USP_AUT &USP_TEXT)
CHGVAR VAR(&API_USQUAL) VALUE(&USP_QUAL)
CHGVAR VAR(&API_JBNAM) VALUE(&JOBNAME)
CHGVAR VAR(&API_USER) VALUE('*ALL')
/* CHGVAR VAR(&API_USER) VALUE(&JOBUSER) */
CHGVAR VAR(&API_JOBNR) VALUE('*ALL')
CHGVAR VAR(&API_STATUS) VALUE('*ACTIVE')
CHGVAR VAR(&API_JBQUAL) VALUE(&API_JBNAM *CAT +
&API_USER *CAT &API_JOBNR)
CALL PGM(QUSLJOB) PARM(&API_USQUAL 'JOBL0200' +
&API_JBQUAL &API_STATUS X'00000000' +
&TYPE &NBRTORTN &KEYSTORTN)
CHGVAR VAR(%BIN(&STARTPOS)) VALUE(1)
CHGVAR VAR(%BIN(&DATALEN)) VALUE(140)
CALL PGM(QUSRTVUS) PARM(&API_USQUAL &STARTPOS +
&DATALEN &HEADER)
CHGVAR VAR(&LST_OFFSET) VALUE(%BIN(&HEADER 125 4))
CHGVAR VAR(&LST_SIZE) VALUE(%BIN(&HEADER 129 4))
CHGVAR VAR(&LST_NBR) VALUE(%BIN(&HEADER 133 4))
CHGVAR VAR(&LST_LEN) VALUE(%BIN(&HEADER 137 4))
CHGVAR VAR(%BIN(&LST_POSBIN)) VALUE(&LST_OFFSET + 1)
CHGVAR VAR(&LST_LENBIN) VALUE(%SST(&HEADER 137 4))
CHGVAR VAR(&LST_COUNT) VALUE(0)
IF (&LST_NBR *EQ 0) DO
/* Job not found */
Goto Lst_End
ENDDO
LST_LOOP: IF COND(&LST_COUNT *EQ &LST_NBR) THEN(GOTO +
CMDLBL(LST_END))
CALL PGM(QUSRTVUS) PARM(&API_USQUAL &LST_POSBIN +
&LST_LENBIN &LST_DATA)
CHGVAR VAR(&JOBNAME) VALUE(%SST(&LST_DATA 1 10))
CHGVAR VAR(&USER) VALUE(%SST(&LST_DATA 11 10))
CHGVAR VAR(&JOBNBR) VALUE(%SST(&LST_DATA 21 6))
CHGVAR VAR(&STATUS) VALUE(%SST(&LST_DATA 43 10))
CHGVAR VAR(&JOBTYPE) VALUE(%SST(&LST_DATA 53 1))
CHGVAR VAR(&SUBTYPE) VALUE(%SST(&LST_DATA 54 1))
/* for status */
CHGVAR VAR(&WRKSTS ) VALUE(%SST(&LST_DATA 81 4))
/* for subsystem */
CHGVAR VAR(&SBSSYS ) VALUE(%SST(&LST_DATA 101 20))
/* for msgrply */
CHGVAR VAR(&MSGRPLY) VALUE(%SST(&LST_DATA 137 1))
/* for current user */
CHGVAR VAR(&CURUSR ) VALUE(%SST(&LST_DATA 157 10))
IF (&WRKSTS *EQ 'MSGW' *AND &MSGRPLY *EQ '1') DO
CHGVAR &MSGTEXT ('* Job' *BCAT +
&JOBNBR *TCAT '/' *CAT +
&USER *TCAT '/' *CAT +
&JOBNAME *BCAT 'status is' *BCAT +
&WRKSTS *TCAT '.')
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) +
MSGDTA(&MSGTEXT) TOMSGQ(*SYSOPR)
EndDo
CHGVAR VAR(&LST_COUNT) VALUE(&LST_COUNT + 1)
CHGVAR VAR(%BIN(&LST_POSBIN)) +
VALUE(%BIN(&LST_POSBIN) + &LST_LEN)
GOTO CMDLBL(LST_LOOP)
LST_END:
DLTUSRSPC USRSPC(&USP_LIB/&USP_NAME)
ENDSUBR
EndPgm:
EndPgm
File : QCLSRC
Member: CHKBCHJOB
Type : CLP
Usage : CRTCLPGM CHKBCHJOB
Insert your batch job which need to be monitored to CHKBCHJOBP
SBMJOB CMD(CALL CHKBCHJOB) JOB(CHKBCHJOB)
PGM
/*-- Global error monitoring: --------------------------------------*/
MonMsg CPF0000 *N GoTo Error
Loop:
Call ChkBchJobC
DlyJob 300
Goto Loop
Return:
Return
/*-- Error handling: -----------------------------------------------*/
Error:
Call QMHMOVPM ( ' ' +
'*DIAG' +
x'00000001' +
'*PGMBDY' +
x'00000001' +
x'0000000800000000' +
)
Call QMHRSNEM ( ' ' +
x'0000000800000000' +
)
EndPgm:
EndPgm
2017-11-21 Check Message Queue Manager started or not
Check Message Queue Manager started or not
File : QCLSRC
Member: CHKMQM
Type : CLLE
Usage : CrtCLMod Module( ChkMqm )
CrtPgm Pgm( ChkMqm ) BndSrvPgm((QMQM/LIBMQM))
/*-------------------------------------------------------------------*/
/* */
/* Program . . : CHKMQM */
/* Description : Check MQM Status */
/* Author . . : Vengoal Chang */
/* Published . : AS400ePaper */
/* Date . . . : November 21, 2017 */
/* */
/* Program function: CHKMQM command processing program */
/* */
/* */
/* Programmer's notes: */
/* */
/* Compile options: */
/* CrtCLMod Module( ChkMqm ) */
/* CrtPgm Pgm( ChkMqm ) */
/* BndSrvPgm((QMQM/LIBMQM)) */
/*-------------------------------------------------------------------*/
/* */
/* Exceptions monitored : */
/* MQCONN MQRC_Q_MGR_STOPPING */
/* MQRC_Q_MGR_QUIESCING */
/* MQRC_Q_MGR_NOT_AVAILABLE */
/* MQRC_STORAGE_NOT_AVAILABLE */
/* */
/*-------------------------------------------------------------------*/
Pgm ( &MQMName &RCChar)
Dcl &MQMName *CHAR 48
Dcl &RCChar *Char 10
/* Define local variables */
Dcl &HCONN *CHAR 4 X'00000000'
Dcl &CCODE *CHAR 4 X'00000000'
Dcl &REASON *CHAR 4 X'00000000'
Dcl &NOTAVAIL *CHAR 4 X'0000080B'
Dcl &STOPPING *CHAR 4 X'00000872'
Dcl &QUIESCING *CHAR 4 X'00000871'
Dcl &NOSTORAGE *CHAR 4 X'00000817'
Dcl &UNKNOWN *CHAR 4 X'0000080A'
Dcl &MsgDta *Char 256
Dcl &Rc *Dec (10 0)
/*-- Global error monitoring: --------------------------------------*/
MonMsg (CPF0000 MCH3601) *N GoTo Error
AddLibLe QMQM
MonMsg CPF0000
/******************************************************/
/* Connect to queue manager */
/******************************************************/
CallPrc 'MQCONN' (&MQMName &Hconn &Ccode &Reason)
If (%bin(&Ccode) *ne 0) Do
/*************************************************/
/* MQCONN failed */
/*************************************************/
ChgVar &Rc %Bin(&Reason)
ChgVar &RcChar &Rc
Select
When (&Reason = &STOPPING) Do
ChgVar &MsgDta ('Qmgr' *bcat &MQMName *Bcat +
'stopping, RC =' *bcat &RcChar)
EndDo
When (&Reason = &NOTAVAIL) Do
ChgVar &MsgDta ('Qmgr' *bcat &MQMName *Bcat +
'not available, RC =' *bcat &RcChar)
EndDo
When (&Reason = &QUIESCING) Do
ChgVar &MsgDta ('Qmgr' *bcat &MQMName *Bcat +
'quiescing, RC =' *bcat &RcChar)
EndDo
When (&Reason = &NOSTORAGE) Do
ChgVar &MsgDta ('Qmgr' *bcat &MQMName *Bcat +
'nostorage, RC =' *bcat &RcChar)
EndDo
When (&Reason = &UNKNOWN) Do
ChgVar &MsgDta ('Qmgr' *bcat &MQMName *Bcat +
'unknown, RC =' *bcat &RcChar)
EndDo
Otherwise Do
ChgVar &MsgDta ('Qmgr' *bcat &MQMName *Bcat +
'conn error, RC =' *bcat &RcChar)
EndDo
EndSelect
SndPgmMsg MsgId(CPF9898) MsgF(QCPFMSG) +
MsgDta(&MsgDta) ToPgmQ(*Ext) MsgType(*Info)
Goto Return
ENDDO
ChgVar &MsgDta ('Qmgr' *bcat &MQMName *Bcat +
'started')
SndPgmMsg MsgId(CPF9898) MsgF(QCPFMSG) +
MsgDta(&MsgDta) ToPgmQ(*EXT) MsgType(*INFO)
/******************************************************/
/* MQCONN worked so disonnect */
/******************************************************/
CallPrc 'MQDISC' (&Hconn &Ccode &Reason)
Return:
Return
/*-- Error handling: -----------------------------------------------*/
Error:
Call QMHMOVPM ( ' ' +
'*DIAG' +
x'00000001' +
'*PGMBDY' +
x'00000001' +
x'0000000800000000' +
)
Call QMHRSNEM ( ' ' +
x'0000000800000000' +
)
EndPgm:
EndPgm
File : QCMDSRC
Member: CHKMQM
Type : CMD
Usage : CrtCmd Cmd( CHKMQM )
Pgm( CHKMQM )
SrcFile( QCMDSRC )
Allow( *IPGM *BPGM )
/*-------------------------------------------------------------------*/
/* */
/* Compile options: */
/* */
/* CrtCmd Cmd( CHKMQM ) */
/* Pgm( CHKMQM ) */
/* SrcMbr( CHKMQM ) */
/* Allow( *IPGM *BPGM ) */
/* */
/*-------------------------------------------------------------------*/
Cmd Prompt( 'Check MQ Queue Manager')
Parm Kwd(MQMNAME) Type(*CHAR) Len(48) Min(1) +
Prompt('Message Queue Manager name')
Parm Kwd(RC) Type(*CHAR) Len(10) +
RtnVal(*Yes) +
Prompt('Return code')
File : QCLSRC
Member: CHKMQMTSTC
Type : CLP
Usage : CRTCLPGM CHKMQMTSTC
PGM
DCL &MQMNAME *CHAR 48
DCL &RC *CHAR 10
/*-- Global error monitoring: --------------------------------------*/
MonMsg CPF0000 *N GoTo Error
CHGVAR &MQMNAME 'TEST'
CHKMQM MQMNAME(&MQMNAME) RC(&RC)
If (&RC *NE ' ') Do
DmpClPgm
/* MQM got Exception */
/* do exception process */
EndDo
CHGVAR &MQMNAME 'TEST1'
CHKMQM MQMNAME(&MQMNAME) RC(&RC)
If (&RC *NE ' ') Do
DmpClPgm
/* MQM got Exception */
/* do exception process */
EndDo
Return:
RCLACTGRP ACTGRP(*ELIGIBLE)
Return
/*-- Error handling: -----------------------------------------------*/
Error:
RCLACTGRP ACTGRP(*ELIGIBLE)
Call QMHMOVPM ( ' ' +
'*DIAG' +
x'00000001' +
'*PGMBDY' +
x'00000001' +
x'0000000800000000' +
)
Call QMHRSNEM ( ' ' +
x'0000000800000000' +
)
EndPgm:
EndPgm
2016-04-06 擷取系統時間至微秒單位(Get system timesatmp with a precision in microseconds by API QWCCVTDT)
擷取系統時間至微秒單位(Get system timesatmp with a precision in microseconds by API QWCCVTDT)
範例含 CLP, RPGLE, COBOL。
File : QCLSRC
Member: GETSYSTIMC
Type : CLP
Usage : CRTCLPGM PGM(GETSYSTIMC)
PGM
/* For Convert Date & Time... */
dcl &CDT_I_FORM *char 10 value( '*CURRENT' )
dcl &CDT_I_VAR *char 8
dcl &CDT_O_FORM *char 10 value( '*YYMD' )
dcl &CDT_O_VAR *char 20
dcl &CDT_I_TZ *char 10 value( '*SYS' )
dcl &CDT_O_TZ *char 10 value( '*SYS' )
dcl &CDT_O_TZi *char 111 value( ' ' )
dcl &CDT_O_TZl *int value( 0 )
dcl &CDT_O_Pi *char 1 value( '1' )
/* And we'll need to specify an errcode receiver at one point... */
dcl &ERRCODE *char 116 value( x'00000074' )
dcl &ERRLEN *int value( 0 )
call QWCCVTDT ( +
&CDT_I_FORM +
&CDT_I_VAR +
&CDT_O_FORM +
&CDT_O_VAR +
&ERRCODE +
&CDT_I_TZ +
&CDT_O_TZ +
&CDT_O_TZi +
&CDT_O_TZl +
&CDT_O_Pi +
)
SndPgmMsg MsgId(CPF9898) MsgF(*LIBL/QCPFMSG) +
MsgDta(&CDT_O_VAR)
Return
ENDPGM
File : QRPGLESRC
Member: GETSYSTIMR
Type : RPGLE
Usage : CRTBNDRPG PGM(GETSYSTIMR)
**-- API error data structure:
D ERRC0100 Ds Qualified
D BytPrv 10i 0 Inz( %Size( ERRC0100 ))
D BytAvl 10i 0
D MsgId 7a
D 1a
D MsgDta 128a
DOutputVar DS
D CurCentury 2
D CurYear 2
D CurMonth 2
D CurDay 2
D CurHour 2
D CurMinute 2
D CurSecond 2
D CurMicroSec 6
D TimeZoneInfL 10i 0
C Move *On *InLr
C Call 'QWCCVTDT'
C Parm '*CURRENT' InputFmt 10
C Parm InputVar 1
C Parm '*YYMD' OutputFmt 10
C Parm OutputVar
C Parm ERRC0100
C Parm InpTimeZone 10
C Parm '*SYS' OutTimeZone 10
C Parm TimeZineInf 1
C Parm 0 TimeZoneInfL
C Parm '1' PrcInd 1
C OutputVar dsply
File : QCBLLESRC
Member: GETSYSTIME
Type : COBOL
Usage : CRTCBLPGM PGM(GETSYSTIME)
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE07.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-AS400.
OBJECT-COMPUTER. IBM-AS400.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 DATES.
05 INPUT-DATE PIC X(10).
05 OUTPUT-DATE17 PIC X(17).
05 OUTPUT-DATE20 PIC X(20).
05 INPUT-DATE-FORMAT PIC X(10).
05 OUTPUT-DATE-FORMAT PIC X(10).
05 INPUT-TIME-ZONE PIC X(10) VALUE '*SYS'.
05 OUTPUT-TIME-ZONE PIC X(10) VALUE '*SYS'.
05 TIME-ZONE-INFO PIC X(10).
05 TIME-ZONE-INFO-LEN PIC S9(9) BINARY VALUE ZERO.
05 PRECISION-INDICATOR PIC X(01) VALUE '1'.
01 CURRENTTIME.
05 CUR-YEAR PIC X(04).
05 CUR-MONTH PIC X(02).
05 CUR-DAY PIC X(02).
05 CUR-HH PIC X(02).
05 CUR-MM PIC X(02).
05 CUR-SS PIC X(02).
05 CUR-MICROSECOND PIC X(06).
01 ERRPARM.
05 INPUT-L PIC S9(9) BINARY VALUE 116.
05 OUTPUT-L PIC S9(9) BINARY VALUE ZERO.
05 EXCEPTION-ID PIC X(7).
05 RESERVED PIC X(1).
05 EXCEPTION-DATA PIC X(100).
PROCEDURE DIVISION.
MAINLINE.
PERFORM GET-DATE-08
GOBACK.
GET-DATE-08.
MOVE SPACES TO EXCEPTION-ID.
MOVE "*CURRENT" TO INPUT-DATE-FORMAT.
MOVE "*YYMD " TO OUTPUT-DATE-FORMAT.
CALL "QWCCVTDT" USING INPUT-DATE-FORMAT ,
INPUT-DATE ,
OUTPUT-DATE-FORMAT,
CURRENTTIME ,
ERRPARM ,
INPUT-TIME-ZONE ,
OUTPUT-TIME-ZONE ,
TIME-ZONE-INFO ,
TIME-ZONE-INFO-LEN,
PRECISION-INDICATOR.
DISPLAY 'TIMESTAMP FROM COBOL: ' CURRENTTIME.
參照: Convert Date and Time Format (QWCCVTDT) API
星期三, 11月 08, 2023
2010-03-03 如何於 CLP 中將英文字轉換為大寫(uppercase)或小寫(lowercase)?(Command CVTCASE with Convert Case API QLGCNVCS)
如何於 CLP 中將英文字轉換為大寫(uppercase)或小寫(lowercase)?(Command CVTCASE with Convert Case API QLGCNVCS)
File : QCLSRC
Member: CVTCASE
Type : CLP
Usage : CRTCLPGM CVTCASE
/* =============================================================== */
/* = Command CvtCase CPP = */
/* = CvtCase CLP = */
/* = Paramater notes: = */
/* = VALUE : string to be converted = */
/* = TOVAR : CL var for converted data = */
/* = OPTION: convert option *UPPER or *LOWER = */
/* =============================================================== */
/* = Date : 2010/03/03 = */
/* = Author: Vengoal Chang = */
/* =============================================================== */
pgm (&InValue &OutToVar &InOption)
/*--------------------------------------------------------*/
/* declaration */
/*--------------------------------------------------------*/
dcl &InValue *char 4096
dcl &CvtText *char 4096
dcl &OutToVar *char 4096
dcl &OutValue *char 4096
dcl &InOption *char 6
dcl &InValueL *dec 5 0
dcl &OutToVarL *dec 5 0
dcl &LenC *char 2
dcl &ReqUpper *char 22
dcl &ReqLower *char 22
dcl &upper *lgl
dcl &CCSIDReq *char 4 x'00000001'
dcl &CCSIDInp *char 4 x'00000000'
dcl &Uppercase *char 4 x'00000000'
dcl &Lowercase *char 4 x'00000001'
dcl &Reserved *char 10 x'00000000000000000000'
/*----------------------------------------------*/
/* QLGCNVCS - Convert Case QlgConvertCase */
/*----------------------------------------------*/
dcl &DataLen *char 4 x'00000050'
dcl &ErrCde *char 4 x'00000000'
dcl &MsgId *char 7
dcl &MsgDta *char 256
dcl &Msgf *char 10
dcl &MsgfLib *char 10
dcl &MsgTxt *char 256
monmsg msgid(CPF0000 MCH0000) exec(goto Error)
/*--------------------------------------------------------*/
/* Setup Request Control Block */
/*--------------------------------------------------------*/
chgvar &ReqUpper (&CCSIDReq || +
&CCSIDInp || +
&Uppercase || +
&Reserved)
chgvar &ReqLower (&CCSIDReq || +
&CCSIDInp || +
&Lowercase || +
&Reserved)
chgvar &LenC %sst(&InValue 1 2)
chgvar &InValueL %bin(&LenC)
chgvar &LenC %sst(&OutToVar 1 2)
chgvar &OutToVarL %bin(&LenC)
chgvar %bin(&Datalen) &InValueL
If (&InValueL > &OutToVarL) +
chgvar %bin(&Datalen) &OutToVarL
chgvar &CvtText %sst(&InValue 3 &InValueL)
chgvar &OutValue ' '
/*----------------------------------------------*/
/* Convert to Upper */
/*----------------------------------------------*/
if (&InOption *EQ '*UPPER') do
Call Pgm(QLGCNVCS) +
parm(&ReqUpper +
&CvtText +
&OutValue +
&Datalen +
&ErrCde )
enddo
/*--------------------------------------------------------*/
/* Convert to lower case */
/*--------------------------------------------------------*/
else do
Call Pgm(QLGCNVCS) +
parm(&Reqlower +
&CvtText +
&OutValue +
&Datalen +
&ErrCde )
enddo
chgvar %sst(&OutToVar 3 &OutToVarL) &OutValue
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 : QMDSRC
Member: CVTCASE
Type : CMD
Usage : CRTCMD CMD(xxx/CvtCase)
PGM(*LIBL/CvtCase)
SRCFILE(xxx/QCMDSRC)
SRCMBR(CvtCase)
ALLOW(*BMOD *BPGM *IMOD *IPGM)
/* =============================================================== */
/* = Command....... CvtCase = */
/* = CPP........... CvtCaseC CLP = */
/* = Description... Convert string to upper or lower case = */
/* = = */
/* =============================================================== */
/* = To create: = */
/* = = */
/* = CRTCMD CMD(xxx/CvtCase) = */
/* = PGM(*LIBL/CvtCase) = */
/* = SRCFILE(xxx/QCMDSRC) = */
/* = SRCMBR(CvtCase) = */
/* = ALLOW(*BMOD *BPGM *IMOD *IPGM) = */
/* = = */
/* =============================================================== */
/* = Date : 2010/03/03 = */
/* = Author: Vengoal Chang = */
/* =============================================================== */
CMD PROMPT('Convert case to upper or lower')
PARM KWD(VALUE) TYPE(*CHAR) LEN(4096) MIN(1) +
EXPR(*YES) VARY(*YES *INT2) CASE(*MONO) +
PROMPT('Value')
PARM KWD(TOVAR) TYPE(*CHAR) LEN(1) RTNVAL(*YES) +
MIN(1) VARY(*YES *INT2) PROMPT('CL var +
for converted data')
PARM KWD(OPTION) TYPE(*CHAR) LEN(6) RSTD(*YES) +
DFT(*UPPER) VALUES(*UPPER *LOWER) +
PROMPT('Convert to')
File : QCLSRC
Member: CVTCASET
Type : CLP
Usage : CRTCLPGM PGM(*LIBL/CvtCaseT)
SRCFILE(xxx/QCLSRC)
SRCMBR(CvtCaseT)
CALL CvtCaseT
PGM
DCL &CVTTEXT *CHAR 20 'abc DeF Ghj'
DCL &OUTPUT *CHAR 20
CVTCASE VALUE(&CVTTEXT) TOVAR(&OUTPUT)
SNDPGMMSG MSG('String' *BCAT &CVTTEXT *BCAT +
'TO UPPER case:' *BCAT +
&OUTPUT) MSGTYPE(*COMP)
CVTCASE VALUE(&CVTTEXT) TOVAR(&OUTPUT) OPTION(*LOWER)
SNDPGMMSG MSG('String' *BCAT &CVTTEXT *BCAT +
'TO UPPER case:' *BCAT +
&OUTPUT) MSGTYPE(*COMP)
ENDPGM
2009-07-16 如何於 CL 中直接做字元與 16 進位字串間的轉換?(cvthc將字元轉換為 16 進位字串,cvtch將16 進位字串轉換為字元)
如何於 CL 中直接做字元與 16 進位字串間的轉換?(cvthc將字元轉換為 16 進位字串,cvtch將16 進位字串轉換為字元)
要於 CL 中直接做字元與 16 進位字串間的轉換,需要呼叫系統 API (cvthc:將字元轉換為 16 進位字串,cvtch:將16 進位字串轉換為字元)。
例如:
使用 cvthc 將 "AB" 轉換為 "C1C2"。
使用 cvtch 將 "C1C1" 轉換為 "AB"。
File : QCLSRC
Member: CVTHC1TO2
Type : CLLE
OS version: V5R4 以上
Usage : CRTCLMOD (xxx/CVTHC1TO2)
cvthc:將字元轉換為 16 進位字串
PGM (&SRCSTR &SRCLEN &TGTSTR)
DCL VAR(&SRCSTR) TYPE(*CHAR) LEN(256)
DCL VAR(&PSRCSTR) TYPE(*PTR) STG(*DEFINED) +
DEFVAR(&SRCSTR)
DCL VAR(&TGTSTR) TYPE(*CHAR) LEN(512)
DCL VAR(&PTGTSTR) TYPE(*PTR) STG(*DEFINED) +
DEFVAR(&TGTSTR)
DCL VAR(&SRCLEN) TYPE(*DEC) LEN(3 0)
DCL VAR(&TGTLEN) TYPE(*INT)
CHGVAR &TGTLEN (&SRCLEN * 2)
/* Convert char 'AB' to Hex String 'C1C2' */
CALLPRC PRC('cvthc') PARM(&PTGTSTR +
&PSRCSTR (&TGTLEN *BYVAL))
ENDPGM
File : QCMDSRC
Member: CVTHC1TO2
Type : CMD
OS version: V5R4 以上
Usage : CRTCMD CMD(xxx/CVTHC1TO2) PGM(xxx/CVTHC1TO2) ALLOW(*IPGM *BPGM)
/*================================================================*/
/* COMMAND CVTHC1TO2 */
/* TO COMPILE : */
/* CRTCMD CMD(XXX/CVTHC1TO2) PGM(XXX/CVTHC1TO2) + */
/* SRCFILE(XXX/QCMDSRC) */
/*================================================================*/
CVTHC1TO2: CMD PROMPT('CVT Char to HEX String (cvthc)')
PARM KWD(SRCSTR) TYPE(*CHAR) LEN(256) MIN(1) +
PROMPT('Source string')
PARM KWD(SRCLEN) TYPE(*DEC) LEN(3) MIN(1) +
EXPR(*YES) PROMPT('Source string length')
PARM KWD(TGTSTR) TYPE(*CHAR) LEN(512) +
RTNVAL(*YES) PROMPT('CL var for +
HEX output (512)')
File : QCLSRC
Member: CVTCH2TO1
Type : CLLE
OS version: V5R4 以上
Usage : CRTCLMOD (xxx/CVTCH2TO1)
CRTPGM PGM(xxxx/CVTCH2TO1) BNDDIR(QC2LE)
cvtch:將16 進位字串轉換為字元
PGM (&SRCSTR &SRCLEN &TGTSTR)
DCL VAR(&SRCSTR) TYPE(*CHAR) LEN(512) /* Hex STR */
DCL VAR(&PSRCSTR) TYPE(*PTR) STG(*DEFINED) +
DEFVAR(&SRCSTR)
DCL VAR(&TGTSTR) TYPE(*CHAR) LEN(256) /* Char STR*/
DCL VAR(&PTGTSTR) TYPE(*PTR) STG(*DEFINED) +
DEFVAR(&TGTSTR)
DCL VAR(&SRCLEN) TYPE(*DEC) LEN(3 0)
DCL VAR(&HEXSTRLEN) TYPE(*INT)
CHGVAR &HEXSTRLEN &SRCLEN
/* Convert Hex String 'C1C2' to char 'AB' */
CALLPRC PRC('cvtch') PARM(&PTGTSTR +
&PSRCSTR (&HEXSTRLEN *BYVAL))
ENDPGM
File : QCMDSRC
Member: CVTCH2TO1
Type : CMD
OS version: V5R4 以上
Usage : CRTCMD CMD(xxx/CVTCH2TO1) PGM(xxx/CVTCH2TO1) ALLOW(*IPGM *BPGM)
/*================================================================*/
/* COMMAND CVTCH2TO1 */
/* TO COMPILE : */
/* CRTCMD CMD(XXX/CVTCH2TO1) PGM(XXX/CVTCH2TO1) + */
/* SRCFILE(XXX/QCMDSRC) */
/*================================================================*/
/* USAGE SAMPLE in CLP: */
/*================================================================*/
CVTHC1TO2: CMD PROMPT('CVT Hex String to Char (cvtch)')
PARM KWD(SRCSTR) TYPE(*CHAR) LEN(512) MIN(1) +
PROMPT('Source string')
PARM KWD(SRCLEN) TYPE(*DEC) LEN(3) MIN(1) +
EXPR(*YES) PROMPT('Source string length')
PARM KWD(TGTSTR) TYPE(*CHAR) LEN(256) +
RTNVAL(*YES) PROMPT('CL var for +
Char output (256)')
File : QCLSRC
Member: CVTHEXCT
Type : CLLE
OS version: V5R4 以上
Usage : CRTBNDCL PGM(xxx/CVTHEXCT)
CALL CVTHEXCT
WRKJOB option 4, see last QPPGMDMP file
PGM
DCL VAR(&SRCSTR) TYPE(*CHAR) LEN(256)
DCL VAR(&TGTSTR) TYPE(*CHAR) LEN(512)
DCL VAR(&SRCLEN) TYPE(*INT)
CVThc1To2 SRCSTR('ABCDEFGHIJK') SRCLEN(11) +
TGTSTR(&TGTSTR)
CVTch2TO1 SRCSTR(&TGTSTR ) SRCLEN(22) +
TGTSTR(&SRCSTR)
dmpclpgm
ENDPGM
2008-07-01 如何於 CLP 中以 Host name 取得主機的 IP 或以 IP 取得主機的 Host name?(Command GETHOSTGet Host by Name(gethostbyname) & Get Host by Address(gethostbyaddr))
如何於 CLP 中以 Host name 取得主機的 IP 或以 IP 取得主機的 Host name?(Command GETHOSTGet Host by Name(gethostbyname) & Get Host by Address(gethostbyaddr))
File : QRPGLESRC
Member: GETHOST
Type : RPGLE
Usage : CRTBNDRPG PGM(GETHOST)
**
** To compile:
** CRTBNDRPG PGM(xxxx) SRCFILE(xxxx/xxxx) DFTACTGRP(*NO) +
** ACTGRP(*CALLER)
** (actually, activation group can be whatever you prefer)
**
H DEBUG OPTION(*SRCSTMT:*NODEBUGIO) DFTACTGRP(*NO) ACTGRP(*CALLER)
** -------------------------------------------------------------------
D* The "internet" address family.
** -------------------------------------------------------------------
D AF_INET C CONST(2)
** -------------------------------------------------------------------
D INet_Addr PR 10U 0 ExtProc('inet_addr')
D char_addr 16A
** -------------------------------------------------------------------
D inet_ntoa PR * ExtProc('inet_ntoa')
D ulong_addr 10U 0 VALUE
** -------------------------------------------------------------------
D* any address availabl
D INADDR_ANY C CONST(0)
D* broadcast
D INADDR_BRO C CONST(4294967295)
D* loopback/localhost
D INADDR_LOO C CONST(2130706433)
D* no address exists
D INADDR_NON C CONST(4294967295)
** -------------------------------------------------------------------
D GetHostNam PR * extProc('gethostbyname')
D HostName 256A
** -------------------------------------------------------------------
** gethostbyaddr()--Get Host Information for IP Address
** -------------------------------------------------------------------
D GetHostAdr PR * ExtProc('gethostbyaddr')
D IP_Address 10U 0
D Addr_Len 10I 0 VALUE
D Addr_Fam 10I 0 VALUE
** -------------------------------------------------------------------
** Host Database Entry (for DNS lookups, etc)
** -------------------------------------------------------------------
D p_hostent S *
D hostent DS Based(p_hostent)
D h_name *
D h_aliases *
D h_addrtype 5I 0
D h_length 5I 0
D h_addrlist *
D p_h_addr S * Based(h_addrlist)
D h_addr S 10U 0 Based(p_h_addr)
D*** internal "work" variables. (not part of /COPY file)
D wkInput S 256A
D wkIP S 10U 0
D wkLen S 10I 0
D p_Name S * INZ(*NULL)
D wkName S 256A BASED(p_name)
C****************************************************************
C* Parameters:
C*
C* RetType: May be *NAME or *ADDR. If *NAME is given,
C* we'll return a domain name. If *ADDR we'll return an
C* IP Address.
C*
C* Input: Host or IP address to lookup. IP addresses should
C* be given in x.x.x.x format.
C*
C* Output: Resulting IP address, host name or error code.
C* Error codes are: *TYPE = invalid "RetType" parameter.
C* *BLANK = Input cant be blank
C* *FAIL = Lookup failed for this host.
C****************************************************************
C *entry plist
c parm RetType 5
c parm Input 256
c parm Output 256
C* If we werent given enough parms, just end this program now...
C* (we'll seton LR, even) We can't return an error since we
c* don't have an output parm to return it in (ack!)
c if %parms < 3
c eval *inlr = *on
c return
c endif
C* Did we have a valid return type?
c if RetType <> '*NAME'
c and RetType <> '*ADDR'
c eval Output = '*TYPE'
c Return
c endif
C* Was some input given?
C if Input = *blanks
c eval Output = '*BLANK'
c Return
c endif
C* were we given an IP address or a name?
c eval wkInput = %trim(Input) + x'00'
c eval wkIP = inet_addr(wkInput)
C* An address was requested... and the input was already
C* an address... return the input directly.
c if RetType = '*ADDR'
c and wkIP <> INADDR_NON
c eval Output = %trim(Input)
c Return
c endif
C* Call the OS/400 resolver routines to get the information that
C* we require. (It will check the hosts table first, then try DNS)
c if wkIP = INADDR_NON
c eval p_hostent = gethostnam(wkInput)
c else
c eval p_hostent = gethostadr(wkIP:4:AF_INET)
c endif
c if p_hostent = *NULL
c eval Output = '*FAIL'
c return
c endif
C* if we're returning an address, we'll need to use inet_ntoa
C* to convert it back to dotted-decimal x.x.x.x format.
C*
c if RetType = '*ADDR'
c eval p_name = inet_ntoa(h_addr)
c if p_name = *NULL
c eval Output = '*FAIL'
c else
c x'00' scan wkName wkLen
c eval Output = %subst(wkName:1:wkLen-1)
c endif
c return
c endif
C* the hostent structure contains a pointer to the requested
C* domain name... we'll need to base a variable on that pointer,
C* and then convert it from the "C" format for strings to a
C* fixed-length RPG string
c if h_name = *NULL
c eval Output = '*FAIL'
c return
c endif
c eval p_name = h_name
c x'00' scan wkName wkLen
c eval Output = %subst(wkName:1:wkLen-1)
c return
File : QCMDSRC
Member: GETHOST
Type : CMD
Usage : CRTCMD CMD(GETHOST) PGM(GETHOST) ALLOW(*IPGM *BPGM)
/* COMMAND GETHOST */
/* TO COMPILE : */
/* CRTCMD CMD(XXX/GETHOST) PGM(XXX/GETHOST ) + */
/* SRCFILE(XXX/QCMDSRC) */
/*================================================================*/
/* USAGE SAMPLE in CLP: */
/* GETHOST RETTYPE(*ADDR) INPUT(&HOSTNAME) OUTPUT(&HOSTIP) */
/* GETHOST RETTYPE(*NAME) INPUT(&HOSTIP) OUTPUT(&HOSTNAME) */
/* */
/* OUTPUT Resulting IP address, host name or error code. */
/* Error codes are: *TYPE = invalid "RetType" parameter */
/* *BLANK = Input cant be blank */
/* *FAIL = Lookup failed for this host */
/*================================================================*/
GETHOST: CMD PROMPT('Get Host by Name & by Address')
PARM KWD(RETTYPE) TYPE(*CHAR) LEN(5) RSTD(*YES) +
VALUES(*ADDR *NAME) MIN(1) PROMPT('Return +
type')
PARM KWD(INPUT) TYPE(*CHAR) LEN(256) MIN(0) +
EXPR(*YES) PROMPT('Input Host name or +
address')
PARM KWD(OUTPUT) TYPE(*CHAR) LEN(256) +
RTNVAL(*YES) PROMPT('Output Host name or +
address')
File : QCLSRC
Member: GETHOSTC
Type : CLP
Usage : CRTCLPGM GETHOSTC
執行 CALL RTVSQLINFC 後,會產生 QPPGMDMP 報表,檢視 QPPGMDMP 報表,
PGM
DCL &INPUT *CHAR 256
DCL &IPOUTPUT *CHAR 256
DCL &NMOUTPUT *CHAR 256
/* 以主機名稱取 IP 位址 */
GETHOST RETTYPE(*ADDR) INPUT('tw.yahoo.com') +
OUTPUT(&IPOUTPUT)
/* 以 IP 位址取主機名稱 */
GETHOST RETTYPE(*NAME) INPUT(&IPOUTPUT) +
OUTPUT(&NMOUTPUT)
DMPCLPGM
ENDPGM
部分報表輸出範例:
Display Spooled File
File . . . . . : QPPGMDMP Page/Line 1/24
Control . . . . . Columns 1 - 78
Find . . . . . .
*...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+...
Variable Type Length Value
*...+....1....+....2....+
&IPOUTPUT *CHAR 256 '202.43.195.52 '
+26 ' '
+51 ' '
+76 ' '
+101 ' '
+126 ' '
+151 ' '
+176 ' '
+201 ' '
+226 ' '
+251 ' '
&NMOUTPUT *CHAR 256 'vip1.tw.tpe.yahoo.com '
+26 ' '
+51 ' '
星期一, 11月 06, 2023
2003-05-13 如何免手動開關機設定 ASP 硬碟儲存區的臨界值(Threshold Value) (Command DSPASP, CHGASP)?
如何免手動開關機設定 ASP 硬碟儲存區的臨界值(Threshold Value) ?
AS/400(iSeries)的硬碟儲存區是將許多實體的硬碟(例如 10 顆 36G 的硬碟組合成
一個邏輯磁碟區。)組合而成一個 ASP。系統將之視為與記憶體一體,當記憶體不夠用
時,系統會自動將硬碟區視為記憶體的一部份,已增加系統整體效能,由於有如此功能,
為了防止硬碟空間不足,所以需要設定臨界值來通知相關人員採取適當措施(增加硬碟),
但是要更改這個臨界值,需要手動開機設定,步驟較煩瑣,所以在此介紹利用 System API
來完成這項工作。
此工具可適用於 OS/400 V4R4以後,且須具有 *ALLOBJ 或 *SERVICE 特殊權限者才能執行。
File : QCLSRC
Member: DSPASPC
Type : CLP
Usage : CRTCLPGM DSPASPC
PGM
/* ***************************************************************** */
/* This job uses API QYASPOL to determine the current ASP Threshold. */
/* If this is being run Interactively, the details will be displayed */
/* on the users screen, prior to being written to file ASPTHRESH2, */
/* via Query ASPTHRESH. */
/* */
/* */
/* ***************************************************************** */
/* API parameters */
DCL VAR(&RCVR) TYPE(*CHAR) LEN(116)
DCL VAR(&LEN) TYPE(*CHAR) LEN(4)
DCL VAR(&LIST) TYPE(*CHAR) LEN(80)
DCL VAR(&NUMR) TYPE(*CHAR) LEN(4)
DCL VAR(&NUMF) TYPE(*CHAR) LEN(4)
DCL VAR(&FLTR) TYPE(*CHAR) LEN(16)
DCL VAR(&FMT) TYPE(*CHAR) LEN(8) VALUE('YASP0200')
DCL VAR(&ERR) TYPE(*CHAR) LEN(80)
DCL VAR(&FSIZE) TYPE(*CHAR) LEN(4)
DCL VAR(&FKEY) TYPE(*CHAR) LEN(4)
DCL VAR(&FFDSIZE) TYPE(*CHAR) LEN(4)
DCL VAR(&FDATA) TYPE(*CHAR) LEN(4)
/* Terminal Id */
DCL VAR(&TERMINAL) TYPE(*CHAR) LEN(10)
DCL VAR(&TYPE) TYPE(*CHAR) LEN(1)
/* ASP No */
DCL VAR(&APIASPNO) TYPE(*DEC) LEN(2 0)
DCL VAR(&ASPNO) TYPE(*CHAR) LEN(2)
/* ASP Threshold */
DCL VAR(&APIASPTHLD) TYPE(*DEC) LEN(2 0)
DCL VAR(&ASPTHLD) TYPE(*CHAR) LEN(2)
/* ASP %used */
DCL VAR(&APIASPUSE) TYPE(*CHAR) LEN(5)
DCL VAR(&PERUSED) TYPE(*DEC) LEN(5 2)
/* ASP Total */
DCL VAR(&APIASPTOT) TYPE(*DEC) LEN(11 0)
DCL VAR(&ASPTOT) TYPE(*CHAR) LEN(11)
/* ASP Available */
DCL VAR(&APIASPAVL) TYPE(*DEC) LEN(11 0)
RTVJOBA JOB(&TERMINAL) TYPE(&TYPE)
CREATEFILE: CRTPF FILE(QGPL/ASPTHRESH) RCDLEN(132)
MONMSG MSGID(CPF0000) EXEC(CLRPFM +
FILE(QGPL/ASPTHRESH))
CRTDTAARA: CRTDTAARA DTAARA(QGPL/ASPTHRESH) TYPE(*CHAR) LEN(2) +
TEXT('ASP Threshold')
MONMSG MSGID(CPF0000) EXEC(CHGDTAARA +
DTAARA(QGPL/ASPTHRESH) VALUE(' '))
CHGVAR VAR(%BIN(&FSIZE 1 4)) VALUE(16)
CHGVAR VAR(%BIN(&FKEY 1 4)) VALUE(1)
CHGVAR VAR(%BIN(&FFDSIZE 1 4)) VALUE(4)
CHGVAR VAR(%BIN(&FDATA 1 4)) VALUE(-1)
CHGVAR VAR(&FLTR) VALUE(&FSIZE *CAT &FKEY *CAT +
&FFDSIZE *CAT &FDATA)
CHGVAR VAR(%BIN(&ERR 1 4)) VALUE(80)
CHGVAR VAR(%BIN(&ERR 5 4)) VALUE(0)
CHGVAR VAR(%SST(&ERR 9 72)) VALUE(' ')
CHGVAR VAR(%BIN(&LEN 1 4)) VALUE(116)
CHGVAR VAR(%BIN(&NUMF 1 4)) VALUE(1)
CHGVAR VAR(%BIN(&NUMR 1 4)) VALUE(1)
/* Call API QYASPOL */
CALL PGM(QGY/QYASPOL) PARM(&RCVR &LEN &LIST &NUMR +
&NUMF &FLTR &FMT &ERR)
/* Parse info received from API */
CHGVAR VAR(&APIASPNO) VALUE(%BIN(&RCVR 3 2))
CHGVAR VAR(&APIASPTOT) VALUE(%BIN(&RCVR 9 4))
CHGVAR VAR(&APIASPAVL) VALUE(%BIN(&RCVR 13 4))
CHGVAR VAR(&APIASPTHLD) VALUE(%bin(&RCVR 63 2))
/* Calculate ASP %used */
CHGVAR VAR(&PERUSED) VALUE(100 - ((&APIASPAVL / +
&APIASPTOT) * 100))
/* Move *DEC to *CHAR fields */
CHGVAR VAR(&APIASPUSE) VALUE(&PERUSED)
CHGVAR VAR(&ASPTOT) VALUE(&APIASPTOT)
CHGVAR VAR(&ASPNO) VALUE(&APIASPNO)
CHGVAR VAR(&ASPTHLD) VALUE(&APIASPTHLD)
IF COND(&TYPE *EQ '0') THEN(GOTO CMDLBL(BATCH))
SNDBRKMSG MSG('ASP No: ' *CAT &ASPNO *CAT ' ASP +
%Threshold: ' *CAT &ASPTHLD *CAT ' +
ASP %Used: ' *CAT &APIASPUSE) +
TOMSGQ(&TERMINAL)
batch:
/* Set up file ASPTHRESH2, containing ASP Threshold% */
CHGDTAARA DTAARA(QGPL/ASPTHRESH) VALUE(&ASPTHLD)
DSPDTAARA DTAARA(QGPL/ASPTHRESH) OUTPUT(*PRINT)
CPYSPLF FILE(QPDSPDTA) TOFILE(QGPL/ASPTHRESH) +
SPLNBR(*LAST) MBROPT(*REPLACE)
RUNQRY: RUNQRY QRYFILE((ASPTHRESH))
ENDPGM
File : QCMDSRC
Member: DSPASP
Type : CMD
Usage : CRTCMD CMD(your-lib/DSPASP) PGM(your-lib/DSPASPC)
/* CPP DSPASPC */
CMD PROMPT('Display ASP Threshold')
File : QCLSRC
Member: CHGASPC
Type : CLP
Usage : CRTCLPGM CHGASPC
/**********************/
/* COMMAND CHGASP CPP */
/**********************/
PGM PARM(&ASP &THRESHOLD)
DCL VAR(&TERMINAL) TYPE(*CHAR) LEN(10)
DCL VAR(&ASP) TYPE(*CHAR) LEN(4)
DCL VAR(&THRESHOLD) TYPE(*CHAR) LEN(4)
DCL VAR(&COUNTER) TYPE(*DEC) LEN(1)
/* API parameters */
DCL VAR(&HANDLE) TYPE(*CHAR) LEN(8)
DCL VAR(&ERROR) TYPE(*CHAR) LEN(96)
DCL VAR(&BYTESPROV) TYPE(*CHAR) LEN(4)
DCL VAR(&BYTESAVAIL) TYPE(*CHAR) LEN(4)
DCL VAR(&EXCEPID) TYPE(*CHAR) LEN(7)
DCL VAR(&RESERVED) TYPE(*CHAR) LEN(1)
DCL VAR(&EXCEPDATA) TYPE(*CHAR) LEN(80)
DCL VAR(&OPKEY) TYPE(*CHAR) LEN(4)
DCL VAR(&OPVAR) TYPE(*CHAR) LEN(8)
DCL VAR(&OPVARLEN) TYPE(*CHAR) LEN(4)
DCL VAR(&FORMAT) TYPE(*CHAR) LEN(8) +
VALUE('DMOP0100')
DCL VAR(&ASPNO) TYPE(*CHAR) LEN(4)
DCL VAR(&ASPTHRESH) TYPE(*CHAR) LEN(4)
RTVJOBA JOB(&TERMINAL)
/* Start DASD Management Session - QYASSDMS API */
CHGVAR VAR(%BIN(&BYTESPROV 1 4)) VALUE(0)
CHGVAR VAR(&ERROR) VALUE(&BYTESPROV *CAT +
&BYTESAVAIL *CAT &EXCEPID *CAT &RESERVED +
*CAT &EXCEPDATA)
STARTSESS: CALL PGM(QYASSDMS) PARM(&HANDLE &ERROR)
MONMSG MSGID(CPFBA21) EXEC(DO) /* session already +
active */
CHGVAR VAR(&COUNTER) VALUE(&COUNTER + 1)
IF COND(&COUNTER *EQ 3) THEN(DO)
SNDBRKMSG MSG('CHGASP: DASD Management session still +
in use - job will now end') TOMSGQ(&TERMINAL)
GOTO CMDLBL(END)
ENDDO
SNDBRKMSG MSG('DASD Management session still in use - +
please wait for 6 mins to allow the +
previous session to end. Press enter to +
continue.') TOMSGQ(&TERMINAL)
DLYJOB DLY(360)
GOTO CMDLBL(STARTSESS)
ENDDO
/* Start DASD Management Operation - QYASSDMO API */
CHGVAR VAR(%BIN(&OPKEY 1 4)) VALUE(1)
CHGVAR VAR(%BIN(&aspno 1 4)) VALUE(&ASP)
CHGVAR VAR(%BIN(&ASPTHRESH 1 4)) VALUE(&THRESHOLD)
CHGVAR VAR(&OPVAR) VALUE(&ASPNO *CAT &ASPTHRESH)
CALL PGM(QYASSDMO) PARM(&HANDLE &OPKEY &OPVAR +
&OPVARLEN &FORMAT &ERROR)
/* End DASD Management Operation - QYASEDMO API */
CALL PGM(QYASEDMO) PARM(&HANDLE &ERROR)
MONMSG MSGID(CPFBA46) /* not active */
/* End DASD Management Session - QYASEDMS API */
CALL PGM(QYASEDMS) PARM(&HANDLE &ERROR)
DSPASP
MONMSG MSGID(CPF0000)
END: ENDPGM
File : QCMDSRC
Member: CHGASP
Type : CMD
Usage : CRTCMD CMD(your-lib/CHGASP) PGM (your-lib/CHGASPC)
/* CPP CHGASPC */
CMD PROMPT(' Set ASP Threshold ')
PARM KWD(ASP) TYPE(*CHAR) LEN(4) RSTD(*NO) +
DFT('1') CHOICE(' Eg ''1'' ') +
PROMPT('Enter ASP No: ''1'', ''2'' etc ')
PARM KWD(THRESHOLD) TYPE(*CHAR) LEN(4) RSTD(*NO) +
DFT('80') CHOICE(' Eg ''80'' ') +
PROMPT('Enter ASP Threshold')
2003-04-28 如何快速得知 IFS 目錄下的檔案大小?
如何快速得知 IFS 目錄下的檔案大小?
IBM 提供 V5R1 PTF SI05156 (superseded by SI05856) 及 V5R2 PTF SI05155
可以執行程式指定目錄及可以快速得知該目錄下檔案大小。
For the full report:
call qsrsrv parm("METRICS" '/')
To omit QNTC, QNETWARE, QLANSRV use the following.
call qsrsrv parm("METRICS" '/' "EPFS")
Or for a specific directory.
call qsrsrv parm("METRICS" '/mydir/mysubdir')
2003-03-25 如何讓系統操作人員將使用者設定為可以進入系統?(Command EBLUSRPRF Enabled User Profile)
如何讓系統操作人員將使用者設定為可以進入系統?(Command EBLUSRPRF Enabled User Profile)
當使用者的 SignOn 錯誤次數超過系統值 QMAXSIGN 的設定值時,若另一系統值
QMAXSGNACN設為 2 或 3 時,此時系統會將使用者狀態設為失效(disabled)。所已有需要讓系統操
作人員能將該失效使用者重新設定為有效,該使用者才可以進入系統。
但在開發此工具時,需要注意不得讓系統操作人員將具有 *ALLOBJ, *SECADM, *SERVICE
高級權限的人員,執行啟用(enabled)使用者的動作。
此程式需以 QSECOFR 使用者產生,並指定繼承程式擁有者的權限,系統操作人員執行此
程式時,才能間接取得 QSECOFR 的權限,更改使用者狀態,同時亦排除更改具有高級權
限的使用者。
這裡也提供 Command EBLUSRPRF 使系統操作人員便於使用。
File : QCLSRC
Member: EBLUSRPRF
Type : CLP
Usage : 此程式需以 QSECOFR 使用者產生
CRTCLPGM EBLUSRPRF USRPRF(*OWNER)
/* Program : EBLUSRPRF */
/* Version : 1.00 */
/* System : iSeries */
/* */
/* Compile the program with user QSECOFR */
/* and adopt authority : */
/* CHGPGM PGM(EBLUSRPRF) USRPRF(*OWNER) */
RSETUSRPRF: PGM PARM(&USRPRF &PASSWORD &PWDEXP &STATUS)
DCL VAR(&USRPRF) TYPE(*CHAR) LEN(10)
DCL VAR(&PASSWORD) TYPE(*CHAR) LEN(10)
DCL VAR(&PWDEXP) TYPE(*CHAR) LEN(10)
DCL VAR(&STATUS) TYPE(*CHAR) LEN(10)
DCL VAR(&CURUSER) TYPE(*CHAR) LEN(10)
DCL VAR(&GRPPRF) TYPE(*CHAR) LEN(10)
DCL VAR(&SPCAUT) TYPE(*CHAR) LEN(100)
DCL VAR(&ALLOBJ) TYPE(*LGL)
/* Parameters for QCLSCAN */
DCL VAR(&STRINGLEN) TYPE(*DEC) LEN(3 0) VALUE(100)
DCL VAR(&STRPOS) TYPE(*DEC) LEN(3 0) VALUE(1)
DCL VAR(&PATTERN) TYPE(*CHAR) LEN(10)
DCL VAR(&PATTERNLEN) TYPE(*DEC) LEN(3 0) VALUE(10)
DCL VAR(&TRANSLATE) TYPE(*CHAR) LEN(1) VALUE('1')
DCL VAR(&TRIM) TYPE(*CHAR) LEN(1) VALUE('1')
DCL VAR(&WILD) TYPE(*CHAR) LEN(1) VALUE(' ')
DCL VAR(&RESULT) TYPE(*DEC) LEN(3 0)
/* Check userprofile existence */
CHKOBJ OBJ(QSYS/&USRPRF) OBJTYPE(*USRPRF)
MONMSG MSGID(CPF0000) EXEC(DO)
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('***** +
Error ****** invalid userprofile') +
TOPGMQ(*PRV) MSGTYPE(*ESCAPE)
ENDDO
/* new password same as userprofile */
IF COND(&PASSWORD *EQ *USRPRF) THEN(CHGVAR +
VAR(&PASSWORD) VALUE(&USRPRF))
/* retrieve current user */
RTVJOBA USER(&CURUSER)
/* Retrieve userprofile attributes */
RTVUSRPRF USRPRF(&USRPRF) SPCAUT(&SPCAUT) GRPPRF(&GRPPRF)
/* Check if the userprofile to be changed has */
/* *ALLOBJ authority. */
CHGVAR VAR(&PATTERN) VALUE('*ALLOBJ')
CALL PGM(QCLSCAN) PARM(&SPCAUT &STRINGLEN &STRPOS +
&PATTERN &PATTERNLEN &TRANSLATE &TRIM +
&WILD &RESULT)
/* String *ALLOBJ was found */
IF COND(&RESULT *NE 0) THEN(CHGVAR VAR(&ALLOBJ) +
VALUE('1'))
/* Do not allow to let userprofile QSECOFR, QSRV or */
/* any userprofile with *ALLOBJ authority or group */
/* profile QSECOFR to be changed. */
/* */
IF COND(&USRPRF = QSECOFR *OR &USRPRF = QSRV +
*OR &ALLOBJ *OR &GRPPRF *EQ QSECOFR) THEN(DO)
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('*** +
Error *** not authorised to change this +
user profile') TOPGMQ(*PRV) MSGTYPE(*ESCAPE)
ENDDO
/* Before resetting the userprofile, let the current */
/* user authenticate by typing his own password. */
/* This prevents changing a userprofile on a terminal */
/* where the normal user went for dinner. */
?CHKPWD
MONMSG MSGID(CPF0000) EXEC(RETURN)
/* Change userprofile */
CHGUSRPRF USRPRF(&USRPRF) PASSWORD(&PASSWORD) +
PWDEXP(&PWDEXP) STATUS(&STATUS)
MONMSG MSGID(CPF0000) EXEC(DO)
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('*** +
Error occurred *** see joblog') +
TOPGMQ(*PRV) MSGTYPE(*ESCAPE)
ENDDO
/* Log the changes into the History log */
SNDPGMMSG MSG('Userprofile ' *CAT &USRPRF *TCAT ' +
reset by user ' *CAT &CURUSER) TOMSGQ(QHST)
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) +
MSGDTA('Userprofile ' *CAT &USRPRF *BCAT +
'reset') TOPGMQ(*PRV) MSGTYPE(*COMP)
END: ENDPGM
File : QCMDSRC
Member: RSETUSRPRF
Type : CMD
Usage : CRTCMD CMD(your-lib/EBLUSRPRF) PGM(your-lib/EBLUSRPRF)
/* Command : EBLUSRPRF */
/* Version : 1.00 */
/* System : iSeries */
/* Description : Enable userprofile and password */
RSETUSRPRF: CMD PROMPT('Enable userprofile and password')
PARM KWD(USRPRF) TYPE(*NAME) LEN(10) MIN(1) +
PROMPT('User profile')
PARM KWD(PASSWORD) TYPE(*CHAR) LEN(10) +
DFT(*USRPRF) SPCVAL((*USRPRF) (*SAME)) +
DSPINPUT(*PROMPT) PROMPT('User password')
PARM KWD(PWDEXP) TYPE(*CHAR) LEN(10) RSTD(*YES) +
DFT(*YES) VALUES(*SAME *NO *YES) +
PROMPT('Set password to expired')
PARM KWD(STATUS) TYPE(*CHAR) LEN(10) RSTD(*YES) +
DFT(*ENABLED) VALUES(*ENABLED *DISABLED +
*SAME) PROMPT('Status')
2003-03-12 如何於 CL 中轉換字串中每個英文單字的第一個字為大寫?
如何於 CL 中轉換字串中每個英文單字的第一個字為大寫?
File : QCLSRC
Member: CVTCASEC
Type : CLP
Usage : CRTCLPGM CVTCASEC
CALL CVTCASEC 'AS/400 IS VERY GOOD.'
pgm (&CvtText) /* Convert this text */
/*--------------------------------------------------------*/
/* declaration */
/*--------------------------------------------------------*/
dcl &CvtText *char 80
dcl &ReqUpper *char 22
dcl &ReqLower *char 22
dcl &Pos *dec 3 1
dcl &Posl *dec 3 0
dcl &Len *dec 3 0
dcl &upper *lgl
dcl &CCSIDReq *char 4 x'00000001'
dcl &CCSIDInp *char 4 x'00000000'
dcl &Uppercase *char 4 x'00000000'
dcl &Lowercase *char 4 x'00000001'
dcl &Reserved *char 10 x'00000000000000000000'
/*----------------------------------------------*/
/* QLGCNVCS - Convert Case QlgConvertCase */
/*----------------------------------------------*/
dcl &Input *char 80
dcl &Output *char 80
dcl &DataLen *char 4 x'00000050'
dcl &ErrCde *char 4 x'00000000'
/*--------------------------------------------------------*/
/* Setup Request Control Block */
/*--------------------------------------------------------*/
chgvar &ReqUpper (&CCSIDReq || +
&CCSIDInp || +
&Uppercase || +
&Reserved)
chgvar &ReqLower (&CCSIDReq || +
&CCSIDInp || +
&Lowercase || +
&Reserved)
chgvar &upper '1'
/*--------------------------------------------------------*/
/* Convert Upper (First letter), then lower case */
/*--------------------------------------------------------*/
loop:
if (&Pos *ge 80) goto endloop
/*----------------------------------------------*/
/* Convert to Lower */
/*----------------------------------------------*/
if (%sst(&CvtText &Pos 1) = ' ') do
if (*Not &Upper) do
chgvar &output ' '
chgvar %bin(&Datalen) &len
Call Pgm(QLGCNVCS) +
parm(&Reqlower +
&input +
&output +
&Datalen +
&ErrCde )
chgvar %sst(&CvtText &Posl &len) &Output
enddo
chgvar &upper '1'
chgvar &Pos (&Pos + 1)
enddo
/*----------------------------------------------*/
/* Convert to Upper */
/*----------------------------------------------*/
if (%sst(&CvtText &Pos 1) *ne ' ') do
if &upper do
chgvar &input %sst(&CvtText &Pos 1)
chgvar &output ' '
chgvar %bin(&Datalen) 1
Call Pgm(QLGCNVCS) +
parm(&ReqUpper +
&input +
&output +
&Datalen +
&ErrCde )
chgvar %sst(&CvtText &Pos 1) %sst(&Output 1 1)
chgvar &Pos (&Pos + 1)
chgvar &Posl &Pos
chgvar &upper '0'
chgvar &len 0
enddo
else do
chgvar &len (&len + 1)
chgvar %sst(&input &len 1) %sst(&CvtText &Pos 1)
chgvar &Pos (&Pos + 1)
enddo
enddo
goto loop
endloop:
SndPgmMsg Msg(&Cvttext) Msgtype(*Comp)
EndPgm
2003-02-19 如何於 CLP 中傳送著色的訊息?(Send colored message in CLP)
如何於 CLP 中傳送著色的訊息?(Send colored message in CLP)
File : QCLSRC
Member: SNDCOLMSGC
Type : CLP
Usage : CRTCLPGM SNDCOLMSGC
OS Version: All
/* TO COMPILE : */
/* */
/* CRTCLPGM PGM(XXX/SNDCOLMSG) SRCFILE(XXX/QCLSRC) */
SNDCOLMSG: PGM PARM(&MSG &COLOR &MSGTYPE)
DCL VAR(&MSG) TYPE(*CHAR) LEN(80)
DCL VAR(&COLOR) TYPE(*CHAR) LEN(1)
DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10)
DCL VAR(&LASTBYTE) TYPE(*CHAR) LEN(1) VALUE(X'20')
DCL VAR(&TEXT) TYPE(*CHAR) LEN(82)
CHGVAR VAR(&TEXT) VALUE(&COLOR *CAT &MSG *TCAT +
&LASTBYTE)
SNDPGMMSG MSG(&TEXT) TOPGMQ(*EXT) MSGTYPE(&MSGTYPE)
SNDPGMMSG MSG(&TEXT) MSGTYPE(&MSGTYPE)
END: ENDPGM
此程式中有二個 SNDPGMMSG 指令,你可以選取一種顯示方式或二者。
二者顯示方式稍有不同,可以自行比較一下。
File : QCMDSRC
Member: SNDCOLMSG
Type : CMD
Usage : CRTCMD CMD(SNDCOLMSG) PGM(SNDCOLMSGC)
OS Version: All
/* Description : Send a colored message */
/* */
/* To compile : */
/* */
/* CRTCMD CMD(XXX/SNDCOLMSG) PGM(XXX/SNDCOLMSG) + */
/* SRCFILE(XXX/QCMDSRC) */
/* */
SNDCOLMSG: CMD PROMPT('Send colored message')
PARM KWD(MSG) TYPE(*CHAR) LEN(80) PROMPT('Message')
PARM KWD(COLOR) TYPE(*CHAR) LEN(1) RSTD(*YES) +
DFT(*GREEN) SPCVAL( +
(*GREEN X'20') +
(*GREEN_REVERSE X'21') +
(*WHITE X'22') +
(*WHITE_REVERSE X'23') +
(*GREEN_UNDERSCORE X'24') +
(*GREEN_UNDERSCORE_REVERSE X'25') +
(*WHITE_UNDERSCORE X'26') +
(*RED X'28') +
(*RED_REVERSE X'29') +
(*RED_BLINK X'2A') +
(*RED_REVERSE_BLINK X'2B') +
(*RED_UNDERSCORE X'2C') +
(*RED_UNDERSCORE_REVERSE X'2D') +
(*RED_UNDERSCORE_BLINK X'2E') +
(*TURQUOISE X'30') +
(*TURQUOISE_REVERSE X'31') +
(*YELLOW X'32') +
(*YELLOW_REVERSE X'33') +
(*TURQUOISE_UNDERSCORE X'34') +
(*TURQUOISE_UNDERSCORE_REVERSE X'35') +
(*YELLOW_UNDERSCORE X'36') +
(*PINK X'38') +
(*PINK_REVERSE X'39') +
(*BLUE X'3A') +
(*BLUE_REVERSE X'3B') +
(*PINK_UNDERSCORE X'3C') +
(*PINK_UNDERSCORE_REVERSE X'3D') +
(*BLUE_UNDERSCORE X'3E') +
) PROMPT('Color')
PARM KWD(MSGTYPE) TYPE(*CHAR) LEN(10) RSTD(*YES) +
DFT(*INFO) VALUES(*INFO *COMP) +
PROMPT('Message type')
執行範例:
SNDCOLMSG MSG('Hello World') COLOR(*PINK)
SNDCOLMSG MSG('Error') COLOR(*RED_REVERSE_BLINK)
2003-01-22 如何讓您的 RPG 程式發出 beep 聲音?以提醒使用者某些工作已完成?
如何讓您的 RPG 程式發出 beep 聲音?以提醒使用者某些工作已完成?
如何讓您的 RPG 程式發出 beep 聲音?以提醒使用者某些工作已完成?
前期電子報以 RPG 為範例,本期以 CL 為範例。
因為會使用 CALLPRC 呼叫內建函數,所以此程式的原始型態需為 CLLE。
File : QCLSRC
Member: BEEPC
Type : CLLE
Version : V3R2 later
Usage : CRTBNDCL BEEPC
/* To compile : */
/* The source type must be "CLLE" (and not CLP). */
/* Compile with STRPDM option 14 or use the */
/* CRTBNDCL command. */
/* */
BEEP: PGM
DCL VAR(&RTNVALBIN) TYPE(*CHAR) LEN(4)
DCL VAR(&RTNVALDEC) TYPE(*DEC) LEN(5 0)
CALLPRC PRC('QsnBeep') PARM(X'00000000' X'00000000' +
X'00000000') RTNVAL(%BIN(&RTNVALBIN))
CHGVAR VAR(&RTNVALDEC) VALUE(%BIN(&RTNVALBIN))
IF COND(&RTNVALDEC *NE 0) THEN(SNDPGMMSG +
MSGID(CPF9898) MSGF(QCPFMSG) +
MSGDTA('error occurred') MSGTYPE(*ESCAPE))
END: ENDPGM
訂閱:
文章 (Atom)