Mostrando postagens com marcador FastReport. Mostrar todas as postagens
Mostrando postagens com marcador FastReport. Mostrar todas as postagens

Criar etiqueta e definindo quantidades a serem impressas no Delphi FastReport


Esse post irei fazer será um adicional de um antigo post.
Vamos supor que queremos imprimir uma folha de etiquetas mas tem algumas destas etiquetas que queremos que seja impressão mais de uma quantidade.
Para isso vamos utilizar um TClientDataSet para selecionar os produtos e as quantidades de cada etiqueta por produto, e outro TClientDataSet para receber as informações de acordo com as quantidades informadas no TClientDataSet anterior;

Vamos baixar o exemplo do post anterior e fazer nossas alterações em cima dele, no TForm vamos colocar mais um TClientDataSet com os campos que iremos imprimir na nossa etiqueta, e um TDBGrid,
e acrescentar o campo QUANTIDADE do tipo Integer no TClientDataSet já existe.


Lembramos de sempre colocar padrão para carregar 1 quantidade, senão não irá apresentar informação alguma do produto. Vamos duplicar o TClientDataSet com as informações que vamos exibir na etiqueta.

Depois disso criaremos uma Procedure com o nome de CarregarInformacoes;
procedure TFSistema.CarregarInformacoes;
var
  i: Integer;
begin
  CdsBarras.EmptyDataSet;
  CDSEtiquetas_Teste.First;
  while not CDSEtiquetas_Teste.Eof do begin
    for I := 0 to CDSEtiquetas_TesteQUANTIDADE.Value - 1 do begin
      CdsBarras.append;
      CdsBarrasDESCRICAO.Value := CDSEtiquetas_TesteDESCRICAO.Value;
      CdsBarrasCODBARRAS.Value := CDSEtiquetas_TesteCODBARRAS.Value;
      CdsBarras.Post;
    end;
    CDSEtiquetas_Teste.Next;
  end;
end;
Essa Procedure faremos um while para passar em todos os registros da tabela, e na linha de baixo um for para cadastrar a quantidade de etiquetas que informamos no TDBGrid.

O Botão de impressão da etiqueta vai ficar assim:
procedure TFSistema.btnVisualizarClick(Sender: TObject);
begin
  if CDSEtiquetas_Teste.IsEmpty then begin
    Application.MessageBox(Pchar('Seleção sem registros'), Pchar(Caption), MB_ICONINFORMATION + MB_OK + MB_DEFBUTTON1 + MB_SYSTEMMODAL);
    Exit;
  end;
  if Ler_Arquivo('Etiquetas_6x16.fr3') then begin
    CarregarInformacoes; {Nossa procedure}
    frxTable.DataSet := CdsBarras; {Joga a tabela de etiquetas que criamos nova}
    if Sender = btnVisualizar then
      frxReport.ShowReport
    else begin
      frxReport.PrepareReport;
      frxReport.Print;
    end;
  end;
end;
Percebe que coloquei no DataSet a tabela que criei depois a CdsBarras, e a procedure acima da linha onde e colocado o FrxTable.DataSet.

Vamos testar oque fizemos: 


Espero ter acendido uma pequena luz no final do túnel de como fazer um documento com três tabelas.

FastReport no Delphi - Com dois Detail


Criaremos um relatório de orçamentos, então iremos exibir os dados principais do "Cliente" e "Número do Orçamentos" e abaixo os produtos e os detalhes das parcelas. Vamos organizar esse relatório jogando os produtos para um Detail e com os totais dos produtos, e outro Detail com as parcelas.
Esse vai ser apenas um exemplo ilustrativo, sem conexão com banco de dados, vamos nos aprofundar apenas na parte do FastReport

Vamos iniciar um novo projeto (File >> New >> Windows VCL Application);

Nesse projeto vamos utilizaremos:
2 - TBitBtn;
3 - TfrxDBDataset;
1 - TfrxReport
3 - TClientDataSet;
3 - TDataSource;
1 - TEdit;

Organizei os componentes desta forma: 

Agora vamos para o FastReport.

Dê dois cliques no componente frxReport para abrir na forma de Designer, vamos iniciar (File >> New Report). Pronto criamos um novo documento ele nos trouxe como padrão ReportTitle1, MasterData1 e um PageFooter1, adicionar as tabelas no FastReport menu (Report >> Data);

Vamos comecar colocando o nosso logo no topo do relatório.

Eu coloquei manualmente o caminho utilizando um TEdit para colocar o caminho do logo, mas vocês podem colocar um campo na tabela de configuração do sistema para colocar um logo padrão da empresa com isso pode ser utilizado em outros locais do sistema.

Vamos para o FestReport

Colocamos uma linha para identificar se o logo e existe, pois se mandar um caminho invalido ocorre erro, e coloquei uma variável em branco para quando não encontrar o logo para não ocorrer o erro de não encontrar a variável no FastReport 
procedure TFSistema.BtnVisualizarClick(Sender: TObject);
begin
  if FileExists(edLogoTipo.Text) then //Identifica se existe um logo
    frxReport.Variables.Variables['LogoSistema'] := QuotedStr(edLogoTipo.Text)
  else
    frxReport.Variables.Variables['LogoSistema'] := QuotedStr('');
  frxReport.ShowReport;
end;
Com o código pronto no FastReport vamos usar a variável na parte do código
begin
  if <LogoSistema> <> '' then
    igLogo.LoadFromFile(<LogoSistema>)
end. 
Quando adicionarmos o componente que vai receber nosso logo vamos marcar algumas propriedades, Com a propriedade Stretched ativa o logo irá ocupar exatamente o tamanho que nós estipulamos, e com a propriedade HightQuality nosso logo irá ter uma qualidade melhor.

Na banda MasterData1 vamos vincular com o DataSet FrxDataSet(cdsOrcamentos), após vincular adicionar os campos "Número do Orçamento" e "Nome do cliente" o "Endereço" e outros dados que o cliente desejar. 

Organizei os componentes desta forma, vinculei a tabela frxDataset que seria a cdsOrçamentos.
Agora para os produtos vamos adicionar uma Detail e com ela vinculamos frxDataset2 com vínculo aos cdsOrcamentos_produtos abaixo do MasterData.

Agora vamos para as parcelas, vinculei a tabela frxDataset3 que seria a cdsOrçamentos_Parcelas.
Para isso iremos utilizar um Detail e com ela vinculamos frxDataset3 com vínculo aos cdsOrcamentos_parcelas abaixo do outro Detail.


Antes de irmos para os totais vamos dar uma olhada e uma "perfumada" no nosso documento, colocar o numero do orçamento no topo do documento, um espaço maior entre as parcelas e os produtos;

Agora iremos para o nosso rodapé com os totais agora, para isso vamos utilizar um ColumnFooter, para ficar no final do nosso documento, e faremos um Sum na Detail.


Resultado final 



Espero ter acendido uma pequena luz no final do túnel de como fazer um documento com três tabelas.

FastReport no Delphi - Visualizar mais de um relatório ao mesmo tempo


Com o necessidade de juntar dois documento o FastReport tem essa opção é algo simples, então vamos no nosso cenário:


Teremos dois documento um o "
Contrato" e outro é um "Aditivo contratual", Vamos fazer dois chamados correto? Já que são documento diferentes um para o "Contrato" e outro para o "Aditivo contratual", mas  como sempre tem aquele cliente que quer imprimir os dois documentos ao mesmo tempo, então usaremos essa opção do FastReport para juntar os dois documentos em um único relatório.

Para isso, o FastReport possui ferramentas que permitem anexar vários em um único documento. O método frxReport.PrepareReport tem um parâmetro ClearLastReport: Boolean. Este parâmetro determina se as páginas do relatório criado anteriormente devem ser apagadas.

Vamos a nosso exemplo: 

O código dos botões para visualizar os documento unitários são normais:
procedure TFSistema.BtnAditivoClick(Sender: TObject);
begin
  frxReport.LoadFromFile('Aditivo.fr3');
  frxReport.PrepareReport;
  frxReport.ShowReport;
end;

procedure TFSistema.BtnContratoClick(Sender: TObject);
begin
  frxReport.LoadFromFile('Contrato.fr3');
  frxReport.PrepareReport;
  frxReport.ShowReport;
end;
O código do botão para visualizar os documentos unidos e um pouco diferente:
procedure TFSistema.BtnAmbosClick(Sender: TObject);
begin
  frxReport.LoadFromFile('Contrato.fr3');
  frxReport.PrepareReport;
  frxReport.LoadFromFile('Aditivo.fr3');
  frxReport.PrepareReport(False);
  frxReport.ShowPreparedReport;
end;
Analisando o código acima a diferença e ter ambos os documento sendo carregados pelo LoadFromFile e ser preparado pelo PrepareReport, já a diferença e o PrepareReport com a propriedade False a partir do segundo carregamento, com isso se tivesse mais de dois arquivos os próximos também estariam com a propriedade False, logo após outra diferença mudamos o ShowReport pelo ShowPreparedReport;

Vamos ver como ficou: 


Fonte: https://www.fast-report.com/en/blog/353/show/

FastReport no Delphi - Subreport


Criaremos um relatório de pedidos, então iremos exibir de Titulo o nome do "Cliente" e "Número do Pedido" e abaixo os produtos. Vamos organizar o relatório jogando os produtos para um subreport e com os totais dos produtos. 

Vamos iniciar um novo projeto (File >> New >> Windows VCL Application);

Nesse projeto vamos utilizaremos: 

1 - TBitBtn; 
2 - TfrxDBDataset; 
1 - TfrxReport 
2 - TClientDataSet ( O componente de conexão de banco de dados de vocês );

Vamos alterar os nome das TfrxDBDataset, um se chamara frxDataset e será colocado a propriedade do DataSet a tabela cdsPedidos, o outro se chamara frxDataset2 e será colocado a propriedade do DataSet a tabela cdsPedidosProdutos

Agora vamos para o FastReport.

Dê dois cliques no componente frxReport para abri na forma de Designer, vamos iniciar (File >> New Report). Pronto criamos um novo documento ele nos trouxe como padrão ReportTitle1, MasterData1 e um PageFooter1, adicionar as tabelas no FastReport menu (Report >> Data);



Na banda MasterData1 vamos vincular com o DataSet FrxDataSet(cdsPedidos), apos vincular adicionar os campos "Número do pedido" e "Nome do cliente".


Obs: Quando exportado para Excel ou para alguma planilha se os componentes não estiverem bem alinhados acaba se criando linhas e colunas desnecessárias

Então vamos alinhar os componentes utilizando a propriedade Align. E aumentar a fonte, pintar a os campos (Memos) em outra cor para dar uma destacada no titulo.


Pronto. Agora temos o cabeçalho de cada pedido pronto! Vamos para nosso subreport com nossos produtos.

Na palheta da lateral vamos procurar o subreport, vamos clicar nele e depois clicar onde desejamos colocar, em nosso exemplo vamos colocar alinhado abaixo do titulo dos pedidos dentro do mesmo MasterData1 que já estávamos utilizando. Ao fazer isto ira criar uma nova tela onde vamos trabalhar os nossos itens, perceba em cima que temos agora duas abas. lembrando de deixar o left do subreport 0 para ficar alinhado ao titulo! 


Começamos a trabalhar em nosso nova aba agora, vamos adicionar um Header1 e um MasterData vinculada a tabela FrxDataSet2, e os campos de "Produto", "Quantidade" e "Valor" com seus respectivos cabeçalhos.


Vamos para nosso totalizador por item! Vamos adicionar um Footer1 e nele os campos para exibir nossos somatórios. 


Vamos ver como ficou o resultado de nosso relatório de pedidos? 

FastReport no Delphi - Campo com muito texto [Memo]


Começamos com mais uma Dica hoje, Exemplo: Temos um campo em nosso banco de dados do tipo Blob que e relativamente grande. Então como fazemos para imprimir este campo num FastReport sendo que não sabermos certo a quantidade de linhas que contem esse campo?
Se apenas colocarmos e não alterarmos nenhuma configuração, e campo ficaria assim.


Dica rápida e fácil para resolver isto - Propriedades do TfrxMemoView
No componente memo vamos colocar a propriedade Strechmode := smMaxHeight, e na banda que contem o campo vamos colocar a propriedade Stretched := True;
Em execução ficara assim:

Algumas outras propriedades do memo que podem ser utilizadas:
Autowidth := True coloca tudo na mesma linha na hora de imprimir;
Cliped := True Mostra se vai aparecer quebra de linha dentro do fastReport, e não somente no relatório;
Strechmode := smActualHeight ou Strechmode := smMaxHeight faz o texto ser ampliado de acordo com a quantidade de linhas;
WordWrap := True Controla se as palavras ira encaixar numa única linha ou descer para a próxima;
WorldBreack := True Controla se as palavras podem ser quebradas ou não;

FastReport no Delphi - Impressão para bobinas


Hoje vamos com uma ótima dica para a impressão de bobina com o FastReport. Vamos ver duas formas de configuração uma impressão infinita para impressões em bobina.

Primeira opção: 
Na parte em branco do documento clique duas vezes, abrira uma tela de configuração na segunda aba "Outras opções" desmarque a opção "Altura de pagina sem fim" ou quando em inglês "Endless page height"





Segunda opção:
Em propriedades da pagina deixe como true as opções "LargeDesignHeighte" e "Endlessheight
A opção: LargeDesignHeighte será apenas para nos podermos visualizar toda a pagina.
A opção: Endlessheight é a opção que deixa o nosso documento com a impressão sem fim.

Impressão para bobinas configurado.

FastReport no Delphi - Variáveis


As variáveis são muito útil quando tem a necessidade de utilizar valores dinâmicos, exemplo envio de informações em tempo de execução. As variais são do formato "variant" ou seja, não precisamos declarar tipo, basta informar o seu conteúdo.

Para criar e trabalhar com variáveis no FastReport, selecione o item de menu "Relatório > Variáveis...". 
A variáveis no FastReport são em estrutura de dois níveis, primeiro nível e a categoria e o segundo nível a variável em si. Normalmente utilizadas quando contem muitas variáveis.

Então vamos para um exemplo: Vamos dizer que tempo muitas variáveis, vamos jogar essas variáveis para um relatório de venda.
  Clientes
    Código do cliente
    Nome do cliente
  Venda
    Código da venda
    Data do venda
    Número da nota fiscal

Nesse nosso exemplo acima os campos "Clientes" e "Venda" são nossas categorias e os de mais campos são nossas variáveis.
Vamos levar esse nosso exemplo para o FastReport. Abra o editor de variáveis e crie esta estrutura usando os botões "Nova categoria", "Nova Variável" e "Editar"




Mas você pode simplesmente enviar via Delphi as variáveis para o FastReport, fazendo desta forma não se precisa criar as variáveis dentro do FastReport, temos que fazer como no código abaixo.
procedure TFPosVendas.BtnVisualizarClick(Sender: TObject);
begin
  if dmRels.Ler_Arquivo('Pós-Vendas', 'FormAvalPosVendas.fr3') then begin
    dmrels.frxReport.Variables.Variables['Valor'] := QuotedStr(FormatFloat('R$#,##0.00', 1500.00));
    dmrels.frxReport.Variables.Variables['Vendedor'] := QuotedStr('Preencha aqui');
    dmrels.frxReport.Variables.Variables['Equipes'] := QuotedStr('Preencha aqui');
    dmrels.frxReport.Variables.Variables['NroContrato'] := IntToStr(1000);
    dmrels.frxReport.ShowReport;
  end;
end;

Já dentro do documento a variável é utilizada com o VarToStr(NomeDaVariavel), como esta abaixo.

FastReport no Delphi - Master/Detail


Vamos brincar com o FastReport? Criaremos um relatório de venda, e que exiba os produtos nas linhas abaixo. Vamos aproveitar e apresentar um total no Footer1
Vamos iniciar um novo projeto (File >> New >> Windows VCL Application);

Nesse projeto vamos utilizar: 
3 - TBitBtn; 
2 - TfrxDBDataset; 
1 - TfrxReport 
2 - TClientDataSet ( O componente de conexão de banco de dados de vocês ); 

Vamos alterar os nome das TfrxDBDataset, um se chamara frxDataset e será colocado a propriedade do DataSet a tabela cdsVendas, o outro se chamara frxDataset2 e será colocado a propriedade do DataSet a tabela cdsVendasProdutos
As tabelas cdsVendas e cdsVendasProdutos devem estar devidamente vinculados, abertas pelo delphi e agora vamos para o FastReport.

Dê dois cliques no componente frxReport para abri na forma de Designer, vamos iniciar (File >> New Report). Pronto criamos um novo documento ele nos trouxe como padrão ReportTitle1, MasterData1 e um PageFooter1, adicionar as tabelas no FastReport menu (Report >> Data);

Adicionar as seguintes bandas: DetailData1 para colocar os itens, Footer para o total de registros, e um Child1 para o cabeçalho das vendas e um Child2 para o cabeçalho dos Produtos o MasterData1 para adicionar nossas vendas já esta adicionado!

Na banda MasterData1 de um duplo clique (Na parte laranja) e adicione a tabela frxDataset;
Na banda DetailData1 de um duplo clique (Na parte laranja) e adicione a tabela frxDataset2;
Vamos adicionar os campo do titulo, "Número da venda, Nome cliente, Data, Valor total" clicando no "Text Object" o A vermelho ao lado e coloque no Child1 ( O que esta acima do MasterData1 )


Agora vamos colocar os campo das vendas no MasterData1, clica ao lado na Data e arrasta e solta no MasterData1, tentamos deixar bem alinhado com o titulo a cima para poder entender bem qual titulo se refere a cada coluna.

Obs: Quando exportado para Excel ou para alguma planilha se os componentes não estiverem bem alinhados acaba se criando linhas e colunas desnecessárias

Selecione o campo colocamos o valor total no MasterData de um duplo clique no mesmo e na aba Format vamos colocar a Caregory Number e vamos escolher a terceira opção de formatação
Selecione o campo colocamos a Data no MasterData de um duplo clique no mesmo e na aba Format vamos colocar a Caregory Date/Time e vamos selecionar a primeira opção e alterar no Format String os "." por "/" como no gif abaixo.


Agora colocamos os campos de produtos na banda DetailData1 da mesma maneira que colocamos os campos da venda, abaixo como ficou.

Agora colocaremos os totais no Footer1, faremos a soma das Quantidades de itens e uma soma de quantos produtos temos ( Somara a quantidade de vezes que irá passar pelo DetailData1). Temos um gif abaixo mostrando como fazer.

Function = E a função que vai utilizar (SUM, MIN, MAX, AVG, COUNT...);
Data band = E a banda que deseja fazer o calculo;
DataSet = O DataSet da banda desejada;
DataField = Caso necessário utilizar no calculo;
Exemplo: Uma soma de todas as quantidades de uma venda. 
Function: SUM (Soma) 
DataBand: DetailData1 que ira passar em todos os itens da venda;
DataSet: frxDataset2 que contem as informações da quantidade que ira ser somada 
DataField: O campo Quantidade que iremos somar

Por fim selecione todos os campo da banda MasterData1 e na propriedade Color coloque clSilver


FastReport no Delphi - Primeiros Passos


Vamos começar do inicio com o FastReport, criaremos um relatório que ira exibir uma listagem de clientes. Vamos exibir no documento "Código, Nome do cliente, Data nascimento, Telefone"

Vamos iniciar um novo projeto (File >> New >> Windows VCL Application);
Nesse projeto vamos utilizar:
  • 3 - TBitBtn;
  • 1 - TfrxDBDataset;  Na propriedade DataSet colocar o vinculo do TClientDataSet 
  • 1 - TfrxReport 
  • 1 - TClientDataSet ( O componente de conexão de banco de dados de vocês );
Dê dois cliques no componente frxReport para abri na forma de Designer, 

Agora vamos "desenhar" nosso relatório. Para isso, dê dois cliques no componente frxReport para abri o Designer. Agora vamos iniciar (File >> New Report). Pronto criamos um novo documento ele nos trouxe como padrão ReportTitle1, MasterData1 e um PageFooter1















ReportTitle1 - Titulo mostrado apenas na primeira pagina;
MasterData1 - Local onde vinculado com o banco de dados para poder exibir os registros;
PageFooter1 - Rodapé normalmente utilizado para exibir o número de paginas;

Agora vamos adicionar um Componente (Imagem a baixo) para colocarmos uma descrição TFrxMemoView "Relatório de clientes" com esse componente dentro do ReportTitle1 e selecionado vamos nas propriedades em Align vamos colocar baClient para poder preencher todo o espaço do ReportTitle1, em HAlign vamos colocar haCenter para posicionar a descrição ao centro, em VAlign vamos colocar vaCenter para posicionar a descrição ao centro, temos outras propriedades como as de Font.

Agora vamos para o menu novamente (Report >> Data) aqui vamos marcar as tabelas que vamos utilizar no nosso relatório em nosso exemplo temos apenas uma tabela frxDataSet então vamos marcar ela
. 

Agora vamos para a banda MasterData1 nela damos dois cliques (Na tarja em laranja) selecione nossa tabela frxDataSet e de um OK 

O campo Number of records serve para quando definimos uma quantidade x de vezes para a banda ser exibida ( Normalmente utilizo quando tenho que deixar algumas linhas ) nesse caso vamos deixar 0. Agora vamos adicionar os fields na banda MasterData1 para ser exibido os registro da tabela.

A partir de agora o F9 da uma preview de como esta nosso documento.
Depois ajustar as larguras dos campos, eu normalmente coloca os campos com as propriedades Aling baBottom para que fiquem grudados na banda e StretchMode smMaxHeight para se a descrição do nome do cliente for muito grande amplie as campos gerando uma linha a mais, clicando na tarja laranja novamente e indo nas propriedades marque Stretched para True, para a banda se expandir de acordo com os campos.











Agora vamos adicionar uma nova banda para poder colocar o cabeçalho para podermos saber quais os campos que estão sendo exibidos...
Adicione 4 campos da mesmo forma que adicionou para o ReportTitle só que desta vez não colocar baClient nos campos, no memo de cada um coloque a descrição "Código, nome, Nascimento, Telefone" para que fique desta forma 

Resultado final da listagem (Clicando em F9) 



Só para finalizar vamos colocar o código abaixo no botão visualizar o colocar o mesmo evento no botão Imprimir:
procedure TFSistema.BtnVisualizarClick(Sender: TObject);
begin
  if Sender = BtnVisualizar then
    frxReport.ShowReport
  else
    frxReport.Print
end;

Exemplo: Download do exemplo

FastReport interno no banco de dados


Útilizo os arquivos no banco de dados para não precisar atualizar em todas as maquinas um determinado arquivo, adiciono no banco de dados e no momento de visulizar o documento e sistema exporta apenas o arquivo que vai ser visualizado e o exclui logo em seguida!
Para começar vamos fazer o modo de importar para o banco de dados e exportar em caso de precisar o arquivo;

Vamos precisar dos componentes

pnlBotoes: TPanel;
btnNovo: TBitBtn;
btnExcluir: TBitBtn;
btnCancelar: TBitBtn;
BtnLimpar: TBitBtn;
btnConfirmar: TBitBtn;
btnAlterar: TBitBtn;
dbgrPrincipal: TDBGrid;
flbArquivos: TFileListBox;
dsRelatorios: TDataSource;

Vão ficar disposto desta forma (Não a necessidade de ficar idêntico apenas exemplo);


Para o armazenamento vamos precisar dos campos:


Eu utilizarei um clientDataSet sem armazenamento em banco de dados.(apenas para ficar genérico para vocês)
Criaremos uma pasta chamada "Atualizações" dentro da pasta do Sistema onde colocaremos os arquivos FastReport importar, no componente TFileListBox vamos colocar a properties Mask como "*.fr3"


No evento de OnCriate colocaremos o código para verificar se contem a pasta  "Atualizações" e criação se a mesma não existir e o carregamento do nome dos aquivos para o TFileListBox

procedure TFRelatorio.DoCreate;
begin
  cdsRelatorios.CreateDataSet;
  if ForceDirectories(ExtractFilePath(Application.ExeName) + 'Atualizações') then
    flbArquivos.Directory := ExtractFilePath(Application.ExeName) + 'Atualizações';
  flbArquivos.Directory := ExtractFilePath(Application.ExeName) + 'Atualizações';
end;  

No botão "Adicionar" vamos colocar o código que ira carregar o conteúdo dos arquivos que foram carregados para o TFileListBox;

procedure TFRelatorio.btnAdicionarClick(Sender: TObject);
var i: integer;
   fr3: string;
begin
  for I := 0 to flbArquivos.Items.Count - 1 do begin
    fr3 := ExtractFilePath(Application.ExeName) + 'Atualizações' + '\' + flbArquivos.Items[I];
    if cdsRelatorios.Locate('DESCRICAO', VarArrayOf([flbArquivos.Items[I]]),[]) then begin
      cdsRelatorios.edit;
    end else begin
      cdsRelatorios.Append;
      cdsRelatoriosDESCRICAO.Value := flbArquivos.Items[I];
    end;
    cdsRelatoriosDATA.Value := Date;
    cdsRelatoriosRELATORIO.LoadFromFile(fr3);
    cdsRelatorios.Post;
    DeleteFile(ExtractFilePath(Application.ExeName) + 'Atualizações' + '\' + flbArquivos.Items[I]);
  end;
  flbArquivos.Clear;
end;  

O botão "Excluir" e "Limpar" não muda muito do padrão: 

procedure TFRelatorio.btnExcluirClick(Sender: TObject);
begin
  cdsRelatorios.Delete;
end;

procedure TFRelatorio.BtnLimparClick(Sender: TObject);
begin
  while cdsRelatoriosDESCRICAO.Value <> EmptyWideStr do
    cdsRelatorios.Delete;
end;  

No exportar vamos apenas pegar o conteúdo e o nome dele e criar o arquivo novamente

procedure TFRelatorio.btnExportarClick(Sender: TObject);
var fr3: string;
begin
  ForceDirectories(ExtractFilePath(Application.ExeName) + 'Relatórios');
  cdsRelatorios.First;
  while not cdsRelatorios.Eof do begin
    fr3 := ExtractFilePath(Application.ExeName) + 'Relatórios' + '\' + cdsRelatoriosDESCRICAO.Value;
    cdsRelatoriosRELATORIO.SaveToFile(fr3);
    cdsRelatorios.Next;
  end;
end;  

Assim já conseguimos armazenar e exportar os arquivos no banco de dados:

Para fazer a leitura do documento vamos precisar de: 

pnlBotao: TPanel;
BtnVisualizar: TBitBtn;
frxReport: TfrxReport;

Os componentes vão ficar mais ou menos assim no meu exemplo (Obs: Eu vou fazer tudo na mesma tela no exemplo, se precisar de um exemplo mais complexo eu faço outro post)


Esta é uma função para localizar o Arquivo na tabela que contem os arquivos, ela ira nos retornar True se conter o documento e apos isso salvar o arquivo na pasta do Sistema com o nome de Relatório.fr3

function TFRelatorio.Ler_Arquivo_do_Banco(const AArquivo: String): Boolean;
var
  lArquivofr3 : String;
begin
  Result := cdsRelatorios.Locate('DESCRICAO', AArquivo, []);
  if Result then begin
    lArquivofr3 := ExtractFilePath(Application.ExeName) + 'Relatório.fr3';
    TMemoField(cdsRelatorios.FieldByName('RELATORIO')).SaveToFile(lArquivofr3);
    Self.frxReport.LoadFromFile(lArquivofr3);
  end;
end;

No botão de "Visualizar" vai o código que vai utilizar o Ler_Arquivo_do_Banco e localizando irá fazer a visualização do documento e apos isto excluir o documento da pasta.

procedure TFRelatorio.BtnVisualizarClick(Sender: TObject);
begin
  if Ler_Arquivo_do_Banco('Relatorio_Teste.fr3') then begin
    frxReport.PrepareReport;
    frxReport.ShowReport;
    DeleteFile(ExtractFilePath(Application.ExeName) + 'Relatório.fr3');
  end;
end;


Exemplo: Download do exemplo

HTML no Fast Report


O objeto ... entende algumas tags de HTML as mais simples para ser exata. As tags tem ser colocadas no texto. Por padrão essa fleg AllowHTMLTags sempre vem desmarcada.

<b> - texto em negrito
<i> - texto em itálico
<u> - texto sublinhado
<sub> - subscrito
<sup> - sobrescrito
<font color> - cor da fonte


Não há muitas tags suportadas, mas é suficiente para a maioria dos aplicativos. É impossível modificar o tamanho e o nome da fonte.

Exemplo:

<font color = red> Texto em vermelho </font>
<font color = "# FF8030"> Texto em laranja </font>
<b> <i> Texto em negrito e itálico </b> </i>
<b> Texto em negrito </b> 
<i> Texto em itálico </i> 
M<sup> 2 </sup>
A<sub> 1 </sub>



A cor da fonte pode ser modificada pelo nome da cor red ou pelo código da mesma