Desenvolvimento - Visual Basic .NET

Relatórios com Active Reports - Parte 2 - Web

O Active Reports é uma ferramenta da DataDynamics (www.datadynamics.com), totalmente integrada ao VS.net trazendo uma facilidade muito grande na criação de relatórios tanto em aplicações Windows (winforms) e para aplicações Web. Estarei mostrando os dois tipos de aplicação divididos em duas partes. Parte 1 - Windows e parte 2 - Web.

por Alexandre Tarifa



O Active Reports é uma ferramenta da DataDynamics (www.datadynamics.com), totalmente integrada ao VS.net trazendo uma facilidade muito grande na criação de relatórios tanto em aplicações Windows (winforms) e para aplicações Web. Estarei mostrando os dois tipos de aplicação divididos em duas partes. Parte 1 - Windows e parte 2 - Web.

Já foi mostrado na Parte 1 como exibir relatórios para aplicação Windows e agora será mostrado na Perte 2 como mostrar relatórios em aplicações web. O cenário e o relatório serão os mesmos:

Relembrando

Cenário

Teremos um arquivo XML simples de clientes chamado alunos.xml. Este arquivo xml será meu repositório de dados, ou seja, a fonte de dados que meu relatório buscará para exibir as informações formatadas. O arquivo terá a seguinte estrutura:

<?xml version="1.0" encoding="iso-8859-1" ?> 
<tblAluno>
	<aluno>
		<matricula>00001</matricula>
		<nome>João Paulo da Silva</nome>
		<endereco>Rua Bela Moema, 123</endereco>
		<bairro>Centro</bairro>
		<cidade>SP</cidade>
		<estado>SP</estado>
		<telefone>4359-4857</telefone>
	</aluno>
	<aluno>
		<matricula>00002</matricula>
		<nome>Ernesto Lopes</nome>
		<endereco>Rua das tulipas, 45</endereco>
		<bairro>Tatuapé</bairro>
		<cidade>SP</cidade>
		<estado>SP</estado>
		<telefone>3148-2547</telefone>
</aluno>	
	<aluno>
		<matricula>00003</matricula>
		<nome>Paulo Manga</nome>
		<endereco>Rua do Pão, 49</endereco>
		<bairro>Consolação</bairro>
		<cidade>SP</cidade>
		<estado>SP</estado>	
		<telefone>3523-4878</telefone>
	</aluno>	
</tblAluno>

Criando Relatório com Active Reports - WebForms

Será um relatório que listará todos os alunos do arquivo XML alunos.aspx. Através de um DataSet que vai ler o arquivo alunos.xml, vamos listar todas as informações formatadas.

Inicie um projeto do tipo Visual Basic e selecione o template ASP.NET Web Application com o nome ActiveReportsWeb.

O primeiro passo é a construção do relatório no Active Reports. Clique com o botão direito do mouse no projeto dentro do solution Explorer, Add, Add New Item. Selecione o template ActiveReportsFile.

É criado um formulário com o formato de um relatório. Os controles que compõe o relatório ficam na Toolbox, no grupo ActiveReports. A utilização dos controles é semelhante à de um formulário normal.

O relatório fica dividido em 3 partes: PageHeader (Topo), Detail (Itens) e PageFooter (Rodapé).

No PageHeader vamos adicionar o título do relatório e as descrições dos itens listados no relatório, conforme abaixo:

No Detail teremos que adicionar os TextBox dos campos de detalhe vinculados ao campo que ele se refere no banco de dados. Para fazer isto, basta vincular a propriedade DataField do textbox de acordo com o nome do atributo no arquivo alunos.xml.

Monte os details conforme abaixo:

No PageFooter vamos adicionar o número de páginas do relatório. Basta adicionar um TextBox chamado txtPagina e altera as propriedades SummaryRunning = All e SummaryTupe = PageCount.

Parte 2

Agora que revimos como montar o relatório temos que montar a chamada para este novo relatório. Vamos criar um formulário chamado frmRelatorio.aspx.

Com o relatório criado, temos que adicionar as referencias do Active Reports.

Adicione a referência Data Dynamics ActiveReports for .NET

Adicione também a referência Data Dynamics ActiveReports Viewer

Para adicionar o controle de visualização de relatórios temos que seguir um caminho não muito agradável (Escovar alguns bits - como diz meu amigo Marcus). Temos que adicionar algumas linhas no HTML da nossa página:

Dentro da TAG FORM, adicione as linhas seguintes:

<OBJECT id="arv" codeBase="arview2.cab#version=2,0,0,1183" height="100%" 
width="100%" classid="clsid:8569D715-FF88-44BA-8D1D-AD3E59543DDE" viewastext>
	<PARAM NAME="_ExtentX" VALUE="24712">
	<PARAM NAME="_ExtentY" VALUE="13547">
</OBJECT>

Dentro da TAG BODY, adicione as linhas seguintes:

<SCRIPT language="vbscript">
	<!--
	sub arv_ControlLoaded()
	arv.DataPath = "frmRelatorio.aspx?ReturnReport=1"
	end sub
	-->
</SCRIPT>

Dentro da TAG HEAD, adicione as linhas seguintes:

<script language="javascript"> 
function PrinterConfig(){ 
	arv.Printer.PaperSize = 9; 
	arv.Printer.Orientation = 1; 
	} 
</script>

Pronto, parece complicado mas não é tanto assim, visto que teremos sempre esta mesma página para receber os relatórios... mesmo tendo 50 relatórios na nossa aplicação sempre esta página que os exibirão.

Após a montagem da página, vamos chamar o código responsável pela exibição do relatório, adicione no form_load do frmRelatorio.aspx o seguinte código:

Dim rpt As New ActiveReport1
	"Abre o XML no data Set
        Dim ds As New DataSet
        ds.ReadXml(Server.MapPath("\alunos.xml"))
        rpt.DataSource = ds.Tables(0)

        If Page.IsPostBack = False Then
            Dim sReturnReport As String = Me.Page.Request.QueryString("ReturnReport")
            If (Not sReturnReport Is Nothing) Then
                If (Not sReturnReport.Trim() = String.Empty) Then
                    Me.Page.Response.Buffer = True
                    Try
                        rpt.Run(True)
                    Catch eRunReport As Exception
                        lblMensagem.Text = eRunReport.Message
                    End Try
                    "Create a memory stream to put the report document RDF in
                    Dim outStream As MemoryStream = New MemoryStream
                    "Save the report document into the memory stream
                    rpt.Document.Save(outStream, DataDynamics.ActiveReports.Document.RdfFormat.AR20)
                    "Move the postion back to the begining of the stream
                    outStream.Seek(0, SeekOrigin.Begin)
                    "Create a byte array buffer to read the memory stream into
                    Dim bytes(outStream.Length) As Byte
                    "Fill the byte array buffer with the bytes from the memory stream
                    outStream.Read(bytes, 0, CType(outStream.Length, Integer))
                    "Clear anything that might have been written by the aspx page
                    Me.Page.Response.ClearContent()
                    Me.Page.Response.ClearHeaders()
                    "Write the report document byte array to the requestor:
                    Me.Page.Response.BinaryWrite(bytes)
                    "end this request/response
                    Me.Page.Response.End()
                End If
            End If
        End If

Pronto, agora basta executar e seu relatório será exibido na página. Apesar de exigir algum trabalho extra, a partir do primeiro formulário montado, a única alteração que deve ser feita para outro relatório será o DataSet que será carregado no início do código.

Apesar de trazer um certo trabalho esta solução com Active Reports é muito boa pois após uma boa prática de utilização, a produtividade fica muito boa e seu custo é inferior a outras soluções de relatórios.

Para baixar esta aplicação, clique aqui.

Gostaria de agradecer novamente meu amigo David Pomarico (a filhinha dele Yasmin nasceu ontem) pela ajuda na criação do artigo.

Um Abraço
Alexandre Tarifa
www.alexandretarifa.eti.br
atarifa@deloitte.com


ONDE COMPRAR:
Comptools: http://www.comptools.com.br/produto.asp?codproduto=CF-00079

Alexandre Tarifa

Alexandre Tarifa - Ministra palestras e treinamentos, MVP (Most Valuable Professional), MCAD (Microsoft Certified Application Developer) e MCT (Microsoft Certified Trainer). Bacharel pela UMESP e pós-graduando pela Universidade Federal de São Carlos em Ciência da Computação. Analista de Sistemas e Líder do grupo de usuários Codificando.net São Paulo (sp.codificando.net). Escreve artigos para a revista MSDN Magazine e para os sites Linha de Código, MSDN Brasil e Enterpriseguys.
Visite o blog do autor: http://weblogs.pontonetpt.com/alexandretarifa/.