DDS 印刷ファイル
画面ファイルへ もどる 目次へ
  帳票の見出しをどこに配置するか、明細のデータ項目をどの順に並べるか、見出しと明細の間は何行あけるか、
明細は1件あたり何行で構成するかなどは、データの配置に関することがらについては、プログラムの本質としては受け持たなくてもよいことです。
 このようなデータ項目を配置するような処理が、プログラム・コードの中にまぎれこむことによって、プログラム作成の能率低下、ミスの増大、プログラム精度の低下、プログラムの保守の困難などを招いていました。
印刷ファイルは、この中にデータ項目配置に関する情報を、集約にすることによって、これらの問題点を解決するオブジェクトです。ここでは印刷ファイルについて紹介いたします。




帳票の一般な様式
一般的に帳票はおおむね以下の例のようにヘッダー部、明細部、フッター部からなっています。
  PGM010                        <<  売上一覧表  >>                    6/01/10
   部門 11                                                            0001 頁

  売上日   伝  担当  顧客  品目  品名              数量    単価        金額
 --------------------------------------------------------------------------------
  6/01/11  00001  001  0001  001   大きいつづら         1     100         100
  6/01/13  00002  002  0002  002   小さいつづら        10     100       1,000
  6/01/14  00003  003  0003  003   打出の小槌         100     100      10,000
  6/01/14  00004  001  0003  004   玉手箱               1     200         200
  6/01/15  00005  002  0004  005   天の羽衣            10     200       2,000

                                        部門合計                       13,300


ヘッダー部





明細部


フッター部

ヘッダー部 ヘッダー部は1頁の頭の部分、すなわちタイトルや項目見出しなど、その頁に最初に1回だけ 印字される部分です。 上の例ではタイトルのある1行目から、項目見出しの下の仕切り線(点線)までです。 明細部 明細部は繰り返し印字される明細行で、上の例では売上日から金額までの項目を表示した 数行になります。 フッター部 フッター部は1頁の最後の部分、すなわち合計など、その頁の終わりに1回だけ印字される部分です。 印刷ファイルの記述 印刷ファイルのデータ定義記述(DDS)は、このような頁の構成にあわせてヘッダー部、明細部、 フッター部に分けて記述すると、プログラムも簡潔に作成することができます。
DDS記述の様式

DDS記述の様式はデータベース・ファイル、画面ファイル、印刷ファイルついて共通の様式を 使用します。様式は固定カラム様式で、各フィールドは次のようになっています。
カラム 項 目 内         容
1〜5 任意 メモやマークなど、使用目的は任意です。
仕様書コード 固定文字「A」を記述します。
17 タイプ Rのとき、レコードレベルの記述、ブランクのときフィールドレベルの記述を意味します。
19〜28 名前 レコード様式名、またはフィールド名を記述します。
30〜34 桁数 フィールドレベルのとき、その桁数を右詰で記述します。
35 データタイプ フィールドのデータタイプを記述します。
36〜37 少数以下の桁数 フィールドのデータタイプが数値の場合、小数点以下の桁数を右詰で記述します。
38 使用目的 入力(I)か出力(O)か入出力かを記述します。印刷ファイルの場合、省略します。
39〜41 行位置 フィールドの行位置を右詰で記述します。
42〜44 カラム位置 フィールドのカラム位置を右詰で記述します。+nとすると、前のフィールドとの間のブランク数です。
45〜80 機能 固定文字または、キーワードによる機能の記述をします。
DDSの記述をするには、帳票の設計書により各フィールドの位置(行、カラム)を調べ、
それに従って配置するようコーディングして行きます。
コーディングはSEU(ソース編集ユーティリティ)を使って行います。
ソース・タイプは印刷ファイル(PRTF)とします。

見出し部分

上の例で、見出し部分はハイフン(−)を使った仕切り線までです。 レコードレベルの記述はタイプ(17カラム目)をR、様式名はHDR01とします。 HDR01でなくてもかまいません。 45カラム目以降にTEXTパラメータを使って、注記を以下のように記述しておきます。 A R HDR01 TEXT(' 見出し部 ') これは省略可能です。 プログラム名は、2行2カラムの開始位置で、長さ10桁の英数字として記述します。 フィールドレベルの記述なので、タイプ(17カラム目)はブランクのままにしておきます。 フィールド名はPGMIDとしておきます。記述は次のようになります。 A PGMID 10A 2 2TEXT(' プログラム名 ') タイトルの「<< 売上一覧表 >>」は2行32カラムの開始位置の固定文字です。 固定文字は次のように45カラムから記述します。 A 2 32'<< 売上一覧表 >>' 日付は、2行69カラム目からYY/MM/DDのように編集して印字します。 フィールド名はYYMMDD、6桁の小数以下を持たない数値項目として記述します。 編集要領のパラメータEDTCDEで編集コード(Y)を使用します。 A YYMMDD 6S 0 2 69TEXT(' 日付 ') A EDTCDE(Y) パラメータの記述は次の行に継続して記述ができます。 「部門」の見出しは、3行2カラム目から始まる固定文字なので、タイトル同様に記述します。 部門コードは2桁の数字項目です。フィールド名はBUCODとしておきます。 カラム位置は8カラムから始まるように記述してもよいのですが、部門の見出しの直後に続くので、 +0のように相対的な記述をしておきます。後で項目の配置が変わるような場合修正が簡単です。 A 3 2 ' 部門 ' A BUCOD 2S 0 +0TEXT(' 部門コード ') ページ番号(開始位置3行70カラム)は、PAGNBRというパラメータを使用します。 このパラメータはページ番号を持った関数のようなもので、プログラムでセットしなくても、 いつも該当ページ番号を持っています。直後に「頁」の固定文字が続くので、相対的な位置の 記述をしておきます。 A 3 70 PAGNBR A +0 ' 頁 ' 6行目の固定文字の項目見出しは、行とカラムによる位置と相対的位置記述を組み合わせて 記述しておきます。 7行目の仕切り線も同様です。 ヘッダー部の記述の例は次のようになります。
      FMT A* .....A*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 
        *************** データの始め ****************                          
0001.00      A*-  見出し部分  -------------------------------------------------
0002.00      A          R HDR01                     TEXT(' 見出し部 ')         
0003.00      A* 2行目                                                         
0004.00      A            PGMID         10A     2  2TEXT(' プログラム名 ')     
0005.00      A                                  2 32'<<  売上一覧表  >>'       
0006.00      A            YYMMDD         6S 0   2 69TEXT(' 日付 ')             
0007.00      A                                      EDTCDE(Y)                  
0008.00      A* 3行目                                                         
0009.00      A                                  3  2 ' 部門 '                  
0010.00      A            BUCOD          2S 0     +0TEXT(' 部門コード ')       
0011.00      A                                  3 70 PAGNBR                    
0012.00      A                                    +0 '  頁  '                  
0013.00      A* 6行目                                                         
0014.00      A                                  6  1' 売上日 '                 
0015.00      A                                  6 11' 伝 '                   
0016.00      A                                    +0' 担当 '                   
0017.00      A                                    +0' 顧客 '                   
0018.00      A                                    +0' 品目 '                   
0019.00      A                                    +1' 品名 '                   
0020.00      A                                  6 51' 数量 '                   
0021.00      A                                  6 59' 単価 '                   
0022.00      A                                  6 71' 金額 '                   
0023.00      A* 7行目                                                         
0024.00      A                                  7  1'--------------------'     
0025.00      A                                    +0'--------------------'     
0026.00      A                                    +0'--------------------'     
0027.00      A                                    +0'--------------------'     




明細部分
明細部は繰り返しの1行分だけを記述します。
レコードレベルの記述は、タイプ(17カラム目)をRとし、様式名はDTL01とします。
行位置は相対的にしか決められません。相対的位置決めパラメータSPACEB(n)を 記述します。SPACEBはpace eforeの略で印字前に指定行だけ改行します。 SPACEB(1)とすると印字前に1回改行します。記述は次のようになります。 A R DTL01 SPACEB(1) A TEXT(' 明細部 ') 売上日はYY/MM/DDのように編集する日付項目です。位置はカラム位置だけを記述します。 そのほかはヘッダー部同様です。フィールド名はURIYMDとしておきます。 伝票hネ下数値項目は同様です。カラム位置は相対的記述を使用しておきます。 品名は漢字まじりの文字列なので、1バイト、2バイト文字混合使用のデータタイプ'O'とします。 2バイト文字とは、ワープロでいえば倍角文字に相当し、2バイトで漢字一文字をあらわします。 2バイト文字の文字列は前後にシフトコードという制御文字が必要です。 例えば「漢字」という文字の場合次のようになります。
S S
0E 4F58 48F2 0F


下段は16進数表記です。
数量、単価、金額などは、いわゆるカンマ編集を行います。
このカンマ編集は編集コードで指定のパラメータを使用します。
編集コードというのは数値を読みやすくするためのカンマ編集などを行うためのコードで、
印刷ファイル、画面ファイル、および、RPGの出力仕様書の編集記述で共通です。
編集コードについてくわしくは別ページを参照して下さい。 名細部の記述は以下のようになります。
0028.00      A*-  明細部分  ---------------------------------------------------
0029.00      A          R DTL01                     SPACEB(1)                  
0030.00      A                                      TEXT(' 明細部 ')           
0031.00      A            URIYMD         6S 0      1TEXT(' 売上日 ')           
0032.00      A                                      EDTCDE(Y)                  
0033.00      A            DENNO          5S 0     +2TEXT(' 伝票 ')           
0034.00      A            TANCOD         3S 0     +2TEXT(' 担当コード ')       
0035.00      A            KYKCOD         4S 0     +2TEXT(' 顧客コード ')       
0036.00      A            HINCOD         3S 0     +2TEXT(' 品目コード ')       
0037.00      A            HINNAM        16O       +2TEXT(' 品名 ')             
0038.00      A            URISUR         4S 0     +2TEXT(' 数量 ')             
0039.00      A                                      EDTCDE(2)                  
0040.00      A            URITAN         5S 0     +2TEXT(' 単価 ')             
0041.00      A                                      EDTCDE(2)                  
0042.00      A            URIGAK         8S 0     +2TEXT(' 金額 ')             
0043.00      A                                      EDTCDE(2)      

フッター部分

フッター部分はレコード様式の記述と「部門合計」の文字と合計値の記述のみです。 フッター部の様式は2回改行後、印字するとして、次のようになります。 A R FTR01 SPACEB(2) 部門合計の固定文字はシフトコードを含めた開始位置が39桁目なので、 A 39' 部門合計 ' のようにします。実際の部門合計値はフィールド名をBUMKEIとして、66桁目から 始まるので、 A BUMKEI 8S 0 66TEXT(' 部門合計 ') A EDTCDE(2) のように記述します。 、 記述は次のようになります。
0044.00      A*-  部合計部分  -------------------------------------------------
0045.00      A          R FTR01                      SPACEB(2)                 
0046.00      A                                    39' 部門合計 '               
0047.00      A            BUMKEI         8S 0     66TEXT(' 部門合計 ')         
0048.00      A                                      EDTCDE(2)       
 

全体の印刷ファイルの記述例を紹介します。
 FMT A* .....A*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 
        *************** データの始め ****************                          
0001.00      A*-  見出し部分  -------------------------------------------------
0002.00      A          R HDR01                     TEXT(' 見出し部 ')         
0003.00      A* 2行目                                                         
0004.00      A            PGMID         10A     2  2TEXT(' プログラム名 ')     
0005.00      A                                  2 32'<<  売上一覧表  >>'       
0006.00      A            YYMMDD         6S 0   2 69TEXT(' 日付 ')             
0007.00      A                                      EDTCDE(Y)                  
0008.00      A* 3行目                                                         
0009.00      A                                  3  2 ' 部門 '                  
0010.00      A            BUCOD          2S 0     +0TEXT(' 部門コード ')       
0011.00      A                                  3 70 PAGNBR                    
0012.00      A                                    +0 '  頁  '                  
0013.00      A* 6行目                                                         
0014.00      A                                  6  1' 売上日 '                 
0015.00      A                                  6 11' 伝 '                   
0016.00      A                                    +0' 担当 '                   
0017.00      A                                    +0' 顧客 '                   
0018.00      A                                    +0' 品目 '                   
0019.00      A                                    +1' 品名 '                   
0020.00      A                                  6 51' 数量 '                   
0021.00      A                                  6 59' 単価 '                   
0022.00      A                                  6 71' 金額 '                   
0023.00      A* 7行目                                                         
0024.00      A                                  7  1'--------------------'     
0025.00      A                                    +0'--------------------'     
0026.00      A                                    +0'--------------------'     
0027.00      A                                    +0'--------------------'     
0028.00      A*-  明細部分  ---------------------------------------------------
0029.00      A          R DTL01                     SPACEB(1)                  
0030.00      A*                                                                
0031.00      A            URIYMD         6S 0      1TEXT(' 売上日 ')           
0032.00      A                                      EDTCDE(Y)                  
0033.00      A            DENNO          5S 0     +2TEXT(' 伝票 ')           
0034.00      A            TANCOD         3S 0     +2TEXT(' 担当コード ')       
0035.00      A            KYKCOD         4S 0     +2TEXT(' 顧客コード ')       
0036.00      A            HINCOD         3S 0     +2TEXT(' 品目コード ')       
0037.00      A            HINNAM        16O       +2TEXT(' 品名 ')             
0038.00      A            URISUR         4S 0     +2TEXT(' 数量 ')             
0039.00      A                                      EDTCDE(2)                  
0040.00      A            URITAN         5S 0     +2TEXT(' 単価 ')             
0041.00      A                                      EDTCDE(2)                  
0042.00      A            URIGAK         8S 0     +2TEXT(' 金額 ')             
0043.00      A                                      EDTCDE(2)                  
0044.00      A*-  部合計部分  -------------------------------------------------
0045.00      A          R FTR01                      SPACEB(2)                 
0046.00      A                                    39' 部門合計 '               
0047.00      A            BUMKEI         8S 0     66TEXT(' 部門合計 ')         
0048.00      A                                      EDTCDE(2)                  
0049.00      A*-  総合計部分  -------------------------------------------------
0050.00      A          R FTR09                      SPACEB(2)                 
0051.00      A                                    39' 全社合計 '               
0052.00      A            SOUKEI         8S 0     66TEXT(' 全社合計 ')         
0053.00      A                                      EDTCDE(2)                  
        ***************** データの終わり **************************************
 



印刷ファイルの作成

印刷ファイルは、CRTPRTFコマンドで作成するか、PDMのメンバー処理のオプション14で作成します。
PDMのメンバー処理のオプション14はメンバータイプに従ってコンパイルをするオプションで、結果的に
CRTPRTFコマンドとして働きます。

印刷ファイルは、標準で作成すると、1ページ当り66行、幅132桁、1インチ当り10文字、オーバーフロー行は
60行で作成されます。

CRTPRTFコマンドのプロンプト画面で、F10の追加のパラメータを表示させると、これらの設定を変更できます。
プロンプト画面をいかに紹介します。
                         印刷装置ファイル作成  (CRTPRTF)                  
                                                                          
  選択項目を入力して,実行キーを押してください。                          
                                                                          
  ファイル  . . . . . . . . . . . > PGM010L         名前                   
    ライブラリー  . . . . . . . . >   QTEMP         名前 , *CURLIB         
  ソース・ファイル  . . . . . . . > QDDSSRC         名前 , *NONE           
    ライブラリー  . . . . . . . . >   WRKLIB        名前 , *LIBL, *CURLIB  
  ソース・メンバー  . . . . . . .   *FILE           名前 , *FILE           


  ページ・サイズ :                                                            
    長さ --1 ページ当りの行数   .   66            .001-255.000                
    幅 --1 行当りの文字数   . . .   132           .001-378.000                
    測定方法  . . . . . . . . . .   *ROWCOL       *ROWCOL, *UOM               
  行/インチ  . . . . . . . . . .   6             6, 3, 4, 7.5, 7,5, 8, 9, 12 
  1 インチ当りの文字数  . . . . .   10            10, 5, 12, 13.3, 13,3, 15...


  オーバーフロー行番号  . . . . .   60            1-255   
        


印刷をする場合の基本ロジック

印刷の場合は、明細だけ一様に印刷するのでなく、見出しも印刷しなければならないので、
そのコーディングが必要です。

標準的なロジックを紹介しておきます。
    
1.最初の処理
  明細レコード1件を読み取りする。
  カウンターなどの初期値セット
2.繰返処理(明細レコードがある間以下を繰り返す。)
  2.1 ヘッダー部の処理
    ヘッダー部を印刷、新旧キー取替え、合計値クリアなど
  2.2 DO (集計キーが同じ間繰り返す)
      明細の処理
       明細(1件分)を印刷する。
       (印刷に先立ち改ページが必要なら改ページ)
      次の明細レコード1件を読み取りする。
      ENDDO
  2.3フッター部処理
    合計値を印刷する。
3.終了処理
  呼び出し側に戻る。
このロジックは慣れないと、少しややこしいかもしれませんが、キーブレークを何段にも深く
拡張しやすいのでおすすめです。

また、明細が1件復数行からなり、明細の途中部分で改ページしたくないというような場合は、
上記のような単純な方法では解決できません。
この場合は、印刷済行数を変数を準備し、自分でカウント、ページの終りまでに、明細を印刷する余地が
あるかどうかをチェックする必要がでてきます。
このような場合、明細の印刷の個所を、ページオーバーフローが判断できるように、賢くすると考え、
ロジックを狭い範囲に閉じ込めておくと、やさしく考えることができます。




画面ファイルへ もどる 目次へ

(C)COPYRIGHT ISHIOKA KATSUHIDE 2006