如何在FastReport中动态分配数据集?

10

我使用FastReport Designer创建了一份报告,并在Delphi 6中调用它。但是,MasterData和字段的DataSet在设计时未被分配。我想根据所选的DataSet在运行时设置这些属性。我该怎么做?在预览/打印/设计之前,如何在Delphi中访问MasterDataDataSet?请在frxReport1BeforePrint中添加以下代码。

  t := frxReport1.FindObject('MasterData1') as TfrxMasterData;
  //if Assigned(t) then
    //t.DataSet := frxIBODataset1;

  m := frxReport1.FindObject('mTenderType') as TfrxMemoView;
  if Assigned(m) then
  begin
    m.DataSet := frxIBODataset1;
    m.DataField := 'ACCOUNTNAME';
    m.Text := '[frxIBODataset1."ACCOUNTNAME"]';
  end;

但是在调用打印/设计/预览之前,我需要设置这些属性。非常感谢您的帮助。

2个回答

2
您首先需要确定您是要使用应用程序中定义的数据集还是直接在报表中定义的数据集(FastReport设计器中的Data选项卡)?
如果您想使用应用程序内定义的数据集(例如,在其中一个数据模块中定义的AdoDataset实例),则无需动态地将MasterBand绑定到您的数据集。在报表中,您的MasterBand在设计时绑定到TfrxDbDataset实例。在运行时,您的frxDbDataset实例可以连接到项目中的任何数据集。
具体步骤如下:
1. 在您的窗体或数据模块中放置一个frxReport组件和一个frxDbDataset组件。 2. 在报表设计器中,进入“数据集”部分,并将可用的frxDbDataset添加到报表的数据集列表中。 3. 添加主数据区域,并将frxDbDataset分配给其数据集属性。 4. 现在,在显示或准备报表之前,您可以编写以下代码:
  if MyOption = 1 then
    frxDbDataset1.Dataset := AdoDataset1
  else
    frxDbDataset1.Dataset := AdoDataset2;

无论您分配给frxDbDataset的内容是什么,都将由报表中的主数据带打印出来。

如果您直接在FastReport设计器中定义数据集,则所有内容都在报表中。只需打开FastReport设计器并执行以下操作:

1- 转到“数据”选项卡并定义您的数据集(例如AdoQuery1)。 2- 从报表树窗格中选择报表对象。 3- 在对象检查器中转到“事件”选项卡。 4- 选择适当的事件;对于您的工作,OnStartReport是一个不错的事件。双击它以打开代码编辑器。 5- 现在,您可以使用PascalScript代码将在数据选项卡中定义的数据集分配给主数据带。类似于以下内容:

procedure frxReport1OnStartReport(Sender: TfrxComponent);
begin
  MasterData1.Dataset := <ADOQuery1."ADOQuery1">;      
end;

你的解决方案在使用FastReports4/delphi XE2时无法正常工作。如果我设置StartNewPage,我可以看到该带被打印多次,但是我无法在其中看到任何数据。是否有其他步骤来为其定义字段(动态定义,忽略数据类型)? - ertx

0
如果您正在使用FastReport 3+,那么您可以在报表中放置数据库组件内部。您只需要提供数据库连接并从应用程序运行设计器即可。
您可以定义变量,将它们从应用程序传递并运行您的.fr3报表文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接