6

我的公司要求我更新一个用 delphi 编写的特定应用程序的报告功能,并使用快速报告来改用 FastReports。

当前的实现将所有数据从数据库中提取出来,做了大量工作来组织和计算报告所需的数据,并将所有这些数据存储在几个不同的对象中。然后使用快速报告 OnNeedData 事件来填充波段,直到没有更多数据(通过设置 MoreData = false 表示)

我遇到的问题是快速报告似乎需要一个乐队来连接到我没有的实际数据源。此外,fastReports 似乎没有类似于 OnNeedData 的事件。

无论如何要在代码中填写数据带的值并让它再次打印,直到打印所有数据而不将带连接到数据集?

我为这个问题的含糊性表示道歉,我对报告软件非常陌生,任何关于去哪里和看什么的建议都将不胜感激。

4

5 回答 5

7

快速报表使用从 _TFrxDataSet 下降的中间对象来连接它打印数据的报表引擎。

要将报表连接到由程序本身管理的数据源,您可以使用 TfrxUserDataSet 组件,它可以让您在报表中查看数据集,但是您可以在 Fields (TStrings) 属性中手动指定列名并管理和提供值以编程方式为以下事件编写事件处理程序:

  • OnCheckEOF在功能上等同于 OnNeedData,如果没有要打印的内容,则将 EOF var 参数设置为 true
  • OnFirst你做任何你必须做的事情来开始为数据走动。
  • OnGetValueOnNewGetValue当前行的每个不同提供值
  • OnNext , OnPrior您将当前行移动到下一个或前一个位置。

如您所见,行/列概念(DataSet)用于向报表提供数据,但您可以从用于存储计算结果的任何结构(列表、数组或任何其他对象)中提取数据/结构/文件等)

在报表内部,您将带区链接到此逻辑DataSet并使用标准组件打印此DataSet的列

如果您已经在 DataSet 中拥有数据,例如计算后的内存中 DataSet,最好使用 TfrxDBDataset 将您的报表直接绑定到该数据源。

于 2012-12-17T06:15:17.960 回答
2

您可以使用 TfrxUserDataSet。在“demos”文件夹下有一个名为“printstringlist”的演示。

于 2012-12-17T04:40:34.837 回答
2

在我们的项目中,我们实现了我们自己的继承自 TfrxCustomQuery 的类。这个新的查询类只是将其 SQL 语句重定向到我们应用程序的内部查询引擎。我们在 FastReport 调色板中注册了这个新类(在 FR 版本 3 和 4 中使用了 frxDsgnIntf​​.frxObjects.RegisterObject*),现在它用于我们所有的报告模板,而不是 TfrxADOQuery 或其他内置数据集类。

于 2012-12-17T06:29:26.943 回答
1

这是另一种选择:

我已经使用 FastReport 多年了。我有时会遇到类似的情况。对于离线表格报告,我使用内存数据集。我很久以前购买了 DevExpress,所以我有 TdxMemData。但即使没有它,您也应该对使用 TClientDataset 组件感到满意。

除此之外,TfrxUserDataset 是我在显示对象列表时使用的替代方法。

于 2012-12-17T07:17:47.933 回答
0

有可能这样做,虽然它很慢,

代码:-

var
  FRX: TfrxReport;
procedure NewPage;
begin
  MyPage := TfrxReportPage.Create(FRX);
  MyPage.CreateUniqueName;
  MyPage.PaperSize := DMPAPER_A4;
end;
procedure ...(AText: string);
var
  frMemo : TfrxMemoView;
begin
  frMemo := TfrxMemoView.Create(MyPage);
  frMemo.CreateUniqueName;
  frMemo.Text := AText;
end;

问候
赫尔曼

于 2015-01-31T10:09:32.350 回答