主页 > 解决方案 > 康虎云套打方案 > 康虎使用手册 > 脚本 >
联系方式Contact
地 址:广东省广州市白云区太和镇龙归龙兴西路14号云天大厦 公司名称:广州众谛信息科技有限公司 售前咨询:132-6514-5213 售后技术:020-22043323 咨询Q Q:124412206 邮 箱:info@zodioo.com

在群组首Band中打印汇总数

阅读:

对于一个报表来说,统计值一般是在所有记录处理完毕之后才能得到结果,要在群组首Band中显示汇总数,必须使用脚本配合才能实现。按下面的方法:

- 启动“两阶段”报表选项(从菜单“报表 > 选项 > 两遍过程 ”进行设置)

- 第一阶段:计算每组的汇总值并记在一个数组里

- 第二阶段:从数组中取出汇总值并显示

 

下面介绍两种方法来实现这个任务。首先使用康虎云报表软件包中附带的多表示例数据文件“demo.mdb.full.json.js”来进入设计器。

 

打开设计器后,启用“两阶段”报表选项(从菜单“报表 > 选项 > 两遍过程 ”进行设置)。在空白报表中增加两个Band:“群组首”和“主数组”。在“群组首”band编辑器中,选择“cust_order”表的“CustNo”字段,然后为“主数组”Band选择“cust_order”作为数据源。然后按下图所示在空白报表上放置多个对象:

 

clip0197

 

在图中,红色箭头所指的对象“Memo23”是要在群组首显示汇总数的文件对象。

 

 

第一种方法:

 

我们使用“TStringList”类(“TStringList”类大家可以看作是一个可以放入无限个字符串的容器)来作为存储汇总数的容器,我们把汇总值转换成字符中放进去。StringList中第一个字符串对应第一个组的汇总值,依次类推。在取出汇总值时,用了一个全局的整数变量作为指针,每处理一个群组则指针加1,表示下一群组取StringList中下一个字符串作为汇总值。

 

代码如下:

 

PascalScript:

 

var

 List: TStringList;

 i: Integer;

 

procedure frReport1OnStartReport(Sender: TfrxComponent);

begin

 List := TStringList.Create;

end;

 

procedure frReport1OnStopReport(Sender: TfrxComponent);

begin

 List.Free;

end;

 

procedure Page1OnBeforePrint(Sender: TfrxComponent);

begin

 i := 0;

end;

 

procedure GroupHeader1OnBeforePrint(Sender: TfrxComponent);

begin

   if Engine.FinalPass then

   begin

      Memo23.Text := List[i];

      Inc(i);

   end;

end;

 

procedure GroupFooter1OnBeforePrint(Sender: TfrxComponent);

begin

   if not Engine.FinalPass then

      List.Add(FloatToStr(SUM(<cust_order."ItemsTotal">,MasterData2)));

end;

 

begin

 

end.

 

 

C++ Script:

 

TStringList List;

int i;

 

void frReport1OnStartReport(TfrxComponent Sender)

{

 List = TStringList.Create();

}

 

void frReport1OnStopReport(TfrxComponent Sender)

{

 List.Free();

}

 

void Page1OnBeforePrint(TfrxComponent Sender)

{

 i = 0;

}

 

void GroupHeader1OnBeforePrint(TfrxComponent Sender)

{

 if (Engine.FinalPass) {

   Memo23.Text = List[i];

   i++;

 }

}

 

void GroupFooter1OnBeforePrint(TfrxComponent Sender)

{

 List.Add(FloatToStr(SUM(<cust_order."ItemsTotal">,MasterData1)));

}

 

{

 

}

 

脚本中的事件函数名明确地表明了所用到的事件,分别是“Report.OnStartReport”, “Report.OnStopReport”, “Page1.OnBeforePrint”, “GroupHeader1.OnBeforePrint” and “GroupFooter1.OnBeforePrint”。前两个事件分别在报告开始和结束时触发。事件与事件函数绑定的方法在上一节已经讲过,如果想不起来了可以回到上节去回顾一下。

 

由于在脚本代码中创建“TStringList”,是需要占用电脑硬件资源的,所以用完之后要释放资源,因此在“OnStartReport”事件创建,在“OnStopReport”事件中释放,如果不释放,时间长了会造成硬件资源不足。

 

整个脚本的代码比较简单,这里就不多说了。报表预览效果如下:

 

_img239

 

这个方法很简单,但还可以简化。

 

第二种方法:

 

我们使用报表变量集合来存储汇总值。请记住,通过“Get”和“Set”函数来存取报表变量,使用报表变量可以避免手工创建存储对象要销毁对象,因为报表引擎帮我们做了这些事。简化的脚本如下:

 

PascalScript:

 

procedure GroupHeader1OnBeforePrint(Sender: TfrxComponent);

begin

if Engine.FinalPass then

   Memo23.Text := Get(<cust_order."CustNo">);

end;

 

procedure GroupFooter1OnBeforePrint(Sender: TfrxComponent);

begin

 Set(<cust_order."CustNo">,

   FloatToStr(SUM(<cust_order."ItemsTotal">,MasterData2)));

end;

 

begin

 

end.

 

 

C++ Script:

 

void GroupHeader1OnBeforePrint(TfrxComponent Sender)

{

if (Engine.FinalPass)

   Memo23.Text = Get(<cust_order."CustNo">);

}

 

void GroupFooter1OnBeforePrint(TfrxComponent Sender)

{

 Set(<cust_order."CustNo">,

   FloatToStr(SUM(<cust_order."ItemsTotal">,MasterData1)));

}

 

{

 

}

 

这次的代码比前面的简单很多,在“GroupFooter1.OnBeforePrint”事件函数中把汇总值放入报表变量,然后在“GroupHeader1.OnBeforePrint”事件函数中取出,不再需要手工创建存储对象。如果指定的报表变量不存在,则报表引擎会自动创建,如果报表变量已存在,则会更新。

 

康虎云报表官网:http://www.khcloud.net

评论

发表评论

 
QQ在线咨询
售前咨询热线
132-6514-5213
售后服务热线
020-22043323
返回顶部