Skip to main content

ASP.NET MVC razor SAP Crystal report


Crete a new project:



Add a aspx Master Page



Create a new folder Reports and 2 sub folder crystal & crystalviewer

Now add a web form page in crystalviewer  folder.
Add the master page namespace in your web form page.

MasterPageFile="~/Views/Shared/ReportSite.Master"


Replace your web form by this code

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    
</asp:Content>



Now go to design mode of your web form drag & drop the crystal report viewer in your web form.


After that your page will be look look like this.



Replace the code:

<CR:CrystalReportViewer ID="EmployeeList" runat="server"  HasCrystalLogo="False"
    AutoDataBind="True"  Height="50px"  EnableParameterPrompt="false" EnableDatabaseLogonPrompt="false" ToolPanelWidth="200px"
    Width="350px" ToolPanelView="None" />

I am also add a preview button if you need you can add more control as you need.
 Now add a crystal report 


Right click the field expert field then select the database (I will use store procedure)

Select your store procedure.







 Design your report based on your store procedure.
Add the namespace in your web form cs file
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;

replace the code in your button event
public string thisConnectionString = ConfigurationManager.ConnectionStrings["ConnectionStringOther"].ConnectionString;
        CrystalDecisions.CrystalReports.Engine.ReportDocument reportDocument = null;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.IsPostBack)
            {
                LoadReport();
            }
        }
        protected void Preview_Click(object sender, EventArgs e)
        {
            LoadReport();
        }
        private void LoadReport()
        {
            if (this.reportDocument != null)
            {
                this.reportDocument.Close();
                this.reportDocument.Dispose();
            }
            SqlConnectionStringBuilder SConn = new SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings["ConnectionStringOther"].ConnectionString);
            SqlConnection thisConnection = new SqlConnection(thisConnectionString);
            // store procedure
            SqlCommand mySelectCommand = new System.Data.SqlClient.SqlCommand("PIS_GetAllEmployeeInfo", thisConnection);
            mySelectCommand.CommandType = CommandType.StoredProcedure;
            reportDocument = new ReportDocument();
            //Report path
            string reportPath = Server.MapPath("~/Report/Crystal/EmployeeListCrystalReport.rpt");
            reportDocument.Load(reportPath);
            // Report connection
            ConnectionInfo connInfo = new ConnectionInfo();
            connInfo.ServerName = SConn.DataSource;
            connInfo.DatabaseName = SConn.InitialCatalog;
            connInfo.UserID = SConn.UserID;
            connInfo.Password = SConn.Password;
            TableLogOnInfo tableLogOnInfo = new TableLogOnInfo();
            tableLogOnInfo.ConnectionInfo = connInfo;
            foreach (CrystalDecisions.CrystalReports.Engine.Table table in reportDocument.Database.Tables)
            {
                table.ApplyLogOnInfo(tableLogOnInfo);
                table.LogOnInfo.ConnectionInfo.ServerName = connInfo.ServerName;
                table.LogOnInfo.ConnectionInfo.DatabaseName = connInfo.DatabaseName;
                table.LogOnInfo.ConnectionInfo.UserID = connInfo.UserID;
                table.LogOnInfo.ConnectionInfo.Password = connInfo.Password;
                table.Location = "dbo." + table.Location;
            }
           // You can pass parameter in your store procedure if you need
            //reportDocument.SetParameterValue("@FromDate", ProjectUtilities.ConvertToDate(txtFromDate.Text));
            //reportDocument.SetParameterValue("@ToDate", ProjectUtilities.ConvertToDate(txtToDate.Text));

            EmployeeListCrystalReport.ReportSource = reportDocument;
            EmployeeListCrystalReport.DataBind();
        }


Add the connection string in you web config file.


Add a new class name ReportViewerViewModel in your model folder

public class ReportViewerViewModel
    {
        public string ReportPath { get; set; }
    }

Add a report controller & define action
public class ReportController : Controller
    {
        //
        // GET: /Report/

        public ActionResult EmployeeListReport()
        {
            ReportViewerViewModel model = new ReportViewerViewModel();
            string content = Url.Content("~/Report/ReportViewer/EmployeeListReport.aspx");
            model.ReportPath = content;
            return View("ReportViewer", model);
        }

    }


Add a Reportviewer  viewer & replace the code

@{
    ViewBag.Title = "ReportViewer";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@model MvcApplicationCrystalReport.Models.ReportViewerViewModel
<iframe src="@Model.ReportPath"  style="width:100%; height:1000px; border:none;"></iframe>



Now run the solution set debugger in report controller



click report





Your report will not view, you need to add a folder aspnet_client in which there will be crystalreportviewers13 folder of your crystal report set up.

 Now preview you will see your report.





You can download the code sample

Comments

Popular posts from this blog

mvvm double click event in listview

If you want to get the double click event on a listview item you can try with this code; <ListView Grid.Row="0" Grid.RowSpan="3" Grid.Column="0" Width="250" Height="200" HorizontalAlignment="Stretch" VerticalAlignment="Top" AlternationCount="2" BorderBrush="#FFA8CC7B" ItemContainerStyle="{StaticResource alternatingStyle}" ItemsSource="{Binding FromPayerNameList}" SelectedItem="{Binding SelectedFromPayer, Mode=TwoWay}"> <ListView.ItemTemplate> <DataTemplate> <TextBlock Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" Text=...

WPF datagrid cell textbox change event

Entity/Class: public class FeesDetails : INotifyPropertyChanged { public int Id { get; set; } public string FeesName { get; set;} public string FeesDetailsName { get; set; } public int? PaidAmount { get; set; } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(System.String info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } public int feesAmount { get; set; } public int FeesAmount { get { return this.feesAmount; } set { if (value != this.feesAmount) { this.feesAmount = value; NotifyPropertyChanged("FeesAmount"); } } } } XAML: <DataGrid AutoGenerateColumns="False" Height="21...

The calling thread must be STA, because many UI components require this.

Using Thread: // Create a thread Thread newWindowThread = new Thread(new ThreadStart(() => { // You can use your code // Create and show the Window FaxImageLoad obj = new FaxImageLoad(destination); obj.Show(); // Start the Dispatcher Processing System.Windows.Threading.Dispatcher.Run(); })); // Set the apartment state newWindowThread.SetApartmentState(ApartmentState.STA); // Make the thread a background thread newWindowThread.IsBackground = true; // Start the thread newWindowThread.Start(); Using Task and Thread: // Creating Task Pool, Each task will work asyn and as an indivisual thread component Task[] tasks = new Task[3]; // Control drug data disc UI load optimize tasks[0] = Task.Run(() => { //This will handle the ui thread :The calling thread must be STA, because many U...