Na maioria dos exemplos da web é mostrado usando os componentes CrystalReportViewer, CrystalReportSource e SqlDataSource. Mas infelizmente nem sempre é possível utilizar um comando SQL no SQLDataSource. As vezes é preciso tratar o retorno da pesquisa ou até adicionar campos extras. Para estes casos é possível criar uma tabela temporária para passar as informações para o reporte, observe o código abaixo:
DataTable t = ds.Tables.Add("Cliente");
t.Columns.Add("ClienteID", Type.GetType("System.Int32"));
t.Columns.Add("Nome", Type.GetType("System.String"));
DataRow r;
// O select abaixo é feito usando o Subsonic
List<Cliente> colecaoCliente = new Select().From(Cliente.Schema).ExecuteTypedList<Cliente>();
foreach (Cliente c in colecaoCliente)
{
r = t.NewRow();
r["ClienteID"] = c.ClienteID;
r["Nome"] = c.Nome;
t.Rows.Add(r);
}
ReportDocument rpt = new ReportDocument();
rpt.Load(Server.MapPath("~/reports/RelatorioCliente.rpt"));
rpt.SetDataSource(ds.Tables[0]);
crv.ReportSource = rpt;
List<Cliente> colecaoCliente = new Select().From(Cliente.Schema).ExecuteTypedList<Cliente>();
foreach (Cliente c in colecaoCliente)
{
r = t.NewRow();
r["ClienteID"] = c.ClienteID;
r["Nome"] = c.Nome;
t.Rows.Add(r);
}
ReportDocument rpt = new ReportDocument();
rpt.Load(Server.MapPath("~/reports/RelatorioCliente.rpt"));
rpt.SetDataSource(ds.Tables[0]);
crv.ReportSource = rpt;
E não esqueça de criar o CrystalReportView!
<CR:CrystalReportViewer ID="crv" runat="server" AutoDataBind="true" />
<CR:CrystalReportViewer ID="crv" runat="server" AutoDataBind="true" />
Alguns links pesquisados e muito uteis.