データソースの変更
セクションレポートでは、デザイン時にデータソースアイコンからデータソースの設定を行うことが可能です(第1回参照)。
しかしながら、実際のアプリケーションでは、レポートのデータソースは出力したい条件にあわせて変更したいケースが多いと思われます。
セクションレポートでは、DataSourceプロパティにデータソースとなるオブジェクトを設定することで、簡単にデータソースを変更することができます。
データソースとして使用できるオブジェクトには、以下のようなものがあります。
- GrapeCity.ActiveReports.Data名前空間のデータソースクラス
- DataSet
- DataTable
- DataView
- DataRowCollection
- DataReader
- IListインターフェースを実装したクラス
これらをレポートのDataSourceプロパティに設定してから、レポートの実行(Runメソッドの呼び出しなど)を行います。
一例として、OleDbDataConnection、OleDbDataAdapterクラスを利用してAccessのmdbファイルに接続してDataTableを取得し、レポートに設定するコードを示します。
Dim filepath As String = "(ファイルへのパス)\Accessファイル.mdb" Dim cn As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & filepath) Dim sqlstring As String = "Select * from Products order by CategoryID" Dim da As New OleDb.OleDbDataAdapter(sqlstring, cn) Dim ds As New DataSet Dim dt As New DataTable da.Fill(dt) ‘ 得られたDataTableをレポートに設定して実行 Dim rpt As New NewReport1() rpt.DataSource = dt rpt.Run()
string filePath = @"(ファイルへのパス)\Accessファイル.mdb"; System.Data.OleDb.OleDbConnection cn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath); string sqlString = "Select * from Products order by CategoryID"; System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(sqlString, cn); System.Data.DataTable dt = new System.Data.DataTable(); da.Fill(dt); // 得られたDataTableをレポートに設定して実行 NewReport rpt = new NewReport(); rpt.DataSource = dt; rpt.Run();
Accessのmdbファイルも含め、データベースに接続する場合には接続文字列が必要になります。これはActiveReportsの組み込みデータソースを使う場合も同じです。上記の例では、OleDbConnectionのコンストラクタの引数に設定している文字列が接続文字列になります。
接続文字列はデータソースの種類ごとに仕様が異なるので、一から記述するのは難しい時があります。簡単に構成する方法としては、System.Data.OleDb.OleDbConnectionStringBuilderなどの接続文字列ビルダを使う方法があります。
また、ActiveReportsのデータソースアイコンで自動作成された接続文字列をコピーして使うという方法もあります。
アンバウンドレポート
レポートの要件によっては、DataTableなどのデータソースを使わずにレポートを生成しなければならない場合もあります。このような場合、「アンバウンドレポート」という手法が有効です。
デザイン時にデータソースアイコンからデータソースを設定した場合や、前述のようにDataSourceプロパティにデータオブジェクトを設定した場合、データソースへの接続やレコードの読み込み・移動などは、レポートエンジンがすべて自動的に行います、これを「バウンドレポート」と言います。
これに対して、アンバウンドレポートの場合、フィールドの追加やデータソースへの接続、レコードの移動、データのセット等の処理は、すべてコードで制御します。この手法は、テキストファイルや、配列に格納されたデータなど、さまざまなデータを元にレポートを生成するといった用途に向いています。
アンバウンドレポートの基本的な構成手順は、以下のようになります。
(1)DataInitializeイベントで、必要なフィールドを追加する。
(2)FetchDataイベントで、レポートの生成を続けるかどうかを、イベントの引数であるSectionReport.FetchEventArgsオブジェクトのEOFプロパティで設定する。同時に(1)で追加したフィールドに値を設定する。
簡単な例として、10行のみのデータを与えるレポートを以下に示します。
Private Sub SimpleReport_DataInitialize(sender As System.Object, e As System.EventArgs) Handles MyBase.DataInitialize ‘ フィールドを追加する。 Me.Fields.Add("Field1") Me.Fields.Add("Field2") End Sub Private Sub SimpleReport_FetchData(sender As System.Object, eArgs As GrapeCity.ActiveReports.SectionReport.FetchEventArgs) Handles MyBase.FetchData Static count As Integer = 0 Const limit As Integer = 10 count += 1 If count > limit Then ‘ レポートの終了 eArgs.EOF = True Else eArgs.EOF = False ' フィールドに値を設定する。 Me.Fields("Field1").Value = count Me.Fields("Field2").Value = "No." & count End If End Sub
private int count = 0; const int limit = 10; private void SimpleReport_DataInitialize(object sender, EventArgs e) { // フィールドを追加する。 this.Fields.Add("Field1"); this.Fields.Add("Field2"); } private void SimpleReport_FetchData(object sender, FetchEventArgs eArgs) { this.count++; if (count > limit) { // レポートの終了。 eArgs.EOF = true; } else { eArgs.EOF = false; // フィールドに値を設定する。 this.Fields["Field1"].Value = count; this.Fields["Field2"].Value = "No." + count; } }