PANEL-WORKER

10. CLP でSFL型パネル・グループにレコードを追加する。

CLP でデータ・ベースを読むには

DCLF       FILE(TESTFIL/BANKM)

でデータ・ベースを定義して

RCVF       RCDFMT(@BANKM)

によってレコードを読み取ることができる。
ここでは特殊な処理については触れないが、CLP であっても、キー順やRRN順や特定のキーや特定のRRNを指定して読み取ることができるので、このあたりはRPGやCOBOL による読み取りと変ることはない。
PNLGRPにSFLレコードを追加するには QUIADDLE API を使用する。
以下に CLPソースの全容を紹介する。

【 CLPソース】
0001.00              PGM
0002.00 /*---------------------------------------------------------*/        
0003.00 /*   BNK002CL :  パネル表示                                */        
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('BNK002    TESTOBJ   ')              
0010.00              DCL        VAR(&AREA) TYPE(*CHAR) LEN(4) +              
0011.00                           VALUE(X'FFFFFFFF') /* 2 進数  */           
0012.00              DCL        VAR(&DEC08) TYPE(*DEC) LEN(8 0)              
0013.00              DCL        VAR(&EXITPG) TYPE(*CHAR) LEN(4) +            
0014.00                           VALUE(X'00000000') /* 2 進数  */           
0015.00              DCL        VAR(&FNCTON) TYPE(*CHAR) LEN(4) /* 2 進数  */
0016.00              DCL        VAR(&PANEL) TYPE(*CHAR) LEN(10) +            
0017.00                           VALUE('SFLDSP    ')                        
0018.00              DCL        VAR(&AGAIN) TYPE(*CHAR) LEN(1) VALUE(Y)      
0019.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(4) +            
0020.00                           VALUE(X'00000000') /* 2 進数  */           
0021.00              DCL        VAR(&USRTSK) TYPE(*CHAR) LEN(1) VALUE(N)     
0022.00              DCL        VAR(&STACK) TYPE(*CHAR) LEN(4) +             
0023.00                           VALUE(X'00000000') /* 2 進数  */           
0024.00              DCL        VAR(&UIMMSG) TYPE(*CHAR) LEN(10) VALUE(*CALLER
0025.00              DCL        VAR(&MSGKEY) TYPE(*CHAR) LEN(4)               
0026.00              DCL        VAR(&CSROPT) TYPE(*CHAR) LEN(1) VALUE(D)      
0027.00              DCL        VAR(&LASLST) TYPE(*CHAR) LEN(4) VALUE(NONE)   
0028.00              DCL        VAR(&ERRLST) TYPE(*CHAR) LEN(4)               
0029.00              DCL        VAR(&WAITTIME) TYPE(*CHAR) LEN(4) +           
0030.00                           VALUE(X'FFFFFFFF') /* 2 進数  */            
0031.00              DCL        VAR(&CF03) TYPE(*CHAR) LEN(4) +               
0032.00                           VALUE(X'00000003') /* 2 進数  */            
0033.00              DCL        VAR(&ENTER) TYPE(*CHAR) LEN(4) +              
0034.00                           VALUE(X'0000001B') /* 2 進数  */            
0035.00              DCL        VAR(&DSPDTA) TYPE(*CHAR) LEN(1024)            
0036.00              DCL        VAR(&DTALEN) TYPE(*CHAR) LEN(4) /* 2 進数  */ 
0037.00              DCLF       FILE(TESTFIL/BANKM)                           
0038.00              DCL        VAR(&NO) TYPE(*CHAR) LEN(4)                   
0039.00              DCL        VAR(&N) TYPE(*DEC) LEN(4 0) VALUE(1)          
0040.00              DCL        VAR(&LHANDL) TYPE(*CHAR) LEN(4)               
0041.00          /*  MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) */    
0042.00                                                                       
0043.00 /*( QUIOPNDA : パネル・グループのオープン )*/                         
0044.00              CALL       PGM(QUIOPNDA) PARM(&HANDLE &PNLGRPLIB &AREA + 
0045.00                           &EXITPG 'N' &APIERR)                        
0046.00 /*(BANKM: 銀行マスターの読み取り )*/                                  
0047.00  READ:       RCVF       RCDFMT(@BANKM)                                
0048.00              MONMSG     MSGID(CPF0800) EXEC(GOTO CMDLBL(REDEND))      
0049.00              CHGVAR     VAR(&NO) VALUE(&N)                            
0050.00              CHGVAR     VAR(&DSPDTA) VALUE(&BKBKCD *CAT &BKNMKJ *CAT +
0051.00                           &BKKBN *CAT &NO)                            
0052.00              CHGVAR     VAR(%BIN(&DTALEN)) VALUE(26)                  
0053.00              CALL       PGM(QUIADDLE) PARM(&HANDLE &DSPDTA &DTALEN +  
0054.00                           'SFLRCD    ' 'SFL       ' 'NEXT' &LHANDL +  
0055.00                           &APIERR)                                    
0056.00              CHGVAR     VAR(&N) VALUE(&N + 1)                         
0057.00              GOTO       READ                                          
0058.00  REDEND:                                                              
0059.00 /*( QUIDSPP : パネル表示 )*/                                          
0060.00  DSPLY:      CALL       PGM(QUIDSPP) PARM(&HANDLE &FNCTON &PANEL +    
0061.00                           &AGAIN &APIERR &USRTSK &STACK &UIMMSG +     
0062.00                           &MSGKEY &CSROPT &LASLST &ERRLST &WAITTIME)  
0063.00              MONMSG     MSGID(CPF6A95)                          
0064.00 /*( CF03 )= 終了 */                                             
0065.00              IF         COND(&FNCTON *EQ &CF03) THEN(DO)        
0066.00 /*( QUICLOA : パネル・グループのクローズ )*/                    
0067.00              CALL       PGM(QUICLOA) PARM(&HANDLE 'M' &APIERR)  
0068.00              RETURN                                             
0069.00              ENDDO                                              
0070.00 /*( 実行キー )*/                                                
0071.00              IF         COND(&FNCTON *EQ &ENTER) THEN(DO)       
0072.00              GOTO       CMDLBL(DSPLY)                           
0073.00              ENDDO                                              
0074.00                                                                 
0075.00  ERROR:      RCVMSG     RMV(*NO) MSG(&MSG)                      
0076.00              SNDPGMMSG  MSG(&MSG) MSGTYPE(*DIAG)                
0077.00              ENDPGM
【 解説 】

キー・ポイントとなるのは、

CALL       PGM(QUIADDLE) PARM(&HANDLE &DSPDTA &DTALEN +    
                   'SFLRCD    ' 'SFL       ' 'NEXT' &LHANDL + 
                   &APIERR)

だけであるので、あっけに取られるほど簡単である。
わずか 77ステップでSFL照会画面ができたことになる。
このようにPNLGRPの場合は処理が複雑になるほど、そのビジネス・ロジックはシンプルになる。
また、Appを開発したとき操作員が開発者の想定していなかった思わぬ操作を行うため障害が発生するような場合がしばしば発生するが、PNLGRPによって開発しておくとそのような心配はほとんどしなくて済む。
少しくらいの乱暴な操作が行われてもPNLGRPがアベンドすることはほとんど無い。
どのように操作が行われるか想定できないようなAppを提供する場合、PNLGRPによるインターフェースであれば、信頼性の高いシステムを構築することができる。