Delphi 非数据库的快速报告
我已经使用报表生成器好几年了,但我已经厌倦了cha-ching,cha-ching。对于“非数据库”报告来说,它是一个很好的报告工具 我已经开始玩弄快速报告,对此我感到非常慌乱。对于数据库来说,它似乎是一个很好的报告工具,但对于复杂的“非数据库”报告来说,它是一个大问号。他们的演示和帮助太可怕了 真希望我能拿出一份我正在谈论的报告。该报告是一个串行通信报告,其中包含的操作系统信息当然是单一的。它有4个不同的表,其中安装了串行端口和USB串行设备表。它还有一份摘要备忘录 是否有人在Fast报告中成功设计了上述配置的报告?是的,我用Fast报告发布了相同的查询。我只是想听听其他的意见Delphi 非数据库的快速报告,delphi,reportbuilder,fastreport,Delphi,Reportbuilder,Fastreport,我已经使用报表生成器好几年了,但我已经厌倦了cha-ching,cha-ching。对于“非数据库”报告来说,它是一个很好的报告工具 我已经开始玩弄快速报告,对此我感到非常慌乱。对于数据库来说,它似乎是一个很好的报告工具,但对于复杂的“非数据库”报告来说,它是一个大问号。他们的演示和帮助太可怕了 真希望我能拿出一份我正在谈论的报告。该报告是一个串行通信报告,其中包含的操作系统信息当然是单一的。它有4个不同的表,其中安装了串行端口和USB串行设备表。它还有一份摘要备忘录 是否有人在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给出的答案显示了如何在代码中添加报表变量。我将在这里演示如何在报表设计器中定义它们
OnGetValue
事件编写处理程序,如果其VarName
参数等于您的变量,请将其值
参数更改为要给关联报表组件的值: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或任何东西。他们有一个免费的嵌入式版本,可以满足您的需要。我用它做很多事情,它真的是你工具箱里的一个很棒的工具。我用这种方法很成功:
您是否知道可以从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;