Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

5分でわかるActiveReports帳票(2013年度版)-ページレポート

ActiveReports for .NET 7.0Jで作るサンプル帳票(2)

  • LINEで送る
  • このエントリーをはてなブックマークに追加

 本連載では帳票作成コンポーネント「ActiveReports for .NET 7.0J」を使って帳票アプリケーションを作成していきます。今回は、ActiveReports for .NET 7.0Jで追加された新機能「ページレポート」について解説します。

前回の記事
備考

 本稿は、連載『5分でわかるActiveReports帳票(2007年度版)』(渡辺俊史・宮本奈紗 著)の増補改訂版です。

対象読者

  • Visual Basic.NETまたはVisual C#を使ってプログラムを作ったことのある方
  • 帳票作成ツールに興味のある方

必要な環境

  • Visual Studio 2008 SP1/2010/2012のいずれかでプログラムが作れる環境
    (Express EditionではActiveReportsをインストールできません)

 本記事のサンプルコードは、C#/Visual Basic 2012で記述しています。

ページレポート

 ActiveReports for .NET 7.0Jより、「ページレポート」が追加されました。ページレポートは、印刷結果と同じレイアウトでデザインできるWYSIWYGデザイナを提供しています。設計時のレイアウトがそのまま印刷結果に直結するため、直観的な帳票デザインができるようになっています。

 なお、6.0J以前と同じレポートデザイン形式も使用することができ、7.0Jではその形式は「セクションレポート」と呼ばれるようになりました。ページレポート、セクションレポートは異なるレイアウト形式のレポートですが、シームレスに1つのビューワで表示できます。

 ページレポートの詳しいアーキテクチャなどの情報が記載されているホワイトペーパーは、こちらからダウンロードできます。

セクションレポートとページレポートの違い

 セクションレポートとページレポートでは、レポートの構造が異なります。

 セクションレポートの場合は、データの数だけセクション(詳細セクション、グループヘッダセクションなど)を繰り返し出力することでページを構成します。そのため、デザイナ画面と実際の生成結果(印刷・プレビュー内容)は一致しません。

セクションレポートのデザイン画面
セクションレポートのデザイン画面
セクションレポートの概念
セクションレポートの概念

 一方、ページレポートの場合、デザイナ画面でページ上に表示したい要素としてコントロールを配置します。このときはデザイン画面と実際の生成結果はWYSIWYG(what you see is what you get:見たままが得られる)の関係になる点がセクションレポートと異なります。

 ページ上にデータを繰り返し表示させたい場合は、TableコントロールやListコントロールといった「データ領域(詳細は後述)」をページ上に配置します。このときはページ上のどの範囲までデータを繰り返し表示させるかを設定できます。例えば、下図「ページレポートのデザイン画面」の場合、斜線が引かれている部分に繰り返しデータが表示されます。

ページレポートのデザイン画面
ページレポートのデザイン画面
ページレポートの概念
ページレポートの概念

ページレポートのレポートコントロール

 ページレポートに配置可能なコントロールは、ツールボックスに表示されます。

ページレポートデザイン時にツールボックスに表示されるコントロール
ページレポートデザイン時にツールボックスに表示されるコントロール

 ページレポートのコントロールは、「データ領域」と「レポートコントロール」の2種類に分けられます。

データ領域

 コントロールに連結されたデータセットを元に、行や列などを決められた範囲(領域)に繰り返し出力するコントロールです。データ領域コントロール上には、後述のレポートコントロールを配置することも可能です。ただし、データ領域コントロール上に別のデータ領域コントロールを配置することはできません。

List

 連結されたデータ分だけ、データ領域部分を繰り返し出力するコントロールです。データ領域上の任意の場所に自由にレポートコントロールを配置できます。タックシールのように自由にレイアウトした項目を繰り返し出力するようなレイアウトに適しています。

BandedList

 基本的にListコントロールと同様に自由に配置したレポートコントロールを繰り返し出力できるコントロールですが、グループヘッダ/フッタを定義できます。

Matrix

 縦方向だけではなく、横方向にも繰り返しデータを出力できるコントロールです。

Table

 行と列で構成されるコントロールです。ヘッダやフッタも定義でき、データセットを単純な表として表示するのに適したコントロールです。

Chart

 グラフを出力するためのコントロールです。

OverflowPlaceHolder

 List、BandedList、Matrix、Tableなどの他のデータ領域について、設定した範囲にデータが収まりきらない時、その続きを表示する場所を指定するためのコントロールです。詳細については後述します。

レポートコントロール

 レポート上に実際にデータを表示するためのコントロールです。これらは上記の「データ領域」内に貼り付けたり、ページレイアウト上に直接貼り付けて使用します。

Barcode

 バーコードシンボルを表示するためのコントロールです。

Bullet

 データを1次元的なグラフ形式で表示するためのコントロールです。

Calendar

 日付を基にしたデータなどをカレンダー形式で表示するためのコントロールです。

CheckBox

 ブール型のデータをチェックボックス形式で表示するためのコントロールです。

Container

 複数のレポートコントロールのコンテナとなるコントロールです。複数のコントロールを視覚的にグループ化する時などに使用します。

FormattedText

 データのマージ操作やXHTML書式付きのテキストを表示することができるコントロールです。

Image

 画像を表示するためのコントロールです。

Line

 直線を表示するためのコントロールです。

Shape

 四角形、角丸四角形、楕円などの図形を表示するためのコントロールです。

SparkLine

 データの傾向を5種類の簡易的なグラフで表示することができるコントロールです。

TextBox

 データ(文字列)を表示するための最も一般的なコントロールです。

ページレポートを使ったアプリケーションの作成

 ここからは、ページレポートを作成・表示するアプリケーションを作成し、基本的なフローを確認します。ここでは、例として、前回のセクションレポートと同様のレイアウトを作成します。

ページレポートのレイアウトファイルの追加

 まずページレポートをプロジェクトに追加しましょう。ソリューションエクスプローラー上でプロジェクトを右クリックして、[追加(D)]-[新しい項目(W)]から「ActiveReports 7.0Jページレポート(XML)」を選択します。拡張子が.rdlxのファイルがプロジェクトに追加されます(ここでは、追加するファイルの名前は「ProductList.rdlx」とします)。

ページレポートファイルの追加
ページレポートファイルの追加

 レポートのデザイン画面では、中央部分がマス目状になっているページが表示されます。レイアウト可能なのはこのマス目状の部分です。周囲の白い部分はマージン(余白)です。

追加されたページレポート
追加されたページレポート

用紙の設定

 最初に用紙の設定をしておきましょう。デザイナ画面上の任意の場所をクリックし、メニューバーから[レポート]-[レポートのプロパティ]を選択すると、レポート全体のプロパティ設定ダイアログが表示されます。

 [外観]タブから、用紙サイズやマージンを設定することができます。なお、プロパティ設定ダイアログはプロパティウィンドウの「コマンド」ペインからも呼び出すことができます。

用紙サイズの設定
用紙サイズの設定
コマンドペインからもプロパティ設定ダイアログを呼び出せます
コマンドペインからもプロパティ設定ダイアログを呼び出せます

データソースの接続とデータセットの追加

 次に、データソースとデータセットをレポートに設定します。

 データソースとは、Accessファイルや、SQL Serverなどのデータベースへの接続情報です。データセットとは、データソースの接続先から取得したレポートに出力するデータです。データを取得するためのSQL文などを設定します。

 デザイナ画面を表示し、レポートエクスプローラのタブから[データソース]の項目を右クリックし、[データソースの追加]を選択します。データソースが追加され(デフォルト名は「DataSource1」)、レポートデータソースダイアログが表示されます。

データソースの追加
データソースの追加
データソースダイアログ
データソースダイアログ

 使用するデータベースを指定します。ここでは、製品に付属するAccessファイルのNwind.mdbに接続します。[種類:]は「Microsoft OleDb Provider」、[接続:]の[OLE DBプロバイダ:]は「Microsoft Jet.OLEDB.4.0」を選択します。

 次に、データセットを追加します。レポートエクスプローラ上で追加したデータソースを右クリックし、[データセットの追加]を選択します。データセット(デフォルト名は「DataSet1」)が追加され、データセット設定ダイアログが表示されます。[クエリ]タブを開き、[クエリ]欄にSQL文を記入します。

データセットダイアログ
データセットダイアログ
クエリに記入するSQL
SELECT Products.ProductID, Products.ProductName,
       Suppliers.CompanyName, Products.UnitsInStock
FROM   Suppliers
INNER JOIN Products ON Suppliers.SupplierID = Products.SupplierID

 SQL文を入力したら、入力欄の右上にある[データセットの検証]アイコン(チェック記号のアイコン)をクリックしてください。データ取得が可能なSQL文かどうかチェックします。SQL文が問題なければ、[OK]ボタンをクリックします。データセットが追加されます。

 追加されたデータセットを展開してみてください。データを正しく取得できていれば、”ProductID”などのフィールドが表示されます。

データセットに追加されたフィールド
データセットに追加されたフィールド

レイアウトの作成

 次にレイアウトを作成します。まずは、Listコントロール(データ領域)を使用して、データを繰り返し出力する部分を定義します。

 ツールボックスからレポートへListコントロールをドラッグして配置します。

 次は、そのListコントロールの縦横のサイズ(Sizeプロパティ)を調整します。ここでは横15cm、縦1cmとします。Listコントロールのようなデータ領域コントロールの場合、ここで設定した領域が繰り返し出力される部分になります。

 次に、このListコントロール上にデータを表示するためのTextBoxを配置します。レポートエクスプローラのデータセット配下に表示されている”ProductID”などのフィールドをドラッグし、Listコントロール上にドロップします。こうすることで、ドラッグしたフィールドの値が、配置したTextBoxに表示されます。

 最後に、TextBoxを配置した部分(Sizeプロパティで設定した領域)が繰り返し出力される範囲を設定します。

 Listコントロールなどのデータ領域コントロールにおいて、データを繰り返し出力する範囲を決定するのは「FixedSizeプロパティ」です。プロパティウィンドウからFixedSizeプロパティを展開し、データ領域が繰り返し表示される範囲を設定します。ここでは横15cm、縦22cmとします(縦方向だけ設定すれば、横方向はコントロールの幅にあわせて自動的に設定されます)。

 FixedSizeプロパティで設定した範囲は、デザイナ上では斜線がけ状に表示され、レポートの実行時には、この領域一杯にListコントロールのレイアウト部分(背景が白い部分)が繰り返し出力されます。

 以上で、データが繰り返し出力される部分の設定は完了です。

 次は、「商品一覧」「商品コード」「商品名称」「仕入先」「在庫数量」など項目タイトルを表示するためのTextBoxをツールボックスからドラッグして配置します。配置したそれぞれのTextBoxのValueプロパティに、「商品一覧」などの表示したい文字列を設定します。

 なお、必要に応じてフォントや文字の位置(TextAlignプロパティ)を設定したり、Lineコントロールを配置します。

デザイン画面
デザイン画面
※1

 「商品一覧」「商品コード」「商品名称」「仕入先」「在庫数量」と表示されているTextBoxは、ツールボックスからドラッグ&ドロップしてValueプロパティに文字列を設定したもの。Listコントロール上に配置されている4つのTextBoxは、レポートエクスプローラのデータセットからドラッグ&ドロップしたもの。

 この段階でレポートデザイナの「プレビュー」タブを開くと、レポートが表示されます。

プレビュー結果
プレビュー結果

呼び出し元アプリケーションの作成

 帳票を呼び出すアプリケーションを作成します。フォームに[帳票生成]ボタン(button1)と、生成された帳票の内容を確認するためのViewerコントロール(viewer1)を配置します。これは前回のセクションレポートを呼び出すフォームと同様です。

帳票の生成処理

 コントロールの配置が終わったら[帳票生成]ボタンをダブルクリックし、実際に帳票を生成してビューアに表示するためのコードを実装します。

 ページレポートの場合はセクションレポートと若干処理が異なり、.rdlxファイルをViewerのLoadDocumentメソッドで読み込むという処理になります。

帳票生成コード(C#)
        private void button1_Click(object sender, EventArgs e)
        {
            // .rdlxファイルを読み込む
            viewer1.LoadDocument("ProductList.rdlx");
        }
帳票生成コード(Visual Basic .NET)
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        ' .rdlxファイルを読み込む
        Viewer1.LoadDocument("ProductList.rdlx")
    End Sub
※2

 上記のコードでは、読み込む.rdlxファイルを相対パスで指定しております。ソリューションエクスプローラ上で.rdlxファイルを選択し、プロパティウィンドウから[出力ディレクトリにコピー]を「常にコピーする」に設定してください。こうすることでビルド時に実行ファイルと同じ場所に.rdlxファイルがコピーされ、相対パスで指定することが可能になります。

 実行すると、ページレポートを表示するアプリケーションが表示されます。

ページレポートを表示するアプリケーション
ページレポートを表示するアプリケーション

より複雑なレイアウト:OverflowPlaceHolderの使用

 基本的な使い方は以上ですが、より複雑なレポートを作成してみましょう。ここでは、以下のことを行います。

  • OverflowPlaceHolderコントロールを使用して、表の部分を複数に分ける。
  • 同一レポート内で複数のレイアウトを使用する。

OverflowPlaceHolderコントロール

 OverflowPlaceHolderコントロールは、List、BandedList、Matrix、Tableなどのデータ領域について、FixedSizeプロパティに設定した範囲に出力するデータが収まりきらない時、その続きを表示する場所を指定するためのコントロールです。

 通常、Listなどのデータ領域に表示するデータが1ページに収まりきらない場合、そのあふれた部分のデータは、次のページに同じレイアウトで表示することになります。これは、そのデータ領域に出力すべきデータがなくなるまで繰り返されます。

 しかしながら、レポートの要求仕様によっては、データ領域にデータが収まりきらない時、ただ同じレイアウトをページごとに繰り返すのではなく、レイアウトを変えて出力したい場合もあると思われます。例えば2段組や3段組にする、最初のページとあふれたデータを出力する2ページ目以降のレイアウトを変更する、といったレイアウトが考えられます。

 ページレポートの場合、同一レポート内に複数のレイアウトを定義することが可能であり、レイアウトをまたいでデータ領域とOverflowPlaceHolderを連結させることもできますので、こうしたレイアウトを実現できます。

単一のデータ領域のみを使用した場合
単一のデータ領域のみを使用した場合

 データ領域に出力データが収まりきらなくなったら、同じレイアウトで繰り返し出力します。

複数のレイアウトを定義してOverflowPlaceHolderを使用した場合
複数のレイアウトを定義してOverflowPlaceHolderを使用した場合

 データ領域とOverflowPlaceHolderを連結させることで、データ領域からあふれた部分をページ上の任意の場所に続けて出力できます。また、一番最後のOverflowPlaceHolderまでデータが出力されても、まだ出力すべきデータが存在する場合には、そのOverflowPlaceHolderが配置されているページのレイアウトで繰り返し出力します。

 ここからは、OverflowPlaceHolderを使用する一例として、前の手順で作成した「商品一覧」のページレポートを元に、一覧部分を2段組にした上で、1ページ目とそれ以降のページでレイアウトが異なるようなレポートを作成してみます。

ページ1レイアウト

 まず、タイトルとして配置した「仕入先」と「在庫数量」のTextBoxを削除します。

 次に、List上に配置しているCompanyNameとUnitsInStockの値を出力するためのTextBoxを削除します。削除したらListの幅を縮めます(ここでは幅を7cmとします)。このときはFixedSizeプロパティの幅(Widthプロパティ)もコントロールの幅(Size.Widthプロパティ)と同じ値に設定します。

 次は、同じサイズのOverflowPlaceHolderをListの右隣に配置します。名称はデフォルトのOverflowPlaceHolder1としておきます。OverflowPlaceHolder1の上方に「商品コード」と「商品名称」のタイトルをコピーして貼り付けます。

 上記のような手順を行うことで、ページ1のレイアウトが完成します。

ページ1のレイアウト
ページ1のレイアウト

ページ2レイアウト

 次は、2ページ目以降のレイアウトを定義する手順を説明します。

 デザイナ下部の「ページ1」タブの隣にある「新規」タブをクリックします。すると「ページ2」が作成されます。これが2ページ目以降のレイアウトになります。

 「ページ2」上にOverflowPlaceHolderと「商品コード」「商品名称」のTextBoxをそれぞれ2つずつ貼り付けます。配置した2つのOverflowPlaceHolderの名前はそれぞれ、OverflowPlaceHolder2、OverflowPlaceHolder3とします。

 このようにすることで、ページ2のレイアウトが完成します。

ページ2のレイアウト
ページ2のレイアウト

 レイアウトができたら、最後に各データ領域コントロール同士を連結させます。

 ListのOverflowNameプロパティに、「OverflowPlaceHolder1」を設定します。このように設定することで、Listに収まりきらなかったデータはOverflowPlaceHolder1の部分に継続して出力されることになります。

 同様に、OverflowPlaceHolder1のOverflowNameプロパティには「OverflowPlaceHolder2」を、OverflowPlaceHolder2のOverflowNameプロパティには「OverflowPlaceHolder3」を設定します。OverflowPlaceHolder3のOverflowNameプロパティは空白のままで構いません。

 この状態でレポートを表示させると、1ページ目は「商品一覧」の見出しがあり、2ページ目以降は見出しがない2段組レポートができます。

まとめ:セクションレポートとページレポート

 ページレポートを使うと、セクションレポートでは実現しにくいレイアウトも実現できる場合があります。特にOverflowPlaceHolderコントロールを使用すると、セクションレポートでは実現しにくい自由なレイアウトを実現できます。

 ただその一方で、セクションレポートの方が得意な処理もあります。例えば、セクションレポートの場合、さまざまな「イベント」が用意されており、コードによる処理を記述するのも容易であり、柔軟性に優れた面があります(ページレポートには「イベント」という概念が存在しません)。

 レポートを作成する最初の段階で、どちらのレポート形式が適しているかを検討してみてください。

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5