RPGによるコーディング 会話型処理(3)
前ページ 次ページ 目 次


RPGによるコーディング方法を取り上げます。随時増ページの予定です。
本ページは前のページが下敷きになっています。



ウインドウ枠画面を利用した検索処理


画面入力の際、マスター検索をする方法を紹介します。
例として、受注登録の第2画面での得意先コード入力のフィールドでマスター(M420)の検索を想定します。


画面ファイルの改定

検索要求のFキーはF4キーを使用するものとします。F4キーを使えるよう、FMT02にCF04を
追加します。

     A          R FMT02                      TEXT(' 第二画面 ')        
     A                                       OVERLAY  PROTECT          
     A                                       CF03  CF04 CF12           

第2画面処理での入力後の処理の改定

F4キーがおされたときの処理を追加します。

2.第2画面のとき
  マスターのデータ部分取得のための画面を表示します。
  第2画面から入力を取得します。
  2.1 F04キーのとき、検索処理をします。
     (外部プログラムを呼び出します)
  2.2 F12キーのとき、第1画面への番号にします。
  2.3 実行キーのとき入力チェックをします。
     結果OKなら第3画面への画面番号にします。

実際には内部サブルーチンSB2220を追加し、その中で検索プログラムの呼出し等を行います。

 |    C* 画面表示                                                       
 |    C                     WRITEFMT99                                  
 |    C                     WRITEFMT01                                  
 |    C                     EXFMTFMT02                                  
 |    C                     MOVE *BLANK    S9MSG                        
 |    C*                                                                
 |    C                     SELEC                                       
 |    C           *INKD     WHEQ *ON                         取消キー   
 |    C                     EXSR SB2220                      検索処理   
 |    C           *INKL     WHEQ *ON                         取消キー   
 |    C                     Z-ADD01        W@FMT                        
 |    C                     OTHER                                       
 |    C                     EXSR SB2230                      入力 チェック  
 |    C                     ENDSL                                       


検索処理の内容は次のようになります。

1.カーソル位置を取得します。
2.カーソル位置が得意先コードのフィールドなら、外部の検索プログラムを呼び出します。
(すなわち、受注登録のプログラムと検索プログラムはまったく独立したプログラムです。)
結果の得意先コードがブランクでなければ、画面フィールドにセットします。

コーディングは次のようになります。

     C*          SB2220    検索処理                                    
     C*--------------------------------------------------------------- 
     C           SB2220    BEGSR                                       
     C*                                                                
     C* カーソル位置の獲得                                             
     C                     MOVELWSLIN     WSLINC            行         
     C                     MOVELWSCOL     WSCOLC            桁         
     C* 検索プログラム呼出し                                           
     C           WSLINB    IFEQ 004                         行         
     C           WSCOLB    IFGE 011                         桁 FROM    
     C           WSCOLB    ANDLE015                         桁 TO      
     C                     MOVELS2TKNO    P@TKNO            得意先 CODE
     C                     CALL 'KM420'                     検索 プログラム
     C                     PARM           P@TKNO  5                    
     C                     PARM           P@NMKN 20                    
     C* 戻りの得意先コードがブランクでなければ画面にセットする。
     C           P@TKNO    IFNE *BLANK                                 
     C                     MOVELP@TKNO    S2TKNO                       
     C                     ENDIF                                       
     C                     ENDIF                                       
     C                     ENDIF                                       
     C*                                                                
     C                     ENDSR    


検索プログラム

検索プログラムは画面にマスターのレコードを表示し、選択された行のコードを戻り値として
呼出し側に返します。
検索プログラムに要求されることは、次のとおりです。

1.マスターのレコードが大量にあっても処理できること。
2.前後に簡単にスクロールして表示できること。
3.コード順だけでなく、他のキー順でも処理できること。
4.できるだけ現在の画面の邪魔にならないようにPOPアップ(重ね表示)の形の画面のこと。

前準備

検索のための画面

ウインドウ枠機能を使って画面を構成します。画面の大きさは、17行x55カラムです。
境界は*の文字を使用してあらわします。

00000000001111111111222222222233333333334444444444555555555566666666667777777777
                                                                                
                                                                                
                                                                                
                                                                                
          ***********************************************************           
          *                     得意先マスター検索                   *           
          *                                                         *           
          *   コード          得意先カナ                             *           
          *   番号を入力して下さい  0                                *           
          *  NO  コード         得意先名称                             *           
          *   1  11111   一番星運送株式会社・・・・・・・・・・;      *           
          *   2  11112   二番千時興業株式会社・・・・・・・・・;      *           
          *   3  11113   三羽ガラス工業株式会社・・・・・・・・;      *           
          *   4  11114   四天王寺商店・・・・・・・・・・・・・;      *           
          *   5  11115   五目ちらし印刷株式会社・・・・・・・・;      *           
          *   6  11116   六地蔵農機具販売株式会社・・・・・・・;      *           
          *   7  11117   七福神プレス有限会社・・・・・・・・・;      *           
          *   8  11118   八つ当り食品産業株式会社・・・・・・・;      *           
          *   9  11119   九層倍薬品販売株式会社・・・・・・・・;      *           
          *  F3= 終了                                               *           
          *                                                         *           
          *                                                         *           
          ***********************************************************           
                                                                                
00000000001111111111222222222233333333334444444444555555555566666666667777777777

ウインドウ枠

ウインドウ枠は、WINDOWパラメータとWDWBORDERパラメータで定義します。
WINDOWは枠の位置と大きさを、WDWBORDERは境界として使用する文字とその属性
を記述します。上記のウインドウ枠の記述は次のようになります。

     A* WIN01    :  ウインドウ枠宣言                                   
     A          R WIN01                     TEXT(' ウインドウ枠宣言 ') 
     A                                      WINDOW( 5 11 17 55)        
     A                                      WDWBORDER((*DSPATR RI) +   
     A                                      (*CHAR '********'))   
     A*---------------------------------------------------------------*
     A          R WIN02                     TEXT('DUMMY')
     A                                      ASSUME
     A                                 24 79' '     

ウインドウ枠つきの画面を通常に表示するとそれまで表示されていた画面はクリアされてしまいます。
このクリアを抑止するのが、ASSUMEパラメータです。
このパラメータは別の様式に定義しておくだけで、プログラムで出力する必要はありません。

検索のためのウインドウ画面で必要な様式は、つぎのようになります。
 * サブファイル制御部分(CTL01):タイトル行から項目見だしの行まで。
 * サブファイルの部分(SFL01):明細の9行分
 * キーガイドとエラーメッセージ部分部分(FMT99)
 * ウィンドウ枠宣言部分(WIN01)
 * ASSUMEの部分(WIN02)

検索プログラム

検索プログラムは次のような仕様とします。

検索画面を表示します。
得意先コードのフィールドに入力あれば、得意先コード順のファイルを検索し、そのコードから
順に9件表示します。得意先カナのフィールドに入力があれば、カナ順のファイルを読取りし、
入力されたカナから順に9件表示します。
両方に入力されたときは得意先コードを優先します。
ロールダウンキーが押されたときは、位置から後続9件分を表示します。
ロールアップキーがおされたときは、現在の位置から前9件分を表示します。
番号選択に数字が入力されたなら、その行を選択したものとして、その得意先コードをパラメータ
にセットして呼び出しもとにもどります。

制御仕様書

省略します。

ファイル仕様書

検索画面ファイル

サブファイルを使用する会話型ファイルとして記述します。
コード順得意先マスター(M420)、カナ順得意先マスター(M420L01)は同じレコード
様式名なので、一方(M420L01)をリネームします。
コーディングは次のようになります。

     F*-------------------------------------------------------------- 
     F* 検索画面                                                      
     FKM420S  CF  E                    WORKSTN                        
     F                                        RRN   KSFILE SFL01      
     F* 得意先マスター                                                
     FM420    IF  E           K        DISK                           
     F*                                                               
     F* 得意先マスター L01 カナ 順                                      
     FM420L01 IF  E           K        DISK                           
     F            M420R                             KRENAMEM420R01    

制御用の画面番号

画面は1枚だけですが、画面番号による会話型処理の制御のパターンを踏襲します。

サブファイル用の相対レコード番号(RRN)とページあたりの行数

入力仕様書で記述します。演算仕様書で記述しても差し支えありません。

コーディングは以下のようになります。

     I* コントロールフラグ                                            
     IWFLG        DS                                                  
     I I            1                         1   20W@FMT             
     I*   サブファイル用                                              
     I            DS                                                  
     I I            0                     P   1   30RRN               
     I I            9                     P   4   50WSPAG             

キーリスト

コード順、カナ順に読み取りするためのキーリストを記述しておきます。

     C* 得意先マスター                                                 
     C           KLST01    KLIST                                       
     C                     KFLD           TKTKNO            得意先 CD  
     C* 得意先マスター L01                                             
     C           KLST02    KLIST                                       
     C                     KFLD           TKNMKN            得意先 (カナ)

基本的ロジック

画面番号(W@FMT)で繰り返しを制御します。

     C                     EXSR SBINZ                       初期設定処 
     C*                                                                
+----C           W@FMT     DOWEQ01                                     
|    C                     EXSR SB1000                      第1画面処 
+----C                     ENDDO                                       
     C*                                                                
     C                     EXSR SBEND                       終了処理   

初期設定

初期設定では、パラメータで与えられたコードによってファイルを読取り、サブファイルにセットします。
また、ウインドウ枠の様式の出力を行います。

     C           SBINZ     BEGSR                                       
     C*                                                                
     C                     Z-ADD000       N       70                   
     C* キーのセット                                                   
     C                     MOVELP@TKNO    S1TKNO            得意先 CD  
     C                     MOVELP@TKKN    S1NMKN            得意先 (カナ)
     C* マスター読取り                                                   
     C                     EXSR SBCSFL                      SFLINZ     
     C                     EXSR SB1220                                 
     C                     MOVELMSG,01    S1MSG             MSG     
     C* ウィンドウ枠定義レコード出力                                   
     C                     WRITEWIN01                      WINDOW 枠   
     C*                                                                
     C                     ENDSR                                       

第一画面処理(検索画面処理)

検索画面を表示し、入力によって、終了・ロールダウン・ロールアップ・選択終了の処理をします。

入力後の処理

1.F3、F12キー
  F3、F12キーのときは処理中断とし、得意先コードはブランクに、画面番号を0にします。
2.前ページ処理
  ロールダウンのときは、内部サブルーチンSB1210を呼出し前ページ処理をします。
3.ロールアップ
  ロールアップのときは、内部ルーチンSB1220を呼出し次ページ処理をします。
4.実行キー
  実行キーのときは、SB1230を呼出します。

コーディングは次のようになります。

     C*          SB1000   第1画面処理                              
     C*--------------------------------------------------------------  
     C           SB1000    BEGSR                                       
     C*                                                                
     C*   第1画面ループ処理                                           
+----C           W@FMT     DOWEQ01                                     
|    C* 画面出力                                                       
|    C                     WRITEFMT99                       CMDキーガイド 
|    C                     SETON                     24                
|    C                     EXFMTCTL01                       サブファイル 画 
|    C                     SETOF                     24                
|    C* 入力処理                                                       
|+---C                     SELEC                                       
||   C*   F3 (終了) ,F12 (前画面)                                  
|+---C           *INKC     WHEQ *ON                         F3 = ON    
||   C           *INKL     OREQ *ON                         F12= ON    
||   C                     MOVEL*BLANK    P@TKNO            得意先 CD  
||   C                     MOVEL*BLANK    P@TKKN            得意先 カナ  
||   C                     Z-ADD000       W@FMT                        
||   C* ROLLDOWN (前頁)                                              
|+---C           *IN07     WHEQ *ON                         ROLLDOWN   
||   C                     EXSR SB1210                      前頁処理   
||   C* ROLLUP   (次頁)                                              
|+---C           *IN08     WHEQ *ON                         ROLLUP     
||   C                     EXSR SB1220                      前頁処理   
||   C* (実行キー処理)                                               
|+---C                     OTHER                                       
||   C                     EXSR SB1230                      実行キー処 
|+---C                     ENDSL                                       
|    C*                                                                
+----C                     ENDDO                                       
     C*                                                                
     C                     ENDSR                                       

次ページ処理

次ページ処理は現在表示されているレコードの次の9件を読取り表示します。
このために、サブファイルを初期化し、ついで読み取りしたマスターのレコードをサブファイルに
出力します。サブファイル初期化なので、CHAINとUPDATで出力します。
マスターの読取りはコード順とカナ順の2種類がありますが、どちらを読むべきかはインテリジェンスを
持たせた内部サブルーチンSBREADにまかせます。

コーディングは次のようになります。

     C*          SB1220    次ページ分処理                              
     C*--------------------------------------------------------------  
     C           SB1220    BEGSR                                       
     C*                                                                
     C*  サブファイル初期化                                            
     C                     EXSR SBCSFL                                 
     C*                                                                
+----C           001       DO   WSPAG     RRN                          
|    C*                                                                
|    C           RRN       CHAINSFL01                98                
|    C                     Z-ADDRRN       S2NO              行       
|    C                     EXSR SBREAD                                 
|    C*                                                                
|+---C           *IN99     IFEQ *OFF                                   
||   C                     MOVELTKTKNO    S2TKNO            コード     
||   C                     MOVELTKNMKJ    S2NMKJ            得意先名称 
||   C                     UPDATSFL01                                  
|+---C                     ENDIF                                       
+----C                     ENDDO                                       
     C*                                                                
     C                     ENDSR                                       

前ページ処理

ロールダウンキーのとき行う前ページ処理は、現在位置から2ページ分のレコードを逆読みし、ついで、
そこから1ページ分順読みするという小技を使います。順読みの部分とサブファイルへセットの部分は、
先の次ページ処理が流用できるからです。
コード順、カナ順どちらのファイルを逆読みするかは、インテリジェンスを持たせた内部サブSBREDPに
まかせます。途中で先頭まで行き着いたときは逆読みをやめ、そこから順よみということになります。

コーディングは次のようになります。

     C*          SB1210    前ページ処理                             
     C*-------------------------------------------------------------
     C           SB1210    BEGSR                                    
     C*                                                             
     C* 2ページ分さかのぼる                                        
     C           WSPAG     MULT 002       N                         
+----C                     DO   N                                   
|    C                     EXSR SBREDP                              
|+---C           *IN99     IFEQ *ON                                 
/====C                     LEAVE                                    
|+---C                     ENDIF                                    
+----C                     ENDDO                                    
     C* 読取りとセット                                              
     C                     EXSR SB1220                      サブファイル 
     C*                                                             
     C                     ENDSR                                    

実行キーのときの処理

実行キーの場合は、得意先が行番号で選択された(0でない)場合とそうでない場合にわかれます。
選択された場合は、その行のサブファイルをよみとり、その得意先コードをパラメータにセットします。
選択されてない場合は、画面から入力されたコードもしくはカナでファイルに位置付けし、レコード
9件分を読取りしてサブファイルにセットします。

コーディングは次のようになります。

     C*          SB1230    実行キー処理                              
     C*--------------------------------------------------------------  
     C           SB1230    BEGSR                                       
     C*                                                                
+----C           S1SLT     IFEQ 000                         SELECT     
|    C                     MOVELS1TKNO    TKTKNO            得意先 CD  
|    C                     MOVELS1NMKN    TKNMKN            得意先 (カナ)
|    C                     EXSR SBSTLL                      位置付け   
|    C                     EXSR SB1220                      明細編集   
+----C                     ELSE                                        
|    C           S1SLT     CHAINSFL01                90                
|    C                     MOVELS2TKNO    P@TKNO            得意先 CD  
|    C                     MOVEL*BLANK    P@TKKN            得意先 カナ  
|    C                     Z-ADD00        W@FMT                        
+----C                     ENDIF                                       
     C*                                                                
     C                     ENDSR                                       

全体のコーディングは次のようになります。

     **--------------------------------------------------------------
     ** ID   : KM420
     ** NAME :得意先マスター検索
     **--------------------------------------------------------------
     H            Y-                                    1
     F*--------------------------------------------------------------
     F*検索画面
     FKM420S  CF  E                    WORKSTN
     F                                        RRN   KSFILE SFL01
     F*得意先マスター
     FM420    IF  E           K        DISK
     F*
     F*得意先マスターL01 eサ順
     FM420L01 IF  E           K        DISK
     F            M420R                             KRENAMEM420R01
     E*--------------------------------------------------------------
     E                    MSG     1   2 50               ERR MSG
     I*--------------------------------------------------------------
     I*コントロールフラグ
     IWFLG        DS
     I I            1                         1   20W@FMT
     I*  サブファイル用
     I            DS
     I I            0                     P   1   30RRN
     I I            9                     P   4   50WSPAG
     C*--------------------------------------------------------------
     C*パラメータ
     C           *ENTRY    PLIST
     C                     PARM           P@TKNO  5        得意先CD
     C                     PARM           P@TKKN 20        得意先カナ
     C*--------------------------------------------------------------
     C*KEY LIST
     C*得意先マスター
     C           KLST01    KLIST
     C                     KFLD           TKTKNO           得意先CD
     C*得意先マスターL01
     C           KLST02    KLIST
     C                     KFLD           TKNMKN           得意先カナ
     C*--------------------------------------------------------------
     C*               MAIN ROUTINE
     C*--------------------------------------------------------------
     C*  初期設定
     C                     EXSR SBINZ                      初期設定処
     C*
+----C           W@FMT     DOWEQ01
|    C                     EXSR SB1000                     第1画面処
+----C                     ENDDO
     C*
     C                     EXSR SBEND                      終了処理
     C*--------------------------------------------------------------
     C*          SBINZ   初期設定
     C*--------------------------------------------------------------
     C           SBINZ     BEGSR
     C*
     C                     Z-ADD000       N       70
     C*キーのセット
     C                     MOVELP@TKNO    S1TKNO           得意先CD
     C                     MOVELP@TKKN    S1NMKN           得意先カナ
     C*読取り
     C                     EXSR SBCSFL                      SFLINZ
     C                     EXSR SB1220
     C                     MOVELMSG,01    S1MSG            MSG
     C*ウィンドウ定義レコード出力
     C                     WRITEWIN01                      WINDOW枠
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*          SB1000  第1画面処理   
     C*--------------------------------------------------------------
     C           SB1000    BEGSR
     C*
     C*  第1画面ループ処理
+----C           W@FMT     DOWEQ01
|    C*画面出力
|    C                     WRITEFMT99                       CMDfーe゙aq゙
|    C                     SETON                     24
|    C                     EXFMTCTL01                       
|    C                     SETOF                     24
|    C*入力処理
|+---C                     SELEC
||   C*   F3(終了),F12(前画面)
|+---C           *INKC     WHEQ *ON                         F3 = ON
||   C           *INKL     OREQ *ON                         F12= ON
||   C                     MOVEL*BLANK    P@TKNO           得意先CD
||   C                     MOVEL*BLANK    P@TKKN           得意先カナ
||   C                     Z-ADD000       W@FMT
||   C* ROLLDOWN(前頁)
|+---C           *IN07     WHEQ *ON                         ROLLDOWN
||   C                     EXSR SB1210                     前頁処理
||   C* ROLLUP  (次頁)
|+---C           *IN08     WHEQ *ON                         ROLLUP
||   C                     EXSR SB1220                     前頁処理
||   C*(実行キー処理)
|+---C                     OTHER
||   C                     EXSR SB1230                     実行キー処
|+---C                     ENDSL
|    C*
+----C                     ENDDO
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*          SB1210   前ページ処理
     C*--------------------------------------------------------------
     C           SB1210    BEGSR
     C*
     C*2ページ分さかのぼる
     C           WSPAG     MULT 002       N
+----C                     DO   N
|    C                     EXSR SBREDP
|+---C           *IN99     IFEQ *ON
*====C                     LEAVE
|+---C                     ENDIF
+----C                     ENDDO
     C*読取りとセット
     C                     EXSR SB1220                      
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*          SB1220   次ページ分処理
     C*--------------------------------------------------------------
     C           SB1220    BEGSR
     C*
     C* サブファイル初期化
     C                     EXSR SBCSFL
     C*
+----C           001       DO   WSPAG     RRN
|    C*
|    C           RRN       CHAINSFL01                98
|    C                     Z-ADDRRN       S2NO             行Y
|    C                     EXSR SBREAD
|    C*
|+---C           *IN99     IFEQ *OFF
||   C                     MOVELTKTKNO    S2TKNO           コード
||   C                     MOVELTKNMKJ    S2NMKJ           得意先名称
||   C                     UPDATSFL01
|+---C                     ENDIF
+----C                     ENDDO
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*          SB1230   実行キー処理
     C*--------------------------------------------------------------
     C           SB1230    BEGSR
     C*
+----C           S1SLT     IFEQ 000                         SELECT
|    C                     MOVELS1TKNO    TKTKNO           得意先CD
|    C                     MOVELS1NMKN    TKNMKN           得意先カナ
|    C                     EXSR SBSTLL                     位置付け
|    C                     EXSR SB1220                     明細編集
+----C                     ELSE
|    C           S1SLT     CHAINSFL01                90
|    C                     MOVELS2TKNO    P@TKNO           得意先CD
|    C                     MOVEL*BLANK    P@TKKN           得意先カナ
|    C                     Z-ADD00        W@FMT
+----C                     ENDIF
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*          SBSTLL  ファイル位置付け処理
     C*--------------------------------------------------------------
     C           SBSTLL    BEGSR
     C*
+----C           S1TKNO    IFGT *BLANK
|    C           S1NMKN    OREQ *BLANK
|    C           KLST01    SETLLM420R
+----C                     ELSE
|    C           KLST02    SETLLM420R01
+----C                     ENDIF
     C*  第1・2キーとも入力なし
+----C           S1TKNO    IFEQ *BLANK
|    C           S1NMKN    ANDEQ*BLANK
|    C           *LOVAL    SETLLM420R
+----C                     ENDIF
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*         .SBREAD  マスターREAD処理
     C*--------------------------------------------------------------
     C           SBREAD    BEGSR
     C*コード順で読み取り
+----C           S1TKNO    IFGT *BLANK
|    C           S1NMKN    OREQ *BLANK
|    C                     READ M420R                    99
|+---C           *IN99     IFEQ *ON
||   C           *HIVAL    SETGTM420R                      位置付け
|+---C                     ENDIF
|    C*カナ順で読み取り
+----C                     ELSE
|    C                     READ M420R01                  99
|+---C           *IN99     IFEQ *ON
||   C           *HIVAL    SETGTM420R01                    位置付け
|+---C                     ENDIF
|    C*
+----C                     ENDIF
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*          SBREDP  マスターREADP処理
     C*--------------------------------------------------------------
     C           SBREDP    BEGSR
     C*
     C*コード順で逆読み取り
+----C           S1TKNO    IFGT *BLANK
|    C           S1NMKN    OREQ *BLANK
|    C                     READPM420R                    99
|+---C           *IN99     IFEQ *ON
||   C           *LOVAL    SETGTM420R                      位置付け
|+---C                     ENDIF
|    C*カナ順で逆読み取り
+----C                     ELSE
|    C                     READPM420R01                  99
|+---C           *IN99     IFEQ *ON
||   C           *LOVAL    SETGTM420R01                    位置付け
|+---C                     ENDIF
|    C*
+----C                     ENDIF
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*         .SBCSFL  サブファイル初期化処理          .SBCSFL
     C*--------------------------------------------------------------
     C           SBCSFL    BEGSR
     C*
     C                     SETON                     21
     C                     WRITECTL01                       SFL初期化
     C                     SETOF                     21
     C*
     C                     ENDSR
     C*--------------------------------------------------------------
     C*          SBEND   終了処理  
     C*--------------------------------------------------------------
     C           SBEND     BEGSR
     C*
     C                     SETON                     LR
     C                     RETRN
     C*
     C                     ENDSR
** MSG **
行番号で選択してください。
予備




前ページ 次ページ 目 次

(C)COPYRIGHT ISHIOKA KATSUHIDE 2000−2003