web-dev-qa-db-ja.com

Entity Frameworkを使用したASP.Netでのレポートの作成

Microsoft Reports-SSRSを社内Webサイトの1つに追加することを検討しています。

データベースにはすべてのレポート機能がインストールされています。

WebサイトはすべてのデータにEntity Framework 4を使用しています。

DataSet(* .XSD)を作成する昔ながらの方法を使用してレポートを作成できましたが、これはうまく機能します。

私の質問ですが、レポートで必要なデータのためにサイト内の既存のエンティティフレームワークを利用することは可能ですか?ホイールを再発明して、データセット全体を作成し、関係などを作成する必要はありません。

これはWebサイトであり、アプリケーションではないので、これ( http://weblogs.asp.net/rajbk/archive/2010/05/09/creating-an-asp-net-report-using-visual-studio- 2010-part-1.aspx )は適用されないようです。 DataSourceが表示されない(チュートリアルのパート2)

更新

補足として、高価なサードパーティのコントロールなどを回避したいと思います。

また、問題を確認するもう1つの方法は、エンティティフレームワークエンティティモデルから* .XSDを生成することです。これは可能ですか?それは私たちを稼働させるでしょうが、それは理想的ではありません。

29

以下は、.NET winFormsアプリケーションの1つでレポートデータソースを設定する方法の簡単なサンプルです。

public  void getMyReportData()
    {
        using (myEntityDataModel v = new myEntityDataModel())
        {

            var reportQuery = (from r in v.myTable
                                   select new
                                   {
                                       l.ID,
                                       l.LeaveApplicationDate,
                                       l.EmployeeNumber,
                                       l.EmployeeName,
                                       l.StartDate,
                                       l.EndDate,
                                       l.Supervisor,
                                       l.Department,
                                       l.Col1,
                                       l.Col2,
                                       .......,
                                       .......,
                                       l.Address
                                   }).ToList();


            reportViewer1.LocalReport.DataSources.Clear();
            ReportDataSource datasource = new ReportDataSource("nameOfReportDataset", reportQuery);
            reportViewer1.LocalReport.DataSources.Add(datasource);

            Stream rpt = loadEmbededReportDefinition("Report1.rdlc");
            reportViewer1.LocalReport.LoadReportDefinition(rpt);
            reportViewer1.RefreshReport();

            //Another way of setting the reportViewer report source

            string exeFolder = Path.GetDirectoryName(Application.ExecutablePath);
            string reportPath = Path.Combine(exeFolder, @"rdlcReports\Report1.rdlc");
            reportViewer1.LocalReport.ReportPath = reportPath;

            reportParameter p = new ReportParameter("DeptID", deptID.ToString());
            reportViewer1.LocalReport.SetParameters(new[] { p });

        }
    }




    public static Stream loadEmbededReportDefinition(string reportName)
        {
            Assembly _Assembly = Assembly.GetExecutingAssembly();
            Stream _reportStream = _Assembly.GetManifestResourceStream("ProjectNamespace.rdlcReportsFolder." + reportName);

            return _reportStream;
        }
9
StackTrace

私のアプローチは、常にオブジェクトデータソースでRDLCファイルを使用し、それらを「ローカル」モードで実行することでした。これらのデータソースは...私のエンティティです!このようにして、私は自分のWebアプリで使用しているものと同じビジネスロジック、文字列の書式設定、文化の認識などをすべて使用しています。いくつかの癖がありますが、私はそれらと一緒に暮らすことができました:

  • RDLCファイルは、Webプロジェクトでの使用を好みません。別のダミーwinformプロジェクトを作成し、そこにRDLCファイルを追加します。
  • ビューアにレポートを表示しません。ユーザーにPDF、Word、またはExcelファイルのダウンロードを許可し、保存するか、ネイティブビューアで開くことを選択します。これは多くの頭痛の種を節約しますが、要件によっては一部の人々を先送りにすることができます。モバイルデバイスの場合、これは非常に便利です。
  • SSRSを使用していないため、Niceサブスクリプション機能は利用できません。必要に応じて、ビルドします。しかし、多くの点で、私はこれを好みます。

しかし、メリットは本当に素晴らしいです:

  • 私は自分の見解のためにすでに書いたものと同じビジネスロジックの良さをすべて使用しています。
  • カスタムのReportActionResultおよびDownloadReportコントローラーメソッドを使用して、基本的に単一のURL経由で任意のレポートを実行できます。これは非常に便利です。これにより、カスタムサブスクリプションコンポーネントが確実に容易になります。
  • エンティティの部分クラスを調整して、あちこちで少し何かを微調整するだけでよいので、レポートの開発はかなり迅速に進むようです。また、データの形状を少し変える必要がある場合は、LINQを使用します。
8
M Smearer

SSRSも「ローカル」レポートとして使用します。 SQLサーバーでビューを作成し、他のEFドメインモデルと共にアプリケーションでそのオブジェクトを作成し、DbContextを使用してそのオブジェクトをクエリします。 ASPXページを使用し、背後にあるコード(Page_Load)を使用して、データをレポートに渡します。

以下は、Page_Loadイベントでクエリを実行する方法の例です。

        var person = MyDbContext
            .Query<ReportModel>()
            .Where(x => x.PersonId == personId)
            .Where(x => x.Year == year)
            .Select(x =>
            {
                PersonId = x.PersonId,
                Year = x.Year,
                Name = x.Name
            });

        var datasource = new ReportDataSource("DataSet1", person.ToList());

        if (!Page.IsPostBack)
        {
            myReport.Visible = true;
            myReport.ProcessingMode = ProcessingMode.Local;
            myReport.LocalReport.ReportPath = @"Areas\Person\Reports\PersonReport.rdlc";
        }

        myReport.LocalReport.DataSources.Clear();
        myReport.LocalReport.DataSources.Add(datasource);
        myReport.LocalReport.Refresh(); 
2
OJisBad

トリックは、空白のデータソース接続文字列、空白のクエリブロック、および空白のDataSetInfoを使用してレポート(.rdlc)を作成することです(手動でxmlを変更する必要がありました)。次のようにファイルに存在し、空白である必要があります。

SomeReport.rdlc (viewing as xml)
...
<DataSources>
    <DataSource Name="conx">
    <ConnectionProperties>
    <DataProvider />
    <ConnectString />
    </ConnectionProperties>
    <rd:DataSourceID>19f59849-cdff-4f18-8611-3c2d78c44269</rd:DataSourceID>
    </DataSource>
</DataSources>
...
<Query>
    <DataSourceName>conx</DataSourceName>
    <CommandText />
    <rd:UseGenericDesigner>true</rd:UseGenericDesigner>
</Query>
<rd:DataSetInfo>
    <rd:DataSetName>SomeDataSetName</rd:DataSetName>
</rd:DataSetInfo>

次にページイベントで、DropDownListのSelectedIndexChangedを使用して、レポートデータソースを次のようにバインドします。

protected void theDropDownList_SelectedIndexChanged(object sender, EventArgs e)
{
    if (theDropDownList.SelectedIndex == 0)
        return;

    var ds = DataTranslator.GetRosterReport(Int64.Parse(theDropDownList.SelectedValue));
    _rvReport.LocalReport.ReportPath = "SomePathToThe\\Report.rdlc";
    _rvReport.LocalReport.DataSources.Add(new ReportDataSource("SomeDataSetName", ds));
    _rvReport.Visible = true;
    _rvReport.LocalReport.Refresh();

}
1
m4chine

WCFサービスをデータソースとして使用できるため、レポートのアプリケーションデータとロジックを再利用できます。これには、少なくともSQLサーバーの標準版が必要です。したがって、無料のSQL-expressエディションでは何もできません。

0
JMan

[〜#〜] linq [〜#〜]RDLC Reportと一緒に使用できます。

LinqNewDataContext db = new LinqNewDataContext();
var query = from c in db.tbl_Temperatures
                    where c.Device_Id == "Tlog1"
                    select c;
var datasource = new ReportDataSource("DataSet1", query.ToList());
ReportViewer1.Visible = true;
ReportViewer1.ProcessingMode = ProcessingMode.Local;
ReportViewer1.LocalReport.ReportPath = @"Report6.rdlc";    
ReportViewer1.LocalReport.DataSources.Clear();
ReportViewer1.LocalReport.DataSources.Add(datasource);
ReportViewer1.LocalReport.Refresh();
0
Syed Ayaz