[解説10]
このプログラムは、前提として、オーダー番号をもらい、そのオーダー番号を持つデータを表示して、修正を行います。例えば、オーダー一覧から修正プログラムとして呼び出すとか。尚、このプログラムでは、オーダー番号を自動符番していませんが、データエリアなどで管理すれば可能ですよね。それから、このプログラムでは、2人以上のオペレータが、同時に、同じオーダーを修正できてしまいます。通常、見出しファイルと明細ファイルに別れるはず(ここではサンプルを分かりやすくするため、明細ファイルのみにしています。)ですので、見出しファイルのレコードを更新ロックする方法を勧めます。管理ファイルだと、PC5250でウィンドウクローズされてしまうと、ジョブの強制終了と同じになるので、管理ファイル中にオーダー修正中のフラグが残ってしまいます。更新ロックならば、この点は問題ありません。それから、排他ロックのメッセージを、必ず出してください。

[解説20]
画面上部のサブファイルの初期化です。このサブファイルの部分に、入力データを表示して、保持します。データ書き出しは、このサブファイルのデータを利用しています。

[解説30]
サブファイルのビルドです。ここでは、1オーダーのみなので、それほど大きな件数にならないはずですので、全件を対象とします(パターン1)。また、このデータを利用してデータを書き出す方法を、1オーダーデータ全件削除してから、サブファイルのデータ全件書き出しにしています。これをパターン2や3にしてしまうと、サブファイルに保持されたデータのみ書き出すので、データがうまく書き出せません。

[解説40]
基本的にライン入力となっていますので、このプログラムのコアはここです。

[解説50]
これは、老婆心ですが、ライン入力していて、サブファイルデータをセットしていても、F10を押さずに、F3を押すと、いきなり終了してしまいます。きっとオペレータはがーんとショックを受けますので、もし、入力して未出力(F10を押していない)データがあれば、「入力データがあります。終了しますか」などと警告を出してあげてください。このプログラムサンプルでは、これをやっていません。

[解説60]
もし、既に入力されて、データ登録されていれば、入力前に、サブファイルをロードします。

[解説70]
ラインに表示される、行番号はここで、現在の件数+1として、表示されます。ところで、このプログラムでは、RRN01は重要な意味を持っています。それは、必ず、RRN01は処理中のサブファイルの最大RRN番号を保持するようにしているのです。ライン入力で、サブファイルにデータを書き出すプログラムでは、「今、サブファイルに何件書き出したのか」は、要となります。わざと、別フィールドにしてもいいのですが、これをこのサンプルに載せると、分かりづらいのでRRN01にその意味を含ませました。

[解説80]
この、サブルーチンはこのプログラムのコアです。ここが一番大切です。このサブルーチンは、F3,F12,F10が押されるまでループします。

[解説90]
行番号は、違う値が入力されると修正モードに飛ぶ重要な役目を持っています。ここは、場合によっては、F何とかキーで修正モードに飛ぶパターンでもいいと思います。この行番号を書き換えたらその行の修正モードにする発想は、SEUから頂きました。さて、ということは、修正モードが終わったら、書き換えられる前の行番号が必要ですよね。それで、この行番号を別フィールドに保管します。また、書き換えたか否かの判定にも使えます。

[解説100]
ライン入力のレコード様式を表示しています。本来、入力値を検査しなくてはならないのですが、シンプルなソースにするため、この検査をしていません。

[解説110]
L1SEQは行番号です。修正モードならば、この値でSFL01にCHAINします。それで、RRN01が0以上で、かつ、行番号を新しく入力入れたかを判定しているのです。それから、ライン入力の開始では、カーソルは、順序番号の隣のフィールドに位置づけられます。もし、行を修正したい時は、オペレータは、カーソールを、L1SEQに持っていかねばなりません。このL1SEQにはCHECK(ER)が指定されているので、フィールドエグジットで、実行キーを押したのと同じになります。

[解説120]
行の修正モードに飛びます。ここでは、データベースではなく、既に入力されて、サブファイルレコードに保持されたデータの修正です。

[解説130]
修正モードに該当しないならば、追加モード(サブファイルへの追加モード)へ飛びます。

[解説140]
ここでは、データベースにデータが既に存在した場合、サブファイルレコードに書き出す処理をしています。「表示中の行番号とRRN01が同じ」であることが重要です。SEQ=5(5行目)だったら、RRN01=5となるわけです。こうでないと修正がうまく出来ません。

[解説150]
ここでは、行入力データを、サブファイルレコードに書き出す処理をしています。「表示中の行番号とRRN01が同じ」であることが重要です。SEQ=5(5行目)だったら、RRN01=5となるわけです。こうでないと修正がうまく出来ません。また、後でサブファイルレコードから、データを書き出すための指標として、S1STSに「ADD」を表示しています。オペレータも何が次に起こるか分かりやすいと思います。S1STSがブランクだと、ファイルから読み出したデータとなります。但し、このプログラムでは、ファイル出力の時は、後で出てくる「DLT」のみ参照しています。それから、S1STSをヒドンにしてもいいでしょう。

[解説155]
データをサブファイルレコードに書き出したら、その行を表示しなくてはなりませんね。それで、書き出した相対レコード番号をSFLRCDNBRに入れています。サブファイルが次のページに行っても、きちんと表示されるのは、ここでやっているのです。

[解説160]
次にライン部分の行番号をカウントアップするために、RRN01+1を行番号フィールドにセットしています。

[解説170]
ここから、行修正モードのコアです。まず、*IN81をオンにして、F10を使えなくして、通常の入力画面では使えないF23を使えるようにし、さらに、L1SEQをプロテクトしています。画面のDDSを参照してください。

[解説180]
SFL01からデータをライン入力の各フィールドへ持ってくるので、CHAINをしますが、RRN01がこの時、書き換わってしまうのでRRN01を待避しています。

[解説185]
尚、もし入力が10行までなのに、11行の修正を使用とすると、CHAINエラーとなり、処理はスキップされて、行の修正モードの終結処理に飛びます。

[解説190]
オペレータに、修正中の行が分かるように、修正行をブリンク(カラーは赤)させます。そのために、*IN52をオンにして、いったんSFL01をUPDATE して、それを表示するために、WRITECTL01しています。、

[解説200]
この前に、CHAIN-*IN52-UPDATEしましたが、この後、最後にUPDATEをするために、再びCHAINをしています。

[解説210]
ここで、サブファイルレコード内容を、ライン行に持ってきています。後は、これを表示して、オペレータが上書き入力したら、その内容で、SFL01をUPDATEします。

[解説215]
FTR02は、修正モード専用です。

[解説220]
機能キーを調べます。F3やF12を押されたら、先ほどの、*IN52(ブリンク)をオフにして、SFL01をUPDATEして終了。F23ならば、削除処理をします。実行キーのみならば、変更処理をします。

[解説230]
ここから、行の修正モードの終結処理です。*IN81をオフにして、F10を使えるようにして、F23を再び、使えなくして、L1SEQのプロテクトをはずします。

[解説240]
この行修正モードの最初に待避した、RRNを復元します。

[解説250]
さらに、先ほど入力していた最後の行を表示します。

[解説260]
さらに、最終行+1をライン入力フィールドにセットします。

[解説270]
行修正モードから、変更処理をしています。入力値をサブファイルレコードにセットしてUPDATEしています。S1STSには「CHG」をセットしています。さらに、*IN52をオフにしてブリンクをオフにしています。この辺は、元のサブルーチン内でやってもよかったかも。

[解説280]
行修正モードから、削除処理をしています。サブファイルレコードの内容を0にセットしてUPDATEしています。S1STSには「DLT」をセットしています。さらに、*IN52をオフにしてブリンクをオフにしています。この辺は、元のサブルーチン内でやってもよかったかも。

[解説290]
入力が終わり、F10が押されると、ここでファイルに書き出します。いろいろ異論もあることでしょうが、ここでは、サブファイルにロードした、データの削除をして、サブファイル上のデータをファイルにすべて書き出します。置き換えているのです。ここでは、単にオーダーのデータを扱うだけなので、このようにしましたが、ユニークキーを持つファイルであれば、S1STSのADD,CHG,DLTで、サブファイルを一件読んでは、ADD(WRITE命令),CHG(UPDAT命令),DLT(DELET命令)をしてもOKです。

※異論とは、この方法だと、1行修正しただけでも、レコードの変更は、全体に行われたように、記録されてしまう(例:タイムスタンプなどが、全部同じになってしまう)、とか、兎に角サブファイルの上に明細が全てのっかっていないと、うまく動かないとか、などです。簡単に説明したかったので、「全件削除+明細追加」にしました。もし、きちんと、追加、変更、削除をする場合は、ユニークキーならば、S1STSを参照して、WRITE、UPDAT、DELETをすれば、可能です。

[解説300]
いったん、指定と同じオーダー番号を持つ、データをファイル上から削除します。

[解説310]
いったん削除した後、RRN01(このプログラムでは必ず最大行番号になっています)の分、SFL01にCHAINをして、S1STSがDLTでなければ、データを書き出しています。

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送