web-dev-qa-db-ja.com

複数のテーブルを使用したrdlcレポートの作成(1対多の関係)

ですから、私はrdlcに不慣れです(そして実際には一般的に報告しています)。別のテーブルと1対多の関係にあるテーブルがあり、rdlcレポートでアイテムごとに複数のテーブルとしてそれらを表現しようとしています

注:テーブルは元々、Entity Frameworkコードファーストを使用して作成されています。

2つのテーブル(および親テーブル)は次のとおりです。

Quotation model

さて、通常、[Quotation]といくつかの[QuotationItem]sしかない場合は、レポートの上部に[Quotation]からの情報を追加するだけで、各[QuotationItem]からの情報がテーブル(Tablix)内の行に表示されます。

問題は:各[QuotationItem]にも多くの[QuotationItemQuantity](現在は3つ)があり、表現されます。

したがって、私のレポートは次のようになります。

Report

しかし、アイテム(QuotationItem)ごとに複数のテーブル(またはリストとテーブル)を表示する方法に固執しています。ネストされたテーブルとリスト内のテーブルを試しましたが、これは許可されていないようです( "詳細メンバーには静的内部メンバーのみを含めることができます"エラーが発生します)。

サブレポートについて読んだので、これが道のりかもしれないと思いますが、この場合のサブレポートの使用方法や、これが実際に正しいアプローチであるかどうかはわかりません。

注:前述のように、各QuotationItemには現在3つの数量がありますが、将来変更される可能性があるため、列を動的にできると便利ですが、現時点では必須ではありません。

助言がありますか?

8

まあ、私はもっとエレガントな解決策を手に入れることを望んでいました(そして今でもそうしています)この醜い解決策の代わりに(今のところ使用しなければなりませんでした)しかしそれはとにかくそれが想定されていることをします。

同様の問題を抱えている人に役立つかもしれないので、私はそれを投稿しています。これが私がしたことです:

データの準備:

  • VSデザイナを使用してダミーのDataSetを作成し、それに1つのDataTableを追加しました。
  • 両方のテーブルのすべての必須列をこのDataTableに追加しました。
  • レポートのデータソースとしてDataSetを追加しました。
  • 実際のデータを渡すには、DataTable 設計されたものと同じ構造でを入力し、次のようなものを使用してレポートに渡します。

    private void Form_Load(object sender, EventArgs e)
    {
        rptViewerMain.LocalReport.ReportEmbeddedResource = "MyProjectName.QuotationReport.rdlc";
        rptViewerMain.LocalReport.EnableExternalImages = true;
    
        if (QuotationInfo !=null && QuotationItems != null)
        {
            SetupReport();
        }
    
        this.rptViewerMain.RefreshReport();
    }
    
    private void SetupReport()
    {
        var param1 = new ReportParameter("MyFirstParameter", SomeValue);
        var param2 = new ReportParameter("MySecondParameter", SomeOtherValue);
        // etc
    
        // Pass Parameters
        rptViewerMain.LocalReport.SetParameters(new[] { param1, param2, "etc" });
    
        // Prepare the DataTable and add the values to it
        DataTable dt = new MyDummyDataset.MyDesignedDataTable().Clone();
    
        foreach (var qItem in QuotationItems)
        {
            dt.Rows.Add(qItem.ItemNumber, qItem.ItemDescription, "and",
                        "so", "many", "more", "values");
        }
    
        // Pass the DataTable to the report as the data source replacing the dummy DataSet
        rptViewerMain.LocalReport.DataSources.Add(new ReportDataSource("MyDummyDataset", dt));
    }
    

レポートのデザイン:

  • RDLCレポートに1つのテーブル(Tablix)のみを作成し、セルの境界線を使用して3つのテーブルのように見せました「テーブル」間の不要なセルの境界線を削除することによりenter image description here
  • ダミーのDataSetのフィールドを、最初のテーブルの対応するセル(数量情報)およびテーブルの上(見積もり項目情報)に追加しました。
  • 2番目と3番目の「テーブル」については、単に式を使用して、最初のテーブルの値に基づいて計算を行いました。

注:一部のフィールド/変数名は質問と回答の両方で変更されましたが、考え方は同じです。

6