sexta-feira, maio 22, 2009

Crystal Reports C# Custom DataSource

Aqui vai uma dica para quem estiver começando a usar o Crystal Reports no Asp.Net. 

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:

DataSet ds = new DataSet();
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;


E não esqueça de criar o CrystalReportView!
<CR:CrystalReportViewer ID="crv" runat="server" AutoDataBind="true" />


Alguns links pesquisados e muito uteis.