segunda-feira, 6 de março de 2006

Criando Relatórios no ECO com 9Rays Report

Bom desta vez irei mostrar como é fácil fazer relatórios utilizando ECO.
Crie um novo Projeto Eco Winforms, para isso vá em File->New->Other selecione a pasta Delphi for .Net Projects, de um duplo clique em ECO Winforms Application.
Vá agora na aba Model View expanda o primeiro item da lista clicando no sinal ‘+’, expanda o item Package1 e de um duplo clique no primeiro item.
Crie o modelo como abaixo:



Não se esqueça de mudar o nome das duas pontas da associação ou o ECO irá reclamar.

Agora clique na primeira aba do lado do esquerdo da Model View e de um duplo clique no item Winform.pas.
Configure a propriedade ECOSpaceType do componente rhRoot para usar seu Modelo.
Delete os componentes EcoAutoFormExtender, ECOListActionExtender e ECOGlobalActions.

Adicione o componente ReportGenerator e sete sua propriedade OwnerForm para o form atual e mude seu nome para rptRelatorioECO.
* Adicione na propriedade DataSources, clicando no botão Add, o Nome PessoaList e o Value apontando para o ehPessoa. (esse item em tempo de design não deveria ser importante, porém se você não preenche-la você poderá encontrar problemas ao tentar acessar a propriedade DataSource via código, por isso é recomendado preenche-la).

Adicione dois componentes ExpressionHandle e um CurrencyManager.
Mude o nome de um dos ExpressionHandle para ehPessoa e o outro para ehContato e mude o nome do CurrencyManager para cmhPessoa.
O ehPessoa deverá ter a seguinte expressão Pessoa.allInstances->select(e|e.PessoaContato->isEmpty), sete a propriedade *AddDefaultNestings para true e mude a propriedade rootHandle para usar o rhRoot, o ehContato deverá ter está expressão self.Contatos e seu rootHandle deverá apontar para cmhPessoa.
O cmhPessoa deverá ter sua propriedade RootHandle apontando para o ehPessoa e sua propriedade BindingContext apontando para o TWinForm.
*Mudamos para true a propriedade AddDefaulNesting para que nosso relatório entenda que o nosso objeto Contato é uma Pessoa e possui os mesmos campos que uma Pessoa e permita que nós o utilizemos, caso contrario o relatório iria apenas mostrar o objeto sem atributos, não permitindo que o mesmo seja manipulado.

Agora Adicione dois datagrids e três botões.
Mude a opção DataSource de um dos DataGrids para usar o ehPessoa e o outro para usar o ehContato.
Mude a propriedade Text de um dos botões para Criar Pessoa, com o seguinte código no evento Click:
Pessoa.Create(EcoSpace);

Mude a propriedade Text do outro botão para Criar Contato, com o seguinte código no evento Click:
var
vContato: Pessoa;
begin
if Assigned(cmhPessoa.Element) then
begin
vContato := Pessoa.Create(EcoSpace);
(cmhPessoa.Element.AsObject as Pessoa).Contatos.Add(vContato);
end
else
MessageBox.Show('Não Existe nenhuma pessoa para adicionar contatos!');
end;

Adicione os seguintes namespaces na seção uses do seu código: NineRays.Reporting.DOM, System.Resources,
NineRays.Reporting.View.

Mude a propriedade Text do outro botão para Gerar Relatório, com o seguinte código no evento Click:
var
vPreviewForm : PreviewForm;
begin
ehPessoa.EnsureBindingList; //Certificamos que a lista de Pessoas esta atualizada
ehContato.EnsureBindingList; //Certificamos que a lista de Contatos esta atualizada

rptRelatorioECO.DataSources.Clear; //Limpamos a lista de DataSources do Relatorio.

rptRelatorioECO.DataSources.Add('PessoaList',ehPessoa.GetList); //Adicionamos a nossa lista de pessoas atual ao datasource.
rptRelatorioECO.DesignTemplate; //Este método é utilizado apenas para desenharmos o relatorio. Após Desenhado não será mais utilizado.

rptRelatorioECO.LoadTemplate(Application.ExecutablePath.Trim('ExemploRelatoriEco.exe'.ToCharArray)+'\relatorioEco.rst'); //Carregamos o arquivo que iremos salvar após Desenhar o relatório e salvar. Atenção o nome do relatório deve ser o mesmo do que foi salvo no Design dele.

vPreviewForm := PreviewForm.Create(rptRelatorioECO); //Criamos o form de Preview do Relatório.
try
try
rptRelatorioECO.Prepare; //Preparamos o relatorio
vPreviewForm.WindowState := FormWindowState.Maximized; //Setamos o estado da janela para Maximizado.
vPreviewForm.ShowDialog; //Exibimos a tela de Preview.
except
on ee : Exception do MessageBox.Show(ee.Message, 'Relatorio no ECO', MessageBoxButtons.OK, MessageBoxIcon.Error); //Se ocorrer algum erro mostramos o mesmo para o usuário.
end;
finally
vPreviewForm.Dispose; //Liberamos o recurso da memória.
end;
end;

Agora Execute o programa e click no botão Gerar Relatório a tela de design será exibida, como abaixo:



Vá no menu File -> New -> Blank Report e click em Ok.

Com nosso novo relatório criado vamos adicionar um PageHeader (cabeçalho) no nosso relatório, para isso click no ícone depois click no relatório e posicione o pageheader no topo da pagina. Vá na aba DataSources e vá no Item Special Fields, você encontrará campos para identificar o numero da pagina a descrição do documento, total de paginas e outros, Click e arraste o Page Number para dentro do PageHeader e posicione o na lateral direita. (Atenção: Coloque sempre dentro ou o mesmo não será exibido). Você poderá colocar o titulo de seu Relatório dentro do PageHeader caso queira que ele seja exibido em todas as paginas ou colocar um Detail e escrever dentro para ele aparecer apenas na pagina inicial. No nosso caso vamos adicionar um detail, para isso click no ícone
e Posicione o abaixo de seu pageHeader, após fazer adicione um texto dentro do Detail utilizando o primeiro item da barra lateral esquerda, chamado TextBox, e altere sua propriedade Text para Relatório ECO e 9Rays.

Vamos agora começar a manipular os dados do ECO.
Para isso adicione um DataBand clicando no ícone e posicione-o abaixo do Detail, click no DataBand e altere sua propriedade DataSource para PessoaList (O Nome dado no DataSource do rptRelatorioEco), atenção para manipular os dados a serem exibidos todos os componentes como Header, Detail e outros deverão ser colocados dentro do DataBand principal ou os dados não serão exibidos.
Bom com nosso DataBand criado vamos agora colocar um Header dentro dele, para isso click no ícone e desenhe-o dentro do DataBand. (Repeti novamente para que não ocorra nenhum erro). Depois de feito isso adicione dois TextBox um com o Text Nome e o outro Endereço.
Depois de feito isso adicione dentro do DataBand um componente Detail, vá na aba Data Sources e expanda o item PessoaList (Mesmo nome do rptRelatorioEco) click e arraste o item Nome para dentro do Detail, faça a mesma coisa com o Endereço.
Bom agora vamos adicionar um outro DataBand dentro do nosso Databand para exibir os Contatos de cada Pessoa, adicione o DataBand e configure seu DataSource para apontar para PessoaList.Contatos.
Após ter feito isso adicione um Header e um Detail dentro deste DataBand como feito no primeiro porem você deverá pegar os campos da aba DataSource que esta dentro do PessoaList -> Contatos e arrastá-los como feito anteriormente.
Após ter feito isso você poderá adicionar um pageFooter para colocar um rodapé.
O resultado final devera ser como o abaixo:


Salve o relatório com o nome relatorioEco no mesmo diretório do executável e feche o editor de relatórios, feche o programa e remova ou comente a linha:
rptRelatorioECO.DesignTemplate;

Salve seu Projeto e execute o programa, adicione algumas Pessoas e alguns Contatos e veja o resultado final ;).

Para baixar o 9Rays entre no site da empresa: 9Rays

Abraços e espero que tenham gostado e até semana que vem.

Qualquer duvida ou comentários postem no blog afinal está liberada a postagem de comentários sem cadastro no blog.

5 comentários:

Anônimo disse...

Estou com problema no Preview do relatorio. Ao ser executado o mesmo não aparace o resultado esperado, mas ao clicar no botão Show Content o resultado aparece.
O que devo fazer para que no Preview seja mostrado o resultado correto.

Unknown disse...

Primeiro qual versão do ECO vc esta utilizando ? e do 9rays ?
qual o tipo de aplicaçao ? asp net ou windows forms ?

Grande Abraço,
Diego Garcia

Gustavo disse...

Estou utilizando o VS2008 com C# em WindowsForm e minha versão do 9rays é a 1.7.

Valeu!

Unknown disse...

Gustavo vou instalar o 9rays aqui e jaja posto a solução pra vc ;)

Grande abraço,
Diego Garcia

Unknown disse...

Gustavo acabei de fazer o mesmo exemplo q porstei no blog anteriormente porem no vss2008 e funcionou sem problemas !
Porem fiz com a versao mais nova do componente 9Rays que agora não é mais da 9Rays e sim da empresa Perpetuum, utilizei a versao Express do report sharpshoter que é gratuita !
Estou postando o link direto para a aplicação demo que fiz ! tem algumas mudanças no codigo em relaçao a este postado no blog mas nada significativo !

http://www.unitone.com.br/Blog/Arquivos/ecoReportDemo.rar

Grande abraço,
Diego Garcia