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 pela ajuda na criação do artigo.
Se você tem interesse em aprender .net ou discutir .net entre no grupo de usuários Codificando.net - São Paulo.
Se tiver alguma dúvida, crítica, sugestão de artigo, fale comigo: atarifa@deloitte.com
Abraço.
Alexandre Tarifa
Líder Codificando.net SP
ONDE COMPRAR:
Comptools: http://www.comptools.com.br/produto.asp?codproduto=CF-00079