星期三, 11月 01, 2023

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

沒有留言: