<!-- Article Starts - DO NOT ADD HTML/BODY START TAGS-->
Most of the time, the developers use simple way to design crystal reports using direct table link, in this way the report shows all the data present in the table and if we need to display some of the data from that table we need to pass our sql query to report to show the specified data only. There are two common methods to achive the same: dataset or recordset and in both the cases we set them as datasource of our report and before this data source is populated using our queries, here I am going to use recordset.
Procedure and Code
Here I am going to design two reports from the Territories and Region table of northwind database of SQL Server.
First add a crsytal report to your project and create that using wizar. Select Oledb(ADO) as datasource abd select oledb provider for SQL Server with proper user, password etc. Then add tables, views etc from where you want to display the data and then select fileds etc and complete the report design.
Now add a CrsytalReportViwer and copy the following code with proper changes.
<P>Dim Conn As New ADODB.Connection()</P><P>Dim report As New SimpleReport()</P><P>report = New SimpleReport()</P><P>Conn.ConnectionString = "Provider=sqloledb; Data Source=mydatasource; Initial Catalog=northwind;User Id=myuserid;Password=mypassword"</P><P>Conn.ConnectionTimeout = 10</P><P>Conn.Open()</P><P>Dim rs As ADODB.Recordset</P><P>rs = New ADODB.Recordset()</P><P>rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient</P><P>Dim sql As String = "SELECT * FROM Territories"</P><P>rs.Open(sql, Conn, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockReadOnly, -1)</P><P>CrystalReportViewer1.ReportSource = report</P><P>report.SetDataSource(rs)</P><P>CrystalReportViewer1.DataBind()</P><P>CrystalReportViewer1.RefreshReport()</P><P>rs.Close()</P><P>rs = Nothing</P>
ADODB.Connection Conn = new ADODB.Connection();
SimpleReport report = new SimpleReport();
report = new SimpleReport();
Conn.ConnectionString = "Provider=sqloledb; Data Source=mydatasource; Initial Catalog=northwind;User Id=myuserid;Password=mypassword";
Conn.ConnectionTimeout = 10;
rs = new ADODB.Recordset();
rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
string sql = "SELECT * FROM Territories";
rs.Open(sql, Conn, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockReadOnly, -1);
CrystalReportViewer1.ReportSource = report;
rs = null;
The above code describe the mechanisam to design a report using a single table query and if you want to pick data from different tables, you will design the report using those tables and at the same time you must have to pass the recordset or dataser accordingly using sql query and using the query you will mention the field name according to those present in the report , regardless from whichever table you get the data, other will it will never display any data.
I admit this is not the simplest method to populate reports data but whenever you want to controls things you must have to do something extra. Using this process you can pass any kind of information to your report and populate them well accroding to your needs. If your are an expert query designer, you can design just one report and then can pass each and every thing to your report using query for multiples reports.