Zen レポートのデータの表示
ここでは、レポートに視覚上のコンテンツを表示する要素について説明します。これらの要素の多くは、<pageheader>、<pagefooter>、<pagestartsidebar>、<pageendsidebar>、<body>、<block>、<div>、<group>、または <table> の子にできます。
表示要素は以下のとおりです。
-
<barcode> — 生成された PDF にバーコードを追加します。HTML ではサポートされていません。
-
<barcodeOptions> — <barcode> にオプションを追加します。
-
<block> — インラインで扱う項目のグループ
-
<bidioverride> — 生成された XSL-FO に <fo:bidi-override> 要素を、生成された HTML に <bdo> 要素をそれぞれ追加します。
-
<br/> — ブロック内の改行
-
<container> — 通常、背景イメージ上に重ねて表示する項目のグループ
-
<div> — ブロックとして扱う項目のグループ
-
<footer> — ページ・フッタの項目のグループ
-
<group> — 繰り返しアクションの項目のグループ
-
<header> — ページ・ヘッダの項目のグループ
-
<img> — イメージ
-
<inline> — インライン・テキストのスタイル
-
<inlinecontainer> — 生成された XSL-FO に <fo:inline-container> 要素を追加します。
-
<item> — データ値
-
<line> — ブロック間の水平の線
-
<link> — 他の URI へのリンク
-
<list> — 単純なリスト、あるいは箇条書きまたは番号付きリスト
-
<p> — 任意の長さのテキスト
-
<pagebreak> — 改ページ
-
<small-multiple> — ページで繰り返される一連のグラフ要素。
-
<table> — テーブル
-
<timeline> — エピソードのグラフィック要約
さらに、Zen レポートでは、グラフの作成が可能な複数の要素をサポートしています。Zen レポートのコールバック・グラフでは、Zen ページのグラフが提供するグラフ作成機能が複製されます。“Zen コンポーネントの使用法” の章の “Zen のグラフ” のセクションでは、Zen ページと Zen レポートがサポートするすべてのタイプのグラフについて説明しています。このドキュメント内の “Zen レポートのコールバック・グラフ” の章では、Zen レポートのグラフに固有のトピックについて説明します。
レポートの表示属性
この章で示す各表示要素は、以下のテーブルで説明する属性を持ちます。これ以外の属性を持つこともあります。
属性 | 説明 |
---|---|
class |
要素に適用する CSS スタイル・クラス。 スタイル・クラスは <class> 要素で定義できます。また、標準スタイル・シートで指定するスタイル・クラスもあります。詳細は、このテーブルの後に示す説明を参照してください。 |
htmlstyle | このテーブルの style 属性と同様に機能しますが、htmlstyle 属性を使用して指定したスタイルは HTML 出力にのみ適用されます。 |
selectstylecond |
ObjectScript 式のコンマ区切りのリスト。実行時、selectstylecond 式が左から右へ評価されます。selectstylecond の最初の True の条件と一致する selectstylelist のスタイルが、表示要素に適用されます。 詳細は、このテーブルの後に示す “CSS スタイルの条件付き適用” を参照してください。 |
selectstylelist |
selectstylecond で使用する CSS 文のコンマ区切りのリスト。 |
style |
CSS のスタイル属性と似ていますが、この属性には「属性名:値」のペアをセミコロンで区切ったリストを指定できます。以下はその例です。 style="fill:yellow;font-size:6pt;" style を <block> などのコンテナに適用する場合、コンテナ内のすべてのノードには適用されない場合があります。このために問題が発生する場合、style 属性を <item> などの下位レベルのノードに適用してみてください。 |
stylecall |
実行する <xsl:template> の名前。テンプレートは、同じ Zen レポート・クラスの XData HtmlXslt ブロックまたは XData XslFoXslt ブロック (あるいは両方) で定義する必要があります。 このテーブルの styleparamNames と styleparams、および “スタイルを適用する XSLT テンプレートの呼び出し” セクションを参照してください。 |
styleparamNames |
この <item> のために呼び出す <xsl:template> の <xsl:param> 引数の名前のセミコロン区切りリスト。 このテーブルの stylecall と styleparams、および “スタイルを適用する XSLT テンプレートの呼び出し” セクションを参照してください。 |
styleparams |
この <item> のために呼び出す <xsl:template> で定義された <xsl:param> 引数に値を提供する式のセミコロン区切りリスト。これらの式には、リテラル値、ノード・セット、XPath 式、または XSLT 関数呼び出しを使用できます。XSLT の <xsl:with-param> の値として有効な値であれば、styleparams にも使用できます。 このテーブルの stylecall と styleparamNames、および “スタイルを適用する XSLT テンプレートの呼び出し” セクションを参照してください。 |
template |
この要素を指定するテンプレートの名前。その形式は以下のとおりです。 templateClass:templateName 以下はその説明です。
テンプレート名の先頭が感嘆符 (!) の場合、COS 実行時式として解釈されます。 テンプレートを作成するには、“Zen レポート・クラスの構築” の章の “Zen レポートのテンプレートの使用法” を参照してください。 |
width |
要素の幅を定義する、HTML の長さの値。正確な意味は要素によって異なります。width を省略すると、PDF レンダリング・ツールによっては予期しない結果となる可能性があります。 "2in"、"5cm"、"12px"、"14pt"、"3em"、または "75%" は、すべて HTML の長さの値として使用可能な形式です。パーセント (%) は、width 属性を使用している要素のコンテナを基準とします。 |
xslfostyle | このテーブルの style 属性と同様に機能しますが、xslfostyle 属性を使用して指定したスタイルは PDF 出力用の XSLFO スタイルシートにのみ適用されます。 |
class 属性の値を指定するときに、このクラスを作成するときに付けた要素名は使用しないでください。したがって、使用するスタイル・クラスの名前が table.myTable である場合、<report> で次のように指定します。
<table class="myTable">
以下の <table> 要素では、class 属性を使用して Zen レポートのテーブルに table.grid スタイルを適用します。
<table class="grid" group="Step">
<item width="0.8in" field="@Number" />
<item width="0.8in" field="./AllSet" />
<item field="./DemoText" />
</table>
class を指定していない子要素には、その親要素の class 属性の値が継承されます。したがって、table.myTable、th.myTable、および td.myTable を定義する場合、<table> 要素では class 属性を指定するだけで十分です。さらに、<body> 要素の中に class 属性を記述して、レポートにあるすべての要素にクラスを定義することもできます。少なくとも、自身の class 属性でクラスをオーバーライドしていない要素にクラスを定義できます。
class の値には、以下の例のように、スペース文字で区切った複数のクラス名を記述できます。
<document width="8.5in" height="11in"
marginLeft="1.25in" marginRight="1.25in"
marginTop="1.0in" marginBottom="1.0in">
<class name="p.class1">
<att name="background-color" value="red" />
</class>
<class name="p.class2">
<att name="color" value="white" />
</class>
</document>
<body>
<p class="class1 class2">Can CSS use two classes?</p>
</body>
Zen レポートの定義済みスタイル・クラスの詳細は、以下を参照してください。
定義済みスタイルを使用するかどうかにかかわらず、<class> 要素を使用してカスタム・スタイル・クラスを定義し、class 属性を使用して Zen レポートの要素に適用できます。
CSS スタイルの条件付き適用
表示要素の最も単純なスタイル属性は、style です。これにより、表示要素に適用する CSS スタイルのセミコロン区切りのリストを指定します。
表示要素は、スタイルのリストを定義するための条件のリストを定義することが可能です。selectstylecond 属性は、ObjectScript 式のコンマ区切りのリストです。これらの式には、プライベート変数を記述することはできませんが、特殊変数 %report を使用してレポート・クラスを指定したり、%report にドット構文を使用して Zen レポート・クラスのプロパティを参照したりすることができます。実行時、selectstylecond 式が左から右へ評価されます。selectstylecond の最初の True の条件と一致する selectstylelist のスタイルが、表示要素に適用されます。
次の例は、Month プロパティの値が 1、数字が赤、それ以外の場合は黄色である場合です。
<item special="number" width="75%"
selectstylecond="%report.Month=1,1" selectstylelist=
"border:none;padding-right:4px;color:red,padding-right:4px;color:yellow"/>
上記の例では、以下の 3 つの異なる区切り記号が使用されています。
-
コンマ (,) を使用して、Zen レポートの selectstylelist リストのエントリを区切っています。selectstylelist の各エントリは、CSS スタイル定義のリストで構成します。
-
セミコロン (;) を使用して、同じ Zen レポートの selectstylelist リストにある CSS スタイル定義のエントリを区切っています。各エントリは、CSS スタイルの名前とその値で構成します。
-
コロン (:) を使用して、各 CSS スタイルの名前と値を区切っています。
スタイル属性で指定した情報は、class で指定したスタイル情報よりも優先します。
レポートを起動する URI で ZENURL として渡されたプロパティ値に依存するように selectstylelist リストで %report を使用する場合、XSLT 処理をブラウザで行うと、予測できない結果となることがあります。この問題の詳細は、“URI による Zen レポート・クラスのプロパティの設定” を参照してください。
<barcode>
Zen レポートでは、Barcode4J によるバーコードの生成がサポートされます。バーコード・サポートは、Caché に用意された FOP レンダリング・エンジンによって提供され、これには、barcode4j-fop-ext-complete.jar ファイルがインストールされています。Zen レポートでは、HTML または RenderX PDF レンダリング・エンジンに対するバーコード表示をサポートしていません。
以下のコードで示されるように、レポートの XData ReportDisplay セクションの本文にバーコード要素を簡単に追加できます。
<body>
<barcode value="hello world"/>
</body>
より実際的な例では、データベースからのデータの使用が必要になります。以下の XData ReportDefinition が指定されます。
<report xmlns="http://www.intersystems.com/zen/report/definition"
name="MyReport" sql="Select top 10 Name From Sample.Person">
<group name="Person">
<!-- commas are not valid in barcode code39 -->
<attribute field="Name" name="name"
expression='$replace(%val,","," ")'/>
</group>
</report>
この XData ReportDisplay では、各名前とその名前に対応するバーコードが出力されます。
<report xmlns="http://www.intersystems.com/zen/report/display"
name="MyReport">
<body>
<table group="Person">
<item field="@name" />
<barcode field="@name" />
</table>
</body>
</report>
以下のコード・サンプルでは、同じ XData ReportDefinition を使用して、<barcodeOptions> の使用方法を示します。
<report xmlns="http://www.intersystems.com/zen/report/display"
name="MyReport">
<body>
<table group="Person">
<item field="@name" />
<barcode field="@name" barcodeType="code128">
<barcodeOptions>
<barcode:height>8mm</barcode:height>
<barcode:module-width>0.6mm</barcode:module-width>
</barcodeOptions>
</barcode>
</table>
</body>
</report>
<barcode> には以下の属性があります。
属性 | 説明 |
---|---|
表示の条件式 | <block> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。 |
表示属性 | style、width、class などの属性の説明は、この章の冒頭の “レポートの表示属性” のセクションを参照してください。 |
barcodeNamespacePrefix |
http://barcode4j.krysalis.org/nsOpens in a new tab ネームスペース内の BarCode4J バーコード要素に対するネームスペース接頭語。 |
barcodeOrientation |
出力されたバーコードの向きを指定します。使用可能な値は、0、90、-90、180、-180、270 および -270 で、既定値は 0 です。 |
barcodeType |
このバーコードのタイプ。バーコード・タイプの詳細は、http://barcode4j.sourceforge.net/2.1/barcode-xml.htmlOpens in a new tab を参照してください。 |
field |
情報を指定する XPath 式がバーコードに表示されます。NULL の場合は、value にバーコード・メッセージを指定できます。 |
htmlErrorMessage |
バーコードのプレースホルダとして、HTML 出力内で使用できるテキスト・メッセージ。初期値は、“Barcode elements are only supported in PDF output.” です。 この属性に普通のテキストを入力できる場合でも、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が与えられます。 “Zen レポート属性のデータ型” を参照してください。 |
value |
バーコードに表示される情報は、field が NULL の場合のみ使用されます。 |
<barcodeOptions>
<barcodeOptions> 要素によってバーコードのオプションを指定できます。これには、<write> 要素と同じ構文が含まれます。以下の例では、CDATA の使用方法に注意してください。
<barcodeOptions>
<barcode:height>8mm</barcode:height>
<barcode:module-width>0.6mm</barcode:module-width>
</barcodeOptions>
<barcodeOptions> には以下の属性があります。
属性 | 説明 |
---|---|
表示の条件式 | <block> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。 |
表示属性 | style、width、class などの属性の説明は、この章の冒頭の “レポートの表示属性” のセクションを参照してください。 |
XMLEscape |
バーコードに XML エスケープを使用するかどうかを指定します。<barcodeOptions> が true の場合は、<barcodeOptions> コンテンツが CDATA 構文に囲まれ、false の場合は囲まれません。 この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。 |
特定の barcodeType に <barcodeOptions> を書き込む場合、sourceforge.netOpens in a new tab で Barcode4j ドキュメントOpens in a new tabを参照してください。
<block>
<block> 要素は、そのすべての子要素を順番に表示します。出力は、XHTML では <span>、XSL-FO では <inline> になります。これは、<report> の任意の位置で使用できますが、<table> の中でコンテナとして使用すると最も便利です。通常、<table> ではすべての子要素を新しい行または列として扱うので、複数の要素を 1 行または 1 列にグループ化するには <block> 要素を使用します。<block> に記述できる要素のリストは、この章の冒頭の “Zen レポートのデータの表示” を参照してください。
<block> には以下の属性があります。
属性 | 説明 |
---|---|
表示の条件式 | <block> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。 |
表示属性 | style、width、class などの属性の説明は、この章の冒頭の “レポートの表示属性” のセクションを参照してください。 |
caption |
(オプション) このブロックのキャプション・テキスト。 この属性に普通のテキストを入力できる場合でも、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が与えられます。 “Zen レポート属性のデータ型” を参照してください。 |
id | オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。 |
<bidioverride>
<bidioverride> 要素によって、生成された XSL-FO に <fo:bidi-override> 要素が追加されます。これは、Unicode の双方向アルゴリズムの決定に従ってテキストの向きをオーバーライドし、複数言語のドキュメント内で異なるスクリプトのテキストを適切に表示するために使用されます。
次に例を示します。
<div> <bidioverride direction="rtl" unicode-bidi="bidi-override" >
<inline>Normal text</inline> </bidioverride> </div>
以下のような出力が生成されます。
<bidioverride> の実際の使用方法は、テキストに異なる向きで記述されたテキストを追加したり、ヘブライ語やアラビア語のテキストにヨーロッパ数字を表示したりする方法があります。
<fo:bidi-override> には <fo:block> が含まれないため、<inline> を使用することに注意してください。付録 “生成された XSL-FO と HTML” には、ブロック XSL-FO 出力およびインライン XSL-FO 出力を生成する Zen レポート要素がリストされています。
<bidioverride> には以下の属性があります。
属性 | 説明 |
---|---|
表示の条件式 | <block> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。 |
表示属性 | style、width、class などの属性の説明は、この章の冒頭の “レポートの表示属性” のセクションを参照してください。 |
direction |
テキストの向きを指定します。可能な値:
|
unicode-bidi |
オーバーライドの動作を指定します。可能な値:
|
id | オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。 |
<br/>
<br/> 要素は、現在の要素の中に改行を挿入します。この要素の正しい構文は XHTML 構文であり、要素を閉じる山括弧の前にスラッシュ文字を置くことによってその要素が有効な XML になります。
以下は正しい例です。
<br/>
以下は誤った例です。
<br>
以下の例では、<item> の <caption> の中に改行が挿入されます。
<item field="EAST" formatNumber='###,###,###,###,###,###,###'>
<caption multiline="true">
<inline>
EAST
</inline>
<br/>
<inline>
WEST
</inline>
</caption>
</item>
<container>
<container> 要素は、他のコンテンツのコンテナとして機能します。<container> には背景イメージを割り当てることができ、そのイメージは <container> のコンテンツの背景にタイル表示されます。複数の <container> 要素をページに指定できるほか、<container> 要素を入れ子にすることもできます。
<container> 要素は、フォームのフィールドを表すイメージ上にテキストを重ねて、事前に印刷したフォームのようなレポートを作成する場合に役立ちます。また、<container> を使用して、レポートのページ全体に “社外秘” や “草案” などの透かしを入れることもできます。
以下の例では、imagetest グループにある person ごとに 1 行の <list> を出力します。各出力行には、該当する個人の Name の値が記述されています。この例では、<container> によってレポートのリストの背後に barchartblue.png イメージがタイル表示されて、<list> 出力の背景になります。
<report xmlns="http://www.intersystems.com/zen/report/display"
name="imagetest">
<body>
<container backgroundImage="barchartblue.png" >
<list group="person">
<item field="Name"/>
</list>
</container>
</body>
</report>
既定では、コンテナ領域の左上角を起点として左から右に背景イメージをタイル表示し、これを上から下に向かって繰り返して、イメージとコンテナ領域の相対的なサイズに基づいて可能な範囲の幅と高さに描画します。XHTML および PDF では、イメージの反復と配置のスタイルを変更できます。それには、以下の例のように、“レポートの表示属性” の style、htmlstyle、および xslfostyle を <container> に適用します。また、この例では、同じ 1 つのレポート・ページでコンテナを入れ子にして使用する際の規約についても示しています。
この例では、属性の値に改行を追加して、ドキュメント・ページのコードを見やすくしています。実際のコードでは、このような改行は使用しません。
<group name="SalesRep" pagebreak="true">
<container
backgroundImage="ssmocreport.png"
style="width:9.47in;height:7.76in;background-repeat:no-repeat;
margin-top:0cm;margin-bottom:0cm;margin-left:0cm;
margin-right:0cm;padding-top:0cm;padding-bottom:0cm;
padding-left:0cm;padding-right:0cm;
background-position:top left;" >
<container
style="font-size:.5in;margin-top:0cm;margin-bottom:0cm;
margin-left:0cm;margin-right:0cm;padding-top:0cm;
padding-bottom:0cm;padding-left:0cm;padding-right:0cm;"
htmlstyle="top:5.2in;left:4in;position:relative"
xslfostyle="top:4.8in;left:3in;absolute-position:absolute">
<p field="@name">
Hi there!
</p>
</container>
</container>
</group>
PDF 出力を正しく生成するには、<container> の中で指定する要素を何らかのブロックとする必要があります。<p>、<list>、<table> などの複雑な要素はブロックですが、<item> のような単純な要素はブロックではありません。そのため、<container> にある単独の <item> を出力する場合は、そのコンテナとなるブロックを使用する必要があります。簡単な方法としては、<container> と <item> の間に <div> を挿入します。以下はその例です。
<report xmlns="http://www.intersystems.com/zen/report/display"
name="imagetest">
<body>
<container backgroundImage="barchartblue.png" >
<div>
<item field="grandTotal"/>
</div>
</container>
</body>
</report>
<container> では、以下の属性がサポートされています。
属性 | 説明 |
---|---|
表示の条件式 | <img> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。 |
表示属性 | style、width、class などの属性の説明は、この章の冒頭の “レポートの表示属性” のセクションを参照してください。 |
backgroundImage |
背景イメージのソース・ファイルの URI。URI は、現在のネームスペース内のアプリケーション用のサポート・ファイルを CSP が格納するサブディレクトリを基準としています。Zen レポートが存在するネームスペースの名前が myNameSpace であると仮定します。次に、イメージが格納されることが予期される Caché インストール・ディレクトリの下に、/csp/mynamespace というサブディレクトリがあると仮定します。以下のように指定するとします。 <img src="images/myPic.png" /> Zen レポート・クラスは、myPic.png ファイルを Caché インストール・ディレクトリの下の /csp/mynamespace/images サブディレクトリ内で検索します。 先頭に感嘆符が付いている backgroundImage 属性の値は、<item> 要素の field 属性の場合と同様、XPath 式として解釈されます。これにより、XML データの中で動的に URI を生成し、これらのカスタマイズした URI をイメージ・ソースとして使用できるようになります。イメージの URI を動的に生成するために ! (感嘆符) を使用する場合、その文字列では絶対 URI を指定する必要があります。指定しないと、PDF レポートに表示されません。 組み込みの FOP には、.jpg 形式のイメージ・ファイルのレンダリングによって問題が発生するおそれがあります。問題を避けるためには、.png 形式のファイルを使用します。 |
caption |
(オプション) このコンテナのキャプション・テキスト。 この属性に普通のテキストを入力できる場合でも、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が与えられます。 “Zen レポート属性のデータ型” を参照してください。 |
height | レポートの中でコンテナを表示する領域を指定する、HTML の長さの値。既定では、コンテナのコンテンツがこの領域全体に出力されます。 |
id | オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。 |
width | コンテナの幅を指定する、HTML の長さの値。既定では、コンテナのコンテンツがこの領域全体に出力されます。 |
writing-mode |
生成された XSL-FO の <fo:page-sequence> 要素に writing-mode 属性を追加します。writing-mode では、テキストを記述する方向に関連するページ・レイアウト機能を制御します。writing-mode 属性の詳細は、“書き込みモード” のセクションを参照してください。 可能な値は以下のとおりです。
すべての XSL-FO レンダラがすべての指定可能な値をサポートしているわけではありません。 |
<div>
<div> 要素を使用すると、複数の要素をレポート出力の 1 つのブロックにグループ化できます。これは、ブロックを境界線で囲むなど、ブロック全体に特定のスタイルを適用する場合に便利です。出力は、XHTML では <div>、XSL-FO では <block> になります。Zen レポートの <div> 要素の中に記述できる要素のリストは、この章の冒頭の “Zen レポートのデータの表示” を参照してください。
以下の例では、黒い境界線で囲んだブロックにテーブルを表示するために、境界線スタイルを定義しています。<div> をテーブルで使用すると、テーブルの中に境界線で囲んだ領域を定義し、そこに別のテーブルを表示できます。
<div style="border-style:solid;border-width:4px" >
<p style="text-align:center;text-decoration:underline">
"Current Address Data"
</p>
<table orient="row" class="subtable">
<item field="@patient_add_street_1" class="subtable" defaultWidth="none" >
<caption value="Street(1):" class="subtable" defaultWidth="none"/>
</item>
<item field="@patient_add_street_2" class="subtable" defaultWidth="none">
<caption value="Street(2):" class="subtable" defaultWidth="none"/>
</item>
</table>
</div>
<div> には以下の属性があります。
属性 | 説明 |
---|---|
表示の条件式 | <div> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。 |
表示属性 | style、width、class などの属性の説明は、この章の冒頭の “レポートの表示属性” のセクションを参照してください。 |
id | オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。 |
linefeed-treatment |
XSL-FO プロパティ linefeed-treatment をサポートします。詳細は、このテーブルの後に示す説明を参照してください。可能な値は以下のとおりです。
詳細は、このテーブルの後に示す説明を参照してください。 |
linefeed-treatment 値の “preserve” を使用して、PDF 出力の生成時に改行文字をソース・データに保持できます。以下の要素が ReportDefinition にある場合
<element
name='Finding'
expression=
'"AAA"_$C(13,10)_" "_$C(13,10)_"BBB"_$C(13,10)_" "_$C(13,10)_" "_$C(13,10)_"CCC"_$C(13,10)'
/>
以下の例では linefeed-treatment を ReportDisplay で使用してアイテムを出力し、改行文字を保持します。
<item
field="Finding" width="2.65in"
linefeed-treatment="preserve">
<caption value="Finding"/>
</item>
breakOnLineFeed="true" を linefeed-treatment="preserve" と組み合わせて使用することはできません。
<group>
XData ReportDisplay ブロックで <group> 要素を使用すると、XML で多用する階層構造のデータを、Zen レポート・クラスに対応付けて扱うことができます。
<group> は、XData ReportDisplay で以下の属性を持ちます。
属性 | 説明 |
---|---|
表示の条件式 | <group> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。 |
表示属性 | style、width、class などの属性の説明は、この章の冒頭の “レポートの表示属性” のセクションを参照してください。 |
breakCheck |
レポートに改ページを追加するかどうかを決めるために使用する条件を指定する XPath 式。 |
caption |
(オプション) このグループのキャプション・テキスト。 この属性に普通のテキストを入力できる場合でも、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が与えられます。 “Zen レポート属性のデータ型” を参照してください。 |
id | オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。 |
line |
グループの繰り返しごとにグループの間に描画する線の太さを指定する、HTML の長さの値。 line が 0 の場合、線は描画されません。 "2in"、"5cm"、"12px"、"14pt"、"3em"、または "75%" は、すべて HTML の長さの値として使用可能な形式です。パーセント (%) は、width 属性を使用している要素のコンテナを基準とします。 |
name |
必須項目。XML データ・ソースにあるグループの中から、目的の表示部分のデータを提供するグループを指定する XPath 式。 このデータが表示上でどのように処理されるかは、<group> コンテナにある要素によって決まります。<group> には、<body> と同じ要素を記述できます。この章 “Zen レポートのデータの表示” の冒頭の要素リストを参照してください。 <group> 要素は入れ子にできます。XML データに <SalesRep> 要素がある場合、XData ReportDisplay ブロックには以下を記述できます。 <group name="SalesRep">...</group> また、<SalesRep> 要素それぞれに複数の <sale> 要素があるとします。営業担当者ごとにその売り上げをどのように表示するかを指定するには、以下のようにします。 <group name="SalesRep"> <group name="sales"> ... </group> ... </group> グループをテーブルとして表示するには、"<table>" の "group 属性" を参照してください。 |
pagebreak |
True の場合、グループの繰り返しごとに改ページが挿入されます。 この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。 |
pagebreakBefore |
True の場合、グループの繰り返し前に改ページが挿入されます。 この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。 |
primaryGroup |
True の場合、<report> の primaryGroup 属性によって設定されたプライマリ・グループを処理しているグループを特定します。 この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。 |
removeEmpty |
XData ReportDisplay ブロックで removeEmpty 属性を指定することで、レポートのこの <group> によって生成された XHTML 出力または PDF 出力に、このレポートの XML データ内で検出された空の要素や属性が表示されるようにするかどうかを制御します。removeEmpty には以下のいずれかの値を設定できます。
この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。 |
separator |
表示される項目を区切るために使用します。以下の値のいずれかを指定できます。
|
small-multiple |
グループのコンテンツをスモール・マルチプルとして出力する場合に使用します。
|
small-multiple-name |
スモール・マルチプルの名前。small-multiple と一緒に使用します。 |
testEachifxpath |
レポートに要素を含めるかどうかを決めるためにグループの各要素に適用する条件を指定する XPath。primaryGroup を使用していない場合に使用されます。 |
<header> と <footer>
<header> と <footer> 要素は単純なコンテナです。その主な目的は、レポート内のスタイルの伝播を構成することです。<header> および <footer> の各要素は、その子に自身の class 属性の値を付与できます。
<header> および <footer> では、次のテーブルで示す属性がサポートされています。
属性 | 説明 |
---|---|
表示の条件式 | <header> 要素または <footer> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。 |
表示属性 | style、width、class などの属性の説明は、この章の冒頭の “レポートの表示属性” のセクションを参照してください。 |
foStyle |
PDF の生成用に、XSL-FO のスタイルを定義できるようにします。Zen レポートの XData ReportDisplay ブロック内の以下のエントリは、 <header foStyle="font-family='Arial' font-size='14pt'"> レポート用に生成された XSL-FO スタイルシートに、以下の出力を生成します。 <fo:block font-family="Arial" font-size="14pt"> この属性は、XHTML 形式の出力には適用できません。 |
id | オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。 |
<img>
<img> 要素は、レポートにイメージを挿入します。<img> には以下の属性があります。
属性 | 説明 |
---|---|
表示の条件式 | <img> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。 |
表示属性 | style、width、class などの属性の説明は、この章の冒頭の “レポートの表示属性” のセクションを参照してください。 |
caption |
(オプション) このイメージのキャプション・テキスト。 この属性に普通のテキストを入力できる場合でも、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が与えられます。 “Zen レポート属性のデータ型” を参照してください。 |
contentHeight |
イメージの実際の高さを指定する、HTML の長さの値。PDF 出力では、contentHeight には、レポート内のイメージを表示する領域に指定した height とは異なる値を指定できます。 "2in"、"5cm"、"12px"、"14pt"、"3em"、または "75%" は、すべて HTML の長さの値として使用可能な形式です。パーセント (%) は、width 属性を使用している要素のコンテナを基準とします。 |
contentType |
PDF 出力の場合、contentType は、データベースからストリームとして提供するイメージの MIME コンテンツ・タイプの指定に必要です。以下はその例です。 <img src="!test" contentType="content-type:image/jpg"/> イメージをストリームとして提供する操作の詳細は、このテーブルの後の説明を参照してください。 |
contentWidth | イメージの実際の幅を指定する、HTML の長さの値。PDF 出力では、contentWidth には、イメージを表示する領域に指定した width とは異なる値を指定できます。 |
height | レポートのイメージを表示する領域を指定する、HTML の長さの値。既定では、イメージ・コンテンツがこの領域に出力されます。 |
id | オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。 |
src |
イメージのソース・ファイルの URI。URI は、現在のネームスペース内のアプリケーション用のサポート・ファイルを CSP が格納するサブディレクトリを基準としています。Zen レポートが存在するネームスペースの名前が myNameSpace であると仮定します。次に、イメージが格納されることが予期される Caché インストール・ディレクトリの下に、/csp/mynamespace というサブディレクトリがあると仮定します。以下のように指定した場合、 <img src="images/myPic.png" /> Zen レポート・クラスは、myPic.png ファイルを Caché インストール・ディレクトリの下の /csp/mynamespace/images サブディレクトリ内で検索します。 先頭に感嘆符が付いている src 属性の値は、<item> 要素の field 属性の場合と同様、XPath 式として解釈されます。これにより、XML データの中で動的に URI を生成し、これらのカスタマイズした URI をイメージ・ソースとして使用できるようになります。イメージの URI を動的に生成するために ! (感嘆符) を使用する場合、その文字列では絶対 URI を指定する必要があります。指定しないと、PDF レポートに表示されません。 |
width | イメージの幅を指定する、HTML の長さの値。既定では、イメージ・コンテンツがこの領域に出力されます。 |
以下の例では、データベースに格納されているストリームを取得して、Zen レポートでイメージとして使用する方法を示しています。XData ReportDefinition で、レポートに使用するデータのストリームを参照する <element> または <attribute> を指定します。この参照では、expression で cookie を用意して、パラメータを共有する必要があります。この expression 値は、実際には 1 行で記述しますが、ここでは読みやすくするために数行で表しています。
XData ReportDefinition
[ XMLNamespace = "http://www.intersystems.com/zen/report/definition" ]
{
<report xmlns="http://www.intersystems.com/zen/report/definition"
name="streamtest" sql="select * from mine.myStream">
<group name="group">
<element name="test" field="ID"
expression='"http://localhost:57777/csp/samples/%25CSP.StreamServer.cls?
STREAMOID="_..Encrypt(##class(mine.myStream).%OpenId(%val).myStream.%Oid())_"
&CSPCHD="_%session.CSPSessionCookie_"&CSPSHARE=1"'
/>
</group>
</report>
}
例の続きとして、以下の XData ReportDisplay では、上記の XData ReportDisplay で得られたイメージ・ストリーム・データを参照しています。このレポートから PDF 出力を生成する場合は、contentType 値を指定する必要があります。
XData ReportDisplay
[ XMLNamespace = "http://www.intersystems.com/zen/report/display" ]
{
<report xmlns="http://www.intersystems.com/zen/report/display"
name="streamtest">
<body>
<group name="group">
<img src="!test" contentType="content-type:image/jpg" />
</group>
</body>
</report>
}
<inline>
<inline> 要素は、さまざまなスタイルのテキストを表示するための単一行が必要な場合に便利です。以下に例を示します。ここでは、インライン・コンテンツの最後で強制改行するために <br/> を使用しています。
<inline>This is a test of </inline>
<inline style="font-size:14pt">14 point text</inline>
<br/>
<inline> 要素は、別の要素の中で自由に入れ子にすることはできません。表示要素では、子を含むことができるほか、テキストのみを記述可能な要素を表示できます。<inline> は、<pageheader>、<pagefooter>、<pagestartsidebar>、<pageendsidebar>、<body>、<block>、<group>、または <bidioverride> の子としてのみ表示できます。<inline> は、<link>、<inline>、<p>、または <write> などのコンテンツ要素の子としては表示できません。
<inline> には以下の属性があります。中でも、style 属性が <inline> で最も重要です。
属性 | 説明 |
---|---|
表示の条件式 | <item> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。 |
値の条件式 | <item> 要素の値を条件付きで表示できる expression 属性と if 属性の詳細は、“値を表示するための条件式” のセクションを参照してください。“ ” |
bidi-override-direction |
インライン・テキストの双方向オーバーライドの方向を設定します。指定可能な値は、"rtl” および “ltr" です。既定は “ltr" です。<p> でもサポートされています。 双方向のテキストの詳細は、"<bidioverride>" を参照してください。 |
表示属性 |
style 属性を使用して、<inline> 要素内のコンテンツにスタイルを適用します。次に例を示します。 style、width、class などの属性の説明は、この章の冒頭の “レポートの表示属性” のセクションを参照してください。 |
id | オプションの識別子。id を使用すると、<inline> 要素にアクセスしてそのコンテンツをプログラムで変更できます。詳細は、このテーブルの後に示す content プロパティの説明を参照してください。 |
linefeed-treatment |
XSL-FO プロパティ linefeed-treatment をサポートします。詳細は、"<div>" のセクションの末尾にある説明を参照してください。 |
<inline> 要素は、Zen レポート・クラス %ZEN.Report.Display.inlineOpens in a new tab の XML プロジェクションです。オンラインのクラスリファレンス情報でこのクラスについて参照すると、content というプロパティが含まれていることがわかります。Zen では、ここに XData ReportDisplay の <inline> 要素と </inline> 要素の間に置いたテキストが格納されます。レポートを表示する前にサーバ側で <inline> 要素のテキストをプログラムで変更する必要がある場合は、クラス・メソッドの %GetComponentById(id) を呼び出して、%ZEN.Report.Display.inlineOpens in a new tab オブジェクトへのポインタを取得します。これにより、必要に応じてこのオブジェクトの content プロパティにアクセスして、その値を変更できます。
content プロパティをプログラムで操作する場合は、このテキスト文字列に、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が実際に含まれるように留意してください。 “Zen レポート属性のデータ型” を参照してください。
<inlinecontainer>
<inlinecontainer> 要素によって、生成された XSL-FO に <fo:inline-container> 要素が追加されます。 これによって、現在有効な writing-mode をオーバーライドする属性を記述できます。<inline> 要素が表示されている場合でも、これには、<fo:block> 要素を記述する必要があります。付録 “生成された XSL-FO と HTML” には、ブロック XSL-FO 出力およびインライン XSL-FO 出力を生成する Zen レポート要素がリストされています。
次に例を示します。
<inlinecontainer writing-mode="lr">
<div><p>123</p></div> </inlinecontainer>
<inlinecontainer> 要素には以下の属性があります。
属性 | 説明 |
---|---|
表示の条件式 | <item> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。 |
値の条件式 | <item> 要素の値を条件付きで表示できる expression 属性と if 属性の詳細は、“値を表示するための条件式” のセクションを参照してください。“ ” |
表示属性 |
style 属性を使用して、<inline> 要素内のコンテンツにスタイルを適用します。以下はその例です。 <inline style="font-size:14pt">14 Point Text</inline> style、width、class などの属性の説明は、この章の冒頭の “レポートの表示属性” のセクションを参照してください。 |
id | オプションの識別子。id を使用すると、<inline> 要素にアクセスしてそのコンテンツをプログラムで変更できます。詳細は、このテーブルの後に示す content プロパティの説明を参照してください。 |
writing-mode |
生成された XSL の <fo:page-sequence> 要素に writing-mode 属性を追加します。writing-mode では、テキストを記述する方向に関連するページ・レイアウト機能を制御します。writing-mode 属性の詳細は、“書き込みモード” のセクションを参照してください。 可能な値は以下のとおりです。
すべての XSL-FO レンダラがすべての指定可能な値をサポートしているわけではありません。 |
<item>
<item> 要素は、XML からレポートにリテラル値またはデータを出力します。<item> では、属性 field、special、または value のうち 1 つしか出力できないため、いずれか 1 つを指定することをお勧めします。これらの属性間での相互作用、および expression 属性との相互作用の詳細は、“値を表示するための条件式” のセクションを参照してください。“ ”
<item> には以下の属性があります。
属性 | 説明 |
---|---|
表示の条件式 | <item> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。 |
値の条件式 | <item> 要素の値を条件付きで表示できる expression 属性と if 属性の詳細は、“値を表示するための条件式” のセクションを参照してください。 |
表示属性 | style、width、class などの属性の説明は、この章の冒頭の “レポートの表示属性” のセクションを参照してください。 |
クロス集計テーブルの属性 | この特殊タイプのテーブルの作成に使用する属性の詳細は、"タイプ 2 クロス集計テーブルの作成" を参照してください。 |
appendToZenLastPage | 総ページ数を計算するために、Zen レポートは、最終ページ・マーカを生成します。複数の独立した番号セクションを持つレポートは、事実上複数の ‘最終‘ ページがあります。special 属性を使用してページ番号を追加する場合は、この属性を使用して、項目を含むセクションに一意の最終ページ・マーカを生成する値を指定する必要があります。これを <body> の属性 appendIdToZenLastPage と共に使用します。この値は、appendIdToZenLastPage に指定される id の値と一致する必要があります。
appendToZenLastPage 属性の使用の詳細は、"マルチセクション・レポートのページ番号付け" のセクションを参照してください。 |
breakOnLineFeed | breakOnLineFeed が True の場合、要素のデータに記述された改行は、PDF 出力では改行に表示されます。改行は、属性値の中では保持もサポートもされません。XML 要素のテキスト・コンテンツの中でのみ、有効です。
breakOnLineFeed が False の場合、通常の XML 処理同様に、改行は空白として処理され、無視されます。breakOnLineFeed の既定値は False です。 literalSpaces も参照してください。 この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。 |
call | 実行する <xsl:template> の名前。テンプレートは、同じ Zen レポート・クラスの AllXslt、HtmlXslt、または XslFoXslt という XData ブロックで定義する必要があります。このテーブルの paramNames と params、および “項目のレンダリング時の XSLT テンプレートの呼び出し” のセクションを参照してください。 |
caption | (オプション) この項目のキャプション・テキスト。displayCaption を参照してください。この属性に普通のテキストを入力できる場合でも、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が与えられます。 “Zen レポート属性のデータ型” を参照してください。 |
copyxml | True の場合、この <item> の field の値は、<xsl:copy-of> 処理の入力とする XPath として解釈されます。False の場合、field の値は、<xsl:value-of> 処理の入力とする XPath として解釈されます。
この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。 |
displayCaption | True の場合、caption のテキストが出力項目の接頭語になります。詳細は、<caption> を参照してください。
この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。 |
field |
field 属性を指定すると、<item> によって XML データにそのフィールドの値が表示されます。詳細は、"field" のセクションを参照してください。 |
fieldname | テーブルで sql または queryClass、および queryName を使用してデータを収集する場合、fieldname 属性の使用により、sql 属性のデータ・フィールドを指定するか、もしくは名前によってクエリを指定することができます。“クラス・クエリからのテーブル作成” および “SQL を使用したテーブル作成” のセクションを参照してください。 |
fieldnum | テーブルで sql または queryClass、および queryName を使用してデータを収集する場合、fieldnum 属性の使用により、sql 属性のデータ・フィールドを指定するか、もしくは番号によってクエリを指定することができます。また、コールバック・メソッドによりテーブルに返されるデータのフィールドを指定するためにも使用されます。“コールバック・メソッドを使用したテーブル作成” を参照してください。 |
formatNumber | 数に使用する形式を指定する文字列。この文字列には、XSLT の format-number 関数と同じ規約を適用します。例えば、小数点以下 1 桁を持つ 3 桁の数字には、###.# を使用します。call を使用して <item> の値を取得する場合、formatNumber 属性を使用して結果をフォーマットすることはできません。代わりに、call 属性で参照している <xsl:template> の中で XSLT の format-number 関数を使用します。詳細は、“項目のレンダリング時の XSLT テンプレートの呼び出し” のセクションを参照してください。 |
id | オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。 |
insert-zero-width-spaces |
<item> のコンテンツでテキストの折り返しを有効にするには、以下の例のようにこの属性を True に設定します。 <item field="@BedCode" width=".25in" insert-zero-width-spaces="true"/> insert-zero-width-spaces を True に設定すると、<item> のコンテンツでは、最後の文字を除く文字の後ろに 1 文字おきに長さゼロの非表示スペースが挿入されます。これにより、FOP レンダリング・エンジンおよび XEP レンダリング・エンジンでは、これらのスペースを探し出して、表示列の中でデータを折り返す処理に使用できます。 True に設定していない既定の場合、FOP ではテキストが隣の列にはみ出し、XEP では領域に収まるようにデータの文字が縮小されます。いずれの既定でも、テキストが読みにくくなる可能性があります。 この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。 |
linefeed-treatment | XSL-FO プロパティ linefeed-treatment をサポートします。詳細は、"<div>" のセクションを参照してください。 |
link |
項目のデータの周囲に記述するオプションのハイパーリンク。 先頭に感嘆符が付いた link 属性は、field 属性の場合と同様、XPath 式と解釈されます。これにより、XML データの中で動的に URI を生成し、これらのカスタマイズした URI を表示に使用できるようになります。 以下は、有効な If 構文の例です。 <item value="click to open" link='!concat("MyApp.EmpDetails.cls?ID=",@id)'/> concat などの XPath 関数への文字列引数を一重引用符で囲むことはできません。二重引用符または " エンティティを使用する必要があります。 link を指定した場合は、項目の style クラスで "a" オプションが使用されます。 |
literalSpaces | True の場合、この属性によって、スキップされずにスペースとして表示されるリテラル・スペースが生成されます。改行文字に同様の操作を行う場合、breakOnLineFeed を True に設定します。
この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。 |
paramNames | この <item> のために呼び出す <xsl:template> の <xsl:param> 引数の名前のセミコロン区切りリスト。詳細は、このテーブルの call と params、および “項目のレンダリング時の XSLT テンプレートの呼び出し” のセクションを参照してください。 |
params | この <item> のために呼び出す <xsl:template> で定義された <xsl:param> 引数に値を提供する式のセミコロン区切りリスト。これらの式には、リテラル値、ノード・セット、XPath 式、または XSLT 関数呼び出しを使用できます。XSLT の <xsl:with-param> の値として有効な値であれば、params にも使用できます。詳細は、このテーブルの call と paramNames、および “項目のレンダリング時の XSLT テンプレートの呼び出し” のセクションを参照してください。 |
special |
special 属性を指定すると、<item> によって、あらかじめ定義されている動的なデータが表示されます。詳細は、"special" のセクションを参照してください。 |
suppressDuplicates |
テーブルに順番に設定されている重複値を表示するかどうかをコントロールします。詳細は、"suppressDuplicates" のセクションを参照してください。 |
suppressEmpty | suppressEmpty は、removeEmpty の代わりに使用できます。removeEmpty は、<table>、<group>、<report> に適用できる属性です。removeEmpty を True に設定すると、出力から空の項目が実際に削除されます。これにより、データ・セットの位置が合わなくなることがあります。アプリケーションによっては、これによって致命的なまたは多大な影響が生じる場合があります。
この問題が発生する場合は、それぞれの <item> 要素で suppressEmpty 属性を使用します。suppressEmpty では、空の <item> の代わりに空白のプレースホルダを表示するので、位置が合わなくなることはありません。suppressEmpty は、それが記述された個々の <item> にのみ適用されます。 この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。 |
value | value 属性を指定すると、<item> ではそれがリテラル値として表示されます。この属性に普通のテキストを入力できる場合でも、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が与えられます。“Zen レポート属性のデータ型” を参照してください。field 属性や special 属性と value 属性との相互作用、およびこれらの属性と expression 属性との相互作用の詳細は、“値を表示するための条件式” のセクションを参照してください。 |
以下の属性は、Excel スプレッドシートを displayxlsx モードで生成する場合に使用します。
属性 | 説明 |
---|---|
excelFormula | この集約が生成されたスプレッドシートの Excel 式であることを示します。この値は、集約の type と同等の Excel 式の名前にする必要があります。この属性は、Excel スプレッドシートを displayxlsx モードで生成する場合にのみ使用します。
excelFormula が ReportDefinition で使用される方法の詳細は、"<element>" を参照してください。 |
excelName | Excel 出力の列名を指定します。この属性は、Excel スプレッドシートを displayxlsx モードで生成する場合にのみ使用します。excelName が ReportDefinition で使用される方法の詳細は、"<element>" を参照してください。
excelName 属性ではローカライズがサポートされています。"Zen レポートのローカライズ" を参照してください。 |
excelNumberFormat | 数値の書式を設定する方法を Excel に指示する文字列を指定します。この属性は、Excel スプレッドシートを displayxlsx モードで生成する場合にのみ使用します。
excelNumberFormat が ReportDefinition で使用される方法の詳細は、"<element>" を参照してください。 |
isExcelAggregate | この項目が Excel 集約を生成することを示します。Excel 出力で集約を表示するには、レポートで AGGREGATETAG パラメータを設定する必要があります。この属性は、Excel スプレッドシートを displayxlsx モードで生成する場合にのみ使用します。
この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。“Zen レポート属性のデータ型” を参照してください。 |
isExcelNumber |
既定では、<item> によって指定された値は、生成された Excel スプレッドシートのテキストとして解釈されます。属性 isExcelNumber="true" を設定すると、この値は、Excel の数値として解釈されます。Excel がこの値を数値として解釈できない場合、生成されたスプレッドシートを Excel で開こうとすると、エラーが表示されます。この属性は、Excel スプレッドシートを displayxlsx モードで生成する場合にのみ使用します。isExcelNumber が ReportDefinition で使用される方法の詳細は、"<element>" を参照してください。 |
xmlname | 中間 XML でこの項目から生成されたタグの名前を指定します。既定のタグ名は、<item> です。カスタム・タグ名にすると、デバッグに便利な場合があります。この属性は、Excel スプレッドシートを displayxlsx モードで生成する場合にのみ使用します。“後で表示するための中間ファイルの保存” を参照してください。 |
field
field 属性は XPath 式として使用されます。例として、以下のデータがあると仮定します。
<SalesRep id="1"><customer>MegaPlex Systems</customer></SalesRep>
ここで、id 属性の値を取得するには、以下の XPath 式が必要です。
field= "@id"
一方、<customer> 要素の値を取得するには、以下の XPath 式が必要です。
field="customer"
field 属性は、一致する現在の <group> について解釈されます。<group name="SalesRep"> に記述する <item> については、<SalesRep> 属性および <SalesRep> の子のみを使用できます。
special 属性や value 属性と field 属性との相互作用、およびこれらの属性と expression 属性との相互作用の詳細は、“値を表示するための条件式” のセクションを参照してください。“ ”
special
special 属性には以下の値を指定できます。
-
number — グループ内でのレコード番号を表します。
-
page-number — PDF レポートにページ番号を挿入します。XHTML では '##' と表示されます。
-
page-count — PDF レポートにページ数を挿入します。XHTML では '##' と表示されます。
-
page-number-of — ページ番号を '2 of 18' の形式で挿入します。XHTML では '## of ##' と表示されます。
-
page-number-/ — ページ番号を '2/18' の形式で挿入します。XHTML では '##/##' と表示されます。
special の最後の 3 つの値によって、<item> の field 属性で定義された XPath 値に基づく最終ページ・マーカ ID を動的に生成できます。<body> の属性 genLastPageIdOn を設定している場合は、最終ページ・マーカを動的に生成する必要があります。
-
page-count-with-xpath — PDF レポートにページ数を挿入します。XHTML では '##' と表示されます。
-
page-number-of-with-xpath — ページ番号を '2 of 18' の形式で挿入します。XHTML では '## of ##' と表示されます。
-
page-number-/-with-xpath — ページ番号を '2/18' の形式で挿入します。XHTML では '##/##' と表示されます。
special 属性の使用の詳細は、"マルチセクション・レポートのページ番号付け" のセクションを参照してください。
ofString
属性 ofString は、'2 of 18' のようなページ番号付け書式で数字と数字の間に使用する文字列を指定します。既定値は、" of " です。
suppressDuplicates
suppressDuplicates を省略した場合、または 0 に設定した場合、<table> に順番に設定されている重複した <item> 値が表示されます。以下はその例です。
Name Sales John Doe $100 John Doe $150 John Doe $345
1 に設定されている場合、<table> 内の重複した <item> は表示されません。以下はその例です。
Name Sales John Doe $100 $150 $345
上記の出力を生成するコードは、以下のようになります。
<table group="SalesPerson" width="6in"
class="table4" altcolor="#DFDFFF">
<item caption="Name" field="Name"
suppressDuplicates="1" />
<item caption="Amount" field="Amount" />
</table>
この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。
マルチセクション・レポートのページ番号付け
総ページ数を計算するために、Zen レポートは、最終ページ・マーカを生成します。レポート内の複数の独立した番号セクションでは、各セクションに最終ページがあり、ページ番号付けを目的として、レポートには複数の最終ページがあります。 レポートの <body> 要素で appendIdToZenLastPage が true に設定されている場合は、レポートで <body> 要素の id 値をセクションの最終ページ・マーカに追加して、一意の最終ページ・マーカを生成します。<item> の属性 special を使用してページ番号とページ数を追加する場合は、appendToZenLastPage を使用して、項目を含むセクションの最終ページ・マーカを識別します。したがって、appendToZenLastPage で指定される値は、セクションの <body> 要素の id 値と一致する必要があります。
field 属性および special 属性と value 属性との相互作用、およびそれらと expression 属性との相互作用の詳細は、“値を表示するための条件式” のセクションを参照してください。“ ”
<line>
<line> 要素は、レポートの要素間に改行を挿入します。 実際には、水平方向の線、または空の改行が挿入されます。<line> には以下の属性があります。
属性 | 説明 |
---|---|
表示の条件式 | <line> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。 |
表示属性 | style、width、class などの属性の説明は、この章の冒頭の “レポートの表示属性” のセクションを参照してください。 |
align | レポートのページ内での配置です。指定できる値は、"left"、"right"、および "center" です。 |
caption |
(オプション) この行のキャプション・テキスト。 この属性に普通のテキストを入力できる場合でも、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が与えられます。 “Zen レポート属性のデータ型” を参照してください。 |
color | 線の色を指定する CSS カラー値。color は、実線または点線にのみ適用されます。 |
count | 描画する改行の数。これは <line> 要素を繰り返すことと同じです。 |
id | オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。 |
length |
線の長さを指定する、HTML の長さの値。length は、実線または点線にのみ適用されます。 "2in"、"5cm"、"12px"、"14pt"、"3em"、または "75%" は、すべて HTML の長さの値として使用可能な形式です。パーセント (%) は、width 属性を使用している要素のコンテナを基準とします。 |
lineHeight |
線を表示する際に確保する縦方向のスペースを指定する、HTML の長さの値。これは、pattern が "solid" または "dashed" のときの線の thickness のことではありません。lineHeight は、"空" の線にも適用されます。 この属性を使用している場合でも、XHTML と XSL-FO (つまり、PDF) では、線の間隔は異なります。これをオーバーライドするには、<fo> 要素と <html> 要素を使用します。 |
pattern | 指定できる値は、"empty"、"solid"、および "dashed" です。 |
thickness | 線の太さを指定する、HTML の長さの値。既定値は 1px です。thickness は、実線または点線にのみ適用されます。 |
<link>
<link> 要素の destination の値でオンライン・リソースを指定しておくと、そのリンクをクリックしたユーザはそのリソースを表示できます。リンク・キャプションを指定するには、レポートの <link> 要素と </link> 要素の間にキャプションのテキストを記述します。
<link> 要素の重要な用途は、1 つの XHTML レポートを別の XHTML レポートにリンクできるようにすることです。これを利用することで、サブレポートの効果が得られます。以下はその例です。
<link
destination='concat("http://localhost:57779/csp/app/Rpt.EpHist.cls?FACILITY=",
@FACILITY,"&amp;PATID=",@PATID)'>
Episode History
</link>
上記の例では、ある患者に関するレポートに、ラベルとして “Episode History” を指定した <link> を作成しています。このリンクをクリックすると、Rpt.EpHist.cls レポートが呼び出されます。この例は、以下の 2 つの重要な機能を示しています。
-
XSLT 関数 concat() を呼び出して、テキスト断片とデータ値から URI を構成する。
-
ZENURL パラメータである FACILITY および PATID の値として、XPath 式をターゲット・レポート・クラスに渡す。
concat などの XPath 関数への文字列引数を一重引用符で囲むことはできません。二重引用符または " エンティティを使用する必要があります。見慣れない文字列の &amp; にも注意してください。これは、アンパサンド文字をブラウザの URI に渡すために必要です。最初のアンパサンド・エンティティ & は、Zen レポートの XData ブロック処理でアンパサンドに変換されます。そのアンパサンドと直後の amp; を組み合わせて、生成 HTML でアンパサンド・エンティティになり、& としてブラウザで表示されます。
<link> には以下の属性があります。
属性 | 説明 |
---|---|
表示の条件式 | <link> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。 |
表示属性 | style、width、class などの属性の説明は、この章の冒頭の “レポートの表示属性” のセクションを参照してください。 |
destination | リンク先の URI を指定する XPath 式。 |
id | オプションの識別子。id を使用すると、<link> 要素にアクセスしてそのコンテンツをプログラムで変更できます。詳細は、このテーブルの後に示す content プロパティの説明を参照してください。 |
internal |
True の場合、リンク先は現在のページにある要素の id です。internal の値を True に設定すると、HTML 出力ではリンクの先頭に # 文字が追加され、XSL-FO 出力では internal-destination 属性がリンクに割り当てられます。 internal 属性を False または空白に設定した場合や、この属性を指定しなかった場合、リンク先は別のページの URI であると見なされます。 この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。 |
name | リンクの name 属性の値を指定します。これは HTML 出力でのみ使用します。 |
<link> 要素は、Zen レポート・クラスである %ZEN.Report.Display.linkOpens in a new tab の XML プロジェクションです。オンラインのクラスリファレンス情報でこのクラスについて参照すると、content というプロパティが含まれていることがわかります。Zen では、ここに XData ReportDisplay の <link> 要素と </link> 要素の間に置いたテキストが格納されます。レポートを表示する前にサーバ側で <link> 要素のテキストをプログラムで変更する必要がある場合は、クラス・メソッドの %GetComponentById(id) を呼び出して、%ZEN.Report.Display.linkOpens in a new tab オブジェクトへのポインタを取得します。これにより、必要に応じてこのオブジェクトの content プロパティにアクセスして、その値を変更できます。
content プロパティをプログラムで操作する場合は、このテキスト文字列に、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が実際に含まれるように留意してください。 “Zen レポート属性のデータ型” を参照してください。
<list>
<list> 要素は、Zen レポートで箇条書きまたは番号付きリストを表示するために使用します。以下の例では、imagetest グループにある person ごとに 1 行を出力します。この場合、各出力行には、該当する個人の Name の値が記述されています。
<report xmlns="http://www.intersystems.com/zen/report/display"
name="imagetest">
<body>
<list group="person">
<item field="Name"/>
</list>
</body>
</report>
<list> には以下の属性があります。
属性 | 説明 |
---|---|
表示の条件式 | <list> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。 |
表示属性 | style、width、class などの属性の説明は、この章の冒頭の “レポートの表示属性” のセクションを参照してください。<list> 要素では、箇条書きの記号や番号に style 属性が適用されます。 |
group |
必須項目。<list> に group を指定しない場合、リストに表示される項目は 1 つのみとなります。ほとんどのリストでは複数の項目が必要なので、各 <list> に group 属性を指定することが妥当です。このリストで <item> などの要素を 1 つ以上指定して、グループのどのデータをリストに表示するかを特定する必要があります。 一見すると、XData ReportDisplay の <list> で指定する group の値は、XData ReportDefinition の上位レベルにある <group> または <report> で指定した name の値と一致している必要があるように思われます。多くの場合、表面的にはそのとおりです。 しかし、実際のこの規則には興味深い側面があります。group 属性の値は、<list> の親である <report> または <group> を先頭とする暗黙の XPath 式の後に続く、部分的な XPath 式です。つまり、group および field の式は、<report> の階層の中でそれらの上位レベルにある他の group および field の式の後ろに連結されます。これを理解すると、グループやリストをより巧妙に設定して使用できるようになります。 Zen レポートで XPath 式を使用する方法の詳細は、“group、field、および XPath 式” のセクションを参照してください。 |
id | オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。 |
image | カスタマイズした箇条書きの記号として使用するイメージの URI。image 値を指定すると、type 属性は無視されます。 |
separator |
リスト項目を区切るために使用します。以下の値のいずれかを指定できます。
|
startvalue | 番号付きリストの先頭番号の値。startvalue は、必ず整数で指定します。type が "A" で startvalue が "3" の場合、リストの最初の要素のラベルは "C" になります。 |
type | リスト項目に使用する箇条書き記号またはリスト番号のスタイル。指定可能な値は、"none"、"circle"、"square"、"disc"、"1"、"A"、"a"、"I"、"i" です。PDF レポートでは、"square" と "circle" はサポートされていません。 |
<p>
<p> 要素は、テキストのブロックを表示します。このスタイル・クラスに "p" オプションを使用します。<p> には以下の属性があります。
属性 | 説明 |
---|---|
表示の条件式 | <p> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。 |
値の条件式 | <item> 要素の値を条件付きで表示できる expression 属性と if 属性の詳細は、“値を表示するための条件式” のセクションを参照してください。“ ” |
表示属性 | style、width、class などの属性の説明は、この章の冒頭の “レポートの表示属性” のセクションを参照してください。 |
bidi-override-direction |
段落に含まれるテキストの双方向オーバーライドの方向を設定します。指定可能な値は、"rtl” および “ltr" です。既定は “ltr" です。<inline> でもサポートされています。 双方向のテキストの詳細は、"<bidioverride>" を参照してください。 |
caption |
(オプション) このブロックのキャプション・テキスト。 この属性に普通のテキストを入力できる場合でも、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が与えられます。 “Zen レポート属性のデータ型” を参照してください。 |
id | オプションの識別子。id を使用すると、<p> 要素にアクセスしてそのコンテンツをプログラムで変更できます。詳細は、このテーブルの後に示す content プロパティの説明を参照してください。 |
<p> 要素は、Zen レポート・クラス %ZEN.Report.Display.pOpens in a new tab の XML プロジェクションです。オンラインのクラスリファレンス情報でこのクラスについて参照すると、content というプロパティが含まれていることがわかります。Zen では、ここに XData ReportDisplay の <p> 要素と </p> 要素の間に置いたテキストが格納されます。レポートを表示する前にサーバ側で段落のテキストをプログラムで変更する必要がある場合は、クラス・メソッドの %GetComponentById(id) を呼び出して、%ZEN.Report.Display.pOpens in a new tab オブジェクトへのポインタを取得します。これにより、必要に応じてこのオブジェクトの content プロパティにアクセスして、その値を変更できます。
content プロパティをプログラムで操作する場合は、このテキスト文字列に、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が実際に含まれるように留意してください。 “Zen レポート属性のデータ型” を参照してください。
<pagebreak>
<pagebreak> 要素は、PDF 出力に改ページを挿入します。これによって、画面上の XHTML レポートには点線が表示されます。この XHTML レポートを印刷すると、ここで改ページが行われます。
各 <pagebreak> 要素では、以下のテーブルで示す属性がサポートされています。
属性 | 説明 |
---|---|
表示の条件式 | <pagebreak> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。 |
表示属性 | style、width、class などの属性の説明は、この章の冒頭の “レポートの表示属性” のセクションを参照してください。 |
id | オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。 |
<small-multiple>
<small-multiple> 要素を使用すると、<group> のデータを、そのページで繰り返される一連のグラフィックとして出力できます。スモール・マルチプルは、郵送ラベルの作成などの作業に役立ちます。Zen レポートでは、<group> から取得したデータを <small-multiple> 要素の形式にして、繰り返し要素を含む <table> を生成します。
スモール・マルチプルを定義するには、各 <small-multiple> 要素に入力するデータを含む <group> を最初に定義します。
<group name="Person" small-multiple="true" small-multiple-name="person-labels">
<table orient="row" >
<item field="@Name"/>
<item field="@Street"/>
<item field="@City"/>
<item field="@State"/>
</table>
</group>
属性 small-multiple には、このグループのデータをスモール・マルチプルとして出力するかどうかを指定します。既定値は、"false" です。属性 small-multiple-name には、このグループに関連するスモール・マルチプルの名前を指定します。既定値は、"small-multiple" です。レポート内のスモール・マルチプルには、それぞれ一意の名前を使用する必要があります。
次に、以下のようにスモール・マルチプルを定義します。
<small-multiple
num-rows="1"
num-cols="3"
table-class="table4"
table-width="5in"
col-width="2.5in"
name="person-labels"
/>
name 属性には <group> の small-multiple-name と同じ値を使用し、このスモール・マルチプルのデータを集約します。
各 <small-multiple> 要素では、以下のテーブルで示す属性がサポートされます。
属性 | 説明 |
---|---|
表示の条件式 | <small-multiple> 要素を条件付きで表示するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。 |
表示属性 | style、width、class などの属性の説明は、この章の冒頭の “レポートの表示属性” のセクションを参照してください。 |
id | オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。 |
num-rows |
スモール・マルチプルを保持するテーブルの行の数。 |
num-cols |
スモール・マルチプルを保持するテーブルの列の数。 |
table-class |
テーブルの CSS クラスまたは属性のセット。 |
table-style |
テーブルの CSS スタイル。 |
table-width |
テーブルの幅。 |
row-class |
行の CSS クラスまたは属性のセット。 |
row-style |
行の CSS クラスまたは属性のセット。 |
row-width |
行の幅。 |
col-class |
列の CSS クラスまたは属性のセット。 |
col-style |
列の CSS スタイル。 |
col-width |
列の幅。 |
name |
スモール・マルチプルの名前。既定値は、“small-multiple” です。レポート内のスモール・マルチプルにはそれぞれ一意の名前を使用する必要があります。 |
fill-order |
zr:small-multiple XML 要素のコレクションであるグループによって定義される一時ツリーによって、スモール・マルチプルのデータがどのように入力されるかを定義するために使用します。horizontal は、要素が検出されると、スモール・マルチプルの 1 つの行全体にデータが入力されてから次の行に入力されることを意味します。vertical は、スモール・マルチプルの最初の列にデータが入力されてから次の列に入力されることを意味します。既定は horizontal です。 |
スモール・マルチプルの生成では一時ツリーを使用するため、HTML および PDF の両方の出力に XSLTVERSION = 2.0 パラメータを設定し、XSLT バージョン 2.0 で処理する必要があります。XSLTMODE クラス・パラメータや $XSLT URI パラメータを使用して、XSLT 処理をブラウザに向けることはできません。既定では、XSLT 処理はサーバで行われます。グループのデータは、small-multiple-name という名前の変数に格納されます。
Zen レポート・クラスの例を以下に示します。
Class ZENSmallMultiple.JKSMailingLabel Extends %ZEN.Report.reportPage
{
Parameter DEFAULTMODE = "pdf";
Parameter XSLTVERSION = 2.0;
/// This XML defines the logical contents of this report.
// NEW STUFF
XData ReportDefinition [ XMLNamespace = "http://www.intersystems.com/zen/report/definition" ]
{
<report xmlns="http://www.intersystems.com/zen/report/definition"
name="MailingLabel"
sql="SELECT top 9 name,Home_Street,Home_City,
Home_State,Home_Zip from Sample.Person order by name">
<group name="Person">
<element field="name" name="name"/>
<element field="Home_Street" name="Home_Street"/>
<element field="Home_City" name="Home_City"/>
<element field="Home_State" name="Home_State"/>
<element field="Home_Zip" name="Home_Zip"/>
</group>
</report>
}
/// This XML defines the display for this report.
/// This is used to generate the XSLT stylesheets for both HTML and XSL-FO.
XData ReportDisplay [ XMLNamespace = "http://www.intersystems.com/zen/report/display" ]
{
<report xmlns="http://www.intersystems.com/zen/report/display"
name="MailingLabel">
<document width="8.5in" height="11in"
marginLeft=".175in" marginRight=".175in" marginTop=".5in" marginBottom=".5in" />
<body>
<group name="Person" small-multiple="true" small-multiple-name="person-labels">
<table orient="row" >
<item field="name"/>
<item field="Home_Street"/>
<item field="concat(Home_City,", ",Home_State," ",Home_Zip)"/>
</table>
</group>
<small-multiple
num-rows="3"
num-cols="3"
table-class="table4"
table-width="8in"
table-style="border:0pt;padding:0pt"
row-style="border:0pt;padding:0pt;height:0.75in"
col-width="2in"
row-width="4in"
name="person-labels"
/>
</body>
</report>
}
}
以下のような出力が生成されます。
<table>
<table> 要素は、レポートにテーブルを出力します。<table> には以下の属性があります。
Zen レポートのテーブルでは、PDF 出力の場合のみ、パーセント値を使用して比率による列幅の指定が可能です。Zen レポートの XHTML 出力では、テーブルの幅の指定にパーセントを使用することはできません。
属性 | 説明 |
---|---|
表示の条件式 | <table> 要素を条件付きで出力するための属性の詳細は、“要素を表示するための条件式” のセクションを参照してください。 |
表示属性 |
style、width、class などの属性の説明は、この章の冒頭の “レポートの表示属性” のセクションを参照してください。 テーブルに表示するすべてのセルでは、スタイル・クラスに td を使用します。ただし、ヘッダ・セルでは th を使用します。 |
align |
指定できる align の値は、"left"、"right"、および "center" です。 HTML 出力では、align 属性でレポート内のテーブルの配置を指定します。 PDF 出力では、値を "center" にすると、テーブル内でテキストが中央に配置されますが、レポートのマージンに対してテーブルが中央に配置されることはありません。テーブルを中央に配置するには、<div> に <table> を配置し、その <div> を中央に配置する必要があります。詳細は、“PDF 出力における <table> の中央揃え” のセクションを参照してください。 |
altcolor |
1 行おきに行の色を変える場合に偶数行 (2、4、6 など) の背景色を指定する、CSS カラー値。これは、orient を "col" として、group を指定した場合にのみ指定できます。TABLEALTCOLOR でレポート全体に設定されているカラー値をオーバーライドします。 |
caption |
(オプション) このテーブルのキャプション・テキスト。 この属性に普通のテキストを入力できる場合でも、基本となるデータ型 %ZEN.Datatype.captionOpens in a new tab が与えられます。 “Zen レポート属性のデータ型” を参照してください。 |
crosstab | テーブルがクロス集計テーブルであることを指定します。“タイプ 1 クロス集計テーブルの作成” を参照してください。 |
data-type, table | data-type 属性は orderby で指定したソート列のデータのデータタイプを指定します。可能な値は以下のとおりです。“text”、“number”、および “qname”。 |
defaultWidth | テーブルの既定の幅の HTML の長さの値、または列幅の値を生成しないことを意味する値 "none"。 |
excelGroupName | 中間 XML でこのテーブルから生成されたタグの名前を指定します。既定のタグ名は、<group> です。カスタム・タグ名にすると、デバッグに便利な場合があります。この属性は、Excel スプレッドシートを displayxlsx モードで生成する場合にのみ使用します。“後で表示するための中間ファイルの保存” を参照してください。 |
excelSheetName |
excelSheetName 属性により、生成されたワークシートの名前を指定できます。既定では、ワークシートに Excel シート用の既定の名前付け規約 (Sheet1、Sheet2 など) が使用されます。単一シートのレポートに対しては <report> で excelSheetName を指定し、複数シートのレポートに対してはワークシートを定義する各 <group> でこれを指定します。excelSheetName 属性ではローカライズがサポートされています。"Zen レポートのローカライズ" を参照してください。 excelSheetName で最初の文字が ! (感嘆符) の場合、シート名を取得するために評価される ObjectScript 実行時式として後続の内容がレポートで解釈されます。実行時式により渡されるシート名は、ローカライズされません。 シート名の生成を詳細に制御する場合は、%ZEN.Report.reportPageOpens in a new tab に定義されているメソッド %getDisplayUniqueExcelSheetName をオーバーライドします。 |
foHeaderStyle |
PDF の生成用に、テーブル・ヘッダに対して XSL-FO のスタイルを定義できるようにします。Zen レポートの XData ReportDisplay ブロック内の以下のエントリは、 <table foHeaderStyle="font-weight='bold'"> レポート用に生成された XSL-FO スタイルシートに、以下のような出力を生成します。 <fo:table-header font-weight="bold"> この属性は、XHTML 形式の出力には適用できません。 |
foStyle |
PDF の生成用に、テーブル全体に対して XSL-FO のスタイルを定義できるようにします。Zen レポートの XData ReportDisplay ブロック内の以下のエントリは、 <table foStyle="font-family='Arial' font-size='9pt'"> レポート用に生成された XSL-FO スタイルシートに、以下のような出力を生成します。 <fo:table font-family="Arial" font-size="9pt"> この属性は、XHTML 形式の出力には適用できません。 |
group |
<table> に group を指定しない場合、テーブルはデータの単一行に基づくため、テーブルに表示される行または列は 1 つのみとなります。ほとんどのテーブルでは複数の行や列が必要なので、各 <table> に group 属性を必ず指定することが妥当です。 このテーブルで <item> などの要素を 1 つ以上指定して、グループのどのデータをテーブルに表示するかを特定する必要があります。 一見すると、XData ReportDisplay の <table> で指定する group の値は、XData ReportDefinition の上位レベルにある <group> または <report> で指定した name の値と一致している必要があるように思われます。多くの場合、表面的にはそのとおりです。 しかし、実際のこの規則には興味深い側面があります。group 属性の値は、<table> の親である <report> または <group> を先頭とする暗黙の XPath 式の後に続く、部分的な XPath 式です。つまり、group および field の式は、<report> の階層の中でそれらの上位レベルにある他の group および field の式の後ろに連結されます。これを理解すると、グループやテーブルをより巧妙に設定して使用できるようになります。 Zen レポートで XPath 式を使用する方法の詳細は、“group、field、および XPath 式” のセクションを参照してください。 |
id | オプションの識別子。この属性を設定しておくと、%GetComponentById(id) メソッドを呼び出すことにより、サーバ側コードでのこの要素の取得に使用できます。 |
layout |
指定可能な layout の値は "auto"、"fixed"、および "none" です。 PDF 出力については、XEP レンダリング・ツールが "auto" と "fixed" の両方の形式をサポートしています。FOP では "fixed" のみをサポートしています。"none" は、生成されたスタイルシートへの、テーブルのレイアウト属性の値の出力を抑制することを意味します。 layout を "fixed" に設定した場合は、各列の幅を指定することが重要です。必要最低限の幅情報を指定するだけでも良好な結果がコードから得られますが、次のようにすることでさらに詳細に制御できます。
|
oldSummary |
<summary> は、テーブルのフッタを作成するために <table> の中に指定できる要素です。従来の Zen レポートと新しい Zen レポートでは、使用する <summary> の構文規約が異なります。"<summary>" セクションでは、それぞれの規約について以下のように説明しています。
この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。 |
ongetData | テーブルのデータを指定するサーバ側コールバック・メソッドを指定します。“コールバック・メソッドを使用したテーブル作成” を参照してください。 |
orderby |
<table> の並べ替えに使用する列を指定する文字列。<table> のデータを提供する XML の要素または属性について、コンマで区切られたリストで構成されます。orderby 文字列の最初の文字に ! (感嘆符) を使用した場合、Zen レポートでは、文字列の残りの部分がその文字列を指定する ObjectScript 式として解釈されます。 詳細は、このテーブルの後の “ReportDisplay の orderby 属性” を参照してください。レポートの ReportDefinition セクションでの orderby 使用に関する詳細は、“Zen レポートのデータの収集” の章の “ReportDefinition の orderby 属性” を参照してください。 |
orient | テーブルに記述する個々の要素は、orient 属性の値に応じて、行または列として扱われます。orient が "row" である場合、テーブルの子要素はそれぞれ、新しい行に配置されます。同様に、orient が "col" である場合、子要素はそれぞれ新しい列に配置されます。指定できる値は、"row" および "col" です。既定では "col" です。 |
queryClass | テーブルのデータを指定するクエリを含むクラスの名前を指定します。“クラス・クエリからのテーブル作成” を参照してください。 |
queryName | テーブルのデータを指定するクエリの名前を指定します。“クラス・クエリからのテーブル作成” を参照してください。 |
removeEmpty |
<table> の removeEmpty 属性を指定することで、レポートのこの <table> によって生成された XHTML 出力または PDF 出力に、このレポートの XML データ内で検出された空のノードが表示されるようにするかどうかを制御します。removeEmpty には以下のいずれかの値を設定できます。
removeEmpty を機能させるためには、group 属性を設定する必要があります。 この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。 |
rowAcrossPages |
<table> の rowAcrossPages 属性は、複数行のコンテンツを持つテーブルの行を改ページで分割できるかどうかを制御します。既定値の “True“ では、行を分割できます。値が “False“ の場合、行が改ページによって分割される場合、この行を強制的に次のページに配置します。 この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。 |
selectmode |
sql 属性で使用します。テーブルのデータを指定する SQL クエリの %SELECTMODE を指定します。可能な値は以下のとおりです。
詳細は、"Caché SQL の使用法" の “オブジェクト・インスタンスの作成” を参照してください。 |
sql |
テーブルのデータを指定する SQL 文を指定します。“SQL を使用したテーブル作成” を参照してください。 |
writing-mode |
生成された XSL の <fo:page-sequence> 要素に writing-mode 属性を追加します。writing-mode では、テキストを記述する方向に関連するページ・レイアウト機能を制御します。writing-mode 属性の詳細は、“書き込みモード” のセクションを参照してください。 可能な値は以下のとおりです。
すべての XSL-FO レンダラがすべての指定可能な値をサポートしているわけではありません。 |
以下のセクションでは、Zen レポートのテーブルについてより詳しく説明します。
-
“ReportDisplay の orderby 属性”
-
“PDF 出力における <table> の中央揃え”
-
“<table> の要素の表示”
-
“<caption>”
-
“<summary>”
-
“<table> での複雑なヘッダの使用”
-
“<table> での <table> の埋め込み”
-
“タイプ 2 クロス集計テーブルの作成”
-
“タイプ 1 クロス集計テーブルの作成”
-
“コールバック・メソッドを使用したテーブル作成”
-
“クラス・クエリからのテーブル作成”
-
“SQL を使用したテーブル作成”
-
“onCreateResultSet を使用したテーブル作成”
ReportDisplay の orderby 属性
ReportDefinition ブロックの orderby と同様、orderby 属性により、<table> の項目の順序付け方法を指定するフィールドのコンマ区切りリストが提供されます。これは、テーブルのデータを提供するための生成された XML 内の既存順序をオーバーライドします。レポートの ReportDefinition セクションでの orderby 使用に関する詳細は、“Zen レポートのデータの収集” の章の“ReportDefinition の orderby 属性” を参照してください。
orderby リストの各項目は、生成される XML の属性または要素を指定する XPath となります。また、昇順と降順のどちらで並べ替えるかを指定することもできます。これを行うには、“\” (円記号)、および ASC または DESC のいずれかの文字列を orderby リストの XPath に追加します。既定の並べ替えは昇順となります。ASC や DESC の文字列では、大文字と小文字は区別されません。また、並べ替えるフィールドのデータ型を数値またはテキストとして指定することもできます。並べ替えの既定のデータ型はテキストです。これを行うには、“\” (円記号) を 1 つ追加して、文字列の数値またはテキストを orderby リストの XPath に追加します。
以下の例では、orderby にリテラル値を指定しています。この例では、フィールド "number" を使用して、テーブルの項目を数値データとして降順に並べ替えています。
<table orient="col" group="SortMe/item" orderby="number\DESC\number" >
<item field="ID" width=".5in" caption="ID"/>
<item field="number" caption="number"/>
</table>
orderby 文字列の最初の文字に ! (感嘆符) を使用した場合、Zen レポートでは、文字列の残りの部分がその値を指定する ObjectScript 式として解釈されます。以下の例では、Zen レポート・クラスのプロパティ SortBy を参照して、orderby 属性の値を指定しています。ReportDisplay ブロックでは、式を評価するための現在のクラスが、式を含むタグのクラスとなります。この例では、orderby の評価コンテキストは %ZEN.Report.Display.tableOpens in a new tab となります。これにより、ReportDefinition で行うように、二重ドット構文を使用して、レポート・クラスのプロパティを参照することはできません。Zen レポートの特殊変数 %report を使用してレポートを参照したり、ドット構文を使用してプロパティを参照したりすることができます。また、“Zen レポートでの実行時式の使用法” のセクションの説明に従って、式を指定することもできます。
/// Syntax appropriate for sorting via XSLT in ReportDisplay
Property SortBy2 As %String(ZENURL = "SortBy")
[ InitialExpression = "number\ASC" ];
<table orient="col" group="SortMe/item" orderby="!%report.SortBy" >
<item field="ID" width=".5in" caption="ID"/>
<item field="number" caption="number"/>
</table>
PDF 出力における <table> の中央揃え
以下の例では、左右に 1.25 インチのマージンがある 8.5 インチのページに 4 インチのテーブルを中央揃えで配置しています。<div> style 属性の “start-indent” プロパティは、<table> width (4 インチ) と使用可能なページ幅 (6 インチ) を使用して、テーブルをページに配置します。“start-indent” は継承されるので、テーブルの各 <item> には 0 を設定する必要があります。
<div width="4in"
style="start-indent:((6in - 4in) div 2)">
<table style="border:1pt solid black" width="4in" >
<item field="NAME"
style="start-indent:0;text-align:left"/>
</table>
</div>
<table> の要素の表示
<table> には、<item>、<block>、<img> などの Zen レポートのあらゆる表示要素を記述でき、すべてのタイプのグラフを配置できます。 テーブルに配置できるすべての表示要素の完全なリストは、“Zen レポートのデータの表示” の章の冒頭のリストを参照してください。
テーブルに配置した表示要素では、標準の属性のほかに以下の属性をサポートできます。
属性 | 説明 |
---|---|
foblock |
この属性を使用すると、現在の項目のブロックを XSL-FO 出力に表示するときに適用するスタイル設定の情報を詳しく指定できます。以下はその例です。 foblock="orphans='1'" XHTML 出力では、foblock 属性は無視されます。 |
block-container-property |
簡潔なオプションについては、truncate または too-long-text の説明を参照してください。 PDF 出力については、include-block-container が True の場合、目的のエントリが属するブロックのフォーマット命令を block-container-property で指定します。以下の命令によって、オーバーフローしたテキストは表示されなくなります。 block-container-property="overflow='hidden' width='.2in'" |
colcount |
クロス集計テーブルの 1 つの項目で集計する列の数を指定します。colcount には、リテラル値を指定できるほか、入力から計算した値が割り当てられるようにすることもできます。 colcount 属性は、クロス集計テーブルに配置する項目ごとに指定する必要があります。他のタイプのテーブルでは、この属性は無視されます。例については、“タイプ 1 クロス集計テーブルの作成” を参照してください。 |
grouppath |
このクロス集計テーブルの項目の値を提供するグループを特定します。 grouppath 属性は、複数の列や行が存在するクロス集計テーブルに配置する項目ごとに指定する必要があります。クロス集計テーブルにある列または行が 1 つのみの場合は、この属性を指定する必要はありません。また、他のタイプのテーブルでは、この属性は無視されます。 grouppath 属性の目的は、クロス集計テーブルの列に対するラベルの割り当てや列数のカウントを入力に基づいて適切に実行できるようにすることです。例については、“タイプ 1 クロス集計テーブルの作成” を参照してください。 |
include-block-container |
簡潔なオプションについては、truncate または too-long-text の説明を参照してください。 (PDF 出力の場合のみ) 長い文字列のデータが存在する場合、XEP では割り当てられた領域に収まるようにデータが圧縮されます。FOP では、データは隣のテーブル列など、現在の位置に続く領域にオーバーフローし、その領域に元々存在するデータの上に重ねて出力されます。 FOP のオーバーフローした部分を切り捨てて見やすくするには、<table> エントリがブロックに属するように設定し、そのブロックの属性を目的の動作が得られるように設定します。つまり、以下のようになります。 include-block-container="true" True に設定した場合、ブロックに属するエントリとなり、block-container-property で指定したフォーマットが使用されます。False に設定した場合、エントリに対して特別なフォーマット設定は適用されません。 この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。 |
too-long-text |
(PDF 出力の場合のみ) too-long-text 属性は以下のように設定できます。
|
truncate |
(PDF 出力の場合のみ) truncate を True に設定すると、オーバーフローしたテキストはすべて切り捨てられ、表示されなくなります。これで、FOP によるレンダリングで発生する問題を簡単に解消できます。テキストを単に切り捨てるのであれば、他の属性を設定する必要はありません。 この属性で基本となるデータ型は %ZEN.Datatype.booleanOpens in a new tab です。 “Zen レポート属性のデータ型” を参照してください。 too-long-text の説明も参照してください。 |
truncation-height | (PDF 出力の場合のみ) truncate を True に設定した場合や、too-long-text を ”truncate" に設定した場合に、切り捨てずにテキスト領域として残す高さを指定します。既定値は、テキストが記述されている列の高さです。 |
truncation-width | (PDF 出力の場合のみ) truncate を True に設定した場合や、too-long-text を ”truncate" に設定した場合に、切り捨てずにテキスト領域として残す幅を指定します。既定値は、テキストが記述されている列の幅です。 |
空白要素をテーブルに追加して、PDF 形式の空白として表示するには、改行を禁止するスペース文字である   を使用する必要があります。以下はコードの例です。
<table orient="row" width="3.45in" class='table1'>
<item value="Sales by Sales Rep" width="2in">
<caption value="Title:" width="1.35in"/>
</item>
<item field="@month" caption="Month:"/>
<item field="@author" caption="Author:"/>
<item value=" "/>
<item field="@runBy" caption="Prepared By:"/>
<item field="@runTime" caption="Time:"/>
</table>
以下の PDF 出力を生成します。
<table> のスタイルでテーブルのセルに境界線を設定している場合、値が空のフィールドでは表示セルの境界線が表示されなくなることがあります。この場合、境界線が表示されているセルと表示されていないセルが存在することになり、テーブルの外観に不統一が生じます。この問題を解決するには、テーブルの CSS 属性である border-collapse の値を collapse に設定して、<table> のスタイルを調整します。これを実行する方法の 1 つとして、レポートの <document> 要素の中で <class> 要素を定義した後、<table> の class 属性を使用して <table> に目的のスタイルを適用する方法があります。以下はその例です。
<class name="table.main">
<att name="border-collapse" value="collapse" />
</class>
次に以下を指定します。
<table class="main">
<!-- Contents of table here -->
</table>
class の詳細は、この章の冒頭の “レポートの表示属性” のセクションを参照してください。
<summary>
<summary> 要素は、行または列にヘッダではなくフッタを作成する点を除き、<caption> に似ています。<summary> 要素には、<item> と同じ属性があります。属性の詳細は、"<item>" のセクションを参照してください。
従来の Zen レポートと新しい Zen レポートでは、使用する <summary> の構文規約が異なります。新しい構文の使用をお勧めしますが、既存の Zen レポートとの下位互換性を確保するために、既定では古い構文が使用されます。それぞれの場合の <summary> 要素の構文について以下で説明します。
-
新しい Zen レポートを使用する場合や、<summary> を使用している古い Zen レポートの出力に問題がある場合、<table> 定義に oldSummary="false" を追加し、“<table> の oldSummary が False の場合” のセクションで説明する構文を使用してください。
-
古い Zen レポートを使用する場合は、<summary> の従来の構文について “<table> の oldSummary が True の場合” のセクションを参照してください。<table> の定義に oldSummary="true" を追加すると必ず従来の規約が使用されますが、oldSummary の既定値は True なので必ずしも明示的に指定する必要はありません。
<table> の oldSummary が False の場合
ここでは、以下の <table> 例を取り上げます。この例では、テーブルにある各列の最後にその合計が表示されます。このテーブルに適用する 5 つの <summary> 要素すべてを、<table> 定義にある最後の <item> 要素の中で指定しています。Zen では、<table> の <item> 要素の中で <summary> 要素が上から下に向かって検索されます。<summary> 要素が見つかると、それらの要素のコンテンツは、フッタのテキストとして左から右の順で出力先のテーブル列に割り当てられます。最初の <summary> は最初の列、2 番目の <summary> は 2 番目の列にそれぞれ割り当てられ、以降同様の割り当てになります。この例で、最初のいくつかの <summary> 要素の属性に空の値を指定しているのは、これらに該当するフッタにはテキストを表示せず、色のみを表示するためです。テキストが生成されるのは最後の <summary> のみです。XData ReportDefinition で生成した XML データの値を field 属性を使用して参照し、目的のテキストを生成しています。
このルールは、どの <item> で <summary> 要素を指定しても適用されます。<summary> はフッタを指定する要素なので、この例のように <table> の最後の <item> の中でまとめて指定することが妥当です。
<table orient="col" group="record" width="6in" class="table4"
altcolor="#DFDFFF" oldSummary="false" >
<item special="number" width=".45in" style="color: darkblue;">
<caption value="#" />
</item>
<item field="@id" width=".7in"
style="border:none;padding-right:4px">
<caption value="Sale ID"/>
</item>
<item field="date" width="1.5in" style="padding-left: 4px;">
<caption value="Date"/>
</item>
<item field="customer" width="2.65in">
<caption value="Customer"/>
</item>
<item caption="Amount" width=".7in"
style="text-align:right;" field="@number"
formatNumber='###,###,##0.00;(#)'>
<caption value="Amount"/>
<summary
style="font-style:italic;text-align:right;background-color:yellow"
value=" "/>
<summary
style="font-style:italic;text-align:right;background-color:purple"
value=" "/>
<summary
style="font-style:italic;text-align:right;background-color:orange"
value=" "/>
<summary
style="font-style:italic;text-align:right;background-color:blue"
value=" "/>
<summary field="subtotal"
style="font-weight:bold;text-align:right;background-color:red"
formatNumber='###,###,##0.00;(#)'/>
</item>
</table>
以下の構文も同様に有効です。ここでは <item> ごとに <caption> と <summary> をまとめて指定しているので、わかりやすさを優先してこちらを使用してもかまいません。
<table orient="col" group="record" width="6in" class="table4"
altcolor="#DFDFFF" oldSummary="false" >
<item special="number" width=".45in" style="color: darkblue;">
<caption value="#" />
<summary
style="font-style:italic;text-align:right;background-color:yellow"
value=" "/>
</item>
<item field="@id" width=".7in" style="border:none;padding-right:4px">
<caption value="Sale ID"/>
<summary
style="font-style:italic;text-align:right;background-color:purple"
value=" "/>
</item>
<item field="date" width="1.5in" style="padding-left: 4px;">
<caption value="Date"/>
<summary
style="font-style:italic;text-align:right;background-color:orange"
value=" "/>
</item>
<item field="customer" width="2.65in">
<caption value="Customer"/>
<summary
style="font-style:italic;text-align:right;background-color:blue"
value=" "/>
</item>
<item caption="Amount" width=".7in"
style="text-align:right;" field="@number"
formatNumber='###,###,##0.00;(#)'>
<caption value="Amount"/>
<summary field="subtotal"
style="font-weight:bold;text-align:right;background-color:red"
formatNumber='###,###,##0.00;(#)'/>
</item>
</table>
<table> の oldSummary が True の場合
以下の XData ReportDisplay ブロックを例として考えてみます。この例では、Average 列、Max 列、および Count 列には要約が出力され、表示されますが、Name 列には表示されません。必要な 3 つの <summary> 要素のすべてが、最初の <summary> 要素 (つまり Average) に適用される <item> 要素内に左から右に順に記述されています。
<report xmlns="http://www.intersystems.com/zen/report/display"
name="SummaryReport">
<body>
<table group="SalesByState">
<item caption="Name" field="@state1" width="1in"/>
<item field="average" formatNumber="######.##" width="4in">
<summary value="AVERAGE" />
<summary value="MAX" />
<summary value="COUNT" />
</item>
<item field="max" formatNumber="#######.##" width="2in"/>
<item field="count" width="2in"/>
</table>
</body>
</report>
<table> での複雑なヘッダの使用
複数の行や列にわたる複雑なヘッダをサポートするために、Zen レポートには <table> コンテナの中で指定する以下の要素が用意されています。これらの要素を使用すると、その要素と同じ名前の HTML 要素と同様の出力が XHTML や PDF の出力フォーマットで得られます。
-
<thead> — ヘッダ定義のコンテナ
-
<tr> — <thead> または <tfoot> の中にある行のコンテナ
-
<th> — <thead> 内の <tr> 内にあるセルのコンテナ
-
-
-
<tfoot> — フッタ定義のコンテナ
-
<tr> — <thead> または <tfoot> の中にある行のコンテナ
-
<td> — <tfoot> 内の <tr> 内にあるセルのコンテナ
-
-
<th> 要素と <td> 要素は、<th> がヘッダ、<td> がフッタに表示される点を除いて機能は類似しています。それぞれの <th> または <td> には、ヘッダやフッタに表示するテキストを指定する <item> 要素を記述します。以下は、ヘッダを定義した <table> の例です。
<table group="SaleRep" orient="col" width="6in" class="table4"
altcolor="#DFDFFF" orderby="@state" >
<thead style="color:red">
<tr>
<th>
<item value="# " width=".45in"/>
</th>
<th>
<item value="name" width="2.65in"/>
</th>
<th>
<item value="state" width="2.65in"/>
</th>
</tr>
</thead>
<item special="number" width=".45in" style="color: darkblue;" />
<item field="@name" width="2.65in" />
<item field="@state" width="2.65in" />
</table>
ヘッダとフッタの両方を定義する場合、<tfoot> コンテナを記述する位置は、<thead> コンテナの直後で、<table> の本体を指定する <item> 要素の前とする必要があります。以下はより複雑な例で、2 行に及ぶヘッダのほかに、フッタも定義しています。
ここで、<td> の定義と <th> の定義では colspan を使用しています。<td> と <th> では、colspan 属性と rowspan 属性がサポートされています。各属性の値には数字が指定できます。これにより、その親の <td> または <th> のコンテンツが、ヘッダまたはフッタの指定した数の列または行にまたがって適用されます。これらの各属性によって、その属性と同じ名前の HTML 属性と同様の出力が XHTML や PDF の出力フォーマットで得られます。
<table group="SaleRep" orient="col" width="6in" class="table4"
altcolor="#DFDFFF" orderby="@state" >
<thead style="color:red">
<tr style="color:blue">
<th colspan="2">
<item value="identity"/>
</th>
<th>
<item value="loc"/>
</th>
</tr>
<tr>
<th>
<item value="# " width=".45in"/>
</th>
<th>
<item value="name" width="2.65in"/>
</th>
<th>
<item value="state" width="2.65in"/>
</th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="3">
<item value="the end" />
</td>
</tr>
</tfoot>
<item special="number" width=".45in" style="color: darkblue;" />
<item field="@name" width="2.65in" />
<item field="@state" width="2.65in" />
</table>
<table> での <table> の埋め込み
XData ReportDisplay の <table> の中には <table> を記述できます。これらは、埋め込みテーブルと呼ばれます。テーブルの中で通常は <item> などの要素を記述する位置に <table> 要素を使用するだけで、この操作が可能です。例については、次のセクションの “タイプ 1 クロス集計テーブルの作成” を参照してください。テーブルの埋め込みには、クロス集計テーブルを使用する必要はありません。表示レイアウトで必要であれば、どこにでもテーブルを埋め込むことができます。
Zen レポートのクロス集計テーブル
クロス集計テーブルは、水平方向のヘッダを表示するだけでなく、最も左側の列を垂直方向のヘッダとして使用するテーブルです。このテーブルでは、ヘッダの各ペアの交差するセルに、両方のヘッダに関連するデータが表示されます。
クロス集計テーブルはピボット・テーブルとも呼ばれますが、クロス集計テーブルとピボット・テーブルを区別して考える場合もあります。その場合は、クロス集計テーブルでは集約したデータのみを扱い、ピボット・テーブルでは集約していないデータも扱うことができることを相違点としています。また、行に基づいて集約するテーブルと列に基づいて集約するテーブルという考え方で区別することもできます。このドキュメントでは、クロス集計テーブルのようなテーブルをすべて指します。
Zen レポートでは、2 種類の方法でクロス集計テーブルが実装され、タイプ 1 クロス集計テーブルとタイプ 2 クロス集計テーブルとして判別されます。タイプ 1 テーブルは、Zen レポートで実装されたクロス集計テーブルの最初のタイプで、引き続きサポートされています。新規開発では、タイプ 2 クロス集計テーブルを使用することをお勧めします。レイアウトの管理が容易で、クロス集計テーブル作成上の問題に対するより一般的な解決策が用意されているからです。
タイプ 2 クロス集計テーブルの作成
最近実装されたタイプの Zen レポート・クロス集計テーブルでは、テーブルで特定の行と列が交差する場所にデータ値を配置できます。また、ヘッダとフッタのサポートが強化されています。このテーブルを作成する際は、<item> 要素の以下の属性を一緒に使用します。
属性 | 説明 |
---|---|
crosstabDataGroup |
crosstabRowGroup により確立したコンテキストでクロス集計テーブルのデータを検索する XPath 式。 |
crosstabFooterDataField | クロス集計テーブルのフッタ・セルに配置するデータを検索する XPath 式。この式は、crosstabFooterGroup のコンテキストで評価されます。指定しないと、テーブルは crosstabFooterGroup の値を使用します。 |
crosstabFooterFormatNumber |
NULL 以外の値の場合、フッタのデータをフォーマット処理する方法を指定します。 |
crosstabFooterGroup | crosstabFooterDataField を評価するためのコンテキストを指定する XPath 式。crosstabFooterDataField を指定しないと、crosstabFooterGroup によってクロス集計テーブルのフッタ・セルに配置するデータが検索されます。 |
crosstabHeaderDataField | クロス集計テーブルのヘッダ・セルに配置するデータを検索する XPath 式。この式は、crosstabHeaderGroup のコンテキストで評価されます。指定しないと、テーブルは crosstabHeaderGroup の値を使用します。 |
crosstabHeaderGroup | crosstabHeaderDataField を評価するためのコンテキストを指定する XPath 式。crosstabHeaderDataField を指定しないと、crosstabHeaderGroup によってクロス集計テーブルのヘッダ・セルに配置するデータが検索されます。 |
crosstabHeaderGroupLabels | crosstabHeaderLabelDataField を評価するためのコンテキストを指定する XPath 式。crosstabHeaderLabelDataField を指定しないと、クロス集計テーブルのヘッダ・セルでラベルとして使用する値は、crosstabHeaderGroupLabels によって検索されます。 |
crosstabHeaderGroupTooLongText | 使用可能なスペースよりもテキストが長い場合のテキストの処理を指定します。可能な値は以下のとおりです。
|
crosstabHeaderLabelDataField | クロス集計テーブルのヘッダ・セルでラベルとして使用する値を検索する XPath 式。この式は、crosstabHeaderGroupLabels のコンテキストで評価されます。指定しないと、テーブルは crosstabHeaderGroupLabels の値を使用します。 |
crosstabHeaderMatchField |
crosstabHeaderGroup により提供された値に一致するデータを指定する XPath 式。 |
crosstabRowGroup |
行データを検索する XPath 式。crosstabDataGroup を評価するためのコンテキストを指定します。 |
これらの各属性は、レポートに対して生成された XML でデータを検索する XPath 式を指定します。crosstabHeaderGroup は、テーブルの列ヘッダの値を指定します。crosstabRowGroup は、テーブルの行を指定します。
以下の例は、これらの属性を使用して、クロス集計テーブルを作成する方法を示しています。例では、SAMPLES データベース内の Cinema アプリケーションからデータを使用します。XData ReportDefinition ブロックのレポート定義を以下に示します。
<report xmlns="http://www.intersystems.com/zen/report/definition"
name="MyReport" runonce="true">
<group name="Beginning"
sql="select ID,Title,Category->CategoryName as Category,Rating
From Cinema.Film order by Category->CategoryName" >
<group name='CategoryGrp' breakOnField="Category" >
<attribute name="Category" field="Category"/>
<group name="Film" breakOnField="ID">
<attribute name="ID" field="ID"/>
<attribute name="Title" field="Title" />
<attribute name='FilmRating' field='Rating' />
</group>
</group>
</group>
<group name="ListRate"
sql="select DISTINCT Rating From Cinema.Film order by Rating" >
<element name='Rating' field="Rating" />
</group>
</report>
以下の構造がある XML を生成します。
XData ReportDisplay ブロックのレポート定義を以下に示します。
<report xmlns="http://www.intersystems.com/zen/report/display"
name="MyReport">
<body>
<group name='Beginning/CategoryGrp' pagebreak="true">
<table orient='row' width="50%">
<item field='@Category'
style='text-align:center;font-weight:bold;font-size:16pt' />
</table>
<table class="table2" group="Film" orient="col" >
<item field="@Title" caption="Title" width="50%"/>
<!-- The crosstabRowGroup uses the variable "$prevmatch"
to allow the absolute XPath expression
to find the group's current iteration. -->
<item
crosstabHeaderGroup="/MyReport/ListRate/Rating"
crosstabRowGroup=
'/MyReport/Beginning/CategoryGrp[$prevmatch]/Film'
crosstabDataGroup="self::Film"
crosstabHeaderMatchField="@FilmRating"
field=""X""
style='text-align:center;font-weight:normal'
/>
</table>
</group>
</body>
</report>
以下の構造があるレポートを生成します。
この図では、映画カテゴリが 1 つのみの出力を示しています。フル・レポートでは、同様のテーブルがカテゴリごとに生成されます。
テーブルにある最初の項目を以下に示します。
<item field="@Title" caption="Title" width="50%"/>
上記は、映画タイトルの列をテーブルの左側に作成します。2 番目の項目では専用の属性を使用して、列ヘッダ値を生成し、値をテーブルのセルに格納します。
以下の図では、クロス集計の <item> 要素にある属性が生成 XML のノードを参照する様子を示しています。crosstabRowGroup と crosstabHeaderGroup では絶対ロケーション・パスが必要なことに注意してください。絶対パスを使用することは、エンクロージング・グループにより作成されたコンテキストに依存できないことを意味します。このレポートでは、特殊変数 $prevmatch を使用して、レポートが処理しているカテゴリを追跡しています。
変数 $prevmatch には、レポートがテーブル・データの入力を開始したときに一致した親グループ内のノードの位置が格納されます。これより深い入れ子のレベルを処理する場合は、追加の変数を利用できます。このような変数には、$level0、$level1、$level2 という名前が、レポートで使用される最も深い入れ子のレベルまで同様の形式で付けられます。前述の例に示した ReportDisplay セクションでは、$level1 が $prevmatch とまったく同様に動作します。
crosstabDataGroup は、特定の処理対象データ・ノードを選択し、crosstabHeaderMatchField は、crosstabHeaderGroup で指定した列の 1 つに現在のノードが一致するかどうかを判断するためレポートで使用するデータ・ノードのフィールドを指定します。
以下の図は、crosstabHeaderGroup と crosstabHeaderMatchField との間で値が一致すると適切なテーブル・セルに値が設定される様子を示しています。この場合、値は ‘X’ 文字になります。これは、<item> 内の field の値として指定されます。@Title などの XPath 式も使用できます。これによって、要素や属性からデータを選択します。クロス集計テーブル内で、field 属性は、<table> のコンテキストではなく、<item> の crosstabDataGroup に関して解釈されます。
次の例では、より複雑なレポートが示されています。例では、SAMPLES データベース内の ZENApp アプリケーションのデータを使用します。以下のサンプル・コードでは、XData ReportDefinition ブロックのレポート定義を示しています。
<report xmlns="http://www.intersystems.com/zen/report/definition"
name="Test" runonce="true">
<group name="rowdata"
sql="select salesRep, month(saleDate) as saleMonth, num
from ZENApp_Report.Invoice order by salesRep, month(saleDate) ">
<group name="SalesRep" breakOnField="SalesRep" >
<attribute name="SalesRep" field="SalesRep"/>
<group name="row" breakOnField="saleMonth">
<attribute name="saleMonth" field="saleMonth"/>
<element name="num" field="num"/>
<aggregate name="month_sum" type="SUM" field="num"/>
</group>
<aggregate name="row_sum" type="SUM" field="num"/>
</group>
<aggregate name="total_sum" type="SUM" field="num"/>
</group>
<group name="coldata"
sql="select month(saleDate) as saleMonth, num
from ZENApp_Report.Invoice order by month(saleDate) ">
<group name="col" breakOnField="saleMonth">
<attribute name="saleMonth" field="saleMonth"/>
<attribute name="name"
field="saleMonth"
expression=
'$piece(##class(%SYS.NLS.Format).GetFormatItem("MonthName")," ",%val+1)'/>
<aggregate name="col_sum" type="SUM" field="num"/>
</group>
</group>
</report>
以下のサンプル・コードでは、XData ReportDisplay ブロックで定義されているレポートを示しています。
<report xmlns="http://www.intersystems.com/zen/report/display"
name="Test">
<body>
<table group="rowdata/SalesRep" class="table2"
oldSummary="false" >
<item field="@SalesRep" caption="SalesRep">
<summary value="Total" />
</item>
<item crosstabHeaderGroup="/Test/coldata/col"
crosstabHeaderDataField="@saleMonth"
crosstabHeaderGroupLabels="/Test/coldata/col"
crosstabHeaderLabelDataField="@name"
crosstabRowGroup="/Test/rowdata/SalesRep"
crosstabDataGroup="row"
crosstabHeaderMatchField="@saleMonth"
field='month_sum'
crosstabFooterGroup="/Test/coldata/col/"
crosstabFooterDataField="col_sum" >
</item>
<item field="row_sum" caption="Total" >
<summary field="rowdata/total_sum" />
</item>
</table>
</body>
</report>
crosstabHeaderGroupLabels 属性は、この例では冗長です。これが指定されていない場合、レポートは crosstabHeaderGroup の値を使用します。この値は、この例では同じになります。crosstabHeaderGroupLabels が存在していると、ヘッダ・ラベルの XML で別の場所を使用できます。
以下の図は、ReportDefinition ブロックで生成される XML を示します。ReportDisplay にある項目のどの属性が、XML にあるどのデータを参照しているかも示します。crosstabDataGroup と crosstabHeaderMatchField は、crosstabRowGroup に関して評価されることに注意してください。
この例では、crosstabHeaderGroup、crosstabHeaderGroupLabels、および crosstabFooterGroup はすべて、XML で同じノード ("/Test/coldata/col") を指しています。異なるデータ構造を持つレポートでは、これらの 3 つの属性は異なる値を持つことができます。これによって、クロス集計テーブルをさらに柔軟に作成することが可能になります。
フィールドを識別する項目属性が、XML のノードへの絶対 XPath を渡す別の属性のコンテキストで評価されます。レポートでは、コンテキスト属性とフィールド属性を連結することで、フィールドに対する XPath を構築します。以下のリストでこの例における 1 つの属性セットのこれらのリレーションシップを示します。
-
crosstabHeaderGroup の値 : "/Test/coldata/col"
-
crosstabHeaderDataField の値 : "@saleMonth"
-
crosstabHeaderDataField へのパス : "/Test/coldata/col/@saleMonth"
次の図では、項目属性で参照されるデータが、結果のクロス集計テーブルでどのように表示されるかを示しています。crosstabHeaderLabelDataField を使用して、crosstabHeaderDataField で渡された数字で表現された販売月 (saleMonth) を、月の名前で置き換えています。crosstabFooterGroup により、テーブル下部に表示される列の合計行が指定されます。field プロパティは、ここでも、前の例の場合と同じように機能します。crosstabHeaderMatchField に基づいて、営業担当者と月の交差位置にある各セルの値が渡されます。
またこれは、行ヘッダと行の合計を渡す追加の <item> 要素と <summary> 要素も示しています。これらは、item の caption プロパティにより列ヘッダを渡し、<summary> 要素によりフッタ値を渡します。
XSLTVERSION = 1.0 の場合、$prevmatch は適切に更新されるとは限りません。これによって、出力が適切でない場合があります。特に、フッタを使用するクロス集計テーブルの場合です。この問題を回避するには、XSLTVERSION = 2.0 を設定します。
タイプ 1 クロス集計テーブルの作成
このセクションでは、Zen レポートで実装されたクロス集計テーブルの最初のタイプについて説明します。
クロス集計テーブルの概要
ここでは、ある保険会社が、保険契約を結んだ建物に関する情報を保有しているとします。その保険会社のデータベースには、建物ごとに以下のフィールドが存在します。
-
Policy — 識別番号
-
Start — 保険証書の発効日
-
Expiry — 保険証書の有効期限
-
Location — 所在地タイプ (地方 (Rural) または都市 (Urban))
-
State — 所在地の州または国内の地域
-
Region — 国内で複数の州にまたがる地域
-
InsuredValue — 建物の保険価額
-
Construction — 建築物のタイプ : 耐火 (Fire Resistant) 、木造 (Frame)、れんが積み (Masonry)、または金属外壁 (Metal Clad)。
-
BusType — 建物の目的 : 接客、オフィス、農業、アパートなど。
-
Flood — 所在地の洪水地域指定の有無
上記のデータを示すレポート用の項目テーブルは、以下の例のようになります。この例では、5 つのエントリを示しています。このレポートの値に対して加工や集約は一切行われていません。各値は、データベースから取得したままの値です。
実際のポートフォリオには、同様のエントリが数百件から数千件存在している可能性があります。そのようなテーブルからビジネスの状況を効率的に評価することは困難です。なによりも、調べるには扱うデータの量が多すぎます。また、ビジネスに関するどのような情報を求めるかにもよりますが、分析に関係のないフィールドも数多く混じっています。
ソース・データに基づいた効率的な分析を目指すには、このデータから選択したフィールドを集約して、以下のようなクロス集計テーブルを作成します。テーブルの各セルには、ポートフォリオにあるすべての建物について、Location タイプ別と Construction タイプ別の組み合わせで InsuredValue の合計が示されています。また右側には、それぞれの Construction タイプの InsuredValue の合計を示す列もあります。このテーブルを検討した研究部門は、都市エリアの木造建築で最も火災が発生しやすいと判断できます。この図の集約データから、ポートフォリオ全体の価額やリスクの分布が明確にわかります。
以下の 2 つのコード例は、上の図で示したクロス集計テーブルの生成方法を示しています。最初の例は、XData ReportDefinition ブロックです。このブロックの内容は以下のとおりです。
-
該当する 3 つのフィールド (Construction、Location、および InsuredValue) を、データベースから取得します。
-
すべての値を Construction ごとにグループ化します。
-
Construction タイプ (Fire Resist、Frame、Masonry、または Metal Clad) を記録します。
-
Construction の値を Location ごとにグループ化します。
-
Location タイプ (Rural または Urban) を記録します。
-
Construction タイプと Location タイプの組み合わせごとに InsuredValue を合計して、Rural 列および Urban 列に配置する値を生成します。これらの値を、各 Location グループの Total という名前の集約に格納します。
-
Location とは無関係に Construction タイプごとに InsuredValue を合計して、“Total“ という名前の出力列に配置する値を生成します。この値を、各 Construction グループの TotalConstruction という名前の集約に格納します。
その次の例は、このクロス集計テーブルの例で使用する XData ReportDisplay ブロックです。このブロックの機能は以下のとおりです。
-
埋め込みテーブルの定義の各 <table> に適用するスタイルを定義します。このスタイル (table.table) には境界線がないため、表示内容を構成する 5 つの埋め込みテーブルは、出力では 1 つのテーブルのように見えます。
-
最上位の <table> コンテナを列方向に定義します。
-
最上位の <table> の最初の列を作成するために、列方向に設定した <table> を 1 つ持つ <div> を定義します。このテーブルには列が 1 つあります。この列のエントリは、Construction グループの Construction 属性値から取得します。値は、データベースで定義されている Construction タイプ (Fire Resist、Frame、Masonry、または Metal Clad) です。エントリには赤の太字スタイル、列幅には 2 インチを指定します。この列の値のキャプションを、リテラル文字列の “Value by Construction Type” とします。
-
最上位の <table> の 2 番目の列を作成するために、列方向に設定した <table> コンテナを 1 つ持つ <div> を定義します。この <table> には 2 つの <table> 要素があり、それぞれは行方向に設定したテーブルを 1 つ定義しています。この部分の定義の出力は 2 つの列で構成しています。それぞれにいくつかの列や行を設定できます。
-
手順 4 で定義した <table> の最初の列で、方向を行および crosstab を 1 に設定した <table> を 1 つ定義します。このテーブルのエントリは、Location グループの Total の集約値から取得します。
これは行方向のテーブルなので、Location タイプごとに 1 つの列、Construction タイプごとに 1 つの行で構成されます。これにより、このテーブルでは 2 つの列と 4 つの行が生成されます。このテキストには特別なスタイルを指定しません。このテーブルの列のキャプションは、Location グループの Location 属性値から取得するので、“Rural” および “Urban” になります。
この <table> の <item> 要素および <caption> 要素で、以下のように grouppath および colcount の値をそれぞれ指定します。これは、複数の列や行を持つクロス集計テーブルで必要な処理です。
-
grouppath では、このクロス集計テーブルの項目の値を指定するグループを特定します。grouppath 属性は、複数の列や行が存在するクロス集計テーブルに配置する項目ごとに指定する必要があります。クロス集計テーブルにある列または行が 1 つのみの場合は、この属性を指定する必要はありません。他のタイプのテーブルでは、grouppath 属性は無視されます。grouppath の目的は、クロス集計テーブルの列に対するラベルの割り当てや列数のカウントを入力に基づいて適切に実行できるようにすることです。
-
colcount では、クロス集計テーブルの 1 つの項目で集計する列の数を指定します。colcount には、リテラル値を指定できるほか、入力から計算した値が割り当てられるようにすることもできます。colcount 属性は、クロス集計テーブルに配置する項目ごとに指定する必要があります。他のタイプのテーブルでは、colcount 属性は無視されます。
-
-
手順 4 で定義した <table> の 2 番目の列で、方向を行および crosstab を 1 に設定した <table> を 1 つ定義します。このテーブルのエントリは、Construction グループの TotalConstruction の集約値から取得します。
これは行方向のテーブルなので、Construction タイプごとに 1 つの行で構成されます。これにより、このテーブルでは 1 つの列と 4 つの行が生成されます。エントリの色には青を指定します。この列の値のキャプションを、リテラル文字列の “Total” とします。
この <table> の <item> 要素および <caption> 要素で、colcount の値をそれぞれ指定します。これは、複数の列や行を持つクロス集計テーブルで必要な処理です。列が 1 つのみなので、この値は 1 です。
以下の図は、実際には 5 つの埋め込みテーブルで構成されているテーブルを、上記のコード例で 1 つのテーブルのように表示している様子を、境界線を使用して示しています。黒い境界線で囲まれている部分が、クロス集計テーブルの定義にある各 <table> に相当します。
ピボット・テーブル・ジェネレータの使用法
Zen には、次の操作を実現するピボット・テーブル・ジェネレータが用意されています。
-
データ・ソースのフィールドのうち、集約の対象とするフィールドの指定
-
データに基づいてクロス集計テーブル (ピボット・テーブル) を定義する Zen レポート・クラスの生成
ピボット・テーブル・ジェネレータでは、上記のセクションの説明にあるクロス集計テーブルの構文を使用した Zen レポート・クラスを出力します。クラスに直接記述しなくても構文を生成できるので、ページの外観よりもデータに集中して作業できます。その結果、作業時間の短縮や、より複雑で効果的なレポートの生成が可能になり、より高度なデータ分析を目指すことができます。
ピボット・テーブル・ジェネレータを呼び出すには、ターミナル・コマンド行プロンプトで ObjectScript コマンドのシーケンスを発行するか、Caché ルーチンまたはクラス・メソッドに文を配置します。以下のシーケンス例では、いくつかの保険証書の InsuredValue に対して COUNT 集約と SUM 集約を指定しています。
zn "USER"
set Gen=##class(%ZEN.Report.pivotTableGenerator).%New()
set Gen.reportName="InsurancePolicies"
set Gen.table="SQLUser.InsurancePolicies"
set Gen.group="Policy"
set Gen.cols="Region"
set Gen.rows="Flood,Construction,BusType"
set Gen.value="InsuredValue"
set agg = ##class(%ZEN.Report.aggregate).%New()
set agg.type="COUNT"
set agg.name="Count"
do Gen.aggs.Insert(agg)
set agg = ##class(%ZEN.Report.aggregate).%New()
set agg.type="SUM"
set agg.name="Sum"
do Gen.aggs.Insert(agg)
set Gen.className="PivotTables.FloodRegionBusTypeConstrGen"
set Gen.classNameForTotals="PivotTables.FloodRegionBusTypeConstrGenTotals"
do Gen.genZenReport()
kill
上記のコマンド・シーケンス例の内容は以下のとおりです。
-
現在のネームスペースを、新しいクラスを作成するネームスペースに変更します。
-
新しい %ZEN.Report.pivotTableGeneratorOpens in a new tab インスタンスを作成し、いくつかの基本的なプロパティを設定します。すべてのプロパティについては、この例の後に示すテーブルを参照してください。
-
新しい %ZEN.Report.aggregateOpens in a new tab オブジェクトを作成し、いくつかのプロパティを設定します (type の COUNT など)。設定可能なすべてのプロパティについては、"<aggregate>" セクションを参照してください。
-
%ZEN.Report.pivotTableGeneratorOpens in a new tab インスタンスの aggs コレクションに、この新しい COUNT 集約を追加します。
-
新しい %ZEN.Report.aggregateOpens in a new tab オブジェクトを作成し、いくつかのプロパティを設定します (type の SUM など)。設定可能なすべてのプロパティについては、"<aggregate>" セクションを参照してください。
-
%ZEN.Report.pivotTableGeneratorOpens in a new tab インスタンスの aggs コレクションに、この新しい SUM 集約を追加します。
-
className プロパティと classNameForTotals プロパティの値を指定し、%ZEN.Report.pivotTableGeneratorOpens in a new tab インスタンスの定義を終了します。
-
genZenReport() メソッドを呼び出し、指定した新しいクラスを生成してコンパイルします。手順 1 で指定したネームスペースに、これらのクラスが生成されます。
-
KILL を呼び出し、このコマンド・セッションで生成したローカル変数を削除します。
-
生成したクラスは、スタジオで編集して詳細を調整できます。
%ZEN.Report.pivotTableGeneratorOpens in a new tab には、以下のプロパティがあります。
プロパティ | 説明 |
---|---|
aggs |
%ZEN.Report.aggregateOpens in a new tab オブジェクトのコレクション。このコレクションの各メンバには次の特性があります。
|
className | 生成する Zen レポート・クラスのパッケージとクラスの完全な名前。 |
classNameForTotals | レポートで使用する集約値を提供する補足クラスのパッケージとクラスの完全な名前。生成した Zen レポート・クラスでは、<get> を使用してこの補足クラスを参照します。 |
cols | 出力したピボット・テーブルでは、各列に左から順番に 1 から始まる番号が割り当てられます。cols 属性には、出力テーブルの列 2 以降の列で列ラベルとして使用する文字列のコンマ区切りリストを指定します。 |
group | レポートで使用するために生成する XML データのエントリをグループ化する際に基準とするフィールド。 |
reportName | className で特定して生成する Zen レポート・クラスで、<report> の name 属性に使用する値。 |
rows | 出力したピボット・テーブルでは、各列に左から順番に 1 から始まる番号が割り当てられます。rows 属性には、出力テーブルの列 1 で行ラベルとして使用する文字列のコンマ区切りリストを指定します。 |
table | レポートのデータ・ソース。 |
以下のシーケンス例では、いくつかの保険証書の Policy 値に対して、CUSTOM の “一意値のカウント” 集約を指定しています。
zn "USER"
set Gen=##class(%ZEN.Report.pivotTableGenerator).%New()
set Gen.reportName="InsurancePolicies"
set Gen.table="SQLUser.InsurancePolicies"
set Gen.group="Policy"
set Gen.cols="Region"
set Gen.rows="Flood"
set Gen.value="Policy"
set agg = ##class(%ZEN.Report.aggregate).%New()
set agg.type="CUSTOM"
set agg.class="%ZEN.Report.Aggregate.CountDistinct"
do Gen.aggs.Insert(agg)
set Gen.className="PivotTables.FloodRegionGen"
set Gen.classNameForTotals="PivotTables.FloodRegionGenTotals"
do Gen.genZenReport()
kill
上記のコマンド・シーケンス例の内容は以下のとおりです。
-
現在のネームスペースを、新しいクラスを作成するネームスペースに変更します。
-
新しい %ZEN.Report.pivotTableGeneratorOpens in a new tab インスタンスを作成し、いくつかの基本的なプロパティを設定します。すべてのプロパティについては、上記のテーブルを参照してください。
-
新しい %ZEN.Report.aggregateOpens in a new tab オブジェクトを作成し、いくつかのプロパティを設定します。type を CUSTOM とし、class プロパティを使用して、集約を計算するクラスを特定します。設定可能なすべてのプロパティについては、"<aggregate>" セクションを参照してください。
-
%ZEN.Report.pivotTableGeneratorOpens in a new tab インスタンスの aggs コレクションに、この新しい CUSTOM 集約を追加します。
-
className プロパティと classNameForTotals プロパティの値を指定し、%ZEN.Report.pivotTableGeneratorOpens in a new tab インスタンスの定義を終了します。
-
genZenReport() メソッドを呼び出し、指定した新しいクラスを生成してコンパイルします。手順 1 で指定したネームスペースに、これらのクラスが生成されます。
-
KILL を呼び出し、このコマンド・セッションで生成したローカル変数を削除します。
-
生成したクラスは、スタジオで編集して詳細を調整できます。
以下の 2 つの図は、上記のコマンド・シーケンス例によって生成した Zen レポート・クラスを示しています。シーケンスのテキストは、この Zen レポート・クラスにすべて表示されていますが、この図では切り捨てたテキスト部分を省略記号 (...) で表しています。最初の図で示しているのは、DEFAULTMODE パラメータと XSLTMODE パラメータおよび XData ReportDefinition ブロックを中心とした、クラスの左側上部です。2 番目の図で示しているのは、XData ReportDisplay ブロックを中心とした、同じクラスの左側下部です。
コールバック・メソッドを使用したテーブル作成
テーブルのデータを指定するには、コールバック・メソッドを使用する方法もあります。ongetData 属性により、ObjectScript または他の適切な言語で記述され、かつサーバ上で実行されるメソッドの名前を指定します。これは参照により、ゼロ・ベースの 2 次元配列を返します。ongetData は、データの指定に Zen レポート・グラフで使用するコールバック・メソッドを指定する ongetData 属性と類似しています。“Zen レポートのグラフの値の指定” を参照してください。配列参照のほかに、2 番目の引数が ongetData コールバック・メソッドに渡されます。またこの引数は参照によって渡され、テーブルで定義されたパラメータ値を含みます。メソッド・シグニチャに parameters 引数がない場合は、エラーとなります。コールバック・メソッドには xmlfile Zen レポート・プロパティにアクセスできるので、Caché の組み込み XPATH 実装の使用により、XPATH 手法を使用したデータ生成が可能になります。コールバック・テーブルは、データをテーブルとグラフの両方で表示する場合に役立ちます。コールバック・テーブルの項目は fieldName 属性を使用できません。代わりに、fieldNum 属性を使用する必要があります。
以下のコードの例では、簡単なコールバック・テーブルを作成しています。レポートの ReportDefinition セクションはプレースホルダであることに注意してください。データはテーブル・コールバック・メソッドで生成されます。
Class MyApp.LoopTableCallback Extends %ZEN.Report.reportPage
{
/// ReportDefinition is a placeholder.
XData ReportDefinition [ XMLNamespace = "http://www.intersystems.com/zen/report/definition" ]
{
<report xmlns="http://www.intersystems.com/zen/report/definition"
name="MyReport" runonce="true">
</report>
}
XData ReportDisplay [ XMLNamespace = "http://www.intersystems.com/zen/report/display" ]
{
<report xmlns="http://www.intersystems.com/zen/report/display"
name="MyReport">
<body>
<table ongetData="NamesAndAddresses" >
<parameter value="EpicFigures" />
<item fieldnum="1" >
<caption value="Name"/>
</item>
<item fieldnum="2" >
<caption value="Address" />
</item>
</table>
</body>
</report>
}
Method NamesAndAddresses(ByRef var As %String, ByRef params)
{
if (params(1) = "EpicFigures")
{
Set var(0,0)="Santa Claus"
Set var(0,1)="North Pole"
Set var(1,0)="Zeus"
Set var(1,1)="Olympus"
Set var(2,0)="Robin Hood"
Set var(2,1)="Sherwood Forest"
}
if (params(1) = "RegularGuys")
{
Set var(0,0)="Joe Smith"
Set var(0,1)="Cleveland"
Set var(1,0)="Bob Jones"
Set var(1,1)="Boise"
Set var(2,0)="Fred Small"
Set var(2,1)="Deluth"
}
}
}
クラス・クエリからのテーブル作成
queryClass および queryName <table> 属性により、クラス・クエリのデータで直接的にテーブルを生成することが可能になります。queryClass でクラス名を指定し、queryName でクラス内のクエリ名を指定します。以下に例を示します。
<body>
<table queryClass="Sample.Person" queryName="ByName"
selectmode="2" orient="col">
<item fieldnum="1">
<caption value="ID"/>
</item>
<item fieldnum="2">
<caption value="Name"/>
</item>
</table>
</body>
また、テーブルでは orderBy 属性を使用して、結果の並べ替えを行うことができます。これは、クラスの書き換えにより目的の並べ替えができない場合に有効となります。suppressDuplicates 属性もサポートされています。
SQL を使用したテーブル作成
sql <table> 属性により、SQL 文のデータでテーブルを生成することが可能になります。sql 属性からデータを取得している場合、テーブルの <group> を使用することはできません。このようなテーブルの <item> 要素は、fieldnum 属性または fieldname 属性を使用することでデータを識別します。fieldnum により、SQL 文のプロジェクション・フィールドの 1 から始まる番号を指定します。fieldname により、SQL 文で返されるフィールドの名前を指定します。
<body>
<table
sql="SELECT NAME,AGE,FAVORITECOLORS FROM SAMPLE.PERSON WHERE NAME %STARTSWITH ?"
selectmode="2" orient="col" class="table4" >
<parameter value="B"/>
<item fieldname="NAME" suppressDuplicates="true" width="1.5in">
<caption value="Name"/>
</item>
<item fieldname="AGE" width=".5in">
<caption value="Age"/>
</item>
<item fieldname="FAVORITECOLORS">
<caption value="Favorite Colors"/>
</item>
<table sql="SELECT AGE,NAME FROM SAMPLE.PERSON WHERE NAME=?" selectmode="2" orient="col">
<parameter fieldname="NAME"/>
<item fieldname="AGE">
<caption value="Years Old"/>
</item>
</table>
</table>
</body>
onCreateResultSet を使用したテーブル作成
onCreateResultSet <table> 属性により、コールバック・メソッドを使用してテーブルにデータを移入できるようになります。onCreateResultSet 属性からデータを取得している場合、テーブルに <group> は使用できません。このようなテーブルの <item> 要素は、fieldnum 属性または fieldname 属性を使用することでデータを識別します。fieldnum により、SQL 文のプロジェクション・フィールドの 1 から始まる番号を指定します。fieldname により、SQL 文で返されるフィールドの名前を指定します。
<body>
<table onCreateResultSet="MyRS" selectmode="2" orient="col" class="table4">
<parameter value="B"/>
<item fieldname="NAME" suppressDuplicates="true" width="1.5in">
<caption value="Name"/>
</item>
<item fieldname="AGE" width=".5in">
<caption value="Age"/>
</item>
<item fieldname="FAVORITECOLORS">
<caption value="Favorite Colors"/>
</item>
</table>
</body>
Method MyRS(ByRef pSC, ByRef tParams)
{
set statement=##class(%SQL.Statement).%New()
set sql = "SELECT Name,Age,FavoriteColors FROM Sample.Person WHERE Name %STARTSWITH ?"
Set pSC=statement.%Prepare(sql)
Set statement.%SelectMode=2
Set ^foobar($i(^foobar))="pSC="_pSC
if $$$ISERR(pSC) quit ""
;zw tParams
if $D(tParams) {
Set rs=statement.%Execute(tParams(1))
} else {
Set rs=statement.%Execute()
}
quit rs
}
<timeline>
<timeline> 要素を使用して、エピソードのグラフィック要約を表示できます。エピソードとは、開始日と終了日のある期間のことです。
エピソードにはデータで生成されたことを示すものがあります。episode-type-node-set と generated-type-code の属性を使用して、生成データを特定できます。generated-type-color で指定された、他とは異なる色を使用して、生成されたデータをグラフ化できます。<timeline> は、データから時間軸の開始日と終了日を指定します。static-start-date と static-end-date の属性を使用して、自動計算をオーバーライドできます。変数は XPath 形式となります。定数文字列は、引用符で囲む必要があります。最初に <block>、<group>、<container> またはその他の “wrapper” 要素に <timeline> を配置しない限り、これを <table> 内に配置できません。
HTML および PDF の両方の出力に XSLTVERSION = 2.0 パラメータを設定し、XSLT バージョン 2.0 で処理する必要があります。XSLTMODE クラス・パラメータや $XSLT URI パラメータを使用して、XSLT 処理をブラウザに向けることはできません。既定では、XSLT 処理はサーバで行われます。
<timeline> には以下の属性があります。
属性 | 説明 |
---|---|
background-color |
時間軸グラフの背景色を指定する XPath 式。既定の background-color は白です。 |
current-date |
日付が日付データの範囲内にある場合に時間軸上で下向き矢印によって示される日付。既定では、current-date は時間軸グラフの生成日ですが、この属性を使用して、別の日付を設定できます。この属性の値は、大部分の <timeline> 属性とは異なり、XPath 式ではありません。 |
end-date-node-set |
終了日の XPath 式。 エピソードは、開始日、終了日、およびオプションのエピソード・タイプで構成されます。これらの 3 つのデータ型のノード・セットをグループ化して、XML ファイル内の位置に基づいてエピソードを形成します。まず開始日、終了日、そしてエピソード・タイプを検出すると、最初のエピソードを定義します。以後同様になります。 |
episode-type-node-set |
エピソード・タイプの XPath 式。エピソード・タイプは、エピソードが生成されたエピソードであるかどうかを判別します。 エピソードは、開始日、終了日、およびオプションのエピソード・タイプで構成されます。これらの 3 つのデータ型のノード・セットをグループ化して、XML ファイル内の位置に基づいてエピソードを形成します。まず開始日、終了日、そしてエピソード・タイプを検出すると、最初のエピソードを定義します。以後同様になります。 |
generated-type-code |
生成されるエピソードを示す文字列または整数を指定する XPath 式。Zen レポートでこの値がエピソード・タイプのノードに見つかると、エピソードは生成されたエピソードと見なされ、generated-type-color を使用してグラフが作成されます。 |
generated-type-color | 生成されたエピソードを描画するために使用する色を指定する XPath 式。生成されたエピソードとは、エピソード・タイプのノードに generated-type-code 値があるエピソードです。既定の generated-type-color はグレーです。 |
interval-height | エピソードの目盛りと X 軸の目盛りの高さを指定する XPath 式。 |
interval-type | 時間軸上のグラフを作成する間隔のタイプを指定する XPath 式。間隔のタイプは、“year”、“quarter”、“month”、または “day” にできます。間隔のタイプを指定しないと、これはデータにより決定されます。
interval-type は、以下の方法で、on-color および off-color と対話します。
|
max-height | エピソード・グラフの最大の高さ。 データ全体が空き領域に収まらない場合、非表示のエピソードは上向き矢印で示されます。この属性の値は、大部分の <timeline> 属性とは異なり、XPath 式ではありません。 |
minimum-interval-width | 時間軸における間隔の幅を指定する XPath 式。単位はミリメートル (mm) です。間隔は、日、月、四半期、または年にできます。定数は、"10mm" のように引用符で囲む必要があります。 |
number-of-intervals | グラフに間隔がある場合、その数。既定では、この値はデータから計算しますが、この属性を使用して、自動計算をオーバーライドできます。この属性の値は、大部分の <timeline> 属性とは異なり、XPath 式ではありません。 |
off-color | 間隔が "off" である場合に X 軸における間隔の色を指定する XPath 式。間隔のオンとオフの状態により、X 軸で間隔が視覚的にグループ化されます。どちらの間隔が “on” でどちらの間隔が “off” かは、interval-type 属性によって決定されます。既定の off-color は白です。 |
on-color | 間隔が "on" である場合に X 軸における間隔の色を指定する XPath 式。間隔のオンとオフの状態により、X 軸で間隔が視覚的にグループ化されます。どちらの間隔が “on” でどちらの間隔が “off” かは、interval-type 属性によって決定されます。既定の on-color はグレーです。 |
plotting-color | 生成されないエピソードをグラフ化するために使用される前景色を指定する XPath 式。generated-type-color を参照してください。既定の plotting-color は黒です。 |
start-date-node-set |
開始日の XPath 式。 エピソードは、開始日、終了日、およびオプションのエピソード・タイプで構成されます。これらの 3 つのデータ型のノード・セットをグループ化して、XML ファイル内の位置に基づいてエピソードを形成します。まず開始日、終了日、そしてエピソード・タイプを検出すると、最初のエピソードを定義します。以後同様になります。 |
static-end-date | データから終了日の自動計算をオーバーライドする XPath 式。右矢印は、静的な終了日の右にデータがあることを示します。 |
static-start-date | データから開始日の自動計算をオーバーライドする XPath 式。右矢印は、静的な開始日の左にデータがあることを示します。 |
以下は、timeline 要素の使用例です。
<timeline
plotting-color="'black'" background-color="'white'"
max-height="9" generated-type-code="'1'" generated-type-color="'gray'"
interval-height="'5mm'" minimum-interval-width="'5mm'" width="'2000mm'"
on-color="'gray'" off-color="'white'"
start-date-node-set="/MyTimeLine/dates/start-date"
end-date-node-set="/MyTimeLine/dates/end-date"
episode-type-node-set="/MyTimeLine/dates/episode-type"
static-start-date="'2009-07-20'" static-end-date="'2009-08-05'"/>
上記のコードにより、以下のデータ・セットで指定された時間軸グラフが生成されます。
<MyTimeLine>
<dates>
<start-date>2009-07-30</start-date>
<end-date>2009-07-31</end-date>
<episode-type>0</episode-type>
<start-date>2009-06-30</start-date>
<end-date>2009-07-31</end-date>
<episode-type>1</episode-type>
<start-date>2009-07-30</start-date>
<end-date>2009-07-31</end-date>
<episode-type>0</episode-type>
<start-date>2009-07-30</start-date>
<end-date>2009-07-31</end-date>
<episode-type>0</episode-type>
<start-date>2009-07-30</start-date>
<end-date>2009-07-31</end-date>
<episode-type>0</episode-type>
<start-date>2009-07-29</start-date>
<end-date>2009-08-15</end-date>
<episode-type>0</episode-type>
<start-date>2009-07-02</start-date>
<end-date>2009-08-03</end-date>
<episode-type>0</episode-type>
</dates>
</MyTimeLine>
ファイルにおけるデータ要素の配置のされ方には相当の柔軟性があることに注意してください。例えば、以下のデータ・セットにより、前述のグラフと同じ時間軸グラフが生成されます。
<MyTimeLine>
<dates>
<start-date>2009-07-30</start-date>
<start-date>2009-06-30</start-date>
<start-date>2009-07-30</start-date>
<start-date>2009-07-30</start-date>
<start-date>2009-07-30</start-date>
<start-date>2009-07-29</start-date>
<start-date>2009-07-02</start-date>
<end-date>2009-07-31</end-date>
<end-date>2009-07-31</end-date>
<end-date>2009-07-31</end-date>
<end-date>2009-07-31</end-date>
<end-date>2009-07-31</end-date>
<end-date>2009-08-15</end-date>
<end-date>2009-08-03</end-date>
<episode-type>0</episode-type>
<episode-type>1</episode-type>
<episode-type>0</episode-type>
<episode-type>0</episode-type>
<episode-type>0</episode-type>
<episode-type>0</episode-type>
<episode-type>0</episode-type>
</dates>
</MyTimeLine>