FastReport no Delphi


FastReport é um gerador de relatórios que esta desde da versão Delphi 4, nas versões XE2 e superior ele passou a ser a ferramenta de relatório "integrado". Com o FastReport pode ser criado relatório do mais simples ao mais complexo nas aplicações Win32 e FireMonkey com Delphi. O manual de utilização https://www.fast-report.com/public_download/docs/vcl/FR6/HTML_EN/index.html

Para fazer um relatório simples basta utilizar dois componentes básicos o frxReport e o frxDBDataSet. O frxReport  é o editor de relatórios,  com um duplo clique em cima dele podemos criar o nosso relatório. Já o frxDBDataSet faz a conexão com o nossos dados pela propriedade DataSet.
Conhecendo a ferramenta

O FastReport possui suporte "adquirido separadamente":
mvc, asp.net, Mono (Windows, Linux, Mac OS X) FMX 2 e Lazarus.
Contem uma ferramenta chamada FastCube para análise de dados e construção de relatórios e gráficos, FastScript gerador de scripts que funciona em várias linguagens e plataformas, o FastQueryBuilder construtor de consultas SQL.
Para informações mais atualizadas dos produtos tem o site https://www.fast-report.com/pt/product/.

Vamos conhecer a ferramenta e criar um relatório simples da utilização do FastRepost.

1 - Barra de menus;
2 - Report page tabs: abas para configuração da página do relatório;
3 - Régua;
4 - Barra de ferramentas do objeto: objetos que podem ser adicionados ao relatório;
5 - Report tree: janela onde podemos visualizar as bandas e objetos inseridos no relatório;
6 - Barra de ferramentas do objeto: objetos que podem ser adicionados ao relatório;
7 - Object Inspector: janela para definição das propriedades dos objetos do relatório;
8 - Report designer: local onde vamos adicionar as bandas e os objetos para o relatório;
9 - Data tree: janela com os objetos de dados do relatório. Podemos arrastar facilmente um campo para o relatório;
10 - Status line: semelhante a uma barra de status, com informações sobre o objeto selecionado no relatório.

Primeiro exemplo

Agora vamos iniciar um projeto no Delphi, em um TForm e adicione um frxDBDataSet e um frxReport. Crie uma conexão com o banco de dados de sua preferencia (usarei TClientDataSet para ser compatíveis com vocês). 

Vamos vincular o frxDBDataSet com o DataSet (No meu caso o TClientDataSet). Depois dê um duplo clique no frxReport para abrir o editor. Agora vamos criar um novo relatório em menu (File > New Report) apos isso adicionar o DataSet no relatório em Menu (Report > Data) e marque a tabela.


Por padrão sempre vem adicionado estas bandas ReportTitle1, MasterData1 e PageFooter1 e para adicionar alguma outra banda é em barra de ferramentas de objetos >> Insert Band

Adicione os tipos: Page Header, já que o PageFooter1 e Master Data já estão adicionado. O Master Data, Para adicionar um DataSet no MasterData de dois cliques na (Tarja laranja) e selecione a Tabela. 

Existem duas maneiras de adicionar os campos na banda Master Data para exibir os dados.
Arraste os campos da janela Data tree para o relatório. Note que após inserir os campos, ao passar o mouse, é mostrado uma seta, onde podemos clicar e será exibido um menu com os campos do DataSet, assim fica fácil modificar o objeto para outro campo da consulta.

Outra forma é adicionar o campo Text object da barra de ferramentas. Será aberto um editor com alguns botões.

No editor, temos abas onde vamos configurar o formato do campo, formatações de fonte etc. o primeiro botão da aba Text, acessa outro editor, onde podemos escolher os campos da consulta, variáveis do relatório, funções, etc.


Podemos usar o editor do Text Object ( O "A" vermelho ao lado) para adicionar os títulos as nossas colunas do relatório, onde basta digitar o texto na parte Text dando dois cliques no campo.

Note que ao adicionarmos um Text Object ou mesmo adicionar um campo usando a janela Data tree, existem linhas que nos auxiliam para que os controles fiquem alinhados tanto horizontalmente, como verticalmente.

No delphi na tela onde contem os componentes colocar um botão (BtnVisualizar)  e em seu OnClique c colocar o código abaixo.

procedure TFSistema.BtnVisualizarClick(Sender: TObject);
begin
  frxReport.ShowReport;
end;

Ao clicar no botão, temos a visualização do nosso primeiro relatório em fastRepost.

Formatação de objetos

Como podemos ver no relatório que criamos, o campo VALOR_VENDA, esta como texto, sem a devida formatação. Para ajustar isso, abra o relatório e dê um duplo clique no campo. No editor, acesse a aba Format e configure, onde indicamos o tipo de formatação e o separador decimal (vírgula) do formato.

Para visualizar podemos fazer por dois jeitos, pelo botão BtnVisualizar que criamos antes ou clicamos duas vezes no frxReport e clicando no F9. E se precisássemos modificar a formatação de um objeto (fonte, cor etc) de acordo com algum parâmetro que existisse, como faríamos? É bastante simples. 

De um duplo clique para acessar o editor e a aba Highlight. Na opção Condition, digite: “<frxDBDataset."VALOR_VENDA"> > 100”. Marque em Font a opção Bold. O botão Color, indica a cor do texto quando a condição do objeto for verdadeira.
Você também pode usar o botão para acessar o editor de expressões para montar a mesma manualmente. De acordo com o configurado antes, o campo "VALOR_VENDA" do relatório deve aparecer em vermelho quando o valor desde for maior que 100,00.



Formatação condicional do relatório

Caso você deseje mudar a formatação de todo “a linha”, para que não precise fazer manualmente a configuração de cada objeto, basta selecionar todos os objetos e acessar a propriedade HighLight>Condition e fazer a mesma configuração anterior.
Outra formatação bastante usada é a de indicar a quantidade de páginas e a página atual do relatório. O FastReport possui variáveis que retornam essas informações e que são fáceis de serem utilizadas. 
Acesse a aba Variables do Data tree e arraste para o formulário um Date e um TotalPages. Para customizar esses variáveis, basta dar um duplo clique e digitar o texto que deseja.


Arquivos de relatórios

Cada relatório é um arquivo da extensão ".FR3". Salve o arquivo com o nome de "teste.fr3" e coloque o código abaixo em um botão.:
procedure TFSistema.BtnVisualizarClick(Sender: TObject);
begin
  frxReport.LoadFromFile('teste.fr3');
  frxReport.ShowReport();
end;

Obs: Caso não encontre o arquivo ".fr3", nenhum erro é mostrado, apenas apresenta uma tela cinza.

Temos uma função LoadFromFile para carregar o arquivo de relatório no frxReport. Com isso podemos carregar os arquivos ".fr3", se não encontrar nos retorna falso! Pode ser utilizado desta forma.
procedure TFSistema.BtnVisualizarClick(Sender: TObject);
begin
  if frxReport.LoadFromFile('teste.fr3') then
    frxReport.ShowReport()
  else
    ShowMessage('Não encontrado o arquivo do relatório!');
end;

Agrupamento

Vamos fazer a mesma listagem anterior, com a diferença que vamos retornar todos os produtos, agrupados pela sua unidade de medida.
Vamos criar um novo relatório (File > New report) Não esqueça de marcar o Data do relatório, no MasterData vincule com sua tabela de conexão de banco (Em meu caso o CDS). Adicione uma banda GroupHeader. Vamos indicar que o agrupamento se dará pelo campo UNIDADE. Podemos ainda indicar uma expressão para o agrupamento.Nas opções de agrupamento, podemos configurar para que a cada grupo, seja mostrado em uma nova página ou drill-down, onde clicamos sobre o grupo para mostrar os dados.

Obs: caso você escolha a opção drill-down ao executar o relatório, apenas os grupos serão mostrados. É necessário clicar em cima do mesmo para exibir os registros.

Obs: O SQL que vai para o relatório tem que estar ordenado pelo campo que esta sendo agrupado, em nosso caso pela unidade de medida.




Somatórios

Quando utilizamos o agrupamento em relatório temos a opção de contar a quantidade de registros que estão agrupados ou uma soma no valor total que esta no agrupamento.
Vamos fazer um exemplo: Adicione uma banda GroupFooter, dois "Text Object" e acesse o botão "Insert Aggregate" da aba Text. No editor, vamos configurar um campo que terá seu valor somado, que no caso é "VALOR_VENDA".


Configurando o somatório do grupo

Faça a formatação no campo, semelhante ao campo "Valor_Venda". Rode o relatório e note que temos o somatório por grupo, e se quisermos um "total geral" no final do relatório? Basta adicionar uma banda Footer1 e fazer a mesmo processo de adicionar os campo ir para parte de aggregate e em seguida em formatação.

Insert Aggregate 

 

Obs: temos uma opção bem interessante na configuração do somatório. Caso precisássemos mostrar um somatório acumulado por grupos, basta marcar a opção Running total na janela Insert Agreggate. Assim, a cada final de grupo, teríamos um somatório acumulado.

Master/detail

Outro caso muito comum e de mostrar os dados master e os details. Exemplo clássico: Vendas, dados do comprador podemos considerar no master, e os produtos da venda, são o Detail.

Adicione um DataSource e faça a ligação com a consulta master. No componente (ClientDataSet, Query, Table etc) com os dados da consulta detail, acesse a propriedade MasterSource e escolha o DataSet anterior. Em MasterFields, acesse o editor e configure o campo de relacionamento (nesse caso CODIGO).

Precisam ter um relacionamento entre as duas tabelas. Primeiro, teremos duas consultas separadas, uma para a master e outra para detail. Nesse exemplo, estou pesquisando os Produtos e as matérias primas. Precisaremos, portanto de dois frxDBDataSet (um para cada consulta). E adicionar a nova tabela em "Data" menu (Report > Data)

Crie um novo relatório (File > New Report). Salve com o nome de Detail.fr3 e adicione as seguintes bandas: Header1, MasterData, DetailData e Footer1. Na MasterData você deve configurar o frxDBDataSet que tem os dados dos "Produtos" e consequentemente, para o DetailData os dados das "materias primas". E na MasterData marcar a propriedade "PrintFDetailEmpty = True" para mesmo que não houver "matérias primas" apresentar a linha com os "produtos".

Crie um novo botão no delphi com o código abaixo.
procedure TFSistema.BtnDetailClick(Sender: TObject);
begin
  if frxReport.LoadFromFile('Detail.fr3') then
    frxReport.ShowReport()
  else
    ShowMessage('Não encontrado o arquivo do relatório!');
end;
Execute o relatório e veja que os dados estão agrupados de acordo com o nome do produto.

Exportação de relatórios do FastReport

FastReport tem uma quantidade grande de tipos de exportações. 


Para fazer uma exportação e bem simples, vamos fazer o exemplo para exportar para .pdf, basta adicionar no formulário um frxPDFExport. Executo o projeto e note que um botão foi adicionado para exportar o relatório. Para adicionar outras formas basta apenas adicionar os componentes no formulário.

Enviar e-mail no FastReport

Na versão comercial do FastReport, diferente da versão que acompanha o Delphi, existe a opção de envio do relatório por e-mail. Ao clicar no componente, um editor será mostrado. Nele, na aba E-mail configuramos para quem o relatório será enviado, assunto, corpo do e-mail e escolhendo o formato desejado.
Na aba Account, configuramos o e-mail de envio, ou seja, as nossas configurações de e-mail para o envio do mesmo.


Então vimos como trabalhar com o FastReport de uma forma básica e rápida. Com o FastReport existem muitas outras possibilidades para criarmos relatórios desdo básico ao relatório mais complexo para suas aplicações Delphi, assim.

Exemplo: Download do exemplo

86 comentários:

  1. Bom dia!

    Como posso criar um preview personalizado tal como é possível no QuickReport?

    ResponderExcluir
    Respostas
    1. Dentro dos componentes do frx ha uma tela com o nome de frxPreview é essa tela que faz a impressão e visualização acredito que queira personalizar com essa tela tem tudo que precisa para começar.

      Excluir
  2. Não, ele quer customizar o formulário de pré-visualização.

    ResponderExcluir
  3. Obrigado pela tentativa. Eu acredito que a solução está no Preview tal como existe no QuickReport e se não me engano o frxPreview.

    ResponderExcluir
  4. Gente tenho mais uma duvida, mas está é muito difícil de resolver. Existe uma situação que preciso desenhar no band, que preciso fazer ao terminar a impressão na ultima linha da pagina que ele desenhe a linha e para isso preciso saber quando termina o grupo na página. Lembrando que não é uma única página a ser impressa e isto pode ocorrer nas paginas seguintes.

    Ou seja precisaria saber quando uma linha chegou ao final da pagina e quando ela inicia na outra.

    ResponderExcluir
    Respostas
    1. Precisa disso para fazer oque?
      Você pode mapear a pagina ver quantas vezes pode ser impressa a band e com isso sabera quando chegará no fim da pagina, e que seja um contador que reinicie a cada pagina e com isso sabe q é o inicio. erra isso ou so enrolei passa um exemplo de como quer?

      Excluir
  5. Como posso adicionar os campos em tempo de execução?

    ResponderExcluir
  6. Bom dia!

    Estou tendo um problema na somatório dos agrupamentos, onde, no meu relatório eu agrupo vendas por fornecedor e depois do grupo somo os valores das vendas, porém, esta soma não esta se dividindo por grupo, tipo, tenho o primeiro fornecedor com uma venda de R$ 10, no campo agrregate ele aparece 10 normal, no segundo grupo (segundo fornecedor ) tem duas vendas de 10 cada, na somatório deveria aparecer 20, porém, ele esta somando também o valor do grupo anterior, onde, fica na somatório o valor de R$ 30. No campo aggregate marquei a opção running total para somar cada grupo. Alguém sabe me dizer em que ponto posso ter errado? caso precise de alguma informação pode perguntar

    ResponderExcluir
  7. Ana Paula, já consegui solucionar, para somar normalmente os valores dos itens apresentados no groupHeader, só tive que alterar o ultimo parâmetro do aggregate SUM de 2 para 1, depois passou à funcionar normalmente.

    ResponderExcluir
  8. Olá, estou fazendo um relatório com um campo (do próprio banco) anotações, porém dependendo do tamanho dessa anotação fica um espaço enorme entre um dado e o outro. Tem como deixar a altura automatica, para que fique do tamanho de cada anotação?

    ResponderExcluir
    Respostas
    1. Sim. Coloca a propriedade "StretchMode" dos campos "smMaxHeight" para poder se expandir de acordo com o conteúdo, e na banda que esse campo estiver marque a propriedade "Stretchd" para "True" para ela poder crescer junto com o campo.

      Excluir
  9. Olá, parabéns, esse artigo me ajudou MUITO, mas ainda tenho uma dúvida: Preciso que meu relatório apresente:

    Nome (tabela cliente), nacionalidade (tabela país), Logradouro (tabela logradouro), Cidade (tabela cidade), UF (tabela Estado) etc, sendo esses clientes dentro de uma outra tabela (item cliente).

    Exemplo: João, brasileiro, portador do CPF 0, RG 0, residente na Rua X, no Município Y, Estado de Z. Ou seja, informações de várias tabelas e na mesma linha.

    Pode me ajudar?

    ResponderExcluir
    Respostas
    1. faz um SQL com o conteúdo que quer enviar e joga em uma tabela exemplo

      select CL.NOME_CLIENTE, CI.CIDADE, U.UF, CL.CPF, CL.RG, P.NASCIONALIDADE
      from CLIENTES CL
      inner join CIDADES CI on CI.CODIGO_CIDADE = CL.CODIGO_CIDADE
      inner join PAIS P on P.CODIGO_PAIS = CL.CODIGO_PAIS
      inner join ESTADOS U on U.CODIGO_ESTADO = CI.CODIGO_ESTADO
      where CL.CODIGO_CLIENTE Is not null + Filtros se houver

      Com isso fica em uma única tabela se existir muitos registos de Nacionalidade e Cidade repetidos você pode criar um agrupar por esse conteúdo no relatório, se for agrupar por algo lembre de ordenar por o que esta agrupando para não aparecer registos duplicados
      Espero ter ajudado qualquer coisa posta aii

      Excluir
  10. select CL.NOME_CLIENTE,
    (SELECT CI.CIDADE FROM CIDADES WHERE CI.CODIGO=CL.CODIGO_CIDADE) AS CIDADE,
    (SELECT U.UF FROM ESTADOS WHERE U.CODIGO_ESTADO = CI.CODIGO_ESTADO FROM CIDADES) AS ESTADO,
    (SELECT P.NASCIONALIDADE FROM PAIS WHERE P.CODIGO_PAIS =CL.CODIGO_PAIS) AS NACIONALIDADE,
    U.UF, CL.CPF, CL.RG
    from CLIENTES CL
    where CL.CODIGO_CLIENTE Is not null + Filtros se houver

    ResponderExcluir
    Respostas
    1. Como sub select dentro de um select o processo do banco de dados fica um pouco mais lento dependo da consulta!

      Excluir
  11. Ana.. Estou com um problema aqui no meu relatorio. Uso o Delphi Xe7 Juntamente com o FRXReport para visualizar meus Relatórios. Tenho o campo Total declarado no banco de dados (Firebird) como VarChar. Faço o seguinte código no Insert Agreggate do Relatório [SUM()] invés dele fazer a soma dos campos ele apenas ajunta. Ex: Total1 36 Total2 36. Ele junta 3636. E não soma. Se poder me ajudar quanto a isto.

    ResponderExcluir
    Respostas
    1. Com o campo varchar não vai funcionar o "Agreggate" teria de ser um campo com formato de valor. Você pode criar um campo "InternalCalc" e jogar o valor para ele e usar o "Agreggate" com esse campo. Isso resolveria? Comenta ai

      Excluir
  12. Boa noite, estou com uma duvida. Tenho duas tabelas, cliente e ordem, sendo que na ordem existe apenas o código do cliente e o nome.
    Preciso que o relatório puxe os dados que estão na tabela ordem e com base no código do cliente puxe as informações do cliente da tabela cliente.
    Sem querer abusar, mas já abusando, pode me dar um passo a passo de como fazer isso? Sou completamente cru e estou pesquisando já a vários dias em busca de uma solução.
    Obrigado.

    ResponderExcluir
    Respostas
    1. Não há como fazer um SQL juntando as duas tabelas? Nesse link tem um exemplo de como normalmente utiliza quando tem duas tabelas(Num exemplo como o seu, mas há diversas formas de fazê-la) e preciso exibi-la
      http://www.4shared.com/rar/jpX5fHA2ba/000026.html?

      Excluir
  13. Para distribuir o aplicativo os arquivos .fr3 devem ir junto com o executável? Existe possibilidade de incorporar os relatórios no executável como em outras ferramentas?

    ResponderExcluir
    Respostas
    1. Da forma tradicional tem que ser enviado junto ao executável sim.
      Já vi sucessos em coloca-los dentro do banco de dados.
      Ou deixa fixo no arquivo "frxReport" como isso não precisaria enviar junto mas também teria de ter um para cada arquivo fr3 (Não muito vantajoso acredito)

      Excluir
    2. Você teria um exemplo de como colocá-los no banco de dados como citado?

      Excluir
    3. Tem um exemplo utilizando um TClientDataSet que é só substituir por um componente vinculado a banco de dados
      No final da esplicação tem um link para doawnload, Qualquer duvida e só postar aqui
      http://anaprogramadorajunior.blogspot.com.br/2015/12/criar-etiqueta-no-fastreport.html

      Excluir
  14. Ola, estou elaborando um relatório para impressão de etiquetas no fast, mas gostaria de adicionar uma opção em que o usuário mude os campos e edite a ordem em tempo de execução.
    tem alguma dica de como modificar o relatório em tempo de execuão?

    ResponderExcluir
    Respostas
    1. Que eu saiba não há como ordenar dentro do fast. Por que não coloca o campo para ordenar antes de exibir o fast direto no SQL?

      Excluir
  15. Ola, estou elaborando um relatório para impressão de etiquetas no fast, mas gostaria de adicionar uma opção em que o usuário mude os campos e edite a ordem em tempo de execução.
    tem alguma dica de como modificar o relatório em tempo de execuão?

    ResponderExcluir
    Respostas
    1. Crie um campo de ordenação “ORDER” e deixando editável para o usuário a alteração do mesmo e na hora de fazer o comando de impressão faça a ordenação do mesmo. Só lembre de fazer o controle para o mesmo não poder se repetir.

      Excluir
  16. - Estoque fazendo um relatório de etiquetas para argox, sendo que
    quando imprime, salta uma etiqueta, quero passar para o fastreport
    mas ainda estou usando o delphi 7, apesar que no meu delphi 7 tem
    o fastreport;
    - Será que alguem pode me ajudar???

    Desde já agradeço a todos....

    ResponderExcluir
    Respostas
    1. Como assim saltar uma etiqueta? Fazer a impressão de uma etiqueta em branco?

      Excluir
  17. esse salto voce configura nas configurações de estoque da ARGOX
    ou configuração de paginas no fast

    ResponderExcluir
    Respostas
    1. Normalmente faço esse controle no fast ou até mesmo no delphi enviando com um descrição em branco e quando é branco fica o quadradinho da etiqueta em branco.

      Excluir
  18. Pessoal, estou montando um relatório, onde o usuário irá selecionar o cliente em um dbgrid, então através de botão, irá imprimir os dados somente daquele cliente (via query). Alguém pode me ajudar?

    ResponderExcluir
  19. Parabéns pelo artigo Ana. Gostaria de uma ajuda, preciso ordenar o dataset do delphi de dentro do fastreport, tem como ? Estou usando uma dialogpage do fast onde o usuário escolhe ordenar o relatório por código ou descrição.

    ResponderExcluir
    Respostas
    1. Que eu saiba não tem como ordenar dentro do fast. Mas vou pesquisar se tiver como coloco mais um comentário aqui.

      Excluir
    2. obrigado Ana,

      Att.
      Stéfano

      Excluir
  20. Prezada Ana,
    Estou saindo do Rave indo para o Fast. Tenho uma duvida, criei variáveis no relatório e se eu passo numero, tudo ok, agora se passo string da erro! Poderia me dar uma ajuda. Grato

    ResponderExcluir
    Respostas
    1. Ola José, Que erro que está ocorrendo? Você esta passando a variável com o QuotedStr?
      Normalmente quando é string passo assim para o relatório:
      frxReport.Variables.Variables['Variavel'] := QuotedStr(Trim(edVariavel.text));

      Excluir
  21. Ola Ana, tenho uma duvida, fiz um relatório a partir view, ele roda direitinho só que está listando somente o primeiro item, pode me dar uma dica?

    ResponderExcluir
    Respostas
    1. Ola Jossimar, Será que o "DataSet" do seu "MasterData1" ou "DetailData1" esteja marcado?

      Excluir
  22. boa noite. Como posso então saber quando o band terminou de imprimir na pagina e traçar uma linha no final dela (desenho para fazer oi fechamento das bordas) e então começar na próxima página.

    como ria isto. Favor envie exemplo ou código para ficar melhor esclarecido.

    ResponderExcluir
    Respostas
    1. Ola! Bom dia!
      Se for apenas colocar uma linha no final de cada página pode ser colocado em um "PageFooter" essa banco imprime no final de cada página ( Normalmente coloco a Quantidade de páginas nele )
      Era isso?

      Excluir
    2. Olá não era isto não. Esta alternativa é trivial e já tentei. Não fica da forma que gostaria...Fica com linha no rodapé. A alternativa foi usar uma band que fica sobrepostas as outras.

      Excluir
  23. Alguém pode me fazer uma caridade e me doar uma versão do FastReport XE7. Não posso comprar...meu e-mail é : amoraes47@gmail.com.
    Ficarei eternamente grato.
    Abraços
    Alex -DF (61)98445 9724(zap)

    ResponderExcluir
  24. Bom dia Ana, pessoal.
    Baixei o XE10.1 Berlin e é impressão minha ou o mesmo não tem nenhum componente relatórios?
    Tenho que baixar de terceiros?

    ResponderExcluir
    Respostas
    1. Ola! Bom dia!
      Não cheguei a baixar o XE10.1 Berlin ainda. Mas pelo que vi em um fórum tem que ser de terceiro ( Mas não vou dar certeza )

      Excluir
  25. Olá, Ana, bom dia!
    Nuca usei o Fast Report. Sempre criei meus próprios relatórios com qualidade usando recursos do próprio Delphi. Mas resolvi mudar e fazer tudo pelo Fast Report. Estou no estágio 1 (conhecendo, brincando e testando). Nesse estágio fiz relatórios simples, listando apenas os dados da tabela. Agora quero avançar e tentar fazer o que eu fazia antes. Veja um exemplo do que preciso:
    Tenho um campo CODIGO em uma tabela de 4 caracteres, sendo que o 1º é um nível, e 2º outro nível e o 3º e 4º são outro nível.
    Digamos que n nível 1 eu tenha (de 0..9), 10 possíveis diretorias: 0-Diretoria Administrativa, 1-Diretoria financeira, 3-Diretoria de Produção.
    Dentro do nível 0 eu tenho até 9 gerências: 00-Financeiro, 01-Faturamento, 02-Recursos Humanos, etc
    Vamos pegar 00-FInanceiro, que se divide em: 0001-Contas a pagar e 00012-Contas a receber. Isso é só para ilustrar.
    Quando eu faço meu relatório direito, a impressão fica assim:
    0 - Diretoria financeira
    0 - Financeiro
    01 - Contas a pagar
    02 - Contas a receber
    A pergunta é: Como faço para manter essa mesma estética, considerando que a única diferença é o tamanho do campo: Quando é um dígito digamos que seja coluna 1, 2 dígitos=coluna, 4 dígitos igual coluna 3.?

    Não sei se dá para fazer isso, mas é muito importante, pois o resultado tem que ser como um Treeview.

    Agradeço pela atenção.

    ResponderExcluir
    Respostas
    1. Verifica a postagem a baixo acho que seria mais ou menos isso

      http://anaprogramadorajunior.blogspot.com.br/2017/03/impressao-de-plano-de-contas-fastreport.html

      Excluir
  26. Oi Ana. Tenho que imprimir um relatório em uma impressora não fiscal térmica com o FastReport. Mas não sei como fazer sobre a questão do comprimento do relatório.
    Pode me ajudar?

    ResponderExcluir
    Respostas
    1. Só configurar conforme o tamanho do papel conforme da impressora, no duplo clique no FastReport se configura isso..

      Excluir
  27. Pessoal, estou montando um relatório, onde o usuário irá selecionar o cliente em um dbgrid, então através de botão, irá imprimir os dados somente daquele cliente (via query). Alguém pode me ajudar?

    ResponderExcluir
    Respostas
    1. No "DetailData" coloque o "DataSet" a tabela que esta relacionada no dbgrid, e depois no "DetailData" preencha a propriedade "RowCount" com "1" com isso sempre exibira apenas um resultado que é o que esta selecionando no dbgrid.

      Excluir
  28. PORQUE O FAST REPORT NÃO APARECE NO FIREMONKEY ?

    ResponderExcluir
    Respostas
    1. Olhaaa! Fast 5, funciona para projetos VCL, não funcionam em Firemonkey multi plataforma, tem a versão FMX patch B9 do Fast Reports, é mais limitada, porém funciona para projetos assim.

      Excluir
  29. Ola boa tarde estou fazendo um relatório com view porem tenho adicionar mais algumas informações que seria rescisão porem este campos nem sempre terá valores oe quando tiver nem vai ter valores com mesma quantidade de colunas exemplo salario tem todo mes vai mostra porem rescisão não teria alguma dica como tratar

    ResponderExcluir
    Respostas
    1. Oie boa tarde! Tem como colocar em um "frxChild" e controlar a visibilidade dele pelo código Ex:

      procedure Child1OnBeforePrint(Sender: TfrxComponent);
      begin
      Child1.Visible := Trim() <> '';
      end;

      Excluir
  30. Boa tarde, tenho um Relatório Master com um Subrelatório no FastReport 5, o master recebe um parâmetro no campo ex: (codigo_contrato) e não estou conseguindo passar o parâmetro recebido para o subrelatório que possui o mesmo campo.

    ResponderExcluir
  31. Prezada Ana,
    Tenho uma dificuldade em implementar este seguinte sistema para gerar a listagem e enviar para o QuickReport, por exemplo:
    Em um ComboBox escolho um tipo de atendimento, ou mesmo em CheckBox:

    [ ] Assistente Social
    [ ] Odontologia
    [x] Atendimento Médico

    Feito a checagem, faço agora a checagem dos pacientes, por exemplo:

    [ ]Antonio de Souza
    [x]Amarildo Costa
    [ ]Benedito Nascimento
    [x]Elisangela Souza
    [x]Francisco Pereira
    [ ]....
    [ ]..
    ....
    ...
    .

    Depois de feito a checagem, envio para o QuickReport
    Ou salvar em uma tabela de atendimentos, Qual a situação melhor ???

    Muita dúvida de como fazer esta parte.

    Ficarei muito agradecido pela ajuda.

    ResponderExcluir
    Respostas
    1. Boa tarde! Deixa eu ver se entendi....
      Tem como ter vários "Tipo de atendimento" e vários "pacientes" e se selecionar ex "Assistente Social" e "Atendimento Médico" terá de exibir estas duas etiquetas para o paciente selecionado ? Isto?

      Excluir
  32. Boa tarde. Pesquisei no google e cheguei ao seu blog. Tenho um sistema de portara que os usuários vai lançando entrada e saídas durante o serviço, porém quando tem muitos registros, eles querem que posiciona na última página o relatório, para ver os últimos registro lançados. E até agora não achei função no fastreport para resolver.

    ResponderExcluir
    Respostas
    1. Boa tarde. Não tem como fazer a ordenação decrescente antes de enviar para o FastReport? Com isso os últimos registros sempre vão estar ao topo.

      Excluir
  33. fiz uma rotina de ordenação de data e hora, para seguir o que foi acordado no contrato, então não posso alterar essa rotina.

    ResponderExcluir
    Respostas
    1. Eu pesquisei bastante nos manuais e exemplos que tem no Fast e não achei nenhuma rotina que manda para a ultima pagina, mas acredito que tenho sim alguma maneira.

      Excluir
  34. Olá, Estou desenvolvendo um sistema de venda, fiz a configuração correta do mestre detalhe dos componentes de acesso a base de dados, mas ao imprimir esta mostrando todas as vendas com os produto no relatorio, como faço para imprimir apenas o registro atual da venda que esta no form? usando o delphi 10,3,3 e fastreport com firebird

    ResponderExcluir
    Respostas
    1. Não vincule a tabela (DataSet) de Vendas/Compras no MasterData ou no DetailData, ao invés disso coloca no campo "Número de registro" (Duplo clique na tarja laranja da MasterData/DetailData vai ter o campo com default "0") altere para o número "1" para ser exibida apenas da venda/Compra atual. Espero ter ajudado

      Excluir
  35. No SELECT, pega a data que foi emitido e agrupa, caso tenha nais de uma venda:

    SELECT codigo, MAX(emissao) FROM produto GROUP BY codigo;

    ResponderExcluir
  36. Então o que eu preciso é fazer a impressão do recibo da compra ou venda que está sendo feita no momento.

    ResponderExcluir
  37. Olá, estou migrando do RaveReports para o FastReport, utilizo o Delphi XE8, com relatórios no RaveReports.
    - Como poderia fazer isto no FastReport :
    1 - setar conexão no objeto TfrDBXDatabase, em tempo de execução.
    2 - utilizar clientdataset que foi estanciado no Delphi no código Scrip do FastReport.
    3 - No RaveReports por exemplo, o componente DataTet tem a propriedade LookupDataview, LokupDisplay e LookupField. Como fazer no FastReport, uma vez que os campos para lookup estão em outro dataset, já consegui fazer isto colocando um objeto qry no relatorio, a qestão é que teria de mudar a coneção em tempo de execução.
    - alguém poderia me ajudar !

    ResponderExcluir
  38. Bonito trabalho Ana Paula. Tenho certeza que ajudou muita gente, inclusive a mim. Esqueci de te elogiar a 5 anos atras. :-) fui o primeiro a comentar em (26 de setembro de 2014). Poderia falar mais a respeito disto já que estamos no FastReport 6. Há muito pra explorar ainda nele e dá pra fazer coisas incríveis que não vejo em outro gerador de relatórios. Grande abraço.

    ResponderExcluir
    Respostas
    1. Bom dia! Olhaa obrigada significa muito!
      FastReport tem varias coisas incríveis estou anotando vários detalhezinhos para fazer um novo post do FastReport! Forte abraço.

      Excluir
  39. Boa tarde. Alguém sabe me dizer se eu consigo deixar a marcação de fontes embutidas como default, quando realizo a exportação de um relatório do fast para PDF? Estou com problemas nesta questão, pois sempre me esqueço e se tento visualizar em um IPHONE por exemplo, os dados não ficam legíveis, só aparecem pontinhos.



    ResponderExcluir
    Respostas
    1. Boa tarde! Já presenciei um problema semelhante, isso é por que a fonte não é a padrão.
      1- Pode colocar a fonte padrão do Fast no documento "Arial"!
      2- Outra sugestão mais eficaz é fazer a exportação para pdf por uma impressora virtual ex: DoroPDF!
      Se encontrar alguma outra solução alem destas para esse problema descreve aqui por favor!

      Excluir
  40. Olá Ana, cheguei no seu site procurando uma solução para enviar email pelo FR6.7 através da porta 587.
    Como vc sabe a porta padrão no Brasil é a 587 pois fecharam a 25.
    Até troquei email com o Paul Gursky chefe do FR que respondeu ser impossível enviar pela 587. Alterei tbm o frx.inc para usar INDY ao invés do frxMail mas não resolveu.
    Você tem alguma idéia de como resolver ??
    Agradeço a atenção e parabéns pelos seus post sobre o FR, boa didática e dedicação. Parabéns!!

    ResponderExcluir
  41. Bom dia. Obrigado pelas informações. Felizmente conseguimos configurar no processo de exportação, manter por default as fontes já embutidas, assim o usuário evita de esquecer. também incluímos a opção do PDF/A na opção e desta maneira, solucionamos o problema de dados ilegíveis nos relatórios quando são abertos por algum aparelho IOS.

    ResponderExcluir
  42. Obrigado. Me ajudou muito esse artigo. :D

    ResponderExcluir
  43. Boa tarde,
    Estou usando os seus exemplos para criar meus relatório. Parabéns pelos seus conteúdos.
    Estou com um problema quando coloco outro field no ClientDataSet e no report ele aparece e quando coloco ele no masterDatail no relatório a informação não aparece.

    ResponderExcluir
    Respostas
    1. Boa tarde! Verificou se ele está dentro da MasterDatail? Ou tentar dar um duplo clique no TfrxDBDataset e atualizar as informações que ele apresenta.

      Excluir
  44. Bom dia!
    E como faço um relatório que contenha :
    Dados do pedidi
    Itens do pedido
    Parcelas do Pedido (Nro da parcela, data e valor,
    Utilizando nesse caso 3 tabelas

    ResponderExcluir
    Respostas
    1. Boa tarde! Verifica o post abaixo nele tem um exemplo com 3 tabelas, uma simulação de um documento de Orçamento com produtos e parcelas.

      https://anaprogramadorajunior.blogspot.com/2021/10/fastreport-no-delphi-com-dois-detail.html

      Excluir
  45. Lien incorrect exemple depuis. 2014. C'est tres bien

    ResponderExcluir
  46. Boa tarde, você sabe dizer se o FastReport têm limitações na versão do Delphi 12?

    ResponderExcluir