2013-02-28 42 views
26

Chúng tôi đang tìm cách thêm Microsoft Reports - SSRS vào một trong các trang web nội bộ của chúng tôi.Tạo báo cáo trong ASP.Net với Entity Framework

Cơ sở dữ liệu có tất cả các tính năng báo cáo được cài đặt.

Trang web đang sử dụng Khuôn khổ thực thể 4 cho tất cả dữ liệu.

Tôi đã có thể tạo báo cáo bằng cách sử dụng kiểu cũ để tạo Tập dữ liệu (* .XSD) và cách này hoạt động tốt.

Câu hỏi của tôi là có thể sử dụng Khung thực thể hiện tại trong trang web cho dữ liệu mà báo cáo yêu cầu không? Thay vì phải phát minh lại bánh xe và tạo toàn bộ Số liệu, cùng với các mối quan hệ, v.v.

Đó là một trang web và không áp dụng, vì vậy điều này (http://weblogs.asp.net/rajbk/archive/2010/05/09/creating-an-asp-net-report-using-visual-studio-2010-part-1.aspx) dường như không áp dụng; Tôi không thấy DataSource (trong phần 2 của hướng dẫn)

Cập nhật

Là một phụ lưu ý, chúng tôi muốn tránh xa điều khiển của bên thứ ba đắt, vv

Ngoài ra, một cách khác để xem xét vấn đề có thể là tạo ra * .XSD từ mô hình thực thể khung thực thể; điều này có thể không? Nó không lý tưởng mặc dù chúng tôi sẽ chạy và chạy ..

Trả lời

0

Bạn có thể sử dụng WCF-Service làm Datasource và do đó tái sử dụng dữ liệu ứng dụng và logic cho báo cáo của bạn. Điều này đòi hỏi một phiên bản tiêu chuẩn máy chủ SQL ít nhất tôi tin. Vì vậy, không thể làm gì với phiên bản SQL-express miễn phí.

+0

Cố gắng này tiếp cận quá, mặc dù có vẻ như điều này sẽ chỉ hoạt động nếu đó là một ứng dụng web và không phải trang web vì tham chiếu không có sẵn trong trình thiết kế báo cáo (trình hướng dẫn nơi bạn chọn nguồn dữ liệu của mình) - tham chiếu không tồn tại. – Darren

+0

là cách duy nhất để truy cập mã của bạn trong báo cáo. Nếu bạn không thể thiết lập một ứng dụng web cho dịch vụ WCF của bạn, bạn có thể truy cập tốt nhất dữ liệu của bạn với sql đơn giản hoặc một thủ tục được lưu trữ – JMan

+0

yah, bắt đầu thấy điều đó. Chúng tôi xây dựng các thủ tục được lưu trữ cho các báo cáo trong cùng một thời gian khi đặt câu hỏi này; thực sự không thích có logic truy cập dữ liệu ở những nơi khác nhau ... – Darren

8

Dưới đây là mẫu nhanh về cách tôi đặt nguồn dữ liệu báo cáo trong một trong các ứng dụng .NET winForms của tôi.

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

Bí quyết là tạo báo cáo (.rdlc) với chuỗi kết nối nguồn dữ liệu trống, khối truy vấn trống và DataSetInfo trống (Tôi phải sửa đổi xml theo cách thủ công). Họ phải tồn tại trong tập tin và được để trống như sau:

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> 

bây giờ trong một sự kiện trang, tôi sử dụng một SelectedIndexChanged trên DropDownList, ràng buộc nguồn dữ liệu báo cáo như sau:

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

cách tiếp cận của tôi có luôn được sử dụng các tệp RDLC với các nguồn dữ liệu đối tượng và chạy chúng trong chế độ 'cục bộ'. Những nguồn dữ liệu này là ... thực thể của tôi! Bằng cách này, tôi đang sử dụng tất cả các logic kinh doanh, định dạng chuỗi, nhận thức văn hóa, v.v ... mà tôi sử dụng cho các ứng dụng web của mình. Có một số điều kỳ quặc, nhưng tôi đã có thể sống với họ:

  • Tệp RDLC không thích sống trong các dự án web. Chúng tôi tạo ra một dự án winform giả riêng biệt và thêm các tập tin RDLC ở đó.
  • Tôi không hiển thị báo cáo trong trình xem. Tôi cho phép người dùng tải xuống tệp PDF, Word hoặc Excel và chọn lưu hoặc mở trong trình xem gốc. Điều này tiết kiệm một loạt các nhức đầu, nhưng có thể đặt một số folks off, tùy thuộc vào yêu cầu. Đối với thiết bị di động, nó khá đẹp.
  • Vì bạn không sử dụng SSRS, bạn không nhận được tính năng đăng ký tốt đẹp. Bạn sẽ xây dựng nó nếu cần. Tuy nhiên, theo nhiều cách, tôi thích điều này.

Tuy nhiên, những lợi ích thật sự tốt đẹp:

  • Tôi đang sử dụng tất cả các giống tốt lành logic kinh doanh mà tôi đã viết cho quan điểm của tôi.
  • Tôi có phương thức điều khiển ReportActionResult và DownloadReport tùy chỉnh cho phép tôi chạy bất kỳ báo cáo nào thông qua một URL duy nhất. Điều này có thể rất tiện dụng. Nó chắc chắn làm cho một thành phần đăng ký tùy chỉnh dễ dàng hơn.
  • Báo cáo phát triển có vẻ khá nhanh, bây giờ tôi chỉ cần điều chỉnh các lớp học một phần của thực thể để tinh chỉnh một chút gì đó ở đây hoặc ở đó. Ngoài ra - Nếu tôi cần định dạng dữ liệu khác một chút, tôi có LINQ.
+0

cách bạn thiết lập nguồn dữ liệu đối tượng cho VS 2013 – Seabizkit

2

Chúng tôi cũng sử dụng SSRS làm báo cáo "cục bộ". Chúng ta tạo các khung nhìn trong máy chủ SQL, sau đó tạo đối tượng đó trong ứng dụng của chúng ta cùng với các Mô hình miền EF khác và truy vấn đối tượng đó bằng cách sử dụng DbContext của chúng ta. Chúng tôi sử dụng trang ASPX và sử dụng mã phía sau (Page_Load) để nhận dữ liệu được chuyển đến báo cáo.

Dưới đây là một ví dụ về cách chúng ta truy vấn nó trong sự kiện 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

Bạn có thể sử dụng LINQ với RDLC Báo cáo đó là khá dễ dàng để sử dụng

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(); 
Các vấn đề liên quan