如何於 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
A blog about IBM i (AS/400), MQ and other things developers or Admins need to know.
星期三, 11月 01, 2023
2001-09-25 如何於 CLP 或 RPG 中判斷使用者按下 F3 或 F12 取消 RUNQRY 指令 ?
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言