PANEL-WORKER

8. パネル・グループから変数値を取得するには?

先の例で示したように変数値の値を取得するには QUIGETV API を使用する。
今度は QUIGETV を使ってユーザーがキー入力した値を完了メッセージとして出力する例を示す。
先のソースに

/*(QUIGETV: 変数の取得 )*/
           CHGVAR     VAR(%BIN(&DTALEN)) VALUE(5)                 
           CALL       PGM(QUIGETV) PARM(&HANDLE &DSPDTA &DTALEN + 
                        'KEYRCD    ' &APIERR)                     
           SNDPGMMSG  MSG(&DSPDTA) MSGTYPE(*COMP)

を追加する。

【 CLPソース】
0001.00              PGM
0002.00 /*---------------------------------------------------------*/          
0003.00 /*   BNK001CL :  パネル表示                                */          
0004.00 /*---------------------------------------------------------*/          
0005.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(80)                  
0006.00              DCL        VAR(&HANDLE) TYPE(*CHAR) LEN(8) /* +           
0007.00                            摘要業務ハンドル  */                        
0008.00              DCL        VAR(&PNLGRPLIB) TYPE(*CHAR) LEN(20) +          
0009.00                           VALUE('BNK001    TESTOBJ   ')                
0010.00              DCL        VAR(&AREA)   TYPE(*CHAR) LEN(4) /* 2 進数  */  
0011.00              DCL        VAR(&DEC08) TYPE(*DEC) LEN(8 0)                
0012.00              DCL        VAR(&EXITPG) TYPE(*CHAR) LEN(4) +              
0013.00                           VALUE(X'00000000') /* 2 進数  */             
0014.00              DCL        VAR(&FNCTON) TYPE(*CHAR) LEN(4) /* 2 進数  */  
0015.00              DCL        VAR(&PANEL) TYPE(*CHAR) LEN(10) +              
0016.00                           VALUE('DSPHEAD   ')                          
0017.00              DCL        VAR(&AGAIN) TYPE(*CHAR) LEN(1) VALUE(Y)        
0018.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(4) +              
0019.00                           VALUE(X'00000000') /* 2 進数  */             
0020.00              DCL        VAR(&USRTSK) TYPE(*CHAR) LEN(1) VALUE(N)       
0021.00              DCL        VAR(&STACK) TYPE(*CHAR) LEN(4) +               
0022.00                           VALUE(X'00000000') /* 2 進数  */             
0023.00              DCL        VAR(&UIMMSG) TYPE(*CHAR) LEN(10) VALUE(*CALLER)
0024.00              DCL        VAR(&MSGKEY) TYPE(*CHAR) LEN(4)                
0025.00              DCL        VAR(&CSROPT) TYPE(*CHAR) LEN(1) VALUE(D)       
0026.00              DCL        VAR(&LASLST) TYPE(*CHAR) LEN(4) VALUE(NONE)    
0027.00              DCL        VAR(&ERRLST) TYPE(*CHAR) LEN(4)                
0028.00              DCL        VAR(&WAITTIME) TYPE(*CHAR) LEN(4) +            
0029.00                           VALUE(X'FFFFFFFF') /* 2 進数  */             
0030.00              DCL        VAR(&CF03) TYPE(*CHAR) LEN(4) +                
0031.00                           VALUE(X'00000003') /* 2 進数  */             
0032.00              DCL        VAR(&ENTER) TYPE(*CHAR) LEN(4) +               
0033.00                           VALUE(X'0000001B') /* 2 進数  */             
0034.00              DCL        VAR(&DSPDTA) TYPE(*CHAR) LEN(1024)             
0035.00              DCL        VAR(&DTALEN) TYPE(*CHAR) LEN(4) /* 2 進数  */  
0036.00          /*  MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) */     
0037.00                                                                        
0038.00 /*( QUIOPNDA : パネル・グループのオープン )*/                          
0039.00              CHGVAR     VAR(&DEC08) VALUE(-1)                          
0040.00              CHGVAR     VAR(%BIN(&AREA)) VALUE(&DEC08)                 
0041.00              CALL       PGM(QUIOPNDA) PARM(&HANDLE &PNLGRPLIB &AREA +  
0042.00                           &EXITPG 'N' &APIERR)                      
0043.00 /*(QUIPUTV: 変数の更新 )*/                                          
0044.00              CHGVAR     VAR(&DSPDTA) VALUE(' 変更 ')                
0045.00              CHGVAR     VAR(%BIN(&DTALEN)) VALUE(6)                 
0046.00              CALL       PGM(QUIPUTV) PARM(&HANDLE &DSPDTA &DTALEN + 
0047.00                           'MODRCD    ' &APIERR)                     
0048.00              CHGVAR     VAR(&DSPDTA) VALUE('0001')                  
0049.00              CHGVAR     VAR(%BIN(&DTALEN)) VALUE(5)                 
0050.00              CALL       PGM(QUIPUTV) PARM(&HANDLE &DSPDTA &DTALEN + 
0051.00                           'KEYRCD    ' &APIERR)                     
0052.00 /*( QUIDSPP : パネル表示 )*/                                        
0053.00  DSPLY:      CALL       PGM(QUIDSPP) PARM(&HANDLE &FNCTON &PANEL +  
0054.00                           &AGAIN &APIERR &USRTSK &STACK &UIMMSG +   
0055.00                           &MSGKEY &CSROPT &LASLST &ERRLST &WAITTIME)
0056.00              MONMSG     MSGID(CPF6A95)                              
0057.00 /*( CF03 )= 終了 */                                                 
0058.00              IF         COND(&FNCTON *EQ &CF03) THEN(DO)            
0059.00 /*( QUICLOA : パネル・グループのクローズ )*/                        
0060.00              CALL       PGM(QUICLOA) PARM(&HANDLE 'M' &APIERR)      
0061.00              RETURN                                                 
0062.00              ENDDO                                                  
0063.00 /*( 実行キー )*/                                                    
0064.00              IF         COND(&FNCTON *EQ &ENTER) THEN(DO)           
0065.00 /*(QUIGETV: 変数の取得 )*/                                          
0066.00              CHGVAR     VAR(%BIN(&DTALEN)) VALUE(5)                 
0067.00              CALL       PGM(QUIGETV) PARM(&HANDLE &DSPDTA &DTALEN + 
0068.00                           'KEYRCD    ' &APIERR)                     
0069.00              SNDPGMMSG  MSG(&DSPDTA) MSGTYPE(*COMP)                 
0070.00              GOTO       CMDLBL(DSPLY)                               
0071.00              ENDDO                                                  
0072.00                                                                     
0073.00  ERROR:      RCVMSG     RMV(*NO) MSG(&MSG)                          
0074.00              SNDPGMMSG  MSG(&MSG) MSGTYPE(*DIAG)                    
0075.00              ENDPGM
【 解説 】

このケースは簡単なので解説するまでもないであろう。
ところで、これまで CLP によってPNLGRP API の使用方法を示しているが、これは RPGで行うこともできるし、COBOL や C/400でも何の問題もない。
CLP で例を示しているのは RPG, COBOL のユーザーにも共通して理解できるようにしているためであるが、RPGを書くまでもなく CLP でPNLGRPは十分扱うことができる。