【问题标题】:How to create a report using fast Reports with out connecting directly to a database如何在不直接连接到数据库的情况下使用快速报告创建报告
【发布时间】:2012-12-04 04:41:45
【问题描述】:

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

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

我遇到的问题是 Fast Reports 似乎需要一个频段来连接到我没有的实际数据源。另外 fastReports 似乎没有类似 OnNeedData 的事件。

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

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

【问题讨论】:

    标签: delphi fastreport quickreports


    【解决方案1】:

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

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

    • OnCheckEOF 在功能上等同于 OnNeedData,如果没有要打印的内容,则将 EOF var 参数设置为 true
    • OnFirst 您可以开始为数据步行。
    • OnGetValueOnNewGetValue 您为当前行的每个不同提供值
    • OnNextOnPrior您将当前行移到下一个或上一个位置。

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

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

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

    【讨论】:

    • 谢谢 这真的很有用
    • @jachguate,你有解决这个快速报告网格显示问题的方法吗link
    • 我发了simple example
    【解决方案2】:

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

    【讨论】:

    • 也许可以改为评论。
    • 这是一个完全有效的答案
    • 感谢演示应该很有用
    【解决方案3】:

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

    【讨论】:

    • 我正在使用您引用的方式开发一个组件,在新组件内部我使用 TClientDataSet 打开查询,我正在添加参数、连接等功能,谢谢
    【解决方案4】:

    这是另一种选择:

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

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

    【讨论】:

      【解决方案5】:

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

      代码:-

      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;
      

      问候
      赫尔曼

      【讨论】:

        猜你喜欢
        • 2011-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-24
        相关资源
        最近更新 更多