報告書作成プログラム
本章では、報告書作成プログラムの記述項目とステートメントの使用方法について説明します。
1. 報告書ファイルとRD項目
本節では、プログラムの環境部と、データ部のFILEセクションに記述できるCOBOL報告書作成プログラム要素の情報と報告書記述項目(RD項目)で使用可能な節をアルファベット順に説明します。
1.1. 報告書ファイル
COBOL報告書作成プログラムは、プログラムがGENERATE、TERMINATEステートメントを実行時に、報告書ファイルに自動で出力レコードを作成します。報告書ファイルは他の順次出力ファイルと似ています。環境部のSELECT節、ASSIGN節とデータ部のFILEセクションのFD項目が存在する必要があります。これらは手続き部のOPENステートメントとCLOSEステートメントにより処理されます。

付加的な節がありますが、一般的には「SELECT file-name ASSIGN TO assignment-name」までのみ使用されます。それ以外の付加的な節はサポートしていません。

FD項目は順次ファイルと似ています(FILE-CONTROL段落を参照)。したがって、FILE STATUS節を使用して報告書ファイルの状態を戻すことができます。その条項の順序は重要ではありません。
報告書名は最大30字で、COBOL名の一般的な規則に沿って構成されます。それぞれの報告書名は、REPORTセクションのRD項目にある名前と同じである必要があります。すべての報告書を同じファイルに作成したい場合は、「REPORTS ARE ALL」で作成すればいいですが、現在のバージョンではサポートしていません。REPORTS ARE節に2つ以上の報告書名を指定すると、同じファイルにデータを連続して、あるいは同時に作成することができます。
報告書作成プログラムは報告書ファイルにWRITEステートメントを記述する必要性をなくすため、一般的にFD項目の次にレコード記述項目(record-description-entry)を指定してはなりません。該当するSELECTにMODE節がなく、RD項目にCODE節がない場合、プログラムは報告書作成プログラムとは別に報告書ファイルに記録することができ、その場合にはFD項目に1つ以上のレベル01のレコードの説明を指定する必要があります。
FD項目の次にレコード記述項目を記述して固定長レコードを取得したい場合は、「RECORDING MODE IS F」に指定した場合でも、RECORD CONTAINS節を記述しなければなりません。RECORD CONTAINS節のintegerは、レコードのサイズと一致する必要があります。
RECORD CONTAINS節が省略されている場合、レコード長は実際に記録される最長行の長さ(4の倍数に切り上げ、キャリッジ制御文字用に1バイトを追加)に合わせます。
1.2. REPORTセクションとRD項目
各報告書の記述は、データ部の最後のセクションであるREPORTセクションに記述されています。FILEセクションが一連のFD項目で構成されているように、REPORTセクションはRD項目で構成され、その後に報告書グループの記述がレベル01項目として続きます。
それぞれの報告書記述項目(RD項目)は、指定する数の報告書グループの記述で項目が構成され、項目の順序は重要ではありません。


報告書名は一意であり、1つ以上のFD項目のREPORTセクションに指定された報告書名と一致する必要があります。報告書名が1つ以上のFD項目に宣言されている場合は、INITIATEステートメントを実行時にUPON句が必要です。各RD項目は少なくとも1つの報告書グループ記述項目(report-group-description)が必要です。
RD項目(report-description-entry)には上図のような付加的な節がありますが、現在はCONTROL節、LINE LIMIT節、PAGE LIMIT節のみサポートしています。
1.3. CONTROL節
CONTROL節は、1つ以上のキー・フィールド("control"フィールド)で値が変更されるときに生成される合計行やサブタイトルなどの追加的な行がある場合に記述します。

REPORT/FINAL、またはcontrol-id(識別子リスト)、またはその両方を記述できます。1つ以上のオペランドが記述される必要があり、オペランドの間には少なくとも1つの空白や改行を作成します。2つ以上の制御識別子がある場合、階層構造が発生します。上位の制御に対して制御切れ(値の変更)が発生すると、実際に下位の制御切れの可否に関係なく、下位階層のすべての制御に対して制御切れが発生することを意味します。制御切れが発生する場合、制御頭書きは上位の階層から下位の階層に、制御脚書きは下位階層から上位階層に出力されます。ただし、制御切れはGENERATEステートメントが実行されないと検知されません。
制御識別子に該当する制御頭書きと制御脚書きがある場合、制御識別子の新しい値を開始するたびに制御頭書き報告書グループが生成され、制御識別子の新しい値が終了するたびに制御脚書き報告書グループが生成されます。ただし、制御脚書きグループは制御切れが発生する前の制御識別子値を使用して生成されます。制御頭書きおよび制御脚書き報告書グループは、それぞれの制御識別子に対して選択的に作成されることができますが、1つの制御識別子に1つずつだけ記述できます。制御頭書き報告書グループだけ記述するか、制御脚書き報告書グループだけ記述するか、あるいはその両方を記述するか、両方とも記述しないことができます。
-
REPORT/FINAL
-
REPORTとFINALは同じ意味を持ちます。REPORT/FINALは制御識別子のリストのうち一番最初に出現する必要がありますが、省略できます。
-
REPORT/FINALは最も高い制御を示します。報告書の最初と最後に一度だけ実行する特別な作業が必要な場合に作成します。
-
-
control-id
-
制御識別子は、データ部にあるデータ項目の名前である必要があります。必要によっては、修飾子や添え字を含むことができます。しかし、PAGE-COUNTERなどの特殊レジスターは使用できません。
-
制御識別子のPICTURE記号として「V」は使用できません。同じCONTROL節で同じ制御識別子を2回以上使用することはできませんが、他のRD項目では重複して使用できます。
-
1.4. LINE LIMIT節
LINE LIMIT節は、報告書の最長行の列の最大数を示します。行の限度内でフィールドを表示できるかを確認でき、データの消失の可否を確認することができます。報告書フィールドがLINE LIMIT節に指定した値を超える場合は、コンパイル時やランタイム時にエラーが発生します。
LINE LIMIT節を省略すると、デフォルト値が設定されます。ソフトウェアによって異なりますが、一般的に240が設定されます。ただし、FD項目にBLOCK CONTAINSまたはRECORD CONTAINS integer CHARACTERS節がある場合は、その値が最大値になります。

-
integer
-
入力値は列の最大数を示します。報告書が指定の値を超えないようにします。
-
-
identifier
-
報告書の行の幅が他の値で使用される場合、数字フィールドとして定義された識別子を使用できます。
-
INITIATEステートメントを実行時に、この値を評価して使用します。この形式は、REPEATED節やWRAP節を使用する場合にのみ適用されるので、通常は使用しないでください。
-
1.5. PAGE LIMIT節
PAGE LIMIT節は、報告書をページで区切る際に使用します。ページをさらに、頭書き、本文、脚書きの領域に分けることもできます。下位節は選択事項ですが、PAGE LIMIT節なしに下位節だけ記述することはできません。下位節は任意の順序で記述できますが、ページの上部から下部に記述していくことをお勧めします。

-
PAGE LIMIT
-
PAGE LIMIT節を省略すると、報告書はページ分けされずに1つの連続した出力ストリームで構成されます。そのような場合、報告書グループ記述項目には、絶対行、NEXT GROUP句、ページ頭書き報告書グループ、ページ脚書き報告書グループ、およびキーワードPAGEを含むすべての節を含むことができません。
-
-
HEADING
-
頭書きは必須ではありませんが、報告書に相対行で始まるページ頭書きがある場合は、頭書きを基準として使用することができます。
-
頭書きを省略すると、ページの最上位の1の値が基準になります。
-
-
FIRST DE
-
ページ頭書き報告書グループがある場合、ページの本文がその下の固定した位置に表示されるようにFIRST DETAIL(FIRST DE)を記述することをお勧めします。ページ頭書き報告書グループがFIRST DEの位置を超える場合、最初の本体グループはページ頭書き報告書グループのすぐ後ろに表示されます。FIRST DEを省略すると、以下のようなデフォルト値を持ちます。
-
ページ頭書きがない場合は、HEADING値がデフォルト値になります。
-
ページ頭書きがある場合は、ページ頭書き報告書グループの直後に本文が始まります。
-
-
-
LAST DE/CH
-
LAST DETAIL(LAST DE)を使用する場合、識別子は数字フィールドで、その値はFIRST DEとLAST CONTROL FOOTING(LAST CF)の間に存在する必要があります。制御頭書きおよび明細報告書グループは、LAST DEの下に表示されることはできません。LAST DEがLAST CFより上にある場合、制御脚書き報告書グループに追加空間が発生します。
-
LAST DE/CHを省略すると、以下のようなデフォルト値を持ちます。
-
LAST CFがある場合、LAST DEは同じ値を持ちます。つまり、すべての本体グループがLAST CFの位置に下がることができます。
-
+ integer-5形式を持つLAST CFがある場合、「ページ脚書きの最初の行 - 1 - integer-5」の値が使用されます。LAST CFがない場合、LAST CFと同じデフォルト値が使用されます。
-
-
-
LAST CF (FOOTING)
-
ページ脚書きが始まる前に少しの空間を置きたい場合は、LAST CFまたはFOOTINGを記述します。
-
LAST CFを省略すると、以下のようなデフォルト値を持ちます。
-
ページ脚書きがない場合、PAGE LIMIT値が使用されます。つまり、すべての制御脚書き報告書グループがページの最後に下がることができます。
-
ページ脚書きがある場合、ページ脚書きの前の最後の行になります。
-
-
2. 報告書記述項目
本節では、REPORTセクションの報告書記述項目(RD項目)について説明します。
報告書グループは、0から指定した数までの中断のない報告書の行ブロックを意味します。報告書グループの行は常に同じページにあり、単一の作業によって生成されます。7つのタイプのうち、明細報告書グループを除くすべてのグループは自動で生成されます。プログラムはそれぞれの明細報告書グループ(または報告書全体)に対して1つ以上のGENERATEステートメントを実行し、他のグループは明細報告書グループの位置に応じて正しい位置に自動で生成されます。
RD項目に報告書グループ記述項目を記述できますが、DETAIL以外の各タイプの数には制限があります。それぞれの報告書グループ記述項目は、Aマージンのレベル01から始まります。
2.1. 報告書グループ記述項目
報告書グループ記述項目(Report Group Description)は、レベル01で始まる、下位項目を含むREPORTセクションのデータ構造です。レベル01の報告書グループ項目でのみ構成することができます。RD項目の次に任意の数の報告書グループ記述項目を作成することができます。



各節の説明はアルファベット順に記述されています。 |
-
level-number
-
データ部と同様に、レベル番号は要素レベルより高いグループ・レベルの階層を設定するために使用されます。各報告書グループの先頭にあるレベル番号は、レベル01である必要があります。
-
-
data-name
-
以下の場合以外は、報告書グループ項目にデータ名を配置する必要がありません。
-
明細報告書グループのレベル01項目、または宣言セクションのUSE BEFORE REPORTING文で参照できる他のグループの場合
データ名をレベル01で使用すると、全体報告書グループの名前として指定されます。これが、report-group-nameまたはgroup-nameです。group-nameはRD項目内で一意である必要があります。
-
SUM節または用語で参照される数字項目の場合
-
COUNT節または用語で参照されるすべてのレベルの項目の場合
-
-
-
一般的なデータ部節
-
以下のような一般的なデータ部の節を報告書グループに使用できます。
最初の4つは、グループおよび要素レベルですべて使用できます。PICTURE節とVALUE節は、要素レベルでのみ使用できます。
-
BLANK WHEN ZERO
-
JUST/JUSTIFIED
-
OCCURS
-
SIGN
-
PIC/PICTURE
-
VALUE/VALUES
-
-
以下の節は報告書グループでは使用できません。
-
USAGE DISPLAY以外のすべてのUSAGE
-
REDEFINES
-
SYNC/SYNCHRONIZED
-
RENAMES
-
レベル88の項目
-
-
-
特殊な目的の節
-
一般的なデータ部節だけでなく、フィールドの位置と内容を示す特殊な目的を持つ節を含むことができます。
最初の4つのTYPE、NEXT GROUP、GROUP LIMIT、REPEATEDはレベル01でのみ使用できます。そして、PICTURE、COLUMN、SOURCE、VALUE、SUM、COUNT、FUNCTIONは要素レベルでのみ使用できます。
区分 説明 TYPE
グループのタイプを示します。
NEXT GROUP
グループの間に追加空間を作成します。
GROUP LIMIT
グループに対して制限を設定します。
REPEATED
グループを繰り返し配置します。
LINE
垂直位置を指定します。
MULTIPLE PAGE
報告書グループを複数のページにわたって配置します。
COLUMN
水平位置を指定します。
SOURCE
名前でデータ・フィールドを占有するために使用します。
SUM
合計を作成します。
COUNT
回数を作成します。
FUNCTION
特殊形式を指定するルーチンを呼び出します。
WRAP
新規行でデータを継続して使用できるようにします。
VARYING
繰り返し項目のカウンターを指定します。
STYLE
特殊なプリンター効果を作成します。
PRESENT/ABSENT
WHEN/AFTER
PRESENT/ABSENTは項目、行、グループの出力を制御します。
GROUP INDICATE
PRESENT AFTERの古い形式です。
-
-
LINE節、COLUMN節
-
COLUMN節があるすべての項目の同レベルまたは上位レベルにはLINE節が存在する必要があります。
-
特定の報告書行に1つの要素フィールドのみ含まれている場合(ただし、この項目が多重選択項目でない場合)、LINE節とCOLUMN節を同じ項目として結合することができます。
03 LINE 5 COL 60 VALUE "REPORT".
-
報告書行に含められる要素フィールドの数に制限はありません。報告書行に複数の要素フィールドが含まれている場合、行内のすべてのCOLUMN節はLINE節より低いレベルで作成する必要があります。
03 LINE 5. 05 COL 60 VALUE "REPORT". 05 COL 90 VALUE "TEST".
-
一部またはすべての要素項目が非LINEグループ項目に含まれていることがあるので、LINE節内のすべてのCOLUMN節が同じレベルである必要はありません。
03 LINE 5. 05 COL 60 VALUE "REPORT". 05 PRESENT WHEN DATA01 NOT = SPACES. 07 COL 90 VALUE "TEST".
-
-
LINE節は他のLINE節に従属しません。
-
特定の報告書グループに複数の行が含まれている場合、そのグループのすべてのLINE節に01以外のレベル番号を指定する必要があります。グループが単一報告書行を含む場合にのみレベル01にLINE節を作成できます。
-
-
SOURCE節、VALUE節、SUM節、COUNT節
-
SOURCE節、VALUE節、SUM節、COUNT節のいずれか1つを選択して自動で要素項目の内容を提供することができます。詳細については、各節の説明を参照してください。
-
要素項目にSOURCE節、VALUE節、SUM節、COUNT節がない場合、次の条件を満たす必要があります。
-
項目にデータ名が必要です。
-
項目にCOLUMN節が必要です。
-
COLUMN節が相対的である場合、項目に固定した垂直位置が必要です。
-
-
LINE節は他のLINE節に従属しません。
-
特定の報告書グループに複数の行が含まれている場合、そのグループのすべてのLINE項目に01以外のレベル番号を指定する必要があります。グループが単一報告書行を含む場合にのみレベル01にLINE節を作成できます。
-
SOURCE節、VALUE節の各オペランドがWHEN条件のすぐ後に続く多重選択項目の場合以外は、あらゆる順序で報告書グループの節を作成できます。
-
2.2. BLANK WHEN ZERO節
BLANK WHEN ZERO節は数字フィールドが0の場合に空白に変換します。

-
BLANK WHEN ZERO
-
要素項目にBLANK WHEN ZERO節を作成する場合、項目には数字項目のPICTURE文字列が存在する必要があります。
-
グループ・レベル項目に作成する場合は、グループ内のすべての数字要素項目に適用されます。
-
2.3. COLUMN節
COLUMN節は、報告書行でフィールドの水平位置を指定します。

コーディング・ルール
以下は、COLUMN節のコーディング・ルールについての説明です。
-
オペランドのないCOLUMNは、「COLUMN + 1」の省略形です。
-
COLUMN節があるすべての項目は、同レベルまたは上位レベルにLINE節が存在する必要があります。
-
LINE 5内に他の項目がない場合、以下のように作成できます。
03 LINE 5 COL 60 VALUE "REPORT".
-
行に2つ以上のフィールドがある場合、以下のように新しいレベルを作成する必要があります。
03 LINE 5. 05 COL 60 VALUE "REPORT". 05 COL 90 VALUE "TEST".
-
-
COLUMN節は項目で唯一の条項として使用できます。その結果、空白フィールドは現在の水平位置を右に移動する用途でのみ使用されます。空白フィールドはCOLUMNの一般的な間隔以外に1つの列の幅を占めます。したがって、COLUMN節と一緒に単一の空間で構成されたVALUEを作成するのと同じです。たとえば、単独で作成されたCOL +4は、現在の水平位置を4列右に変更します。
-
項目のサイズは、PICTURE節またはVALUE "Literal"のサイズで計算され、2つの項目がすべてCOLUMN節と一緒に使用される場合は、行の幅を越えたり重なったりしないか確認します。
オペレーション
以下は、COLUMN節のオペレーション方法についての説明です。
-
COLUMN節では、要素フィールドを水平に配置します。
以下は、オプションの一覧です。
-
COLUMN + integer-1.
相対的な形式で、行内の前のフィールドの最後の文字から、このフィールドの最初の文字の integer-1列の位置に移動することを示します。フィールド前の差は、integer-1の値より小さいことに注意してください。たとえば、以下のとおりです。
COLUMN + 1 = "差がない" COLUMN + 2 = "フィールドの前に1つの空間がある"
行の最初のフィールドにCOLUMN + integer-1を使用する場合、水平位置の初期値が0なので、絶対形式のCOLUMN integer-1を作成したものとみなされます。
-
COLUMN integer-2.
絶対的な形式で、フィールドの左の列が行内の該当する固定位置に表示されなければならないことを示します。行の最初の列はCOLUMN 1です。
-
-
要素項目にCOLUMN節がない場合、データ名がある場合は、当該項目は報告書に表示されません。印刷不可能な項目です。
2.4. COUNT節
COUNT節は、指定した報告書フィールドまたはグループ項目を表示する回数をカウントします。

コーディング・ルール
以下は、COUNT節のコーディング・ルールについての説明です。
-
それぞれのデータ名はRD項目を除くすべてのREPORTセクション項目の名前である必要があります。COUNT節を含むグループ項目のデータ名であることもあります。
-
COUNT節はカウントされる当該項目が含まれた同じ報告書グループや他の報告書グループに配置できます。
-
SUM節と違って、カウントされた項目が数字フィールドである必要はありません。
-
SUM節と同様に、以下のような方法で使用できます。それ自体で1つの節であり、SOURCE節、VALUE節の代わりにSUM節を作成できます。
03 LINE 5 COL 60 PIC ZZZ9 COUNT OF R-DATA-NAME.
オペレーション
以下は、COUNT節のオペレーション方法についての説明です。
-
COUNT節には、参照された項目が表示された回数が示されます。つまり、報告書に該当する項目が表示されるたびに1ずつカウントが増えます。REPORTセクションの外部項目はカウントできません。
参照される項目は、以下のレベルに存在することができます。
レベル 説明 レベル01項目
特定のグループの表示回数
LINE項目
特定の行の表示回数
COLUMN項目
特定の要素項目の表示回数
-
RESET文を使用しないと仮定すると、COUNTフィールドが出力されたときにcountは0に戻ります。したがって、最後にカウントが出力された後、常に項目の表示回数を取得することができます。RESET文を使用すると、上位レベルの制御切れが発生するまで、countの再設定を0に遅延させることができます。しかし、現在のバージョンでは、COUNT節のRESET文はサポートしていません。
2.5. LINE節
LINE節は、ページに行を垂直に配置します。

コーディング・ルール
以下は、LINE節のコーディング・ルールについての説明です。
-
以下は、選択可能な形式の一覧です。
-
LINE + integer-1.
相対的な形式で、「+」の代わりに「PLUS」を使用できます。行が前の位置から integer-1行前進することを示します。「LINE + 0」または「LINE + ZERO」が許容されます。これは、行の前進が行われないことを示します。その結果、行が前の行に重なって印刷されます。
-
LINE integer-2.
絶対的な形式で、行がページの固定した位置に表示されます。許容される一番高い行番号は、PAGE LIMITオペランドで指定します。この絶対形式はRD項目にPAGE LIMIT節がある場合にのみ許容されます。
-
LINE integer-2 ON NEXT PAGE.
LINE integer-2形式と似ていますが、ON NEXT PAGE句は、行が出力される前にページの移動が強制的に発生します。この項目が含まれたグループが現行ページに適切であるか否かに関係なく発生します。
-
LINE ON NEXT PAGE.
次のページまたは頭書きの位置でFIRST DETAIL位置に行を出力します。
-
LINES ARE integer-1 integer-2 ... または LINES + integer-1, + integer-2 ...
複数行をコーディングできます。詳細については、Multiple LINES節を参照してください。最後にON NEXT PAGE句を使用できますが、この句はすべての行に適用されるのではなく、最初のinteger-1行にのみ適用されます。
-
-
各グループの最初のLINE節はグループ全体が相対的か絶対的かを決定します。
最初のLINE節が相対的であれば、グループは相対的なグループであり、他のすべてのLINE節が相対的なグループである必要があります。最初のLINE節が絶対的であれば、グループは絶対的なグループであり、他のLINE節は絶対的または相対的であることができます。
たとえば、グループ内の次の2つのLINE節は同じです。
01 TYPE PH. 03 LINE 1. ... 03 LINE 2. ... 03 LINE 4. ...
01 TYPE PH. 03 LINE 1. ... 03 LINE +1. ... 03 LINE +2. ...
相対的な行を使用すると、最初の行番号だけを変更して全体グループの位置を調整できるメリットがあります。
-
グループにON NEXT PAGE句が使用された場合以外は、絶対的なLINE節がある場合、integer値は順次に増加する必要があります。
-
LINE節にはCOLUMN項目が含まれなくても構いません。その結果は、データが含まれていない空の行が生成されます。たとえば、以下のような場合、データはLINE2にのみ生成されますが、ページ頭書きはLINE2-4にわたって生成されます。
01 TYPE PH. 03 LINE 2 VALUE "--PAGE HEADING--" 03 LINE 4.
--PAGE HEADING--
-
LINE節は他のLINE節に従属しません。
オペレーション
以下は、LINE節のオペレーション方法についての説明です。絶対グループであれば、最初のLINE節はグループの開始位置を示します。
-
相対的な本体グループ(CH、DE、CF)の位置
-
グループがページの最初の本体グループである場合、グループの最初の行はLINE節のintegerと関係なく、FIRST DETAILの位置にあります。RD項目にFIRST DEの下位節を記述していない場合、最初の行はページ頭書き報告書グループがある場合はページ頭書きの次の行に表示され、ページ頭書き報告書グループがない場合は頭書きの位置に表示されます。グループの次の行は、相互相対的に配置されます。
-
グループがページの最初の本体グループでない場合、グループの最初の行はLINE-COUNTERを基準に配置され、一般的に先行する本体グループの最後の行の位置が含まれます。しかし、NEXT GROUP節またはLINE-COUNTERの値を変更すると、位置に影響を及ぼすことがあります。
-
-
本体グループ(CH、DE、CF)のpage-fitテスト
報告書にPAGE LIMIT節がある場合、報告書作成プログラムは本体グループを出力する前にpage-fitテストを行います。このテストは、グループのすべての行が本体グループのタイプに設定したページ領域に入らない限り、グループの行が出力されないようにするために行います。
page-fitテストのタイプは、グループが絶対的か相対的かによって異なります。いずれの場合も、LINE-COUNTERには一般的にこのグループが生成される前に最後に作成された行の位置である現在の垂直位置が含まれています。
-
本体グループの絶対的なpage-fitテスト
最初の行が絶対的である場合、報告書作成プログラムは最初の行番号をグループの開始位置として使用します。LINE-COUNTERがグループの開始位置にある行に該当する場合、報告書作成プログラムは新しいページにスキップします。他のすべての場合にページの移動が発生し、グループが新しいページの指定の行に出力されます。
-
本体グループの相対的なpage-fitテスト
グループのすべてのLINE節が相対的である場合、報告書作成プログラムはLINE + 節のすべての整数の合計を計算します。この値はグループの全体サイズを示します。LINE-COUNTERとこのグループの全体サイズを足した値は、現行ページで生成された場合にグループが表示される最後の行です。この最後の行の位置がグループの許容された範囲を超えた場合は、グループがページに合わず、ページの移動が発生します。
グループの許容された範囲は以下のとおりです。
-
明細または制御頭書き報告書グループの場合、RD項目のLAST DETAIL
-
制御脚書き報告書グループの場合、RD項目のLAST CONTROL FOOTING
報告書作成プログラムはPAGE LIMIT節で説明したようにその下位節のデフォルト値を仮定するので、LAST DEとLAST CFの下位節はRD項目に指定する必要がありません。
-
-
-
相対的な非本体グループ(RH、PH、PF、RF)の位置
グループ 説明 RH, PH
HEADING - 1に相対的
PF
LAST CONTROL FOOTINGに相対的
RF
HEADING - 1に相対的
-
ページ移動の処理
報告書作成プログラムはページ移動を実行時に、以下の操作を行います。
-
ページ脚書きが定義されている場合、ページ脚書きを出力します。
-
PAGE-COUNTERは1ずつ増加させます。
-
次のページの先頭に移動します。LINE-COUNTERは0に設定します。
-
ページ頭書きが定義されている場合、ページ頭書きを出力します。
-
2.5.1. Multiple LINES節
LINE節に複数のinteger または + integerを作成すると、似たようなレイアウトを持つ行グループを定義する時間を節約できます。ただし、以下の事項に注意します。
-
行が発生するたびに、VALUE節、SOURCE節が繰り返されます。Multiple LINES節が発生するたびに、Multiple VALUE節、Multiple SOURCE節を使用して報告書フィールドに別の値を配置できます。
-
以下は、Multiple LINES節の例です。下の2つのグループは出力結果が同じです。
01 TYPE PH. 03 LINES 1 2. 05 COL 1 VALUES "REPORT" "YEAR". 05 COL 11 VALUES "TEST" "MONTH". 05 COL 21 VALUES " " "DAY".
01 TYPE PH. 03 LINES 1. 05 COL 1 VALUES "REPORT". 05 COL 11 VALUES "TEST". 05 COL 21 VALUES " ". 03 LINES 2. 05 COL 1 VALUES "YEAR". 05 COL 11 VALUES "MONTH". 05 COL 21 VALUES "DAY".
VALUE節の値を指定しない場合でも、行数と同数のVALUE節の値を空白リテラルで指定してください。
2.6. LINE-COUNTER
LINE-COUNTERは、データが生成された最新の報告書の行番号を含む内部の特殊レジスターです。

-
LINE-COUNTERはページの現在の垂直位置を提供します。INITIATEステートメントの実行時とページの移動時に0に設定されます。
-
手続き部でLINE-COUNTERの値を変更できますが、LINE-COUNTERの値を下げないようにします。
03 COL 100 PIC ZZZ9 SOURCE IS LINE-COUNTER.
-
REPORTセクションに複数の報告書記述項目がある場合、それぞれ固有のLINE-COUNTERがあります。そのため、報告書名を限定子として使用して、どの報告書のLINE-COUNTERであるかを作成する必要があります。
03 COL 100 PIC ZZZ9 SOURCE IS LINE-COUNTER OF REPORT-01.
2.7. NEXT GROUP節
NEXT GROUP節は、空行を追加する際に、ページに余裕がない場合にページ漏れが発生しないように、グループの後ろに追加の垂直空間を作成します。

コーディング・ルール
以下は、NEXT GROUP節のコーディング・ルールについての説明です。
-
NEXT GROUP節は、レベル01でのみ作成できます。
-
すべての本体グループ(CH、DE、CF)でこの節を使用することができます。ページ頭書きがある場合、報告書頭書きで使用することができ、報告書脚書きがある場合、ページ脚書きで使用することができます。
-
PAGE LIMIT節がない場合、+ integer-1形式のみ使用できます。
-
NEXT BODY GROUPは明細報告書または制御頭書き報告書グループにのみ使用でき、NEXT DE OR CH GROUPは制御脚書き報告書グループにのみ使用できます。
-
DE OR CHは、DETAIL OR CONTROL HEADING、CH OR DE、またはCONTROL HEADING OR DETAILと記述することもできます。
2.7.1. NEXT GROUP節の本体グループへの影響
-
特定の制約条件に従って、NEXT GROUP節は本体グループのすべての行が生成された後、報告書作成プログラムがLINE-COUNTER値を増加させて、次の本体グループが新しいページに表示されたり、追加の垂直間隔が発生するようにします。
-
NEXT GROUP + integer-1を作成すると、報告書作成プログラムはLINE-COUNTERにinteger-1を足しますが、LAST CONTROL FOOTING値を最大リミットとして使用します。
-
NEXT GROUP integer-2形式は指定の行番号に次の本体グループを強制的に作成できます。報告書作成プログラムはまずLINE-COUNTERをチェックします。この値がinteger-2より小さい場合は(その位置にまだ到達していない場合)、LINE-COUNTERはinteger-2に設定されます。
そうでない場合は、報告書作成プログラムはLINE-COUNTERをLAST CONTROL FOOTINGと同様に設定して、本体グループがページに表示されないようにし、次のグループの位置整数値にinteger-2の値を保存します。次の本体グループが生成される前に、報告書作成プログラムは保存された整数と同じLINE-COUNTERを設定します。次の本体グループが常に相対グループでないこの形式の条項を使用することは望ましくありません。
-
NEXT GROUP NEXT PAGEを作成すると、報告書作成プログラムは LINE-COUNTERをLAST CONTROL FOOTING値で設定します。この場合、報告書作成プログラムはページの残りを空白として残し、次のページで次の本体グループを開始します。
-
制御脚書き報告書グループにNEXT GROUP節を作成した場合、報告書作成プログラムは処理中のこの節を適用する前に、処理中の制御切れのレベルを確認します。制御切れのレベルがこのグループのレベルより高い場合は、NEXT GROUP節は無視されます。つまり、制御脚書きのNEXT GROUP節は次の制御脚書きの位置に影響を及ぼしません。
たとえば、以下のようにCONTROL FOOTING FOR REPORTは前のレベルの制御脚書きにNEXT DE OR CH GROUP NEXT PAGE節があれば、新しいページに強制的に移動されません。
01 CF FOR STATE NEXT DE OR CH GROUP NEXT PAGE. .... 01 CF FOR REPORT. 03 LINES + 2. ....
この場合、CONTROL FOOTING FOR REPORTを新しいページに表示するには、最初のLINE節にON NEXT PAGEを記述します。
-
以下のように、NEXT GROUP節のみ含むダミー報告書グループを記述できます。グループが処理されるときに出力は発生しませんが、NEXT GROUP NEXT PAGE節によってLINE-COUNTERはLAST CONTROL FOOTINGと同様に設定されます。
01 CF FOR STATE NEXT GROUP NEXT PAGE.
LINE-COUNTERを直接変更する代わりにいつでも一定の間隔を確保するには、以下のように記述できます。そして、手続き部でGENERATE LINE-GAPを作成します。
01 LINE-GAP DE NEXT GROUP + 3.
2.7.2. NEXT GROUP節の非本体グループへの影響
-
報告書頭書き報告書グループにNEXT GROUP節を作成できます。
この場合、影響を受けるグループは報告書頭書きのすぐ後ろにくる最初のページ頭書き報告書グループになります。NEXT GROUP NEXT PAGEは、報告書頭書きがページ頭書き上の最初のページではなく別途のページがあることを示します。しかし、報告書頭書きが最初のページ頭書きの行上になくても同様です。
-
ページ脚書き報告書グループにNEXT GROUP節を作成できます。
この場合、影響を受けるグループは報告書脚書きです。報告書脚書きで使用される最初のLINE節がこのケースを処理するためのもっといい方法なので、この形式は必要ありません。
2.8. OCCURS節
OCCURS節は、水平レベルのフィールドまたはグループ、垂直レベルの行またはグループに対して規則的な繰り返しを表示します。本バージョンでは、行の繰り返しを表示する機能のみをサポートしています。

コーディング・ルール
以下は、OCCURS節のコーディング・ルールについての説明です。
-
OCCURS節は、レベル01で作成することはできません。4つのレベルで使用できますが、以下の場合のみサポートしています。
-
行レベルで使用できます。行はオペランドが指定した回数を垂直に繰り替えされます。
03 LINES OCCURS 3. 05 COL + 2 "HELLO".
繰り返しの結果は以下のとおりです。
HELLO HELLO HELLO
-
-
繰り返し回数が可変的な場合、DEPENDING ON句を使用できますが、この機能はサポートしていません。DEPENDING ON句を使用する場合にのみ、integer-1 TOが一緒に使用されます。
-
繰り返しの開始位置間の距離を指定するには、STEP/ WIDTH/ DEPTH句を使用できますが、これらの機能はサポートしていません。
オペレーション
以下は、OCCURS節のオペレーション方法についての説明です。
-
報告書グループ内で垂直に自動繰り返しを取得しようとする場合、OCCURS節を使用することで個別的にコーディングしたような効果が得られます。
-
PRESENT WHEN節がOCCURS節と同じ項目にコーディングされた場合、PRESENT WHEN節はそれぞれのオカレンスに対して個別的に適用されます。
01 TYPE DE. 03 LINE OCCURS 12 VARYING R-MONTH PRESENT WHEN PROFIT (R-MONTH) > 0. 05 COL 1 PIC X(9) SOURCE NAME-MONTH (R-MONTH). 05 COL 12 PIC $(6)9 SOURCE PROFIT-MONTH (R-MONTH).
結果は、以下のようになります。
JANUARY $1000 FEBRUARY $2000 MARCH $3000 ...
2.9. PAGE-COUNTER
PAGE-COUNTERは、現在のページ番号を含む特殊レジスターです。

-
INITIATEステートメントにより1に設定され、報告書にPAGE LIMIT節がある場合、初期ページ以降、各ページの移動が1ずつ増加します。ページ脚書きとページ頭書きの作成間に増加現象が発生します。TERMINATEステートメントはPAGE-COUNTERを変更しません。
-
PAGE-COUNTERをSOURCE節の数字で処理できます。
たとえば、ページ番号を印刷するために以下のように作成することができます。
03 COL 100 PIC ZZZ9 SOURCE IS PAGE-COUNTER.
-
プログラムに2つ以上の報告書がある場合、報告書名を限定子として使用してどの報告書のPAGE-COUNTERであるかを作成する必要があります。
03 COL 100 PIC ZZZ9 SOURCE IS PAGE-COUNTER OF REPORT-01.
2.10. PICTURE節
PICTURE節は、基本COBOLと同様に、各報告書フィールドのサイズと形式を設定します。

コーディング・ルール
以下は、PICTURE節のコーディング・ルールについての説明です。
-
使用可能なすべてのPICTURE記号はDISPLAYフィールドと一致し、このような記号の結合規則が基本COBOLと同じである場合、CURRENCY SIGN節で定義された通貨記号を含めて使用することができます。PICTURE記号については、COBOLのPICTURE節を参照してください。
-
VALUE節のある項目ではPICTURE節を省略できます。ALL "literal"またはQUOTEなどの表意定数が使用される場合には、PICTURE節が必要です。
-
SOURCE節、SUM/COUNT節を使用する場合、保存されている同じ形式で表示しようとする場合も、PICTURE節が必要です。
2.11. PRESENT/ABSENT AFTER節
PRESENT/ABSENT AFTER節は、一般的なCOBOL条件を評価するよりは、報告書作成プログラムの自動制御切れとページ移動の処理中に内部で発生する条件をテストするということを除いては、PRESENT/ABSENT WHEN節と似ています。



コーディング・ルール
以下は、PRESENT/ABSENT AFTER節のコーディング・ルールについての説明です。
-
キーワードPAGEを指定する場合、RD項目にPAGE LIMIT節が必要です。制御識別子を指定する場合、REPORTまたはFINALが常にCONTROL節にあると仮定することを除いて、RD項目のCONTROL節に記述された制御のうち1つである必要があります。
-
グループまたは要素レベルでこの節を記述することができ、節はネストされることができます。
-
すべての本体グループ(DE、CH、CF)で形式を使用できますが、制御頭書きまたは制御脚書き報告書グループでcontol-idオプションを使用する場合、参照する制御レベルはPRESENT AFTER節の制御レベルより高い必要があります。
-
ページ頭書きまたはページ脚書き報告書グループでA形式を使用できますが、control-idオプションがある場合にのみ使用できます。
-
B形式は本体グループでのみ使用できます。
-
C形式は以下の例と同様に動作します。
PRESENT AFTER NEW PAGE OR lowest-control-id
報告書にPAGE LIMIT節がある場合はページがあり、CONTROLS節がある場合は制御識別子があります。
-
SUM節でPRESENT/ABSENT AFTER節またはGROUP INDICATE節の項目を参照しないようにします。
オペレーション
以下は、PRESENT/ABSENT AFTER節のオペレーション方法についての説明です。
-
PRESENTの代わりにABSENTを使用すると、逆の効果が得られます。
-
PRESENT AFTER節は、報告書自体内で条件が設定されるということを除いては、PRESENT WHEN節と似た方式で動作します。
-
PRESENT AFTER NEW control-id
PRESENT WHEN節が、グループがまだ出力されていないか、最後の出力以降当該レベルまたは上位レベルで制御切れが発生
-
PRESENT AFTER NEW PAGE
PRESENT WHEN節が、グループがまだ出力されていないか、最後の出力以降ページの移動が発生
-
-
PRESENT AFTER NEW control-id
報告書作成プログラムは報告書の開始以降、または制御識別子以上のレベルで、最後の制御切れ以降この報告書グループが初めて出力された場合、フィールドを出力します。たとえば、PRESENT AFTER NEW YEAR-NOを作成する場合、報告書フィールドはYEAR-NOやYEAR-NOより高い制御レベルが変更されるたびに、報告書の開始時とGENERATEを最初に実行時に生成されます。そうでない場合は、PRESENT WHEN節と同じ方法で下位項目と一緒に無視されます。
以下の例では、フィールドYEAR-NOは最初と変更されるたびに出力され、SEASON-NOは最初に出力され、SEASON-NOやYEAR-NOが変更されるたびに出力されます。
RD ... CONTROLS ARE YEAR-NO, SEASON-NO. ... 01 NEW-MEM TYPE DE LINE + 1. 05 COL 2 PIC 9(4) SOURCE YEAR-NO PRESENT AFTER NEW YEAR-NO. 05 COL 7 PIC X(6) SOURCE SEASON-NO PRESENT AFTER NEW SEASON-NO. 05 COL 15 PIC X(20) SOURCE MEM-NAME.
YEAR SEASON NAME 2017 SPRING JOHN ANDREW SUMMER JANE 2018 SUMMER PETER ...
-
PRESENT AFTER NEW PAGE
報告書作成プログラムは、報告書の開始以降、または最後のページに移動後、このグループが初めて生成された場合に該当するフィールドを出力します。そうでない場合は、フィールドは出力されません。
-
PRESENT AFTER PAGE OR control-id
いずれか1つの条件、あるいはすべての条件を満たす場合にフィールドが出力されます。たとえば、上記例でYEAR-NOおよびSEASON-NOフィールドを、変更事項がなくても新しいページを開始するたびに再出力することができます。
01 NEW-MEM TYPE DE LINE + 1. 05 COL 2 PIC 9(4) SOURCE YEAR-NO PRESENT AFTER NEW YEAR-NO OR PAGE. 05 COL 7 PIC X(6) SOURCE SEASON-NO PRESENT AFTER NEW SEASON-NO OR PAGE. 05 COL 15 PIC X(20) SOURCE MEM-NAME.
-
PRESENT AFTER NEW REPORT
最初に一度だけ作成したいフィールドや行がある場合に使用します。(REPORTまたはFINALは最高制御レベルであり、CONTROL節になくても常にあると仮定します)
-
GROUP INDICATE
GROUP INDICATE節は、1つの項目のみ出力するようにします。
2.12. PRESENT/ABSENT WHEN節
PRESENT/ABSENT WHEN節は、すべての報告書項目に一般的なCOBOL条件を適用します。報告書作成プログラムは条件を評価して、項目を正常に出力するかスキップするかを決定します。


コーディング・ルール
以下は、PRESENT/ABSENT WHEN節のコーディング・ルールについての説明です。
-
PRESENTの代わりにABSENTを使用すると、逆の効果が得られます。つまり、ABSENTは、PRESENT WHEN NOTと同じです。
-
conditionは、有効なCOBOL条件式です。詳細については、COBOLの条件式を参照してください。
-
CONTROL IS control-id形式は、現在のグループが複数の制御脚書きの場合にのみ許容します。つまり、2つ以上のcontrol-idオペランドがあるCONTROL FOOTING節またはCONTROL FOOTING FOR ALL節の場合に使用できます。
-
以下のような場合、PRESENTは省略して使用できます。
... 05 COL 10 PIC X(10) VALUE "OVER LIMIT" PRESENT WHEN AMT > 100. 05 COL 20 VALUE "BLACK" WHEN AMT = 1 VALUE "WHITE" WHEN AMT = 2 VALUE "RED" WHEN OHTER.
-
PRESENT UNLESS節は、ABSENT WHEN節と同じです。
2.12.1. 多重選択形式

-
特定の要素フィールドに一連の代替内容を指定する必要がある場合は、PRESENT WHEN節が含まれた複数の個別項目の代わりに、単一の項目として指定できます。複数のSOURCE節、VALUE節で項目を記述した後、PRESENT WHEN節が直後に出現します。PRESENT WHEN OTHER形式は必要な場合、一度だけ作成されることができ、最後に配置されます。
-
報告書作成プログラムはコードの順に最初の条件から始めて、実際の条件を探すまでwhen条件を検索します。その後、当該PRESENT WHEN節の前にあるSOURCE節、VALUE節を使用し、残りのすべてのPRESENT WHEN節、SOURCE節、およびVALUE節を無視します。
-
PICTURE節なしにVALUEリテラル節だけ指定する場合、条件によって生成されるサイズが異なることがあります。実際に生成されるフィールドのサイズは選択した値のサイズになります。
-
LINE節と同じレベルに多重選択項目を配置することはできません。
01 NEW-MEM TYPE DE. 03 LINE 1 COL 1 VALUE "BLACK" WHEN SHADE = 1 "WHITE" WHEN SHADE = 0.
したがって、以下のように作成します。
01 NEW-MEM TYPE DE. 03 LINE 1. 05 COL 1 VALUE "BLACK" WHEN SHADE = 1 "WHITE" WHEN SHADE = 0.
2.13. SOURCE節
SOURCE節では、報告書のフィールド内容を提供するsourceフィールドを設定します。sourceフィールドは一般的にREPORTセクションの外部にありますが、REPORTセクション内に定義することもできます。

コーディング・ルール
以下は、SOURCE節のコーディング・ルールについての説明です。
-
有効なCOBOL識別子または算術式を使用できます。
-
必要な場合、以下のように各オペランドに修飾子や添え字を付けることができます。
05 COL 10 PIC 999V99 SOURCE IS DATA01 IN DATA-RECORD (A-NO, B-NO)
オペランドは、MOVEステートメントで一般的に許容される修飾子、添え字、指標を持つことができます。相対的な添え字付けと参照変更が使用できます。
-
また、PICTUREがないVALUEと異なって、同じ項目でPICTURE節を記述する必要があります。PICTUREはPICTUREオペランドと互換される必要があります。2つのPICTUREの長さは異なることができ、この場合、文字埋めや切り捨て操作が発生することがあります。SOURCE節の規則はMOVEステートメントまたはCOMPUTEステートメントの規則と同じです。
-
SOURCE ISキーワードとSOURCES AREキーワードはVARYING節のすぐ後ろに使用される場合以外は省略できます。しかし、明確にするためにはSOURCEキーワードを作成する必要があります。
-
算術式を使用できます。
05 COL 10 PIC 999V99 SOURCE IS DATA01 * DATA02 / 100
式を構成する規則は、COBOL手続き部の算術式の説明を参照します。しかし、式を使用することは推奨しません。
-
SOURCE識別子より小数点右の桁数が小さい数字のPICTUREを使用する場合、ROUNDED句を同じ項目に使用できます。こうすると、常に必要ない数字を切り捨てる代わりに、生成される値が2つの値の数値に近くなります。
05 COL 10 PIC 999V99 SOURCE DATA01 ROUNDED
DATA01が100.50または100.99の値を含む場合、生成される値は100ではなく101になります。ROUNDEDキーワードについての詳細は、COMPUTEステートメントを参照してください。
-
SOURCE節にWHENまたはUNLESSの条件を追加した後、同じ項目にあるSOURCE節およびWHEN/UNLESS節を追加作成して多重選択項目を示すことができます。
オペレーション
以下は、SOURCE節のオペレーション方法についての説明です。
-
報告書フィールドの作成規則
SOURCE節は、COBOLのMOVEステートメントやCOMPUTEステートメントと同じ規則を持つので、これらのステートメントを参照して説明できます。
SOURCE節の形式 同じステートメント identifier
MOVE identifier TO report-filed
identifier ROUNDED
ADD ZERO, identifier GIVING report-field ROUNDED
arithmetic-expression
COMPUTE report-filed = arithmetic-expression
arithmetic-expression ROUNDED
COMPUTE report-filed ROUNDED = arithmetic-expression
CURRENT-DATEおよびTIME-OF-DAYは、概念的なデータ項目のDATEおよびTIMEを使用します。
-
制御の参照
SOURCE節が直接または間接的にCONTROLオペランドを参照して制御脚書きを出力する際にソースを取得する場合、制御切れ前の制御識別子の内容が使用されます。つまり、以下の報告書グループで制御フィールドに対する制御切れ前の内容を取得できます。
-
すべての制御脚書き報告書グループ
-
ページを移動する場合、ページ脚書きおよびページ頭書き報告書グループ
-
2.13.1. Multiple SOURCES節
キーワードの後ろに2つ以上の識別子または式を作成してSOURCE節の多様な形式を使用する場合、複数の個別項目をコーディングしなくても済みます。ただし、以下の事項に注意してください。
-
特定のフィールドに保存されている内容がないことを示すキーワードとしてNONEを含むことができます。
-
入力内容はMultiple LINES節と一緒に使用することができます。Multiple COLUMNS節はサポートしていません。
-
Multiple SOURCES節の項目数は、Multiple LINES節に定義されている項目数と一致する必要があります。
以下は、Multiple LINES節とMultiple SOURCES節が一緒に使用された例です。
... 03 LINE 1 2. 05 COLUMN 1 PIC X(04) SOURCE YEAR MONTH. ...
上記のコードは、以下の例と同様に動作します。
... 03 LINE 1. 05 COLUMN 1 PIC X(04) SOURCE YEAR. 03 LINE 2. 05 COLUMN 1 PIC X(04) SOURCE MONTH. ...
2.14. SUM節
SUM節は、自動で他の数字フィールドの合計を作成します。

コーディング・ルール
以下は、SUM節のコーディング・ルールについての説明です。
-
SUM節は、以下のように独自で1つの節としてSOURCE節、VALUE節の代わりに作成できます。
05 COL 10 PIC 999V99 SUM OF SALE.
式と一緒に作成するか、式の一部として作成することができますが、現在のバージョンではサポートしていません。
-
合計される項目は次の2つのいずれかです。
-
REPORTセクションの数字データ項目の名前です。これを使用するには、合計するREPORTセクションの項目のデータ名を指定する必要があります。
05 R-SALES COL 10 PIC 99999 SOURCE SALE.
報告書の他の項目にSUM OF R-SALESを作成して合計を構成することができます。これを、REPORTセクションのSUM節といいます。SUM演算子は添え字と算術記号を持つことができません。ただ、SUM OF data-nameのみ使用できます。
05 COL 10 PIC 999999 SUM OF R-SALES.
SUM節に記述されたデータ項目は、SUM R-SALES IN SUMMARY-SALESのように報告書名と一緒に作成することができます。
-
REPORTセクションの外部にある数字タイプの識別子または式です。この形式はSOURCE節のオペランドと似ています。これを、非REPORTセクションのSUM節といいます。現在、式はサポートしていません。
-
-
報告書には報告書グループのタイプで必要とする数のSUM節の項目が含まれることができます。要素項目でのみSUM節を使用できます。
-
UPON句を追加する場合、各グループ名は明細報告書グループの名前である必要があり、現在定義しているグループと同一でない必要があります。
-
SUM節が明細報告書グループにあり、SUM節のオペランドがREPORTセクションにない場合、報告書は2つ以上の明細報告書グループを含む必要があります。また、追加するGENERATEステートメントを指定するためにUPON句を論理的に記述する必要があります。
-
RESET句を追加する場合、control-idオペランドは報告書のCONTROL節に定義されているIDの1つである必要があります。現在、制御脚書き報告書グループを定義する場合は、RESET ON句の制御レベルがこのグループのレベルより高い必要があります。
-
RESET句は、複数の制御脚書き報告書グループのどのグループにも定義することができません。
オペレーション
以下は、SUM節のオペレーション方法についての説明です。
報告書作成プログラムは自動で合計、表示、および再設定(合計を0に設定)を行います。
-
合計
合計方法は、SUMで参照する項目がREPORTセクション項目のデータ名であるか否かによって異なります。
-
REPORTセクションのSUM節
SUM節のソース・データ項目が報告書に出力されるたびに参照する項目が合計フィールドに加算されます。合計されたREPORTセクションのデータ項目にSOURCE節またはVALUE節が含まれた場合、合計に追加された量は、中間のREPORTセクションのフィールドではなくREPORTセクションの外部にあるSOURCEまたはVALUEのオペランドです。
たとえば、以下のように作成する場合、合計に加算されるフィールド(S-FLD1、S-FLD2)は、R-FLD1、R-FLD2ではなく、10とSALESの値です。
05 R-FLD1 COL 1 PIC 999 VALUE 10. 05 R-FLD2 COL 10 PIC 9999 SOURCE SALES. ... 05 S-FLD1 ... SUM OF R-FLD1. 05 S-FLD2 ... SUM OF R-FLD2.
REPORTセクションの合計は、次の2種類があります。
-
横の集計(Crossfooting)
この方法は、以下のように合計する項目がSUM節と同じ報告書グループにあります。SUM節では、合計を計算する項目を物理的な順序で作成することを推奨します。
01 SALES-TOTLAS CF FOR CITY. 03 LINE + 2. 05 R-T-SALES COL 31 PIC $(6)9 SOURCE VAL-THIS-YR. 05 COL 31 PIC $(7)9 SUM OF R-T-SALES. 03 LINE + 1 COL 31 VALUE "----------------------".
以下のような循環的な従属性は避けてください。
05 R-A ... SUM OF R-A ... or 05 R-A ... SUM OF R-B ... 05 R-B ... SUM OF R-A ...
-
繰り上げ(Rolling Forward)
この方法は、以下のように合計を計算する項目がSUM節と異なる報告書グループにあります。
01 SALES-DETAIL DETAIL. 03 LINE + 1. 05 COL 1 PIC X(20) SOURCE SALES-DESC. 05 R-T-SALES COL 31 PIC $(6)9 SOURCE VAL-THIS-YR. 05 R-L-SALES COL 41 PIC $(6)9 SOURCE VAL-LAST-YR. 01 SALES-TOTLAS CF FOR CITY. 03 LINE + 2. 05 COL 1 PIC X(20) VALUE "TOTLAS". 05 COL 31 PIC $(7)9 SUM OF R-T-SALES. 05 COL 41 PIC $(7)9 SUM OF R-L-SALES. 03 LINE + 1 COL 31 VALUE "----------------------".
明細には加算される値が表示され、合計は制御脚書きに表示されます。
以下のいずれかでこの方法を使用することができます。
-
低いレベルの制御脚書きと高いレベルの制御脚書き
-
明細と明細
-
特定のグループと報告書脚書き
-
特定の本体グループとページ脚書き
-
ページ脚書きと制御脚書き
-
-
-
非REPORTセクションのSUM節
この合計は、REPORTセクションの外部にある値から累積されます。これを通常、縦の集計(Subtotalling)と呼びます。識別子や式がREPORTセクションの外部にあるので、合計に値が加算される際にREPORTセクションのSUM節のように明確ではなく、以下の規則が重要です。
-
SOURCE節とSUM節の相関関係が適用される場合、SUM節に表示される識別子がSOURCE節と同じである明細が生成されるときに足し算が発生します。
-
UPON句を使用する場合、この句に指定された明細が生成されるときに足し算が発生します。
-
SOURCE節とSUM節の相関関係が適用されず、UPON句がない場合、報告書を参照する各GENERATEステートメントを実行するたびに足し算が発生します。
ほぼすべての合計作業はREPORTセクションのSUM節により実行できます。
-
-
-
合計の表示
SUM節が含まれた項目が出力されるときに、編集されていない最新の合計はフィールド内容の内部"source"として使用されます。その例は以下のようになります。
05 COL 5 PIC $$,$$$,$$9.99 SUM R-SALES.
内部合計フィールドはこの報告書フィールドに移動され、SOURCE節と同じ規則に従って指定されたPICTURE節に従って編集されます。
-
合計の再設定
合計はRESET句を使用してオーバーライドしない限り、定義された報告書グループの処理が終了するときに再設定(0に初期化)されます。したがって、合計フィールドは内容が削除される前に同じグループ内で使用できる状態で維持されます。
以下の事項に注意します。
-
合計に値を加算するときに、報告書作成プログラムはADDステートメントの規則に従います。サイズ・エラーがある場合は、ランタイム・エラーが表示されます。
-
プログラムに2つ以上の報告書がある場合、1つの報告書内でのみ繰り上げが制限されることはありません。1つの報告書のSUM節は、他の報告書の名前が指定された数字データ項目を示すことができます。単一の報告書の合計と同様に、参照されたフィールド値はフィールドが出力されるたびに加算されます。
報告書内のすべての合計フィールドはINITIATEステートメントにより初期化されます。そのため、1つの報告書で他の報告書にSUM節を実行する場合、処理を開始する際に2つの報告書がすべて初期化されているか確認します。
-
PRESENT WHEN節は条件演算子で参照された全体フィールド値をテストできます。しかし、SUM節がある項目やSUM節によって合計された項目を範囲内に含めることはできません。
2.14.1. 合計フィールドの使用
データ名をSUM節が含まれた項目に指定すると、報告書作成プログラムはSOURCE節、VALUE節の場合のように、データ名を報告書行の外部フィールドと関連付けずに自体の内部合計フィールドと関連付けます。
次の2つの例を比較してみます。
-
SOURCE節が含まれた項目に指定した場合
05 R-PAYMENT COL 11 PIC $(7)9.99 SOURCE IS WS-PAYMENT.
R-PAYMENTフィールドはSUM節で参照される場合以外は実際の報告書行フィールドであり、WS-PAYMENTは追加された項目です。
-
SUM節が含まれた項目に指定した場合
05 TOT-PAYMENT COL 11 PIC $(7)9.99 SUM OF WS-PAYMENT.
TOT-PAYMENTフィールドはREPORTセクションの内部合計フィールドです。報告書行フィールドに出力されるものは名前がありません。
以下は、内部合計フィールドとその使用方法についての説明です。
-
内部合計フィールド
内部合計フィールドは、SUM節のデータ合計の整数および小数桁数を持つ純粋な数字であり、符号がある計算可能なフィールドです。そのため、報告書フィールドに合計フィールドを保存する際に精度が損なわれません。
SUM節がREPORTセクション項目を参照する際に、必要な場合、合計フィールドの精度が増加して合計項目と少なくとも同じ整数および小数桁数を持ちます。したがって、合計は少なくとも累積するフィールドの精度を持ち、表示された場合、フィールドが累積される間ではなく出力される際に四捨五入または切り捨てが発生します。
SUM節のPICTURE REPORTセクション内にある場合、SUMオペランドのPICTURE 内部合計のPICTURE 99999
(REPORTセクション内にない)
S9(5) COMP
ZZZ9.99
ZZ9.99
S9(4)V99 COMP
$(6)9-
$(5)9.99-
S9(6)V99 COMP
報告書行フィールドは符号がなくても、合計フィールドは常に符号を持つということに留意します。
-
内部合計フィールドへのアクセス
以下の方法で、内部合計フィールドに直接アクセスできます。
-
SOURCE節
単一のオペランド項目でSOURCE節が含まれた内部合計フィールドを取得できます。
以下のように、アクセスする合計フィールドのカテゴリによって値が異なります。
-
同じ報告書グループに定義された合計フィールドを参照するSOURCE節
この場合、常に指定された合計の正確な値を取得できます。精度を維持したまま、非REPORTセクションで印刷できない合計を作成しようとする場合に有用です。
次の2つの例を見てみます。
... 05 TOT-PAYMENT COL 11 PIC S9(6).99 SUM OF WS-PAYMENT. 05 COL 21 PIC -(6)9 SOURCE TOT-PAYMENT. ...
... 05 COL 21 PIC -(6)9 SUM OF WS-PAYMENT.
最初の例は、SUMオペランドがREPORTセクションのデータ名である場合で、合計時に切り捨てが発生しません。しかし、2つ目の例では、内部合計フィールドが暗視的にPICTURE S9(6)になるため、小数点以下の値が保証されません。したがって、正確な値を取得できません。
-
同じ報告書グループに定義されていない合計フィールドを参照するSOURCE節
この場合、SUMフィールドが非REPORTセクション項目または他の報告書グループの項目を参照する場合、その瞬間に累積された値を取得しようとする場合に有用です。SUM項目は報告書の特定の部分に次第に累積されるので、最終合計まですべての状態のバージョンを取得できます。
-
-
PRESENT WHEN節
PRESENT WHEN節の条件で合計フィールドの値を確認して、報告書グループで生成される内容を制御できます。
... 05 TOT-PAYMENT PIC S9(6).99 SUM OF WS-PAYMENT. 05 LINE + 2 PRESENT WHEN TOT-PAYMENT NOT = ZERO. 07 COL 1 VALUE "TOTAL :". 07 COL 11 PIC -(6)9 SOURCE TOT-PAYMENT. ...
上記のようなコードが作成されている場合、TOT-PAYMENTの値はPRESENT WHEN節の条件によって印刷することもしないこともできます。
-
2.14.2. RESET句
前述したように、合計フィールドは該当するグループの処理が終わると0に再設定されますが、RESET句を使用してこの再設定を制御することができます。
-
RESET ON control-idを指定すると、指定した制御識別子が発生するまで、合計フィールドは初期化されません。
以下は、報告書の定義例です。
RD SALES-REPORT ... CONTROLS YEAR MONTH. ... 01 SALES-DETAIL DETAIL. 03 LINE + 1. 05 COL 20 PIC ZZZ9.99 SOURCE AMOUNT. 01 CONTROL HEADING FOR YEAR. 03 LINE + 1. 05 COL 1 PIC X(5) VALUE 'YEAR:'. 05 COL 10 PIC X(4) SOURCE YEAR. 01 CONTROL FOOTING FOR MONTH. 03 LINE + 1. 05 COL 1 VALUE 'TOTALS '. 05 COL 10 PIC X(3) SOURCE MONTH. 05 M-SUM COL 20 PIC ZZZ9.99 SUM OF AMOUNT. 05 Y-SUM COL 30 PIC ZZZ9.99 SUM OF AMOUNT RESET ON YEAR.
上記例で、M-SUMの場合はRESET句を指定していません。Y-SUMの場合は、RESET句を指定しています。
... YEAR: 2018 100.00 200.00 TOTALS JAN 300.00 300.00 50.00 TOTALS FEB 50.00 350.00 300.00 100.00 TOTALS MAR 400.00 750.00 ... YEAR: 2019 100.00 150.00 TOTALS JAN 350.00 350.00 ...
M-SUMの値はMONTHの制御切れが発生するたびに合計を出力し、0に再設定された後に値が累積されることを確認できます。一方、RESET句が指定されたY-SUMの場合は、YEARの制御切れが発生するまで0に再設定されずに継続して値が累積されています。
2.15. TYPE節
TYPE節は、報告書グループのタイプを示すためにレベル01で使用されます。報告書グループは7つのタイプがあります。

control-idは、CONTROL(S)節の識別子、またはREPORTかFINALになります。 |
コーディング・ルール
以下は、TYPE節のコーディング・ルールについての説明です。
-
TYPE節はレベル01でのみ作成できます。TYPE ISキーワードは省略できます。グループのTYPE節を記述しない場合、DETAILタイプとみなされます。
-
報告書グループのすべてのタイプは状況に関係なく選択事項ですが、すべての報告書には少なくとも1つの本体グループ(DE、CH、CF)が必要です。
-
RD項目にPAGE LIMIT節がある場合にのみ、制御頭書きグループのOR PAGE句とページ頭書き、ページ脚書きを使用できます。
-
制御頭書きと制御脚書きで各control-idオペランドは、常に存在すると仮定されるREPORTまたはFINALを含めてCONTROL節の制御一覧で選択します。
-
制御頭書きにcontrol-idオペランドなしに作成した場合、CONTROL節に1つ以上の制御識別子が存在してはなりません。CONTROL節にただ1つの制御識別子がある場合、CONTROL HEADING FOR control-idを意味し、CONTROL節がない場合はCONTROL HEADING FOR REPORTを意味します。
-
制御脚書きに1つ以上の制御識別子が作成された場合、その結果は制御脚書き報告書グループの集合になります。しかし、現在のバージョンでは複数の制御脚書きはサポートしていません。
-
制御脚書きをcontrol-idオペランドなしに作成し、制御頭書きにだけ制御識別子がある場合は、CONTROL FOOTING FOR ALLまたはCONTROL FOOTING FOR control-idを意味し、制御頭書きおよび制御脚書きがない場合は、CONTROL FOOTING FOR REPORTを意味します。
-
報告書には複数の明細報告書グループが存在できますが、ページ頭書き、ページ脚書き、報告書頭書き、報告書脚書き報告書グループは1つのみ可能であり、各制御識別子に対する制御頭書きと制御脚書き報告書グループも1つずつのみ可能です。CONTROL FOOTING FOR ALLが作成された場合は、報告書で唯一の制御脚書きである必要があります。
オペレーション
TYPE節を使用して、報告書グループの作成位置と作成方法を設定することができます。以下は、各タイプを処理する方法を要約したものです。
TYPE | 説明 |
---|---|
報告書頭書き(RH: REPORT HEADING) |
このグループは報告書の最初の部分に1回のみ表示されます。 |
ページ頭書き(PH: PAGE HEADING) |
このグループは各ページで最初のグループとして生成されます。 |
制御頭書き(CH: CONTROL HEADING) |
このグループは制御切れが発生した制御グループの開始部分に自動で表示されます。 |
明細(DE: DETAIL) |
他の6つの報告書グループに属しないすべての報告書グループはDETAILタイプです。 明細グループはプログラムで明示的に作成できる唯一の報告書グループです。他のタイプの報告書グループは、明細グループが処理される前に必要なたびに自動で生成されます。 |
制御脚書き(CF: CONTROL FOOTING) |
このグループは制御切れが発生した制御グループの終了部分に自動で表示されます。 |
ページ脚書き(PF: PAGE FOOTING) |
このグループは各ページの最後のグループとして生成されます。 |
報告書脚書き(RF: REPORT FOOTING) |
このグループは報告書の最後の部分に1回のみ表示されます。 |
制御頭書きでのOR PAGE句
TYPE CONTROL HEADINGのcontrol-idオペランドの後ろにOR PAGE句を追加できます。この句を使用すると、各ページの上部に制御頭書きが生成され、ページ頭書きの後に必須情報を繰り返すことができます。動作の規則は以下のとおりです。
-
報告書にOR PAGE句が含まれたTYPE CHグループがある場合、制御頭書き報告書グループは、PAGEオプションがない場合と同様に、該当するレベルで制御切れの後に表示されます。また、追加でページ移動時の処理は以下のように修正されます。
-
明細報告書グループがページ移動の原因になる場合、一般的なページ移動の後、制御頭書き(CH)報告書グループが出力されます。2つ以上のCHグループにOR PAGEオプションがある場合、CHグループは高い方から階層的順序で出力されます。各CHも、前のページに適切かどうかに関係なく、新しいページに出力されます。
-
制御頭書き報告書グループがページ移動の原因になる場合、OR PAGE句があるかどうかに関係なく、ページ移動の原因となった制御頭書き報告書グループが新しいいページに1回のみ出力されること以外は、上記と同様に動作します。
-
制御脚書き報告書グループがページ移動の原因になる場合、制御脚書きレベル以下の制御頭書きが出力されないこと以外は、明細報告書グループがページ移動の原因になる場合と同様に動作します。
-
-
制御識別子がないCH FOR PAGEがある場合、CH FOR PAGE OR REPORTとみなされます。
2.16. VALUE節
VALUE節は、出力した報告書フィールドが固定リテラル値で構成されるたびに使用できます。

コーディング・ルール
以下は、VALUE節のコーディング・ルールについての説明です。
-
表意定数を含むリテラルを指定できます。
-
ALLまたは表意定数を指定しない場合、PICTURE節は不要です。たとえば、以下のとおりです。
05 COL 10 VALUE "*** REPORT START ***".
-
ALL "literal"形式、数値リテラル、または表意定数を使用できますが、これらを使用する場合にはPICTURE節を指定する必要があります。
2.17. VARYING節
VARYING節は、繰り返しフィールドを作成する数字カウンターの値を変更するために使用します。

コーディング・ルール
以下は、VARYING節のコーディング・ルールについての説明です。
-
VARYING節には任意の数のFROM句、BY句とdata-nameオペランドを使用できますが、現在のバージョンではFROM句とBY句が含まれていないdata-nameオペランドのみをサポートしています。FROM句とBY句が省略されている場合、FROM1とBY1で処理されます。
-
この節を使用するには、OCCURS節またはMultiple LINES節が必要です。
-
データ名はプログラムの他のところですでに定義されていてはならず、別途に定義してはなりません。COBOLの指標名を処理するのと似たように、報告書作成プログラムの内部で記述項目を作成します。
オペレーション
以下は、VARYING節のオペレーション方法についての説明です。
-
OCCURS節と一緒に使用され、最初のオカレンスを作成するときにVARYING節によって暗示的に設定されたデータ項目にFROM値の1を配置します。
-
以下は、VARYING節を使用して繰り返しフィールドを作成した例です。
03 LINE. 05 COL + 2 PIC Z9 OCCURS 10 VARYING C-INDEX SOURCE C-INDEX.
結果は以下のとおりです。
1 2 3 4 5 6 7 8 9 10
3. 報告書ステートメント
本節では、報告書作成プログラムで使用されるステートメントについて説明します。
COBOL報告書作成プログラムは報告書ステートメントを実行するまで動作しません。主要ステートメントには、INITIATE、GENERATE、TERMINATEの3つがあります。
INITIATEとTERMINATEは報告書処理の開始と終了時にそれぞれ実行され、GENERATEは繰り返し実行される間に1つの明細報告書グループを作成できます。この3つのステートメントは他のCOBOLステートメントと同じ方式で、USE BEFORE REPORTING宣言セクション以外のプログラム内のすべての位置で使用できます。
-
オペレーションの順序
入力として単純なファイルを使用する単一報告書の場合、一般的な報告書作成プログラムの作業手順は以下のとおりです。
-
開始時に一度ファイルを開く
OPEN INPUT input-file OPEN OUTPUT report-file
-
開始時に一度報告書作成プログラムを準備
INITIATE report
-
入力ファイルで各レコードを処理
GENERATE detail-group または report
-
最後に一度報告書作成プログラムを終了
TERMINATE report
-
最後に一度ファイルを閉じる
CLOSE input-file CLOSE report-file
-
3.1. GENERATE
GENERATEステートメントは、出力を作成するためのCOBOL報告書作成プログラムの基本構文です。報告書作成プログラムが制御を渡して明細報告書グループに説明されたすべての行とフィールドを作成する前に、必要な制御切れとページ・ブレークの処理を含むすべての必須処理を行うようにします。
GENERATEステートメントは、宣言セクションのUSE BEFORE REPORTING文に使用できません。 |

-
detail-group-name
-
GENERATE 明細報告書グループの名前を記述する場合、この名前は現在のプログラムに記述されている明細報告書グループの名前であるか、明細報告書グループが含まれたプログラムに定義されているグローバル報告書にある名前である必要があります。グループ名はレベル01の直後に表示されます。
-
-
report-name
-
GENERATE report-nameは特別な意味を持ち、要約報告形式として知られています。この場合、明細報告書グループが抑制されることがあるので、GENERATEの実行時に報告書の本文で制御頭書きや制御脚書き報告書グループが必要な場合以外は、この形式を使用しないでください。この形式を使用する場合、報告書に少なくとも1つ以上の制御頭書きまたは制御脚書きを持つ必要があります。
-
オペレーション
以下は、GENERATEステートメントのオペレーション方法についての説明です。
GENERATEステートメントは、報告書作成プログラムが一般的な報告書で3つの主要処理を行うようにします。
-
制御切れを確認し、必要な場合は、制御頭書きと制御脚書きを作成します。
-
page-fitを確認してページの移動を行い、必要な場合は、ページ頭書きとページ脚書きを作成します。これらは、また制御頭書きと制御脚書きの結果として生成されることができます。
-
要約報告書(GENERATE report-name)を実行しない場合は、明細報告書グループの各行を作成します。
報告書がINITIATEされると、プログラムは報告書内の各明細報告書グループに対するGENERATEステートメントを実行できます。報告書記述項目に複数の明細報告書グループが含まれている場合は、プログラムのどの部分でも一連の異なるGENERATEステートメントを記述でき、このような方法で必要な報告書レイアウトを作成できます。また、プログラムの一箇所以上で同じ明細報告書グループに対するGENERATEステートメントを作成できます。
GENERATEの後ろに、detail-group-nameの代わりにreport-nameを記述する要約報告書には、以下のような影響があります。
-
明細報告書グループが出力されません。
-
SUMオペランドのすべての繰り上げは、明細報告書グループで繰り上げされる場合以外は、通常どおり実行されます。
-
SUMオペランドのすべての横の集計は、明細報告書グループで横の集計が実行される場合以外は、通常どおり実行されます。
-
REPORTセクション内にないSUMオペランドの縦の集計は、以下のように実行されます。
-
SOURCEオペランドとSUMオペランドの相関関係が適用される場合、明細報告書グループのSOURCEオペランドに該当するすべてのSUMオペランドは、各明細報告書グループに順次GENERATEを実行したように合計に加算されます。SOURCEオペランドと一致せず、REPORTセクション内にないSUMオペランドは合計に一度だけ加算されます。
-
SOURCEオペランドとSUMオペランドの相関関係が適用されない場合、SUMオペランドは合計に一度だけ加算されます。
-
-
制御切れは通常どおり実行されます。制御切れが検知されると、すべての制御頭書き、制御脚書き報告書グループが通常どおり出力されます。ページの増加が発生すると、ページ頭書き、ページ脚書き報告書グループが一緒に出力されることができます。
GENERATE report-nameは、制御切れやINITIATE以降、最初のGENERATEステートメントでのみ出力を作成できます。INITIATEとTERMINATEの間に、プログラムはGENERATE report-nameとGENERATE group-name形式のステートメントをすべて実行できます。
処理間隔
報告書がINITIATEステートメントを実行していない場合は、正常に動作しません。
-
INITIATE以降最初のGENERATEである場合、以下のように動作します。
-
報告書頭書き報告書グループがある場合、報告書頭書きが生成されます。
-
制御頭書き報告書グループがある場合、それぞれ最高レベルから最低レベルまで生成され、各制御の初期値が保存されます。
-
THROUGH節が使用されると、literal-4、literal-5は長さが1の文字である必要があります。
-
-
INITIATE以降最初のGENERATEでない場合、最高レベルから始めて、各制御識別子を保存された以前の値と比較します。制御が変更されていない場合、作業は行われません。値の違い(制御切れ)が発生したら、以下のような制御切れ動作が発生します。
-
各制御識別子値は一時的に制御切れ直前の値に変更されます。
-
制御脚書き報告書グループがある場合、最低レベルの制御脚書きから制御切れが発生したレベルの制御脚書きまで生成されます。
-
制御識別子値は制御切れ後の値に復元されます。
-
制御頭書き報告書グループがある場合、制御切れが発生したレベルの制御頭書きから最低レベルの制御頭書きまで生成されます。
制御頭書き報告書グループと制御脚書き報告書グループは独自の権限で作成された独立した報告書グループなので、明細報告書グループと同様な作業が適用されます。
-
宣言セクションで該当するグループのUSE BEFORE REPORTINGセクションがある場合は、そのセクションが実行されます。
行が作成されていて、報告書にPAGE節がある場合は、LINE-COUNTERを確認してグループが出力される前にページの移動が必要かどうかを確認します。ページの移動が必要な場合、以下の処理が行われます。
-
ページ脚書き報告書グループがある場合、ページ脚書きが生成されます。
-
PAGE-COUNTERが1増えます。
-
ページ頭書き報告書グループがある場合、ページ頭書きが生成されます。
-
OR PAGE句が指定された制御頭書き報告書グループがある場合、最高レベルから最低レベルまで生成されます。
3.2. INITIATE
INITIATEステートメントは、報告書に対して実行する最初の報告書ステートメントである必要があります。
INITIATEステートメントは、宣言セクションのUSE BEFORE REPORTING文に使用できません。 |

-
report-name
-
報告書名は、現在のプログラムの報告書名であるか、含まれたプログラムに定義されているグローバル報告書名である必要があります。
-
-
UPON
-
UPON句がある場合、各報告書名は指定されたファイル名のFD項目のREPORT(S)節で定義します。報告書名が2つ以上のFD項目に定義されている場合、UPON句を使用する必要があります。
-
UPON句がある場合は、指定されたファイルにのみ報告書が作成されます。現在のバージョンではUPON句をサポートしていません。
-
オペレーション
同じ報告書(または報告書の明細報告書)を参照するGENERATE、TERMINATEステートメントを実行する前に、報告書に対してINITIATEステートメントを実行する必要があります。
INITIATEステートメントを実行する前に該当する報告書ファイルを開きます。INITIATEステートメントはファイルを開く操作は行いません。ただし、ファイルを閉じた後開いていない状態でTERMINATEステートメントが実行された報告書に対してINITIATEステートメントを再実行できます。
報告書がINITIATEされた状態で、TERMINATEステートメントを実行せずに、報告書が送信されるファイルを閉じてはなりません。
処理間隔
INITIATEステートメントを実行すると、以下の処理が行われます。
-
LINE LIMIT節の識別子形式が記述されている場合、識別子を確認して、識別子が有効な場合、報告書制御領域に保存されます。
-
LINE-COUNTERが0に再設定されます。
-
PAGE-COUNTERが1に設定されます。
3.3. SUPPRESS PRINTING
SUPPRESS PRINTINGステートメントは、特定の状況で特定の報告書グループが出力されることを防止します。

-
SUPPRESS PRINTING
-
SUPPRESS PRINTINGステートメントは、宣言セクションのUSE BEFORE REPORTING文にのみ記述できます。
-
-
MOVE integer TO PRINT-SWITCH
-
MOVE 1 TO PRINT-SWITCHは、SUPPRESS PRINTINGと同じ意味を持ちます。
-
MOVE 0 TO PRINT-SWITCHは、SUPPRESS PRINTINGステートメントの動作を取り消す意味で使用できます。
-
オペレーション
SUPPRESS PRINTING、またはMOVE 1 TO PRINT-SWITCHは、USE BEFORE REPORTING文に指定されたグループが出力を作成できないようにします。つまり、グループの行に設定されたデータがなく、行が生成されません。LINE-COUNTERも変更されないまま維持されるので、ページの移動が遮断されます。このステートメントは報告書のデータの保存と行の出力のみを抑制します。
SUPPRESS PRINTING、またはMOVE 1 TO PRINT-SWITCHは、実行するたびに該当する単一の状況でのみ出力が防止されます。報告書作成プログラムはUSE BEFORE REPORTINGセクションに移動するたびにPRINT-SWITCHを0に再設定します。
3.4. TERMINATE
TERMINATEステートメントは、各報告書に対して最後に実行する報告書ステートメントです。
TERMINATEステートメントは、宣言セクションのUSE BEFORE REPORTING文に使用できません。 |

-
report-name
-
報告書名は、現在のプログラムにある報告書名であるか、含まれたプログラムに定義されているグローバル報告書名である必要があります。
-
オペレーション
プログラムを終了する前にINITIATEされているすべての報告書に対してTERMINATEステートメントを実行する必要があります。報告書の最後に必要となれる、最後の制御脚書き、ページ脚書き、報告書脚書き報告書グループを出力します。PAGE-COUNTERとLINE-COUNTERは報告書の最後に取得した最終値を含みますが、合計フィールドは0になります。関連する報告書ファイルは別途に閉じる必要があります。TERMINATEステートメントはファイルを閉じる操作は行いません。
報告書に対してINITIATEステートメントを実行後、GENERATEステートメントを実行せずにTERMINATEステートメントを実行すると、出力は生成されません。少なくとも報告書頭書きと報告書脚書き報告書グループが表示されるようにするには、TERMINATEを実行する前に空の明細報告書グループをGENERATEする必要があります。
報告書ファイルを閉じていない状態では、報告書をいつでも再びINITIATE、TERMINATEできます。INITIATEはPAGE-COUNTERを再び1に戻し、PAGE LIMIT節がある場合は、新しいページで再び報告書を実行します。
処理間隔
TERMINATEステートメントを実行すると、以下の処理が行われます。
-
少なくとも1つ以上のGENERATEステートメントを実行した場合、各制御識別子の値は最後にGENERATEステートメントが実行された際の値で一時的に変更され、各制御脚書き報告書グループは最低レベルから最高レベルまで生成されます。
-
ページ脚書き報告書グループがある場合、ページ脚書きが生成されます。
-
報告書脚書き報告書グループがある場合、報告書脚書きが生成されます。