Criar relatórios não é uma tarefa simples, muito menos prazerosa! Mas seus “pobremas se acabaram-se”, porque chegou o método revolucionário WebBroker Report Enrolator!

Sim, aprenda a criar relatórios de todos os tipos para Web, utilizando o bom e velho WebBroker.

Muitos tentaram o Rave, outros brigam com o Report Builder, mas como sempre digo, persistência e geração de arquivos na Web não é bom negócio.

Neste pequeno exemplo, teremos uma ideia prática (isto existe?) da criação de relatórios com WebBroker, onde uma velha e respeitada técnica é utilizada. Quem já programou em Clipper vai vibrar, e quem gosta de “descer” o dedo no código, vai pular de alegria. Aos amigos designers (aqueles que adoram desenhar relatórios), aceitem minhas sinceras desculpas por revelar um segredo milenar: programação de relatórios.

Para o nosso projeto, tomemos como base a seguinte estrutura de tabela:

Campo Tipo Tamanho
Cli_id Integer
Cli_Razao Varchar 70
Cli_UF Varchar 02
Cli_Email Varchar 70
Tabela 1. Clientes

A partir do Delphi, selecione as opções File/New/Other..., em seguida a opção Web Server Application.

Na janela seguinte selecione a opção CGI Stand-Alone executable, e marque a opção Cross Platform, para que nossa aplicação possa ser compilada normalmente no Kylix.

Grave a unit com o nome un_relatorio.pas e o projeto como Relatorio.DPR

Insira um objeto do tipo TSQLConnection no WebModule , e através do duplo-clique crie uma nova conexão. Segue um exemplo de conexão Interbase:

Objeto Propriedade Valor
TSQLConnection DriverName Interbase
CommitRetaining True
DataBase localhost:C:/cursoweb/clientes.gdb
SQLDialect 3
LoginPrompt False
Name BancoDados

Repare que estamos utilizando o banco de dados clientes.gdb, criado no Interbase. Insira um objeto do tipo TSQLDataSet e altere as propriedades que seguem:

Objeto Propriedade Valor
TSQLDataSet Name sqlClientes
SQLConnection BancoDados
CommandText select * from tbclientes

Aqui estamos utilizando a tabela tbClientes do objeto BancoDados. Vamos criar algumas variáveis globais na seção var. iLinhas_porPagina, iLinha_atual, iPagina: Integer;

Agora, vamos criar nosso html base para o relatório. Através das opções File/New/Other...,selecione a seção Web Documents e clique na opção HTML Document. Digite o código que segue, e grave o documento com o nome cabeçalho.html

<HTML>
<HEAD>
<TITLE> Relatorio </TITLE>
  <style type="text/css">
    .eject {
      page-break-before: always;
    }
  TH {
    font-family: Arial, Helvetica, sans-serif;
    font-size: 9pt;
    background:#CCCCCC;
  }
    TD {
      font-family: Arial, Helvetica, sans-serif;
      font-size: 9pt;
    }      

  </style>
</HEAD>
<BODY>
  <CENTER>
    <B>Relatório de Clientes - Página <#pagina></B>
    <hr width="90%"> 
  </CENTER>

<TABLE width="90%" align="center">
 <TR>
  <TH width="50%">Razão Social</TH>
  <TH width="50%">E-mail</TH>
</TR>

Retornando ao nosso WebModule, insira um objeto do tipo TPageProducer, alterando as seguintes propriedades:

Razão Social E-mail
Objeto Propriedade Valor
TpageProducer Name
HtmlFile Aponte para o arquivo cabecalho.htm

No evento OnHtmlTag, insira o código que segue:

if TagString='pagina' then
 ReplaceText:=InttoStr(iPagina);

Neste ponto vamos criar nossa Action. Com o duplo-clique no WebModule, crie uma nova Action com as seguintes características:

Objeto Propriedade Valor
Action Name ActImprime
PathInfo /imprime

No evento OnAction, insira o código que segue:

begin
 iLinhas_porPagina:=3;
 iLinha_Atual:=1;
 iPagina:=1;

 // Banco
    BancoDados.Open;
    SqlClientes.Open;

 // Imprime primeiro Cabecalho
    Response.Content:=ppRelatorio.Content;

 with SqlClientes do
 begin
   while not(eof) do
   begin
     Response.Content:=Response.Content+
     '<tr>'+
     ' <td>'+fieldByName('RAZAO_SOCIAL').Value+'</td>'+
     ' <td>'+fieldByName('Email').Value+'</td>'+
     '</tr>';
     inc(iLinha_atual);
     if iLinha_Atual>iLinhas_porPagina then
     begin
      Inc(iPagina);
      iLinha_Atual:=1;
      Response.Content:=Response.Content+
      '</table>'+
      '<P class="eject">'+
      ppRelatorio.Content;
     end;
   Next;
   end;
 end;
end;

Compile e execute no browser: http://localhost/relatorio.exe/imprime

A Figura 1 ilustra nosso relatório em execução.

Relatório
Figura 1. Relatório

A figura 2 ilustra o Preview do nosso relatório, demonstrando as quebras de página.

Preview
Figura 2. Preview

Vejamos o funcionamento do nosso projeto. Primeiro, definimos no documento HTML um estilo para quebra de páginas

<style type="text/css">

.eject {

  page-break-before: always;

}

Repare que no documento HTML, não fechamos a tag . Esse procedimento é disparado em nossa Action, a cada mudança de página.

O código implementado no Delphi é bastante simples, onde temos um controle eficiente de quebra de páginas, baseado numa combinação de “style sheet” e variáveis globais (iLinhas_porPagina, iLinha_Atual e iPagina).

A cada registro, incrementamos a variável iLinha_Atual, e verificamos se a mesma atingiu o limite por página (iLinhas_porPagina). Em caso afirmativo, “ejetamos” a página, e imprimimos novamente o cabeçalho.

Sugiro que sejam criadas duas funções para tratar cabeçalho e rodapé, além de uma função para tratar regras de negócios para os relatórios. Rapidamente você conseguirá criar um engine poderoso para geração de relatórios.