XML - Gerando relatórios a partir de arquivos XML - I


Geralmente quando precisamos gerar um relatório a fonte de dados quase sempre é um banco de dados relacional como SQL Server, Oracle, MySQL, Microsoft Access, FireBird, etc. Mas com a difusão da utilização de arquivos XML, podemos ter um cenário onde os dados estão localizados em arquivos XML. Neste caso temos que gerar relatórios a partir destes arquivos. E então como fazer ???

Este artigo vai mostrar como gerar relatórios a partir de arquivos XML usando o Crystal Reports (I) e também o ReportViewer(II).

Eu não vou entrar muito nos detalhes de como gerar o arquivo XML mas para este exemplo vamos supor que você tenha que gerar um relatório da tabela Products do banco de dados Northwind.mdf do SQL Server 2005.

Os exemplos deste artigo usam o Visual Studio 2008 e o SQL Server 2005 Express Edition (banco de dados Northwind.mdf) e a versão do Crystal Reports para Visual Studio 2008;

1- Gerando o arquivo XML

Abra o VS 2008 e crie um novo projeto do tipo Windows Forms chamado Gerando_Relatorios_XML;

No formulário form1.vb vamos incluir dois controles Button conforme o leiaute abaixo:

 1- btnGerarXML

 2- btnGerarRelatorio

Vamos gerar o arquivo produtos.xml a partir da tabela Products do banco de dados Northwind.mdf.

Primeiro declare os namespaces:

Imports System.Data
Imports
System.Data.SqlClient

No evento Click do botão de comando - Gerar XML... insira o código :

Private Sub btnGerarXML_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGerarXML.Click
       
       Dim conn As New SqlConnection("Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=SSPI;")
 
        Dim sqlTexto As String = "SELECT * FROM Products"
        Dim cmd As New SqlCommand(sqlTexto, conn)
      
       Try
            Dim adapter As SqlDataAdapter = New SqlDataAdapter(cmd)
            Dim ds As New DataSet
            adapter.Fill(ds)
            ds.WriteXml("c:\dados\produtos.xml")
            MsgBox("Arquivo produtos.xml gerado com sucesso em c:\dados")
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            conn.Close()
            conn.Dispose()
        End Try
    End Sub

O código acima é tudo que precisamos para gerar o arquivo XML a partir da tabela Products. Veja a simplicidade onde estou usando o método WriteXml() do DataSet gerado a partir da tabela Products.

O arquivo produtos.xml gerado na pasta c:\dados tem o seguinte conteúdo:

Gerando o Relatório no Crystal Reports

Agora vamos realmente ao que interessa: gerar o relatório a partir do arquivo produtos.xml obtido.

Clique com o botão direito do mouse sobre o nome do projeto e selecione Add New Item;

Selecione o template Crystal Reports e informe o nome RelatorioXML.rpt e clique em Add;

O assistente do Crystal vai aparecer, selecione a opção Using the Report Wizard e escolha o Expert Standard e clique em OK;

Selecione o item DataBase File e clique em Next>;

A seguir selecione o arquivo Produtos.xml que foi gerado e clique em Abrir;

Seria criado um DataSet chamado Table, marque-o e clique na seta > para selecioná-lo conforme figura abaixo e clique em Next>;

Agora selecione os campos que deseja exibir no relatório. Eu escolhi os campos ProdutctID, ProductName, UnitPrice e UnitsInStock selecione-os conforme a figura abaixo e clique em Next>;

Como não vamos realizar nenhum agrupamento nem seleção de registroo Clique em Next> na janela atual e na próxima janela também clique em Next>;

Para encerrar a criação do relatório clique em Finish;

Ao final você verá a estrutura do relatório exibida no descritor conforme a figura abaixo;

Para exibir o relatório vamos incluir a partir da ToolBox o componente CrystaReportViewer no formulário form1.vb abaixo dos dois botões de comando que incluímos anteriormente no formulário;

Abrindo a guia CrystalReportViewer Tasks selecione Choose a Crystal Reports;

E escolha o relatório que foi criado anteriormente e clique em OK;

Agora vamos definir o código que irá exibir o relatório no componente.

Defina os seguintes namespaces no início do formulário form1.vb;

Imports CrystalDecisions.Shared
Imports
CrystalDecisions.CrystalReports.Engine
Imports
CrystalDecisions.Windows.Forms

No evento Click do botão Exibir Relatório de Produtos inclua o seguinte código;

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

   Dim relatorio As New ReportDocument()
   report.Load(
"C:\Users\vb\RelatorioXML.rpt")
   CrystalReportViewer1.ReportSource = relatorio

End Sub

No código criamos uma instância da classe ReportDocument,  esta classe é a classe base para todos os relatórios, onde cada relatório é uma classe que herda da classe ReportDocument.

Para visualizar o relatório usamos o controle CrystalReportViewer onde a sua propriedade ReportSource define a fonte do relatório a exibir.

Executando o projeto e clicando neste botão iremos obter o relatório conforme a figura abaixo;

Simples, simples assim...

Pegue o projeto completo aqui: Gerando_Relatorios_XML.zip

Eu sei é apenas Crystal Reports, mas eu gosto...

Referências:

José Carlos Macoratti