GrapeCity ActiveReports for .NET 12.0J > ActiveReportsユーザーガイド > 基本操作 > ページレポート/RDLレポートの基本操作 > データ連結 > 実行時のレポートとデータソースの連結 |
ActiveReportsでは、実行時にデータソースを編集することができます。実行時にページレポートまたはRDLレポートをデータソースと連結するには、以下のコードを参照してください。
メモ: この基本操作ではページレポートを使用していますが、RDLレポートを使用した場合も同様の手順で編集することができます。 |
OleDBデータソースと連結する
実行時にデータソースを設定するには、APIを使用します。以下の手順は、Visual StudioのWindowsフォーム上にページレポートおよびビューワコントロールが配置されていることを前提とします。それぞれの詳細については、「プロジェクトにレポートを追加する」および「Windowsフォーム用のビューワの使用」を参照してください。
注意: 以下のサンプルコードを使用して、SQL、Odbc、OleDBまたはOracleデータソースと連結します。データソースに応じてデータプロバイダの種類と接続文字列を変更することで、異なるデータソースと連結することができます。 |
セル | Valueプロパティ |
---|---|
左 | =Fields!ProductID.Value |
中央 | =Fields!InStock.Value |
右 | =Fields!Price.Value |
Visual Basic
Visual Basic(Form_Loadイベント内に貼り付けます) |
コードのコピー
|
---|---|
' 空のページレポートを作成します。 Dim def As New GrapeCity.ActiveReports.PageReport ' レポートレイアウトを読み込みます。 def.Load(New System.IO.FileInfo(Application.StartupPath + "\RuntimeBinding.rdlx")) ' データソースを作成して設定します。 Dim myDataSource As New GrapeCity.ActiveReports.PageReportModel.DataSource myDataSource.Name = "Example Data Source" myDataSource.ConnectionProperties.DataProvider = "OLEDB" myDataSource.ConnectionProperties.ConnectString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=[ユーザーのドキュメントフォルダ]\ActiveReportsNET12\Data\Reels.mdb" ' データセットを設定します。 Dim myDataSet As New GrapeCity.ActiveReports.PageReportModel.DataSet() Dim myQuery As New GrapeCity.ActiveReports.PageReportModel.Query() myDataSet.Name = "Example Data Set" myQuery.DataSourceName = "Example Data Source" myQuery.CommandType = GrapeCity.ActiveReports.PageReportModel.QueryCommandType.TableDirect myQuery.CommandText = GrapeCity.Enterprise.Data.DataEngine.Expressions.ExpressionInfo.FromString("Product") myDataSet.Query = myQuery ' フィールドを追加します。 Dim _field As New GrapeCity.ActiveReports.PageReportModel.Field("ProductID", "ProductID", Nothing) myDataSet.Fields.Add(_field) _field = New GrapeCity.ActiveReports.PageReportModel.Field("InStock", "InStock", Nothing) myDataSet.Fields.Add(_field) _field = New GrapeCity.ActiveReports.PageReportModel.Field("Price", "Price", Nothing) myDataSet.Fields.Add(_field) ' データソースとデータセットをレポートと連結します。 def.Report.DataSources.Add(myDataSource) def.Report.DataSets.Add(myDataSet) def.Run() Viewer1.LoadDocument(def.Document) |
C#
C#(Form_Loadイベント内に貼り付けます) |
コードのコピー
|
---|---|
// 空のページレポートを作成します。 GrapeCity.ActiveReports.PageReport def = new GrapeCity.ActiveReports.PageReport(); // レポートレイアウトを読み込みます。 def.Load(new System.IO.FileInfo(Application.StartupPath + "\\RuntimeBinding.rdlx")); // データソースを作成して設定します。 GrapeCity.ActiveReports.PageReportModel.DataSource myDataSource = new GrapeCity.ActiveReports.PageReportModel.DataSource(); myDataSource.Name = "Example Data Source"; myDataSource.ConnectionProperties.DataProvider = "OLEDB"; myDataSource.ConnectionProperties.ConnectString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=[ユーザーのドキュメントフォルダ]\\ActiveReportsNET12\\Data\\Reels.mdb"; // データセットを設定します。 GrapeCity.ActiveReports.PageReportModel.DataSet myDataSet = new GrapeCity.ActiveReports.PageReportModel.DataSet(); GrapeCity.ActiveReports.PageReportModel.Query myQuery = new GrapeCity.ActiveReports.PageReportModel.Query(); myDataSet.Name = "Example Data Set"; myQuery.DataSourceName = "Example Data Source"; myQuery.CommandType = GrapeCity.ActiveReports.PageReportModel.QueryCommandType.TableDirect; myQuery.CommandText = GrapeCity.Enterprise.Data.DataEngine.Expressions.ExpressionInfo.FromString("Product"); myDataSet.Query = myQuery; // フィールドを追加します。 GrapeCity.ActiveReports.PageReportModel.Field _field = new GrapeCity.ActiveReports.PageReportModel.Field("ProductID", "ProductID", null); myDataSet.Fields.Add(_field); _field = new GrapeCity.ActiveReports.PageReportModel.Field("InStock", "InStock", null); myDataSet.Fields.Add(_field); _field = new GrapeCity.ActiveReports.PageReportModel.Field("Price", "Price", null); myDataSet.Fields.Add(_field); // データソースとデータセットをレポートと連結します。 def.Report.DataSources.Add(myDataSource); def.Report.DataSets.Add(myDataSet); def.Run(); viewer1.LoadDocument(def.Document); |
アンバウンドデータソースと連結する
実行時にアンバウンドデータソースと連結するには、LocateDataSourceイベントとデータセットプロバイダまたはオブジェクトプロバイダを使用します。レポートエンジンは、使用するデータの情報が必要な場合、LocateDataSourceイベントを発生させます。
データセットプロバイダ
データセットプロバイダを使用する際、接続文字列(ConnectionString)とクエリ(Query)の設定はデータ連結する方法によって異なります。
LocateDataSourceイベントを使用してレポートをデータ連結するには、接続文字列を空にします。
レポートをファイルに存在するデータセットと連結する場合、接続文字列をファイルパスに設定し、クエリをデータセットのテーブル名に設定します。
親テーブルのフィールド
親テーブルからフィールドを参照する場合、該当する親テーブルまでナビゲートするにはフィールド名の前に参照するリレーション名を追加する必要があります。フィールド名とリレーション名はピリオドで区切ります。
たとえば、親テーブルにOrdersを持つ、OrderDetailsメインテーブルの場合、2つのテーブルのリレーションは、Orders_OrderDetailsで表現されます。また、親テーブルからOrderDateにアクセスするには、以下の構文を使用します。
Orders_OrderDetails.OrderDate
同様の方法で、さまざまなテーブルリレーションの参照が可能です。たとえば、前述の例のOrdersテーブルにCustomersという親テーブルがある場合は、2つのテーブルのリレーションはCustomers_Ordersとなりますが、CommandTextでメインテーブルをOrderDetailsに指定した場合は、親テーブルからCustomerNameフィールドを取得するには以下の構文を使用します。
Customers_Orders.Orders_OrderDetails.CustomerName
注意: フィールドとリレーション名が同じである場合、参照誤りが発生する場合があります。 |
データセットプロバイダを使用する
実行時にレポートにデータセットを設定するには、APIを使用します。
データセットプロバイダはデータテーブルを返します。データテーブルのすべてのフィールドが使用可能です。レポートのデータソースとしてデータセットプロバイダを使用する場合、実行時にレポート定義を設定し、ページドキュメントをLocateDataSourceEventHandlerにアタッチします。
以下の手順は、Visual StudioのWindowsフォーム上にページレポートのテンプレートおよびビューワコントロールが配置されていることを前提としています。それぞれの詳細については、「プロジェクトにレポートを追加する」および「Windowsフォーム用のビューワの使用」をご参照ください。
Visual Basic
Visual Basic(DataLayerクラス内に貼り付けます) |
コードのコピー
|
---|---|
Imports GrapeCity.ActiveReports.Expressions.ExpressionObjectModel Imports System.Globalization Imports System.Data.OleDb Friend NotInheritable Class DataLayer Private _datasetData As System.Data.DataSet Public Sub New() LoadDataToDataSet() End Sub Public ReadOnly Property DataSetData() As System.Data.DataSet Get Return _datasetData End Get End Property Private Sub LoadDataToDataSet() Dim connStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=[ユーザーのドキュメントフォルダ]\Samples\Data\Reels.mdb" Dim productSql As String = "SELECT top 100 * FROM Product" _datasetData = New DataSet() Dim conn As New OleDbConnection(connStr) Dim cmd As OleDbCommand = Nothing Dim adapter As New OleDbDataAdapter cmd = New OleDbCommand(productSql, conn) adapter.SelectCommand = cmd adapter.Fill(_datasetData, "Products") End Sub End Class |
C#
C#(DataLayerクラス内に貼り付けます) |
コードのコピー
|
---|---|
using System; using System.Data; using System.Data.OleDb; internal sealed class DataLayer { private DataSet dataSetData; public DataLayer() { LoadDataToDataSet(); } public DataSet DataSetData { get { return dataSetData; } } private void LoadDataToDataSet() { string connStr = @"Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False; Data Source=[ユーザーのドキュメントフォルダ]\\Samples\\Data\\Reels.mdb"; string productSql = "SELECT * From Product"; dataSetData = new DataSet(); OleDbConnection conn = new OleDbConnection(connStr); OleDbCommand cmd = new OleDbCommand(productSql, conn); OleDbDataAdapter adapter = new OleDbDataAdapter(); adapter.SelectCommand = cmd; adapter.Fill(dataSetData, "Products"); } } |
メモ:DataSetDataSourceサンプルは、以下のコードで使用されるDataLayerクラスを作成する方法について説明します。 DataSetDataSourceサンプルは、デフォルトで\Samples\Page Reports And RDL Report\Dataのフォルダに配置されています。 |
Visual Basic
Visual Basicコード(Form_Loadイベント内に貼り付けます) |
コードのコピー
|
---|---|
LoadReport() |
Visual Basicコード |
コードのコピー
|
---|---|
Dim WithEvents runtime As GrapeCity.ActiveReports.Document.PageDocument Private Sub LoadReport() ' プロジェクト内にレポートへのパスを含むファイル情報(FileInfo)を作成します。 Dim rptPath As New System.IO.FileInfo("..\..\YourReportName.rdlx") ' FileInfoを使用してレポート定義を作成します。 Dim definition As New GrapeCity.ActiveReports.PageReport(rptPath) 'レポート定義を使用してページドキュメントを作成します。 runtime = New GrapeCity.ActiveReports.Document.PageDocument(definition) 'ビューワ上にレポートを表示します。タイトルを任意のテキストに設定することができます。 Viewer1.LoadDocument(runtime) End Sub '通常の方法でレポートのデータソースを見つけられない場合、ActiveReportsはこのイベントを発生させます。 Private Sub runtime_LocateDataSource(ByVal sender As Object, ByVal args As GrapeCity.ActiveReports.LocateDataSourceEventArgs) Handles Runtime.LocateDataSource Dim dl = New DataLayer args.Data = dl.DataSetData.Tables("Products") End Sub |
C#
C#コード(Form_Loadイベント内に貼り付けます) |
コードのコピー
|
---|---|
LoadReport(); |
C#コード(フォームのクラス定義内に貼り付けます) |
コードのコピー
|
---|---|
private void LoadReport() { //プロジェクト内にレポートへのパスを含むファイル情報(FileInfo)を作成します。 System.IO.FileInfo rptPath = new System.IO.FileInfo("..\\..\\YourReportName.rdlx"); //FileInfoを使用してレポート定義を作成します。 GrapeCity.ActiveReports.PageReport definition = new GrapeCity.ActiveReports.PageReport(rptPath); //レポート定義を使用してページドキュメントを作成します。 GrapeCity.ActiveReports.Document.PageDocument runtime = new GrapeCity.ActiveReports.Document.PageDocument(definition); //ビューワ上にレポートを表示します。タイトルを任意のテキストに設定することができます。 runtime.LocateDataSource += new GrapeCity.ActiveReports.LocateDataSourceEventHandler(runtime_LocateDataSource); viewer1.LoadDocument(runtime); } //通常の方法でレポートのデータソースを見つけられない場合、ActiveReportsはこのイベントを発生させます。 private void runtime_LocateDataSource(object sender, GrapeCity.ActiveReports.LocateDataSourceEventArgs args) { DataLayer dl = new DataLayer(); args.Data = dl.DataSetData.Tables["Products"]; } |
オブジェクトプロバイダ
オブジェクトプロバイダをレポートへ連結するには、レポート定義とページドキュメントを設定し、ページドキュメントをLocateDataSourceEventHandlerに設定します。
オブジェクトプロバイダデータソースは、クエリが空で、フィールドがオブジェクトプロバイダデータソースのフィールドに一致するデータセットが必要です。これらのフィールドを、手動で[データセット]ダイアログからFieldsに設定します。
オブジェクトプロバイダを使用する際、レポートの接続文字列を空にしてください。これはオブジェクトに連結するために、LocateDataSourceイベントを使用するためです。
オブジェクトプロバイダを使用する
以下の手順は、Windowsフォーム上にビューワコントロールが配置され、ページレポートがプロジェクトに追加されていることを前提としています。それぞれの詳細については、「プロジェクトにレポートを追加する」および「Windowsフォーム用のビューワの使用」を参照してください。
レポートエクスプローラで[データソース]ノードを展開し、右クリックして[データソースの追加]をクリックします。
Visual Basic
Visual Basic(フォームのクラス定義内に貼り付けます) |
コードのコピー
|
---|---|
' プロパティを呼び出すクラスを作成します。 Public Class dog Private _name As String Public Property name() As String Get Return _name End Get Set(ByVal value As String) _name = Value End Set End Property End Class ' データを格納するように配列を作成します。 Dim dogArray As System.Collections.ArrayList ' データ配列を埋め込むメソッドを作成します。 Private Sub LoadData() dogArray = New System.Collections.ArrayList() Dim dog1 As New dog() dog1.name = "border collie" dogArray.Add(dog1) dog1 = New dog() dog1.name = "cocker spaniel" dogArray.Add(dog1) dog1 = New dog() dog1.name = "golden retriever" dogArray.Add(dog1) dog1 = New dog() dog1.name = "shar pei" dogArray.Add(dog1) End Sub |
C#
C#(フォームのクラス定義内に貼り付けます) |
コードのコピー
|
---|---|
// プロパティを呼び出すクラスを作成します。 public class dog { private string _name; public string name { get { return _name; } set { _name = value; } } } // データを格納するように配列を作成します。 System.Collections.ArrayList dogArray; // データ配列を埋め込むメソッドを作成します。 private void LoadData() { dogArray = new System.Collections.ArrayList(); dog dog1 = new dog(); dog1.name = "border collie"; dogArray.Add(dog1); dog1 = new dog(); dog1.name = "cocker spaniel"; dogArray.Add(dog1); dog1 = new dog(); dog1.name = "golden retriever"; dogArray.Add(dog1); dog1 = new dog(); dog1.name = "shar pei"; dogArray.Add(dog1); } |
Visual Basic
Visual Basic(Form_Loadイベント内に貼り付けます) |
コードのコピー
|
---|---|
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' プロジェクト内にレポートへのパスを含むファイル情報(FileInfo)を作成します。 Dim fi As New System.IO.FileInfo("..\\..\\DogReport.rdlx") ' FileInfoを使用してレポート定義を作成します。 Dim repDef As New GrapeCity.ActiveReports.PageReport(fi) ' レポート定義を使用してページドキュメントを作成します。 Dim runt As New GrapeCity.ActiveReports.Document.PageDocument(repDef) ' 実行時用のLocateDataSourceイベントを作成します。 AddHandler runt.LocateDataSource, AddressOf runt_LocateDataSource ' ビューワ上にレポートを表示します。タイトルを任意のテキストに設定することができます。 Viewer1.LoadDocument(runt) End Sub |
C#
C#(Form_Loadイベント内に貼り付けます) |
コードのコピー
|
---|---|
private void Form1_Load(object sender, EventArgs e) { // プロジェクト内にレポートへのパスを含むファイル情報(FileInfo)を作成します。 System.IO.FileInfo fi = new System.IO.FileInfo("..\\..\\DogReport.rdlx"); // FileInfoを使用してレポート定義を作成します。 GrapeCity.ActiveReports.PageReport repDef = new GrapeCity.ActiveReports.PageReport(fi); // レポート定義を使用してページドキュメントを作成します。 GrapeCity.ActiveReports.Document.PageDocument runt = new GrapeCity.ActiveReports.Document.PageDocument(repDef); // 実行時用のLocateDataSourceイベントを作成します。 runt.LocateDataSource += new GrapeCity.ActiveReports.LocateDataSourceEventHandler(runt_LocateDataSource); // ビューワ上にレポートを表示します。タイトルを任意のテキストに設定することができます。 viewer1.LoadDocument(runt); } |
Visual Basic
Visual Basic(フォームのクラス定義内に貼り付けます) |
コードのコピー
|
---|---|
Private Sub runt_LocateDataSource(ByVal sender As Object, ByVal args As GrapeCity.ActiveReports.LocateDataSourceEventArgs) If dogArray Is Nothing Then LoadData() args.Data = dogArray End Sub |
C#
C#(フォームのクラス定義内に貼り付けます) |
コードのコピー
|
---|---|
void runt_LocateDataSource(object sender, GrapeCity.ActiveReports.LocateDataSourceEventArgs args) { if (dogArray == null) { LoadData(); } args.Data = dogArray; } |