我有发票的报告。问题是我必须在将报告保存到数据库之前显示报告。为此我将所有数据存储在TVirtualTables中,我将其通过TfrxDBDatasets传递给FastReport。但保存后我想直接从数据库中获取所需的所有数据。为此,我有内部连接和数据集。如何在这些数据集之间切换?
这意味着报告必须使用来自Delphi应用程序传递给它的TfrxDBDatasets中的数据或基于某种条件在FastReport报告中直接从数据库内部获取所需的所有数据(不使用从应用程序传递的TfrxDBDatasets)。
答案 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和连接字符串即可。或者传递填充了所需数据的数据集。