ActiveReports for .NET 18.0J
実行時のレポートとデータソースの連結
ActiveReportsユーザーガイド > 基本操作 > ページレポート/RDLレポートの基本操作 > レポートのデータ > 実行時のレポートとデータソースの連結

ActiveReportsでは、実行時にデータソースを編集することができます。実行時にページレポートまたはRDLレポートをデータソースと連結するには、以下のコードを参照してください。

 

メモ: この基本操作ではページレポートを使用していますが、RDLレポートを使用した場合も同様の手順で編集することができます。

OleDBデータソースと連結する

実行時にデータソースを設定するには、APIを使用します。以下の手順は、Visual StudioのWindowsフォーム上にページレポートおよびビューワコントロールが配置されていることを前提とします。それぞれの詳細については、「クイックスタート」および「Windowsフォーム用のビューワの使用」を参照してください。

注意: 以下のサンプルコードを使用して、SQL、Odbc、OleDBと連結します。データソースに応じてデータプロバイダの種類と接続文字列を変更することで、異なるデータソースと連結することができます。
  1. Visual Studioツールボックスから、Tableデータ領域をデザイナ面上へドラッグ&ドロップします。
  2. Tableで以下のセルを選択し、[プロパティ]ウィンドウから各Valueプロパティを設定します。
    セル Valueプロパティ
    =Fields!ProductID.Value
    中央 =Fields!InStock.Value
    =Fields!Price.Value
  3. Visual Studioの[レポート]メニューから、[レイアウトファイルの保存]を選択します。
  4. [名前を付けて保存]ウィンドウでプロジェクトフォルダのbin/debugを開き、レイアウト(例:RuntimeBinding.rdlx)を保存します。
  5. Windowsフォームのタイトルバーをダブルクリックして、Form_Loadイベントのハンドラを生成します。
  6. ハンドラへ以下のコードを追加してデータソースと連結し、データセットを追加します。

    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=[ユーザーのドキュメントフォルダ]\ActiveReportsNET18\Samples\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.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=[ユーザーのドキュメントフォルダ]\\ActiveReportsNET18\\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.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);
    
  7. F5を押してアプリケーションを実行します。

アンバウンドデータソースと連結する

実行時にアンバウンドデータソースと連結するには、LocateDataSourceイベントとデータセットプロバイダまたはオブジェクトプロバイダを使用します。レポートエンジンは、使用するデータの情報が必要な場合、LocateDataSourceイベントを発生させます。

データセットプロバイダ

データセットプロバイダを使用する際、接続文字列(ConnectionString)とクエリ(Query)の設定はデータ連結する方法によって異なります。

LocateDataSourceイベントを使用してレポートをデータ連結するには、接続文字列を空にします。

  • LocateDataSourceがデータセットを返す場合、クエリはデータセットのテーブル名に設定されます。
  • LocateDataSourceがDataTableまたはデータビューを返す場合、クエリは空になります。

レポートをファイルに存在するデータセットと連結する場合、接続文字列をファイルパスに設定し、クエリをデータセットのテーブル名に設定します。

データセットプロバイダの制限事項

  • リレーション名にピリオドを含む場合は、正しく動作しません。
  • ネストしたリレーションでは、親リレーションのみ参照可能です。(例 FK_Order_Details_Orders.FK_Orders_Customers.CompanyName)

親テーブルのフィールド

親テーブルからフィールドを参照する場合、該当する親テーブルまでナビゲートするにはフィールド名の前に参照するリレーション名を追加する必要があります。フィールド名とリレーション名はピリオドで区切ります。

たとえば、親テーブルに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フォーム用のビューワの使用」をご参照ください。

  1. レポートエクスプローラ]で[データソース]ノードを右クリックして[データソースの追加]をクリックします。
  2. [レポートデータソース]ダイアログで、[種類]からDataSetProviderを選択し、ダイアログを閉じます。[レポートエクスプローラ][データソース]ノードが表示されます。
  3. [データソース]ノードを右クリックし、[データセットの追加]をクリックします。
  4. 表示される[データセット]ダイアログで、[フィールド]ページを選択します。
  5. [フィールド]ページで、=Fields!ProductID.Value=Fields!InStock.Valueの2つのフィールドを追加します。
  6. [OK]を押下してダイアログを閉じます。フィールド名を持つノードがデータセットの下に表示されます。
  7. Visual StudioのツールボックスからTableデータ領域をデザイナ面上にドラッグ&ドロップします。
  8. [レポートエクスプローラ]から、新規追加されたフィールドをTableの詳細行のセルへドラッグしてレポートを保存します。
  9. Visual Studioの[ソリューションエクスプローラー]で、プロジェクト名を右クリックし、[追加]>[クラス]を選択します。
  10. [新しい項目の追加]ウィンドウで、クラス名をDataLayer.csまたは.vbに設定し、[追加]をクリックします。
  11. [ソリューションエクスプローラー]で、DataLayer.csまたは.vbをダブルクリックしてコードを開き、以下のコードを貼り付けます。

    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のフォルダに配置されています。

  12. WindowsフォームのタイトルバーをダブルクリックしてForm_Loadイベントのハンドラを生成し、以下のコードを追加します。

    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"];
    }
    
  13. F5ボタンをクリックしてアプリケーションを実行してください。

オブジェクトプロバイダ

オブジェクトプロバイダはIEnumerableコレクションを返します。オブジェクトプロバイダをレポートへ連結するには、レポート定義とページドキュメントを設定し、ページドキュメントをLocateDataSourceEventHandlerに設定します。

オブジェクトプロバイダデータソースは、クエリが空で、フィールドがオブジェクトプロバイダデータソースのフィールドに一致するデータセットが必要です。これらのフィールドを、手動で[データセット]ダイアログからFieldsに設定します。

オブジェクトプロバイダを使用する際、レポートの接続文字列を空にしてください。これはオブジェクトに連結するために、LocateDataSourceイベントを使用するためです。 クエリを以下の値の一つに設定します:

   

オブジェクトプロバイダを使用する

以下の手順は、Windowsフォーム上にビューワコントロールが配置され、ページレポートがプロジェクトに追加されていることを前提としています。それぞれの詳細については、「クイックスタート」および「Windowsフォーム用のビューワの使用」を参照してください。

  1. レポートエクスプローラ[データソース]ノードを展開し、右クリックして[データソースの追加]をクリックします。

  2. [レポートデータソース]ダイアログで[種類]「Object Provider」を選択し、ダイアログを閉じます。[レポートエクスプローラ]に[データソース]ノードが表示されます。
  3. [データソース]ノードで右クリックし、[データセットの追加]を右クリックし、[データセット]ダイアログでフィールドページを開きます。
  4. [フィールド]ページで、「名前」「Field1」「値」「name」と各フィールドを追加し、[OK]をクリックしてダイアログを閉じます。フィールド名を持つノードがデータセット名の下に表示されます。
  5. Visual Studioのツールボックスから、Tableデータ領域をレポートのデザイナ面上に配置します。
  6. [レポートエクスプローラ]から、新規追加されたフィールドをTableの詳細行のセルへドラッグしてレポートを保存します。
  7. レポートをDogReport.rdlxとして保存します。
  8. [ソリューションエクスプローラー]でフォーム名を右クリックし、[コードの表示]をクリックしてコードビューを開きます。
  9. フォームのコードビューで、クラス定義内に以下のコードを追加します。

    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);
    }                    
    
  10. LocateDataSourceイベント用のハンドラを作成します。

    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);
    }
    
  11. LocateDataSourceイベントを使用して、オブジェクトからデータをロードします。

    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;   
    }   
    
  12. F5を押してアプリケーションを実行します。
関連トピック