最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

17.12.RPGの基本 o仕様書その1

[ Previous ] [ HOME ] [ Upper ] [ Next ]


今日は、O(OUTPUT)仕様書です。

マニュアル「AS/400 RPG/400 解説書」
10.0 第10章 出力仕様書

出力仕様ではプログラム記述出力ファイルのレコードおよびフィールドの様式、そしてレコードがいつ書き出されるかについて記述します。外部記述ファイルの場合には、出力仕様は任意指定です。出力仕様は、レコード識別および制御(7 〜37桁目)とフィールド記述および制御(23〜70桁目)の2つに大別できます。これらの仕様は RPG/400 出力仕様書に記入します。

何度も、説明してきましたように、プログラムの基本は、データを入力して(i仕様書)、データを加工して(c仕様書)、データを出力(o仕様書)する事にあります。今回は、その出力部分です。

O仕様書の中核は、出力したいデータ(フィールド)を、レコードとして組み立てて、出力する事にあります。その仕組みは、ちょうど、入力仕様書の入力域と逆の働きになります。つまり、入力仕様書では、

ファイルからレコード取り出し → (入力域) レコードからフィールドに分解 → プログラム

という流れでしたね。

逆にo仕様書では、

プログラム → フィールドからレコードに組立 (出力域) → ファイルへレコード書き出し

となります。

o仕様書の目的

  • 帳票印刷のデータの配置の記述

印刷のレイアウトに従って、このデータをここへ、あのデータをあそこへと、記述していきます。最も一般的な使い方。

  • データベースへのデータの書き込み

外部記述では、本来はWRITE命令やUPDATE命令をC仕様書で使いますので、o仕様書は例外的にしか使いません。実行効率を上げる目的で、レコード全体を更新するのではなく、部分的な個々のフィールドのみ更新したいときに使います。(特殊なので、個々では説明しないことにします。)

スペーシングチャート(印刷設計用紙)

帳票の設計は、まず普通は、スペーシングチャートに、帳票のイメージを書きます。この用紙は、文具売場のコンピュータ用紙関係のところで手に入ります。大袈裟なものではなくて、単に、どこにこの数字を配置して、どこにこの名称を配置して、...と、レイアウトを決めていくのです。プログラムを作成するときには、スペーシングチャートのメモリを見て、出力の桁位置を読みとります。また、書き上げた用紙は、プログラムは完成しても、ポイっと捨てたりしません。ドキュメントとして保管します。

rdl00674.jpg (81920 バイト)

IBMでも、スペーシングチャートを販売しています。IBM(または特約店)の営業マンに聞いてみてください。但し、私の知っているものは、132桁までで、198桁のものが無かったのですが、多分今は、198桁までのものがあると思います。確か、昔サンプルを貰った記憶があります(でも、現実の用紙とはサイズが違いました。)また、専用用紙のために、実寸大のスペーシングチャートが一冊あると重宝します。

N:GX18-3531-0(132桁)

rdl00677.jpg (81920 バイト)

 

1-10

11-20

1 2 3 4 5 6 7 8 9 0 1 2 3 4
1 A B C   Z Z , Z Z 9 -      

これは、スペーシングチャートに書き込んだ、ABCとZZ,ZZ9-のつもりです。これで行くと、2つのデータを印刷していますね。たった、1行です。これを元に、メモリを見て、桁を読んでみましょう。

数字の記入上の注意

ZZ,ZZ9-って何のことか、分かりますか。

これは、

「(フィールドの桁数)5桁の数字のフィールドで、小数点以下はありません。」そして、「(数字の編集)ゼロサプレスをして、3桁単位に「,」をつけて、マイナスは-で表記します。」

ということです。

定義の前半は、フィールドのタイプと桁数、小数以下の桁数を定義していて、後半の定義では、数字の編集を定義しています。たった一つで、定義がすべて分かってしまうのですね。

Zゼロサプレスの意味で、0の変わりに空白を印刷する部分90でも印刷をする数字の部分を意味します。

たとえば、04321は  4,321と印刷して、負の00105は   105-と印刷する事を意味します。ゼロサプレスされた0やカンマは、1文字分、桁を使います。従って、4321でも、105-でも、用紙上で占有する桁数は同じ7桁です。こうなっていないと、カンマがきれいに縦に並ばないですよね。

符号 印刷すると→ 1 2 3 4 5 6 7
04321   4 , 3 2 1  
00105       1 0 5 -
91005 9 1 , 0 0 5  
00004           4 -
11999 1 1 , 9 9 9 -

では、その他の数字の表し方を見てみましょう。

  • ZZZZは、数字で4桁小数点以下はなし、ゼロサプレスをして、コンマ、符号表示なし
  • 9999は、数字で4桁小数点以下はなし、ゼロサプレスをせず、コンマ、符号表示なし
  • ZZZ,ZZ9.99-は数字で整数部分が6桁で、小数点以下は2桁で、ゼロサプレスをして、3桁単位にコンマ、小数点ピリオド、符号表示あり。

注意

小数点以下のある場合、ZZZ,ZZZ.ZZとすると、000010.55は、     10.55 と表示しますが、000000.01は、     1 と表示してしまいます。なぜなら、すべてゼロサプレスされて、整数部分を一個も出さないからです。ゼロサプレスは、カンマ編集で、不要なときには、,を出しませんよね。000,105-とは出ないでしょう?それと同じで、小数点のピリオドも不要なときには出しません。このようなときは、ZZZ,ZZ9.99-と表すのが、正しいのです。これで、000000.01は 0.01 と印刷されます。

O仕様書の指定形式

 

1-10

11-20

1 2 3 4 5 6 7 8 9 0 1 2 3 4
1 A B C   Z Z , Z Z 9 -      

O仕様書では、データの最後の部分の桁数を書き込みます。

ABCの最後の桁数は、3ですね。

また、ZZ,ZZ9-の最後の桁は11ですね。フィールド名を仮にO1FLDとします。では、O仕様書に書き込んでみましょう。

     O                                    3 'ABC'
     O                         O1FLD J   11                     

おわかりでしょうか?3桁目の3と、11桁目の11が記入されていますね。それから、ABCは固定情報なので、左側に記入しています。フィールドのO1FLDは右側に書いてありますね。その後ろのJは数字タイプのフィールドに対してのみ行われる、編集記号です。(尚、数字のフィールドか否かは、O仕様書では定義できません。外部記述であれば、レコード様式内か、または、C仕様書で定義されます。)

それから、入力仕様書では、入力域の定義として、どこからどこまで、どんな属性か、を定義しましたよね。今度は、o仕様書では出力域の定義をしています。とはいえ、データの流れは、入力、処理、出力なので、出力の前では必ず、i仕様書かc仕様書で、そのフィールドの属性(桁数とか数字か文字かとか)は既に定義済みなので、定義する部分は、出力したいフィールドの「終わりの位置」の指定だけでいいわけです。あと、人間が読みやすいように工夫する為の、「数字の編集」とか(文字はできませんよ)、出力後フィールドをクリアするかなどの、おまけがつきます。ちなみに、この印刷後(出力後)でフィールドクリア(「ブランクアフター」という)は、ロジックにも関係してきます。きっと、あとで分かってきますよ。

さて、これだけでは、どの印刷ファイルに書き込んでいるか、指定していません。RPGでは、プリンターファイルは8個まで指定できるのです。わざと、印刷装置ファイルを複数にしてみました。

     F******************************************************
     F*     D E F I N E    F I L E S                       *
     F******************************************************
     FQPRT132 O   F     132     OF     PRINTER
     FQPRT198 O   F     198     OA     PRINTER                    
(略)
     C                     EXCPT#HED
     C*
     C                     MOVE *ON       *INLR
     C                     RETRN
(略)
     O******************************************************
     O*             O U T P U T   M O D U L E              *
     O******************************************************
 (1) OQPRT132 E  101           #HED
 (2) O                                   8 '132'
 (3) O                         UDATE Y  20
 (4) O* 
 (5) OQPRT132 E  1             #HED
 (6) O                                   8 'LINE 2'
 (7) O                                  20 'TEST'      
     O*
 (8) OQPRT198 E  101           #HED
     O                                   8 '198'
     O                         UDATE Y  20
     O*
     O        E  1             #HED
     O                                   8 'LINE 2'
     O                                  20 'TEST'          

急に、定義部分が増えて驚きましたか?F仕様書を載せたのは、O仕様書と対比させる目的です。C仕様書は、軽く見ておいてください。

このo仕様書程度が分からないと、先に進めませんよ。じっくり、見ていきましょう。

     O******************************************************
     O*             O U T P U T   M O D U L E              *
     O******************************************************
 (1) OQPRT132 E  101           #HED
 (2) O                                   8 '132'
 (3) O                         UDATE Y  20
 (4) 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文字印刷する様をよく考えてください。なお、「このスキップがあるので、改ページするのだ」ということ、もよく覚えておいてください。

マニュアル「AS/400 RPG/400 解説書」
10.3.6 17 〜 22 桁目(スペースおよびスキップ)

17 〜 22 桁目を使用して印刷出力ファイルにおける行のスペースおよびスキップを指定します。スペースとは一度に1行繰り上げること、そしてスキップとはある印刷行から別の行へとぶことです。

スペースおよびスキップを同じ行に指定した場合には、スペースおよびスキップ操作は次の順序で処理されます。

前にスキップ
前スペース
行の印刷
後でスキップ
後スペース

(3) また、UDATEはRPGの予約語で、ジョブ日付を出すものです。(ユーザ指定の任意のワークフィールドではありません)。その後ろの、Yは編集コードです。(後で説明します)。

では、ここまでのプログラムを、日本語で読んでみましょう。

  1. QPRT132に、例外出力で印刷してください。(1)
  2. 印刷前に絶対行01へスキップしてください。(1)
  3. 終わりが8桁目に、固定情報で132と印刷してください。(2)
  4. その次に、ジョブ日付を、20桁目を終わりにして、印刷してください。このとき、編集語はYです。(3)
  5. 印刷し終わったら、1行改行してください。(1)

となります。(番号)は、ソース内の(番号)と対応させました。

(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) OQPRT132 E  1             #HED
 (6) O                                   8 'LINE 2'
 (7) O                                  20 'TEST'         

さて、その次に(5)、再び、薄い色で、QPRT132と出ていますね。ここも、QPRT132に書き出す指定です。でも、一度上(1)でQPRT132と指定してますよね。だから、2回目移行この部分は、省略できます。ちなみに、QPRT198の2つ目は、省略されていますね(8)。書き忘れではなくて、省略したのです。

※このように、RPGの中では、省略がいくつか出てきます。特にC仕様書では、よく出てきます。大抵、繰り返しの無駄、重複の無駄を省くのが目的です。RPGはアメリカ生まれの、合理主義者です。

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行ですが、大きな一歩です。印刷するとこんな感じです。

prtsample1.gif (3181 バイト)

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
1行目 1 3 2 9 8 / 1 1 / 1 5
2行目 L I N E 2 T E S T

本当はQPRT132は10cpiで、QPRT198は15cpiなので、もっと左に長いのですが、WWWなのでご勘弁を。

以上の事は、QPRT198にも、同じ事が言えます。但し、「132」ではなく「198」と印刷されますね。

ところで、この、#HEDの中身は、ちょうど、ファイルのレコードと同じだと思いませんか。フィールドの集まりを「レコード」と言いましたね。そして、#HED単位に、フィールドが合成されて、書き出されていますね。そうです、マニュアル「AS/400 RPG/400 解説書」では、この部分を「レコード定義」と説明しています。「第10章 出力仕様書」を参照してください。

このページも長くなってきたので、残りはパート2に譲ることにします。印刷のプログラムが作れないプログラマーは、プログラマー失格です!とても基本的なことなので、しぶとくやろうと思っています。もう少し、O仕様書におつきあいください。

今日はここまで。

起立、礼、着席


[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

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