Utilizando Reporte View com NHibernate
06/06/2011
0
Marcos Oliveira
Posts
07/06/2011
Marcio Silveira
De qualquer forma é mais ou menos assim:
DataTable dt = new DataTable();dt.Columns.Add("Coluna1");dt.Columns.Add("Coluna2");dt.Columns.Add("Coluna3");
DataRow dr;
foreach (var item in colecao){ dr = dt.NewRow(); dr["Coluna1"] = item.propriedade1; dr["Coluna2"] = item.propriedade2; dr["Coluna3"] = item.propriedade3; dt.Rows.Add(dr);}
Para ficar mais genérico, você pode pegar o nome das colunas direto da coleção de objetos. No meu sistema fiz assim, um método genérico para criar a DataTable com qualquer coleção. E depois é só adicionar a DataTable no DataSet.Para pegar as propriedades genericamente, você tem que pegar o tipo (GetType()), e usar o tipo para pegar o valor.
07/06/2011
Marcos Oliveira
08/06/2011
Marcio Silveira
Você passa a DataTable / DataSet para o Report assim:
DataTable dt = obj.GetDataTable(); Microsoft.Reporting.WebForms.ReportViewer rptV = new Microsoft.Reporting.WebForms.ReportViewer(); string reportPath = Server.MapPath(nomeRelatorio + ".rdlc"); try { rptV.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("dsTeste_" + dt.TableName, dt)); rptV.LocalReport.ReportPath = reportPath; . . . }
No caso acima (que é só um exemplo), uso um DataSet tipado chamado dsTeste, e dentro dele possuo declarada a DataTable que uso dentro do ReportViewer. Cuidado com o nome do Dataset e o nome da DataTable, o reportviewer é case sensitive.
09/06/2011
Marcos Oliveira
no botão Relatório chamei o seguinte código:
Dim list As IList(Of Model.AFD)
ctCadastrarMaco.ocorreuUmEvento(ctCadastrarMaco.RELATORIO)
list = ctCadastrarMaco.buscarRelatorio()
Session("list") = list
Response.Redirect("webform1.aspx")
A função OcorreuUmEvento, chama outra função chamada: buscarRelatorio():
Dim maco As Maco = frm.getMaco()
Dim lista As IList(Of AFD)
Dim ms As New MacoService
Dim ds As New AfdService
Dim codOrgao As Nullable(Of Integer) = Convert.ToInt32(frm.getCodOrgao())
ms.lock(maco, LockMode.None)
lista = ms.consultarProcessosDoMacoPorNumeroMacoECodOrg(maco.numMaco, codOrgao)
Return lista
Ou seja, armazena o resultado da query em uma lista
No aspx do relatório chamo:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim list As IList(Of Model.AFD)
list = CType(Session("list"), IList(Of Model.AFD))
Dim ds As New Relatorio
For Each r As Model.AFD In list
ds.Orgao.AddOrgaoRow("r.codDocto.ToString",
"orgao",
"AFD",
"r.observacao.ToString",
"r.qtdAnexo.ToString",
"r.qtdApenso.ToString",
"r.qtdVolume.ToString",
"usuario")
Next
ReportViewer1.LocalReport.ReportPath = "rptRelatorioMaco.rdlc"
ReportViewer1.LocalReport.ReportEmbeddedResource = "ReportView.rptRelatorioMaco.rdlc"
ReportViewer1.LocalReport.DataSources.Clear()
ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("Relatorio_RelatorioMaco", ds.Tables(0)))
ReportViewer1.DataBind()
End Sub
10/06/2011
Marcio Silveira
Seu código está perfeito (desde que o nome da tabela esteja correto), qual o erro que está apresentando?Faça um try/catch e pegue a innerException e post aqui a mensagem.
Clique aqui para fazer login e interagir na Comunidade :)