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桁目をHとすると、非表示項目となり、このフィールドは画面には表示されません。
当然、行、カラムの指定も不要です。
画面ファイルの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サイクルを使うときはこのPを指定します。
RPGサイクルでは入力、出力は演算仕様書の直前直後に自動的に行われます。
プログラムとして有効な行数は4行だけです。H仕様書も省略できます。
**--------------------------------------------------------------- ** ID : BF620 ** NAME : 在庫引当て解消 **--------------------------------------------------------------- H Y- F*--------------------------------------------------------------- F* 在庫ファイル FF620L01 UP E K DISK C*--------------------------------------------------------------- C Z-ADD000 ZKHKSU 引当数 C UPDATF620R
レコード件数200,000件、引当解消の件数、1件で実際に実行した結果が次のとおりです。
マシンはAS/400−170です。
選択ありの論理ファイルを更新・・・・約3秒(アクセスパスの再構築を含む)
物理ファイルを更新・・・・・・・・・・・・・約50秒
◆在庫引当ロジックの応用
このロジックを応用すると、そのまま劇場公演などの座席予約に利用できます。
すなわち、識別キーを品目bゥら日付、公演回数、座席番号とし、在庫数を1とします。
実際には、席のグレード情報などを附加したり、連続した座席かどうかなどの情報や、
引当考慮時間を想定しての、タイムアウトなどの設定も必要になるかと思いますが、ここでは
本筋から離れるので省略します。
このようなの考え方で、応用可能な適用業務には次のようなものがあります。
列車の座席予約
図書館の本の貸出し管理
レンタルビデオの貸出し管理
ホテル・民宿・貸し別荘などの利用予約
ゴルフ場のエントリー管理
競技場の利用予約と管理
前ページ 次ページ 目 次
(C)COPYRIGHT ISHIOKA KATSUHIDE 2000−2003