我的公司要求我更新用delphi编写的特定应用程序的报告功能,并使用快速报告代替使用FastReports。
当前实现将所有数据从数据库中提取出来,为组织和计算报告所需的数据做了大量工作,并将所有这些数据存储在几个不同的对象中。然后使用快速报告OnNeedData事件来填充波段,直到没有更多数据(通过设置MoreData = false表示)
我遇到的问题是Fast Reports似乎需要一个频段连接到一个我没有的实际数据源。此外,fastReports似乎没有类似于OnNeedData的事件。
无论如何要在代码中填写数据带的值并重新打印,直到打印完所有数据而不将带连接到数据集?
我为这个问题的模糊性道歉,我对报告软件非常陌生,任何建议去哪里以及看什么都会非常感激。
答案 0 :(得分:7)
快速报告使用从_TFrxDataSet降序的中介对象连接报告引擎,该报告引擎将打印数据。
要将报表连接到由程序本身管理的数据源,可以使用TfrxUserDataSet组件,让您在报表中看到数据集,但是您可以手动指定列中的列名称。字段(TStrings)属性和管理和提供值以编程方式为以下事件编写事件处理程序:
如您所见,行/列概念(DataSet)用于向报表提供数据,但您可以从用于存储计算结果的任何结构中提取数据(列表,数组或任何其他对象/结构/文件等。)
在报告中,您将频段链接到此逻辑 DataSet ,并使用标准组件打印此 DataSet 的列值。
如果您已经在DataSet中拥有数据,例如计算后的内存中DataSet,那么最好使用TfrxDBDataset直接将报表绑定到该数据源。
答案 1 :(得分:2)
你可以使用TfrxUserDataSet。在'demos'文件夹下有一个名为'printstringlist'的演示。
答案 2 :(得分:2)
在我们的项目中,我们实现了自己继承自TfrxCustomQuery的类。这个新的查询类只是将其SQL语句重定向到我们的应用程序的内部查询引擎。我们在FastReport调色板中注册了这个新类(FR版本3和4使用了frxDsgnIntf.frxObjects.RegisterObject *),现在它在我们所有的报告模板中使用,而不是TfrxADOQuery或其他内置数据集类。
答案 3 :(得分:1)
这是另一种选择:
我多年来一直在使用FastReport。我有时遇到类似的情况。对于离线表格报告,我使用内存数据集。我很久以前就购买了DevExpress,所以我有TdxMemData。但即使没有它,您也应该对使用TClientDataset组件感到满意。
除此之外,TfrxUserDataset是我在显示对象列表时使用的替代方法。
答案 4 :(得分: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;
问候
赫尔曼