LazReport Tutorial/pt

From Free Pascal wiki
Jump to navigationJump to search

Deutsch (de) English (en) español (es) português (pt)

Relatório

Vamos usar um demo de banco de dados fornecido pelo Delphi (alias DBDEMOS). Você deve criar uma nova aplicação com o formulário principal chamado Form1.

Ponha no formulário os seguintes componentes:

  • TTable:
  • Table1.DataBaseName := DBDEMOS
  • Table1.TableName := ANIMALS.DBF
  • Table1.Active := TRUE
  • TDataSource
  • DataSource1.DataSet := Table1
  • TfrDBDataSet
  • frDbDataSet.DataSource := DataSource1
  • TfrReport
  • TfrDesigner
  • 2 TButton
  • Button1.Caption := ' Editing'
  • Button2.Caption := ' Preview'


O que resulta em:

imagem1.jpg

O LazReport permite associar nomes de variáveis a campos de dados ou valores do sistema, o que possibilita evitar que o usuário final decifre os geralmente pequenos nomes de campos. Em nosso exemplo vamos tentar criar uma variável nos campos BMP e NAME na Tabela1.

imagem2.jpg

Clique em Variables Editor...

imagem3.jpg

Agora clique no botão “Variables” para definir o lado esquerdo desta janela.

imagem4.jpg

Escreva as sentenças conforme indicado na figura acima. Demo Variables representa a categoria e CampoXXXX as variáveis. Para diferenciar as duas, as variáveis começam com um espaço. Então clique em OK para ter o seguinte:

imagem5.jpg

A categoria é disposta na ComboBox de variáveis acima. Cada variável precisa ser associada a um campo. Para isso, selecione a variável e depois o campo. A variável Name Field é associada ao campo Name da Tabela1.

Como para as variáveis, clique com o botão direito do mouse no componente frReport e então em New State. Você abriu o editor:

imagem6.jpg

Talvez você tenha notado um pequeno número de objetos na barra de objetos.

imagem7.jpg

Deve ter visto que os objetos são iguais aos componentes QRLabel, QRMemo, etc, do QuickReport.

imagem8.jpg

Em nosso relatório em branco você deve clicar no tipo de faixa que deseja criar: Selecione o título do estado e clique OK.

Tipo de faixa Uso
Report title Publicado apenas na primeira página
Report summary Publicado apenas na última página
Page header Publicado no topo de cada página
Page footer Publicado no pé de cada página
Master header Publicado no começo do primeiro nível (detalhe/barra)
Master Data Dados do primeiro nível
Master Footer Publicado no final do primeiro nível
Detail header Publicado no começo do segundo nível (barra/detalhe)
Detail Data Dados de segundo nível
Detail Footer Publicado no final do segundo nível
Subdetail Header Publicados no começo do terceiro (barra/detalhes)
Subdetail Data Dados de terceiro nível
Subdetail Footer Publicados no fim do terceiro nível
Overlay
Heading of column Publicado no topo de cada coluna
Column base Publicado no começo do grupo
Heading of group Publicado no topo de cada página
Foot of group Publicado no final do grupo
VarColumn Usado para tabelas cruzadas


Nesta faixa, adicione um retângulo e o dimensione como quiser. Escolha uma cor para o plano de fundo com o botão Baldinho Cheio, então clique duas vezes no retângulo para indicar o título.

imagem9.jpg

Na primeira linha deve ser indicado o título do relatório e na segunda, duas informações do sistema precisam ser adicionados. Eles são obtidos clicando em DB Field e depois em Other na ComboBox. Agora temos:

imagem10.jpg

Vamos inserir a faixa como dados mestre, então clique duas vezes nessa faixa para selecionar frDBDataSet1, a principal fonte de dados do nosso exemplo.

imagem11.jpg

Na metade esquerda da faixa insira um retângulo e dê um duplo clique.

imagem12.jpg

Aqui podem ser colocados vários campos, mas pode ser mantido um retângulo para um único campo a fim de aplicar formatos, por exemplo. A primeira linha Name [Field Name] é obtida escrevendo-se Name e então, com o botão Variable, inserindo a variável [Field Name] (poderíamos ter escrito isto diretamente). Para a segunda linha, Size[[Table1, “SIZE”]*2.54], nós escrevemos Size e com o botão DB Field escolhemos o tamanho do campo de Table1 e para converter este campo, expresso em polegadas, para centímetros, multiplicamos este campo por 2.54. Pode-se ver o poder do fastreport. Com apenas um retângulo coloca-se em nosso estado, a segunda nomeação, dois campos, incluindo um calculado. Agora no lado direito da faixa selecione uma imagem. Para mostrar sempre a mesma figura, seria suficiente dar um duplo clique nessa figura e carregar a figura desejada. Nós queremos uma figura associada com o pressionamento da tecla F11, para mostrar o Inspetor de Objetos.

imagem13.jpg

Informe a propriedade do Memo com a propriedade [ImageField]. Isso transforma a figura em um objeto associado com o campo de dados. O nosso primeiro estado está concluído. Deve ser gravado com o mesmo nome rapff. Um clique na pré-visualizaçao nos dá:

imagem14.jpg

Agora vamos escrever o código necessário para carregar e visualizar ou editar o nosso relaltório rap1frf. Para isto adicione ao projeto o seguinte código:

TForm1.Button2Click(Sender procedure: TObject);  
begin 
  frReport1.LoadFromFile(' rap1.frf');  
  FrReport1.ShowReport;  
end;
TForm1.ButtonClick(Sender procedure: TObject);  
begin 
  frReport1.LoadFromFile(' rap1.frf');  
  frReport1.DesignReport;  
end; 

Você tem uma edição com pré-visualização que dá a possibilidade de os usuários finais modificarem o relatório sem precisar modificar a aplicação básica.

Agora vamos adicionar funcionalidades ao nosso exemplo básico. Você deve adicionar um componente TButton com a propriedade Caption := ‘Print’; e um TPrintDialog. Obtemos isso:


imagem15.jpg

Adicione também as unidades de impressora na cláusula uses do seu formulário e ponha o seguinte código no evento OnClick do botão Print:

TForm1.bPrintClick(Sender procedure: TObject);  
var
   FromPg, ToPg, Cpy: Integer;  
   ind: Integer;  
   St: String;  
   Collap: Boolean;  
begin 
    / / Carregar o estado
   St:=ExtractFilePath(ParamStr(0));  
   frReport1.LoadFromFile(St+' rap1.frf');  
   / / Mudando a impressora padrão
   ind: = Printer.PrinterIndex;  
   / / Preparar o estado; para sair se a preparação não  funcionar
   if not frReport1.PrepareReport then Exit;  
   / / inicializa a limpeza do diálogo para edição de parâmetros
  with PrintDialog1 C 
  begin 
       Options:=[poPageNums ]; / / autoriza a seleção de páginas
       Copies: = 1;           / / apenas uma espécie
       Collate: = True;     / / cópias ordenadas
       FromPage: = 1;     / / página do começo
       ToPage: = frReport1.EMFPages.Count;  //  última página
      MaxPage: = frReport1.EMFPages.Count; / / número máximo de página
       if Execute then    / /    limpeza do diálogo   
       begin 
            if (Printer.PrinterIndex < > ind )/ / a impressora mudou?   
               or frReport1.CanRebuild / / possui uma regeneração de estado? 
               // mudança de impressora   
               or frReport1.ChangePrinter(ind, Printer.PrinterIndex) then                
               frReport1.PrepareReport  
            else Exit; / / a mudança de impressora ocorreu de forma errônea 
     if PrintDialog1.PrintRange = prPageNums then / / fez-se uma seleção de páginas
     begin 
          FromPg : = PrintDialog1.FromPage; / / primeira página
          ToPg : = PrintDialog1.ToPage;      / / última  
     end; 
          Cpy :=PrintDialog1.Copies;   / / número de cópias           
         Collap :=PrintDialog1.Collate;  / / exemplares ordenados   
     // recorte de edição da página FromPg com ToPg  , " Cpy " 
     // exemplares ordenados  (Collap))  
frReport1.PrintPreparedReport(FromPg, ToPg, Cpy, Collap);  
    end; 
  end; 
end;

É um pouco longo mas nada impede que você crie uma classe herdada do TfrReport com um método de impressão ou, mais fácil, crie um procedimento PrintReport(letat: string) que carregue o relatório e o imprima.

No menu Edit File > Page Options você obtém isso:

imagem24.jpg

Para escolher o tamanho do papel

imagem16.jpg

Para escolher as margens

imagem17.jpg

Para especificar o número de colunas e o espaço entre as colunas.

No menu principal do editor, selecione File > Report options para mostrar a seguinte caixa de diálogo:

imagem18.jpg

Aqui você especifica a impressora necessária para o carregamento de estados e se a preparação é feita em duas formas.

Se você quer numerar suas páginas com a página atual a partir do número total de páginas, você deve escolher a opção Two-pass Report.

Aqui serão adicionadas ao nosso exemplo algumas variáveis não relacionadas aos dados. Elas tornarão possível, por exemplo, mostrar as diferentes nomeações de acordo com o contexto. Para isso, abra o editor de relatórios e selecione o menu File e a Lista de Variáveis. Com uma variável Test, como explicado anteriormente, a única diferença é que você não vai selecionar um campo de valor, mas deixar None (o valor padrão). Publique um dos objetos e adicione a variável Test como visto anteriormente. Retorne ao Delphi (não esquecer de salvar seu relatório) e publique o evento OnGetValue do componente FrRepor1 adicionando o seguinte código:

procedure TForm1.frReport1GetValue(const ParName: String;  
var ParValue: Varying; VAr fld: TField);  
begin 
 // trata o caso de variáveis não dependentes
 if UpperCase(ParName)=' TEST' then 
    ParValue:=' Answer: Variable " test1 " ';  
end;

Ou também é possível passar o valor diretamente para a variável através do seguinte código:

 procedure TForm1.Button1Click(Sender:TObject);
 begin
   frReport1.Values.FindVariable('test').Field := QuotedStr('test1');
   frReport1.ShowReport;
 end;


Isto não é usado para os dados, mas para permitir formatar os dados com DisplayFormat. Agora vamos ver como criar uma variável calculada. Como antes, vamos criar uma nova categoria (opcional) e uma variável. Test Calculation. Selecione uma nova variável e escolha um valor da ComboBox " Other " e " Expression ". Essa seleção ativa a área de dados de entrada Expression. Escreva o seguinte: [Table1."SIZE"] + [Table1."WEIGHT"] . Dessa forma você obterá o sumário dos campos de dados Size e Weight. Você também pode colocar nome nas variáveis. E pode utilizar os seguintes operadores:

Tipos de Operadores Operadores
Logic >, <, BUT, AND, NOT, =, < >, > =, < =
Mathematics -, *, +, MOD, /

Mais à frente você poderá dispor dos seguintes funções padronizadas:

Função Descrição Exemplos
SUM Soma
AVG Média
MIN Mínimo
MAX Máximo
FORMATDATETIME Data e hora formatadas
FORMATFLOAT Ponto flutuante formatado
LOWERCASE Letras minúsculas
NAMECASE Primeira maiúscula
STRTODATE Data para string
STRTOTIME Hora para string
UPPERCASE Letras maiúsculas

Se não for suficiente você pode criar suas próprias funções, mas isso nós veremos mais adiante.

Agora vamos definir um formato para as variáveis de uma área. Um formato é válido para todas as variáveis de uma área de display. Para mostrar o editor de formatos, clique com o botão direito em uma área e então em Variable Format.

imagem19.jpg

A primeira ComboBox indica o tipo de dado (texto, numérico, data, hora, lógico). A segunda permite selecionar o formato preestabelecido. O tipo Text não permite qualquer formatação e o tipo Number requer um número decimal com vírgula. A não ser para os tipos Text e Logic, você pode usar as funções de formatação do Delphi. Você pode incluir também o conceito de highlighting, que é muito útil para enfatizar dados. Você pode especificar uma condição para aplicar o highlighting. Para isso use a palavra-chave Value para indicar o valor da variável. Aqui é requisitado o highlighting para todos os valores maiores que 1000. Por padrão o highlighter é um simples negrito sobre fundo branco. Você pode definir esses parâmetros para uma área clicando no botão Realce.

imagem20.jpg

Então você pode definir a cor do plano de fundo, o estilo e a cor da fonte a ser usada selecionando Intesified brightness.

Funções

É necessário adicionar ao arquivo FR.lng a linha seguinte:

FCT = CATEGORY | FCT(<X>, <Y>, <Z >) | Help on the function

onde: FCT é o nome da função. CATEGORY, é o nome da categoria. FCT(<X>, <Y>, <Z >), é a visualização dos parâmetros necessários, com no máximo 3 parâmetros. Help., é uma pequena Ajuda que deve tornar possívell ao usuário entender o objetivo da função. | é um separador. Cada parâmetro é separado por vírgula e pode ser uma expressão, uma constante, uma variável, um campo ou dados. As constantes de tipo alfanumérico devem ser limitadas por um caractere. As variáveir são limitadas por and. Os campos de dados são limitados como as variáveis e tem o seguinte formato:

Dataset_Name. "Field_Name"

Funções Estatísticas:

SUM(<X >)
. Retorna a soma dos valores dados por <X>, que é geralmente um campo de dados.
AVG(<X >)
Retorna a média dos valores dados por <X>.
COUNT
Meter.
MIN(<X >)
Retorna o valor mínimo dos valores dados em <X>.
MAX(<X >)
Retorna o valor máximo dos valores dados em <X >.

Funções nos dados:

FORMATDATETIME(<X>, <Y >)
Retorna os dados abreviados em (TDateTime) < Y > no formato < X >. < X > usa a descrição padrão Lazarus para formatos.
FORMATFLOAT(<X>, <Y >)
Retorna o numeral < Y > no formato < X >. < X > usa o padrão de descrição Lazarus para formatos.
STRTODATE(<X >)
Retorna a repesentação (TdateTime) da string < X >. < X > deve respeitar o formato de dados
STRTOTIME(<X >)
Retorna A representação digital (TDateTime) da string < X >. < X > deve respeitar o formato de horas.

Funções nos caracteres de conexão:

LOWERCASE(<X >)
Retorna a string <X> em letras minúsculas.
UPPERCASE(<X >)
Retorna a string <X> em maiúsculas.
NAMECASE(<X >)
Retorna a string <X> com a primeira letra maiúscula.
COPY(<X>, <Y>, <Z >)
Retorna a string <X> na posição < Y > e comprimento< Z >.

Funções nos numerais:

FRAC(<X >)
Retorna a parte decimal do número < X >.
INT(<X >)
Retorna a parte inteira do número < X >.
ROUND(<X >)
Retorna o número inteiro correspondente ao arredondamento de < X >.
STR(<X >)
Retorna a string correspondente de um número < X >.

Funções Lógicas:

IF(<X>, <Y>, <Z >)
Retorna < Y > se a expresssão < X > é verdadeira, se falsa retorna < Z >.

Para adicionar suas próprias funções é realmente muito simples. Aqui um código-fonte para adicionar as funções POS e SQRT:

Unit FR_OGFct;
interface 
implementation 
uses FR_Pars, FR_Class; / / Declaração-padrão
type 
 //Declaração de TBrOGFunctionLibrary 
TfrOGFunctionLibrary = class(TfrFunctionLibrary)
 public  
  constructor Create; override;  
  procedure DoFunction(FNo:integer procedure;  p1, p2,
             p3:Variant; var valley:string); override;  
             p3:Variant; var valley:string);
 end;  
//************************** / / * TfrOGFunctionLibrary 
constructor TfrOGFunctionLibrary.Create;
begin  
 inherited Create;  
 with List do 
 begin
  Add('POS');
  ADD('SQRT');
 end;
end;
Procedure TfrOGFunctionLibrary.DoFunction(FNo:Integer procedure;  p1,
p2, p3:Variant; Var valley:String);
VAr Par1, Par2:  Varying;
  Result:  Variantying;
begin
Try
 Case FNo of  //FNo é um íindice das funções declaradas no constructor  
  0 : Begin   //função POS 
        Par1:=VarToStr(Parser.Calc(p1)); 
        Par2:=VarToStr(Parser.Calc(P2)); 
        Resultat:=Pos(Par1,Par2);
      end;
   1 : Resultat:=SQRT(Parser.Calc(P1));  //função SQRT
  end;
 Except   
  // String resultante se der erro   
  Resultat:='Erreur fonction '+List.Strings[FNo];
 end;
 Val:=VarToStr(Resultat); // String  resultante
end;
Procedure DoInit;
begin
 frRegisterFunctionLibrary(TfrOGFunctionLibrary);
end;

No arquivo FR.lng, anexe as seguintes linhas:

SQRT = Matemática e Trigonometria | SQRT(<X>) |Retorna a raiz quadrada de <X>
POS = Strings | POS(<X>,<Y>) Retorna a posição da string <X> em <Y>

Publique um estado, então em File>List esta janela aparecerá:

imagem21.jpg

Você pode notar o aparecimento de um pequeno botão (...), ativo somente se for o caso de uma expressão. Clique para abrir o editor abaixo:

imagem22.jpg

Você pode notar a semelhança. Se clicar no botão Add você vai carregar o editor de parâmetros:

imagem23.jpg

De acordo com o número de parâmetros, você terá mais ou menos zonas de edição. O botão (...) torna possível abrir o gerador de expressões para informar o parâmetro.


tradução: Ana Carolina Simplicio de Oliveira

See also