康虎云报表如何实现在页头(或主数据栏)中显示明细表的合计值

admin 2023-3-9 35155

      有一些业务场景需要在表头(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.


代码里已经有比较详细的注释了,大家仔细研读一下。


示例模板和测试数据在附件中。





上传的附件:
最新回复 (0)
返回