拡張レポート・レイアウトの使用
拡張レポート・レイアウトについてさらに学習します。
この項では、拡張レポート・レイアウトの次のタスクについて説明します:
バッチ・レポートの作成
請求書や購買オーダーなど、文書のバッチを単一のPDFファイルに印刷することは一般的な要件です。 これらのドキュメントは異なる顧客を対象としているため、各ドキュメントではページ番号のリセットが必要であり、そのページ合計はドキュメントに固有です。 ヘッダーおよびフッターにデータからフィールド(顧客名など)が表示される場合は、これらもリセットする必要があります。
「パブリッシャ」は、contextコマンドを使用してこの要件をサポートします。 このコマンドを使用すると、特定のセクションへのレポートの要素を定義できます。 セクションが変更されると、これらのエレメントはリセットされます。
次の例は、出力ファイル内のヘッダーとフッター、ページ番号付けをリセットする方法を示しています:
次のXMLコードは、複数の請求書を含むレポートです:
...
<LIST_G_INVOICE>
<G_INVOICE>
<BILL_CUST_NAME>Vision, Inc. </BILL_CUST_NAME>
<TRX_NUMBER>2345678</TRX_NUMBER>
...
</G_INVOICE>
<G_INVOICE>
<BILL_CUST_NAME>Oracle, Inc. </BILL_CUST_NAME>
<TRX_NUMBER>2345685</TRX_NUMBER>
...
</G_INVOICE>
...
</LIST_G_INVOICE>
...
各G_INVOICE要素には、異なる可能性がある顧客の請求書が含まれます。 G_INVOICE要素が出現するたびに新しいセクションを開始するように「パブリッシャ」に指示するには、次の構文を使用して、グループのopening for-each文に@sectionコマンドを追加します:
<?for-each@section:group name?>
ここで、group_nameは、新しいセクションを開始する要素の名前です。
たとえば、この例のfor-each group文は次のようになります:
<?for-each@section:G_INVOICE?>
<?end for-each?>
終了タグは変更されません。
次の図は、バッチ・レポートのサンプル・テンプレートを示しています:
ノート:
G_INVOICEグループのfor-each宣言は、コマンドによってヘッダーがリセットされても、レポートの本文内に残ります。次の表では、前の図のテンプレートからのフォーム・フィールドの値(バッチ・レポートのサンプル・テンプレートを示しています)について説明します:
デフォルト・テキスト・エントリ | フォーム・フィールドのヘルプ・テキスト | 説明 |
---|---|---|
for-each G_INVOICE |
|
G_INVOICEグループを開始し、要素をセクションとして定義します。 G_INVOICEが出現するたびに、新しいセクションが開始されます。 |
|
該当なし |
Microsoft Wordはヘッダーのフォーム・フィールドをサポートしていないため、TRX_NUMBER要素のプレースホルダー構文はテンプレートに直接配置されます。 |
G_INVOICEの終了 |
|
G_INVOICEグループを閉じます。 |
G_INVOICE要素の新しい出現ごとに、新しいセクションが開始されます。 ページ番号が再起動され、ヘッダーまたはフッター情報がデータから導出された場合もリセットされます。
データが見つからない条件の処理
@sectionをパブリッシャコマンドfor-eachまたはfor-each-groupとともに使用する場合(例: : <?for-each@section:ELEMENT_NAME?>
)、入力データ・ファイルにデータがないため、そのfor-eachループに対して空または無効なPDF出力ドキュメントが生成される可能性があります。 これを回避するには、RTFテンプレートを編集します。
ピボット表の挿入
ピボット表の列はデータに依存します。
設計時には、レポートされる列の数や適切な列見出しはわかりません。 さらに、列を2ページ目に分割する場合は、後続のページに繰り返す行ラベル列を定義できる必要があります。 次の例は、これらの機能をサポートする単純なピボット・タール・レポートを設計する方法を示しています。 「ピボット表の挿入」を参照してください。
この例では、次のXMLサンプルを使用します:
<ROWSET>
<RESULTS>
<INDUSTRY>Motor Vehicle Dealers</INDUSTRY>
<YEAR>2005</YEAR>
<QUARTER>Q1</QUARTER>
<SALES>1000</SALES>
</RESULTS>
<RESULTS>
<INDUSTRY>Motor Vehicle Dealers</INDUSTRY>
<YEAR>2005</YEAR>
<QUARTER>Q2</QUARTER>
<SALES>2000</SALES>
</RESULTS>
<RESULTS>
<INDUSTRY>Motor Vehicle Dealers</INDUSTRY>
<YEAR>2004</YEAR>
<QUARTER>Q1</QUARTER>
<SALES>3000</SALES>
</RESULTS>
<RESULTS>
<INDUSTRY>Motor Vehicle Dealers</INDUSTRY>
<YEAR>2004</YEAR>
<QUARTER>Q2</QUARTER>
<SALES>3000</SALES>
</RESULTS>
<RESULTS>
<INDUSTRY>Motor Vehicle Dealers</INDUSTRY>
<YEAR>2003</YEAR>
...
</RRESULTS>
<RESULTS>
<INDUSTRY>Home Furnishings</INDUSTRY>
...
</RESULTS>
<RESULTS>
<INDUSTRY>Electronics</INDUSTRY>
...
</RESULTS>
<RESULTS>
<INDUSTRY>Food and Beverage</INDUSTRY>
...
</RESULTS>
</ROWSET>
このXMLコードから、次の図に示すように、各業種および年別の売上合計を示すレポートが生成されます。
次の図は、前の図に示したレポートを生成するためのテンプレートを示しています。
前の図に示したテンプレートのフォーム・フィールドには、次の表で説明する値があります。
デフォルト・テキスト・エントリ | フォーム・フィールドのヘルプ・テキスト | 説明 |
---|---|---|
ヘッダー列 |
|
表がページにまたがる場合に繰り返すヘッダーとして最初の列を定義します。 「ページ全体で繰り返す列の定義」を参照してください。 |
次の情報を参照できます。 |
|
再グループ化構文(「XMLデータの再グループ化」を参照)を使用してYEARでデータをグループ化し、@columnコンテキスト・コマンドを使用して各グループ(YEAR)の表列を作成します。 「コンテキスト・コマンドを使用した命令の配置の制御」を参照してください。 |
YEAR |
|
YEAR要素のプレースホルダー。 |
end |
|
for-each-groupループを閉じます。 |
次の情報を参照できます。 |
|
グループを開始して、INDUSTRYごとに表の行を作成します。 |
INDUSTRY |
|
INDUSTRY要素のプレースホルダー。 |
次の情報を参照できます。 |
|
再グループ化構文(「XMLデータの再グループ化」を参照)を使用してYEARでデータをグループ化し、@cellコンテキスト・コマンドを使用して各グループ(YEAR)の表セルを作成します。 |
sum(Sales) |
|
現在のグループ(YEAR)の売上を合計します。 |
end |
|
for-each-group文を閉じます。 |
end |
|
for-each-group文を閉じます。 |
最初の行のみが@columnコンテキストを使用して表の列数を決定することに注意してください。 残りのすべての行は、@cellコンテキストを使用して列の表のセルを作成する必要があります。 「コンテキスト・コマンドを使用した命令の配置の制御」を参照してください。
動的データ列の構築
動的データ列を作成する機能は、RTFテンプレートの非常に強力な機能です。 この機能を使用して、データに必要な列数が変数である場合に、表を正しくレンダリングするテンプレートを設計できます。
たとえば、特定の範囲内のテスト・スコアの列を表示するテンプレートを設計します。 ただし、レポートするデータの範囲の数はありません。 動的データ列を定義して、実行時に正しい列数に分割できます。
次のタグを使用して、データを正しくレンダリングするために必要な動的書式設定に対応します:
-
動的列ヘッダー
<?split-column-header:group element name?>
このタグを使用して、表の列ヘッダーに対して分割するグループを定義します。
-
動的列
<?split-column-data:group element name?>
このタグを使用して、表の列データに対して分割するグループを定義します。
-
動的列幅
<?split-column-width:name?>
または<?split-column-width:@width?>
これらのタグのいずれかを使用して、XMLデータで幅を説明するときの列の幅を定義します。 幅は次の2つの方法で記述できます:
-
XML要素には幅の値が格納されます。 この場合、構文
<?split-column-width:name?>
を使用します。ここで、nameは幅の値を含むXML要素のタグ名です。 -
split-column-headerタグで定義された要素にwidth属性が含まれている場合は、構文
<?split-column-width:@width?>
を使用してその属性の値を使用します。
-
-
動的列幅の単位値(ポイント)
<?split-column-width-unit:value?>
このタグを使用して、列幅の乗数を定義します。 列の幅が文字セルで定義されている場合は、適切な乗数値を使用して、列を正しい幅(ポイント)にレンダリングする必要があります。 たとえば、表で10ポイントのクーリエ・フォントを使用している場合は、10ポイントのクーリエ・フォントで表示される文字のおよその幅である6の乗数を使用します。 乗数が定義されていない場合、列の幅は表の合計幅に対する割合として計算されます。 次の表に、列幅の計算を示します:
幅定義 列1 (幅= 10) 列2 (幅= 12) 列3 (幅= 14) 乗数が存在しません -%の幅
10/10+12+14*100 28%
%Width = 33%
%Width =39%
乗数= 6 - 幅
60ポイント
72ポイント
84ポイント
ページ全体で繰り返す列の定義
表の列が複数のページに水平方向に展開されている場合は、各ページで繰り返す行見出し列の数を定義できます。
次の構文を使用して、繰り返す列の数を指定します:
<?horizontal-break-table:number?>
numberは、繰り返す列の数(左から開始)です。
ノート:
この機能はPDF出力でのみサポートされています。動的データ列の例
学校試験のテスト・スコア範囲を表示するには、テンプレートが必要です。 論理的には、次の表に示すようにレポートを配置します。
テスト・スコア | テスト・スコア範囲1 | テスト・スコア範囲2 | テスト・スコア範囲3 | ...テスト・スコア範囲n |
---|---|---|---|---|
テスト・カテゴリ |
範囲1の学生数 |
範囲2の学生数 |
範囲3の学生数 |
範囲内の学生数n |
ただし、レポートされるテスト・スコア範囲の数はわかりません。 テスト・スコア範囲列の数は、データに応じて動的です。
次のXMLデータでは、これらのテスト・スコアについて説明します。 要素<TestScoreRange>
の出現回数によって、必要な列の数が決まります。 この場合、5つの列があります: 0-20、21-40、41-60、61-80、および81-100。 各列には、金額要素(<NumOfStudents>
)と列幅属性(<TestScore width="15">
)があります。
<?xml version="1.0" encoding="utf-8"?>
<TestScoreTable>
<TestScores>
<TestCategory>Mathematics</TestCategory>
<TestScore width ="15">
<TestScoreRange>0-20</TestScoreRange>
<NumofStudents>30</NumofStudents>
</TestScore>
<TestScore width ="20">
<TestScoreRange>21-40</TestScoreRange>
<NumofStudents>45</NumofStudents>
</TestScore>
<TestScore width ="15">
<TestScoreRange>41-60</TestScoreRange>
<NumofStudents>50</NumofStudents>
</TestScore>
<TestScore width ="20">
<TestScoreRange>61-80</TestScoreRange>
<NumofStudents>102</NumofStudents>
</TestScore>
<TestScore width ="15">
<TestScoreRange>81-100</TestScoreRange>
<NumofStudents>22</NumofStudents>
</TestScore>
</TestScores>
<TestScoreTable>
フォーム・フィールドで動的列タグを使用して、次の図に示すように2つの列に表を設定します。 最初の列Test Score
は静的です。 2番目の列Column Header and Splitting
は動的列です。 実行時、この列はデータに従って分割され、各列のヘッダーが適切に移入されます。 次の表に、各フィールドのデフォルトのテキスト入力およびフォーム・フィールド・ヘルプ・エントリを示します。
デフォルト・テキスト・エントリ | フォーム・フィールドのヘルプ・テキスト入力 |
---|---|
Group:TestScores |
|
テスト・カテゴリ |
|
列ヘッダーと分割 |
|
コンテンツと分割 |
|
end:TestScores |
|
-
Test Score
は、ボイラープレート列見出しです。 -
Test Category
は、<TestCategory>
データ要素のプレースホルダー、つまり行見出しでもある数学です。 -
2番目の列は、動的に分割される列です。 指定した幅は、データの列数で除算されます。 この場合、5つのデータ列があります。
-
2番目の列には、動的範囲データが含まれます。 列の幅は分割列幅に従って分割されます。 この例では単位値タグ(
<?split-column-width-unit:value?>
)が含まれていないため、列はパーセント単位で分割されます。 必要に応じて、データのラップが発生します。タグ(
<?split-column-width-unit:value?>
)が存在する場合、列の幅はポイントで特定されます。 列幅の合計がページ上の割り当てられた領域よりも広い場合、表は別のページに分割されます。その後、
horizontal-break-table
タグを使用して、後続のページで繰り返す列数を指定できます。 たとえば、値1を指定すると、後続のページで列Test Score
が繰り返され、最初のページに収まらなかった列が継続されます。
テンプレートは、次の図に示す出力をレンダリングします: