LazReport Tutorial/pt
(This is a free documentation and can be freely copied. No copyright.)
(em constução)
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:
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.
Clique em Variables Editor...
Agora clique no botão “Variables” para definir o lado esquerdo desta janela.
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:
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:
Talvez você tenha notado um pequeno número de objetos na barra de objetos.
Deve ter visto que os objetos são iguais aos componentes QRLabel, QRMemo, etc, do QuickReport.
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 | Aqui seguem diferentes tipos de tapes |
---|---|
Título do Relatório | Publicado apenas na primeira página |
Sumário de Relatório | Publicado apenas na última página |
Cabeçalho de Página | Publicado no topo de cada página |
Pé de Página | Publicado no pé de cada página |
Leitor Mestre | Publicado no começo do primeiro nível (detalhe/barra) |
Dados Mestre | Dados do primeiro nível |
Pé de Página Mestre | Publicado no final do primeiro nível |
Leitor de Detalhes | Publicado no começo do segundo nível (barra/detalhe) |
Dados de Detalhes | Dados de segundo nível |
Pé de Página de Detalhes | Publicado no final do segundo nível |
Leitor de Sub-detalhes | Publicados no começo do terceiro (barra/detalhes) |
Dados de Sub-detalhes | Dados de terceiro nível |
Pé de Página de Sub-detalhes | Publicados no fim do terceiro nível |
Subcamada | |
Cabeça de coluna | Publicado no topo de cada coluna |
Cabeçalho de Grupo | Publicado no começo do grupo |
Cabeçalho de Página | Publicado no topo de cada página |
Roapé de Grupo | 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.
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:
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.
Na metade esquerda da faixa insira um retângulo e dê um duplo clique.
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.
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á:
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:
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? or frReport1.ChangePrinter(ind, Printer.PrinterIndex) then / / mudança de impressora 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, criar um procedimento PrintReport(letat: string) que carregue o relatório e o imprima.
No menu Edit File > Page Options você obtém isso:
Para escolher o tamanho do papel
Para escolher as margens
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:
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;
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 Peso. Você também pode colocar nome nas variáveis. E pode utilizar os seguintes operadores:
NOT, =, < >, > =, < =
Mais à frente você pode dispor dos seguintes padrões de funções:
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 á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.