2001-12-31 如何於 CL 中作日期運算?
CL 中並不提供日期運算函式,但可透過 CVTDAT 指令作日期格式轉換,
以下範例將 Job Date 轉換成 Julian number( 4 位年 + 3 位數字(1-366)),
加1,並將之轉換為日期,如果這是今年最後一天,日期無法轉換,請用次年的第一天。
File : QCLSRC
Member : CLDATEC
Type : CLP
PGM
DCL VAR(&TODAY) TYPE(*CHAR) LEN(6)
DCL VAR(&TOMORROW) TYPE(*CHAR) LEN(6)
DCL VAR(&WORKDATE) TYPE(*CHAR) LEN(7)
DCL VAR(&YEAR) TYPE(*DEC) LEN(4)
DCL VAR(&DAY) TYPE(*DEC) LEN(3)
RTVJOBA DATE(&TODAY)
CVTDAT DATE(&TODAY) TOVAR(&WORKDATE) FROMFMT(*JOB) +
TOFMT(*LONGJUL) TOSEP(*NONE)
/* Find tomorrow's date */
CHGVAR &DAY %SST(&WORKDATE 5 3)
CHGVAR &DAY (&DAY + 1)
CHGVAR %SST(&WORKDATE 5 3) &DAY
CVTDAT DATE(&WORKDATE) TOVAR(&TOMORROW) +
FROMFMT(*LONGJUL) TOFMT(*JOB) TOSEP(*NONE)
MONMSG CPF0555 EXEC(DO)
CHGVAR &YEAR %SST(&WORKDATE 1 4)
CHGVAR &YEAR (&YEAR + 1)
CHGVAR %SST(&WORKDATE 1 4) &YEAR
CHGVAR %SST(&WORKDATE 5 3) '001'
CVTDAT DATE(&WORKDATE) TOVAR(&TOMORROW) +
FROMFMT(*LONGJUL) TOFMT(*JOB) TOSEP(*NONE)
ENDDO
/* Tomorrow's date is now in &TOMORROW */
ENDPGM
A blog about IBM i (AS/400), MQ and other things developers or Admins need to know.
星期三, 11月 01, 2023
2001-12-31 如何於 CL 中作日期運算?
2001-12-31 如何定時自動檢核 System ASP Storage 的使用百分比?
如何定時自動檢核 System ASP Storage 的使用百分比?
System ASP Storage 的使用百分比可以從執行指令 WRKSYSSTS 結果得知,
Work with System Status SYSTEM
12/31/01 08:42:10
% CPU used . . . . . . . : 4.9 Auxiliary storage:
% DB capability . . . . : .0 System ASP . . . . . . : 33.95 G
Elapsed time . . . . . . : 00:07:28 % system ASP used . . : 48.6081
Jobs in system . . . . . : 459 Total . . . . . . . . : 33.95 G
% perm addresses . . . . : .013 Current unprotect used : 1697 M
% temp addresses . . . . : .013 Maximum unprotect . . : 1759 M
Type changes (if allowed), press Enter.
System Pool Reserved Max -----DB----- ---Non-DB---
Pool Size (M) Size (M) Active Fault Pages Fault Pages
1 95.28 56.43 +++++ .0 .0 .4 .4
2 508.31 2.10 160 .0 .0 .0 .0
3 6.39 .00 5 .0 .0 .0 .0
4 30.00 .01 15 .0 .0 .1 .4
Bottom
Command
===>
F3=Exit F4=Prompt F5=Refresh F9=Retrieve F10=Restart
F11=Display transition data F12=Cancel F24=More keys
系統可藉由手動開機方式設定 System ASP Threshold 值,
當系統硬碟資源使用率達到設定值時,系統會自動送出一個訊息通知系統操作員,
系統硬碟資源使用率已達到設定值,此時系統操作員或系統管理者需要採取適當的
程序來將使用率下降,像是清除System Log或報表或某些過時的資料。
但這種做法比較被動,我們可以依據需求更改Threshold 值,並定時針測ASP使
用率而不用透過手動開機方式設定 System ASP Threshold 值,取得較彈性的管理方式。
File : QCLSRC
Member : THRESHOLDC
Type : CLP
PGM
DCL VAR(&FORMAT) TYPE(*CHAR) LEN(8) VALUE('SSTS0200')
DCL VAR(&LENFLD) TYPE(*DEC) LEN(4) VALUE(68)
DCL VAR(&SYSUSEC) TYPE(*CHAR) LEN(4)
DCL VAR(&SYSUSE) TYPE(*DEC) LEN(9 2)
DCL VAR(&SYSINFO) TYPE(*CHAR) LEN(68)
DCL VAR(&ERRCODE) TYPE(*CHAR) LEN(8) +
VALUE(X'0000000000000000')
DCL VAR(&RESETSY) TYPE(*CHAR) LEN(10) VALUE(*YES)
DCL VAR(&Q90PER) TYPE(*DEC) LEN(9 2) VALUE(900000)
PROCED1: CALL PGM(QWCRSSTS) PARM( &SYSINFO &LENFLD &FORMAT &RESETSY +
&ERRCODE )
MONMSG MSGID(CPF0000) +
EXEC(GOTO PROCED2)
CHGVAR &SYSUSEC VALUE(%SST(&SYSINFO 53 4))
CHGVAR &SYSUSE %BINARY(&SYSUSEC)
IF (&SYSUSE > &Q90PER) (DO)
SNDPGMMSG MSG('**SYSTEM OVER 90% ASP**') +
TOMSGQ(QSYSOPR) MSGTYPE(*INFO)
RETURN
ENDDO
SNDPGMMSG MSG('**SYSTEM UNDER 90% ASP**') +
TOMSGQ(QSYSOPR) MSGTYPE(*INFO)
RETURN
PROCED2: SNDPGMMSG MSG('GETTING ERROR ON SYS CALL') TOMSGQ(QSYSOPR) +
MSGTYPE(*INFO)
ENDPGM
參考資料 Retrieve System Status (QWCRSSTS) API
Retrieve System Status (QWCRSSTS) API
http://publib.boulder.ibm.com/pubs/html/as400/v5r1/ic2924/info/apis/qwcrssts.htm
2001-12-23 如何取得 AS/400 最近開機時間為何時?
如何取得 AS/400 最近開機時間為何時?
File : QCLSRC
Member : LASTIPLC
Type : CLP
藉由 QUSRJOBI API 檢核 System Job SCPF 的啟動時間,可以得知系統開機時間。
/* Program LASTIPLC */
PGM
DCL VAR(&DATA) TYPE(*CHAR) LEN(150)
DCL VAR(&BIN) TYPE(*CHAR) LEN(4) VALUE(X'00000096')
DCL VAR(&CEN) TYPE(*CHAR) LEN(1)
DCL VAR(&YY) TYPE(*CHAR) LEN(2)
DCL VAR(&MM) TYPE(*CHAR) LEN(2)
DCL VAR(&DD) TYPE(*CHAR) LEN(2)
DCL VAR(&HH) TYPE(*CHAR) LEN(2)
DCL VAR(&M) TYPE(*CHAR) LEN(2)
DCL VAR(&SS) TYPE(*CHAR) LEN(2)
DCL VAR(&FMT) TYPE(*CHAR) LEN(8) VALUE('JOBI0400')
DCL VAR(&JOB) TYPE(*CHAR) LEN(26) +
VALUE('SCPF QSYS 000000')
DCL VAR(&JOBI) TYPE(*CHAR) LEN(16)
CALL PGM(QUSRJOBI) PARM(&DATA &BIN &FMT &JOB &JOBI)
CHGVAR VAR(&CEN) VALUE(%SST(&DATA 63 1))
CHGVAR VAR(&YY) VALUE(%SST(&DATA 64 2))
CHGVAR VAR(&MM) VALUE(%SST(&DATA 66 2))
CHGVAR VAR(&DD) VALUE(%SST(&DATA 68 2))
CHGVAR VAR(&HH) VALUE(%SST(&DATA 70 2))
CHGVAR VAR(&M) VALUE(%SST(&DATA 72 2))
CHGVAR VAR(&SS) VALUE(%SST(&DATA 74 2))
SNDPGMMSG MSG('The system was last IPL''d on ' || &MM +
|| '/' || &DD || '/' || &YY || ' at ' || +
&HH || ':' || &M || ':' || &SS || '.')
END:
ENDPGM
2001-12-19 如何自動增加 DataBase Phyiscal File Size ?
如何自動增加 DataBase Phyiscal File Size ?
當使用者執行應用程式時,有時會遇到一個訊息"Record not added. Member FILENAME is full. (C I 9999)" ,
由於系統在產生資料庫檔案(Physical File)時,有參數 SIZE 預設值如下:
Member size: SIZE
Initial number of records . . 10000
Increment number of records . 1000
Maximum increments . . . . . . 3
您可在在產生資料庫檔案(Physical File)時,指定資料庫檔案(Physical File)的
初始筆數(Initial number of records),
當資料筆數到達初始筆數時,系統會依增加筆數容量(Increment number of records)自動增加,
系統同時紀錄可自動增加的次數是否到達所指定的最大增加次數(Maximum increments),
以預設值為例,預設資料筆數為 10000 筆,當資料到達 10000 筆時,系統會自動增加 1000 筆容量,
但自動增加的次數為 3 次,所以該資料庫檔案(Physical File)的最大容量為 13000 筆資料,當您的資料到達
13000 筆時,要再新增資料時系統就會發出"Record not added. Member FILENAME is full. (C I 9999)"訊息
,此時就需回覆此訊息 Cancel , Ignor , 0-9999
Cancel 取消
Ingore 忽略
0-9999 設定自動增加次數
當您回覆 Cancel 或 Ignore 時您的應用程式均無法繼續正常執行,要讓使用者繼續執行就必須回覆 0 - 9999
之間的值,以讓系統自動增加資料庫檔案(Physical File)的筆數。
當您回覆 Cancel 或 Ignore 時您亦可終止應用程式,並用 CHGPF 更改資料庫檔案(Physical File)的 SIZE 參數。
那要如何避免系統因為此種需擴大資料庫檔案(Physical File)的筆數而導致程式中斷的情形呢?
可使用系統自動回覆訊息功能,設定該訊息自動回覆如下:
下指令
WRKRPYLE 及 新增一個 message id CPA5305 自動回覆訊息
ADDRPYLE SEQNBR(100) MSGID(CPA5305) RPY(9999)
9999 為自動增加的次數,您可依需求設定一個適當值
使用此方法時,要注意若您的應用程式設計不當像新增資料時有無窮迴圈時,您的硬碟空間有被耗盡的可能,
而導致系統當機。
2001-12-15 工具: CHGSCDTIM 更改工作排程時間
工具: CHGSCDTIM 更改工作排程時間
The following source code was provided by Randy Gish .
It is the reader's responsibility to ensure that procedures and techniques
used from this code are accurate and appropriate for the user's installation.
No warranty is implied or expressed. Please back up your files before you run
a new procedure or program or make significant changes to disk files, and be
sure to test all procedures and programs before putting them into production.
CHGSCDTIM Command Source:
CMD PROMPT('Change Job Schedule Time')
PARM KWD(JOBNAM) TYPE(*NAME) LEN(10) MIN(1) +
PROMPT('Scheduled Job Name')
PARM KWD(INCREMENT) TYPE(*CHAR) LEN(6) MIN(1) +
PROMPT('Increment Time (HHMMSS)')
PARM KWD(CUTOFF) TYPE(*CHAR) LEN(6) +
PROMPT('Cutoff Time (HHMMSS)')
PARM KWD(RESET) TYPE(*CHAR) LEN(6) +
PROMPT('Reset Time (HHMMSS)')
PARM KWD(TIMVAL) TYPE(*CHAR) LEN(4) RSTD(*YES) +
DFT(*SCD) VALUES(*SCD *SYS) PROMPT('Time +
Value to Increment')
CHGSCDTIM Command Processing Program Source:
/* This program increments the scheduled time for a Job Schedule Entry. The */
/* increment, cutoff, and reset times should be passed as 'HHMMSS'. */
PGM PARM(&JOBSCDNAM &INCREMENT &CUTOFF &RESET &TIMVAL)
DCL VAR(&JOBSCDNAM) TYPE(*CHAR) LEN(10)
DCL VAR(&INCREMENT) TYPE(*CHAR) LEN(6)
DCL VAR(&CUTOFF) TYPE(*CHAR) LEN(6)
DCL VAR(&RESET) TYPE(*CHAR) LEN(6)
DCL VAR(&TIMVAL) TYPE(*CHAR) LEN(4)
DCL VAR(&USRSPC) TYPE(*CHAR) LEN(20) +
VALUE('CHGSCDTIM QTEMP ') /* USER +
SPACE NAME FOR APIS */
DCL VAR(&CNTHDL) TYPE(*CHAR) LEN(16) +
VALUE(' ') /* CONTINUATION +
HANDLE */
DCL VAR(&NUMENTB) TYPE(*CHAR) LEN(4) /* NUMBER +
OF ENTRIES FROM LIST JOB SCHEDULE ENTRIES +
IN BINARY FORM */
DCL VAR(&NUMENT) TYPE(*DEC) LEN(8 0) /* NUMBER +
OF ENTRIES FROM LIST JOB SCHEDULE ENTRIES +
IN DECIMAL FORM */
DCL VAR(&GENHDR) TYPE(*CHAR) LEN(140) /* GENERIC +
HEADER INFORMATION FROM THE USER SPACE */
DCL VAR(&LSTSTS) TYPE(*CHAR) LEN(1) /* STATUS OF +
THE LIST IN THE USER SPACE */
DCL VAR(&OFFSETB) TYPE(*CHAR) LEN(4) /* OFFSET +
TO THE LIST PORTION OF THE USER SPACE IN +
BINARY FORM */
DCL VAR(&STRPOSB) TYPE(*CHAR) LEN(4) /* STARTING +
POSITION IN THE USER SPACE IN BINARY FORM */
DCL VAR(&ELENB) TYPE(*CHAR) LEN(4) /* LIST JOB +
ENTRY LENGTH IN BINARY 4 FORM */
DCL VAR(&LENTRY) TYPE(*CHAR) LEN(1156) /* +
RETRIEVE AREA FOR LIST JOB SCHEDULE ENTRY */
DCL VAR(&INCHH) TYPE(*CHAR) LEN(2)
DCL VAR(&INCMM) TYPE(*CHAR) LEN(2)
DCL VAR(&INCSS) TYPE(*CHAR) LEN(2)
DCL VAR(&INCHH#) TYPE(*DEC) LEN(2 0)
DCL VAR(&INCMM#) TYPE(*DEC) LEN(2 0)
DCL VAR(&INCSS#) TYPE(*DEC) LEN(2 0)
DCL VAR(&SCDHH) TYPE(*CHAR) LEN(2)
DCL VAR(&SCDMM) TYPE(*CHAR) LEN(2)
DCL VAR(&SCDSS) TYPE(*CHAR) LEN(2)
DCL VAR(&SCDHH#) TYPE(*DEC) LEN(2 0)
DCL VAR(&SCDMM#) TYPE(*DEC) LEN(2 0)
DCL VAR(&SCDSS#) TYPE(*DEC) LEN(2 0)
DCL VAR(&SCDTIME) TYPE(*CHAR) LEN(6)
DCL VAR(&NEWHH#) TYPE(*DEC) LEN(3 0)
DCL VAR(&NEWMM#) TYPE(*DEC) LEN(3 0)
DCL VAR(&NEWSS#) TYPE(*DEC) LEN(3 0)
DCL VAR(&NEWTIME) TYPE(*CHAR) LEN(6)
DCL VAR(&SYSTIME) TYPE(*CHAR) LEN(6)
DCL VAR(&MSGID) TYPE(*CHAR) LEN(07)
DCL VAR(&MSGF) TYPE(*CHAR) LEN(10)
DCL VAR(&MSGL) TYPE(*CHAR) LEN(10)
DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132)
MONMSG MSGID(CPF0000 MCH0000) EXEC(GOTO CMDLBL(ERROR))
/* Delete the user space if it already exists. */
DLTUSRSPC USRSPC(QTEMP/CHGSCDTIM)
MONMSG MSGID(CPF0000)
/* Create the user space. The user space will be 256 bytes and */
/* will be initialized to blanks. */
CALL PGM(QUSCRTUS) PARM(&USRSPC 'CHGSCDTIM ' +
X'00000100' ' ' '*ALL ' 'TEMPORARY +
USER SPACE ')
MONMSG MSGID(CPF3C00) EXEC(GOTO CMDLBL(ERROR))
/* List the job schedule entry of the name specified. */
CALL PGM(QWCLSCDE) PARM(&USRSPC 'SCDL0200' +
&JOBSCDNAM &CNTHDL 0)
/* Retrieve the generic header from the user space. */
CALL PGM(QUSRTVUS) PARM(&USRSPC X'00000001' +
X'0000008C' &GENHDR)
MONMSG MSGID(CPF3C00) EXEC(GOTO CMDLBL(ERROR))
/* Get the information status for the list from the generic header. */
CHGVAR VAR(&LSTSTS) VALUE(%SST(&GENHDR 104 1))
IF COND(&LSTSTS = 'I') THEN(GOTO CMDLBL(ENDPGM))
/* Get the number of entries returned and convert to decimal. */
/* If zero, go to ENDPGM. */
CHGVAR VAR(&NUMENTB) VALUE(%SST(&GENHDR 133 4))
CHGVAR VAR(&NUMENT) VALUE(%BIN(&NUMENTB))
IF COND(&NUMENT = 0) THEN(GOTO CMDLBL(ENDPGM))
/* Get the list entry length and offset. These values are used to */
/* set up the starting position. */
CHGVAR VAR(&ELENB) VALUE(%SST(&GENHDR 137 4))
CHGVAR VAR(&OFFSETB) VALUE(%SST(&GENHDR 125 4))
CHGVAR VAR(%BIN(&STRPOSB)) VALUE(%BIN(&OFFSETB) + 1)
/* Retrieve the list entry. */
CALL PGM(QUSRTVUS) PARM(&USRSPC &STRPOSB &ELENB +
&LENTRY)
MONMSG MSGID(CPF3C00) EXEC(GOTO CMDLBL(ERROR))
/* Retrieve the scheduled time if TIMVAL = *SCD */
IF COND(&TIMVAL = '*SCD') +
THEN(DO)
CHGVAR VAR(&SCDHH) VALUE(%SST(&LENTRY 102 2))
CHGVAR VAR(&SCDMM) VALUE(%SST(&LENTRY 104 2))
CHGVAR VAR(&SCDSS) VALUE(%SST(&LENTRY 106 2))
CHGVAR VAR(&SCDHH#) VALUE(&SCDHH)
CHGVAR VAR(&SCDMM#) VALUE(&SCDMM)
CHGVAR VAR(&SCDSS#) VALUE(&SCDSS)
CHGVAR VAR(&SCDTIME) VALUE(&SCDHH || &SCDMM || +
&SCDSS)
ENDDO
/* Parse current time if TIMVAL = *SYS */
IF COND(&TIMVAL = '*SYS') +
THEN(DO)
RTVSYSVAL SYSVAL(QTIME) RTNVAR(&SYSTIME)
CHGVAR VAR(&SCDHH) VALUE(%SST(&SYSTIME 1 2))
CHGVAR VAR(&SCDMM) VALUE(%SST(&SYSTIME 3 2))
CHGVAR VAR(&SCDSS) VALUE(%SST(&SYSTIME 5 2))
CHGVAR VAR(&SCDHH#) VALUE(&SCDHH)
CHGVAR VAR(&SCDMM#) VALUE(&SCDMM)
CHGVAR VAR(&SCDSS#) VALUE(&SCDSS)
CHGVAR VAR(&SCDTIME) VALUE(&SCDHH || &SCDMM || +
&SCDSS)
ENDDO
/* Parse increment time */
CHGVAR VAR(&INCHH) VALUE(%SST(&INCREMENT 1 2))
CHGVAR VAR(&INCMM) VALUE(%SST(&INCREMENT 3 2))
CHGVAR VAR(&INCSS) VALUE(%SST(&INCREMENT 5 2))
CHGVAR VAR(&INCHH#) VALUE(&INCHH)
CHGVAR VAR(&INCMM#) VALUE(&INCMM)
CHGVAR VAR(&INCSS#) VALUE(&INCSS)
/* Calculate new scheduled time */
CHGVAR VAR(&NEWHH#) VALUE(&SCDHH# + &INCHH#)
CHGVAR VAR(&NEWMM#) VALUE(&SCDMM# + &INCMM#)
CHGVAR VAR(&NEWSS#) VALUE(&SCDSS# + &INCSS#)
IF COND(&NEWSS# >= 60) +
THEN(DO)
CHGVAR VAR(&NEWSS#) VALUE(&NEWSS# - 60)
CHGVAR VAR(&NEWMM#) VALUE(&NEWMM# + 1)
ENDDO
IF COND(&NEWMM# >= 60) +
THEN(DO)
CHGVAR VAR(&NEWMM#) VALUE(&NEWMM# - 60)
CHGVAR VAR(&NEWHH#) VALUE(&NEWHH# + 1)
ENDDO
IF COND(&NEWHH# >= 24) +
THEN(DO)
CHGVAR VAR(&NEWHH#) VALUE(&NEWHH# - 24)
ENDDO
CHGVAR VAR(&SCDHH#) VALUE(&NEWHH#)
CHGVAR VAR(&SCDMM#) VALUE(&NEWMM#)
CHGVAR VAR(&SCDSS#) VALUE(&NEWSS#)
CHGVAR VAR(&SCDHH) VALUE(&SCDHH#)
CHGVAR VAR(&SCDMM) VALUE(&SCDMM#)
CHGVAR VAR(&SCDSS) VALUE(&SCDSS#)
CHGVAR VAR(&NEWTIME) VALUE(&SCDHH || &SCDMM || +
&SCDSS)
/* Check if new time exceeds cutoff time */
IF COND(&CUTOFF *NE ' ' *AND &RESET *NE ' ' +
*AND (&NEWTIME *LT &SCDTIME *OR &NEWTIME +
*GE &CUTOFF)) THEN(CHGVAR VAR(&NEWTIME) +
VALUE(&RESET))
/* Update job schedule entry */
CHGJOBSCDE JOB(&JOBSCDNAM) SCDTIME(&NEWTIME)
GOTO CMDLBL(ENDPGM)
ERROR: RCVMSG MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +
MSGFLIB(&MSGL)
MONMSG MSGID(CPF0000)
SNDPGMMSG MSGID(&MSGID) MSGF(&MSGL/&MSGF) +
MSGDTA(&MSGDTA) MSGTYPE(*ESCAPE)
MONMSG MSGID(CPF0000)
ENDPGM: DLTUSRSPC USRSPC(QTEMP/CHGSCDTIM)
MONMSG MSGID(CPF0000)
ENDPGM
CHGSCDTIM Command Validity Checker Source:
/* This program is the validity checker for the CHGSCDTIM (Change Schedule */
/* Time) command. It verifies that the job exists and that the increment, */
/* cutoff, and reset times are valid. */
PGM PARM(&JOBSCDNAM &INCREMENT &CUTOFF &RESET &TIMVAL)
DCL VAR(&JOBSCDNAM) TYPE(*CHAR) LEN(10)
DCL VAR(&INCREMENT) TYPE(*CHAR) LEN(6)
DCL VAR(&CUTOFF) TYPE(*CHAR) LEN(6)
DCL VAR(&RESET) TYPE(*CHAR) LEN(6)
DCL VAR(&TIMVAL) TYPE(*CHAR) LEN(4)
DCL VAR(&USRSPC) TYPE(*CHAR) LEN(20) +
VALUE('CHGSCDTIM QTEMP ') /* USER +
SPACE NAME FOR APIS */
DCL VAR(&CNTHDL) TYPE(*CHAR) LEN(16) +
VALUE(' ') /* CONTINUATION +
HANDLE */
DCL VAR(&NUMENTB) TYPE(*CHAR) LEN(4) /* NUMBER +
OF ENTRIES FROM LIST JOB SCHEDULE ENTRIES +
IN BINARY FORM */
DCL VAR(&NUMENT) TYPE(*DEC) LEN(8 0) /* NUMBER +
OF ENTRIES FROM LIST JOB SCHEDULE ENTRIES +
IN DECIMAL FORM */
DCL VAR(&GENHDR) TYPE(*CHAR) LEN(140) /* GENERIC +
HEADER INFORMATION FROM THE USER SPACE */
DCL VAR(&LSTSTS) TYPE(*CHAR) LEN(1) /* STATUS OF +
THE LIST IN THE USER SPACE */
DCL VAR(&OFFSETB) TYPE(*CHAR) LEN(4) /* OFFSET +
TO THE LIST PORTION OF THE USER SPACE IN +
BINARY FORM */
DCL VAR(&STRPOSB) TYPE(*CHAR) LEN(4) /* STARTING +
POSITION IN THE USER SPACE IN BINARY FORM */
DCL VAR(&ELENB) TYPE(*CHAR) LEN(4) /* LIST JOB +
ENTRY LENGTH IN BINARY 4 FORM */
DCL VAR(&LENTRY) TYPE(*CHAR) LEN(1156) /* +
RETRIEVE AREA FOR LIST JOB SCHEDULE ENTRY */
DCL VAR(&HH) TYPE(*CHAR) LEN(2)
DCL VAR(&MM) TYPE(*CHAR) LEN(2)
DCL VAR(&SS) TYPE(*CHAR) LEN(2)
DCL VAR(&MSGID) TYPE(*CHAR) LEN(07)
DCL VAR(&MSGF) TYPE(*CHAR) LEN(10)
DCL VAR(&MSGL) TYPE(*CHAR) LEN(10)
DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132)
MONMSG MSGID(CPF0000 MCH0000) EXEC(GOTO CMDLBL(ERROR))
/* Delete the user space if it already exists. */
DLTUSRSPC USRSPC(QTEMP/CHGSCDTIM)
MONMSG MSGID(CPF0000)
/* Create the user space. The user space will be 256 bytes and */
/* will be initialized to blanks. */
CALL PGM(QUSCRTUS) PARM(&USRSPC 'CHGSCDTIM ' +
X'00000100' ' ' '*ALL ' 'TEMPORARY +
USER SPACE ')
MONMSG MSGID(CPF3C00) EXEC(GOTO CMDLBL(ERROR))
/* List the job schedule entry of the name specified. */
CALL PGM(QWCLSCDE) PARM(&USRSPC 'SCDL0200' +
&JOBSCDNAM &CNTHDL 0)
/* Retrieve the generic header from the user space. */
CALL PGM(QUSRTVUS) PARM(&USRSPC X'00000001' +
X'0000008C' &GENHDR)
MONMSG MSGID(CPF3C00) EXEC(GOTO CMDLBL(ERROR))
/* Get the information status for the list from the generic header. */
CHGVAR VAR(&LSTSTS) VALUE(%SST(&GENHDR 104 1))
IF COND(&LSTSTS = 'I') THEN(GOTO CMDLBL(ENDPGM))
/* Get the number of entries returned and convert to decimal. */
/* If zero, send error message and exit. */
CHGVAR VAR(&NUMENTB) VALUE(%SST(&GENHDR 133 4))
CHGVAR VAR(&NUMENT) VALUE(%BIN(&NUMENTB))
IF COND(&NUMENT = 0) +
THEN(DO)
SNDPGMMSG MSGID(CPD0006) MSGF(QCPFMSG) MSGDTA('0000 +
Job name ' *CAT &JOBSCDNAM *TCAT ' not found +
on Job Schedule.') MSGTYPE(*DIAG)
SNDPGMMSG MSGID(CPF0002) MSGF(QCPFMSG) MSGTYPE(*ESCAPE)
GOTO CMDLBL(ENDPGM)
ENDDO
/* Get the list entry length and offset. These values are used to */
/* set up the starting position. */
CHGVAR VAR(&ELENB) VALUE(%SST(&GENHDR 137 4))
CHGVAR VAR(&OFFSETB) VALUE(%SST(&GENHDR 125 4))
CHGVAR VAR(%BIN(&STRPOSB)) VALUE(%BIN(&OFFSETB) + 1)
/* Retrieve the list entry. */
CALL PGM(QUSRTVUS) PARM(&USRSPC &STRPOSB &ELENB +
&LENTRY)
MONMSG MSGID(CPF3C00) EXEC(GOTO CMDLBL(ERROR))
IF COND(%SST(&LENTRY 2 10) *NE &JOBSCDNAM) +
THEN(DO)
SNDPGMMSG MSGID(CPD0006) MSGF(QCPFMSG) MSGDTA('0000 +
Job name ' *CAT &JOBSCDNAM *TCAT ' not found +
on Job Schedule.') MSGTYPE(*DIAG)
SNDPGMMSG MSGID(CPF0002) MSGF(QCPFMSG) MSGTYPE(*ESCAPE)
GOTO CMDLBL(ENDPGM)
ENDDO
/* Check increment time */
CHGVAR VAR(&HH) VALUE(%SST(&INCREMENT 1 2))
CHGVAR VAR(&MM) VALUE(%SST(&INCREMENT 3 2))
CHGVAR VAR(&SS) VALUE(%SST(&INCREMENT 5 2))
IF COND(&HH *LT '00' *OR &HH *GT '23' *OR +
&MM *LT '00' *OR &MM *GT '59' *OR +
&SS *LT '00' *OR &SS *GT '59') +
THEN(DO)
SNDPGMMSG MSGID(CPD0006) MSGF(QCPFMSG) MSGDTA('0000 +
Increment time is not valid.') MSGTYPE(*DIAG)
SNDPGMMSG MSGID(CPF0002) MSGF(QCPFMSG) MSGTYPE(*ESCAPE)
ENDDO
/* Check cutoff time */
IF COND(&CUTOFF *NE ' ') +
THEN(DO)
CHGVAR VAR(&HH) VALUE(%SST(&CUTOFF 1 2))
CHGVAR VAR(&MM) VALUE(%SST(&CUTOFF 3 2))
CHGVAR VAR(&SS) VALUE(%SST(&CUTOFF 5 2))
IF COND(&HH *LT '00' *OR &HH *GT '24' *OR +
&MM *LT '00' *OR &MM *GT '59' *OR +
&SS *LT '00' *OR &SS *GT '59') +
THEN(DO)
SNDPGMMSG MSGID(CPD0006) MSGF(QCPFMSG) MSGDTA('0000 +
Cutoff time is not valid.') MSGTYPE(*DIAG)
SNDPGMMSG MSGID(CPF0002) MSGF(QCPFMSG) MSGTYPE(*ESCAPE)
ENDDO
/* Check reset time */
CHGVAR VAR(&HH) VALUE(%SST(&RESET 1 2))
CHGVAR VAR(&MM) VALUE(%SST(&RESET 3 2))
CHGVAR VAR(&SS) VALUE(%SST(&RESET 5 2))
IF COND(&HH *LT '00' *OR &HH *GT '23' *OR +
&MM *LT '00' *OR &MM *GT '59' *OR +
&SS *LT '00' *OR &SS *GT '59') +
THEN(DO)
SNDPGMMSG MSGID(CPD0006) MSGF(QCPFMSG) MSGDTA('0000 +
Reset time is not valid.') MSGTYPE(*DIAG)
SNDPGMMSG MSGID(CPF0002) MSGF(QCPFMSG) MSGTYPE(*ESCAPE)
ENDDO
ENDDO
GOTO CMDLBL(ENDPGM)
ERROR:
RCVMSG MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +
MSGFLIB(&MSGL)
MONMSG MSGID(CPF0000)
SNDPGMMSG MSGID(&MSGID) MSGF(&MSGL/&MSGF) +
MSGDTA(&MSGDTA) MSGTYPE(*ESCAPE)
MONMSG MSGID(CPF0000)
ENDPGM: DLTUSRSPC USRSPC(QTEMP/CHGSCDTIM)
MONMSG MSGID(CPF0000)
ENDPGM
CHGSCDTIM Help Panel Group Source:
:PNLGRP.
:HELP name=CHGSCDTIMP.
:P.
The "Change Job Schedule Time" (CHGSCDTIM) command increments the
schedule time for a job on the AS/400 job scheduler. This enables
you to submit a job from the scheduler on a periodic basis of less
than a day (e.g., every hour or every 15 minutes). Simply run the
CHGSCDTIM command from your program that is called by the scheduler
and specify the job name and the increment time in HHMMSS format.
The schedule time for the job will be incremented by the amount of
time you specified. You can increment the currently scheduled time
or the current system time. You can also optionally specify a cutoff
and reset time. This would enable you to run a job periodically
within certain times each day (e.g., every hour from 8:00 a.m. to
8:00 p.m.).
:EHELP.
:HELP name='CHGSCDTIMP/JOBNAM'.
:P.
Scheduled Job Name:
:LINES.
This is the name of the job as you defined it on
the job scheduler.
:ELINES.
:EHELP.
:HELP name='CHGSCDTIMP/INCREMENT'.
:P.
Increment time:
:LINES.
This is the amount of time you would like to increment
the scheduled job. The format is HHMMSS.
:ELINES.
:EHELP.
:HELP name='CHGSCDTIMP/CUTOFF'.
:P.
Cutoff time:
:LINES.
This is the time of day you would like to stop
incrementing the job. The format is HHMMSS. If a
cutoff time is specified, a reset time is required.
:ELINES.
:EHELP.
:HELP name='CHGSCDTIMP/RESET'.
:P.
Reset time:
:LINES.
This is the time of day you would like to restart the
job. The format is HHMMSS. A reset time is required
if a cutoff time is specified.
:ELINES.
:EHELP.
:HELP name='CHGSCDTIMP/TIMVAL'.
:P.
Time value:
:LINES.
This is the time value that you would like to
increment. *SCD will increment the time on the
scheduler. *SYS will set the schedule time to
the current time plus the increment.
:ELINES.
:EHELP.
:EPNLGRP.
The following CL program can be used to create the CHGSCDTIM command.
The program assumes that the source is in QGPL/CSTCMDSRC:
PGM
DCL VAR(&LIBRARY) TYPE(*CHAR) LEN(10) VALUE('QGPL')
DCL VAR(&SRCFILE) TYPE(*CHAR) LEN(10) VALUE('CSTCMDSRC')
/* Create Command Processing Program */
CRTCLPGM PGM(&LIBRARY/CHGSCDTIMC) SRCFILE(&LIBRARY/&SRCFILE)
/* Create Validity Checker Program */
CRTCLPGM PGM(&LIBRARY/CHGSCDTIMV) SRCFILE(&LIBRARY/&SRCFILE)
/* Create Help Panel Group */
CRTPNLGRP PNLGRP(&LIBRARY/CHGSCDTIMP) +
SRCFILE(&LIBRARY/&SRCFILE)
/* Create Change Job Schedule Time Command */
CRTCMD CMD(&LIBRARY/CHGSCDTIM) PGM(&LIBRARY/CHGSCDTIMC) +
SRCFILE(&LIBRARY/&SRCFILE) +
VLDCKR(&LIBRARY/CHGSCDTIMV) +
HLPPNLGRP(&LIBRARY/CHGSCDTIMP) HLPID(CHGSCDTIMP)
ENDPGM
2001-11-14 工具:CHGNETAPOP
工具:CHGNETAPOP
當使用指令 CHGNETA 時,有許多參數值均是顯示“*SAME“,若您要知道現有設定值為何值時,
您就須執行 DSPNETA 顯示 AS/400 網路屬性,如此ㄧ來顯得很麻煩,可利用 AS/400 指令參數 PMTOVRPGM,
設定指令顯示時的初設值,底下範例供您參考,您可依 AS/400 的版本更改成您自己的版本。
File : QCLSRC
Member : CHGNETAPOP
Type : CLP
Usage : CRTCLPGM PGM(QUSRSYS/CHGNETAPOP)
CHGCMD CMD(QSYS/CHGNETA) PMTOVRPGM(QUSRSYS/CHGNETAPOP)
/*********************************************************************/
/* Program Name: CHGNETAPOP Network Attributes prompt override pgm */
/* Source Name : QGPL/QCLSRC(CHGNETAPOP) */
/* Used By : QSYS/CHGNETA *CMD */
/* Requires : Nothing */
/* Written By : Syed Hussain Akbar */
/* Organisation: Systems (Pvt) Ltd */
/* Date Written: May 18th, 1995 */
/* OS Version : V2 Release 3 */
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/* Modified By :Vengoal Chang */
/* Date Modified:Nov 14th, 2001 */
/* OS Version :V4 Release 4 */
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/* Description : */
/* This is the prompt override program which fills */
/* the parameters of the CHGNETA command. */
/* */
/* CHGCMD CMD(QSYS/CHGNETA) PMTOVRPGM(QUSRSYS/CHGNETAPOP) */
/*********************************************************************/
PGM PARM(&CMDNAME &RETCMD)
DCL VAR(&CMDNAME) TYPE(*CHAR) LEN(20)
DCL VAR(&RETCMD) TYPE(*CHAR) LEN(5700)
DCL VAR(&RETLEN) TYPE(*DEC) LEN(5 0)
DCL VAR(&CRETLEN) TYPE(*CHAR) LEN(2)
DCL VAR(&INUM) TYPE(*DEC) LEN(2)
DCL VAR(&ISTART) TYPE(*DEC) LEN(2)
DCL VAR(&SYSNAME) TYPE(*CHAR) LEN(8)
DCL VAR(&LCLNETID) TYPE(*CHAR) LEN(8)
DCL VAR(&LCLCPNAME) TYPE(*CHAR) LEN(8)
DCL VAR(&LCLLOCNAME) TYPE(*CHAR) LEN(8)
DCL VAR(&DFTMODE) TYPE(*CHAR) LEN(8)
DCL VAR(&NODETYPE) TYPE(*CHAR) LEN(8)
DCL VAR(&DTACPR) TYPE(*DEC) LEN(10 0)
DCL VAR(&CDTACPR) TYPE(*CHAR) LEN(10)
DCL VAR(&DTACPRINM) TYPE(*DEC) LEN(10 0)
DCL VAR(&CDTACPRINM) TYPE(*CHAR) LEN(10)
DCL VAR(&MAXINTSSN) TYPE(*DEC) LEN(5 0)
DCL VAR(&CMAXINTSSN) TYPE(*CHAR) LEN(5)
DCL VAR(&RAR) TYPE(*DEC) LEN(5 0)
DCL VAR(&CRAR) TYPE(*CHAR) LEN(5)
DCL VAR(&NETSERVER) TYPE(*CHAR) LEN(85)
DCL VAR(&ALRSTS) TYPE(*CHAR) LEN(10)
DCL VAR(&ALRPRIFP) TYPE(*CHAR) LEN(10)
DCL VAR(&ALRDFTFP) TYPE(*CHAR) LEN(10)
DCL VAR(&ALRLOGSTS) TYPE(*CHAR) LEN(7)
DCL VAR(&ALRBCKFP) TYPE(*CHAR) LEN(16)
DCL VAR(&ALRRQSFP) TYPE(*CHAR) LEN(16)
DCL VAR(&ALRCTLD) TYPE(*CHAR) LEN(10)
DCL VAR(&ALRHLDCNT) TYPE(*DEC) LEN(5 0)
DCL VAR(&CALRHLDCNT) TYPE(*CHAR) LEN(5)
DCL VAR(&ALRFTR) TYPE(*CHAR) LEN(10)
DCL VAR(&ALRFTRLIB) TYPE(*CHAR) LEN(10)
DCL VAR(&MSGQ) TYPE(*CHAR) LEN(10)
DCL VAR(&MSGQLIB) TYPE(*CHAR) LEN(10)
DCL VAR(&OUTQ) TYPE(*CHAR) LEN(10)
DCL VAR(&OUTQLIB) TYPE(*CHAR) LEN(10)
DCL VAR(&JOBACN) TYPE(*CHAR) LEN(10)
DCL VAR(&MAXHOP) TYPE(*DEC) LEN(5 0)
DCL VAR(&CMAXHOP) TYPE(*CHAR) LEN(5)
DCL VAR(&DDMACC) TYPE(*CHAR) LEN(10)
DCL VAR(&DDMACCLIB) TYPE(*CHAR) LEN(10)
DCL VAR(&PCSACC) TYPE(*CHAR) LEN(10)
DCL VAR(&PCSACCLIB) TYPE(*CHAR) LEN(10)
DCL VAR(&DFTNETTYPE) TYPE(*CHAR) LEN(10)
DCL VAR(&DFTCNNLST) TYPE(*CHAR) LEN(10)
DCL VAR(&ALWANYNET) TYPE(*CHAR) LEN(10)
DCL VAR(&NWSDOMAIN) TYPE(*CHAR) LEN(8)
DCL VAR(&ALWVRTAPPN) TYPE(*CHAR) LEN(10)
DCL VAR(&ALWHPRTWR) TYPE(*CHAR) LEN(10)
DCL VAR(&VRTAUTODEV) TYPE(*DEC) LEN(5 0)
DCL VAR(&CVRTAUTODV) TYPE(*CHAR) LEN(5)
DCL VAR(&HPRPTHTMR) TYPE(*CHAR) LEN(40)
DCL VAR(&ALWADDCLU) TYPE(*CHAR) LEN(10)
DCL VAR(&MDMCNTRYID) TYPE(*CHAR) LEN(2)
/* Retrieve current parameters */
RTVNETA SYSNAME(&SYSNAME) LCLNETID(&LCLNETID) +
LCLCPNAME(&LCLCPNAME) +
LCLLOCNAME(&LCLLOCNAME) DFTMODE(&DFTMODE) +
NODETYPE(&NODETYPE) DTACPR(&DTACPR) +
DTACPRINM(&DTACPRINM) +
MAXINTSSN(&MAXINTSSN) RAR(&RAR) +
NETSERVER(&NETSERVER) ALRSTS(&ALRSTS) +
ALRPRIFP(&ALRPRIFP) ALRDFTFP(&ALRDFTFP) +
ALRLOGSTS(&ALRLOGSTS) ALRBCKFP(&ALRBCKFP) +
ALRRQSFP(&ALRRQSFP) ALRCTLD(&ALRCTLD) +
ALRHLDCNT(&ALRHLDCNT) ALRFTR(&ALRFTR) +
ALRFTRLIB(&ALRFTRLIB) MSGQ(&MSGQ) +
MSGQLIB(&MSGQLIB) OUTQ(&OUTQ) +
OUTQLIB(&OUTQLIB) JOBACN(&JOBACN) +
MAXHOP(&MAXHOP) DDMACC(&DDMACC) +
DDMACCLIB(&DDMACCLIB) PCSACC(&PCSACC) +
PCSACCLIB(&PCSACCLIB) +
DFTNETTYPE(&DFTNETTYPE) +
DFTCNNLST(&DFTCNNLST) +
ALWANYNET(&ALWANYNET) +
NWSDOMAIN(&NWSDOMAIN) +
ALWVRTAPPN(&ALWVRTAPPN) +
ALWHPRTWR(&ALWHPRTWR) +
VRTAUTODEV(&VRTAUTODEV) +
HPRPTHTMR(&HPRPTHTMR) +
ALWADDCLU(&ALWADDCLU) MDMCNTRYID(&MDMCNTRYID)
/* Convert the numeric variables to string to allow concatenation */
/* Also substitute the special values. */
CHGVAR VAR(&CDTACPR) VALUE(&DTACPR)
IF COND(&DTACPR *EQ 0) THEN(CHGVAR +
VAR(&CDTACPR) VALUE(*NONE))
IF COND(&DTACPR *EQ -1) THEN(CHGVAR +
VAR(&CDTACPR) VALUE(*REQUEST))
IF COND(&DTACPR *EQ -2) THEN(CHGVAR +
VAR(&CDTACPR) VALUE(*ALLOW))
IF COND(&DTACPR *EQ -3) THEN(CHGVAR +
VAR(&CDTACPR) VALUE(*REQUIRE))
CHGVAR VAR(&CDTACPRINM) VALUE(&DTACPRINM)
IF COND(&DTACPRINM *EQ 0) THEN(CHGVAR +
VAR(&CDTACPRINM) VALUE(*NONE))
IF COND(&DTACPRINM *EQ -1) THEN(CHGVAR +
VAR(&CDTACPRINM) VALUE(*REQUEST))
CHGVAR VAR(&CMAXINTSSN) VALUE(&MAXINTSSN)
CHGVAR VAR(&CRAR) VALUE(&RAR)
CHGVAR VAR(&CALRHLDCNT) VALUE(&ALRHLDCNT)
CHGVAR VAR(&CMAXHOP) VALUE(&MAXHOP)
CHGVAR VAR(&CVRTAUTODV) VALUE(&VRTAUTODEV)
CHGVAR VAR(&RETCMD) VALUE('?<SYSNAME(' |< &SYSNAME +
|< ') ')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<LCLNETID(' +
|< &LCLNETID |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<LCLCPNAME(' +
|< &LCLCPNAME |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<LCLLOCNAME(' +
|< &LCLLOCNAME |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<DFTMODE(' +
|< &DFTMODE |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<NODETYPE(' +
|< &NODETYPE |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<DTACPR(' +
|< &CDTACPR |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<DTACPRINM(' +
|< &CDTACPRINM |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<MAXINTSSN(' +
|< &CMAXINTSSN |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<RAR(' +
|< &CRAR |< ')')
/* Build the combined string for NETSERVER */
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<NETSERVER(')
CHGVAR VAR(&INUM) VALUE(1)
NET1: CHGVAR VAR(&ISTART) VALUE(((&INUM -1) * 17) + 1)
IF COND(%SST(&NETSERVER &ISTART 9) *NE ' ') +
THEN(DO)
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |< '(' |< +
%SST(&NETSERVER &ISTART 9))
CHGVAR VAR(&ISTART) VALUE(&ISTART + 9)
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> +
%SST(&NETSERVER &ISTART 8) |< ')')
CHGVAR VAR(&INUM) VALUE(&INUM + 1)
IF COND(&INUM *LT 6) THEN(GOTO CMDLBL(NET1))
ENDDO
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<ALRSTS(' +
|< &ALRSTS |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<ALRPRIFP(' +
|< &ALRPRIFP |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<ALRDFTFP(' +
|< &ALRDFTFP |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<ALRLOGSTS(' +
|< &ALRLOGSTS |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<ALRBCKFP(' +
|< %SST(&ALRBCKFP 1 8) |> %SST(&ALRBCKFP +
9 8) |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<ALRRQSFP(' +
|< %SST(&ALRRQSFP 1 8) |> %SST(&ALRRQSFP +
9 8) |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<ALRCTLD(' +
|< &ALRCTLD |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<ALRHLDCNT(' +
|< &CALRHLDCNT |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<ALRFTR(')
IF COND(&ALRFTRLIB *NE ' ') THEN(DO)
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |< &ALRFTRLIB |< +
'/')
ENDDO
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |< &ALRFTR |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<MSGQ(')
IF COND(&MSGQLIB *NE ' ') THEN(DO)
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |< &MSGQLIB |< '/')
ENDDO
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |< &MSGQ |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<OUTQ(')
IF COND(&OUTQLIB *NE ' ') THEN(DO)
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |< &OUTQLIB |< '/')
ENDDO
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |< &OUTQ |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<JOBACN(' +
|< &JOBACN |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<MAXHOP(' +
|< &CMAXHOP |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<DDMACC(')
IF COND(&DDMACCLIB *NE ' ') THEN(DO)
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |< &DDMACCLIB |< +
'/')
ENDDO
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |< &DDMACC |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<PCSACC(')
IF COND(&PCSACCLIB *NE ' ') THEN(DO)
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |< &PCSACCLIB |< +
'/')
ENDDO
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |< &PCSACC |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> +
'?<DFTNETTYPE(' |< &DFTNETTYPE |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<DFTCNNLST(' +
|< &DFTCNNLST |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<ALWANYNET(' +
|< &ALWANYNET |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<NWSDOMAIN(' +
|< &NWSDOMAIN |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<ALWVRTAPPN(' +
|< &ALWVRTAPPN |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<ALWHPRTWR(' +
|< &ALWHPRTWR |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<VRTAUTODEV(' +
|< &CVRTAUTODV |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<HPRPTHTMR(' +
|< &HPRPTHTMR |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<ALWADDCLU(' +
|< &ALWADDCLU |< ')')
CHGVAR VAR(&RETCMD) VALUE(&RETCMD |> '?<MDMCNTRYID(' +
|< &MDMCNTRYID |< ')')
/* Calculate size of the returned command line */
CHGVAR VAR(&RETLEN) VALUE(700)
CALCLEN: CHGVAR VAR(&RETLEN) VALUE(&RETLEN - 1)
IF COND(%SST(&RETCMD &RETLEN 1) *NE ' ') +
THEN(GOTO CMDLBL(CALCLEN))
CHGVAR VAR(%BIN(&CRETLEN)) VALUE(&RETLEN)
CHGVAR VAR(&RETCMD) VALUE(&CRETLEN |< &RETCMD)
ENDPGM
2001-11-08 如何將一份報表切割頁次列印(Command CPYSPLPAG Copy Spooled by Page Range)?
如何將一份報表切割頁次列印(Command CPYSPLPAG Copy Spooled by Page Range)?
有時候同一份報表頁數可能長達數百數千頁,此時使用者若僅要部份頁次或者需要傳輸某幾頁
報表,為了減輕網路的負擔,最好的方式就是切割使用者所要求的頁次,再做處理。這個工具
可指定重新列印原報表頁次區間。
Copy Spool by Page Range (CPYSPLPAG)
Type choices, press Enter.
Spool file name . . . . . . . . Name
Job name . . . . . . . . . . . . * Name, *
User name . . . . . . . . . . Name
Job number . . . . . . . . . . 000000-999999
Spool file number . . . . . . . *LAST 000001-999999, *ONLY, *LAST
Bottom
F3=Exit F4=Prompt F5=Refresh F10=Additional parameters F12=Cancel
F13=How to use this display F24=More keys
按 F10 可指定重印頁次區間。
Copy Spool by Page Range (CPYSPLPAG)
Type choices, press Enter.
Spool file name . . . . . . . . Name
Job name . . . . . . . . . . . . * Name, *
User name . . . . . . . . . . Name
Job number . . . . . . . . . . 000000-999999
Spool file number . . . . . . . *LAST 000001-999999, *ONLY, *LAST
Additional Parameters
Range of pages to copy:
Starting page . . . . . . . . *FIRST 1-9999, *FIRST, *LAST
Ending page . . . . . . . . . *LAST 1-9999, *LAST, *FIRST
Bottom
F3=Exit F4=Prompt F5=Refresh F12=Cancel F13=How to use this display
F24=More keys
-------------------------------------------------------------------------------
CPYSPLPAG command
File : QCMDSRC
Member : CPYSPLPAG
Type : CMD
/******************************************************************************/
/* */
/* System....... Utilities */
/* Program...... CPYSPLPAG - Copy Spool File BY Page Range */
/* Written by... Vengoal Cahng */
/* Date......... 11/08/2001 */
/* */
/* */
/* Program Description */
/* */
/* */
/* It can perform operations on the entire spool file or a specified */
/* Page range. */
/* */
/* */
/* NOTE: This Command does not handle AFPDS Spool Files. */
/* */
/* * * * * * * * * Indicator Usage * * * * * * * * * * * * * * * * */
/* */
/* */
/* */
/* * * * * * * * * Externally Called Programs * * * * * * * * * */
/* */
/* From/To Program-Id Parameters */
/* */
/* */
/* */
/* */
/* * * * * * * * * * * Maintenance Log * * * * * * * * * * * * */
/* */
/* Req # Date Programmer Modification Reason */
/* */
/*********************************************************************/
CMD PROMPT('Copy Spool by Page Range')
PARM KWD(FILE) TYPE(*NAME) LEN(10) MIN(1) +
EXPR(*YES) PROMPT('Spool file name')
PARM KWD(JOB) TYPE(QUAL1) SNGVAL(*) DFT(*) +
PROMPT('Job name')
PARM KWD(SPLNBR) TYPE(*DEC) LEN(6 0) DFT(*LAST) +
RANGE(000001 999999) SPCVAL((*ONLY -1) +
(*LAST -2)) PROMPT('Spool file number')
PARM KWD(PAGERANGE) TYPE(PAGELIST) +
PMTCTL(*PMTRQS) PROMPT('Range of pages +
to copy')
QUAL1: QUAL TYPE(*NAME) LEN(10) MIN(1) EXPR(*YES)
QUAL TYPE(*NAME) LEN(10) MIN(0) EXPR(*YES) +
PROMPT('User name')
QUAL TYPE(*CHAR) LEN(6) RANGE(000000 999999) +
MIN(0) FULL(*YES) PROMPT('Job number')
QUAL2: QUAL TYPE(*NAME) LEN(10) MIN(1)
QUAL TYPE(*NAME) LEN(10) MIN(1) +
EXPR(*YES) PROMPT('Library name')
PAGELIST: ELEM TYPE(*INT2) DFT(*FIRST) RANGE(1 9999) +
SPCVAL((*FIRST -2) (*LAST -1)) +
PROMPT('Starting page')
ELEM TYPE(*INT2) DFT(*LAST) RANGE(1 9999) +
SPCVAL((*LAST -1) (*FIRST -2)) +
PROMPT('Ending page')
File : QCLSRC
Member : CPYSPLPAGC
Type : CLP
/*********************************************************************/
/* */
/* System ........... Utilities */
/* Program........... CPYSPLPAGC Program to copy spool file to text */
/* Written by........ Vengoal Cahng */
/* Date.............. Nov 8, 2001 */
/* */
/* */
/* Program Description */
/* */
/* It can perform operations on the entire spool file or a specified */
/* Page range. */
/* */
/* */
/* NOTE: This program does not handle AFPDS Spool Files. */
/* */
/* Parameters: */
/* NAME I/O DESCRIPTION COMMENTS */
/* &FILE Input Spool file Spool file to copy */
/* &FULLJOB Input Job name Spool file job */
/* &SPLNBR Input Spool nbr Spool file number */
/* &PAGRNG Input Page Range Page Range to Print */
/* * * * * * * * * * * * Maintenance Log * * * * * * * * * * * * * * */
/* */
/* Req#. Date Programmer Modification Reason */
/* */
/*********************************************************************/
PGM PARM(&FILE &FULLJOB &SPLNBR &PAGRNG)
DCL &FILE *CHAR LEN(10)
DCL &FULLJOB *CHAR LEN(26)
DCL &JOB *CHAR LEN(10)
DCL &USER *CHAR LEN(10)
DCL &JOBNBR *CHAR LEN(6)
DCL &SPLNBR *DEC LEN(6 0)
DCL &PAGRNG *CHAR LEN(6)
DCL &ERRORSW *LGL /* Standard error */
DCL &MSGID *CHAR LEN(7) /* Standard error */
DCL &MSG *CHAR LEN(512) /* Standard error */
DCL &MSGDTA *CHAR LEN(512) /* Standard error */
DCL &MSGF *CHAR LEN(10) /* Standard error */
DCL &MSGFLIB *CHAR LEN(10) /* Standard error */
DCL &KEYVAR *CHAR LEN(4) /* Standard error */
DCL &KEYVAR2 *CHAR LEN(4) /* Standard error */
DCL &RTNTYPE *CHAR LEN(2) /* Standard error */
DCL VAR(&FRPAGE) TYPE(*DEC) LEN(7 0)
DCL VAR(&TOPAGE) TYPE(*DEC) LEN(7 0)
DCL VAR(&SPLFDS) TYPE(*CHAR) LEN(1000)
DCL VAR(&DSLENB) TYPE(*CHAR) LEN(4)
DCL VAR(&INTJOB) TYPE(*CHAR) LEN(16)
DCL VAR(&INTSPLF) TYPE(*CHAR) LEN(16)
DCL VAR(&SPLNBRA) TYPE(*CHAR) LEN(6)
DCL VAR(&SPLNBRB) TYPE(*CHAR) LEN(4)
DCL VAR(&NBRPGSB) TYPE(*CHAR) LEN(4)
DCL VAR(&NBRPGS) TYPE(*DEC) LEN(9 0)
DCL VAR(&CPIB) TYPE(*CHAR) LEN(4)
DCL VAR(&CPI) TYPE(*DEC) LEN(9 1)
DCL VAR(&PAGWTHB) TYPE(*CHAR) LEN(4)
DCL VAR(&PAGWTH) TYPE(*DEC) LEN(9 0)
MONMSG MSGID(CPF0000) EXEC(GOTO STDERR1) /* Std err */
CHGVAR &JOB %SST(&FULLJOB 1 10)
CHGVAR &USER %SST(&FULLJOB 11 10)
CHGVAR &JOBNBR %SST(&FULLJOB 21 6)
CHGVAR VAR(&SPLNBRA) VALUE(&SPLNBR)
DLTOVR FILE(INPUT)
MONMSG CPF0000
DLTF FILE(QTEMP/SPLTEMP)
MONMSG MSGID(CPF2105) /* file not found */
CRTPF FILE(QTEMP/SPLTEMP) RCDLEN(220) IGCDTA(*YES)
IF COND(&SPLNBR *EQ -2) THEN(DO)
CHGVAR VAR(&SPLNBRA) VALUE('*LAST')
ENDDO
IF COND(&SPLNBR *EQ -1) THEN(DO)
CHGVAR VAR(&SPLNBRA) VALUE('*ONLY')
ENDDO
IF (&FULLJOB *EQ '*') DO /* Use current job */
CPYSPLF FILE(&FILE) TOFILE(QTEMP/SPLTEMP) +
SPLNBR(&SPLNBRA) MBROPT(*ADD) +
CTLCHAR(*PRTCTL)
ENDDO /* Use current job */
IF (&FULLJOB *NE '*') DO /* Specific job name */
IF (&USER *EQ ' ') CHGVAR &USER '*N'
IF (&JOBNBR *EQ ' ') CHGVAR &JOBNBR '*N'
CPYSPLF FILE(&FILE) TOFILE(QTEMP/SPLTEMP) +
JOB(&JOBNBR/&USER/&JOB) SPLNBR(&SPLNBRA) +
MBROPT(*ADD) +
CTLCHAR(*PRTCTL)
ENDDO /* Specific job name used */
IF COND(&SPLNBR *EQ -2) THEN(DO)
CHGVAR VAR(&SPLNBR) VALUE(-1) /* *LAST */
ENDDO
ELSE DO
IF COND(&SPLNBR *EQ -1) THEN(DO)
CHGVAR VAR(&SPLNBR) VALUE(0) /* *ONLY */
ENDDO
ENDDO
/* Build work variables used for parameters to attribute API. */
CHGVAR VAR(&DSLENB) VALUE(X'000003E8') /* Change +
length to the hex form of '1000' */
CHGVAR VAR(%BIN(&SPLNBRB 1 4)) VALUE(&SPLNBR)
/* Call API */
CALL PGM(QUSRSPLA) PARM(&SPLFDS &DSLENB +
'SPLA0100' &FULLJOB &INTJOB &INTSPLF &FILE +
&SPLNBRB)
/* Retrieve results: */
CHGVAR VAR(&NBRPGSB) VALUE(%SST(&SPLFDS 141 4))
CHGVAR VAR(&NBRPGS) VALUE(%BIN(&NBRPGSB 1 4))
CHGVAR VAR(&CPIB) VALUE(%SST(&SPLFDS 177 4))
CHGVAR VAR(&CPI) VALUE(%BIN(&CPIB 1 4))
CHGVAR VAR(&CPI) VALUE(&CPI / 10)
CHGVAR VAR(&PAGWTHB) VALUE(%SST(&SPLFDS 429 4))
CHGVAR VAR(&PAGWTH) VALUE(%BIN(&PAGWTHB 1 4))
CHGVAR VAR(&FRPAGE) VALUE(%BIN(&PAGRNG 3 2))
CHGVAR VAR(&TOPAGE) VALUE(%BIN(&PAGRNG 5 2))
IF COND(&TOPAGE *GT &NBRPGS) THEN(DO)
SNDPGMMSG MSG('To Page cannot be greater than Total +
number of Pages')
GOTO RETN
ENDDO
IF COND(&FRPAGE *EQ 0) THEN(DO)
SNDPGMMSG MSG('From Page cannot be Zeros.')
GOTO RETN
ENDDO
IF COND(&TOPAGE *EQ 0) THEN(DO)
SNDPGMMSG MSG('To Page cannot be Zeros.')
GOTO RETN
ENDDO
IF COND(&TOPAGE = -2) THEN(CHGVAR VAR(&TOPAGE) +
VALUE(1))
IF COND(&FRPAGE = -2) THEN(CHGVAR VAR(&FRPAGE) +
VALUE(1))
IF COND(&TOPAGE = -1) THEN(CHGVAR VAR(&TOPAGE) +
VALUE(&NBRPGS))
IF COND(&FRPAGE = -1) THEN(CHGVAR VAR(&FRPAGE) +
VALUE(&NBRPGS))
IF COND(&FRPAGE *GT &TOPAGE) THEN(DO)
SNDPGMMSG MSG('From Page cannot be greater than to +
Page.')
GOTO RETN
ENDDO
PRINT:
OVRDBF FILE(INPUT) TOFILE(QTEMP/SPLTEMP)
OVRPRTF FILE(QPRINT) PAGESIZE(*N &PAGWTH) CPI(&CPI) +
SPLFNAME(&FILE) IGCDTA(*YES)
CALL PGM(CPYSPLPAGR) PARM(&FRPAGE &TOPAGE )
DLTOVR INPUT
DLTOVR QPRINT
RMVMSG CLEAR(*ALL)
SNDPGMMSG MSG('Spooled file ' *CAT &FILE *TCAT ' has +
been reprinted.') MSGTYPE(*COMP)
RETN:
RETURN /* Normal end for MODIFY(*YES) */
STDERR1: /* Standard error handling routine */
IF &ERRORSW SNDPGMMSG MSGID(CPF9999) +
MSGF(QCPFMSG) MSGTYPE(*ESCAPE)
CHGVAR &ERRORSW '1' /* Set to fail on error */
RCVMSG MSGTYPE(*EXCP) RMV(*NO) KEYVAR(&KEYVAR)
STDERR2: RCVMSG MSGTYPE(*PRV) MSGKEY(&KEYVAR) RMV(*NO) +
KEYVAR(&KEYVAR2) MSG(&MSG) MSGDTA(&MSGDTA) +
MSGID(&MSGID) RTNTYPE(&RTNTYPE) +
MSGF(&MSGF) SNDMSGFLIB(&MSGFLIB)
IF (&RTNTYPE *NE '02') GOTO STDERR3
IF (&MSGID *NE ' ') SNDPGMMSG MSGID(&MSGID) +
MSGF(&MSGFLIB/&MSGF) MSGDTA(&MSGDTA) +
MSGTYPE(*DIAG)
IF (&MSGID *EQ ' ') SNDPGMMSG MSG(&MSG) +
MSGTYPE(*DIAG)
RMVMSG MSGKEY(&KEYVAR2)
STDERR3: RCVMSG MSGKEY(&KEYVAR) MSGDTA(&MSGDTA) +
MSGID(&MSGID) MSGF(&MSGF) +
SNDMSGFLIB(&MSGFLIB)
SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
MSGDTA(&MSGDTA) MSGTYPE(*ESCAPE)
ENDPGM
File : QRPGLESRC
Member : CPYSPLPAGR
Type : RPGLE
H DEBUG OPTION(*SRCSTMT:*NODEBUGIO)
* RSTSPLFR - Copy text to spool - Called by RSTSPLFC
*
* PRTCTL Keyword : Data structure A(12)+S(3)
* Position contents
* 1-3 A(3) space-before blank or 0-255
* 4-6 A(3) space-after blank or 0-255
* 7-9 A(3) skip-before blank or 0-255
* 10-12 A(3) skip-after blank or 0-255
* 13-15 S(3) line count 3 digit numeric
* (zoned decimal)
*
FINPUT IP F 220 DISK
FQPRINT O F 198 PRINTER PRTCTL(LINE)
F OFLIND(*INOF)
*
D LINE DS 15
D SPCBFR 3 3
D SKPBFR 7 9
*****************************************************************
* Parameters
*****************************************************************
D WrkNum7 S 7P 0
D FrPage S Like(WrkNum7)
D ToPage S Like(WrkNum7)
D CurPage S Like(WrkNum7)
*****************************************************************
IINPUT AA 01
I 1 3 SKPBFR
I 4 4 SPCBFR
I 6 203 DATA
*****************************************************************
*** Parameters:
*****************************************************************
C *ENTRY Plist
C Parm FrPage
C Parm ToPage
C If SpcBfr = *Blanks
C Eval CurPage = CurPage + 1
C If CurPage >= FrPage and
C CurPage <= ToPage
C Move '1' *In90
C Else
C If CurPage > ToPage
C Move '0' *In90
C Move '1' *INLR
C EndIf
C EndIf
C EndIf
C 90 EXCEPT PRINT Print
OQPRINT E PRINT
O DATA 198
使用方法
1. CRTBNDRPG CPYSPLPAGR
2. CRTCLPGM CPYSPLPAGC
3. CRTCMD CMD(CPYSPLPAG) PGM(CPYSPLPAGC)
4. 於 Command Line 輸入 CPTSPLPAG 按 F4
再輸入相關參數。
2001-11-08 如何使 SQL 查詢結果加上顏色分類,以快速分辨所要的資料?
如何使 SQL 查詢結果加上顏色分類,以快速分辨所要的資料?
當我們觀看 SQL 的查詢結果時,我們無法得到警示性的圖形,如果我們想要查詢客戶的銷售狀況,
若能依不同的銷售量區間並給予各區間不同的顏色來顯示查詢結果,將會給予使用者較容易找到較
重要的警示性資料。
為了要在查詢結果中顯示不同的顏色,我們需要於顯示資料前加入顏色的屬性於欄位或行,我們所
用的屬性如下:
x'20' 正常 Normal
x'21' 反白 Reverse
x'22' 高亮度 HI
x'23' 高亮度反白 HI reverse
x'28' 紅色 Red
x'29' 紅色反白 Red reverse
x'2A' 閃爍 Blink
x'2B' 閃爍反白 Blink reverse
為了要定義警示性區間,我們使用 SQL CASE 指令,類似 RPG IV 的 CASE 指令
+-------------------------------------------------------------------------------+
| |
| |
| +-ELSE NULL---------------+ |
| >--CASE----searched-when-clause----+-------------------------+--END---------> |
| +-simple-when-clause---+ +-ELSE--result-expression-+ |
| |
| searched-when-clause: |
| <-----------------------------------------------------+ |
| +----WHEN--search-condition--THEN----result-expression----------------------| |
| +-NULL--------------+ |
| |
| simple-when-clause: |
| <-----------------------------------------------+ |
| +--expression----WHEN--expression--THEN----result-expression----------------| |
| +-NULL--------------+ |
| |
+-------------------------------------------------------------------------------+
在底下的例子中,我們顯示系統中檔案欄位數超過 100個的檔案,反白區是檔案欄位數超過 250 個,
紅色區是檔案欄位數超過 1000 個,紅色閃爍區是檔案欄位數超過 2500 個。
啟動 SQL --> STRSQL
Enter SQL Statements
Type SQL statement, press Enter.
===> SELECT CASE
WHEN count(*) > 2500 THEN (X'2A'||SYSTEM_TABLE_SCHEMA||X'28')
WHEN count(*) > 1000 THEN (X'28'||SYSTEM_TABLE_SCHEMA)
WHEN count(*) > 250 THEN (X'22'||SYSTEM_TABLE_SCHEMA)
else (' '||SYSTEM_TABLE_SCHEMA)
end AS LIB,
SYSTEM_TABLE_NAME AS TABLE,
COUNT(*) AS FIELDS
FROM QSYS2/SYSCOLUMNS
group by system_table_schema, system_table_name
having count(*) > 100
Bottom
F3=Exit F4=Prompt F6=Insert line F9=Retrieve F10=Copy line
F12=Cancel F13=Services F24=More keys
2001-11-07 如何顯示某些處理程序的百分比狀況?
如何顯示某些處理程序的百分比狀況?
某些程序可能需要較長的時間處理,例如 On-Line 處理大批資料時,系統僅顯示輸入暫停,
使用者根本不知道系統處理進度,也不知何時可以完成該項工作,往往會影響到使用者的工
作效率,所以在開發應用軟體時,針對耗時的程序,最好要考慮回應處理狀況給使用者。
File : QRPGLESRC
Member : PROGSMSGR
Type : RPGLE
Usage : CRTBNDRPG PROGSMSGR
Call PROGSMSGR
H DEBUG OPTION(*SRCSTMT:*NODEBUGIO)
*====================================================================*
* Progress Percentage Message *
*--------------------------------------------------------------------*
* *
* 2001/11 Vengoal Chang *
*--------------------------------------------------------------------*
Fimtmpf if e k disk infds(infdsx)
*---------------------------------------------------------------------
D infdsx ds
D NbrOfRcds 10i 0 overlay(infdsx:156)
D TwoPercent s 10u 0 inz(0)
D RecordCnt s 10u 0 inz(0)
D PercentComp s 10u 0 inz(0)
D InPrgVary s 50 varying
D InProgressMsg s 50
D ConstantPeriod s 50 inz(*all'.')
* -------------------------------------------------------------
D qmhsndpm PR ExtPgm('QMHSNDPM') SEND MESSAGES
D 7 const ID
D 20 const FILE
D 73 const TEXT
D 10i 0 const LENGTH
D 10 const TYPE
D 10 const QUEUE
D 10i 0 const STACK ENTRY
D 4 const KEY
Db like(vApiErrDS)
*----------------------------------------------------------------
D vApiErrDs ds
D vbytpv 10i 0 inz(%size(vApiErrDs)) bytes provided
D vbytav 10i 0 inz(0) bytes returned
D vmsgid 7a error msgid
D vresvd 1a reserved
D vrpldta 50a replacement data
C eval TwoPercent=%int((NbrOfRcds/100)*2)
C
C read imtmpf
C Dow not %eof
C exsr srInProgress
C read imtmpf
C Enddo
C eval *inLR = *on
* ---------------------------------------------------------------------
C srInProgress begsr
C eval RecordCnt = RecordCnt + 1
1B C if %rem(RecordCnt:TwoPercent)=0
C eval InPrgVary=InPrgVary+'>'
C eval InProgressMsg=InPrgVary+ConstantPeriod
C eval PercentComp=PercentComp+2
* Send status message
C callp QMHSNDPM(
C 'CPF9898':'QCPFMSG *LIBL ':
C %char(PercentComp) + '% completed: ' +
C InProgressMsg :
C 65:'*STATUS':'*EXT': 1:' ':
C vApiErrDS)
1E C endif
C endsr
您可將 File IMTMPF 改成您要處理的檔案再 Compile。
2001-11-05 如何讓您的 RPG 程式發出 beep 聲音?以提醒使用者某些工作已完成
如何讓您的 RPG 程式發出 beep 聲音?以提醒使用者某些工作已完成
FILE : QRPGLESRC
Member : BEEPR
Type : RPGLE
Usage : CRTBNDRPG BEEPR DFTACTGRP(*NO)
H DFTACTGRP(*NO) BNDDIR('QSNAPI')
Dbeep pr extproc('QsnBeep')
Dhandle 9b 0 value
Dhandle2 9b 0 value
Derrcode 10 OPTIONS(*OMIT)
Dreturn 9b 0 Options(*OMIT)
C callp(e) beep(0:0:*omit:*OMIT)
C eval *inlr = *on
參考資料
Generate a Beep (QsnBeep) API
http://publib.boulder.ibm.com/pubs/html/as400/v5r1/ic2924/info/apis/QsnBeep.htm
2001-10-22 如何從一文字(DDS A type)欄位擷取 Packed (DDS P type)形態的數字?
如何從一文字(DDS A type)欄位擷取 Packed (DDS P type)形態的數字?
有時候您的資料若是從其他較舊的系統如 S/36 或是從 IBM mainframe 上取得,
有可能某些欄位定義是文字格式,但是其內容為卻又是 Packed 形態的數字,那你
就必須依其應該有的格式將他轉為 Packed 形態的數字,才能用來處理計算式,或
直接將舊有資料轉為 AS/400 新格式以利後續處理。
底下的範例是,處理 2 位文字但其內含 3 位長度的 packed數字,有兩個函數,一
個是處理 3 位整數,沒有小數;而另一個函數是處理 1 位整數,兩位小數。
*--------------------------------------------------------------*
* Vengoal Chang Development Resource Copyright 2001.10 *
* *
* \\\\\\\ *
* ( o o ) *
*-------------------oOO----(_)----OOo--------------------------*
* *
* System name . . . : Technical Support *
* Text . . . . . . . : Convert Character filed to Packed Num *
* *
* Author . . . . . . : Vengoal Chang *
* *
* ooooO Ooooo *
* ( ) ( ) *
*-----------------( )-------------( )----------------------*/
* (_) (_) */
* */
* */
*Extracting Packed Data From A Character Field */
* */
* Complied with command CRTBNDRPG CVTCHR2PK */
* */
* Example : CALL CVTCHR2PK X'123F' will display 123 and 1.23 */
* CALL CVTCHR2PK X'1234' will display "Invalid" */
* CALL CVTCHR2PK X'123D' will display 123- and 1.23- */
* */
*--------------------------------------------------------------*/
H dftactgrp(*NO)
D GetDec_03_00 pr N
D charin 2 const
D pckout 3p 0
D GetDec_03_02 pr N
D charin 2 const
D pckout 3p 2
D packOut30 S 3p 0
D packOut32 S 3p 2
D tempStr S 20
D error S N
C *entry Plist
C Parm Char 2
C Eval Error= GetDec_03_00(Char : packOut30)
C If Not Error
C Eval tempStr = %editc(packOut30 : 'L')
C 'Packed 3,0' Dsply tempStr
C EndIf
C Eval Error= GetDec_03_02(Char : packOut32)
C If Not Error
C Eval tempStr = %editc(packOut32 : 'L')
C 'Packed 3,2' Dsply tempStr
C EndIf
C Eval *InLr = *On
*===========================================================
*Assume that a input field has a three-digit packed
*decimal values with zero decimal positions
*===========================================================
P GetDec_03_00 b export
D pi N
D charin 2 const
D pckout 3p 0
D charout ds 2
D decout 3p 0
D*--- PACKED FIELD MANIPULATION
D PCK S 1 DIM(16)
D PCKC S 16
D idx S 2 0 inz(1)
*-- PACKED NUMERIC DATA STRUCTURES
D PNUMD0 DS INZ
D PNUM0 1 16P 0
D PACKEVEN
D*-- VALID PACKED SIGNS
D C@PKSN c const(
D X'0F1F2F3F4F5F6F7F8F9F-
D 0D1D2D3D4D5D6D7D8D9D-
D 0C1C2C3C4C5C6C7C8C9C')
* calcs to verify that charin is valid packed data
C move charin PCKC
C Z-ADD *ZEROS PNUM0
C MOVEA PNUMD0 PCK
C MOVEA PCKC PCK
*-- CHECK EACH BYTE
C DO 16 idx
C PCK(idx) IFGE X'00'
C PCK(idx) ANDLE X'99'
C idx ANDNE 16
C ITER
C ENDIF
*
*-- ON THE LAST BYTE, CHECK FOR VALID SIGNS
C idx IFEQ 16
C C@PKSN CHECK PCK(idx) 80
C N80 LEAVE
C ENDIF
*
*-- INVALID DIGIT FOUND
*
C 'Invalid' Dsply
C ENDDO
C If *In80 = *Off
C eval charout = charin
C eval pckout = decout
C return *Off
C Else
C return *On
C EndIf
P e
*===========================================================
*Assume that a input field has a three-digit packed
*decimal values with two decimal positions
*===========================================================
P GetDec_03_02 b export
D pi N
D charin 2 const
D pckout 3p 2
D charout ds 2
D decout 3p 2
D*--- PACKED FIELD MANIPULATION
D PCK S 1 DIM(16)
D PCKC S 16
D idx S 2 0 inz(1)
*-- PACKED NUMERIC DATA STRUCTURES
D PNUMD0 DS INZ
D PNUM0 1 16P 0
D PACKEVEN
D*-- VALID PACKED SIGNS
D C@PKSN c const(
D X'0F1F2F3F4F5F6F7F8F9F-
D 0D1D2D3D4D5D6D7D8D9D-
D 0C1C2C3C4C5C6C7C8C9C')
* calcs to verify that charin is valid packed data
C move charin PCKC
C Z-ADD *ZEROS PNUM0
C MOVEA PNUMD0 PCK
C MOVEA PCKC PCK
*-- CHECK EACH BYTE
C DO 16 idx
C PCK(idx) IFGE X'00'
C PCK(idx) ANDLE X'99'
C idx ANDNE 16
C ITER
C ENDIF
*
*-- ON THE LAST BYTE, CHECK FOR VALID SIGNS
C idx IFEQ 16
C C@PKSN CHECK PCK(idx) 80
C N80 LEAVE
C ENDIF
*
*-- INVALID DIGIT FOUND
*
C 'Invalid' Dsply
C ENDDO
C If *In80 = *Off
C eval charout = charin
C eval pckout = decout
C return *Off
C Else
C return *On
C EndIf
P e
2001-10-18 如何於 Interactive SQL 環境中直接執行 CL Command?
如何於 Interactive SQL 環境中直接執行 CL Command?
當你執行 STRSQL 指令,進入輸入 SQL 指令畫面,執行某些 SQL 指令(如 Select * from
library/file)後,有時可能會需要執行某些CL 指令(如 WRKACTJOB),這時你必須離開 SQL
環境,回到 Command Line 才能執行 CL 指令,然後再執行 STRSQL 指令,進入輸入 SQL 指令
畫面執行為完成的 SQL 指令,如此進進出出非常浪費時間,有四兩種方式可以直接於 SQL 環境中直
接執行 CL 指令,兩種使用 SQL PROCEDURE,另兩種直接呼叫系統程式,以上四種你高興用哪個就用哪個。
1. 於 SQL 環境中,建立 呼叫系統程式 QCMDEXC 的 PROCEDURE 如下:
Command Line : STRSQL 進入 輸入 SQL 指令畫面,並輸入如下:
Enter SQL Statements
Type SQL statement, press Enter.
===> CREATE PROCEDURE your-library/exccmd
(IN cmd CHAR (32000), IN len DEC (15,5))
LANGUAGE CL
NOT DETERMINISTIC
NO SQL
EXTERNAL NAME QSYS/QCMDEXC
PARAMETER STYLE GENERAL
Bottom
F3=Exit F4=Prompt F6=Insert line F9=Retrieve F10=Copy line
F12=Cancel F13=Services F24=More keys
你要將 your-library 改成你自己的 library ,接著按執行鍵產生 exccmd PROCEDURE,
此 cmd PROCEDURE第一個參數是 CL 指令,第二個參數是 CL 指令的長度。
你可在 Enter SQL Statements 畫面輸入 Call exccmd ('WRKACTJOB', 9),此時系統會
執行 WRKACTJOB 指令的畫面,按 F3 回到 Enter SQL Statements 畫面。
2. 於 SQL 環境中,建立 呼叫系統程式 QUSCMDLN 的 PROCEDURE 如下:
Command Line : STRSQL 進入 輸入 SQL 指令畫面,並輸入如下:
Enter SQL Statements
Type SQL statement, press Enter.
===> CREATE PROCEDURE chancy/cmd
LANGUAGE CL
NOT DETERMINISTIC
NO SQL
EXTERNAL NAME QSYS/QUSCMDLN
PARAMETER STYLE GENERAL
Bottom
F3=Exit F4=Prompt F6=Insert line F9=Retrieve F10=Copy line
F12=Cancel F13=Services F24=More keys
你要將 your-library 改成你自己的 library ,接著按執行鍵產生 cmd PROCEDURE,
你可在 Enter SQL Statements 畫面輸入 Call cmd,此時會出現在 SEU 環境中按 F21
相同的指令畫面視窗,按 F12 回到 Enter SQL Statements 畫面。
3. 於 SQL 環境中,直接呼叫 QCMD 進入 Command Entry 畫面,按 F3 回到 Enter SQL Statements 畫面。
Command Line : STRSQL 進入 輸入 SQL 指令畫面,並輸入如下:
Enter SQL Statements
Type SQL statement, press Enter.
===> call qcmd
Bottom
F3=Exit F4=Prompt F6=Insert line F9=Retrieve F10=Copy line
F12=Cancel F13=Services F24=More keys
Command Entry WTWNAS01
Request level: 2
Previous commands and messages:
(No previous commands or messages)
Bottom
Type command, press Enter.
===>
F3=Exit F4=Prompt F9=Retrieve F10=Include detailed messages
F11=Display full F12=Cancel F13=Information Assistant F24=More keys
4. 於 SQL 環境中,直接呼叫 QUSCMDLN 進入 Command 視窗畫面,按 F12 回到 Enter SQL Statements 畫面。
Command Line : STRSQL 進入 輸入 SQL 指令畫面,並輸入如下:
Enter SQL Statements
Type SQL statement, press Enter.
===> call QSYS/QUSCMDLN
Bottom
F3=Exit F4=Prompt F6=Insert line F9=Retrieve F10=Copy line
F12=Cancel F13=Services F24=More keys
Enter SQL Statements
Type SQL statement, press Enter.
===> call QSYS/QUSCMDLN
..............................................................................
: Command :
: :
: ===> :
: F4=Prompt F9=Retrieve F12=Cancel :
: :
:............................................................................:
2001-09-25 如何於 CLP 或 RPG 中判斷使用者按下 F3 或 F12 取消 RUNQRY 指令 ?
如何於 CLP 或 RPG 中判斷使用者按下 F3 或 F12 取消 RUNQRY 指令 ?
由於執行 RUNQRY 且指定參數“是否篩選資料“ RCDSLT(*YES)時,
系統會顯示條件畫面供使用者輸入條件,如下:
Select Records
Type comparisons, press Enter. Specify OR to start each new group.
Tests: EQ, NE, LE, GE, LT, GT, RANGE, LIST, LIKE, IS, ISNOT...
AND/OR Field Test Value (Field, Number, 'Characters', or ...)
PH04 GE 19970101
AND PH04 LE 19971231
Bottom
Field Text Len Dec
PH05 VENDOR NO. 6
PH13 AMOUNT 11 2
PH04 RECEIVE DATE 8 0
PH01 BATCH NO. 7
PH02 PO NO. 9
More...
F3=Exit F9=Insert F11=Display names only F12=Cancel
F18=Files F19=Next group F20=Reorganize F24=More keys
(C) COPYRIGHT IBM CORP. 1988
此時使用者可按 F3 或 F12 取消 RUNQRY 指令,
但此時系統並不會有 CPF6801 "Command prompting ended when user pressed F3."
的訊息出現,所以您無法於 CLP 中使用 MONMSG CPF6801 來偵測使用者是否按下 F3 或 F12,
必須使用 System API 來擷取使用者是否按下 F3 或 F12。
------------------------------------------------------------------------------
使用 QUSRJOBI (Retrieve Job Information) API CLP 範例
可使用 QUSRJOBI (Retrieve Job Information) API.
CLP 範例 GETEXITC(Compiled with CRTCLPGM GETEXITC)如下:
dcl &a_len *char 4 /* Bin Data/Entry length */
dcl &a_rcv *char 1000 /* Receiver Variable, the */
/* length is variable. It */
/* must be in &A_LEN. */
dcl &msgdta *char 256
dcl &Action *char 20 +
value( 'RUNQRY RCDSLT(*YES)' )
runqry Range1 outtype(*PRINTER) rcdslt(*YES)
/* ---------------------------------------------------*/
/* Test for cancel */
/* ---------------------------------------------------*/
chgvar %bin( &a_len 1 4 ) 307
call QUSRJOBI ( +
&a_rcv +
&a_len +
'JOBI0600' +
'*' +
' ' +
)
/* Test job status for *CANCEL (F12) */
if ( %sst( &a_rcv 104 1 ) *eq '1' ) do
chgvar &msgdta ( +
'Action' *bcat +
&Action *bcat +
'cancelled.' +
)
sndpgmmsg msgid( CPF9897 ) +
msgf( QSYS/QCPFMSG ) +
msgdta( &msgdta ) +
msgtype( *INFO )
return
enddo
/* Test job status for *EXIT (F3) */
if ( %sst( &a_rcv 103 1 ) *eq '1' ) do
chgvar &msgdta ( +
'Action' *bcat +
&Action *bcat +
'cancelled.' +
)
sndpgmmsg msgid( CPF9897 ) msgf( QSYS/QCPFMSG ) +
msgdta( &msgdta ) +
msgtype( *INFO )
return
enddo
/* ---------------------------------------------------*/
/* RUNQRY was not canceled */
/* ---------------------------------------------------*/
---------------------------------------------------------
使用 QWCRTVCA 及 QWCCCJOB API 的 RPG 範例
可使用 QWCRTVCA (Retrieve Current Attributes) API擷取job F3 及 F12 屬性旗標,
然後使用 QWCCCJOB (Change Current Job) API 重設 job F3 及 F12 屬性旗標.
使用 API 的 RPG 範例 GETEXITR (Compiled with "CRTBNDRPG GETEXITR")如下:
**-- Parameter: --------------------------------------------
D Fkey s 3
**-- QWCRTVCA API: ----------------------------------------
D CurAtr Ds
D AtNbrAtrRtn 10i 0
D AtAtrLen1 10i 0
D AtAtrKey1 10i 0
D AtAtrDtaTyp1 1a
D 3a
D AtAtrDtaLen1 10i 0
D F12 1n
D 3a
D AtAtrLen2 10i 0
D AtAtrKey2 10i 0
D AtAtrDtaTyp2 1a
D 3a
D AtAtrDtaLen2 10i 0
D F3 1n
D 3a
**
D CurAtrLen s 10i 0 Inz( %Len( CurAtr ))
D FmtNam s 8a Inz( 'RTVC0100' )
D KeyFldNbr s 10i 0 Inz( 2 )
D KeyFlds Ds
D 10i 0 Inz( 301 )
D 10i 0 Inz( 503 )
**-- QWCCCJOB API: ----------------------------------------
D ChgAtr Ds
D CaAtrFldNbr 10i 0 Inz( 2 )
D CaAtrKey1 10i 0 Inz( 1 )
D CaAtrLen1 10i 0 Inz( 1 )
D CaAtrVal1 1a Inz( '0' )
D CaAtrKey2 10i 0 Inz( 2 )
D CaAtrLen2 10i 0 Inz( 1 )
D CaAtrVal2 1a Inz( '0' )
**
D ApiError Ds
D AeBytAvl 10i 0 Inz( 8 )
D AeBytRtn 10i 0 Inz( 0 )
**
C *Entry Plist
C Parm Fkey
**
C Call 'QWCRTVCA'
C Parm CurAtr
C Parm CurAtrLen
C Parm FmtNam
C Parm KeyFldNbr
C Parm KeyFlds
C Parm ApiError
**
C Call 'QWCCCJOB'
C Parm ChgAtr
C Parm ApiError
**
C Select
C When F3
C Eval Fkey = 'F3'
C When F12
C Eval Fkey = 'F12'
C Other
C Eval Fkey = *Blanks
C EndSl
**
C Return
測試 使用 API 的 RPG 範例 GETEXITRTC (Compiled with "CRTCLPGM GETEXITRC")如下:
DCL &FKEY *CHAR 3
DCL &MSGDTA *CHAR 256
DCL &ACTION *CHAR 20 +
VALUE( 'RUNQRY RCDSLT(*YES)' )
RUNQRY VENDOR97 RCDSLT( *YES ) OUTTYPE( *PRINTER )
CALL GETEXITR &FKEY
IF ( &FKEY *GT ' ' ) GOTO ENDPGM
/* ...CONTINUE PROCESSING */
ENDPGM:
CHGVAR &MSGDTA ( 'You pressed' *BCAT +
&FKEY *BCAT +
'ACTION' *BCAT +
&ACTION *BCAT +
'CANCELLED.' +
)
QSYS/SNDPGMMSG MSGID( CPF9897 ) +
MSGF( QSYS/QCPFMSG ) +
MSGDTA( &MSGDTA ) +
MSGTYPE( *INFO )
ENDPGM
參考資料
1. Retrieve Job Information (QUSRJOBI) API
http://publib.boulder.ibm.com/pubs/html/as400/v5r1/ic2924/info/apis/qusrjobi.htm
2. Retrieve Current Attributes (QWCRTVCA) API
http://publib.boulder.ibm.com/pubs/html/as400/v5r1/ic2924/info/apis/qwcrtvca.htm
3. Change Current Job (QWCCCJOB) API
http://publib.boulder.ibm.com/pubs/html/as400/v5r1/ic2924/info/apis/qwcccjob.htm
訂閱:
文章 (Atom)