ActiveReports通信

.NET帳票開発ツール ActiveReports の技術情報をお届けします。

ActiveReports これ知ってる?-第10回:Excelライクなヘッダ固定のクロス集計表-

今回はActiveReports for .NET 11.0J SP1に搭載された新機能「Table/Tablixのヘッダ固定機能」を紹介します。

この機能、どういったシーンで有用かと申しますと、まずは行列ヘッダを持ったクロス集計表を想定してみてください。クロス集計表はデータ数に応じて帳票が縦横方向に伸長していきます。データ数が少なければ可視化は容易ですが、数が多いとデータが全て画面に収まらずマウス等でスクロール操作をしなければなりません。その結果、ヘッダが見切れてしまい、目当ての数字が何を意味しているのか解らなくなってしまう。といった問題が発生します。

Excelの場合、対処策として「ウィンドウ枠の固定」という機能が用意されており、任意の行や列を固定表示できます。ActiveReportsにも、まさにこれに相当する機能があるんです。

f:id:ComponentOne_JP:20170809120443p:plain

どんな帳票、どんなシチュエーションでもこの機能が有効かというと、残念ながらそうではありません。以下の条件を満たしている必要があります。

  1. RDLレポート
  2. TableもしくはTablix
  3. HTML5ビューワ(ゲラモード)

RDLレポートはバージョン9.0Jから提供を開始した帳票形式です。マルチデータソースが扱え、TableやTablixといったデータ表示専用のコントロールを用いることで手軽に大量データの一覧表示が可能です。また、帳票プレビュー時にページ化を無視するプレビュー方式「ゲラモード」が利用できるため、ページ遷移無しに大量データを閲覧できます。

ヘッダの固定方法は非常に簡単です。FrozenColumnsプロパティ、FrozenRowsプロパティに固定したい列数(行数)をセットするだけ。例えば、以下のような2列2行のヘッダを持ったTablixの場合、それぞれのプロパティに2をセットすると、先頭から2列2行分のヘッダが固定表示されスクロール対象となりません。

f:id:ComponentOne_JP:20170809120601p:plain

実際にHTML5ビューワのゲラモードで表示すると次のような表示結果になります。表示されるページは1ページのみ。これは縦横に非常に大きなページサイズを持つ帳票が表示されていることを意味します(もちろん、通常モードのプレビューを選択した際は10ページ程に分割表示されます)。

f:id:ComponentOne_JP:20170810113511p:plain

この状態でビューワのスクロールバーを動かすと、以下のようにヘッダが固定された状態でデータを閲覧できます。

f:id:ComponentOne_JP:20170809120836g:plain

いかがでしたでしょうか。帳票というと紙やPDFでの出力をターゲットとした静的な固定帳票を思い浮かべがちですが、ActiveReportsはそういった従来の帳票をサポートするほか、画面上でユーザーとの対話を通じてデータを可視化するといった動的帳票を支援するための機能も幅広く提供しています。こうした機能は従来のセクションレポートではなくページレポートやRDLレポートに多く提供されます。

機会があれば製品ヘルプの「データ可視化」や「対話的な機能」を参考に動的帳票の作成にチャレンジしてみると良いでしょう。

ActiveReports これ知ってる?-第9回:新機能紹介「Lookup関数」-

今回のテーマは11.0Jの新機能「Lookup関数」です。

Lookup関数は、異なるデータセットから値を取得するための関数です。ページレポート/RDLレポートのValueプロパテイの式として使用できます。この関数の強みは「ページレポートでも使える」ことにあります。ご存知の方も多いかと思いますが、ページレポートではデータセットを複数登録することはできても、レポート上に表示できるフィールドは単一のデータセットに限定されています。

レイアウト的にはページレポートを使用したいけど、データセットを複数参照する必要があるからRDLレポートを使用しているというお客様も中にはいらっしゃるのではないでしょうか。新機能の「Lookup関数」を使用すると、データセットから直接的に値を取得できるため、ページレポートでも複数のデータセットの値をレポート上に表示することが可能になります。

f:id:ComponentOne_JP:20170731172008p:plain

具体的な使用方法は、「Lookup関数」に4つの引数を渡します。たとえば、TableにユーザーID(UserID)が表示されていて、別のデータセット(DataSet2)にユーザー情報(ID、Name)が存在する場合、以下のような記述でユーザー名を取得できます。

◆Lookup関数の利用例

=Lookup(Fields!UserID.Value, Fields!ID.Value, Fields!Name.Value, "DataSet2"))

関数の詳細については、製品ヘルプ「データ領域での複数データセットの使用」トピックをご確認ください。

また、別のデータセットから値を取得したいという要件では、集計値を取得したいというケースも多いと思われます。しかしながら、取得先のデータセットに該当するレコードが複数ある場合、Lookup関数は1つの値しか取得しません。また、以下のように他の関数と併用することもできません。

◆動作しない例(Lookup関数の中でSum関数を利用)

=Lookup(Fields!ProductID.Value, Fields!ProductID.Value, Sum(Fields!Quantity.Value), "DataSet2"))

 上記の要件を実現するためには、データセット自体を合計値取得用として登録する必要があります。あらかじめSQLクエリで集計した値をデータセットとして登録しておけば、その値をLookup関数で取得できます。

「Lookup関数」を活用すれば、今までページレポートでは実現が困難であったレイアウトも実現できる可能性があります。ぜひお試しください。

ActiveReports これ知ってる?-第8回:新機能紹介「CSVデータソース」-

ActiveReports for .NET 11.0JではレポートのデータソースとしてCSVファイルを利用可能にする「CSVデータソース」が追加されました。

f:id:ComponentOne_JP:20170721160640p:plain

 本連載の第3回で紹介した通り、ActiveReportsには今までCSVファイルをデータソースとして使用する独自の機能はありませんでしたが、この新機能を使うことで、より簡単にCSVファイルからのデータ取得が設定できるようになりました。

設定方法としては[レポートデータソース]ダイアログから[CSVデータソースの設定]ダイアログを開き、CSVファイルのパスを指定するだけです。ダイアログの表示手順の詳細は製品ヘルプの以下のトピックをご確認ください。

 
◎セクションレポート - 「レポートとデータソースの連結
◎ページレポート/RDLレポート - 「データソースとの接続
 
[CSVデータソースの設定]ダイアログでは、区切り文字(カンマ等)や改行コード、ヘッダの有無等の設定が可能であり、ダイアログ上に表示されるデータプレビューにもリアルタイムで反映されるので、適切な設定を選択できます。
 
また、列毎のデータ型を指定しておくことで、レポート側に設定された書式(OutputFormat、Formatプロパティ)を反映させることもできます。
※書式設定は文字列型のデータには反映されません。
 
独自にCSVデータの取得を実装されていた方は、新機能を是非お試しください。
CSV Providerの詳細は製品ヘルプの「CSV Provider」をご覧ください。
 
この記事はグレープシティが発行するメールマガジン「ActiveReports通信」の第20号(2017年6月発行)に掲載された記事を、加筆修正して転載したものです。

ActiveReports これ知ってる?-第7回:新機能紹介「Tablix」-

ActiveReports for .NET 11.0Jではページレポート/RDLレポートに新しいコントロール「Tablix」が追加されました。このコントロールは9.0J以前のMatrixの機能を引き継いだものであり、クロス集計表の作成に便利な機能を提供しています。
 
また、Matrixでは対応できなかったレイアウトを実現するための機能も多数追加されています。たとえば、以下のような設定が可能です。

改ページ時の行/列ヘッダの表示有無を設定

クロス集計表では、行方向、列方向に改ページが発生する可能性がありますが、改ページ後にヘッダを表示するかどうかは、帳票の要件によって異なるものです。Matrixではヘッダは必ず出力される動作になっていましたが、Tablixでは「RepeatColumnHeaders」、「RepeatRowHeaders」というプロパティによって、行/列ヘッダの出力有無を個別に指定できるようになっています。

行/列ヘッダのセル結合

Tablixではヘッダのセルを結合することができます。これによって、ヘッダ内での段組みを必要とするレイアウトにも対応可能になりました。

f:id:ComponentOne_JP:20170721154313p:plain

集計セルの出力位置を変更

Matrixでは、集計用のセルはデータ出力用のセルの後(最下段/最右列)にしか表示できませんでしたが、Tablixではこれを逆位置に表示することもできます。また、集計セルに対して、行や列を追加するといったことも可能になっています。これによって、集計行/列に複数の値を並べて配置するようなレイアウトにも対応可能です。
 
操作方法に関しても、デザイナにグループエディタが追加され、Tablixに設定されたグループの構造を視覚的に把握することができるようになりました。Matrixを使用したことのある人は操作の違いに戸惑うかもしれませんが、慣れると直感的にデザインをすることができます。
 
製品ヘルプでは画像付きで具体的な使用方法を説明していますので、ぜひ一度お試しください。
 
この記事はグレープシティが発行するメールマガジン「ActiveReports通信」の第19号(2017年4月発行)に掲載された記事を、加筆修正して転載したものです。

ActiveReports これ知ってる?-第6回:複数のレポートを一つのPDFにする方法-

 
今回は複数のレポートを一つのPDFとして出力する方法をご紹介します。
ActiveReportsには、複数のレポートを一つのレポートにする方法がいくつか用意されています。詳しくは以下のナレッジ文書をご覧ください。
セクションレポートの場合、レポートを生成した後でページ単位で結合する方法が使用できるため、結合後のレポートをPDFにエクスポートすれば、一つのPDFとして出力可能です。
 
一方、ページレポート/RDLレポートにはページ単位で結合する方法はなく、レイアウト段階で複数のレイアウトを組み合わせるという手段をとることになります。このため、別々に生成されたレポートを結合することはできません。
 
しかしながら、PDFエクスポートに限っては、エクスポート処理時にレポートを結合する方法が用意されています。
 
具体的な方法としては、描画拡張機能によるエクスポート時にDocumentToAddBeforeReport/DocumentToAddAfterReportプロパティに既存のPDFファイルのパスを指定することでレポートと結合されたファイルを出力することができます。
◆サンプルコード(VB.NET)
Dim settings As New GrapeCity.ActiveReports.Export.Pdf.Page.Settings()
settings.DocumentToAddBeforeReport = "C:\PDF\tmp.pdf"
◆サンプルコード(C#)
var settings = new GrapeCity.ActiveReports.Export.Pdf.Page.Settings();
settings.DocumentToAddBeforeReport = @"C:\PDF\tmp.pdf";
◆参考情報
製品ヘルプ「PDFへの描画」トピック

このプロパティは既存のファイルとの結合を行うためのプロパティですが、ActiveReportsによって出力したファイルを対象とすることも可能ですので、レポートをPDFファイルとして保存し、次々と結合していけば、レポートを結合したPDFファイルが得られます。

なお、どちらの方法でも、用紙サイズや向きが異なるレポートを一つのPDFとして出力できます。大量のレポートを保存する必要がある際は、こちらの方法もぜひご検討ください。

この記事はグレープシティが発行するメールマガジン「ActiveReports通信」の第18号(2017年2月発行)に掲載された記事を、加筆修正して転載したものです。

ActiveReports これ知ってる?-第5回:フィルタ機能を活用しよう-

 ページレポート/RDLレポートには、データセットやデータ領域(ListやTable)で表示されるデータを制限するためのフィルタ機能が用意されています。

f:id:ComponentOne_JP:20170721143851p:plain

 
使い方はとても簡単で、各設定ダイアログでフィルタを追加し、「式(フィールド)」、「演算子」、「値」を設定することで、特定のフィールドに対して条件付けを行うことが可能です。詳しくは製品ヘルプの「フィルタ」トピックをご覧ください。
 
この機能、認知度が低いのか、サポートサービスにもほとんど質問が届いたことがありません。
 
SQLクエリで抽出したり、レポート実行時にデータソースを設定することで代用も可能なので、知っているけど使う必要がないと感じている人も多いのかもしれません。
しかしながら、フィルタを活用すると他の機能では困難な仕様を簡単に実現できるケースもあります。たとえば、以下のような活用法が考えられます。

 XMLやCSVファイルをデータソースとする場合

SQLクエリによる抽出を行えない場合でも、フィルタを使用すればデータの一部のみをレポートに表示できます。コード上で独自にデータ抽出を行うことも可能ですが、フィルタを使用するとデザイナからの操作だけで同じことを実現可能です。

1ページに複数の表があるレイアウトの場合

データとしては1つだけど、グループ毎に別々の表に出力したいという要望はしばしばあるのではないでしょうか。このようなレイアウトをセクションレポートで実現する場合、コード上でデータの振り分けを制御するか、サブレポートを使用する方法が考えられますが、どちらの方法も処理が複雑になる傾向があります。ページレポートの場合、Tableデータ領域を複数配置し、それぞれに異なるフィルタを設定すると簡単に同じレイアウトを実現できます。

固定レイアウトの帳票を作成しているけど、サブレポートがないからページレポートは使えないと諦めていた方は、フィルタ機能を使用することで実現可能かもしれません。是非お試しください。

この記事はグレープシティが発行するメールマガジン「ActiveReports通信」の第16号(2016年12月発行)に掲載された記事を、加筆修正して転載したものです。

ActiveReports これ知ってる?-第4回:HTML5ビューワでレポートデータソースを変更する方法-

ActiveReports for .NET 11.0J では、Internet Explorer/Microsoft Edgeに加えて、ChromeおよびSafari for iOS(iPad/iPhone)での閲覧をサポートするHTML5ビューワを使用することができます。
 
昨今、このHTML5ビューワの使用方法についての質問が増えてきています。その中でも頻繁に頂く質問に「レポートのデータソースを変更できないか?」というものがあります。この方法について、先日ナレッジ文書を公開いたしました。

www.grapecity.com

今回はこの文書の「2.Webサービスをカスタマイズする方法」で紹介しているサンプルの実装内容について解説いたします。
 
本サンプルは、文書内にもあるように、Webサービスをカスタマイズすることによってレポートに設定するデータソースを動的に変更できるようにしています。処理の概要は以下のようになっています。 
  1. JavascriptでHTML5ビューワに設定するオプション"reportID"に画面項目によってパラメータを付加する
  2. カスタマイズしたWebサービス「MyReportService」のイベント「OnCreateReportHandler」の引数で"reportID"を受け取る
  3. "reportID"内のレポートパスでレポート形式を判別する
  4. "reportID"内のパラメータで使用するデータソースを決定する
  5. データソースを設定したレポートを生成し、HTML5ビューワに返す
ポイントとしては、本サンプルでは"reportID"に設定する文字列の形式を"レポートパス?データソース名"としています。
 
ここで"レポートパス"は、コード形式のセクションレポートの場合はクラスの完全名を、それ以外のレポート形式の場合はレポートファイルのファイルパスを指しています。

本サンプルで行ったカスタマイズでは、汎用性を持たせるために"レポートパス"の文字列からレポート形式を判断し、レポートの生成方法やデータの設定方法を分岐させていますが、最終的にレポートの生成結果を返せれば、カスタマイズの方法は自由です。
 
たとえば、以下のような方法も考えられます。
  1. イベント内での分岐条件に使用する値をそのまま"reportID"に設定する。(スクリプト内にはレポート名を記述しない)
  2. "reportID"にパラメータを複数付加し、イベント内でSQLクエリの生成に使用する。(例:レポートパス?...&...&...)
業務アプリケーションの場合、画面項目で条件を複数選択した上でレポートを表示したいことが多いと思われますので、要求仕様に合わせた独自のカスタマイズをお試しいただけると幸いです。
 
HTML5ビューワ自体を使用したことがない方は、以下の技術情報をご覧ください。

codezine.jp

この記事はグレープシティが発行するメールマガジン「ActiveReports通信」の第15号(2016年11月発行)に掲載された記事を、加筆修正して転載したものです。