2013-02-28 10 views
26

Wir möchten Microsoft Reports - SSRS zu einer unserer internen Websites hinzufügen.Erstellen von Berichten in ASP.Net mit Entity Framework

In der Datenbank sind alle Berichtsfunktionen installiert.

Die Website verwendet Entity Framework 4 für alle Daten.

Ich konnte einen Bericht erstellen, der die altmodische Art der Erstellung eines DataSet (* .XSD) verwendet, und das funktioniert gut.

Meine Frage, ist es möglich, das vorhandene Entity Framework auf der Website für die Daten zu verwenden, die von den Berichten benötigt werden? Anstatt das Rad neu zu erfinden und ein ganzes DataSet zusammen mit Beziehungen usw. zu machen.

Es ist eine Website und keine Anwendung, so dass dies (http://weblogs.asp.net/rajbk/archive/2010/05/09/creating-an-asp-net-report-using-visual-studio-2010-part-1.aspx) scheint nicht zu gelten; Ich sehe nicht die Datasource (in Teil 2 des Tutorials)

aktualisieren

Als Randbemerkung, würden wir deutlich teurer Steuerelemente von Drittanbietern lenken möchte usw.

Eine weitere Möglichkeit, das Problem zu untersuchen, besteht möglicherweise darin, die * .XSD-Datei vom Entity-Framework-Entitätsmodell zu generieren. Ist das möglich? Es ist nicht ideal, würde uns aber zum Laufen bringen.

Antwort

0

Sie können einen WCF-Service als Datenquelle verwenden und so Ihre Anwendungsdaten und Logik für Ihren Bericht wiederverwenden. Dies erfordert zumindest eine SQL-Server-Standard Edition. So kann man mit der kostenlosen SQL-Express-Edition nichts anfangen.

+0

diese Versuchte Ansatz auch, obwohl es scheint, dass dies nur funktioniert, wenn es eine Webanwendung und keine Website ist, weil die Referenz nicht im Berichtsdesigner verfügbar ist (der Assistent, wo Sie Ihre Datenquelle auswählen) - die Referenz tut nicht vorhanden. – Darren

+0

ist die einzige Möglichkeit, auf Ihren Code in Ihren Berichten zuzugreifen. Wenn Sie keine Web-App für Ihren WCF-Dienst einrichten können, können Sie am besten auf Ihre Daten zugreifen mit plain sql oder einer gespeicherten Prozedur – JMan

+0

yah, beginnen, das zu sehen. Wir haben gespeicherte Prozeduren für die Berichte ungefähr zur gleichen Zeit erstellt, als wir diese Frage gestellt haben. einfach wirklich nicht gerne die Datenzugriffslogik an verschiedenen Orten ... – Darren

8

Im Folgenden finden Sie ein schnelles Beispiel, wie ich die Berichtsdatenquelle in einer meiner .NET WinForms-Anwendungen festlegen.

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

Der Trick ist, einen Bericht (RDLC) mit einer leeren Datenquelle Verbindungszeichenfolge eines leeren Abfrageblock und einem leeren DataSetInfo zu erstellen (Ich hatte das xml manuell ändern). Sie müssen in der Datei vorhanden und leer sein, wie folgt:

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> 

jetzt auf einer Seite Veranstaltung, benutze ich ein SelectedIndexChanged auf einem Dropdownlist, binden den Bericht Datenquelle wie folgt:

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

Mein Ansatz hat immer Bisher wurden RDLC-Dateien mit Objektdatenquellen verwendet und im lokalen Modus ausgeführt. Diese Datenquellen sind ... meine Entitäten! Auf diese Weise nutze ich die gleiche Geschäftslogik, String-Formatierung, Kulturbewusstsein usw., die ich für meine Web-Apps verwende. Es gibt ein paar Macken, aber ich konnte mit ihnen leben:

  • RDLC-Dateien mögen nicht in Web-Projekten leben. Wir erstellen ein separates Dummy-Winform-Projekt und fügen dort die RDLC-Dateien hinzu.
  • Ich zeige keine Berichte in einem Viewer. Ich lasse den Benutzer eine PDF-, Word- oder Excel-Datei herunterladen und wählen, ob er im nativen Viewer gespeichert oder geöffnet werden soll. Dies spart eine Menge Kopfschmerzen, kann aber einige Leute absetzen, abhängig von den Anforderungen. Für mobile Geräte ist es ziemlich nett.
  • Da Sie nicht SSRS verwenden, erhalten Sie nicht die nette Abonnementfunktion. Sie werden das bei Bedarf erstellen. In vielerlei Hinsicht bevorzuge ich dies jedoch.

Allerdings sind die Vorteile wirklich schön:

  • ich alle die gleiche Geschäftslogik Güte verwenden, die ich bereits für meine Ansichten geschrieben habe.
  • Ich habe eine benutzerdefinierte ReportActionResult- und DownloadReport-Controller-Methode, mit der ich im Prinzip jeden Bericht über eine einzige URL ausführen kann. Dies kann sehr praktisch sein. Es macht sicher eine benutzerdefinierte Abonnement-Komponente einfacher.
  • Bericht Entwicklung scheint ziemlich schnell zu gehen, jetzt, dass ich nur Entity Teilklassen anpassen müssen, um ein wenig hier oder da zwicken. Außerdem - Wenn ich die Daten nur ein bisschen anders gestalten muss, habe ich LINQ.
+0

Wie Sie ein Objekt Datenquellen für VS 2013 einrichten – Seabizkit

2

Wir verwenden auch SSRS als "lokale" Berichte. Wir erstellen Ansichten im SQL-Server, erstellen dann dieses Objekt in unserer Anwendung zusammen mit den anderen EF-Domänenmodellen und fragen dieses Objekt mit unserem DbContext ab. Wir verwenden eine ASPX-Seite und verwenden den dahinter liegenden Code (Page_Load), um die Daten an den Bericht zu übergeben. Hier

ist ein Beispiel dafür, wie wir es in dem Ereignis Page Load abfragen:

 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

Sie LINQ mit RDLC Bericht verwenden können, die ganz einfach zu bedienen ist

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