Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generate and Design Rdlc file programmatically

Tags:

I'm doing mvc reporting and i'm very new at it. I'm trying to create a report, and i have done it using rdlc. Everything works well, it can be exported to various format. My problem, when using rdlc is that we need to design and bind it first. How can i create an empty rdlc template, design and bind it with dataset programmatically.

My work so far (using empty rdlc template - just created the file without any table),

Controller File,

public ActionResult Report(string id)
    {
        DB.Open();
        LocalReport lr1 = new LocalReport();
        string path1 = Path.Combine(Server.MapPath("~/Report"), "TestEmptyReport.rdlc");
        lr1.ReportPath = path1;
        DataTable pc2a = new DataTable();
        pc2a = DB.getDataSet().Tables[0];
        pc2a.Columns.Add("Product Name");
        pc2a.Columns.Add("Price");
        pc2a.Columns.Add("Quantity");
        ReportDataSource rdc = new ReportDataSource("DataSet1", pc2a);
        lr1.DataSources.Add(rdc);

        string reportType = id;
        string mimeType;
        string encoding;
        string fileNameExtension;

        string deviceInfo =

            "<DeviceInfo>" +
            "<OutputFormat>" + id + "</OutputFormat>" +
            "<PageWidth>8.5in</PageWidth>" +
            "<PageHeight>11in</PageHeight>" +
            "<MarginTop>0.5in</MarginTop>" +
            "<MarginLeft>1in</MarginLeft>" +
            "<MarginRight>1in</MarginRight>" +
            "<MarginBottom>0.5in</MarginBottom>" +
            "</DeviceInfo>";

        Warning[] warnings;
        string[] streams;
        byte[] renderedBytes;

        renderedBytes = lr1.Render(
            reportType,
            deviceInfo,
            out mimeType,
            out encoding,
            out fileNameExtension,
            out streams,
            out warnings);

        return File(renderedBytes, mimeType);

    }

Model File,

public DataSet getDataSet()
    {
        string query = "SELECT * FROM tblproduct";
        if (con.State.ToString() == "Open")
        {
            SqlDataAdapter ad = new SqlDataAdapter(query, con);
            DataSet ds = new DataSet("tblproduct");

            ad.Fill(ds);

            return ds;
        }
        else
        {
            return null;
        }
    }

View File,

<div style="padding: 10px; border: 1px solid black">
<div><a href="@Url.Action("Report", new { id = "PDF" })">Get PDF Report</a></div>
<div><a href="@Url.Action("Report", new { id = "Excel" })">Get Excel Report</a></div>
<div><a href="@Url.Action("Report", new { id = "Word" })">Get Word Report</a></div>
<div><a href="@Url.Action("Report", new { id = "Image" })">Get Image Report</a></div>

The data is there, but i just dont know how to connect it with rdlc. Means creating column based on the data and fill it with the data called from sql server.

TQVM in advanced. Explanation and example or any other method will be helpful.

like image 248
Arif Sam Avatar asked Nov 10 '16 08:11

Arif Sam


2 Answers

If I understand your question correctly you wanted to create a report from a blank RDLC. You have to tell a RDLC file about the data in the design time. You can customize the report in the design time by adding columns or columns from another table or make a join.

Whereas Dynamic RDLC Generator through C# would be there to generate the report dynamically from RDLC. Since the complete ReportingEngine has been custom made but very generic. Copy paste might be going to help generating the report.

like image 99
Mohit S Avatar answered Sep 23 '22 14:09

Mohit S


Your question implies that you need to generate RDLC report on runtime mode. Things you should remember to:

  1. RDLC report viewer uses Microsoft.ReportViewer.WebForms and Microsoft.Reporting.WebForms namespaces, which utilizing WebForms logic code to bind and render the report. You can use a partial view which acts as container for ASPX page (either using single page or page with code behind) to render the report in MVC view pages.

    NB: You can use ReportViewer instance in controller action method to render RDLC as PDF file and returning FileContentResult (see here).

  2. RDLC contains XML tags which can be generated from various XML builder classes (see MSDN Report Definition for details).

Hence, you may create ReportViewer instance first, e.g.:

using Microsoft.Reporting.WebForms;

protected void Form_Load(Object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        ReportViewer1.ProcessingMode = ProcessingMode.Local;
        ReportViewer1.LocalReport.ReportPath = Server.MapPath("~/Report.rdlc");

        // add your DataSet here

        var data = new DataTable(); // example data source
        var dataSource = new ReportDataSource(DataSetName, data);

        ReportViewer1.LocalReport.DataSources.Add(dataSource);

        // put rendering stuff here
    }
}

Then, use steps from Generating RDLC Dynamically for the Report Viewer Local Report example (WebForms is similar to WinForms in terms of event handling usage, thus may be applicable in ASPX page) to create corresponding XML tags which generates report structure, summarized as below.

  1. Create and add DataSet for usage in DataSources element.
  2. Create report body and report items element.
  3. Create Tablix and TablixCorner elements according to table structure inside DataSet.
  4. Create TablixColumn, TablixRow and TablixCell elements which includes Textbox control depending to each column data types. The Value element inside Textbox control should contain expression =Fields!(ColumnName).Value for database-bound columns.
  5. Create report property elements (dataset query, fields, etc.)
  6. Add LoadReportDefinition into ASPX page after all report elements generated properly.

Alternatively, if you already know entire RDLC element structure, the similar solution using XmlWriter class can generate required elements for building the report from scratch, then rename generated XML to RDLC extension and bind it for ReportViewer control (seems takes some time to build each RDLC elements).

Additional references:

Rendering an RDLC report in HTML in ASP.NET MVC

Dynamic Reports with Reporting Services

like image 44
Tetsuya Yamamoto Avatar answered Sep 25 '22 14:09

Tetsuya Yamamoto