快速报告非数据库

时间:2014-01-12 18:03:56

标签: delphi reportbuilder fastreport

我一直在使用Report Builder多年,但我厌倦了cha-ching,cha-ching。它是“非数据库”报告的绝佳报告工具。

我已经开始玩Fast Reports了,我对此感到非常慌张。对于复杂的“非数据库”报告而言,它似乎是一个很好的数据库报告工具,但却是一个很大他们的演示和帮助很可怕。

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

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

提前致谢。

4 个答案:

答案 0 :(得分:9)

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

1。定义自定义变量

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

  1. 打开报告设计器
  2. 转到菜单报告/变量 ...
  3. 编辑变量窗口中,单击类别按钮创建一个新类别。然后,您可以按照与您相同的方式重命名类别,例如对于Windows资源管理器中的文件 enter image description here

  4. 然后,您可以通过单击 Variable 按钮声明自定义变量。您可以使用与您相同的方式为变量赋予一些有意义的名称。对于Windows资源管理器中的文件 enter image description here

  5. 然后点击确定按钮保存更改: enter image description here

  6. 然后您将返回到报表设计器,您可以在数据树窗格选项卡变量中找到刚才声明的变量。将变量拖放到报告中: enter image description here

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

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

    2。直接从Delphi代码

    修改报表组件

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

    例如,要在TfrxMemoView报告中找到名称为Memo1的{​​{1}}对象并修改其文字,您可以写信:

    frxReport1

答案 1 :(得分:7)

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

这是我在准备报告之前运行的例行程序。它不仅添加了变量,还添加了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,在运行时,您可以将变量拖放到报表中: enter image description here

并且,如果您已经定义了上述任何功能,它们将显示在功能选项卡下。

答案 2 :(得分:1)

我用这种方法取得了成功:

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

  2. 将内存中的表链接到TfrDataSet。

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

答案 3 :(得分:0)

您可能希望使用NexusDB作为保存报告数据的方法。 NexusDB是一个数据库,除了作为一个完整的客户端服务器数据库,它还可以作为一个完整的内存数据库运行,具有完整的SQL支持,并且在编译到您的应用程序时没有外部dll或任何必需的东西。他们有一个免费的嵌入式版本,将满足您的需求。我把它用于很多东西,老实说,它是你工具箱里的一个很棒的工具。