delphi 在报告多个报表时出现Fastreport错误

4dbbbstv  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(318)

我已经创建了一个包含多个报表的报表。在查询中,我为where子句使用了宏。

select * from tbl1 where &conditions order by id

单个报表工作正常。报表运行正确。当我想用语句创建多报表时,有时会出现问题。

frxReport1.LoadFromFile('report.fr3');
frxReport1.PrepareReport(False);

在PrepareReport中,它通知
SQL错误...标记未知ORDER
。订单对应于SQL“order by"。
查看FDMonitor时,宏丢失。

select * from tbl1 where order by id

ResourceOptions.宏创建与宏展开设置为True.
所有嵌入式报表(至少10个)都包含宏。有些已正确添加到多报表中,有些未正确添加。为什么?
我正在使用 Delphi 10.3和Fastreport 6.8企业我等待评论

dtcbnfnu

dtcbnfnu1#

有时需要同时打印一组报表或在一个预览窗口中显示。
FastReport具有将第二个报表添加到已生成报表末尾的方法。TfrxReport.PrepareReport方法具有可选的ClearLastReport布尔参数,默认值为True。此参数为True时,将清除前一个已生成报表的输出。
下面的Pascal代码显示了如何生成包含两个报表的批处理:

frxReport1.LoadFromFile('1.fr3');
frxReport1.PrepareReport;
frxReport1.LoadFromFile('2.fr3');
frxReport1.PrepareReport(False);
frxReport1.ShowPreparedReport;
eimct9ow

eimct9ow2#

如何解决这个问题。您需要做的是,在一个统一的报表中完全控制您的各个报表,对每个报表重复此顺序。

Reporte: TfrxReport;  // multi report

...

rpt := TRptForm001.Create(Self); // Reports to process TRptForm001, TRptForm002..., TRptFormNNN

try       
  // Define filter report...
  rpt.ddFec := Date1;
  rpt.htFec := Date2;
  Rpt.Output := srStream; // The output is made to a TMemoryStream

  Rpt.Report;  // Run individual report

  Reporte.EngineOptions.DestroyForms := False;
  Reporte.EngineOptions.SilentMode := True;
  Reporte.EngineOptions.UseFileCache := True;
  Reporte.EngineOptions.UseGlobalDataSetList := False;
  Reporte.EnabledDataSets.Clear; // Delete any previous dataset
  Reporte.EnabledDataSets.Add(rpt.frxDBDataset1);  // Load dataset(s).(TfrxDBDataset)    
  Reporte.LoadFromStream(rpt.StreamRpt);  // Load stream generated in the rpt
  lOkPrepared := lOkPrepared and Reporte.PrepareReport(lFirst);
finally
  Rpt.CloseData;  // Close the datasets (TFDQuery) of the current report (001, 002, nnn)
  Rpt.Free;
end;

在个别报表中,Rpt001,002,nnn do

case FOutput of
      srStream:
        begin
          lClose := False;  // Dont close (TFDQuery)
          FStreamRpt := TMemoryStream.Create;
          frxrptIndMed.SaveToStream(FStreamRpt);
          FStreamRpt.Position := 0;
        end;

最后时刻

Reporte.ShowPreparedReport;

通过这种方式,您可以将复杂的报表与数据流程统一起来。

相关问题