Array
(
)

Utilizando Reporte View com NHibernate

Maralvo
   - 06 jun 2011

Estou, pela primeira vez tentando criar um ReportView com NHibernate. Como faço para cirar um DataSet buscando informações no NHibernate?

Marcio
   - 07 jun 2011

Cara...Vai ter que ser tudo na mão mesmo. Na base do foreach.Tive que fazer isso a alguns dias atrás só que estava usando o Entity Framework.Se você quiser, depois coloco o exemplo aqui.
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.

Maralvo
   - 07 jun 2011

Mas one inserir esta linha de código dentro do arquivo .rdlc?

Marcio
   - 08 jun 2011

Não, para o rdlc vc já tem que passar o DataSet pronto.Você está usando DataSet tipado não é?

Você passa a DataTable / DataSet para o Report assim:#Código

        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.

Maralvo
   - 09 jun 2011

Márcio segue um exemplo do que estou utilizando:

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

Marcio
   - 10 jun 2011

Marcos,
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.

Maralvo
   - 15 jun 2011

Agora funcionou.