【问题标题】:Fast Reports Non Database快速报告非数据库
【发布时间】:2014-01-12 18:03:56
【问题描述】:

我已经使用 Report Builder 几年了,但我已经厌倦了 cha-ching,cha-ching。它是用于“非数据库”报告的出色报告工具。

我已经开始使用 Fast Reports 了,对此我感到非常困惑。它似乎是一个很棒的数据库报告工具,但对于复杂的“非数据库”报告来说却是个大问号。他们的演示和帮助很糟糕。

希望我能展示我正在谈论的报告。该报告是具有操作系统信息的串行通信报告,其本质上当然是单一的。它有 4 个不同的表,分别安装了串行端口和 USB 串行设备表。它还有一个摘要备忘录。

有没有人在Fast Reports 中成功设计了上述配置的报告?是的,我已经使用快速报告发布了相同的查询。只是想要其他意见。

提前致谢。

【问题讨论】:

  • 您知道您可以从 Delphi 代码访问报表控件吗?因此,即使您想避免使用数据集(即使它们可能只是内存中的表),您仍然可以“手动”填充这些控件。
  • 是的,我知道这一点,并且我已经尝试了世界上所有的技巧来访问这些控件。也许你有这样做的知识。如果有,请赐教。只需要知道如何在备忘录控件中放置文本。我试过 TfrxMemoView(FindComponent('Memo1').Memo. 都报错。顺便说一句,我在 Delphi 有 14 年的经验,所以我不是菜鸟。
  • 例如this post 可以为您提供如何访问报表控件的起点...(您需要在报表上搜索控件,而不是在报表的父级上搜索;而不是@987654323 @使用TfrxReport.FindObject)。
  • 成功了。 TfrxMemoView(frxReport1.FindObject('Memo4')).Memo.Text := 'Hello';谢谢。如果你想要功劳,请提交你的 cmets 作为答案,好的。
  • 也许您可以使用内存表甚至 sql-servers 来为报告准备数据?

标签: delphi reportbuilder fastreport


【解决方案1】:

我已经扩展了@jrodenhi 的答案提供的选项,这似乎是做你想做的事情的正确方法(因此我将此答案设为社区 wiki)。所以这里有两个你可以使用的选项(我认为会有更多):

1。定义自定义变量

@jrodenhi 的回答显示了如何在代码中添加报告变量。我将尝试在这里展示如何在报表设计器中定义它们。

  1. 打开报表设计器
  2. 转到菜单报告/变量...
  3. 在编辑变量窗口中,通过单击类别按钮创建一个新类别。然后你可以像你一样重命名类别,例如对于 Windows 资源管理器中的文件:

  4. 然后您可以通过单击变量按钮来声明自定义变量。你可以给变量一些有意义的名字,就像你做的一样,例如对于 Windows 资源管理器中的文件:

  5. 在此之后单击 确定 按钮保存您的更改:

  6. 然后您将返回报表设计器,您可以在 Data Tree 窗格选项卡 Variables 中找到刚刚声明的变量。将变量拖放到报告中:

  7. 优化所有组件位置和属性后,您可以关闭报表设计器并返回到 Delphi IDE。在那里,您可以为您的报告的OnGetValue 事件编写一个处理程序,如果它的VarName 参数等于您的变量,请将其Value 参数更改为您要赋予相关报告组件的值:

procedure TForm1.frxReport1GetValue(const VarName: string; var Value: Variant);
begin
  if VarName = 'MyVariable' then
    Value := 'This is a new value!';
end;

2。直接从 Delphi 代码修改报表组件

有一个选项可以从您的 Delphi 代码中直接访问报表组件。例如,要按名称查找某个报表组件,您可以使用TfrxReport 对象的FindObject 方法。然后,您可以按照通常的模式检查返回的引用是否属于您要访问的控件的类型,如果是,您可以像往常一样通过类型转换来访问实例。

例如,在frxReport1 报告中查找名称为Memo1 的TfrxMemoView 对象并修改您可以编写的文本:

var
  Component: TfrxComponent;
begin
  Component := frxReport1.FindObject('Memo1');

  if Component is TfrxMemoView then
    TfrxMemoView(Component).Memo.Text := 'New text';
end;

【讨论】:

  • 干得好!值得包含在非官方的 FastReports 用户指南中。感谢您提供有关在报表设计器中创建变量的提示。
  • 谢谢!但是我已经从其他答案中学会了使用变量,如果您接受它,我会很高兴。
  • 我会接受你的回答,但我想 OP 必须接受它。也许他会在一两天内得到推动,重新审视这个问题并接受答案。
  • 你救了我的生命伴侣,关于 VCL FR 的最伟大的文档之一 :)
【解决方案2】:

我写的大部分报告都是关于工资单的。除了构成报告主体的基于表格的数据外,通常还有大量的单一数据,例如用户和雇主信息,这些数据通常最容易输入为从运行的过滤器对话框中提取的一系列变量报告前。过滤器运行后,我将遍历其所有变量并将它们添加到报告变量中。也许你可以选择你的奇异系统变量并做同样的事情。

这是我在准备报告之前运行的例程。它不仅添加了变量,还添加了 Delphi 中定义的可以在报表中使用的函数:

procedure TFastReportDriver.SetVariables(sVariables: String; var frxReport: TfrxReport);
var i,
    iDetail: Integer;
    sl: TStringList;
    sVariable,
    sValue: String;
begin
  sl := TStringList.Create;
  sl.CommaText := sVariables;
  frxReport.Variables.Clear;
  frxReport.Variables[' Filter'] := Null;
  for i := 0 to sl.Count - 1 do begin
    sVariable := sl.Names[i];
    sValue := Qtd(sl.ValueFromIndex[i]);
    frxReport.Variables.AddVariable('Filter', sVariable, sValue);
  end;
  frxReport.AddFunction('procedure CreateCheck(hPaystub, iCheckNo: Integer)');
  frxReport.AddFunction('function NumberToWords(cAmount: Currency): String');
  frxReport.OnUserFunction := repChecksUserFunction;
  sl.Free;
end;

然后,在您的代码中,您调用 frxReport.DesignReport 并且在运行时您可以将变量拖放到您的报告中:

而且,如果您定义了上述任何函数,它们会显示在函数选项卡下。

【讨论】:

  • 你说“拖放变量”;有没有办法为这些变量指定组件类型?我的意思是,我们可以明确选择例如某个变量的条形码组件(反之亦然,将变量绑定到条形码组件)? [抱歉打扰,我现在手头没有FR:-)]
  • 我还没有使用条形码。当您为它提供合适的字符串时,是否有一个组件可以生成合适的条形码?我还没有用图片(比如薪水上的标志)尝试过这个。它适用于字符串、数字和日期。变量都是变体。
  • 我找不到任何方法来显式选择(或以后以某种方式绑定)要用于变量的组件。它似乎总是使用TfrxMemoView 组件...
  • 你可以只使用 [myVariable] 作为 TfrxBarCodeView 的内容
  • @TLama 差不多,我认为 FastReport 使用方括号 [] 而不是尖括号
【解决方案3】:

我已经用这个方法成功了:

  1. 使用内存表,例如 TkbmMemTable、TdxMemTable 或任何内存表。

  2. 将内存表链接到 TfrDataSet。

  3. 使用常用的 TDataset 方法填充内存表并运行报告。

【讨论】:

    【解决方案4】:

    您可能想看看使用 NexusDB 作为保存报告数据的一种方式。 NexusDB 是一个数据库,它除了是一个完整的客户端服务器数据库外,还可以作为一个完全内存数据库运行,具有完整的 SQL 支持,并且在编译到您的应用程序时不需要外部 dll 或任何所需的东西。他们有一个免费的嵌入式版本,可以满足您的需求。我用它来做很多事情,老实说,它是您工具箱中的绝佳工具。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      相关资源
      最近更新 更多