康虎云报表中动态显示(打印)表格列的一个示例(JScript 和 PsacalScript)

admin 2022-3-24 19123

在某些行业,可能会遇到需要根据某些情况而动态显示或隐藏某一些列,例如在服装行业,在服装统计表格中隐藏那些数量为0的尺码单元格。模板如下图:

在这个模板中,把所有尺码都布局上(XXS、XS、S、M、L、XL、XX、3XL、4XL、5XL、6XL、7XL、8XL),但实际中那些特大尺码往往是不生产的,当统计报表中对于不生产的尺码则隐藏对应在的列。

这种情况,可以通过编写报表脚本来实现。步骤如下:

一、先按常规方法设计该模板


二、在编写脚本代码。

康虎云报表支持PascalScript、C++Script、BasicScript和JScript四种语法的脚本,这次我先以JScript编写(应用户申请),在文章后面再贴上PascalScript的脚本。


1、在设计器中,切换到代码页,并在右侧语言选择框选择JScript,然后在代码区输入以下代码:

var LastCol = 19;  //最后一行的序号(该值固定   )
var HasVal = [0,0,0,0,0,0,0,0,0,0,0,0,0,0];    //存储存储每个尺码是否有值的数组
var Idx;


2、再切换到Page1(模板页),点击“DetailData1”栏,然后在左侧事件窗口中双击OnBeforePrint后面空白处,会自动生成 DetailData1OnBeforePrint事件函数:

3、在DetailData1OnBeforePrint事件函数中填写:

function DetailData1OnBeforePrint(Sender)
{
  if(!Engine.FinalPass) {
    if (<详情信息."尺码XXS"> > 0) HasVal[0] = 1;
    if (<详情信息."尺码XS"> > 0) HasVal[1] = 1;
    if (<详情信息."尺码S"> > 0) HasVal[2] = 1;
    if (<详情信息."尺码M"> > 0) HasVal[3] = 1;
    if (<详情信息."尺码L"> > 0) HasVal[4] = 1;
    if (<详情信息."尺码XL"> > 0) HasVal[5] = 1;
    if (<详情信息."尺码XXL"> > 0) HasVal[6] = 1;
    if (<详情信息."尺码3SXL"> > 0) HasVal[7] = 1;
    if (<详情信息."尺码4SXL"> > 0) HasVal[8] = 1;
    if (<详情信息."尺码5SXL"> > 0) HasVal[9] = 1;
    if (<详情信息."尺码6SXL"> > 0) HasVal[10] = 1;
    if (<详情信息."尺码7SXL"> > 0) HasVal[11] = 1;
    if (<详情信息."尺码8SXL"> > 0) HasVal[12] = 1;
  }
}


4、在左侧Page1组件窗口中选中Page1,然后事件窗口中双击OnBeforePrint后面空白处生成事件函数 Page1OnBeforePrint:


5、在Page1OnBeforePrint事件函数中填写内容:

function Page1OnBeforePrint(Sender)
{
  if (Engine.FinalPass) {
    for(i=13; i>=0; i--){
      //如果当前尺码都无值,则隐藏该尺码表头和内容框
      if(HasVal[i] != 1){
        var mem1 = TfrxMemoView(Report.FindObject("Memo_"+IntToStr(i+1)));
        mem1.Visible = false;
        var mem3 = TfrxMemoView(Report.FindObject("Val_"+IntToStr(i+1)));
        mem3.Visible = false;
        for(j=i; j<LastCol-1; j++){
          var mem2 = TfrxMemoView(Report.FindObject("Memo_"+IntToStr(j+1)));
          if(mem2.Visible){
            mem2.Left = mem2.Left - mem1.width;
          }
          var mem4 = TfrxMemoView(Report.FindObject("Val_"+IntToStr(j+1)));
          if(mem4.Visible){
            mem4.Left = mem4.Left - mem3.width;
          }
        }
      }
    }
  }  
}


6、然后预览效果:


7、完整脚本如下:

var LastCol = 19;  //最后一行的序号(该值固定   )
var HasVal = [0,0,0,0,0,0,0,0,0,0,0,0,0,0];    //存储存储每个尺码是否有值的数组
var Idx;
function DetailData1OnBeforePrint(Sender)
{
  if(!Engine.FinalPass) {
    if (<详情信息."尺码XXS"> > 0) HasVal[0] = 1;
    if (<详情信息."尺码XS"> > 0) HasVal[1] = 1;
    if (<详情信息."尺码S"> > 0) HasVal[2] = 1;
    if (<详情信息."尺码M"> > 0) HasVal[3] = 1;
    if (<详情信息."尺码L"> > 0) HasVal[4] = 1;
    if (<详情信息."尺码XL"> > 0) HasVal[5] = 1;
    if (<详情信息."尺码XXL"> > 0) HasVal[6] = 1;
    if (<详情信息."尺码3SXL"> > 0) HasVal[7] = 1;
    if (<详情信息."尺码4SXL"> > 0) HasVal[8] = 1;
    if (<详情信息."尺码5SXL"> > 0) HasVal[9] = 1;
    if (<详情信息."尺码6SXL"> > 0) HasVal[10] = 1;
    if (<详情信息."尺码7SXL"> > 0) HasVal[11] = 1;
    if (<详情信息."尺码8SXL"> > 0) HasVal[12] = 1;
  }
}
function Page1OnBeforePrint(Sender)
{
  if (Engine.FinalPass) {
    for(i=13; i>=0; i--){
      //如果当前尺码都无值,则隐藏该尺码表头和内容框
      if(HasVal[i] != 1){
        var mem1 = TfrxMemoView(Report.FindObject("Memo_"+IntToStr(i+1)));
        mem1.Visible = false;
        var mem3 = TfrxMemoView(Report.FindObject("Val_"+IntToStr(i+1)));
        mem3.Visible = false;
        for(j=i; j<LastCol-1; j++){
          var mem2 = TfrxMemoView(Report.FindObject("Memo_"+IntToStr(j+1)));
          if(mem2.Visible){
            mem2.Left = mem2.Left - mem1.width;
          }
          var mem4 = TfrxMemoView(Report.FindObject("Val_"+IntToStr(j+1)));
          if(mem4.Visible){
            mem4.Left = mem4.Left - mem3.width;
          }
        }
      }
    }
  }
}



8、PascalScript的方法跟JScript一样,完整脚本如下:

var
  LastCol: Integer = 19;  //最后一行的序号(该值固定   )
  HasVal: array[0..13] of Integer;   //存储存储每个尺码是否有值的数组
  Idx: Integer;
procedure DetailData1OnBeforePrint(Sender: TfrxComponent);
var
  I:Integer;
begin
  if not Engine.FinalPass then
  begin
    if (<详情信息."尺码XXS"> > 0) then HasVal[0] := 1;
    if (<详情信息."尺码XS"> > 0) then HasVal[1] := 1;
    if (<详情信息."尺码S"> > 0) then HasVal[2] := 1;
    if (<详情信息."尺码M"> > 0) then HasVal[3] := 1;
    if (<详情信息."尺码L"> > 0) then HasVal[4] := 1;
    if (<详情信息."尺码XL"> > 0) then HasVal[5] := 1;
    if (<详情信息."尺码XXL"> > 0) then HasVal[6] := 1;
    if (<详情信息."尺码3SXL"> > 0) then HasVal[7] := 1;
    if (<详情信息."尺码4SXL"> > 0) then HasVal[8] := 1;
    if (<详情信息."尺码5SXL"> > 0) then HasVal[9] := 1;
    if (<详情信息."尺码6SXL"> > 0) then HasVal[10] := 1;
    if (<详情信息."尺码7SXL"> > 0) then HasVal[11] := 1;
    if (<详情信息."尺码8SXL"> > 0) then HasVal[12] := 1;
  end;
end;
procedure Page1OnBeforePrint(Sender: TfrxComponent);
var
  I, J: Integer;
  mem1, mem2, mem3, mem4: 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;
       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;
       end;
     end;
    end;
  end;
end;
begin
  //Init Has value array
  for Idx:=0 to 12 do
    HasVal[Idx] := 0;
end.


9、两种语法的示例文件看附件。JScript脚本的模板和数据json是分开的。PascalScript的模板嵌入在数据json文件中。


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