一个支持横向单元格隐藏的报表(销售订单)

admin 2019-1-10 13880

这是一家做服装销售的客户提出如下需求:

1、横向单元格中有一系列尺码格子,由于预定的尺码比较多(XXS~8XL),但要求如果某一尺码在整个报表中都无值,则把这些尺码格式隐藏;

2、要求每页固定行数,不足行的页面用空白行补足;

3、每页都显示MasterData栏;


这些需求之前都有贴过文章,该客户是把这些需求合到一起,因此实现报表模板如下:

模板样式


预览效果


报表脚本:

var
  _lastRecNo: Integer = 0;  //记录最近一条记录在MasterData中的记录号
  LastCol: Integer = 19;  //最后一行的序号(该值固定   )
  HasVal: array[0..13] of Integer;   //存储存储每个尺码是否有值的数组
  Idx: Integer;
  PageLine: integer;      //记录当前打印到第几行
  PageMaxRow: integer = 10; //设定每页行数
procedure DetailData1OnBeforePrint(Sender: TfrxComponent);
var
  I:Integer;
begin
  if not Engine.FinalPass then
  begin
    if (<SaleOrderLine."XXS"> > 0) then HasVal[0] := 1;
    if (<SaleOrderLine."XS"> > 0) then HasVal[1] := 1;
    if (<SaleOrderLine."S"> > 0) then HasVal[2] := 1;
    if (<SaleOrderLine."M"> > 0) then HasVal[3] := 1;
    if (<SaleOrderLine."L"> > 0) then HasVal[4] := 1;
    if (<SaleOrderLine."XL"> > 0) then HasVal[5] := 1;
    if (<SaleOrderLine."XXL"> > 0) then HasVal[6] := 1;
    if (<SaleOrderLine."3SXL"> > 0) then HasVal[7] := 1;
    if (<SaleOrderLine."4SXL"> > 0) then HasVal[8] := 1;
    if (<SaleOrderLine."5SXL"> > 0) then HasVal[9] := 1;
    if (<SaleOrderLine."6SXL"> > 0) then HasVal[10] := 1;
    if (<SaleOrderLine."7SXL"> > 0) then HasVal[11] := 1;
    if (<SaleOrderLine."8SXL"> > 0) then HasVal[12] := 1;
  end;
  PageLine := <line> mod PageMaxRow;
  if (PageLine = 1) and (<line> > 1) then
    Engine.newpage;
end;
procedure Page1OnBeforePrint(Sender: TfrxComponent);
var
  I, J: Integer;
  mem1, mem2, mem3, mem4, mem5, mem6: TfrxMemoView;
begin
  if Engine.FinalPass then
  begin
    for I:=12 downto 0 do
    begin
     //如果当前尺码都无值,则隐藏该尺码表头和内容框
     if HasVal[I]<>1 then
     begin
       mem1 := TfrxMemoView(Report.FindObject('Memo_'+IntToStr(I+1)));
       mem1.Visible := False;
       mem3 := TfrxMemoView(Report.FindObject('Val_'+IntToStr(I+1)));
       mem3.Visible := False;
       mem5 := TfrxMemoView(Report.FindObject('Val_c_'+IntToStr(I+1)));
       mem5.Visible := False;
       for J:=I to LastCol-1 do
       begin
         mem2 := TfrxMemoView(Report.FindObject('Memo_'+IntToStr(J+1)));
         if mem2.Visible=True then
           mem2.Left := mem2.Left - mem1.width;
         mem4 := TfrxMemoView(Report.FindObject('Val_'+IntToStr(J+1)));
         if mem4.Visible=True then
           mem4.Left := mem4.Left - mem3.width;
         mem6 := TfrxMemoView(Report.FindObject('Val_c_'+IntToStr(J+1)));
         if mem6.Visible=True then
           mem6.Left := mem6.Left - mem5.width;
       end;
     end;
    end;
  end;
end;
procedure PageHeader1OnAfterPrint(Sender: TfrxComponent);
begin
  try
    if(<Page> <= 1) then MasterData1.DataSet.First();  //刚开始时游标可能不在第一条记录,需要重置一下\
    //当最近一条记录号与当前MasterData中的记录号相同时,表示同一条记录自动分页
    //然后就强制显示MasterData1
    if (<Page> > 1) and (_lastRecNo = MasterData1.DataSet.RecNo) then Engine.ShowBand(MasterData1);
    _lastRecNo := MasterData1.DataSet.RecNo;  //记录一下最近一条记录的记录号
  except
    //showmessage('Error!')
  end;
end;
procedure Footer1OnBeforePrint(Sender: TfrxComponent);
var
  i: integer;
begin
  i := iif(PageLine=0, PageMaxRow, PageLine);
  while i < PageMaxRow do begin
    i := i + 1;
    Engine.ShowBand(Child1);  //打印空白表格(行)    
  end;
end;
  
begin
  //初始化可隐藏单元格的是否隐藏标志
  for Idx:=0 to 12 do
    HasVal[Idx] := 0;
end.


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