Relatórios Fast Report podem ser afetados por conflito de telas?

Delphi

FastReport

16/12/2021

Bom dia,

Eu estou dando uma manutenção em um sistema com relatórios em fast report que apresenta o seguinte cenário:

- Janela01 com DBGrid que apresenta dados possui um botão que chama a impressão do relatório;
- Janela02 modal que é acessada via menu- item- relatórios para impressão do relatório filtrado ;

O problema é que se a Janela01 estiver aberta com dados os filtros da Janela02 não surtem efeito e prevalece a consulta da Janela01.
Ambos acessam as mesma tabelas: empresas e contas a receber;
Janela01 (aba TDI):
1: TFrxDBDataSet - > TFDQuery ( tabela empresa)
1: TFrxDBDataSet - > TFDQuery ( tabela contareceber);
1: TFrxReport (vinculado a ambos TFrxDBDataSet );

Janela02 (Modal):
1: TFrxDBDataSet - > TFDQuery ( tabela empresa)
1: TFrxDBDataSet - > TFDQuery ( tabela contareceber);
1: TFrxReport (vinculado a ambos TFrxDBDataSet );

Observação ambos os relatórios funcionam, porém apenas há conflito caso a Janela01 estiver aberta. Talvez seja algum mecanismo dinâmico de gestão de fonte de dados do fast report.

Alguém sabe algo que eu possa testar aqui?
Wanderson Pinheiro

Wanderson Pinheiro

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

16/12/2021

Pela forma que você explicou dá a entender que cada form tem seu próprio FDQuery, mas não deve ser o caso, certo? Se fosse assim não daria "conflito". Então imagino que os dois forms apontam para os mesmos FDQuery, provavelmente estão num Datamodule.

Não vou falar sobre certo e errado.
Vou falar como eu faço.

Eu nunca acesso diretamente os datasets de um Datamodule. Sempre tenho um datasetprovider vinculado ao dataset.
Em cada form eu tenho um clientdataset (ligado ao datasetprovider pertinente) e um datasource, e todo o trabalho no form é feito em cima dessa dupla clientdataset/datasource do próprio form.

Se, por exemplo, um relatório for executado e os dados a imprimir sejam os que estão sendo apresentados no form eu faço, em tempo de execução, a associação dos dados do relatório ao clientdataset/datasource do form.
GOSTEI 1

Mais Respostas

Wanderson Pinheiro

Wanderson Pinheiro

16/12/2021

Pela forma que você explicou dá a entender que cada form tem seu próprio FDQuery, mas não deve ser o caso, certo? Se fosse assim não daria "conflito". Então imagino que os dois forms apontam para os mesmos FDQuery, provavelmente estão num Datamodule.

Não vou falar sobre certo e errado.
Vou falar como eu faço.

Eu nunca acesso diretamente os datasets de um Datamodule. Sempre tenho um datasetprovider vinculado ao dataset.
Em cada form eu tenho um clientdataset (ligado ao datasetprovider pertinente) e um datasource, e todo o trabalho no form é feito em cima dessa dupla clientdataset/datasource do próprio form.

Se, por exemplo, um relatório for executado e os dados a imprimir sejam os que estão sendo apresentados no form eu faço, em tempo de execução, a associação dos dados do relatório ao clientdataset/datasource do form.

Sim . Cada form tem seu FDquery em datamodules diferentes.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

16/12/2021

Se cada form tem seus FDQuery e os relatórios estão vinculados a esses datasets, o problema que você reportou não faz muito sentido.

De qualquer forma tente, ao executar o relatório (isso na chamada de cada uma das telas), em tempo de execução, associar o relatório ao dataset (FDQuery/Datasource) da tela que o estiver executando.
GOSTEI 0
Wanderson Pinheiro

Wanderson Pinheiro

16/12/2021

Se cada form tem seus FDQuery e os relatórios estão vinculados a esses datasets, o problema que você reportou não faz muito sentido.

De qualquer forma tente, ao executar o relatório (isso na chamada de cada uma das telas), em tempo de execução, associar o relatório ao dataset (FDQuery/Datasource) da tela que o estiver executando.


Bom dia,


Solução:
Alterar o nome da propriedade UserName dos FrxDbDataSet e fazer as devidas alterações no arquivo fr3.

Resolvido !

Obrigado Emerson Nascimento por estar respondendo ao tópico.
GOSTEI 0
Miro Callai

Miro Callai

16/12/2021

Se cada form tem seus FDQuery e os relatórios estão vinculados a esses datasets, o problema que você reportou não faz muito sentido.

De qualquer forma tente, ao executar o relatório (isso na chamada de cada uma das telas), em tempo de execução, associar o relatório ao dataset (FDQuery/Datasource) da tela que o estiver executando.


Bom dia,


Solução:
Alterar o nome da propriedade UserName dos FrxDbDataSet e fazer as devidas alterações no arquivo fr3.

Resolvido !

Obrigado Emerson Nascimento por estar respondendo ao tópico.
GOSTEI 0
Miro Callai

Miro Callai

16/12/2021

Estou com o mesmo Problema, mas não queria fazer assim:
"Alterar o nome da propriedade UserName dos FrxDbDataSet e fazer as devidas alterações no arquivo fr3."

Pois queria usar o mesmo FR3 para varios formularios
A questão é que os FR3 podem ser personaliados/formatados pelo usuario no sistema,
e se for alterar os UserName dos FrxDbDataSet, teria de ter um FR3 para cada impressão
GOSTEI 0
Evandro Almeida

Evandro Almeida

16/12/2021

Resolvi da seguinte forma:

no Create do componente.
Report := TfrxReport.Create(AOwner);
Report.EngineOptions.UseGlobalDataSetList := False;

no método de adicionar os datasets

frxDB.DataSet := CdsDAtaSet;
frxDB.UserName := 'Dados';

Report.Clear;
Report.EnabledDataSets.Clear;
Report.EnabledDataSets.Add(frxDB);
lobjteste.report.EnabledDataSets.Add(frxDBCabecalho);
lobjTeste.Report.Preview := lteste.frxpreview;
lobjTeste.Report.LoadFromFile('C:\\Users\\EVANDRO\\Desktop\\novo 15.txt');
lobjTeste.Report.ShowReport();


Segundo o phind:
A propriedade UseGlobalDataSetList no contexto do FastReport serve para controlar o comportamento de busca de conjuntos de dados (TfrxDBDataSet) durante a execução de um relatório. De acordo com a documentação do FastReport 4.6, esta propriedade está ativada por padrão e, quando ativada, faz com que o FastReport procure sempre o primeiro TfrxDBDataSet criado na lista global de conjuntos de dados 4.



GOSTEI 0
Arthur Heinrich

Arthur Heinrich

16/12/2021

Pode ser que o Form2 seja um form exclusivo para a geração de relatórios, onde você escolhe os parâmetros e ele faz o serviço.

Ao desenvolver o Form1, de consulta, talvez tenham criado o botão de imprimir o relatório, que utiliza internamente o Form2, que já está pronto. Mas, pode estar modificando dinamicamente a origem dos dados do relatório, para os componentes do Form1, ignorando os parâmetros do Form2, que atua sobre as queries e componentes locais..
GOSTEI 0
POSTAR