Delphi 非数据库的快速报告

Delphi 非数据库的快速报告,delphi,reportbuilder,fastreport,Delphi,Reportbuilder,Fastreport,我已经使用报表生成器好几年了,但我已经厌倦了cha-ching,cha-ching。对于“非数据库”报告来说,它是一个很好的报告工具 我已经开始玩弄快速报告,对此我感到非常慌乱。对于数据库来说,它似乎是一个很好的报告工具,但对于复杂的“非数据库”报告来说,它是一个大问号。他们的演示和帮助太可怕了 真希望我能拿出一份我正在谈论的报告。该报告是一个串行通信报告,其中包含的操作系统信息当然是单一的。它有4个不同的表,其中安装了串行端口和USB串行设备表。它还有一份摘要备忘录 是否有人在Fast报告中成

我已经使用报表生成器好几年了,但我已经厌倦了cha-ching,cha-ching。对于“非数据库”报告来说,它是一个很好的报告工具

我已经开始玩弄快速报告,对此我感到非常慌乱。对于数据库来说,它似乎是一个很好的报告工具,但对于复杂的“非数据库”报告来说,它是一个大问号。他们的演示和帮助太可怕了

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

是否有人在Fast报告中成功设计了上述配置的报告?是的,我用Fast报告发布了相同的查询。我只是想听听其他的意见


提前感谢。

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

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


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

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

1.定义自定义变量 @jrodenhi给出的答案显示了如何在代码中添加报表变量。我将在这里演示如何在报表设计器中定义它们

  • 打开报表设计器
  • 转到菜单报告/变量
  • 在“编辑变量”窗口中,通过单击“类别”按钮创建新类别。然后,您可以使用与重命名相同的方式重命名类别,例如,对于Windows资源管理器中的文件:

  • 然后,您可以通过单击变量按钮来声明自定义变量。您可以使用与您相同的方式为变量指定一些有意义的名称,例如,对于Windows资源管理器中的文件:

  • 在此之后,单击“确定”按钮保存更改:

  • 然后回到报表设计器,在那里可以在数据树窗格选项卡变量中找到刚刚声明的变量,从中可以将变量拖放到报表中:

  • 优化所有组件位置和属性后,可以关闭报表设计器并返回DelphiIDE。在那里,您可以为报表的
    OnGetValue
    事件编写处理程序,如果其
    VarName
    参数等于您的变量,请将其
    参数更改为要给关联报表组件的值:

  • 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;
    

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

    我用这种方法很成功:

  • 使用内存中的表,如TkbmMemTable、TdxMemTable或任何内存中的表

  • 将内存中的表链接到TfrDataSet

  • 使用常用的TDataset方法填充内存中的表并运行报告


  • 您是否知道可以从Delphi代码访问报表控件?因此,即使您希望避免使用数据集(即使它们可能只是内存表中的数据集),您仍然可以“手动”填充这些控件。是的,我知道这一点,并且我已经尝试了世界上的所有技巧来访问这些控件。也许你有这方面的知识。如果是的话,请告诉我。只需要知道如何在备忘录控件中放置文本。我尝试了TfrxMemoView(FindComponent('Memo1')。Memo。每个都产生了一个错误。顺便说一句,我在Delphi有14年的经验,所以我不是新手。例如,可以为您提供一个如何访问报表控件的起点。。。(您需要搜索报表上的控件,而不是报表的父控件;而不是
    TComponent.FindComponent
    使用
    TfrxReport.FindObject
    )。这就成功了。TfrxMemoView(frxReport1.FindObject('Memo4')).Memo.Text:=“您好”;谢谢。如果您想要积分,请提交您的评论作为答案,好吗。也许您可以使用内存中的表或sql Server为报表准备数据?您可以说“拖放变量”;有没有办法为这些变量指定组件类型?我的意思是,我们是否可以明确选择某个变量的条形码组件
    var
      Component: TfrxComponent;
    begin
      Component := frxReport1.FindObject('Memo1');
    
      if Component is TfrxMemoView then
        TfrxMemoView(Component).Memo.Text := 'New text';
    end;