PANEL グループ

18. オブジェクト指向によるパネル・グループの開発

 

IBM iのユーティリティの大半を構成しているパネル・グループは
オブジェクト指向をベースとして開発されている。

 それではパネル・グループによるオブジェクト指向の開発手法を
紹介する。

[初期画面を表示するためのコマンド: DSPPNL ]

                        パネル・グループ表示  (DSPPNL)                 
                                                                       
選択項目を入力して,実行キーを押してください。                         
                                                                       
パネル・グループ  . . . . . . . > PNL002PNL      名前                  
  ライブラリー  . . . . . . . . >   QTROBJ       名前 , *LIBL, *CURLIB 
パネル名  . . . . . . . . . . . > DSPHEAD        名前                  
パネルを処理するプログラム  . . > PNL002CL       名前                  
  ライブラリー  . . . . . . . . >   QTROBJ       名前 , *LIBL, *CURLIB 

[解説]

これは初期画面パネル: DSPHEAD を表示するためのコマンドである。
このコマンド:DSPPNL は指定されたバネル・グループをオープンして
パネル: DSPHEAD で実行キーが押されたときに呼び出すプログラム:
QTROBJ/PNL002CL を定義してからパネル: DSPHEADを表示する。

[コマンド: DSPPNLのソース]

ソースはこちらから

0001.00              CMD        PROMPT(' パネル・グループ表示 ')           
0002.00              PARM       KWD(PNLGRP) TYPE(PNLGRP) +                 
0003.00                           PROMPT(' パネル・グループ ')             
0004.00  PNLGRP:     QUAL       TYPE(*NAME) LEN(10) MIN(1)                 
0005.00              QUAL       TYPE(*NAME) LEN(10) DFT(*LIBL) +           
0006.00                           SPCVAL((*LIBL) (*CURLIB)) +              
0007.00                           PROMPT(' ライブラリー ')                 
0008.00              PARM       KWD(PANEL) TYPE(*NAME) LEN(10) MIN(1) +    
0009.00                           PROMPT(' パネル名 ')                     
0010.00              PARM       KWD(PGM) TYPE(PGM) +                       
0011.00                           PROMPT(' パネルを処理するプログラム ')   
0012.00  PGM:        QUAL       TYPE(*NAME) LEN(10) MIN(1)                 
0013.00              QUAL       TYPE(*NAME) LEN(10) DFT(*LIBL) +           
0014.00                           SPCVAL((*LIBL) (*CURLIB)) +              
0015.00                           PROMPT(' ライブラリー ')                 

[コンパイル]

CRTCMD CMD(QUATTRO/DSPPNL) PGM(QUATTRO/DSPPNLCL) SRCFILE(R610SRC/QCMDSRC)
AUT(*ALL)

[コマンドを処理するCLP:DSPPNLCL:ソース]

ソースはこちらから

0001.00              PGM        PARM(&PNLGRPLIB &PANEL &PGMOBJLIB)                 
0002.00 /*-------------------------------------------------------------------*/    
0003.00 /*   DSPPNLCL  :   パネル・グループ表示                              */    
0004.00 /*                                                                   */    
0005.00 /*   2020/01/02  作成                                                */    
0006.00 /*-------------------------------------------------------------------*/    
0007.00              DCL        VAR(&PNLGRLIB) TYPE(*CHAR) LEN(20)                 
0008.00              DCL        VAR(&PNLGRP) TYPE(*CHAR) LEN(10)                   
0009.00              DCL        VAR(&PNLLIB) TYPE(*CHAR) LEN(10)                   
0010.00              DCL        VAR(&PANEL) TYPE(*CHAR) LEN(10)                    
0011.00              DCL        VAR(&PGMOBJLIB) TYPE(*CHAR) LEN(20)                
0012.00              DCL        VAR(&PGM) TYPE(*CHAR) LEN(10)                      
0013.00              DCL        VAR(&OBJLIB) TYPE(*CHAR) LEN(10)                   
0014.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                     
0015.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                     
0016.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)                     
0017.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)                  
0018.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)                  
0019.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                      
0020.00              DCL        VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)                   
0021.00              DCL        VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +                
0022.00                           VALUE('*ESCAPE   ')                              
0023.00              DCL        VAR(&ERR) TYPE(*CHAR) LEN(1)                       
0024.00              DCL        VAR(&NULL4) TYPE(*CHAR) LEN(4) +                  
0025.00                           VALUE(X'00000000')                              
0026.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(116) +               
0027.00                           VALUE(X'000074') /* 2 進数  */                  
0028.00              /*( パネル・グループの変数 )*/                               
0029.00              DCL        VAR(&HANDLE) TYPE(*CHAR) LEN(8) /* +              
0030.00                            摘要業務ハンドル  */                           
0031.00              DCL        VAR(&FNCTON) TYPE(*CHAR) LEN(4) +                 
0032.00                           VALUE(X'00000000') /* 2 進数  */                
0033.00              DCL        VAR(&PANEL) TYPE(*CHAR) LEN(10)                   
0034.00              DCL        VAR(&AGAIN) TYPE(*CHAR) LEN(1) VALUE(Y)           
0035.00              DCL        VAR(&USRTSK) TYPE(*CHAR) LEN(1) VALUE(N)          
0036.00              DCL        VAR(&STACK) TYPE(*CHAR) LEN(4) +                  
0037.00                           VALUE(X'00000001') /* 2 進数  */                
0038.00              DCL        VAR(&UIMMSG) TYPE(*CHAR) LEN(10) VALUE(*CALLER)   
0039.00              DCL        VAR(&MSGKEY) TYPE(*CHAR) LEN(4)                   
0040.00              DCL        VAR(&CSROPT) TYPE(*CHAR) LEN(1) VALUE(D)          
0041.00              DCL        VAR(&LASLST) TYPE(*CHAR) LEN(4) VALUE(NONE)       
0042.00              DCL        VAR(&ERRLST) TYPE(*CHAR) LEN(4)                   
0043.00              DCL        VAR(&WAITTIME) TYPE(*CHAR) LEN(4) +               
0044.00                           VALUE(X'FFFFFFFF') /* 2 進数  */                
0045.00              DCL        VAR(&CF03) TYPE(*CHAR) LEN(4) +                   
0046.00                           VALUE(X'FFFFFFFC') /* 2 進数  */                
0047.00              DCL        VAR(&CF05) TYPE(*CHAR) LEN(4) +                   
0048.00                           VALUE(X'00000005') /* 2 進数  */                 
0049.00              DCL        VAR(&CF06) TYPE(*CHAR) LEN(4) +                    
0050.00                           VALUE(X'00000006') /* 2 進数  */                 
0051.00              DCL        VAR(&CF12) TYPE(*CHAR) LEN(4) +                    
0052.00                           VALUE(X'FFFFFFF8') /* 2 進数  */                 
0053.00              DCL        VAR(&CF13) TYPE(*CHAR) LEN(4) +                    
0054.00                           VALUE(X'0000000D') /* 2 進数  */                 
0055.00              DCL        VAR(&CF14) TYPE(*CHAR) LEN(4) +                    
0056.00                           VALUE(X'0000000E') /* 2 進数  */                 
0057.00              DCL        VAR(&CF15) TYPE(*CHAR) LEN(4) +                    
0058.00                           VALUE(X'0000000F') /* 2 進数  */                 
0059.00              DCL        VAR(&CF17) TYPE(*CHAR) LEN(4) +                    
0060.00                           VALUE(X'00000011') /* 2 進数  */                 
0061.00              DCL        VAR(&CF18) TYPE(*CHAR) LEN(4) +                    
0062.00                           VALUE(X'00000012') /* 2 進数  */                 
0063.00              DCL        VAR(&VARDTA) TYPE(*CHAR) LEN(1024)                 
0064.00              DCL        VAR(&VARRCD)  TYPE(*CHAR) LEN(10)                  
0065.00              DCL        VAR(&DTALEN) TYPE(*CHAR) LEN(4) /* 2 進数  */      
0066.00              DCL        VAR(&CSRVAR) TYPE(*CHAR) LEN(10) +                 
0067.00                           VALUE('OPT       ')                              
0068.00              DCL        VAR(&CSRPOS) TYPE(*CHAR) LEN(2) VALUE(X'0001')     
0069.00              DCL        VAR(&CSRLST) TYPE(*CHAR) LEN(10) +                 
0070.00                           VALUE('SFL       ')                              
0071.00              DCL        VAR(&CSRNAME) TYPE(*CHAR) LEN(10) +                
0072.00                           VALUE('          ')                           
0073.00              DCL        VAR(&PNLGRPLIB) TYPE(*CHAR) LEN(20) +           
0074.00                           VALUE('WRKWINWTR WINDOWS   ')                 
0075.00              DCL        VAR(&AREA)   TYPE(*CHAR) LEN(4) /* 2 進数  */   
0076.00              DCL        VAR(&EXITPG) TYPE(*CHAR) LEN(4) +               
0077.00                           VALUE(X'00000000') /* 2 進数  */              
0078.00              DCL        VAR(&OPT) TYPE(*CHAR) LEN(2) VALUE(X'0000')     
0079.00              DCL        VAR(&DEC08) TYPE(*DEC) LEN(8 0)                 
0080.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))         
0081.00                                                                         
0082.00 /*( 環境の取得 )*/                                                      
0083.00              RTVJOBA    TYPE(&TYPE)                                     
0084.00              IF         COND(&TYPE *EQ '0') THEN(DO) /*  バッチ  */     
0085.00              CHGVAR     VAR(&TOPGMQ) VALUE('*SYSOPR   ')                
0086.00              ENDDO      /*  バッチ  */                                  
0087.00              ELSE       CMD(DO) /*  対話式  */                          
0088.00              CHGVAR     VAR(&TOPGMQ) VALUE('*TOPGMQ   ')                
0089.00              ENDDO      /*  対話式  */                                  
0090.00                                                                         
0091.00 /*( パラメータの取得 )*/                                                
0092.00              CHGVAR     VAR(&PNLGRP) VALUE(%SST(&PNLGRPLIB 01 10))      
0093.00              CHGVAR     VAR(&PNLLIB) VALUE(%SST(&PNLGRPLIB 11 10))      
0094.00              CHGVAR     VAR(&PGM) VALUE(%SST(&PGMOBJLIB 01 10))         
0095.00              CHGVAR     VAR(&OBJLIB) VALUE(%SST(&PGMOBJLIB 11 10))      
0096.00                                                                         
0097.00 /*( QUIOPNDA : パネル・グループのオープン )*/                           
0098.00 START:       CHGVAR     VAR(&DEC08) VALUE(-1)                           
0099.00              CHGVAR     VAR(%BIN(&AREA)) VALUE(&DEC08)                  
0100.00              CALL       PGM(QUIOPNDA) PARM(&HANDLE &PNLGRPLIB &AREA +   
0101.00                           &EXITPG 'N' &APIERR)                          
0102.00              IF         COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)     
0103.00              SNDPGMMSG  +                                               
0104.00                           MSG('API: QUHDSPH の実行で次のエラーが発生 +  
0105.00                            しました。 ') MSGTYPE(*DIAG)                 
0106.00              GOTO       APIERR                                          
0107.00              ENDDO                                                      
0108.00              CALL       PGM(QUIPUTV) PARM(&HANDLE &PGMOBJLIB &DTALEN +  
0109.00                           'PGMRCD    ' &APIERR)                         
0110.00 DSPLY:                                                                  
0111.00              CALL       PGM(QUIDSPP) PARM(&HANDLE &FNCTON &PANEL +      
0112.00                           &AGAIN &APIERR &USRTSK &STACK &UIMMSG +       
0113.00                           &MSGKEY &CSROPT &LASLST &ERRLST &WAITTIME)    
0114.00              CHGVAR     VAR(&MSGKEY) VALUE(' ')                         
0115.00              CHGVAR     VAR(&CSROPT) VALUE('D')                         
0116.00       /*( CF03 )= 終了 */                                               
0117.00              IF         COND(&FNCTON *EQ &CF03) THEN(DO)                
0118.00              GOTO       CLOSE                                           
0119.00              ENDDO                                                      
0120.00       /*( CF12 )= 取消し */                                             
0121.00              IF         COND(&FNCTON *EQ &CF12) THEN(DO)                
0122.00              GOTO       CLOSE                                           
0123.00              ENDDO                                                      
0124.00       /*( 実行キー )*/                                                  
0125.00              GOTO       DSPLY                                           
0126.00                                                                         
0127.00 /*( 適用業務のクローズ )*/                                              
0128.00 CLOSE:                                                                  
0129.00              CALL       PGM(QUICLOA) PARM(&HANDLE 'M' &APIERR)          
0130.00              RETURN                                                     
0131.00                                                                         
0132.00                                                                         
0133.00  APIERR:                                                                
0134.00              CHGVAR     VAR(&MSGID) VALUE(%SST(&APIERR 9 7))            
0135.00              CHGVAR     VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))        
0136.00              CHGVAR     VAR(&MSGF) VALUE('QCPFMSG   ')                  
0137.00              CHGVAR     VAR(&MSGFLIB) VALUE('QSYS      ')               
0138.00              GOTO       SNDMSG                                          
0139.00                                                                         
0140.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +             
0141.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +   
0142.00                           MSGFLIB(&MSGFLIB)                             
0143.00  SNDMSG:     IF         COND(&MSGID *EQ ' ') THEN(DO)                   
0144.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) + 
0145.00                           TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)         
0146.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                 
0147.00              ENDDO                                                  
0148.00              ELSE       CMD(DO)                                     
0149.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +        
0150.00                           MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +         
0151.00                           MSGTYPE(&MSGTYPE)                         
0152.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                 
0153.00              ENDDO                                                  
0154.00              ENDPGM                                                 

[解説]

このCLPの動作は QUIOPNDAによってパネル・グループをオープンして
初期画面パネル: DSPHEADを表示しているだけである。
ただし

0108.00              CALL       PGM(QUIPUTV) PARM(&HANDLE &PGMOBJLIB &DTALEN +  
0109.00                           'PGMRCD    ' &APIERR) 

によって実行キーが押されたときにプログラム: QTROBJ/PNL002CL を呼び出すように
指示している。
そしてこのCLPはPNL002だけでなくすべてのパネル・グループのオープンに
使用することができることに注目して欲しい。
このコマンドとCLPがあればあらゆるパネル・グループをオープンすることができる。

次に実行キーを押したときに呼び出されるプログラム: PNL002CL を紹介しよう。

[実行キーを押したときに呼び出されるCLP: PNL002CL ]

ソースはこちらから

0001.00              PGM        PARM(&RCVPRM)                                       
0002.00 /*-------------------------------------------------------------------*/     
0003.00 /*   PNL002CL  :   商品マスター照会                                  */     
0004.00 /*                                                                   */     
0005.00 /*   2020/01/02  作成                                                */     
0006.00 /*-------------------------------------------------------------------*/     
0007.00              DCL        VAR(&RCVPRM)    TYPE(*CHAR) LEN(70)                 
0008.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(80)                       
0009.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                      
0010.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)                      
0011.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)                   
0012.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)                   
0013.00              DCL        VAR(&MSGKEY) TYPE(*CHAR) LEN(4)                     
0014.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                       
0015.00              DCL        VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)                    
0016.00              DCL        VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +                 
0017.00                           VALUE('*ESCAPE   ')                               
0018.00              DCL        VAR(&ERR) TYPE(*CHAR) LEN(1)                        
0019.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(116) +                 
0020.00                           VALUE(X'000074') /* 2 進数  */                    
0021.00              DCL        VAR(&NULL4) TYPE(*CHAR) LEN(4) +                    
0022.00                           VALUE(X'00000000')                                
0023.00              /*( PNLGRP 変数 )*/                                            
0024.00              DCL        VAR(&HANDLE) TYPE(*CHAR) LEN(8) /* +            
0025.00                            摘要業務ハンドル  */                         
0026.00              DCL        VAR(&DSPDTA) TYPE(*CHAR) LEN(1024)              
0027.00              DCL        VAR(&DTALEN) TYPE(*CHAR) LEN(4) +               
0028.00                           VALUE(X'00000400') /* 2 進数  */              
0029.00              DCL        VAR(&FNCTON) TYPE(*CHAR) LEN(4) +               
0030.00                           VALUE(X'00000000') /* 2 進数  */              
0031.00              DCL        VAR(&PANEL) TYPE(*CHAR) LEN(10) +               
0032.00                           VALUE('DSPDTA01')                             
0033.00              DCL        VAR(&AGAIN) TYPE(*CHAR) LEN(1) VALUE(Y)         
0034.00              DCL        VAR(&USRTSK) TYPE(*CHAR) LEN(1) VALUE(N)        
0035.00              DCL        VAR(&STACK) TYPE(*CHAR) LEN(4) +                
0036.00                           VALUE(X'00000001') /* 2 進数  */              
0037.00              DCL        VAR(&UIMMSG) TYPE(*CHAR) LEN(10) VALUE(*CALLER) 
0038.00              DCL        VAR(&MSGKEY) TYPE(*CHAR) LEN(4)                 
0039.00              DCL        VAR(&CSROPT) TYPE(*CHAR) LEN(1) VALUE(D)        
0040.00              DCL        VAR(&LASLST) TYPE(*CHAR) LEN(4) VALUE(NONE)     
0041.00              DCL        VAR(&ERRLST) TYPE(*CHAR) LEN(4)                 
0042.00              DCL        VAR(&WAITTIME) TYPE(*CHAR) LEN(4) +             
0043.00                           VALUE(X'FFFFFFFF') /* 2 進数  */              
0044.00              DCL        VAR(&CF03) TYPE(*CHAR) LEN(4) +                 
0045.00                           VALUE(X'FFFFFFFC') /* 2 進数  */              
0046.00              DCL        VAR(&CF05) TYPE(*CHAR) LEN(4) +                 
0047.00                           VALUE(X'00000005') /* 2 進数  */              
0048.00              DCL        VAR(&CF06) TYPE(*CHAR) LEN(4) +              
0049.00                           VALUE(X'00000006') /* 2 進数  */           
0050.00              DCL        VAR(&CF12) TYPE(*CHAR) LEN(4) +              
0051.00                           VALUE(X'FFFFFFF8') /* 2 進数  */           
0052.00              DCL        VAR(&CF13) TYPE(*CHAR) LEN(4) +              
0053.00                           VALUE(X'0000000D') /* 2 進数  */           
0054.00              DCL        VAR(&CF14) TYPE(*CHAR) LEN(4) +              
0055.00                           VALUE(X'0000000E') /* 2 進数  */           
0056.00              DCL        VAR(&CF15) TYPE(*CHAR) LEN(4) +              
0057.00                           VALUE(X'0000000F') /* 2 進数  */           
0058.00              DCL        VAR(&CF17) TYPE(*CHAR) LEN(4) +              
0059.00                           VALUE(X'00000011') /* 2 進数  */           
0060.00              DCL        VAR(&CF18) TYPE(*CHAR) LEN(4) +              
0061.00                           VALUE(X'00000012') /* 2 進数  */           
0062.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))      
0063.00                                                                      
0064.00 /*( 環境の取得 )*/                                                   
0065.00              RTVJOBA    TYPE(&TYPE)                                  
0066.00              IF         COND(&TYPE *EQ '0') THEN(DO) /*  バッチ  */  
0067.00              CHGVAR     VAR(&TOPGMQ) VALUE('*SYSOPR   ')             
0068.00              ENDDO      /*  バッチ  */                               
0069.00              ELSE       CMD(DO) /*  対話式  */                       
0070.00              CHGVAR     VAR(&TOPGMQ) VALUE('*TOPGMQ   ')             
0071.00              ENDDO      /*  対話式  */                               
0072.00                                                                        
0073.00 /*( 入力パラメータの取得 )*/                                           
0074.00              CHGVAR     VAR(&HANDLE) VALUE(%SST(&RCVPRM 17 8))         
0075.00                                                                        
0076.00 /*( 実行 )*/                                                           
0077.00              CALL       PGM(QUIGETV) PARM(&HANDLE &DSPDTA &DTALEN +    
0078.00                           'DSPRCD    ' &APIERR)                        
0079.00              CALL       PGM(QTROBJ/PNL002) PARM(&DSPDTA &ERR &MSG)     
0080.00              CHGVAR     VAR(&MSGTYPE) VALUE('*DIAG     ')              
0081.00              CALL       PGM(QUIPUTV) PARM(&HANDLE &DSPDTA &DTALEN +    
0082.00                           'DSPRCD    ' &APIERR)                        
0083.00              IF         COND(&MSG *NE ' ') THEN(DO)                    
0084.00              GOTO       SNDMSG                                         
0085.00              ENDDO                                                     
0086.00 /*( 明細画面を表示する )*/                                             
0087.00 DSPLY:                                                                 
0088.00              CALL       PGM(QUIDSPP) PARM(&HANDLE &FNCTON &PANEL +     
0089.00                           &AGAIN &APIERR &USRTSK &STACK &UIMMSG +      
0090.00                           &MSGKEY &CSROPT &LASLST &ERRLST &WAITTIME)   
0091.00              CHGVAR     VAR(&MSGKEY) VALUE(' ')                        
0092.00              CHGVAR     VAR(&CSROPT) VALUE('D')                        
0093.00       /*( CF03 )= 終了 */                                              
0094.00              IF         COND(&FNCTON *EQ &CF03) THEN(DO)               
0095.00              RETURN                                                    
0096.00              ENDDO                                                    
0097.00       /*( CF12 )= 取消し */                                           
0098.00              IF         COND(&FNCTON *EQ &CF12) THEN(DO)              
0099.00              RETURN                                                   
0100.00              ENDDO                                                    
0101.00       /*( 実行キー )*/                                                
0102.00              GOTO       DSPLY                                         
0103.00                                                                       
0104.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +           
0105.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 
0106.00                           MSGFLIB(&MSGFLIB)                           
0107.00  SNDMSG:                                                              
0108.00              IF         COND(&MSGID *EQ ' ') THEN(DO)                 
0109.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +   
0110.00                           TOMSGQ(*TOPGMQ) MSGTYPE(*ESCAPE)            
0111.00              ENDDO                                                    
0112.00              ELSE       CMD(DO)                                       
0113.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +          
0114.00                           MSGDTA(&MSGDTA) TOMSGQ(*TOPGMQ) +           
0115.00                           MSGTYPE(*ESCAPE)                            
0116.00              ENDDO                                                    
0117.00              ENDPGM                                                   

[解説]

パネル・グループの機能キー操作によって呼び出されるプログラムは必ず


0001.00              PGM        PARM(&RCVPRM) 
 :
0007.00              DCL        VAR(&RCVPRM)    TYPE(*CHAR) LEN(70)

のパラメータで呼び出される。 そして

073.00 /*( 入力パラメータの取得 )*/                                           
0074.00              CHGVAR     VAR(&HANDLE) VALUE(%SST(&RCVPRM 17 8))

で適用業務ハンドルを取り出すことができる。
そこで入出力バッファー DSPRCDを取り出して RPGプログラム PNL002 で
更新してから QUIPUTV で元のパネル・グループに更新している。

0076.00 /*( 実行 )*/                                                           
0077.00              CALL       PGM(QUIGETV) PARM(&HANDLE &DSPDTA &DTALEN +    
0078.00                           'DSPRCD    ' &APIERR)                        
0079.00              CALL       PGM(QTROBJ/PNL002) PARM(&DSPDTA &ERR &MSG)     
0080.00              CHGVAR     VAR(&MSGTYPE) VALUE('*DIAG     ')              
0081.00              CALL       PGM(QUIPUTV) PARM(&HANDLE &DSPDTA &DTALEN +    
0082.00                           'DSPRCD    ' &APIERR)

後は明細画面のパネル: DSPDTA01 を表示するだけである。

0086.00 /*( 明細画面を表示する )*/                                             
0087.00 DSPLY:                                                                 
0088.00              CALL       PGM(QUIDSPP) PARM(&HANDLE &FNCTON &PANEL +     
0089.00                           &AGAIN &APIERR &USRTSK &STACK &UIMMSG +      
0090.00                           &MSGKEY &CSROPT &LASLST &ERRLST &WAITTIME) 

次にRPG: PNL002 のソースを見てみよう。
PNL002 では一体どのような処理が行われているのだろうか?

[ RPG : PNL002のソース ]

ソースはこちらから


  桁 . . . . . :    6 100                                       編集                                               QTRSRC/QRPGLESRC 
 SEU==>                                                                                                                      PNL002 
        *************** データの始め ****************                                                                               
0001.00 H DFTNAME(PNL002) DATEDIT(*YMD/) BNDDIR('QC2LE')                                                    200102                  
0002.00 F********** 商品マスターの登録 ****************************************                             200102                  
0003.00 FSHOHIN    IF   E           K DISK    EXTFILE('QTRFIL/SHOHIN')                                      200102                  
0004.00 FHINSHU    IF   E           K DISK    EXTFILE('QTRFIL/HINSHU')                                      200102                  
0005.00 F**********************************************************************                             200102                  
0006.00                                                                                                     200102                  
0007.00  * CRTRPGMOD  OBJ(QTEMP/PNL002)   SRCFILE(QTRSRC/QRPGLESRC)                                         200102                  
0008.00  * DBGVIEW(*SOURCE) AUT(*ALL)                                                                       200102                  
0009.00  * CRTPGM PGM(QTROBJ/PNL002) MODULE(QTEMP/PNL002 ACTGRP(*NEW)                                       200102                  
0010.00  *        AUT(*ALL)                                                                                 200102                  
0011.00                                                                                                     200102                  
0012.00  *-------------------------------------------------------------------*                              200102                  
0013.00  *  2020/01/02 : 作成                                                                               200102                  
0014.00  *-------------------------------------------------------------------*                              200102                  
0015.00  *( 作業変数 )                                                                                      200102                  
0016.00 D PNL001PNL       S             20    INZ('PNL001PNL QTROBJ    ')                                   200102                  
0017.00 D AR              S              1A   DIM(256)                                                      200102                  
0018.00 D N               S              4S 0                                                               200102                  
0019.00                                                                                                     200102                  
0020.00 D DSPRCD        E DS                  EXTNAME(SHOHIN)                                               200102                  
0021.00 D  HNSNAM                46     59                                                                  200102                  
0022.00 D  DSPDTA                 1   1024                                                                  200102                  
0023.00 D                                     DIM(1024)                                                     200102                  
                                         (C) COPYRIGHT IBM CORP. 1981, 2007.                                                        
0024.00                                                                              
0025.00 C*-------------------------------------------------------------------------+ 
0026.00 C     *ENTRY        PLIST                                                  | 
0027.00 C                   PARM                    DSPRCD                         | 
0028.00 C                   PARM                    ERR               1            | 
0029.00 C                   PARM                    MSG             132            | 
0030.00 C*-------------------------------------------------------------------------+ 
0031.00 C                   SETOFF                                       99          
0032.00 C     SHCODE        CHAIN     SHOHIN                             99          
0033.00 C     *IN99         IFEQ      *ON                                            
0034.00 C                   EVAL      MSG = ' 商品コード ' +                         
0035.00 C                             %TRIMR(SHCODE) +                               
0036.00 C                             ' が見つかりませんでした。 '                   
0037.00 C                   ELSE                                                     
0038.00 C                   SETOFF                                       99          
0039.00 C     SHSCOD        CHAIN     HINSHU                             99          
0040.00 C     *IN99         IFEQ      *ON                                            
0041.00 C                   EVAL      MSG = ' 品種コード ' +                         
0042.00 C                             SHSCOD + ' の誤りです。 '                      
0043.00 C                   ENDIF                                                    
0044.00 C                   ENDIF                                                    
0045.00 C   99              EVAL      ERR = 'E'                                      
0046.00 C                   SETON                                        LR          
0047.00 C                   RETURN                                                   

[解説]

ご覧のとおりたった47ステップ数の小さなプログラムになっている。
これはこのRPGが商品マスター(SHOHIN)と品種マスター(HINSHU)に
CHAIN命令を実行しているたけの単なるバッチ処理プログラムであるからだ。
バッチ処理なので小さくて画面処理の必要がなくバグの発生可能性が低い。
先の CLP: PNL002CL も少し手を加えれば汎用的なものに変更することが
できる。
DSPPNL の部分はすべての業務で再利用できるので再開発する必要はない。
ということは別の照会業務を開発するのはこのPNL002というプログラムの
部分だけである。

つまり実行キーを押した、とかある機能キーを押した、とかの操作が
行われるようなイベントが発生したときだけの記述をそれぞれ行っていけば
よいわけである。

このようなプログラムの構造をイベント駆動とかイベント・トリガー型のように
表現する。
Windowsで言えば VisualBASICや VisualC++やJavaもイベント駆動である。
ソースが複数個のソースに分かれていることに長年RPGの開発を行ってきた人には
違和感があるかも知れない。

しかしDSPPNLPNL002CLのモジュール・オブジェクトは一旦バグのない
品質に優れたオブジェクトとして開発してしまえば次回からは
品質の保証されたオブジェクトを組み合わせて使うことができる。
これがオブジェクト指向の本質である。

今までのRPG開発では適用業務のすべての機能を毎回、一から開発しなければ
ならなかった。
しかしパネル・グループによるオブジェクト指向の開発であれば
オブジェクトは再利用できるので品質に優れた開発を短期間のうちに
完成させることができる。
さらに進めばプログラムを共通したものだけにしてプログラムは
開発せずにパネル・グループだけで適用業務を開発することができるようになる。

これが弊社の製品:「PANEL-WORKER」である。
DFU ではチエックもないので不安だしプログラムの知識がにくても
開発できるツールとして今なお現役で活躍している。

(詳細はこちらで)

パネル・グループによるオブジェクト指向開発り理解して頂いたところで
引き続きパネル・グループによるSFL表示の適用業務について
紹介していこう。

最後にここで使用したパネル・グループ PNL002PNL を紹介する。

[パネル・グループ: PNL002PNL ]

ソースはこちらから


( http://218.44.135.18/QSYS.LIB.PGMRLIB.LIB/QPNLSRC.FILE/PNL002PNL.MBR )

0001.00 :PNLGRP.                                                        
0002.00 :COPYR .(C) COPYRIGHT OFFICE QUATTRO 2020.                      
0003.00 :IMPORT  NAME='*' PNLGRP='QTRSRC/CMDHLP'.                       
0004.00 .*            -------------------------                         
0005.00 .*                 クラスの定義                                 
0006.00 .*            -------------------------                         
0007.00 :CLASS   NAME=PNL002CL                                          
0008.00          BASETYPE='CHAR 20'.                                    
0009.00 :TL.                                                            
0010.00 :TI      VALUE='"                    "'.PNL002CL  QTROBJ        
0011.00 :ETL.                                                           
0012.00 :ECLASS.                                                        
0013.00 :CLASS   NAME=ANSCL                                             
0014.00          BASETYPE='CHAR 1'.                                     
0015.00 :ECLASS.                                                        
0016.00 :CLASS   NAME=PNLNAMCL                                          
0017.00          BASETYPE='CHAR 10'.                                    
0018.00 :ECLASS.                                                        
0019.00 :CLASS   NAME=CSRLSTCL                                          
0020.00          BASETYPE='CHAR 10'.                                    
0021.00 :ECLASS.                                                        
0022.00 :CLASS   NAME=CSRVARCL                                          
0023.00          BASETYPE='CHAR 10'.                                    
0024.00 :ECLASS.                                  
0025.00 :CLASS   NAME=CSRPOSCL                    
0026.00          BASETYPE='BIN  15'.              
0027.00 :ECLASS.                                  
0028.00 :CLASS   NAME=CSREIDCL                    
0029.00          BASETYPE='CHAR 4'.               
0030.00 :ECLASS.                                  
0031.00 :CLASS   NAME=CSRNAMECL                   
0032.00          BASETYPE='CHAR 10'.              
0033.00 :ECLASS.                                  
0034.00 :CLASS   NAME=ADDRCDCL                    
0035.00          BASETYPE='ZONED 8 0'.            
0036.00 :ECLASS.                                  
0037.00 :CLASS   NAME=CHGRCDCL                    
0038.00          BASETYPE='ZONED 8 0'.            
0039.00 :ECLASS.                                  
0040.00 :CLASS   NAME=DLTRCDCL                    
0041.00          BASETYPE='ZONED 8 0'.            
0042.00 :ECLASS.                                  
0043.00 :CLASS   NAME=CHA010                      
0044.00          BASETYPE='CHAR    10'.           
0045.00 :ECLASS.                                  
0046.00 :CLASS   NAME=IGC024                      
0047.00          BASETYPE='IGC    24 OPEN'.       
0048.00 :ECLASS.                                     
0049.00 :CLASS   NAME=ZON070                         
0050.00          BASETYPE='ZONED   7 0'.             
0051.00 :ECLASS.                                     
0052.00 :CLASS   NAME=CHA004                         
0053.00          BASETYPE='CHAR     4'.              
0054.00 :ECLASS.                                     
0055.00 :CLASS   NAME=IGC014                         
0056.00          BASETYPE='IGC    14 OPEN'.          
0057.00 :ECLASS.                                     
0058.00 .*            -------------------------      
0059.00 .*                 変数の定義                
0060.00 .*            -------------------------      
0061.00 :VAR     NAME=PNL002   CLASS=PNL002CL.       
0062.00 :VAR     NAME=PNLNAM   CLASS=PNLNAMCL.       
0063.00 :VAR     NAME=ANS      CLASS=ANSCL.          
0064.00 :VAR     NAME=CSRLST   CLASS=CSRLSTCL.       
0065.00 :VAR     NAME=CSRPOS   CLASS=CSRPOSCL.       
0066.00 :VAR     NAME=CSRVAR   CLASS=CSRVARCL.       
0067.00 :VAR     NAME=CSREID   CLASS=CSREIDCL.       
0068.00 :VAR     NAME=CSRNAME  CLASS=CSRNAMECL.      
0069.00 :VAR     NAME=ADDRCD   CLASS=ADDRCDCL.       
0070.00 :VAR     NAME=CHGRCD   CLASS=CHGRCDCL.       
0071.00 :VAR     NAME=DLTRCD   CLASS=DLTRCDCL.       
0072.00 .*...( ユーザー変数定義 )...                                     
0073.00 :VAR     NAME=SHCODE   CLASS=CHA010.                             
0074.00 :VAR     NAME=SHNAME   CLASS=IGC024.                             
0075.00 :VAR     NAME=SHTANK   CLASS=ZON070.                             
0076.00 :VAR     NAME=SHSCOD   CLASS=CHA004.                             
0077.00 :VAR     NAME=HNSNAM   CLASS=IGC014.                             
0078.00 .*            -------------------------                          
0079.00 .*                 レコードの定義                                
0080.00 .*            -------------------------                          
0081.00 :VARRCD  NAME=PGMRCD  VARS='PNL002'.                             
0082.00 :VARRCD  NAME=HEDRCD  VARS='SHCODE'.                             
0083.00 :VARRCD  NAME=DSPRCD  VARS='SHCODE SHNAME SHTANK SHSCOD HNSNAM'. 
0084.00 :VARRCD  NAME=HNSRCD  VARS=HNSNAM.                               
0085.00 .*            -------------------------                          
0086.00 .*                 機能キーの定義                                
0087.00 .*            -------------------------                          
0088.00 :KEYL    NAME=HEDKEYL.                                           
0089.00 :KEYI    KEY=ENTER                                               
0090.00          HELP=ENTER                                              
0091.00          ACTION=ENTER                                            
0092.00          VARUPD=YES.                                             
0093.00 :KEYI    KEY=HELP                                                
0094.00          HELP=HELP                                               
0095.00          ACTION=HELP.                                            
0096.00 :KEYI    KEY=F3                 
0097.00          HELP=F3                
0098.00          ACTION='EXIT SET'      
0099.00          VARUPD=YES.            
0100.00 F3= 終了                        
0101.00 :EKEYL.                         
0102.00 :KEYL    NAME=DSPKEYL.          
0103.00 :KEYI    KEY=ENTER              
0104.00          HELP=ENTER             
0105.00          VARUPD=YES             
0106.00          ACTION=ENTER.          
0107.00 :KEYI    KEY=HELP               
0108.00          HELP=HELP              
0109.00          ACTION=HELP.           
0110.00 :KEYI    KEY=F12                
0111.00          HELP=F12               
0112.00          ACTION='CANCEL SET'    
0113.00          VARUPD=NO.             
0114.00 F12= 取消し                     
0115.00 :KEYI    KEY=PAGEUP             
0116.00          HELP=PAGEUP            
0117.00          ACTION=PAGEUP.         
0118.00 :KEYI    KEY=PAGEDOWN           
0119.00          HELP=PAGEDOWN          
0120.00          ACTION=PAGEDOWN.                        
0121.00 :EKEYL.                                          
0122.00 :KEYL    NAME=ENDKEYL.                           
0123.00 :KEYI    KEY=ENTER                               
0124.00          HELP=ENTER                              
0125.00          ACTION=ENTER.                           
0126.00 :KEYI    KEY=HELP                                
0127.00          HELP=HELP                               
0128.00          ACTION=HELP.                            
0129.00 :KEYI    KEY=F3                                  
0130.00          HELP=F3                                 
0131.00          ACTION='EXIT SET'                       
0132.00          VARUPD=NO.                              
0133.00 F3= 終了                                         
0134.00 :KEYI    KEY=F12                                 
0135.00          HELP=F12                                
0136.00          ACTION='CANCEL SET'                     
0137.00          VARUPD=NO.                              
0138.00 F12= 取消し                                      
0139.00 :EKEYL.                                          
0140.00 .*            -------------------------          
0141.00 .*                 ヘルプの定義                  
0142.00 .*            -------------------------          
0143.00 :HELP    NAME=DSPHEADH. 商品マスターの登録       
0144.00 :PC.                                          
0145.00  初期画面                                     
0146.00 :EHELP.                                       
0147.00 :HELP    NAME=DSPDTAH. 商品マスターの登録     
0148.00 :PC.                                          
0149.00  明細画面                                     
0150.00 :EHELP.                                       
0151.00 :HELP    NAME=DSPENDH. 商品マスターの登録     
0152.00 :PC.                                          
0153.00  終了画面                                     
0154.00 :EHELP.                                       
0155.00 .* STRHLPDFN      :  DO NOT REMOVE THIS LINE  
0156.00 :HELP    NAME=SHCODEH. 商品コード             
0157.00 :PC.                                          
0158.00  商品コード                                   
0159.00 :EHELP.                                       
0160.00 :HELP    NAME=SHNAMEH. 商品名                 
0161.00 :PC.                                          
0162.00  商品名                                       
0163.00 :EHELP.                                       
0164.00 :HELP    NAME=SHTANKH. 単価                   
0165.00 :PC.                                          
0166.00  単価                                         
0167.00 :EHELP.                                       
0168.00 :HELP    NAME=SHSCODH. 品種コード                  
0169.00 :PC.                                               
0170.00  品種コード                                        
0171.00 :EHELP.                                            
0172.00 :HELP    NAME=HNSNAMH. 品種名                      
0173.00 :PC.                                               
0174.00  品種名                                            
0175.00 :EHELP.                                            
0176.00 .* ENDHLPDFN      :  DO NOT REMOVE THIS LINE       
0177.00 .*            -------------------------            
0178.00 .*               表 示 パ ネ ル                
0179.00 .*            -------------------------            
0180.00 .*    ------------------------                     
0181.00 .*    DSPHEAD : 初期画面                           
0182.00 .*    ------------------------                     
0183.00 :PANEL   NAME=DSPHEAD                              
0184.00          HELP='DSPHEADH'                           
0185.00          KEYL=HEDKEYL                              
0186.00          PANELID=PNLNAM                            
0187.00          ENTER='CALL PNL002'                       
0188.00          CSRVAR=CSRVAR                             
0189.00          CSRPOS=CSRPOS                             
0190.00          CSRLST=CSRLST                             
0191.00          CSREID=CSREID                             
0192.00          CSRNAME=CSRNAME      
0193.00          TOPSEP=NONE.         
0194.00  商品マスターの照会           
0195.00 :DATA    DEPTH=2              
0196.00          HELP='DSPHEADH'      
0197.00          BOTSEP=NONE.         
0198.00 :DATACOL WIDTH=58.            
0199.00 :DATACOL WIDTH='*'.           
0200.00 :EDATA.                       
0201.00 :DATA    DEPTH=10             
0202.00          SCROLL=NO            
0203.00          LAYOUT=1             
0204.00          BOTSEP=SPACE.        
0205.00 :DATACOL WIDTH=20.            
0206.00 :DATACOL WIDTH='*'.           
0207.00 .*                            
0208.00 :DATAGRP GRPSEP=NONE          
0209.00          COMPACT.             
0210.00 .* DO                         
0211.00 :DATAI   VAR=SHCODE           
0212.00          HELP=SHCODEH         
0213.00          USAGE=INOUT.         
0214.00  商品コード                   
0215.00 .* END                        
0216.00 :EDATAGRP.                                                            
0217.00 :BOTINST. 登録または変更するコードを打鍵して実行キーを押してください。
0218.00 :EDATA.                                                               
0219.00 :EPANEL.                                                              
0220.00 .*    ------------------------                                        
0221.00 .*    DSPDTA01 : 明細画面                                             
0222.00 .*    ------------------------                                        
0223.00 :PANEL   NAME=DSPDTA01                                                
0224.00          HELP='DSPDTAH'                                               
0225.00          KEYL=DSPKEYL                                                 
0226.00          PANELID=PNLNAM                                               
0227.00          ENTER='RETURN 27'                                            
0228.00          CSRVAR=CSRVAR                                                
0229.00          CSRPOS=CSRPOS                                                
0230.00          CSRLST=CSRLST                                                
0231.00          CSREID=CSREID                                                
0232.00          CSRNAME=CSRNAME                                              
0233.00          TOPSEP=NONE.                                                 
0234.00  商品マスターの照会                                                   
0235.00 :DATA    DEPTH=2                                                      
0236.00          HELP='DSPHEADH'                                              
0237.00          BOTSEP=NONE.                                                 
0238.00 :DATACOL WIDTH=58.                                                    
0239.00 :DATACOL WIDTH='*'.                                                   
0240.00 :EDATA.                      
0241.00 :DATA    DEPTH=01            
0242.00          SCROLL=NO           
0243.00          LAYOUT=2            
0244.00          BOTSEP=NONE         
0245.00          COMPACT.            
0246.00 :DATACOL WIDTH=20.           
0247.00 :DATACOL WIDTH='*'.          
0248.00 .*                           
0249.00 :DATAGRP GRPSEP=NONE         
0250.00          COMPACT.            
0251.00 :DATAI   VAR=SHCODE          
0252.00          HELP=SHCODEH        
0253.00          USAGE=OUT.          
0254.00  商品コード                  
0255.00 :EDATAGRP.                   
0256.00 :EDATA.                      
0257.00 :DATA    DEPTH='*'           
0258.00          SCROLL=YES          
0259.00          LAYOUT=1            
0260.00          BOTSEP=NONE         
0261.00          COMPACT.            
0262.00 :DATACOL WIDTH=20.           
0263.00 :DATACOL WIDTH='*'.          
0264.00 :DATAI   VAR=SHNAME          
0265.00          HELP=SHNAMEH        
0266.00          USAGE=OUT.          
0267.00  商品名                      
0268.00 :DATAI   VAR=SHTANK          
0269.00          JUSTIFY=RIGHT       
0270.00          HELP=SHTANKH        
0271.00          USAGE=OUT.          
0272.00  単価                        
0273.00 :DATAI   VAR=SHSCOD          
0274.00          HELP=SHSCODH        
0275.00          USAGE=OUT.          
0276.00  品種コード                  
0277.00 :DATAIX  VAR=HNSNAM          
0278.00          USAGE=OUT.          
0279.00 :EDATA.                      
0280.00 :EPANEL.                     
0281.00                              
0282.00 :EPNLGRP.                    

[解説]

初期画面パネル: DSPHEAD

0187.00          ENTER='CALL PNL002'

のようにして実行キーが押されるとプログラム PNL002CLを呼び出すように
設定されている。

0061.00 :VAR     NAME=PNL002   CLASS=PNL002CL.

0081.00 :VARRCD  NAME=PGMRCD  VARS='PNL002'.

で、このPGMRCD にCLP: DSPPNLCL で

0108.00              CALL       PGM(QUIPUTV) PARM(&HANDLE &PGMOBJLIB &DTALEN +  
0109.00                           'PGMRCD    ' &APIERR)

でプログラム名: PNL002CL QTROBJ をセットしている。

[オブジェクト指向のまとめ]

DSPPNL --------------------------> DSPHEAD------------------------> DSPDTA01
パネル・グループを *PNLGRP [実行キー] パネル: DSPDTA01を
表示するだけ パネル:DSPHEADを表示   表示

[オブジェクト指向とは]

・再利用可能なプログラム・オブジェクトに分割して開発
・イベント駆動型の処理構造

[利点]

・品質が保証されているオブジェクトを組み合わせることによって
短期間で高品質な適用業務の開発が可能となる。

・IBMユーティリティも含めてインターフェース・デザインや操作も
統一化を測ることができる。
再デザインしたとしても常に最適なデザイン・バランスが保たれており
誰が開発したとしても同じデザイン結果を得ることができる。