sábado, 8 de setembro de 2012

Hello ReportX!

A ideia desse exemplo, além de testar o formato das postagens para o blog, é construir um relatório simples. Não chega a ser o relatório mais simples que podemos escrever com o VRX, mas é um exemplo prático para ter uma noção geral do funcionamento dos objetos que o componente disponibiliza.
Nesse exemplo vou descrever como construir uma listagem de uma tabela de banco de dados usando o banco de exemplo do MS Access que é enviado no pacote de exemplos do componente.

Primeiro, vou mostrar a estrutura da tabela no banco para sabermos como desenhar o relatório.
Figura 1 - O banco de dados
Da tabela de "Estados", vamos imprimir uma listagem com os atributos "Estado" e "Nome".
Para isso, abrimos um novo projeto no VB, adicionamos as referências para a OCX do componente e para o ADO.
Depois inserimos um formulário em branco com o nome "SampleReport", onde desenhamos o relatório seguindo o layout abaixo. Para desenhar, pode arrastar os objetos a partir da barra de ferramentas. A atenção é apenas com os objetos ReportField porque eles precisam ser colocados dentro das seções (objeto ReportSection). A melhora sequência para desenhar é inserir um ReportMain, em seguida os objetos do tipo ReportSection e no final os objetos do tipo ReportField.
Figura 2 - O desenho do relatório
Para criar esse formulário, adicionamos o objeto do ReportMain, definimos a propriedade Name para  "Relatório", a propriedade Titulo para "Exemplo", ligamos a propriedade Regua e definimos a propriedade Divisao para 10. Depois inserimos 3 objetos do tipo ReportSection, definindo para cada um, a propriedade Tipo como secCabecalho, secDetalhe e secRodape respectivamente. Depois inserimos 3 objetos do tipo ReportField na seção de cabeçalho, programando a propriedade Caption com os textos de acordo com a Figura 2. Em seguida, adicionamos mais 2 objetos do tipo ReportField na seção de detalhe programando a propriedade Campo de acordo com o nome do atributo da tabela "Estados".

Agora, escrevemos o código do formulário do relatório conforme a figura abaixo:
Figura 3 - O código do relatório
No formulário, criamos um método público para que possa ser chamado por alguma rotina ou tela do sistema, onde esse método pode ter um filtro, se necessário ou outras opções do relatório.
Normalmente deixamos o código que tem relação com o relatório encapsulado no próprio formulário, assim podemos levar o formulário inteiro para outro projeto, se necessário. É possível até definir as propriedades e executar o relatório a partir de outra parte do sistema. Tudo depende de como o sistema está desenhado. A única restrição aqui é que o relatório não pode ser chamado a partir de um formulário que está sendo exibido de forma modal.
Na Figura 3, destaquei a propriedade Recordset porque através dela, dizemos ao componente qual a fonte de dados. Podemos usar um objeto recordset do ADO ou mesmo do DAO/RDO caso o sistema acesse banco de dados com esses engine. Como ela é uma propriedade do objeto ReportMain, no código que escrevermos nos eventos, que são disparados pelo componente durante a execução, podemos usar essa propriedade para acessar os valores dos campos do registro que estiver corrente, mover o registro para frente para pular alguma parte ou mesmo mover para trás para repetir a impressão de um registro.
Outra parte importante é o método Ativar que inicia a execução do relatório, e ao terminar, tendo o usuário impresso, fechado ou apenas visualizado, o controle volta ao código e fechamos o recordset.
Ao terminar a execução, como o formulário que desenhamos é apenas um container para o desenho do relatório, fazemos o Unload para que ele não fique ocupando memória.

Para executar esse relatório, criamos um formulário simples com um botão e uma caixa de parâmetros que usamos como filtro, e fazemos a chamada do método Config do formulário do relatório, conforme mostra a figura abaixo:
Figura 4 - O formulário de execução
Em seguida, executamos o projeto, e clicamos no botão "Ativar Relatório". Como deixamos as propriedades padrão do ReportMain, onde temos a propriedade Visualizar ligada, o componente irá exibir a tela do visualizador com a execução do relatório. Ao visualizar é mostrada a tela a seguir:
Figura 5 - A visualização do relatório
O componente irá funcionar da seguinte forma:

  • Primeiro todos os objetos da seção de cabeçalho são impressos. 
  • Em seguida, todos os registros do recordset são percorridos, e para cada um, são impressos os objetos da seção de detalhe, buscando o conteúdo de cada atributo do recordset pelo nome que foi colocado na propriedade Campo do ReportField. O componente irá imprimir cada seção de detalhe até que chegue ao final da página. 
  • Quando atingir o final, caso ainda existam registros para imprimir, é iniciada uma nova página e o processo é repetido, até que chegue ao final do recordset, imprimindo a seção de rodapé ao final de cada página.

Assim que terminam os registros do recordset, o visualizador fica em estado de espera para o usuário efetuar as ações. Nesse momento o usuário pode enviar para impressora, salvar o relatório em arquivo, modificar o tamanho de página, ampliar ou reduzir a visualização, enviar o relatório por email, dentre outras funções.
O mecanismo de navegação das páginas é liberado assim que a primeira página é gerada internamente. Assim, quando relatórios mais complexos ou de muitas páginas são gerados, o usuário pode visualizar as páginas já construídas enquanto as restantes são geradas internamente.
Esse é o processo básico. A ideia desse post e dar uma noção básica do mecanismo de forma que possam ser explicadas as outras propriedades, métodos e eventos de cada objeto.

2 comentários:

  1. Já uso o ReportX, versão registrada, para VB6. Gostaria de saber se já existe uma versão para Visual Stúdio 2010/2012

    ResponderExcluir
    Respostas
    1. A versão para plataforma .net está em planejamento, porém ainda não tem uma previsão para sair. Vou usar o blog também para postar as novidades desse projeto. Abs!

      Excluir