PANEL グループ

17. パネル・グループを処理する RPGプログラム

パネル・グループに対する入出力コマンドやRPGの命令は
用意されていないので、すべてAPIによる操作が必要である。

  1.最初にAPI: QUIOPNDA によってパネル・グループをオープンする。

2.API:QUIDSPP によってパネルをオープンする。

3.API:QUIGETV によってパネル・グループから値を取得する

4.API:QUIPUTV によって値をパネル・グループに更新する

5.API:QUICLOA によってパネル・グループをクローズする。

というような操作が必要となる。
DSPF を処理するように RPG で記述すると下記のようになる。

[サンプルRPG : PNL001 ]

ソースはこちらから

0001.00 H DFTNAME(PNL001) DATEDIT(*YMD/) BNDDIR('QC2LE')                          
0002.00 F********** 商品マスターの登録 ****************************************   
0003.00 FSHOHIN    UF A E           K DISK    EXTFILE('QTRFIL/SHOHIN')            
0004.00 FHINSHU    IF   E           K DISK    EXTFILE('QTRFIL/HINSHU')            
0005.00 F**********************************************************************   
0006.00                                                                           
0007.00  * CRTRPGMOD  OBJ(QTEMP/PNL001)   SRCFILE(QTRSRC/QRPGLESRC)               
0008.00  * DBGVIEW(*SOURCE) AUT(*ALL)                                             
0009.00  * CRTPGM PGM(QTROBJ/PNL001) MODULE(QTEMP/PNL001 ACTGRP(*NEW)             
0010.00  *        AUT(*ALL)                                                       
0011.00                                                                           
0012.00  *-------------------------------------------------------------------*    
0013.00  *  2017/05/01 : 作成                                                     
0014.00  *-------------------------------------------------------------------*    
0015.00  *( 作業変数 )                                                            
0016.00 D PNL001PNL       S             20    INZ('PNL001PNL QTROBJ    ')         
0017.00 D AR              S              1A   DIM(256)                            
0018.00 D N               S              4S 0                                     
0019.00 D TRUE            S              1A   DIM(256)                            
0020.00 D TRUE#           S              4B 0 INZ(0)                              
0021.00 D FALSE#          S              4B 0 INZ(-1)                             
0022.00 D RES             S              4B 0                                     
0023.00 D HANDLE          S              8A                                       
0024.00 D DTALEN          S              4B 0 INZ(1024)               
0025.00 D QUOT            C                   CONST(X'7D')            
0026.00 D OE              C                   CONST(X'0E')            
0027.00 D OF              C                   CONST(X'0F')            
0028.00 D NULL            C                   CONST(X'00')            
0029.00                                                               
0030.00  *( PNLGRP 用変数 )                                           
0031.00 D CFKEY           S              4A   INZ(X'00000000')        
0032.00 D PANEL           S             10A                           
0033.00 D AGAIN           S              1A   INZ('Y')                
0034.00 D STACK           S              4A   INZ(X'00000001')        
0035.00 D MSGKEY          S              4A                           
0036.00 D ERRLST          S              4A                           
0037.00 D WAITTIME        S              4A   INZ(X'FFFFFFFF')        
0038.00 D CF03            S              4A   INZ(X'FFFFFFFC')        
0039.00 D CF05            S              4A   INZ(X'00000005')        
0040.00 D CF06            S              4A   INZ(X'00000006')        
0041.00 D CF12            S              4A   INZ(X'FFFFFFF8')        
0042.00 D CF13            S              4A   INZ(X'0000000D')        
0043.00 D CF14            S              4A   INZ(X'0000000E')        
0044.00 D CF15            S              4A   INZ(X'0000000F')        
0045.00 D CF17            S              4A   INZ(X'00000011')        
0046.00 D CF18            S              4A   INZ(X'00000012')        
0047.00                                                               
0048.00 D MSGFILLIB       S             20A   INZ('QCPFMSG   QSYS      ') 
0049.00 D MSGDTALEN       S              4A   INZ(X'00000084')            
0050.00 D MSGSTK          S              4A   INZ(X'00000001')            
0051.00 D MSGCOUNT        S             10I 0 INZ(1)                      
0052.00 D MSGDTA          S            132A                               
0053.00                                                                   
0054.00 D APIERR          DS                  QUALIFIED                   
0055.00 D  GETBYT                 1      4B 0 INZ(160)                    
0056.00 D  AVLBYT                 5      8B 0 INZ(0)                      
0057.00 D  APIID                  9     15                                
0058.00 D  APIDTA                17    160                                
0059.00                                                                   
0060.00 D DSPRCD        E DS                  EXTNAME(SHOHIN)             
0061.00 D  HNSNAM                46     59                                
0062.00 D  DSPDTA                 1   1024                                
0063.00 D                                     DIM(1024)                   
0064.00                                                                   
0065.00 D*( OPEN_         のプロトタイプ宣言 )                            
0066.00 D OPEN_           PR            10I 0                             
0067.00 D  PNLGRP                       20A   VALUE                       
0068.00                                                                   
0069.00 D*( DSPPNL_       のプロトタイプ宣言 )                            
0070.00 D DSPPNL_         PR                                              
0071.00 D  PANEL                        10A   VALUE                       
0072.00                                                                      
0073.00 D*( SNDMSG_       のプロトタイプ宣言 )                               
0074.00 D SNDMSG_         PR                                                 
0075.00 D  MSGDTA                      132A   VALUE                          
0076.00 D  MSGTYPE                      10A   VALUE                          
0077.00                                                                      
0078.00 D*( CLOSE_        のプロトタイプ宣言 )                               
0079.00 D CLOSE_          PR                                                 
0080.00 D  HANDLE                        8A   VALUE                          
0081.00                                                                      
0082.00 D*( LRRTN_        のプロトタイプ宣言 )                               
0083.00 D LRRTN_          PR                                                 
0084.00                                                                      
0085.00  *( 初期画面 )                                                       
0086.00 C     START         TAG                                              
0087.00 C                   CALLP     DSPPNL_('DSPHEAD')                     
0088.00  *   ( CF03 )- 終了                                                  
0089.00 C     *IN03         IFEQ      *ON                                    
0090.00 C                   CALLP     LRRTN_                                 
0091.00 C                   RETURN                                           
0092.00 C                   ENDIF                                            
0093.00 C                   SETOFF                                       99  
0094.00 C     SHCODE        CHAIN     SHOHIN                             99  
0095.00 C                   EXSR      CHECK                                  
0096.00 C   99              GOTO      START                                  
0097.00  *( 明細画面 )                                                       
0098.00 C     DSPLY         TAG                                              
0099.00 C                   CALLP     DSPPNL_('DSPDTA01')                    
0100.00  *   ( CF03 )- 終了                                                  
0101.00 C     *IN03         IFEQ      *ON                                    
0102.00 C                   CALLP     LRRTN_                                 
0103.00 C                   RETURN                                           
0104.00 C                   ENDIF                                            
0105.00  *   ( CF12 )- 戻る                                                  
0106.00 C     *IN12         IFEQ      *ON                                    
0107.00 C                   SETOFF                                       12  
0108.00 C                   GOTO      START                                  
0109.00 C                   ENDIF                                            
0110.00  *    ( 実行キー )                                                   
0111.00 C                   EXSR      CHECK                                  
0112.00 C                   GOTO      DSPLY                                  
0113.00                                                                      
0114.00 C******************************************************              
0115.00 C     *INZSR        BEGSR                                            
0116.00 C******************************************************              
0117.00 C*  初期 CYCLE のみの実行                                            
0118.00 C                   CLEAR                   APIERR                   
0119.00 C                   EVAL      RES = OPEN_(PNL001PNL)                 
0120.00 C     RES           IFEQ      FALSE#                                     
0121.00 C                   SETON                                        LR      
0122.00 C                   RETURN                                               
0123.00 C                   ENDIF                                                
0124.00 C                   ENDSR                                                
0125.00 C******************************************************                  
0126.00 C     CHECK         BEGSR                                                
0127.00 C******************************************************                  
0128.00 C     *IN99         IFEQ      *ON                                        
0129.00 C                   EVAL      MSGDTA = ' 商品コード ' +                  
0130.00 C                             %TRIMR(SHCODE) +                           
0131.00 C                             ' が見つかりませんでした。 '               
0132.00 C                   CALLP     SNDMSG_(MSGDTA:'*COMP')                    
0133.00 C                   ELSE                                                 
0134.00 C                   MOVE      *BLANKS       HNSNAM                       
0135.00 C                   SETOFF                                       99      
0136.00 C     SHSCOD        CHAIN     HINSHU                             99      
0137.00 C     *IN99         IFEQ      *ON                                        
0138.00 C                   EVAL      MSGDTA = ' 品種コード ' +                  
0139.00 C                             SHSCOD + ' の誤りです。 '                  
0140.00 C                   CALLP     SNDMSG_(MSGDTA:'*COMP')                    
0141.00 C                   ENDIF                                                
0142.00  *--------------------------------------------------------------------   
0143.00 C                   CALL      'QUIPUTV'                                  
0144.00 C                   PARM                    HANDLE                     
0145.00 C                   PARM                    DSPRCD                     
0146.00 C                   PARM                    DTALEN                     
0147.00 C                   PARM      'DSPRCD'      VARRCD           10        
0148.00 C                   PARM                    APIERR                     
0149.00  *-------------------------------------------------------------------- 
0150.00 C                   ENDIF                                              
0151.00 C                   ENDSR                                              
0152.00  *********************************************************             
0153.00 P OPEN_           B                   EXPORT                           
0154.00  *********************************************************             
0155.00 D                 PI            10I 0                                  
0156.00 D  PNLGRPLIB                    20A   VALUE                            
0157.00                                                                        
0158.00 D AREA            S              4A   INZ(X'FFFFFFFF')                 
0159.00 D EXITPG          S              4A   INZ(X'00000000')                 
0160.00                                                                        
0161.00 C* ( QUIOPNDA : パネル・グループのオープン )*/                         
0162.00  *-------------------------------------------------------------------- 
0163.00 C                   CALL      'QUIOPNDA'                               
0164.00 C                   PARM                    HANDLE                     
0165.00 C                   PARM                    PNLGRPLIB                  
0166.00 C                   PARM                    AREA                       
0167.00 C                   PARM                    EXITPG                     
0168.00 C                   PARM      'N'           OPNOPT            1       
0169.00 C                   PARM                    APIERR                    
0170.00  *--------------------------------------------------------------------
0171.00 C                   IF        APIERR.AVLBYT <> 0                      
0172.00 C                   CALLP     LRRTN_                                  
0173.00 C                   RETURN    FALSE#                                  
0174.00 C                   ENDIF                                             
0175.00 C                   RETURN    TRUE#                                   
0176.00 P                 E                                                   
0177.00  *********************************************************            
0178.00 P DSPPNL_         B                   EXPORT                          
0179.00  *********************************************************            
0180.00 D                 PI                                                  
0181.00 D  PANEL                        10A   VALUE                           
0182.00                                                                       
0183.00  *--------------------------------------------------------------------
0184.00 C                   CALL      'QUIDSPP'                               
0185.00 C                   PARM                    HANDLE                    
0186.00 C                   PARM                    CFKEY                     
0187.00 C                   PARM                    PANEL                     
0188.00 C                   PARM      'Y'           AGAIN             1       
0189.00 C                   PARM                    APIERR                    
0190.00 C                   PARM      'N'           USRTSK            1       
0191.00 C                   PARM                    STACK                     
0192.00 C                   PARM      '*CALLER   '  UIMMSG           10         
0193.00 C                   PARM                    MSGKEY                      
0194.00 C                   PARM      'D'           CSROPT            1         
0195.00 C                   PARM      'NONE'        LASLST            4         
0196.00 C                   PARM                    ERRLST                      
0197.00 C                   PARM                    WAITTIME                    
0198.00  *--------------------------------------------------------------------  
0199.00 C                   MOVE      *BLANKS       MSGKEY                      
0200.00 C                   SELECT                                              
0201.00 C                   WHEN      CFKEY = CF03                              
0202.00 C                   SETON                                        03     
0203.00 C                   WHEN      CFKEY = CF12                              
0204.00 C                   SETON                                        12     
0205.00  *( 実行キー )                                                          
0206.00 C                   OTHER                                               
0207.00  *--------------------------------------------------------------------  
0208.00 C                   CALL      'QUIGETV'                                 
0209.00 C                   PARM                    HANDLE                      
0210.00 C                   PARM                    DSPRCD                      
0211.00 C                   PARM                    DTALEN                      
0212.00 C                   PARM      'DSPRCD'      VARRCD           10         
0213.00 C                   PARM                    APIERR                      
0214.00  *--------------------------------------------------------------------  
0215.00 C                   ENDSL                                               
0216.00 P                 E                                                       
0217.00  *********************************************************                
0218.00 P CLOSE_          B                   EXPORT                              
0219.00  *********************************************************                
0220.00 D                 PI                                                      
0221.00 D  HANDLE                        8A   VALUE                               
0222.00                                                                           
0223.00  *--------------------------------------------------------------------    
0224.00 C                   CALL      'QUICLOA'                                   
0225.00 C                   PARM                    HANDLE                        
0226.00 C                   PARM      'M'           OPT               1           
0227.00 C                   PARM                    APIERR                        
0228.00  *--------------------------------------------------------------------    
0229.00 P                 E                                                       
0230.00  *********************************************************                
0231.00 P SNDMSG_         B                   EXPORT                              
0232.00  *********************************************************                
0233.00 D                 PI                                                      
0234.00 D  MSGDTA                      132A   VALUE                               
0235.00 D  MSGTYPE                      10A   VALUE                               
0236.00                                                                           
0237.00  *--------------------------------------------------------------------    
0238.00 C                   CALL      'QMHSNDPM'                                  
0239.00 C                   PARM      'CPF9897'     MSGID             7           
0240.00 C                   PARM                    MSGFILLIB                 
0241.00 C                   PARM                    MSGDTA                    
0242.00 C                   PARM                    MSGDTALEN                 
0243.00 C                   PARM                    MSGTYPE                   
0244.00 C                   PARM      '*'           MSGSTK           10       
0245.00 C                   PARM                    MSGCOUNT                  
0246.00 C                   PARM                    MSGKEY                    
0247.00 C                   PARM                    APIERR                    
0248.00  *--------------------------------------------------------------------
0249.00 P                 E                                                   
0250.00 C******************************************************               
0251.00 P LRRTN_          B                   EXPORT                          
0252.00 C******************************************************               
0253.00 D                 PI                                                  
0254.00 C                   SETON                                        LR   
0255.00 C     HANDLE        IFNE      *BLANKS                                 
0256.00 C                   CALLP     CLOSE_(HANDLE)                          
0257.00 C                   ENDIF                                             
0258.00 P                 E                                                   

[解説]

最初に実行されるサブ・ルーチン: *INZSRQUIOPNDA でパネル・グループを
オープンしてハンドルを取得している。
ハンドルという概念に馴染みのない人も多いと思うがハンドルとは
ジョブの中でオープンされているパネル・グループを識別するための固有の番号である。
Windowsを考えるとイメージしやすい。
Windowsでもウィンドウ・ハンドルという識別があって複数のウィンドウの中から
どれであるかを識別するための識別子である。
Windowsを操作しているとデスクトップの中にも色々なウィンドウがオープンしているのが
わかるように複数のウィンドウがあるとその中でウィンドウを特定する必要かある。

これと同じように個別のパネル・グループを特定するためにハンドルという固有識別子を
パネル・グループをオープンすると同時に取得して以降は QUICLOA で閉じるまで
そのハンドルによって操作を行う。

パネル・グループをオープンすると QUIDSPP によってパネルを表示する。
メッセージはメッセージを出力した後の MSGKEYQUIDSPP で指定すると
メッセージを表示することができる。
パネルからのエンド・ユーザーが押した機能キーは CFKEY によって
受取ることができる。

変数値の受取りや更新は VARRCD で定義しておいた変数レコードが
入出力バッファーになるので QUIGETVQUIPUTV で入出力を行うことができる。

画面は次のように実行される。

CALL QTROBJ/PNL001 + [実行]

[初期画面パネル: DSPHEAD]


                              商品マスターの登録             
                                                            
                                                             
 商品コード . . . . .   NV-CF1                               
                                                      
                                                             
                                                             
 登録または変更するコードを打鍵して実行キーを押してください。
                                                   
                                                          
                                                             
 F3= 終了                                                    
 (C) COPYRIGHT OFFICE QUATTRO 2020.                          


[明細画面パネル: DSPDTA01 ]


                              商品マスターの登録                              
                                                                              
                                                                              
 商品コード . . . . :   NV-CF1                                                
 商品名 . . . . . . :    Cカセット編集ビデオ                                 
 単価 . . . . . . . :      58000                                              
 品種コード . . . . :   0002   ビデオデッキ                                   
                                                               
                                                                              
                                                                              
                                                                        終わり
 F3= 終了   F12= 取消し                                                       

[解説]

RPG と比べて動きはどうだろう?
もし実際に実行されたのであれば RPGに比べてパフォーマンスの良さに
驚かれるはずである。
パネル・グループは RPGやCOBOLに比べると抜群の速さで実行される。
しかしパネル・グループを処理するRPGはご覧のようにDSPFを処理するRPGと
比べてみると冗長で面倒なように見えてしまう。
実はここで示したRPGはRPGプログラマーにとってわかりやすいように
あえてRPGの処理のように記述したものであり本来のパネル・グループの機能を
発揮するような記述ではない。
それではパネル・グループを処理する適切なプログラムとはどのような
ものだろうか?
実はパネル・グループの機能を生かすオブジェクト指向の開発がある。
今までの既成概念が変わってしまうような驚きのオブジェクト指向による開発を
次回に紹介しよう。