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


在庫管理の中、会話型による出庫処理、すなわち、在庫品の引当て照会とその引落しのロジックは
RE-RUNの実施がしにくく結構面倒なテーマです。
ここでは、そのロジックとサンプルプログラムを紹介します。



画面のシナリオ


実行処理ロジック

各画面の処理ロジックは次のとおりです。

第一画面

終了キー(F3キー)が押されるまで以下の処理を繰り返します。

画面番号により以下の処理
1.第一画面のとき
  出庫要求元と日付を取得のための画面を表示します。
第一画面から入力を取得します。
  1.1 F3キーのとき、プログラム終了します。
  1.2 実行キーのとき、入力チェックをします。
     OKなら第二画面への画面番号にします。

2.第二画面のとき
  出庫品目の明細(コードと出庫数量)入力画面を表示し同データを取得します。
  2.1 F12キーのとき、第1画面への番号にします。
     このとき、仮引当てはリセットして戻ります。
  2.2 実行キーのとき入力チェックをします。
     結果OKなら仮引当てを行い画面に表示します。
     結果OKですでに更新確認状態であれば、ファイルを更新します。
     次の画面を第1画面にします。

プログラム作成の前準備

RPGプログラムを作成するまえに、プログラムが必要とするファイルを作成しておく必要があ
ります。ここでは、画面ファイル(RF620S)と、在庫ファイル(F620),品目マスター
ファイル(M620)です。

画面ファイル

画面ファイルは以下のような2枚の画面からなるものとします。

処理画面は第一画面、第二画面の繰返しで、第一画面は出庫要求元と出庫日、第二画面は出庫の
明細を入力し、引当てと在庫引落し処理を行います。
画面は次のような想定になっています。

第1画面レイアウト

 RF620                           出  庫  処  理              0/08/28  14:47:14  
                                                                                
  要求者  9999    出庫日  99/99/99                                            
                                        
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
 F3= 終了                                                                       
                                                                                


第2画面レイアウト

 RF620                           出  庫  処  理              0/08/28  14:47:54  
                                                                                
  要求者  999999    出庫日  99/99/99                                            
                                                                                
                                                                                
 NO  品目    品目名                要求数       引合中      在庫数          
 01  AAAA                         999,999,999                                 
 02  BBBB                         999,999,999                                 
 00                                                                             
 00                                                                             
 00                                                                             
 00                                                                             
 00                                                                             
 00                                                                             
 00                                                                             
 00                                                                             
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
 F12= 取消                                                                      
                                                                                


引当てと引当取消しになったときの考慮事項

在庫の引当てが変更あるいは取消しになったときにそなえて、ひとつ前の画面で入力されていた出庫要求数を
記録しておきます。このために、以下のようにサブファイルの中に非表示の項目として「前回の要求数」のフィー
ルドを準備しておきます。

 ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7  
     A            S4MASU         9Y 0H      TEXT(' 前回数 ')            


38桁目をとすると、非表示項目となり、このフィールドは画面には表示されません。
当然、行、カラムの指定も不要です。

画面ファイルのDDSは次のようになります。

     A*-----------------------------------------------------------
     A* ID    : RF620S
     A* NAME  :出庫処理画面
     A*-----------------------------------------------------------
     A                                      PRINT
     A                                      INDARA
     A*-----------------------------------------------------------
     A          R FMT01
     A                                      OVERLAY  PROTECT
     A                                      CF03
     A*
     A            S1PGID        10A  O  1  2TEXT('PGM-ID')
     A*
     A                                  1 31'  出庫処理'
     A                                      DSPATR(RI)
     A                                  1 61DATE
     A                                      EDTCDE(Y)
     A                                  1 71TIME
     A                                  3  2'要求者'
     A            S1YQBM         4A  B    +1TEXT('要求者')
     A  31                                  DSPATR(PC RI)
     A                                  3 20'出庫日'
     A            S1YQDT         6Y 0B    +1 TEXT('出庫日')
     A                                      EDTCDE(Y)
     A  32                                  DSPATR(PC RI)
     A*-----------------------------------------------------------
     A          R SFL01
     A                                       SFL
     A  27                                   SFLNXTCHG
     A*
     A            S4GYNO         2Y 0O  7  2TEXT('行Y')
     A            S4HNNO         6A  B    +2TEXT('品目Y')
     A  41                                   DSPATR(PC RI)
     A            S4HNKJ        22O  O    +1TEXT('品目名')
     A*
     A            S4YQSU         9Y 0B    +1TEXT('要求数')
     A                                       EDTCDE(K)
     A  42                                   DSPATR(PC RI)
     A            S4HKSU         9Y 0O    +1TEXT('引合中')
     A                                      EDTCDE(K)
     A            S4ZKSU         9Y 0O    +1TEXT('在庫数')
     A                                      EDTCDE(K)
     A*
     A            S4MASU         9Y 0H      TEXT('前回数')
     A*-----------------------------------------------------------
     A          R CTL01
     A                                      OVERLAY  PROTECT
     A                                      CF12
     A                                      SFLCTL(SFL01)
     A                                      SFLSIZ(100) SFLPAG(10)
     A  24                                  SFLDSPCTL
     A  23                                  SFLDSP
     A  22                                  SFLCLR
     A  21                                  SFLINZ
     A                                      CSRLOC(S4LIN  S4COL)
     A*
     A            S4LIN          3S 0H      TEXT('CURSOR制御:行')
     A            S4COL          3S 0H      TEXT('CURSOR制御:桁')
     A            RCDNBR         4S 0H      SFLRCDNBR
     A                                  6 02'NO'
     A                                  6 05'品目Y'
     A                                  6 15'品目名'
     A                                  6 39'要求数'
     A                                  6 52'引合中'
     A                                  6 64'在庫数'
     A*-----------------------------------------------------------
     A          R FMT99
     A  01                             23  2 'F3=終了'
     A  02                             23  2 'F12=取消'
     A            S9MSG         78A  O 24  1TEXT('MSG  ')

第1画面の構成

第1画面はFMT01とFMT99の2つの様式から構成されます。
FMT01は要求元と出庫日を取得するための様式、FMT99はキーガイド、メッセージ
表示のための様式です。

第2画面の構成

第2画面はFMT01,FMT99,CTL01(SFL01を含む)の4個の様式から構成されます。
この部分は出庫要求の明細データ入力のための様式です。

更新対象ファイル

更新対象となる在庫ファイル(F620)は、次のように定義されているものとします。

     A*-------------------------------------------------------------- 
     A* ID   : F620                                                   
     A* NAME : 在庫ファイル                                           
     A* KEY  : 品目コード                                             
     A*-------------------------------------------------------------- 
     A                                      UNIQUE                    
     A          R F620R                     TEXT(' 在庫ファイル ')    
     A*                                                               
     A            ZKHNNO         6A         COLHDG(' 品目 ')        
     A            ZKGZSU         9S 0       COLHDG(' 現在数 ')        
     A            ZKHKSU         9S 0       COLHDG(' 引当数 ')        
     A*                                                               
     A          K ZKHNNO                                              

実際の在庫ファイルはこのほかに、前月からの繰越数、繰越金額、帳簿上の価格など多くの項目を
もっています。

品目マスター

出庫データの入力に際しては、品目マスター(M620)を参照して品名を取得するものとし、
そのDDSは次のとおりとします。

     A*--------------------------------------------------------------- 
     A* ID    : M620                                                   
     A* NAME  : 品目マスター                                           
     A*--------------------------------------------------------------- 
     A                                      UNIQUE                     
     A          R M620R                                                
     A*  データ                                                        
     A            HNHNNO         6A         COLHDG(' 品目 ')         
     A            HNNMKJ        22O         COLHDG(' 品目名 ')         
     A*  キー                                                          
     A          K HNHNNO                                               

制御仕様書(H仕様書)

説明を省略します。

ファイル仕様書

画面ファイルは、サブファイルを使用する会話型のファイルとして記述します。継続の記述行に
以下の追加の記述をします。継続の行は53カラムにKを記入して示します。
1.サブファイルをハンドリングする相対レコード番号のための変数(RN)を47〜52カラムに
  記述します。
2.画面上でカーソルをハンドリングするため、ワークステーション情報に関する記述を継続行に
  記述します。54〜59カラムにINFDSとし、そのデータ構造名を60から65カラムに記述します。
3.サブファイルを使用のために、54〜59カラムにSFILEを記述します。
4.サブファイルのレコード様式名を60〜67カラムに記述します。

在庫ファイル(F620)は更新ファイルとして15、16カラムをUFとします。
入庫処理はしないので、レコード追加の指定はしません。
品目マスターは入力専用として記述します。

 ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 
     FRF620S  CF  E                    WORKSTN                         
     F                                              KINFDS WSINF       
     F                                        RN    KSFILE SFL01       
     F* 在庫ファイル                                                   
     FF620    UF  E           K        DISK                            
     F* 品目マスター                                                   
     FM620    IF  E           K        DISK                            


エラーメッセージ

エラーメッセージは次のメッセージをコンパイル時配列で定義しています。

要求元が正しくありません。
日付が正しくありません。
品目bェ正しくありません。
数量が足りません。
入力が必要です。
更新確認してください。

変更フラグ

1回に受注入力できる明細件数は99件までとし、プログラムのテクニック上から99件の変更フラグの
配列を用意しています。これを使用して変更時に、訂正のあった明細のみ在庫ファイルから引落としを
します。
エラーメッセージと変更フラグのためのコーディングはつぎのようになります。

 ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 
     E                    MSG     1   6 50               ERR MSG       
     E                    CHG        99  1               SFL 変更 FLG  


カーソルのあったフィールド位置を取得するために、ワークステーション情報を取得するためのデータ構造を
記述しておきます。また、カーソル位置情報は行、カラム、各1バイトなので、これを2バイトの2進数にする
ためのデータ構造も準備します。

 ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 
     IWSINF       DS                                                   
     I                                      370 370 WSLIN              
     I                                      371 371 WSCOL              
     I                                    B 378 3790WSNO               
     I* ライン・カラム情報                                 
     I            DS                                       
     I I            0                     B   1   20WSLINB 
     I                                        2   2 WSLINC 
     I I            0                     B   3   40WSCOLB 
     I                                        4   4 WSCOLC 


キーリスト

いずれのファイルもキーとなるフィールドが1個だけなので、キーリストはここでは準備してい
ません。キーが複数のフィールドからなる場合はキーリストは必要です。


基本的処理の流れ

基本的処理の流れは、2画面からなる処理の流れです。

     C           SBMAIN    BEGSR
     C*
+----C           W@FMT     DOWNE00
|+---C                     SELEC
|+---C           W@FMT     WHEQ 01                         
||   C                     EXSR SB1000                     第1画面
|+---C           W@FMT     WHEQ 02                         
||   C                     EXSR SB2000                     第2画面
|+---C                     ENDSL
+----C                     ENDDO
     C*
     C                     ENDSR                            .SBMAIN
  

第1画面の処理

第1画面は要求元と日付の入力が目的です。

前準備

標識の01,02番を1,0とセットします。これは画面ファイルで記述した第1第2キーガイドを
標識によって、表示/非表示操作をするためです。命令はMOVEAとなっています。

     C* 第一画面へセット                                            
     C                     MOVEA'10'      *IN,01                    

第一画面の表示

得意先マスターメンテナンスのプログラムの場合と同様です。説明を略します。

データ入力後の処理

得意先マスターメンテナンスのプログラムの場合と同様です。説明を略します。

第一画面処理のコーディングは次のようになります。

     C*---------------------------------------------------------------
     C*          SB1000   第1画面処理
     C*---------------------------------------------------------------
     C           SB1000    BEGSR
     C*
     C                     MOVEA'10'      *IN,01
     C*第1画面準備
+----C           W@FMT     DOWEQ01                         第1画面
|    C*
|    C                     WRITEFMT99                       GUIDE-SCR
|    C                     EXFMTFMT01
|    C                     MOVE *BLANK    S9MSG
|    C*画面入力
|+---C                     SELEC
|+---C           *INKC     WHEQ *ON                        取消キー
||   C                     Z-ADD00        W@FMT
|+---C                     OTHER
||   C                     EXSR SB1160                     実行キー
|+---C                     ENDSL
|    C*
+----C                     ENDDO
     C*
     C                     ENDSR                            

第2画面

第1画面で出庫要求元と出庫要求日が入力されたなら、次は第2画面です。
第2画面の準備では、変更フラグの配列のクリアなどを行います。
第2画面の表示は、サブファイルの表示とサブファイル制御の表示が有効となるように標識23,
24をオンにして表示をします。サブファイルの初期は最初にSBINZですませてあります。

第2画面での入力後の処

入力後の処理は、取消(F12)かあるいは実行キーの場合のどちらかの処理です。それぞれ、
内部サブルーチンSB1150とSB1160を呼び出して行います。

     C*          SB2000   第2画面処理
     C*---------------------------------------------------------------
     C           SB2000    BEGSR
     C*
     C*第2画面準備
     C                     MOVE *BLANK    S9MSG             ERR-MSG
     C                     MOVE *ZERO     CHG               CHANGE-FLAG
     C                     MOVEA'01'      *IN,01
     C*第2画面繰返し
+----C           W@FMT     DOWEQ02                         第1画面
|    C*画面表示
|    C                     WRITEFMT99                       GUIDE
|    C                     WRITEFMT01                       
|    C                     SETON                     2324
|    C                     EXFMTCTL01
|    C                     SETOF                     2324
|    C                     MOVE *BLANK    S9MSG
|    C*画面入力
|+---C                     SELEC
|+---C           *INKL     WHEQ *ON                        取消キー
||   C                     EXSR SB2150
|+---C                     OTHER
||   C                     EXSR SB2160                     実行キー
|+---C                     ENDSL
+----C                     ENDDO
     C*
     C                     ENDSR

実行キーが押されたの場合の処理

実行キーがおされた場合は、出庫要求のチェックとその後の在庫引落しの処理にわかれます。

出庫要求のチェック

出庫要求のチェックは、考えられうるすべての端末からの出庫要求を考慮して、在庫の払い出しが
できるかどうかということのチェックです。
そのためには、出庫要求があった時点でただちに、在庫のレコードの引当中の数に反映させます。
すなわち、該当レコードの引当中の数字に該当端末からの要求数を加算します。この数量が在庫数
より少なければ出庫はできるし、多ければ出庫はできないということになります。
引当の優先順は先着順となっており、先に引当した端末のユーザーが在庫の引落しができなくなる
ことはありません。
例えば、在庫数100に対し、A端末50、B端末40の要求中だとすると、C端末の30の要求に
対して引当ができないのはC端末だけであり、A,Bの端末はすでに引当てOKとなっています。

出庫要求の変更時

出庫要求の数量が変更されて再度入力されたときは、前回の要求数量は一度引当を戻してから、
改めて引当数を加算します。単純に引当数を加算すると、引当中の数字は増加の一方となります。
前回要求数量を記憶しておくために、画面ファイルの中に非表示のフィールド(S4MASU)を
用意しておきます。
サブファイル1レコード分のコーディングは次のようになります。

     C*一度前回要求数を戻す
+----C           S4MASU    IFGT 000
|    C           S4MAHN    CHAINF620R                91
|    C                     SUB  S4MASU    ZKHKSU           前回要求数
|    C                     UPDATF620R
+----C                     ENDIF
     C*品目コードで在庫ファイル読取り、あればすぐ引き当てする
     C                     CLEARF620R
     C           S4HNNO    CHAINF620R                91
+----C           *IN91     IFEQ *OFF
|    C                     Z-ADDZKHKSU    S4HKSU           引当済数
|    C           ZKHKSU    ADD  S4YQSU    W@HKSU           引当済数
|    C                     Z-ADDZKGZSU    S4ZKSU           在庫数
+----C                     ENDIF
     C*ここからチェック
     C                     SETOF                     4142
     C                     SETOF                     27     SFLNXTCHG
     C*要求数
+----C           W@HKSU    IFLE S4ZKSU
|    C                     Z-ADDW@HKSU    ZKHKSU           引当済数
|    C                     Z-ADDW@HKSU    S4HKSU           引当済数
|    C                     UPDATF620R
|    C                     MOVELS4HNNO    S4MAHN           品目Y保管
|    C                     Z-ADDS4YQSU    S4MASU           要求数保管
+----C                     ELSE
|    C                     MOVEL*BLANK    S4MAHN           品目Y保管
|    C                     Z-ADD000       S4MASU           要求数保管
|    C                     SETON                     304142
|    C                     MOVELMSG,4     S9MSG
|    C                     Z-ADD034       S4COL            COL位置
|    C                     SETON                     27     SFLNXTCHG
+----C                     ENDIF


エラー時の処理

当できないときはエラーの扱いとします。エラーフィールドの反転や、カーソルの位置づけの方法については、
受注入力のプログラム(RF520)を参照してください。
最初のエラーレコードのあった画面を表示させるためには、サブファイルのレコードb最初0に
しておき、0のときのみエラーレコードの番号をセットします。
一連のチェックを完了後もサブファイルのレコードbェ0ならこれを1にセットしてやります。
これが0のままだと、「装置エラー」という初心者にとってはわけのわからないエラーになるので
注意してください。

SFLNXTCHGとREADCについて

プログラムのなかで使用されているREADCは、入力をふくめて画面フィールドに変更のあった
サブファイル・レコードのみ読取をします
従って、チェックの結果エラーがあってエラー表示したにもかかわらず2回目にそのまま入力すると
「変更がない」ということでエラーチェックにもかからないということになってしまいます。
READC命令を使用するときはこの点を注意しなければなりません。
ここでは画面のDDSでSFLNXTCHGパラメータを使用して解決しています。
このパラメータは関連標識をオンにして出力すると、次回のときそのサブファイルレコードは
「変更された」としてくれるもので、READC命令で読取をすることができます。

在庫の引落し

首尾よく入力にエラーがなく引き当てができたときは、さらにその次に画面変更なしで実行キーが
押されたとき、内部サブルーチン(SBUPD)によって在庫の引落しを行います。
このとき、在庫数を減らすだけでなく、引当中の数量も減らします。
また、変更フラグも解消しておきます。コーディングは次のようになります。

     C*          SBUPD    ファイル更新(在庫引落し)
     C*---------------------------------------------------------------
     C           SBUPD     BEGSR
     C*
     C* ファイルへ編集
+----C           01        DO   99        RN
|+---C           CHG,RN    IFEQ '1'                         CHG
||   C           RN        CHAINSFL01                30
||   C           S4HNNO    CHAINF620R                99
||   C                     SUB  S4YQSU    ZKGZSU           在庫引落し
||   C                     SUB  S4YQSU    ZKHKSU           引当解消
||   C                     UPDATF620R
|+---C                     ENDIF
+----C                     ENDDO
     C* 変更フラグ解消
     C                     MOVE *ZERO     CHG
     C*
     C                     ENDSR

取消キーがおされたとき

システム・アプリケーションズ・アーキテクチャー(SAA)の体系では、取消キーはF12です。
このとき、単に前の画面に戻るのでなく、引当を解消して前の画面に戻らなければなりません。
これは内部サブ(SB2150)を呼び出して行います。

サブファイルの初期化

サブファイルの初期化は、何ヶ所かで必要になるので、内部サブ(SBCSFL)としています。
表示のページを決めるレコードbヘ、ここで一緒に1にセットしています。

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

     **---------------------------------------------------------------
     ** ID   : RF620
     ** NAME :在庫引当・引落処理
     ** NOTE :
     **   *IN29 変更フラグ      *ON: MODIFIED
     **   *IN30 エラーフラグ    *ON: ERROR   *OFF:OK
     **---------------------------------------------------------------
     H            Y-
     F*---------------------------------------------------------------
     FRF620S  CF  E                    WORKSTN
     F                                        RN    KSFILE SFL01
     F                                              KINFDS WSINF
     F*在庫ファイル
     FF620    UF  E           K        DISK
     F*品目マスター
     FM620    IF  E           K        DISK
     E*---------------------------------------------------------------
     E                    MSG     1   6 50               ERR MSG
     E                    CHG        99  1               SFL変更FLG
     I*---------------------------------------------------------------
     I*<カーソル情報>
     IWSINF       DS
     I                                      370 370 WSLIN
     I                                      371 371 WSCOL
     I                                    B 378 3790WSNO
     I*<ライン・カラム情報>
     I            DS
     I I            0                     B   1   20WSLINB
     I                                        2   2 WSLINC
     I I            0                     B   3   40WSCOLB
     I                                        4   4 WSCOLC
     I*ページサイズ
     I            DS
     I I            10                        1   50WSPAG
     I*画面番号
     I            DS
     I I            01                        1   20W@FMT
     C*---------------------------------------------------------------
     C*初期処理
     C                     EXSR SBINZ
     C*主処理
     C                     EXSR SBMAIN
     C*終了処理
     C                     EXSR SBEND
     C*
     C*---------------------------------------------------------------
     C*          SBMAIN   主処理
     C*---------------------------------------------------------------
     C           SBMAIN    BEGSR
     C*
+----C           W@FMT     DOWNE00
|+---C                     SELEC
|+---C           W@FMT     WHEQ 01                         第1画面
||   C                     EXSR SB1000                     第1画面
|+---C           W@FMT     WHEQ 02                         第1画面
||   C                     EXSR SB2000                     第2画面
|+---C                     ENDSL
+----C                     ENDDO
     C*
     C                     ENDSR                            .SBMAIN
     C*---------------------------------------------------------------
     C*          SBINZ    初期処理
     C*---------------------------------------------------------------
     C           SBINZ     BEGSR                           .INZ
     C*
     C           *LIKE     DEFN ZKHKSU    W@HKSU           引当済数
     C                     Z-ADD00        RN      40        RRN
     C                     Z-ADD00        X       70        INDEX
     C                     Z-ADD000       W@KEN   70        SFL件数
     C                     SETOF                     30     SET NO-ERR
     C*
     C                     MOVEL'RF620'   S1PGID            PGM-ID
     C*サブファイル初期化
     C                     EXSR SBCSFL
     C*
     C                     ENDSR                            .SBINZ
     C*---------------------------------------------------------------
     C*          SB1000   第1画面処理
     C*---------------------------------------------------------------
     C           SB1000    BEGSR
     C*
     C                     SETON                     01
     C                     SETOF                     02
     C*第1画面準備
+----C           W@FMT     DOWEQ01                         第1画面
|    C*
|    C                     WRITEFMT99                       GUIDE-SCR
|    C                     EXFMTFMT01
|    C                     MOVE *BLANK    S9MSG
|    C*画面入力
|+---C                     SELEC
|+---C           *INKC     WHEQ *ON                        取消キー
||   C                     Z-ADD00        W@FMT
|+---C                     OTHER
||   C                     EXSR SB1160                     実行キー
|+---C                     ENDSL
|    C*
+----C                     ENDDO
     C*
     C                     ENDSR                            .SB1000
     C*---------------------------------------------------------------
     C*         .SB1160   第1画面処理
     C*---------------------------------------------------------------
     C           SB1160    BEGSR
     C*
     C*要求元
     C                     SETOF                     30
     C                     SETOF                     3132
+----C           S1YQBM    IFEQ *BLANK
|    C                     SETON                     3031
|    C                     MOVELMSG,01    S9MSG
+----C                     ENDIF
     C*出庫日
+----C           S1YQDT    IFEQ *ZERO
|    C                     SETON                     3032
|    C                     MOVELMSG,02    S9MSG
+----C                     ENDIF
     C*エラーなしなら第2画面へ
+----C           *IN30     IFEQ *OFF
|    C                     Z-ADD02        W@FMT            画面Y
+----C                     ENDIF
     C*
     C                     ENDSR                            .SBINZ
     C*---------------------------------------------------------------
     C*          SB2000   第2画面処理
     C*---------------------------------------------------------------
     C           SB2000    BEGSR
     C*
     C*第2画面準備
     C                     MOVE *BLANK    S9MSG             ERR-MSG
     C                     MOVE *ZERO     CHG               CHANGE-FLAG
     C                     SETOF                     01
     C                     SETON                     02
     C*第2画面繰返し
+----C           W@FMT     DOWEQ02                         第2画面
|    C*画面表示
|    C                     WRITEFMT99
|    C                     WRITEFMT01
|    C                     SETON                     2324
|    C                     EXFMTCTL01
|    C                     SETOF                     2324
|    C                     MOVE *BLANK    S9MSG
|    C                     Z-ADD000       S4LIN            行位置
|    C                     Z-ADD000       S4COL            COL位置
|    C*画面入力
|+---C                     SELEC
|+---C           *INKL     WHEQ *ON                        取消キー
||   C                     EXSR SB2150
|+---C                     OTHER
||   C                     EXSR SB2160                     実行キー
|+---C                     ENDSL
+----C                     ENDDO
     C*
     C                     ENDSR
     C*---------------------------------------------------------------
     C*         .SB2150   取消し要求
     C*---------------------------------------------------------------
     C           SB2150    BEGSR
     C*
     C*引当て要求をもとに戻す
+----C           001       DO   099       RN
|+---C           CHG,RN    IFEQ '1'
||   C           RN        CHAINSFL01                09
||   C           S4HNNO    CHAINF620R                91
||+--C           *IN91     IFEQ *OFF
|||  C                     SUB  S4MASU    ZKHKSU           前回要求数
|||  C                     UPDATF620R
||+--C                     ENDIF
|+---C                     ENDIF
+----C                     ENDDO
     C*第1画面へ
     C                     Z-ADD01        W@FMT
     C*サブファイル初期化
     C                     EXSR SBCSFL
     C*
     C                     ENDSR
     C*---------------------------------------------------------------
     C*          SB2160   明細画面のチェックと更新
     C*---------------------------------------------------------------
     C           SB2160    BEGSR
     C*
     C*入力あったサブファイルについて入力チェック
     C                     Z-ADD000       RCDNBR            RECORD-NO.
     C                     SETOF                     2930   ERR-FLAG
     C                     READCSFL01                    09
+----C           *IN09     DOWEQ*OFF
|    C                     MOVE '1'       CHG,RN           変更フラグ
|    C                     SETON                     29
|    C                     EXSR SB2CHK                      CHECK-ERR
|    C                     UPDATSFL01
|    C                     READCSFL01                    09
+----C                     ENDDO
     C*OKならファイル更新
+----C           *IN30     IFEQ *OFF                        NO-ERROR
|    C                     Z-ADD001       RCDNBR            RECORD-NO.
|+---C           *IN29     IFEQ *OFF
||   C                     EXSR SBUPD                       ハィay更新
||   C                     Z-ADD01        W@FMT             第1画面
||   C                     MOVEL*BLANK    S1YQBM           要求者
||   C                     MOVEL*BLANK    S1YQDT           出庫日
||   C                     EXSR SBCSFL                      CLEAR SFL
|+---C                     ELSE
||   C                     MOVELMSG,6     S9MSG            更新確認
|+---C                     ENDIF
+----C                     ENDIF
     C*
     C                     ENDSR
     C*---------------------------------------------------------------
     C*         .SB2CHK   入力チェック(1行分)
     C*---------------------------------------------------------------
     C           SB2CHK    BEGSR
     C*
     C*カーソルのある行位置取得
     C                     Z-ADDRN        S4GYNO           行Y
     C           RN        DIV  WSPAG     W@WRK   70
     C                     MVR            WSLINE  70
     C                     ADD  006       WSLINE           行位置
     C*
     C*属性の取得(必要あれば名前などの取得)
     C           S4HNNO    CHAINM620R                90
+----C           *IN90     IFEQ *OFF
|    C                     MOVELHNNMKJ    S4HNKJ           品目名
+----C                     ELSE
|    C                     MOVEL*ALL'?'   S4HNKJ           品目名
+----C                     ENDIF
     C*一度前回要求数を戻す
+----C           S4MASU    IFGT 000
|    C           S4MAHN    CHAINF620R                91
|    C                     SUB  S4MASU    ZKHKSU           前回要求数
|    C                     UPDATF620R
+----C                     ENDIF
     C*品目コードで在庫ファイル読取り、あればすぐ引き当てする
     C                     CLEARF620R
     C           S4HNNO    CHAINF620R                91
+----C           *IN91     IFEQ *OFF
|    C                     Z-ADDZKHKSU    S4HKSU           引当済数
|    C           ZKHKSU    ADD  S4YQSU    W@HKSU           引当済数
|    C                     Z-ADDZKGZSU    S4ZKSU           在庫数
+----C                     ENDIF
     C*ここからチェック
     C                     SETOF                     4142
     C                     SETOF                     27     SFLNXTCHG
     C*要求数
+----C           W@HKSU    IFLE S4ZKSU
|    C                     Z-ADDW@HKSU    ZKHKSU           引当済数
|    C                     Z-ADDW@HKSU    S4HKSU           引当済数
|    C                     UPDATF620R
|    C                     MOVELS4HNNO    S4MAHN           品目Y保管
|    C                     Z-ADDS4YQSU    S4MASU           要求数保管
+----C                     ELSE
|    C                     MOVEL*BLANK    S4MAHN           品目Y保管
|    C                     Z-ADD000       S4MASU           要求数保管
|    C                     SETON                     304142
|    C                     MOVELMSG,4     S9MSG
|    C                     Z-ADD034       S4COL            COL位置
|    C                     SETON                     27     SFLNXTCHG
+----C                     ENDIF
     C*エラーへ位置づけ
+----C           *IN30     IFEQ *ON
|+---C           RCDNBR    IFEQ 000
||   C                     Z-ADDWSLINE    S4LIN            行位置
||   C                     Z-ADDRN        RCDNBR            RECORD-NO
|+---C                     ENDIF
+----C                     ENDIF
     C*
     C                     ENDSR
     C*---------------------------------------------------------------
     C*          SBCSFL   サブファイルクリア
     C*---------------------------------------------------------------
     C           SBCSFL    BEGSR
     C*サブファイルを初期化
     C                     SETON                     21    INZSFL
     C                     WRITECTL01
     C                     SETOF                     21
     C                     Z-ADD001       RCDNBR            RECORD-NO
     C*
     C                     ENDSR
     C*---------------------------------------------------------------
     C*          SBUPD    ファイル更新(在庫引落し)
     C*---------------------------------------------------------------
     C           SBUPD     BEGSR
     C*
     C* ファイルへ編集
+----C           01        DO   99        RN
|+---C           CHG,RN    IFEQ '1'                         CHG
||   C           RN        CHAINSFL01                30
||   C           S4HNNO    CHAINF620R                99
||   C                     SUB  S4YQSU    ZKGZSU           在庫引落し
||   C                     SUB  S4YQSU    ZKHKSU           引当解消
||   C                     UPDATF620R
|+---C                     ENDIF
+----C                     ENDDO
     C* CLR-SCR
     C                     MOVE *ZERO     CHG
     C*
     C                     ENDSR
     C*---------------------------------------------------------------
     C*          SBEND    終了処理
     C*---------------------------------------------------------------
     C           SBEND     BEGSR
     C*
     C                     SETON                     LR
     C                     RETRN
     C*
     C                     ENDSR
** MSG **
要求元が正しくありません。
日付が正しくありません。
品目Yが正しくありません。
在庫が無いか数量が足りません。
入力が必要です。
更新確認してください。


トラブル時の対策

会話型の在庫引落し処理は再現の困難な処理です。
したがってトラブルがあっても、うまく対応できなければなりません。
いままでに紹介した方式では処理では、引当数量の加算方式をとっているため、トラブル対応が比較的に
うまくゆきます。
例えば、オンラインサービスの最中にマシントラブルでダウンしたとしても、引当はどこまでも引当に
過ぎないので、在庫の引落の済んでいない分だけ復旧すればよいことになります。
トラブル対応のためには、引当のフィールドだけを0にリセットする小さなプログラムを作成しておき、
臨時にこれを実行させます。

引当てありの論理ファイル

在庫の件数が何十万件とある場合に、すべてのレコードを読み取りするのは無駄なので、
「引当あり」だけを選択したの論理ファイルを準備しておくと無駄がなくなります。
以下にファイルのDDSを示します。
最後の行が「引当あり」だけを選択しています。

     A*--------------------------------------------------------------- 
     A* ID    : F620L01                                                
     A* NAME  : 在庫ファイル(引当ありのもの)                         
     A*--------------------------------------------------------------- 
     A          R F620R                     PFILE(F620)                
     A* キー                                                           
     A          K ZKHNNO                                               
     A* 引当てありの選択                                               
     A          S ZKHKSU                    COMP(GT 0)                 


同ファイルのCRT

このファイルは、ほとんど臨時的にRUNするものなので、いつも論理ファイルを保守するのでなく、
実行の都度アクセスパスを再構築する属性(*REBLD)として作成します。
そのCLは次のとおりです。

  CRTLF  FILE(WRKLIB/F620L01)  MAINT(*REBLD)

以下に引当解消のプログラム

RPGサイクルを使って簡単に作成してみました。ソースは次のとおりです。
ファイル仕様書の15,16カラムが’UP’となっているので、RPGサイクルで動作します。
Uは更新,Pはプライマリーファイルの意味です。RPGサイクルを使うときはこのを指定します。
RPGサイクルでは入力、出力は演算仕様書の直前直後に自動的に行われます。

     **--------------------------------------------------------------- 
     ** ID   : BF620                                                   
     ** NAME : 在庫引当て解消                                          
     **--------------------------------------------------------------- 
     H            Y-                                                   
     F*--------------------------------------------------------------- 
     F* 在庫ファイル                                                   
     FF620L01 UP  E           K        DISK                            
     C*--------------------------------------------------------------- 
     C                     Z-ADD000       ZKHKSU            引当数     
     C                     UPDATF620R                                  
プログラムとして有効な行数は4行だけです。H仕様書も省略できます。


レコード件数200,000件、引当解消の件数、1件で実際に実行した結果が次のとおりです。
マシンはAS/400−170です。

選択ありの論理ファイルを更新・・・・約3秒(アクセスパスの再構築を含む)
物理ファイルを更新・・・・・・・・・・・・・約50秒




在庫引当ロジックの応用

このロジックを応用すると、そのまま劇場公演などの座席予約に利用できます。
すなわち、識別キーを品目bゥら日付、公演回数、座席番号とし、在庫数を1とします。
実際には、席のグレード情報などを附加したり、連続した座席かどうかなどの情報や、
引当考慮時間を想定しての、タイムアウトなどの設定も必要になるかと思いますが、ここでは
本筋から離れるので省略します。

このようなの考え方で、応用可能な適用業務には次のようなものがあります。
  列車の座席予約
  図書館の本の貸出し管理
  レンタルビデオの貸出し管理
  ホテル・民宿・貸し別荘などの利用予約
  ゴルフ場のエントリー管理
  競技場の利用予約と管理





前ページ 次ページ 目 次

(C)COPYRIGHT ISHIOKA KATSUHIDE 2000−2003