有一些业务场景需要在表头(Header或Master数据栏)中显示明细记录的合计值。按常规方法是难以实现这种需求的,因为:
康虎报表是从上到下渲染的,常规状态下,在渲染到页尾时才能计算出合计值,无法把合计再显示到页头位置。
要解决这个问题,需要启用两遍过程并配合脚本实现。
先上代码和示例模板,后面有空再来补充截图
var
List: TStringList; //List变量用来存储每页合计值
i: Integer; //i变量是记录存储值的序号
procedure stock_movereviewed_dateOnBeforePrint(Sender: TfrxComponent);
var D1,D2: TDataSet;
begin
D1 := TfrxDBDataSet(Report.GetDataSet('rl_invoicing_application_line')).DataSet;
D2 := TfrxDBDataSet(Report.GetDataSet('stock_move')).DataSet;
D2.Locate('id', D1.FieldByName('stock_move_id').Value, 0);
end;
procedure sale_ordercontract_numOnBeforePrint(Sender: TfrxComponent);
var D1,D2: TDataSet;
begin
D1 := TfrxDBDataSet(Report.GetDataSet('rl_invoicing_application_line')).DataSet;
D2 := TfrxDBDataSet(Report.GetDataSet('sale_order')).DataSet;
D2.Locate('id', D1.FieldByName('sale_order_id').Value, 0);
end;
procedure stock_pickingnameOnBeforePrint(Sender: TfrxComponent);
var D1,D2,D3: TDataSet;
begin
D1 := TfrxDBDataSet(Report.GetDataSet('rl_invoicing_application_line')).DataSet;
D2 := TfrxDBDataSet(Report.GetDataSet('stock_move')).DataSet;
D3 := TfrxDBDataSet(Report.GetDataSet('stock_picking')).DataSet;
D2.Locate('id', D1.FieldByName('stock_move_id').Value, 0);
D3.Locate('id', D2.FieldByName('picking_id').Value, 0);
end;
procedure Memo17OnBeforePrint(Sender: TfrxComponent);
var D1,D2: TDataSet;
begin
D1 := TfrxDBDataSet(Report.GetDataSet('rl_invoicing_application')).DataSet;
D2 := TfrxDBDataSet(Report.GetDataSet('rl_invoicing_application_line')).DataSet;
D1.Locate('id', D2.FieldByName('order_id').Value, 0);
end;
{在主数据栏显示明细数据栏中字段合计值 开始}
//因为康虎报表是从上到下渲染的,常规状态下,在渲染到页尾时才能计算出合计值,
//所以采用两遍过程方式,第一遍时先计算出合计值,第二遍时把前面计算的合计值显示出来
//
//打开两遍过程方法:
// 从顶部菜单: 报表 --> 选项 --> 常规,对话框中“常规”里面勾选“两遍过程”
procedure OnStartReport(Sender: TfrxComponent);
begin
List := TStringList.Create(); //创建List变量
end;
procedure OnStopReport(Sender: TfrxComponent);
begin
List.Free; //销毁List变量
end;
procedure Page1OnBeforePrint(Sender: TfrxComponent);
begin
i := 0;
end;
procedure Memo16OnAfterData(Sender: TfrxComponent);
begin
//第一遍过程时,记录Footer栏中每个合计值
if not Engine.FinalPass then
List.Add(Memo16.Text);
end;
procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
//第二遍过程时,从List中取出合计值显示在Memo17中
if Engine.FinalPass then
begin
Memo17.Text := List[i];
Inc(i);
end;
end;
{在主数据栏显示明细数据栏中字段合计值 结束}
begin
end.
代码里已经有比较详细的注释了,大家仔细研读一下。
示例模板和测试数据在附件中。