2013-02-28 18 views
26

Microsoftの内部Webサイトの1つにMicrosoft Reports - SSRSを追加する予定です。Entity Frameworkを使用したASP.Netでのレポートの作成

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

ウェブサイトは、すべてのデータに対してEntity Framework 4を使用しています。

DataSet(* .XSD)を作成する旧式の方法を使用してレポートを作成できました。これはうまくいきます。

私の質問では、レポートに必要なデータのためにサイトの既存のEntity Frameworkを利用することは可能でしょうか?ホイールを再作成して関係やその他のデータセット全体を作成する必要はありません。

これはウェブサイトであり、アプリケーションではないため、この(http://weblogs.asp.net/rajbk/archive/2010/05/09/creating-an-asp-net-report-using-visual-studio-2010-part-1.aspx)は適用されないようです。私は

アップデートサイドノートとして

(チュートリアルのパート2で)データソースが表示されていない、我々は、高価なサードパーティ製のコントロールなど

の明確な舵取りしたいと思いますまた、この問題を見るもう1つの方法は、エンティティフレームワークエンティティモデルから* .XSDを生成することです。これは可能ですか?

答えて

0

データソースとしてWCF-Serviceを使用することができ、レポートのアプリケーションデータとロジックを再利用することができます。これは、少なくとも私は信じてSQLサーバーの標準版が必要です。だから無料のSQLエクスプレス版ではできません。

+0

を使用するのも非常に簡単ですRDLCレポートLINQを使用することができますこれは、レポートデザイナー(データソースを選択したウィザード)で参照が使用できないため、WebアプリケーションではなくWebサイトである場合にのみ機能します存在しない。 – Darren

+0

これは、レポートでコードにアクセスする唯一の方法です。あなたのWCFサービス用のWebアプリケーションをセットアップできない場合は、プレーンSQLまたはストアドプロシージャ – JMan

+0

yahでデータにアクセスするのが最適です。この質問をするのと同じ時間に、レポートのストアドプロシージャを作成しました。ちょうど実際には別の場所にデータアクセスロジックがあるのが好きではない... – Darren

8

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

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; 
     } 
0

トリックは空白のデータソース接続文字列、空のクエリブロックと空白DataSetInfo(私は手動でXMLを変更する必要がありました)とレポート(.rdlc)を作成することです。

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(); 

} 
7

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

  • RDLCファイルはウェブプロジェクトには好きではありません。別のダミーwinformプロジェクトを作成し、そこにRDLCファイルを追加します。
  • 私はビューアにレポートを表示しません。私は、ユーザーにPDF、Word、またはExcelファイルをダウンロードさせて、ネイティブビューアで保存または開くことを選択させました。これは頭​​痛の束を節約しますが、要件に応じていくつかの人を解雇することができます。モバイルデバイスの場合、それはかなりいいですね。
  • SSRSを使用していないため、素敵な購読機能はありません。必要であれば、それを構築しようとしています。しかし、多くの点で、私はこれを好む。

しかし、メリットは本当にいいです:私はすでに私の意見のために書かれたのと同じビジネスロジックの良さのすべてを使用してい

  • カスタムのReportActionResultとDownloadReportコントローラメソッドがあり、基本的に1つのURLでレポートを実行できます。これは非常に便利です。カスタムサブスクリプションコンポーネントがより簡単になります。
  • レポートの開発がかなり速くなったように見えるので、エンティティの部分クラスを調整するだけで、ここやそこで小さなものを微調整する必要があります。また、データを少し異なる形にする必要がある場合は、LINQを使用します。
+0

VS 2013のオブジェクトデータソースの設定方法 – Seabizkit

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(); 
0

あなたはこれを試し

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(); 
関連する問題