Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Crystal Reports in Visual Studio 2005 (C# .NET Windows App)

I need to create reports in a C# .NET Windows app. I've got an SQL Server 2005 database, Visual Studio 2005 and am quite OK with creating stored procedures and datasets.

Can someone please point me in the right direction for creating reports? I just can't seem work it out. Some examples would be a good start, or a simple How-to tutorial... anything really that is a bit better explained than the MSDN docs.

I'm using the CrystalDecisions.Windows.Forms.CrystalReportViewer control to display the reports, I presume this is correct.

If I'm about to embark on a long and complex journey, what's the simplest way to create and display reports that can also be printed?

like image 499
Piku Avatar asked Oct 02 '08 21:10

Piku


2 Answers

I have managed to make this work now.

Brief Overview

It works by having a 'data class' which is just a regular C# class containing variables and no code. This is then instantiated and filled with data and then placed inside an ArrayList. The ArrayList is bound to the report viewer, along with the name of the report to load. In the report designer '.Net Objects' are used, rather than communicating with the database.

Explanation

I created a class to hold the data for my report. This class is manually filled by me by manually retrieving data from the database. How you do this doesn't matter, but here's an example:

DataSet ds = GeneratePickingNoteDataSet(id);
foreach (DataRow row in ds.Tables[0].Rows) {
    CPickingNoteData pickingNoteData = new CPickingNoteData();

    pickingNoteData.delivery_date = (DateTime)row["delivery_date"];
    pickingNoteData.cust_po = (int)row["CustomerPONumber"];
    pickingNoteData.address = row["CustomerAddress"].ToString();
    // ... and so on ...

    rptData.Add(pickingNoteData);
}

The class is then put inside an ArrayList. Each element in the arraylist corresponds to one 'row' in the finished report.

The first element in the list can also hold the report header data, and the last element in the list can hold the report footer data. And because this is an ArrayList, normal Array access can be used to get at them:

((CPickingNoteData)rptData[0]).header_date = DateTime.Now;
((CPickingNoteData)rptData[rptData.Count-1]).footer_serial = GenerateSerialNumber();

Once you have an arraylist full of data, bind it to your report viewer like this, where 'rptData' is of type 'ArrayList'

ReportDocument reportDoc = new ReportDocument();
reportDoc.Load(reportPath);
reportDoc.SetDataSource(rptData);
crystalReportViewer.ReportSource = reportDoc;

Now you will need to bind your data class to the report itself. You do this inside the designer:

  1. Open the Field Explorer tab (which might be under the 'View' menu), and right-click "Database Fields"
  2. Click on 'Project Data'
  3. Click on '.NET Objects'
  4. Scroll down the list to find your data class (if it isn't there, compile your application)
  5. Press '>>' and then OK
  6. You can now drag the class members onto the report and arrange them as you want.
like image 91
Piku Avatar answered Oct 24 '22 18:10

Piku


Crystal is one possible option for creating reports. It has been around a long time and a lot of people seem to like it.

You might want to take a look at SQL reporting services. I have used both but my preferance is SQL reporting services. Its pretty well integrated into studio and works similar to the other microsoft projects. Its also free with the sql express etc.

This is a good article on beginning reporting services: http://www.simple-talk.com/sql/learn-sql-server/beginning-sql-server-2005-reporting-services-part-1/

like image 20
alexmac Avatar answered Oct 24 '22 18:10

alexmac