7.21.1 DEF_BREAK のパラメータ

ACROSS_SEP

DESIGN

DOWN_SEP

FIELDS

FOR_REPORT

HEAD_COND

IDENTIFY

NAME

SPACE_AFT

SPACE_BEF

SUBROUTINE

TEXT

TRIGGER_BY

TYPE

NAME

このコマンドで定義するレポート印刷行のグループに付ける名前を指定します。指定する名前は、ファンクション内で固有でなければなりません。

FIELDS

レポートに印刷するフィールドを指定します。このパラメータでは、拡張可能なグループ式を使用できます。

RDMLフィールドのみサポートします。

TRIGGER_BY

このコマンドで定義するブレーク行の印刷を「トリガー」するための条件を指定します。このパラメータでは、拡張可能なグループ式を使用できます。

デフォルト値*DEFAULTを指定すると、ブレーク行は、ENDPRINTコマンドまたはファンクションの終了によってレポートが終了/閉じられたときに一度のみトリガーされます。通常、この値は、レポートの最後に「総」計ブレーク行を生成するために使用されます。

または、ブレーク行の印刷をトリガーするために使用するフィールド名のリストを指定します。いずれかのレポート行が印刷されるたびに、LANSAは、このリストで指定されたフィールドとその以前の値を比較します。リストに指定されたいずれかのフィールドの値が変更されている場合、ブレーク行が生成されます。

TYPE

必要なブレーク行のタイプを指定します。

デフォルト値*TRAILINGは、通常、関連付けられた明細行の後に続くブレーク行を生成するために使用します。

*LEADINGは、通常、関連付けられた明細行の前に印刷するブレーク行を生成するために使用します。

前置型ブレーク行と後置型ブレーク行の違いについて、例を通して説明します。以下の明細行 (DEF_LINEコマンドを参照) と後置型ブレーク行の定義について考えます。

DEF_LINE  NAME(#DETAIL) FIELDS(#REGION #PRODES #VALUE)
 
DEF_BREAK NAME(#REGTOT) FIELDS(#REGVAL) TRIGGER_BY(#REGION)
 

これらの行定義により、以下のようなレポートが生成されます。

地域

製品内容

NSW

缶詰製品

400.00

NSW

紙皿

700.00

NSW

プラスチック・スプーン

300.00

   地域小計

1400.00

VIC

缶詰製品

500.00

VIC

紙皿

750.00

VIC

プラスチック・スプーン

100.00

   地域小計

1350.00

 

この例では、「地域小計 1400.00」という行が後置型ブレーク行です。

ブレーク行が、典型的な「後置型」小計として使用されていることが分かります。また、以下のように、さらに「前置型」ブレーク行を使用することで、レポートの体裁を向上させることができます。

DEF_LINE  NAME(#DETAIL) FIELDS(#PRODES #VALUE)
 
DEF_BREAK NAME(#REGTOT) FIELDS(#REGVAL) TRIGGER_BY(#REGION)
 
DEF_BREAK NAME(#REGNAM) FIELDS(#REGION) TRIGGER_BY(#REGION) TYPE(*LEADING)
 

この状態で生成されるレポートは以下のようになります。

製品記述

地域NSW

 

   缶詰製品

400.00

   紙皿

700.00

   プラスチック・スプーン

300.00

   地域小計

1400.00

地域VIC

 

   缶詰製品

500.00

   紙皿

750.00

   プラスチック・スプーン

100.00

   地域小計

1350.00

 

この例では、「地域NSW」という行が前置型ブレーク行で、「地域小計 1400.00」という行が後置型ブレーク行です。

SPACE_BEF

レポート上で、ブレーク行を印刷する前に挿入するスペース行数を指定します。デフォルト値は2ですが、0~100の任意の値を指定できます。

SPACE_AFT

レポート上で、ブレーク行を印刷した後に挿入するスペース行数を指定します。デフォルト値は1ですが、0~100の任意の値を指定できます。

TEXT

画面パネルまたはレポート上に出力する最大50個の「テキスト文字列」を指定できます。指定する各テキスト文字列は、最大20文字に制限されます。

テキスト文字列の後に、そのテキスト文字列を画面パネルまたはレポートに出力する行/行番号と列/位置番号を指定します。

例えば:

TEXT(('ACME' 6 2)('ENGINEERING' 7 2))

 

この場合、2つのテキスト文字列はそれぞれ6行目の2番目の位置と7行目の2番目の位置に出力されます。

移植性に関する考慮事項

Visual LANSAでは、このパラメータを編集するときは、必ず、テキストをテキスト・マップで置き換える画面またはレポート・ペインターを使用してください。コマンド・プロンプトや自由形式のエディターでテキストを入力しないでください。LANSA/ADにチェックインしたときに、すべての構文検査に合格しません。

すべてのプラットフォーム

テキスト・マップは、画面パネルまたはレポート行に関連付けられたすべてのテキスト文字列の詳細を保管するために、画面またはレポート設計機能で使用されます。

画面またはレポートのレイアウトを「構成」して保管すると、レイアウトのすべてのテキスト明細が「テキスト・マップ」に保管されます。このテキスト・マップは、再度「ペインター」を使用することで変更できます。

テキスト・マップの存在は、以下の例のようなTEXTパラメータで示されます。

TEXT((*TMAPnnn 1 1))
 

ここで、"nnn"は、保管されているテキスト・マップを識別する(ファンクション内で)固有の番号です。

以下の「テキスト・マップ」および*TMAPnnn識別子に関する非常に重要な事柄について理解しておく必要があります。

FOR_REPORT

このコマンドを関連付けるレポートを指定します。1つのファンクションで一度に生成できるレポートは最大8個です。各レポートを1~8の番号で指定します。このレポートのデフォルト値はレポート番号1です。

DESIGN

特定の位置決め属性を持たないフィールドに対して使用する設計/位置決め方法を指定します。

DEF_BREAKコマンドのデフォルト値*ACROSSを指定すると、フィールドは、レポート行「全体」に(すなわち、左から右へ)配置されます。

*DOWNを指定すると、フィールドは、レポート・ページの「下方向」へ(すなわち、上から下へ)配置されます。

IDENTIFY

特定の識別属性を持たないフィールドに対して使用するデフォルトの識別方法を指定します。

DEF_BREAKコマンドのデフォルト値*LABELを指定すると、フィールドは、それに関連付けられたラベルで識別されます。

*COLHDGを指定すると、フィールドは、それに関連付けられた欄見出しで識別されます。

*NOIDを指定すると、フィールドの識別が要求されません。レポート行には、フィールド自体のみが挿入されます。

DOWN_SEP

レポートの自動設計時に使用するレポートの行間隔を指定します。指定する値は、1~10の数値でなければなりません。DEF_BREAKコマンドのデフォルト値は1です。

ACROSS_SEP

レポートの自動設計時に使用するレポートの列間隔を指定します。指定する値は、0~10の数値でなければなりません。DEF_BREAKコマンドのデフォルト値は1です。

HEAD_COND

任意で、このブレーク印刷行内のフィールドに関連付けられた欄見出し行をレポートの見出し領域に印刷するかどうかを示す条件の名前を指定します。

デフォルト値*NONEを指定すると、制御条件が適用されません。実際に印刷される行に関わらず、このブレーク行に関連付けられたすべての欄見出しが常にレポートの見出し領域に印刷されます。

制御条件を指定する場合、その条件は、DEF_COND (条件の定義)コマンドによってRDMLファンクション内のどこかに定義されていなければなりません。印刷行を印刷するときには、必ず条件の状況が検査されます。この条件に適合していることが判明した場合のみ、このブレーク印刷行に関連付けられた欄見出しがレポートの見出し領域に含められます。

SUBROUTINE

任意で、ブレーク行の印刷直前に実行するサブルーチンの名前を指定します。

デフォルト値*NONEを指定すると、ブレーク行の印刷前にサブルーチンは実行されません。

サブルーチン名を指定する場合は、そのサブルーチンが以下の条件を満たしている必要があります。

ブレーク行で使用するサブルーチンは、以下の条件を満たしている必要があります。

上記のガイドラインは検査されませんが、これに従わないと、予期しない結果になる可能性があります。

TYPE(*LEADING)ブレーク行サブルーチンを呼び出すためのロジックは、以下のように機能します。

<<if first usage or trigger values have changed>>

       <<execute leading break subroutine>>

       <<print the leading break line>>

<<endif>>

<<store current trigger values for next comparison>>

 

TYPE(*LEADING)ブレーク行を含むサブルーチンの使用例を以下に示します。

DEF_BREAK  NAME(#REGION) FIELDS(#REG_CODE #REG_NAME) TRIGGER_BY(#REG_CODE) TYPE(*LEADING) SUBROUTINE(GET_REGION)
 
SUBROUTINE NAME(GET_REGION)
FETCH FIELDS(#REG_NAME) FROM_FILE(REGIONS) WITH_KEY(#REG_CODE)
ENDROUTINE
 

前置型ブレーク行は、新しい地域コードが検出されるたびに印刷されます。ブレーク・サブルーチンでは、関連付けられた地域名を地域テーブルから抽出するために、地域コードの現行値が使用されます。サブルーチンは、地域コードが変更された場合のみ実行されるため、これは効率的な方法です。

TYPE(*TRAILING)ブレーク行サブルーチンを呼び出すためのロジックは、これより多少複雑です。後置型ブレーク行に印刷される値が、実際には、RDMLファンクション内に現れる明白な値より「遅れている」ためです。

例えば、地域コードの変更によってトリガーされ、地域名も印刷する後置型ブレーク行は、印刷される地域コードと地域名が、RDMLファンクション内に現れる地域コードおよび地域名フィールドの現行値より「遅れる」よう設定されます。

その理由は単純です。

例えば、地域コードが"001"から"002"に変更されると、後置型ブレーク行がトリガーされます。後置型ブレークによって地域コードの現行値を印刷する場合、レポートには"002"と表示されるはずです。

ところが、実際に印刷されるのは、地域コードの「以前の」値を保持する特別な内部「後置型」フィールドで、その値は"001"です。

この「後置型」ロジックは、TYPE(*TRAILING)ブレーク行に印刷されるすべてのフィールドに適用されます。

このロジックは複雑なように思えますが、実際は、「後置型」ロジックの複雑さは内部用で、開発者は考慮する必要がないため、開発者向けのRDMLレベルのロジックは、これより大幅に単純です。

この後置型ブレーク印刷ロジックは以下のようになります。

<<if this is not first usage and trigger values have changed>>

       <<save current values of all fields used in function>>

       <<restore all printed fields from their "trailing" values>>

       <<execute trailing break subroutine>>

       <<move all printed fields back into their "trailing" values>>

       <<restore current values of all fields used in function>>

       <<print the trailing break line (ie: the trailing values)>>

<<endif>>

<<store current trigger values for next comparison>>

 

このロジックの完了時に、すべてのフィールドが、ロジックの呼び出し時の状態に復元されます。

そのため、後置型ブレーク行サブルーチンがフィールド値を変更することによりRDMLファンクションの他の部分と「情報交換」することは事実上不可能です。

TYPE(*TRAILING)ブレーク行を含むサブルーチンの使用例を以下に示します。

DEF_BREAK  NAME(#REG_TOTAL) FIELDS(#REG_CODE #REG_NAME  #REG_TOT1 #REG_TOT2 #REG_PCT)  TRIGGER_BY(#REG_CODE) TYPE(*TRAILING) SUBROUTINE(REG_TOTAL)
 
SELECT     FIELDS(#REG_CODE ... etc ...) FROM_FILE(SALES)
KEEP_TOTAL OF_FIELD(...) IN_FIELD(#REG_TOT1)  BY_FIELD(#REG_CODE)
KEEP_TOTAL OF_FIELD(...) IN_FIELD(#REG_TOT2)  BY_FIELD(#REG_CODE)
PRINT      LINE(*BREAKS) <-
ENDSELECT <-
 
SUBROUTINE NAME(REG_TOTAL)
FETCH FIELDS(#REG_NAME) FROM_FILE(REGIONS) WITH_KEY(#REG_CODE)
CHANGE FIELD(#REG_PCT) TO('(#REG_TOT1 / #REG_TOT2) * 100')
ENDROUTINE <-
 

前の例と同様に、このサブルーチンも地域コードが変更された場合のみ呼び出されます。このサブルーチンは、地域テーブルから地域名を抽出し、#REG_PCTをフィールド#REG_TOT1および#REG_TOT2の合計のパーセンテージに設定します。

このルーチンは、実際にブレーク行に印刷される値の使用と変更のみを行うため、良好に動作します。

この方法は、このアプリケーションをデバッグ・モードで実行すると分かりやすいでしょう。

デバッグ・モードで、以下の場所でこのアプリケーションを停止するよう設定するとします。

また、SALESファイルに地域コード"001"および"002"の情報が保持され、SELECTループによって地域"001"のすべての情報が処理済みで、最初の地域"002"レコードを読み取った直後であるとします。

PRINTコマンドでは、以下のようになります。

ENDROUTINEコマンドでは、以下のようになります。

ENDSELECTコマンドでは以下のようになります。