FastReport,Delphi XE7 - 如何同时使用内部和外部数据集

时间:2016-06-14 09:07:53

标签: delphi fastreport

我有发票的报告。问题是我必须在将报告保存到数据库之前显示报告。为此我将所有数据存储在TVirtualTables中,我将其通过TfrxDBDatasets传递给FastReport。但保存后我想直接从数据库中获取所需的所有数据。为此,我有内部连接和数据集。如何在这些数据集之间切换?

这意味着报告必须使用来自Delphi应用程序传递给它的TfrxDBDatasets中的数据或基于某种条件在FastReport报告中直接从数据库内部获取所需的所有数据(不使用从应用程序传递的TfrxDBDatasets)。

3 个答案:

答案 0 :(得分:1)

您可以定义另一个报告(实际上定义了数据库表)并在运行时加载

明确报告

procedure Clear;

加载其他报告

function LoadFromFile( const FileName: String ; ExceptionIfNotFound:

Boolean = False): Boolean;

这可能吗?

答案 1 :(得分:1)

你那里有很少的方法, 要么只改变TfrxDBDataset的.Data / .DataSource属性 除了TVirtualTable以外的东西 要么 将数据从数据库分配到TVirtualTable:

FDQueryThis.Data := FDQueryOther.Data;

这是FireDac的例子,但我相信Devart有.Assign方法来实现这个目的:

VirtualTable1.Assign(UniQuery1);

此致

答案 2 :(得分:1)

感谢您的回复。我决定尝试自己做。我提出了这个解决方案: 在Delphi表单上放置组件:     TfrxADOComponents,TfrxDBDataset(设置属性"数据集"到您的表或查询),TfsScript,TfsPascal。

两个按钮的代码(一个用于从TfrxDBDataset获取数据,另一个用于在FastReport脚本中获取数据):

procedure TForm2.BtnFromVirtualTablesClick(Sender: TObject);
begin
  frxReport1.PreviewOptions.Maximized := true;
  frxReport1.PreviewOptions.Modal := true;
  frxReport1.LoadFromFile('d:\fastrep\testdanychazaVirtual.fr3');
  frxReport1.Variables['id']:='''0''';
  frxReport1.Variables['ConnStr']:='''''';

  frxReport1.PrepareReport();
  frxReport1.ShowPreparedReport();
end;

procedure TForm2.BtnFromDatabaseClick(Sender: TObject);
begin
  frxReport1.PreviewOptions.Maximized := true;
  frxReport1.PreviewOptions.Modal := true;
  frxReport1.LoadFromFile('d:\fastrep\testVirtual.fr3');
  frxReport1.Variables['id']:='''1''';
  frxReport1.Variables['ConnStr']:=''''+
  'Provider=SQLOLEDB.1;Persist Security Info=True;Initial Catalog='+MSConnection.Database+';'+
    'Data Source='+MSConnection.Server+';User Id='+MSConnection.Username+
    ';Password='+MSConnection.Password+'''';
  frxReport1.PrepareReport();
  frxReport1.ShowPreparedReport();
end;

现在在表格中的FastReport设计师"数据"我们需要两个组件:ADODatabase和ADOQuery。要获取该ADOQuery所需的所有列,您必须设置与数据库的正确连接并打开查询。当fastreport获取所需的所有列时 - 清除ADODatabase1.DatabaseName属性和ADOQuery1.Database属性。应该在事件" frxReport1OnStartReport"中填写这些属性。如果不是 - 有关于未找到与数据库的连接的错误。

我们的报告中还需要两个变量ID,ConnStr(将它们添加到菜单Report-> Variables中)。

这是FastReport Pascal脚本:

procedure frxReport1OnStartReport(Sender: TfrxComponent);
begin             
 if <ID><>'0' then                              
 begin
   ADODatabase1.databaseName:=<ConnStr>;
   ADODatabase1.connected:=true;
   ADOQuery1.database:=ADODatabase1;                                    
   ADOQuery1.open;  
   masterData1.dataset:=ADOQuery1;    
   memo1.memo.text:='[ADOQuery1."id"]';
   memo2.memo.text:='[ADOQuery1."name"]';
  end;
end;

begin

end.

在报告中添加主带并在其上放置两个备忘录并将它们连接到链接到TfrxDBDataset的表 - 它将是默认设置。

使用该解决方案,您可以在任何程序中使用FastReport * .fr3文件。您只需要获取一些ID和连接字符串即可。或者传递填充了所需数据的数据集。