RPGによるコーディング | 印刷処理 |
RPGによるコーディング方法を取り上げます。随時増ページの予定です。
印刷処理
印刷処理はバッチ処理でのファイルへの出力処理とほとんど同じですが、ページ・オーバーフローのときの
処理(いわゆる改ページ処理)を割り込ませる必要があります。このためには次のようにします。
1.明細と見出し部分の様式を持った印刷ファイルを準備する。
2.F仕様書で、ページオーバーフロー時のための標識を定義する。
3.明細印刷の直前で上記標識により、ページオーバーフローの判定をし、オーバーフローなら、
見出し印刷を行い、ページ・オーバーフローの解消を行う。
印刷ファイルを準備
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+. A* ID : LM420P A* NAME :得意先一覧表 A* A*--------------------------------------------------------------- A R HDR01 A SKIPB(2) A 55 '得意先一覧表' A 101 DATE EDTCDE(Y) A 111 TIME A SPACEA(3) A* A 110 'PAGE.' A +1 PAGNBR A SPACEA(1) A* A 2'得意先Y' A +2'得意先名' A 58'読みカナ' A 80'TEL' A 94'担当営業' A 106'売上実績' A SPACEA(1) A*--------------------------------------------------------------- A R DTL01 A SPACEB(1) A P1NUM 5A 2TEXT('得意先Y ') A P1NMKJ 42O +7TEXT('得意先名 ') A P1NMKN 20A +2TEXT('得意先カナ') A P1TEL 12A +2TEXT('TEL ') A P1SLNO 4A +2TEXT('担当営業Y') A P1UR\ 11S 0 +8TEXT('売上実績 ') A EDTCDE(K) A SPACEA(1)
F仕様書で、ページオーバーフロー時のための標識を定義
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+. FLM420P O E 30 PRINTER F* ↑.....ページ・オーバーフローのための標識
ページ・オーバーフローの判定をし、オーバーフローなら、見出し印刷
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+. C* オーバーフロー処理 C *IN30 IFEQ *ON C WRITEHDR01 C SETOF 30 C ENDIF
プログラム全体は次のようになります。
**--------------------------------------------------------------- ** ID : LM420B ** NAME : 担当者別得意先一覧 ** FUNC : パラメータで得た営業担当bフものだけ、一覧表にする。 **--------------------------------------------------------------- H Y- F*--------------------------------------------------------------- FM420L02 IF E K DISK @@@@@FLM420P O E 30 PRINTER F* ↑.....ページオーバーフローのための標識 C*--------------------------------------------------------------- C *ENTRY PLIST C PARM P@SLNO 4 C*--------------------------------------------------------------- C* 初期処理 C SETON 30 !!!!!C P@SLNO SETLLM420R !!!!!C P@SLNO READEM420R 99 C* 本処理 C *IN99 DOWEQ*OFF C MOVELTKNUM P1NUM 得意先 C MOVELTKNMKJ P1NMKJ 得意先名 C MOVELTKNMKN P1NMKN 得意先カナ C MOVELTKTEL P1TEL TEL C MOVELTKSLNO P1SLNO 担当営業 C MOVELTKUR\ P1UR\ 売上実績 C* オーバーフロー処理 @@@@@C *IN30 IFEQ *ON @@@@@C WRITEHDR01 @@@@@C SETOF 30 over-flow解消 @@@@@C ENDIF C* C WRITEDTL01 C* !!!!!C P@SLNO READEM420R 99 C ENDDO C* 終了処理 C SETON LR C RETRN
同一キーレコードの読取り
同一キーを読み取りするには、SETLLとREADE命令を使用します。
SETLL命令は読み取り位置の位置付けをする命令です。(実際の読取はしません。)
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+. C P@SLNO SETLLM420R C P@SLNO READEM420R 99
この例は、キーが1個だけですが、複数個でも同様です。複数個のキーの場合はキーリストを使用します。
キーがブレークしたときは、標識99が*ONになります。準EOFの感覚で使用します。
同一キー読取りのサンプルプログラムを次にしめします。!!!!!を付した個所が該当の個所です。
このプログラムでは、パラメータで得た営業担当bフものだけ、一覧表にしています。
(このプログラムは前述のプログラムと同じものです。)
**--------------------------------------------------------------- ** ID : LM420B ** NAME : 担当者別得意先一覧 ** FUNC : パラメータで得た営業担当bフものだけ、一覧表にする。 **--------------------------------------------------------------- H Y- F*--------------------------------------------------------------- FM420L02 IF E K DISK FLM420P O E 30 PRINTER F* ↑.....ページオーバーフローのための標識 C*--------------------------------------------------------------- C *ENTRY PLIST C PARM P@SLNO 4 C*--------------------------------------------------------------- C* 初期処理 C SETON 30 !!!!!C P@SLNO SETLLM420R !!!!!C P@SLNO READEM420R 99 C* 本処理 C *IN99 DOWEQ*OFF C MOVELTKNUM P1NUM 得意先 C MOVELTKNMKJ P1NMKJ 得意先名 C MOVELTKNMKN P1NMKN 得意先カナ C MOVELTKTEL P1TEL TEL C MOVELTKSLNO P1SLNO 担当営業 C MOVELTKUR\ P1UR\ 売上実績 C* オーバーフロー処理 C *IN30 IFEQ *ON C WRITEHDR01 C SETOF 30 C ENDIF C* C WRITEDTL01 C* !!!!!C P@SLNO READEM420R 99 C ENDDO C* 終了処理 C SETON LR C RETRN
ファイルの更新
レコードの追加、変更、削除をまとめてファイルの更新と呼ぶことにします。
レコードの追加
レコードを追加するには、
1.F仕様書でファイルタイプ(15桁目)をOとするか、
2.66桁目をAとしてレコードが増えることを宣言しておきます。
3.WRITE命令で出力します。
レコードの変更・削除
1.レコードを変更・削除するには、F仕様書でファイルタイプ(15桁目)を、Uとしておきます。
2.一度読込みしておいて、変更のときはUPDAT、削除のときはDELETします。
注:ファイルタイプUのものをREADすると、そのレコードにロックがかかります。(レコード単位のロック)
UPDAT/DELET完了でロック解除となります。読込みしないでUPDAT/DELETするとエラーになります。
例:通し番号の採番プログラム(追加・変更の例)
事務作業の中で、受注b笂`票bネど、通し番号を一元的に発行することがあります。
ここでは、それをプログラムGF910で,一元的に発行管理しようとするものです。
プログラムの説明
このプログラムは業務ID(10桁)により、業務IDごとに通し番号を採ります。
最新番号はファイルに業務IDをキーとして記録し管理します。また、通し番号の上限、下限も記録し、通し番号が
上限に達したなら、下限の番号に戻って採番するものとします。
業務IDごとの管理レコードは別のタイミングで設定されるものとします。もしその設定済の管理レコードがない時は、
省略時解釈として、下限000001、上限999999の管理レコードを、自動的に追加するものとします。
サンプル・プログラム
H*--------------------------------------------------------------- H* ID : GF910 H* NAME :通し番号採番 H* FUNC :パラメータで与えられた業務IDにより、採番ファイルを H* よみ、通し番号を採番しパラメータで返す. H* 採番ファイルに該当の業務IDのレコードが無いときは、 H* 同レコードを追加して採番する。 H*--------------------------------------------------------------- H Y- F*--------------------------------------------------------------- F*採番管理ファイル FF910 UF E K DISK A E*--------------------------------------------------------------- E MSG 01 01 40 C*--------------------------------------------------------------- C *ENTRY PLIST C PARM P@GYID 10 C PARM P@SEQ 60 C*--------------------------------------------------------------- C*読取確認 C P@GYID CHAINF910R 99 読取り C*該当の業務IDがなければ自動追加 +----C *IN99 IFEQ *ON | C MOVELP@GYID NOGYID 業務ID | C Z-ADD000000 NOCRNO CUR | C Z-ADD000001 NOFRNO FROM | C Z-ADD999999 NOTONO TO | C MOVELMSG,1 NOTEXT テキスト | C WRITEF910R レコード追加 | C P@GYID CHAINF910R 99 読取り +----C ENDIF C*採番(上限いかなら+1そうでなければ下限から) +----C NOCRNO IFLT NOTONO | C ADD 001 NOCRNO 採番済 +----C ELSE | C Z-ADDNOFRNO NOCRNO 採番済 +----C ENDIF C*戻しへセットと更新 C Z-ADDNOCRNO P@SEQ 採番済 C UPDATF910R C*終了処理 C SETON LR C RETRN C* ** MSG ** プログラムによって自動的に追加された。
採番管理ファイルF910
次のように定義されているものとします。
A*-------------------------------------------------------------- A* ID : F910 A* NAME : 採番管理ファイル A*-------------------------------------------------------------- A UNIQUE A R F910R A* A NOGYID 10A COLHDG(' 業務ID ') A NOCRNO 6S 0 COLHDG(' 現在 ') A NOFRNO 6S 0 COLHDG(' 開始 ') A NOTONO 6S 0 COLHDG(' 終了 ') A NOTEXT 50O COLHDG(' テキスト ') A* A K NOGYID
説明
1.ファイル定義
採番管理ファイル:タイプがU,レコード追加ありなのでAとなっています。
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+. F*採番管理ファイル FF910 UF E K DISK A
2.読取り確認
パラメータでわたされた、業務IDをキーとしてCHAINしています。
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+. C*読取確認 C P@GYID CHAINF910R 99 読取り
3.新レコード追加と再度CHAIN
該当業務IDの管理用レコードがないときは、自動追加し、それを直後に読み取りします。
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+. | C WRITEF910R レコード追加 | C P@GYID CHAINF910R 99 読取り
4.パラメータへのセットと更新
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+. C*戻しパラメータへセットと更新 C Z-ADDNOCRNO P@SEQ 採番済 C UPDATF910R
例:落帳処理(削除の例)
トランザクションデータをシステム上に、どの位の期間とっておけばよいのかはシステム設計上、非常に
重要なことです。
この期間が過ぎれば、バックアップとして保管し、不要なデータは削除となるわけですが、この作業を落帳と
いいます。
ここではパラメータで与えられた日付を基準日として、受注データの落帳を行なっています。
H*--------------------------------------------------------------- H* ID : DF520 H* NAME : 落丁処理 H* FUNC : パラメータで与えられた日付を基準としてそれ以前の H* 受注日のデータを削除する。 F*--------------------------------------------------------------- F* 受注明細ファイル FF520 UF E K DISK C*--------------------------------------------------------------- C *ENTRY PLIST C PARM P@RKDT 80 落帳基準日 C* C READ F520R 99 C* 読取りできる間 +----C *IN99 DOWEQ*OFF |+---C JDJUDT IFLT P@RKDT 基準日以前 || C DELETF520R 削除 |+---C ENDIF | C READ F520R 99 +----C ENDDO C* 終了処理 C SETON LR C RETRN
受注明細ファイル(F520)
A*-------------------------------------------------------------- A* ID : F520 A* NAME : 受注明細ファイル A* KEY : 受注 , 明細 A*-------------------------------------------------------------- A UNIQUE A R F520R TEXT(' 受注明細ファイル ') A* A JDJUNO 6S 0 COLHDG(' 受注 ') A JDMENO 2S 0 COLHDG(' 明細 ') A JDTKNO 5A COLHDG(' 得意先 ') A JDHNNO 6A COLHDG(' 品目 ') A JDJUSU 7S 0 COLHDG(' 受注数 ') A JDJU@ 9S 2 COLHDG(' 受注@ ') A JDJUDT 8S 0 COLHDG(' 受注日 ') A JDSEDT 8S 0 COLHDG(' 請求日 ') A* A K JDJUNO A K JDMENO
説明:
1.削除(DELET)を行うためには、ファイルのタイプをUとします。
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+. F* 受注明細ファイル FF520 UF E K DISK
2.削除(DELET)は読取をしたものしか削除できません。
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+. C DELETF520R 削除
前ページ 次ページ 目 次
(C)COPYRIGHT ISHIOKA KATSUHIDE 2000