17.12.RPGの基本 o仕様書その1 |
今日は、O(OUTPUT)仕様書です。
何度も、説明してきましたように、プログラムの基本は、データを入力して(i仕様書)、データを加工して(c仕様書)、データを出力(o仕様書)する事にあります。今回は、その出力部分です。 O仕様書の中核は、出力したいデータ(フィールド)を、レコードとして組み立てて、出力する事にあります。その仕組みは、ちょうど、入力仕様書の入力域と逆の働きになります。つまり、入力仕様書では、
という流れでしたね。 逆にo仕様書では、
となります。 o仕様書の目的
スペーシングチャート(印刷設計用紙)帳票の設計は、まず普通は、スペーシングチャートに、帳票のイメージを書きます。この用紙は、文具売場のコンピュータ用紙関係のところで手に入ります。大袈裟なものではなくて、単に、どこにこの数字を配置して、どこにこの名称を配置して、...と、レイアウトを決めていくのです。プログラムを作成するときには、スペーシングチャートのメモリを見て、出力の桁位置を読みとります。また、書き上げた用紙は、プログラムは完成しても、ポイっと捨てたりしません。ドキュメントとして保管します。 IBMでも、スペーシングチャートを販売しています。IBM(または特約店)の営業マンに聞いてみてください。但し、私の知っているものは、132桁までで、198桁のものが無かったのですが、多分今は、198桁までのものがあると思います。確か、昔サンプルを貰った記憶があります(でも、現実の用紙とはサイズが違いました。)また、専用用紙のために、実寸大のスペーシングチャートが一冊あると重宝します。 N:GX18-3531-0(132桁)
これは、スペーシングチャートに書き込んだ、ABCとZZ,ZZ9-のつもりです。これで行くと、2つのデータを印刷していますね。たった、1行です。これを元に、メモリを見て、桁を読んでみましょう。
O仕様書の指定形式
O仕様書では、データの最後の部分の桁数を書き込みます。 ABCの最後の桁数は、3ですね。 また、ZZ,ZZ9-の最後の桁は11ですね。フィールド名を仮にO1FLDとします。では、O仕様書に書き込んでみましょう。
おわかりでしょうか?3桁目の3と、11桁目の11が記入されていますね。それから、ABCは固定情報なので、左側に記入しています。フィールドのO1FLDは右側に書いてありますね。その後ろのJは数字タイプのフィールドに対してのみ行われる、編集記号です。(尚、数字のフィールドか否かは、O仕様書では定義できません。外部記述であれば、レコード様式内か、または、C仕様書で定義されます。) それから、入力仕様書では、入力域の定義として、どこからどこまで、どんな属性か、を定義しましたよね。今度は、o仕様書では出力域の定義をしています。とはいえ、データの流れは、入力、処理、出力なので、出力の前では必ず、i仕様書かc仕様書で、そのフィールドの属性(桁数とか数字か文字かとか)は既に定義済みなので、定義する部分は、出力したいフィールドの「終わりの位置」の指定だけでいいわけです。あと、人間が読みやすいように工夫する為の、「数字の編集」とか(文字はできませんよ)、出力後フィールドをクリアするかなどの、おまけがつきます。ちなみに、この印刷後(出力後)でフィールドクリア(「ブランクアフター」という)は、ロジックにも関係してきます。きっと、あとで分かってきますよ。 さて、これだけでは、どの印刷ファイルに書き込んでいるか、指定していません。RPGでは、プリンターファイルは8個まで指定できるのです。わざと、印刷装置ファイルを複数にしてみました。
急に、定義部分が増えて驚きましたか?F仕様書を載せたのは、O仕様書と対比させる目的です。C仕様書は、軽く見ておいてください。 このo仕様書程度が分からないと、先に進めませんよ。じっくり、見ていきましょう。
(1) o仕様書で、QPRT132と出ている部分で、「ここから印刷装置ファイル「QPRT132」に書き出す部分ですよ」と指定しています。 (1) Eと出ているのは、EXCPTのEです。つまり、「例外出力だよ」、と指定してるのです。(なんで例外かは、サイクルのお話でします。)C仕様書のEXCPT命令は、後ほど説明しますが、一番出力を制御しやすい方法です。EXCPT命令の後に、#HEDが見えますか。これを「EXCPT名」「例外出力名」といいます。これに対応して、O仕様書にも#HEDと出ている部分を探してください。全部で4っつありますよね。そのうち2つは、印刷装置ファイルQPRT132に対するもので、残り2つは、QPRT198に対するものです。 (1) その次に、「101」と出ていますね。最初の「1」は、「印刷後スペース1行(ベタ打ち)」、その次の「01」は「印刷前に絶対行01へスキップ」という指示です。このスペースとスキップは、「印刷の基本」に出ています。スペースの前と後、スキップの前と後は、「印刷後」か「印刷前」かということです。ここって、結構オーバーフローでうまくいかなくなったりします。頭の中で、よくシュミレーションしましょう。イメージを描きやすいのは、「キャラクタープリンター」です。1文字、1文字印刷する様をよく考えてください。なお、「このスキップがあるので、改ページするのだ」ということ、もよく覚えておいてください。
(3) また、UDATEはRPGの予約語で、ジョブ日付を出すものです。(ユーザ指定の任意のワークフィールドではありません)。その後ろの、Yは編集コードです。(後で説明します)。 では、ここまでのプログラムを、日本語で読んでみましょう。
となります。(番号)は、ソース内の(番号)と対応させました。 (4)はコメントです。すべての仕様書の識別子のすぐ左横に*をつけた場合、コメント(非実行文)となります。ここに、注釈や、わかりやすいようにセパレータを書いたりします。コンパイラはこの行を無視してくれますので、何でも書けます。 O****************************************************** O* O U T P U T M O D U L E * O****************************************************** も、コメント行を利用しています。また、仕様書の識別子を入れなくても、同じ場所に*があれば同じ機能になります。 ****************************************************** * O U T P U T M O D U L E * ****************************************************** OQPRT132 E 101 #HED O 8 '132' O UDATE Y 20 * OQPRT132 E 1 #HED O 8 'LINE 2' O 20 'TEST' ということも出来るわけです。これは、好みの問題です。私は、上のパターンでやります。
さて、その次に(5)、再び、薄い色で、QPRT132と出ていますね。ここも、QPRT132に書き出す指定です。でも、一度上(1)でQPRT132と指定してますよね。だから、2回目移行この部分は、省略できます。ちなみに、QPRT198の2つ目は、省略されていますね(8)。書き忘れではなくて、省略したのです。
2つめのQPRT132の#HEDを見てみましょう。上にあるEXCPT命令で、既に(1)から(3)で、絶対行1行目で、「132」とジョブ日付を印刷した後、1行改行していましたね。このように、同じEXCPT名が続くときは、上から下へ指定が実行されていきます。 (5)では、(1)と同じく、例外出力で、印刷後1スペースの指定がありますね。でも、01ありません。これでいいのです。もし、ここに01があると、また、「改ページ」ししまいます。つまり、ここに01を付け加えてしまうと、「132」とジョブ日付を印刷した後、改ページして、印刷してしまうのです。こうしたいならともかく、そうでないときは、ここに「スキップ」の指定はしません。それから、(1)と同じく例外出力名が続きます。 (6)では、固定情報「LINE 2」を、8桁目を終わりにして、印刷します。 (7)では、固定情報「TEST」を、20桁目を終わりにして、印刷します。 そして、(5)にあるように、これらを印刷したら、1行改行します。 さて、印刷した結果を見てみましょう。全部でたったの2行ですが、大きな一歩です。印刷するとこんな感じです。
本当はQPRT132は10cpiで、QPRT198は15cpiなので、もっと左に長いのですが、WWWなのでご勘弁を。 以上の事は、QPRT198にも、同じ事が言えます。但し、「132」ではなく「198」と印刷されますね。 ところで、この、#HEDの中身は、ちょうど、ファイルのレコードと同じだと思いませんか。フィールドの集まりを「レコード」と言いましたね。そして、#HED単位に、フィールドが合成されて、書き出されていますね。そうです、マニュアル「AS/400 RPG/400 解説書」では、この部分を「レコード定義」と説明しています。「第10章 出力仕様書」を参照してください。 このページも長くなってきたので、残りはパート2に譲ることにします。印刷のプログラムが作れないプログラマーは、プログラマー失格です!とても基本的なことなので、しぶとくやろうと思っています。もう少し、O仕様書におつきあいください。 今日はここまで。 起立、礼、着席 |
You are at K's tips-n-kicks of AS/400
|
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||