ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

(Resolvido) Acumular relatórios no FastReport
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
egamavido
Novato
Novato


Registrado: Segunda-Feira, 11 de Abril de 2016
Mensagens: 70

MensagemEnviada: Qua Abr 11, 2018 10:51 am    Assunto: (Resolvido) Acumular relatórios no FastReport Responder com Citação

Olá pessoal

Preciso gerar vários relatórios que se referem a uma pasta filha, isto é, um pedido possui vários produtos e cada produto, o seu certificado. Para isso, eu faço um laço while que separa cada um dos relatórios e gera corretamente, um por vez, com seguinte código:
Citação:


procedure Tfrm_BaixaOC.visualiza;
begin
DMDados.CDSOS.Open;
DMDados.CDSReserva.Filter:= 'codreserva =' + QuotedStr(DMDados.CDSReservacodreserva.Text);
DMDados.CDSReserva.Filtered:=true;
DMDados.CDSRAnaMP.Open;

DMDados.CDSResFilha.First;
while not DMDados.CDSResFilha.Eof do
begin

DMDados.CDSOCNeta.First;
while not DMDados.CDSOCNeta.Eof do

begin
if DMDados.CDSOS.Locate('Lote', DMDados.CDSOCNetalote.Text,[]) then
begin
DMFast.FRCertificado.Variables['LT']:=QuotedStr(DMDados.CDSOCNetalote.Text);
end;
if DMDados.CDSRAnaMP.Locate('NF', DMDados.CDSOCNetalot4e.Text,[])then
begin
DMFast.FRCertificado.Variables['LT']:=QuotedStr(DMDados.CDSOCNetaVLoteMP.Text
+' Ref.: ' + DMDados.CDSOCNetalote.Text);
end;

DMFast.FRCertificado.ShowReport();
DMDados.CDSOCNeta.Next;
end;

DMDados.CDSResFilha.Next;
end;
end;


Mas é bem incomodo, porque é necessário imprimir um por vez ou gerar um pdf por vez. O que preciso é acumular tudo em um único documento para uma única impressão ou conversão
Não sei se FastReport tem essa propriedade disponível. Acredito que o caminho seja via código, mas não sei nem por onde começar.

Uso Delphi XE2, Access, FastReport 4.0.

Agradeço desde já pela ajuda.


Editado pela última vez por egamavido em Qui Ago 30, 2018 1:11 pm, num total de 3 vezes
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
egamavido
Novato
Novato


Registrado: Segunda-Feira, 11 de Abril de 2016
Mensagens: 70

MensagemEnviada: Qua Abr 11, 2018 2:16 pm    Assunto: Re: Acumular relatórios no FastReport? Responder com Citação

Olá novamente.

Resolvi o problema com a dica existente em nosso forum:

http://www.activedelphi.com.br/forum/viewtopic.php?t=79387&sid=aa1249b9ac0c74d9c94f69d2020e819f

O resultado final ficou assim:

Citação:


procedure Tfrm_BaixaOC.visualiza;
begin
DMDados.CDSOS.Open;
DMDados.CDSReserva.Filter:= 'codreserva =' + QuotedStr(DMDados.CDSReservacodreserva.Text);
DMDados.CDSReserva.Filtered:=true;
DMDados.CDSRAnaMP.Open;

DMDados.CDSResFilha.First;
while not DMDados.CDSResFilha.Eof do
begin

DMDados.CDSOCNeta.First;
while not DMDados.CDSOCNeta.Eof do

begin
if DMDados.CDSOS.Locate('Lote', DMDados.CDSOCNetalote.Text,[]) then
begin
DMFast.FRCertificado.Variables['LT']:=QuotedStr(DMDados.CDSOCNetalote.Text);
end;
if DMDados.CDSRAnaMP.Locate('NF', DMDados.CDSOCNetalot4e.Text,[])then
begin
DMFast.FRCertificado.Variables['LT']:=QuotedStr(DMDados.CDSOCNetaVLoteMP.Text
+' Ref.: ' + DMDados.CDSOCNetalote.Text);
end;

DMFast.FRCertificado.PrepareReport(False);
DMDados.CDSOCNeta.Next;
end;

DMDados.CDSResFilha.Next;
end;
DMFast.FRCertificado.ShowPreparedReport;
DMFast.FRCertificado.PrepareReport();
end;


Obrigado aos que fizeram vista ao post.


Editado pela última vez por egamavido em Ter Abr 17, 2018 3:28 pm, num total de 2 vezes
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
egamavido
Novato
Novato


Registrado: Segunda-Feira, 11 de Abril de 2016
Mensagens: 70

MensagemEnviada: Ter Abr 17, 2018 3:19 pm    Assunto: Responder com Citação

Reabrindo este tópico, Ainda preciso de ajuda.

O problema que me deparei agora é que, quando gero o relatório pela primeira vez ao abrir o form o fastreport se comporta certinho. mas quando gero outra sequencia de relatórios, o programa repete a última folha gerada no preparereport. Em outras palavras, o comando preparedreport() não está limpando completamente o que foi gerado anteriormente.

Alguém tem uma dica? Grato desde já
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9100
Localização: Sinop-MT

MensagemEnviada: Ter Abr 17, 2018 4:03 pm    Assunto: Responder com Citação

mestre/detalhe nao resolve o problema?
_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
egamavido
Novato
Novato


Registrado: Segunda-Feira, 11 de Abril de 2016
Mensagens: 70

MensagemEnviada: Ter Abr 17, 2018 5:40 pm    Assunto: Responder com Citação

joemil escreveu:
mestre/detalhe nao resolve o problema?


Amigo Joemil, o documento já está em mestre detalhe.
Especificando: se eu gerar um relatório por vez, vai direitinho; se eu unir todos preparedreport (false)> showpreparedreport > preparedreport (), na primeira operação vai ok também. Dai em diante, ele persiste a ultima folha da junção anterior.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
egamavido
Novato
Novato


Registrado: Segunda-Feira, 11 de Abril de 2016
Mensagens: 70

MensagemEnviada: Qua Abr 18, 2018 8:10 am    Assunto: Responder com Citação

Uma coisa curiosa sobre o problema.

Se eu acrescentar o comando Fastreport.clear, o programa cham a tela cinza do FastReport. Porém se eu pedir Fastreport.clenupinstance ele retorna essa menssagem de erro: 'Erro(s) Encontrado(s): Linguagemnão encontrada'.

Fechando a janela, tudo normaliza. Então pensei, se eu conseguir contornar ou desaparecer com essa mensagem o comando torna-se utilizavel. Eu sei que é gambi... mas já resolve.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9100
Localização: Sinop-MT

MensagemEnviada: Qua Abr 18, 2018 8:48 am    Assunto: Responder com Citação

posta uma foto do relatorio pra facilitar. e uma foto do designer
_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
egamavido
Novato
Novato


Registrado: Segunda-Feira, 11 de Abril de 2016
Mensagens: 70

MensagemEnviada: Qua Abr 18, 2018 12:52 pm    Assunto: Responder com Citação

joemil escreveu:
posta uma foto do relatorio pra facilitar. e uma foto do designer


Desculpe minha falta de conhecimento, mas como postar imagem aqui?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9100
Localização: Sinop-MT

MensagemEnviada: Qua Abr 18, 2018 3:19 pm    Assunto: Responder com Citação

http://tinypic.com/
_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
egamavido
Novato
Novato


Registrado: Segunda-Feira, 11 de Abril de 2016
Mensagens: 70

MensagemEnviada: Qua Abr 18, 2018 4:52 pm    Assunto: Responder com Citação

joemil escreveu:
http://tinypic.com/


Página do fastreport:



Documento gerado corretamente, isto é, um por vez:



O que eu preciso é unir vários desses certificados gerados e, como eu disse, isso acontece corretamente na primeira vez;
Da segunda solicitação em diante o último documento é capturado da sequencia anterior e se une à nova solicitação de agrupamento.
Então, eu entendo que o comando preparedreport() não está limpando completamente o arquivo anterior e agrupando esse resídual no próximo doc gerado.

Se eu usar FR.Clear , é retornado a famigerada página cinza do FR.

Agora se usar Cleanupinstance na extensão (DMFast.FRCertificado.Cleanupinstance;) dá esse erro abaixo, porém, após fechar a janela de erro o FR volta a agrupar os documentos corretamente.



Confuso...

Mas, se de repente eu conseguir eliminar essa janela/erro, problema resolvido.

Desde já, agradeço atenção
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9100
Localização: Sinop-MT

MensagemEnviada: Qui Abr 19, 2018 8:53 am    Assunto: Responder com Citação

existe uma propriedade chamada StartNewPage. seta ela = True na primeira banda Master. e usa PageHeader no lugar de PageTitle.

assim, se vc tiver usando mestre/detalhe, cada vez q imprimir a banda master, vai sair em uma nova pagina
_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
egamavido
Novato
Novato


Registrado: Segunda-Feira, 11 de Abril de 2016
Mensagens: 70

MensagemEnviada: Qui Abr 19, 2018 10:45 am    Assunto: Responder com Citação

joemil escreveu:
existe uma propriedade chamada StartNewPage. seta ela = True na primeira banda Master. e usa PageHeader no lugar de PageTitle.

assim, se vc tiver usando mestre/detalhe, cada vez q imprimir a banda master, vai sair em uma nova pagina


Olá Joemil.

Obrigado pela explicação, pois aprimorei o relatório da forma que parece mais correta. Entretanto, o problema persiste.
Na verdade, eu consigo agrupar os relatórios e, na primeira ação ele vem perfeito, e daí em diante, o último relatório é repetido no agrupamento seguinte, desta maneira:

1° Agrupamento (correto)

Cliente 1 --- Produto A
Cliente 1 --- Produto B
Cliente 1 --- Produto C
Cliente 1 --- Produto D

2° Agrupamento (em diante)

Cliente 1 --- Produto D
Cliente 2 --- Produto A
Cliente 2 --- Produto B
Cliente 2 --- Produto C

3° Agrupamento

Cliente 2 --- Produto C
Cliente 3 --- Produto A
Cliente 3 --- Produto A

etc;...

Então me parece que, em algum momento, o comando "preparedreport()" não está limpando o relatório acumulado. Talvez o erro seja no laço while, e já tentei diversas variações sem sucesso e não consigo enxergar o segredo.

Mais uma vez obrigado pela atenção.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9100
Localização: Sinop-MT

MensagemEnviada: Qui Abr 19, 2018 10:55 am    Assunto: Responder com Citação

eu uso os componentes:
    PageHeader
    GroupHeader (StartNewPage = True)
    MasterData
    DetailData
    GroupFooter
    PageFooter

assim cada grupo sai em uma pagina
_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
egamavido
Novato
Novato


Registrado: Segunda-Feira, 11 de Abril de 2016
Mensagens: 70

MensagemEnviada: Seg Abr 23, 2018 5:24 pm    Assunto: Responder com Citação

joemil escreveu:
eu uso os componentes:
    PageHeader
    GroupHeader (StartNewPage = True)
    MasterData
    DetailData
    GroupFooter
    PageFooter

assim cada grupo sai em uma pagina


Olá Joemil

Na verdade, meu problema não é sobre os campos Pai e Filha do documento. O relatório em si, sai corretamente se for gerado individualmente. O erro acontece quando eu tento agrupar vários relatórios em um mesmo documento com as linhaso Preparedreport(false) > Showpreparedreport > Preparedreport(). Parece que fica sempre um documento em cache e ele acaba se repetindo na nova agregação. Estou quase acreditando que é falha no próprio FR.

Mais uma vez obrigado. abç
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Ter Abr 24, 2018 10:09 am    Assunto: Responder com Citação

O método PreparedReport recebe um parâmetro boolean para que você informe se quer limpar os relatórios anteriores armazenados ou não.

Para o seu caso, você deve no primeiro PreparedReport setar True no parâmetro e nos posteriores setar False.

Exemplo, armazenando 2 relatórios (Clientes e Produtos):

Código:
  With frxReport1 do
  Begin
    LoadFromFile('Clientes.fr3');
    PrepareReport(True); // Prmeiro relatório setar True para limpar todos os anteriores
    LoadFromFile('Produtos.fr3');
    PrepareReport(false); // Nos demais setar False para ir armazenando
    ShowPreparedReport;
  End;

_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Ir à página 1, 2  Próximo
Página 1 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB