31

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

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

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

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

私の質問ですが、レポートに必要なデータのためにサイトの既存のEntity Frameworkを利用することは可能ですか?関係などとともに、車輪の再発明を行い、DataSet全体を作成する必要はありません。

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

アップデート

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

また、問題を調べる別の方法は、エンティティフレームワークエンティティモデルから*.XSDを生成することです。これは可能ですか?それは私たちを立ち上げて実行するのに理想的ではありません。

4

6 に答える 6

9

以下は、.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;
        }
于 2013-04-24T12:03:38.387 に答える
8

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

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

ただし、利点は本当に素晴らしいです。

  • 私は、自分の見解のために既に書いたのと同じビジネス ロジックの利点をすべて使用しています。
  • ReportActionResult と DownloadReport のカスタム コントローラー メソッドを使用して、基本的に単一の URL を介して任意のレポートを実行できます。これは非常に便利です。これにより、カスタム サブスクリプション コンポーネントがより簡単になります。
  • エンティティの部分クラスを調整して、あちらこちらで少し微調整するだけでよいので、レポートの開発はかなり迅速に進んでいるようです。また、データの形状を少し変更する必要がある場合は、LINQ を使用します。
于 2013-05-16T17:38:02.047 に答える
2

私たちも 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(); 
于 2015-06-09T19:00:41.840 に答える
1

秘訣は、空白のデータ ソース接続文字列、空白のクエリ ブロック、および空白の 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();

}
于 2013-04-29T19:48:19.217 に答える
0

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

于 2013-03-11T15:55:06.907 に答える