zoukankan      html  css  js  c++  java
  • 按段分组报表制作

    需求说明

    在报表对数据进行汇总统计时,通常是按照某个字段进行分组,比如按地区、类别等字段分组后对其他信息进行汇总,但有一种分组模式为不规则分组,其分组是根据数据的值段来分的,例如按照分数段、年龄段、按时间段等,属于某个值区间的记录归到一个组里如下图所示:

    在上图中我们可以看到,报表根据订购日期将订单数量和订单金额分成四组,分别统计 "2012 年圣诞前"、“2012 年圣诞–2013 年国庆”、“2013 年国庆–2014 年五一”、"2014 年五一以后" 四个时间段的订单。

    这种按值段进行分组的分组报表被称为按段分组,下面我们介绍一下润乾报表中如何实现该报表。

    定义数据集

    ds1:SELECT 订单. 订购日期, 订单明细. 数量, 订单明细. 单价, 订单明细. 折扣, 客户. 地区 FROM 订单明细, 订单, 客户 WHERE 客户. 客户 ID = 订单. 客户 ID AND 订单. 订单 ID = 订单明细. 订单

    增加参数

    报表中按时间段进行分组,实际应用中时间段通常是动态变化的,动态变化的时间段可以通过参数动态控制,所以此处增加参数进行控制:

    参数名:arg1,数据类型:日期组,值表达式:2012 -12 -25, 2013 -10 -1, 2014 -5-1

    参数名:arg2,数据类型:字符串组,值表达式:2012 年圣诞前, 2012 年圣诞–2013 年国庆, 2013 年国庆–2014 年五一, 2014 年五一以后

    arg1 参数用于控制按段分组时的日期段,arg2 用于设置报表展示时单元格的显示信息,稍后做详细介绍

    制作报表

    报表设计模板如图:

    A3:=ds1.group(地区; 地区:1),按照地区进行分组

    B3:=ds1.count(),进行计数操作,统计订单数量

    C3:=ds1.sum( 单价数量 ),对订单金额汇总,注意,数据库中并没有订单金额字段,订单金额可通过单价数量计算出,润乾中支持 sum 前先对字段进行相应操作,并设置 C3 单元格显示格式为:¥#0.00

    B1:表达式为 =ds1.plot(订购日期, arg1),此处使用数据集的 plot 函数(按段分组),第一个参数(订购日期)为要分组字段,第二个参数(arg1)为分段区间,函数主要功能是根据订购日期字段将数据集按照 arg1 参数指定的分段区间划分到不同的组内,该函数返回值为整数组,代表记录按值段分组后组的顺序,如 list(0,1,2,3) 代表第一组,第二组,第三组,第四组,具体函数说明见附注,将单元格扩展方向改成横向,此时报表预览展示效果如下:

    可以看到,B1 单元格返回的是 0,1,2,3 这种整数,所以要对其设置显示值表达式以达到显示效果,这里就用到了之前定义的 arg2 参数,在 B1 单元格显示值表达式中写入:map(to(0,count(arg1)),arg2),map 函数主要用于显示值表达式映射,该函数有两个参数均为 list,由于 B1 单元格的真实值为 0,1,2 这种整数,所以 map 函数第一个参数为 0 到分段区间个数的扩展,第二个参数会按照顺序映射返回到显示值属性中,这样 B1 单元格就能按照 arg2 参数中设置好的内容进行显示。而分段区间和显示值均是通过参数传递,所以此报表的分段信息可以通过程序控制参数达到动态效果。

    根据实际要求设置报表样式,最终效果如下:

    附注:

    plot 函数说明:

    根据数据值段进行分组,俗称“按段分组”

    语法:

    datasetName.plot(valueExp,listExp{,filterExp})

    参数:

    valueExp 用于分组的值表达式

    listExp 数据值段列表,同 valueExp 数据类型相同的数组,要求其中元素从小到大排列

    filterExp 过滤表达式

    返回值:

    整数组,代表记录按值段分组后组的顺序,如 list(0,1,2,3) 代表第一组,第二组,第三组,第四组。因此,定义完单元格数据值表达式后还需要定义显示值表达式,比如第一组代表不及格,第二组代表及格等等

    选项:

    @r 是否为根数据集表达式

    @c 表示与元素比较时数据值段临界值只包含在第 1 个碰到的区间,相同的临界值不包含在第 2 个碰到的区间。缺省数据值段临界值只包含在第 2 个碰到的区间。

    @z 表示 listExp 返回的数组按从大到小排列; 缺省为从小到大排列

    示例:

    例 1:ds1.plot(成绩,list(60,80,90) ,科目 ==“数学”)

    返回值为 list(0,1,2,3) 对数据集 ds1 过滤出科目等于数学的记录按成绩段进行分组,60 分以下不包含 60 分、60-79,80-89,90 分及 90 分以上等四组。同时定义显示值表达式为:map(list(0,1,2,3),list(不及格, 及格, 良好, 优秀))

    例 2:ds1.plot@c(成绩,arg1)

    其中 arg1 为参数,其数据类型是整数组,其值为 "60,70,80,90" 。显示值表达式为:map(to(0,count(arg1)),arg2),其中 arg2 为字符串组,其值为 {“不及格”,“及格”,“中”,“良好”,“优秀”}。 本例通过参数动态控制分组值段以及结果组的显示值。

    作者:gxy

    链接:http://c.raqsoft.com.cn/article/1542609796494?r=IBelieve

    来源:乾学院

    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    Attributes in C#
    asp.net C# 时间格式大全
    UVA 10518 How Many Calls?
    UVA 10303 How Many Trees?
    UVA 991 Safe Salutations
    UVA 10862 Connect the Cable Wires
    UVA 10417 Gift Exchanging
    UVA 10229 Modular Fibonacci
    UVA 10079 Pizza Cutting
    UVA 10334 Ray Through Glasses
  • 原文地址:https://www.cnblogs.com/IBelieve002/p/10036560.html
Copyright © 2011-2022 走看看