皕杰商务智能平台
报表产品v3.2
(高级设计教程第一部分)
北京杰汇智科技有限公司皕
目录
第一章基础知识 (3)
第1节:层次坐标 (3)
第I条概念预习 (3)
第II条示例讲解 (4)
第2节:位移坐标 (4)
第I条概念预先 (4)
第II条示例讲解 (5)
第二章多源关联分片 (5)
第1节:纵向分片 (6)
第2节:横向分片 (7)
第3节:静态与扩展混合 (9)
第三章复杂规则分组 (10)
第1节:不完全分组 (11)
第2节:过滤分组 (12)
第3节:按段分组 (13)
第四章动态格间运算 (15)
第1节:占比、比值、同期比 (15)
第I条占比报表 (15)
第II条比值报表 (16)
第III条环比上期 (16)
第IV条同比上期 (17)
第2节:累积、分组汇总、条件汇总 (18)
第I条累积报表 (18)
第II条分组汇总 (19)
第III条条件汇总 (20)
第3节:排名、序号、孤立格运算 (22)
第I条排名 (22)
第II条序号 (24)
第III条孤立格运算 (25)
第五章参数 (25)
第1节:参数表单 (26)
第2节:通过S ESSION传递参数值参数表单 (29)
第一章基础知识
第1节:层次坐标
第I条概念预习
层次坐标是用于唯一描述(精确定位)扩展后的每一个单元格的一种定位表达式。层次坐标的运算结果返回目标单元格。如果层次坐标能够定位到一个单元格,那么返回该单元格的值,如果定位到多个单元格,那么返回这些单元格中的第一个单元格的值。
表达式规则:
说明:
a)L k为Cellx 的左主格, l k为左主格扩展后的次序,即扩展后的第几个单元格,
如果不指定l k或者l k为0,则表示为当前表达式所在单元格所属的当前左主格,Cellx为目标单元格,应该为L k, L k ?1…L 1的附属单元格。与之类似,T k为
Cellx 的上主格,t k为上主格扩展后的次序。
b)如果只有上主格,没有左主格,分号不能省略,即应该写成:Cellx [;T k:t k, T k-1:
t k-1,……T1:t1];如果只有左主格,没有上主格,分号可以省略,即可以写成:
Cellx [L k:l k, L k-1:l k-1,……L1:l1 ]
c)L k与T k的次序是从远到近的,也就是说越上级的主格越靠前。而找到层次坐
标所表示单元格的次序是从最上级的主格开始。
第II条示例讲解
第2节:位移坐标
第I条概念预先
位移坐标是用来描述目标单元格和当前格之间的位置关系的一种定位表达式。有了层次坐标后,很多时候并不够用,因为大部分时候报表设计者并不知道目标单元格的具体位置,例如报表中常常需要计算同期比、比上期之类的与时间相关的运算,而这些运算往往需要用到下一行的数据减上一行数据,后一列数据减前一列数据,等等,这种涉及到相邻n行或者n列的行间、列间的运算,称为位移运算相关的表达式称为位移表达式。
表达式规则:
说明:
a)L k为Cellx 的左主格,l k为单元格的偏移量,即当前格所属的L k主格和目标格
所属的L k主格之间的偏移量,如果不指定l k,则表示为当前所在的左主格L k,
Cellx 为目标单元格,一般为L k,L k-1,。。。。。。L1的附属单元格
b)如果没有左主格,只有上主格的话,分号不能省略,即写成Cellx [;T k:±t k, T k-1:
±t k-1,……T1:±t1]
c)如果没有上主格,只有左主格的话,分号可以省略,即写成Cellx [L k:±l k, L k-1:
±l k-1,……L1:±l1 ]
d)L k的次序是从远到近的,也就是从离当前格最远的主格开始的,也可以理解为
从最高级别的主单元格开始
e)完整的位移坐标表达式应该包括Cellx 的所有主格,位移坐标与写在哪个单元格
中紧密相关。
第II条示例讲解
第二章多源关联分片
预备知识:先做一张多层交叉报表(具体做法参见《杰报表入门教程》第六章,
皕
第2节),效果如下图所示:
第1节:纵向分片
现在,我们把本章中预备的报表做一些改变,首先,我们在原有数据集的基础上增加如下数据集的定义:
ds2:SELECT 雇员.雇员ID,订单明细.产品ID,雇员.职务,雇员.姓氏||雇员.名字 as 姓名 FROM 雇员,订单,订单明细 WHERE 雇员.雇员ID = 订单.雇员ID AND 订单.订单ID = 订单明细.订单ID ORDER BY 订单.订购日期 ASC
然后在报表下方追加一行,增加一个纵向扩展格,如下图所示:
该报表的预览效果如下图所示:
从上图可以看出,该报表出现了两片纵向扩展区域,这两片纵向扩展区域看起来毫无关系,但是格线严格对齐。下面我们对这个报表继续做改变,在新增加的行中写入计
算表达式,如下图所示:
其中:
4单元格输入表达式:= ds2.group(职务,false)
设置显示值为:ds2.姓名 格的在A 在B4单元格输入表达式:= ds2.group(雇员ID,false) 在C4单元格输入表达式:=ds1.sum(数量*单价,雇员ID=B4) 设置显示格式为:¥#0.00 C4格中的表达式为:=ds1.sum(数量*单价,雇员ID=B4)。其含义是:雇员ID 为B4单元雇员在C2城市的销售额;可以看出,这个表达式既和上表头C2格有关联,又和左表头B4格有关联,我们再看一下预览效果:
从上图可以看出,上下两片本来没有关系的扩展区域,通过C4格的表达式和上表头C2格关联起来,变成了上下两片紧密关联的扩展区域。
第2节:横向分片
现在,我们把第1节中的报表做一些改变,首先,我们在原有数据集的基础上增加如
下数据集的定义:
ds3:SELECT 类别.类别ID,类别.类别名称 FROM 类别
ds4:SELECT 产品.类别ID,产品.产品ID FROM 产品
然后在报表右侧追加一列,增加一个横向扩展格,如下图所示:
该报表的预览效果如下图所示:
从上图可以看出,该报表出现了两片横向扩展区域,这两片横向扩展区域看起来毫无关系,但是格线严格对齐。下面我们对这个报表继续做改变,在新增加的行中写入计算表达式,如下图所示:
其中:
在D2单元格输入表达式:=ds4.Group(类别ID,false,类别ID!=null) ,设置显示值为:
ds3.getone(类别名称,类别ID==@value) ,扩展方向:横向扩展
在D3单元格输入表达式:=ds1.sum(数量*单价,产品ID in ds4.select(产品ID)),设置显示格式为:¥#0.00
在D4单元格输入表达式:=ds1.sum(数量*单价,产品ID in ds4.select(产品ID) and 雇员ID=B4),设置显示格式为:¥#0.00
D3格中的表达式为:=ds1.sum(数量*单价,产品ID in ds4.select(产品ID))。其含义是:年月为B3时产品ID为D2的产品销售额之和;可以看出,这个表达式既和上表头D2格有关联,又和左表头B3格有关联。
D4格中的表达式为:=ds1.sum(数量*单价,产品ID in ds4.select(产品ID) and 雇员
ID=B4)。其含义是:B4单元格的销售员对产品ID为D2的产品销售额之和;可以看出,这个表达式既和上表头D2格有关联,又和左表头B4格有关联。我们再看一下预览效果:
从上图可以看出,上下两片本来没有关系的扩展区域,通过D3、D4格的表达式和左表头B3、B4分别格关联起来,变成了左右两片紧密关联的扩展区域。
第3节:静态与扩展混合
现在,我们把第2节中的报表做一些改变,在报表中分别增加两行两列,如图所示:
接下来我们在新加的行列中增加一些表达式,对不同扩展区域的数据分别进行统计,如图所示:
其中:
(1)在D3单元格输入表达式:=sum(C3{C3>10000}) 设置显示格式为:¥#0.00 (2)在D5单元格输入表达式:=sum(C5{C5>10000}) 设置显示格式为:¥#0.00 (3)在C4单元格输入表达式:=sum(C3{C3>10000}) 设置显示格式为:¥#0.00 (4)在C6单元格输入表达式:=sum(C5{}) 设置显示格式为:¥#0.00
(5)在F3单元格输入表达式:=sum(E3{}) 设置显示格式为:¥#0.00
(6)在F5单元格输入表达式:=sum(E5{}) 设置显示格式为:¥#0.00
(7)在E4单元格输入表达式:=sum(E3{E3>10000}) 设置显示格式为:¥#0.00 (8)在E6单元格输入表达式:=sum(E5{}) 设置显示格式为:¥#0.00
D3格中的表达式为:=sum(C3{C3>10000})。其含义是:订购日期为B3的且销售额大于10000的之和;
F3格中的表达式为:=sum(E3{})。其含义是:订购日期为B3的销售额之和。
从上图可以看出,整个报表横向纵向被分成了好几片单元格,有的是扩展的,有的是固定行的,固定区域和动态扩展区域混合在一起,既互相独立又有一定的数据联系,这种报表就是最典型的多源分片报表。
第三章复杂规则分组
预备知识:先做一张多普通分组报表,效果如下图所示:
做法如下:
第一步:定义数据集:
ds1:SELECT 客户.城市,客户.地区,订单明细.数量,订单明细.单价 FROM 客户,订单,订单明细 WHERE 客户.客户ID = 订单.客户ID AND 订单.订单ID=订单明细.订单ID
第二步:写入单元格表达式,如下图所示:
从上图可以看出,该报表最关键的是A2格和B2格,利用group函数对数据集进行
了分组,并把分组结果在报表中进行纵向扩展。
第1节:不完全分组
我们把3.1中的报表做些变化,不要把所有的记录用于分组,因为某些组用户并不关
心,我们仅仅保留“华北”、“华东”这两个组,把剩余的组全部归并成一组,命名为“其他”,
报表样式如下图所示:
定义单元格属性和表达式
其中:
在A2单元格输入表达式:= ds1.group(地区,false,地区=='华东' or 地区=='华北') 设置
为纵向扩展
在B2单元格输入表达式:=ds1.Group(城市,false) 设置为纵向扩展
在C2单元格输入表达式:=ds1.sum(数量*单价) 设置显示格式为:¥#0.00
在B3单元格输入表达式:=ds1.Group(城市,false,地区!='华东' and 地区!='华北') 设置
为纵向扩展
在C3单元格输入表达式:=ds1.sum(数量*单价) 设置显示格式为:¥#0.00
通过以上示例可以看出,杰报表处理这种问题很巧妙,杰报表提供的select和group
皕皕
函数均带有过滤条件参数,可以在进行选出或者分组的时候,过滤掉无关的记录,仅仅
对部分记录进行分组。之后还可以对同一个数据集重复进行多次的分组或者选出、汇总
操作,从而可以实现很复杂的分组报表。
第2节:过滤分组
我们把上一节中的报表继续做变化,效果如下图所示:
图上可以看出,“华北”组中的一部分记录被过滤,并单独拎出来在“其中:北京”组
和“其中:天津”组中进行了统计,便于用户一目了然,既了解总的统计数据,又了解“北京”和“天津”的统计数据,这种同一部分记录在不同组中统计的分组报表称为过滤分组报表。
做法如下:
定义单元格属性和表达式
其中:
在A2单元格输入表达式:=ds.filtergroup(true,地区=="华北","华北",城市=="北京"," 其中:北京",城市=="天津"," 其中:天津",地区=="华南","华南",城市=="深圳"," 其中:深圳",地区=="华东","华东","其他") 设置为纵向扩展
在B2单元格输入表达式:=ds.sum(数量*单价)
在C2单元格输入表达式:=ds.sum(折扣*数量*单价) 设置显示格式为:¥#0.00
在D2单元格输入表达式:=B2-C2 设置显示格式为:¥#0.00
从上述介绍可以看出,过滤分组的关键在于A2格的表达式发生了变化,用filterGroup
函数代替了Group函数。通过给filterGroup传递不同的过滤条件,可以实现重叠分组、
条件分组、归并分组等等常见的分组方式。例如可以把销售额大于1000万的地区分成一组、把销售额在500~1000万的分成一组等等。
第3节:按段分组
按段分组也是个比较典型的不规则分组报表,其分组是根据数据的值段来分的,例
如按照分数段、年龄段、按时间段等,属于某个值区间的记录归到一个组里。
第一步:定义数据源
ds1:SELECT DEPT,SEX, DEGREE, BONUS, EMPNAME FROM EMPLOYEE
ds2: SELECT DEGREE.ID,https://www.doczj.com/doc/894937713.html, FROM DEGREE
第二步:设计表样,定义表达式
其中:
A3单元格输入表达式:=ds1.split(bonus,list(5000,10000,15000)),显示值表达式:=map(list(0,1,2,3),list('五千以下','五千到一万','一万到一万五','一万五以上')),设置为纵向扩展
B3单元格输入表达式:= ds1.select(EMPNAME,false,,bonus)
C3单元格输入表达式:= ds1.DEGREE,显示值表达式:=ds2.getone(name,id==@value) D3单元格输入表达式:= ds1.SEX,显示值表达式:=map(list("1","2"),list("男","女")) E3单元格输入表达式:= ds1.BONUS,设置为人民币格式,并保留2位小数
E4单元格输入表达式:= now() 显示格式设置为中文时间格式
第三步:保存预览
在上图中我们可以看到,报表根据奖金数额将员工分成四组,分别统计“五千以下”、“五千到一万”、“一万到一万五”、“一万五以上”四个奖金段的员工状况。这种按值段进行分组的分组报表被称为按段分组报表。
第四章动态格间运算
第1节:占比、比值、同期比
第I条占比报表
第一步:定义数据源
ds1: SELECT 订单明细.单价,订单明细.数量,订单.货主地区 FROM 订单,订单明细WHERE 订单.订单ID = 订单明细.订单ID
第二步:设计表样,定义表达式
其中:
A2单元格输入表达式:=ds1.group(货主地区.false),设置为纵向扩展
B2单元格输入表达式:=ds.count()
C2单元格输入表达式:=b2/b3,设置为百分数格式,并保留2位小数
D2单元格输入表达式:=ds.sum(数量*单价),设置为人民币格式,并保留2位小数 E2单元格输入表达式:=d2/d3,设置为百分数格式,并保留2位小数
B3单元格输入表达式:=sum(b2{})
D3单元格输入表达式:=sum(d2{}),设置为人民币格式,并保留2位小数
第三步:保存预览
●说明
这是一个比较简单的行间运算例子,该例子要求报表引擎在解析报表时,能够先解析表达式,判断出B2格和D2格的占比表达式用到了B3格和D3格,从而先计算B3格和D3格,然后再计算C2格和E2格。
对于很多引用第三方表达式解析器(如BeanShell)的报表工具来说,就无法智能的判断运算优先级了。因此,对于那类报表工具来说,看起来很简单的占比报表,实现起来却很麻烦。
第II条比值报表
第一步:定义数据源
ds1: SELECT EMPLOYEE.EMPNAME,订单明细.数量,订单明细.单价 FROM EMPLOYEE,订单,订单明细 WHERE 订单.订单ID =订单明细.订单ID AND EMPLOYEE.EMPID = 订单.雇员ID
第二步:设计表样,定义表达式
其中:
A2单元格输入表达式:= &B2,左主格设置为C2
B2单元格输入表达式:=ds1.Group(EMPNAME,false,,,sum(数量*单价),true),左主格设置为A0,并设置为纵向扩展。
C2单元格输入表达式:=ds1.sum(数量*单价),设置为人民币格式,并保留2位小数 D2单元格输入表达式:=c2[1]-c2,设置为人民币格式,并保留2位小数
第三步:保存预览
●说明
这个例子中用到了绝对层次坐标和根格的概念。
第III条环比上期
第一步:定义数据源
ds1: SELECT 订单.订购日期,订单明细.单价,订单明细.数量 FROM 订单,订单明细
WHERE 订单.订单ID = 订单明细.订单ID AND 订单.订购日期is not null
第二步:设计表样,定义表达式
其中:
A2单元格输入表达式:=ds1.group(year(订购日期),false),设置为纵向扩展
B2单元格输入表达式:=ds1.group(month(订购日期),false) ,并设置为纵向扩展。 C2单元格输入表达式:=ds1.sum(数量*单价),设置为人民币格式,并保留2位小数 D2单元格输入表达式:=C2/C2[-1] ,设置为数字百分比格式,并保留2位小数
第三步:保存预览
●说明
这个例子中用到了位移坐标的概念,并且采用了坐标缺省表示法。练习:如果不采用坐标缺省表示法该如何实现?答案如下:
第IV条同比上期
把刚才的例子进一步深化,刚才的例子只是当前月与紧邻的上个月的数据的环比,如果
要与上一个年度的同一个月的数据进行对比该如何做呢?
做法如下:
其中:
E2单元格输入表达式:=C2/C2[A2:-1]{B2=$B2} ,设置为数字百分比格式,并保留2位小数
第三步:保存预览
●说明
这个例子中用到了位移坐标的概念,并且采用了坐标缺省表示法;还用到了$运算符,$运算符的书写规则如下:$Cellx,其含义是在格集表达式中指代当前格的Cellx主格(请培训人员在此讲解几个使用$运算符的例子以加深理解)
第2节:累积、分组汇总、条件汇总
第I条累积报表
第一步:定义数据源
ds1:SELECT
EMPLOYEE.EMPID,EMPLOYEE.EMPNAME,EMPLOYEE.SEX,EMPLOYEE.DEGREE,EMPLOYEE.B ONUS FROM EMPLOYEE
ds2:SELECT DEGREE.ID,https://www.doczj.com/doc/894937713.html, FROM DEGREE
第二步:设计表样,定义表达式
其中:
A2单元格输入表达式:=ds1.Select(EMPID,false,,toint(EMPID)),设置为纵向扩展
B2单元格输入表达式:=ds1.EMPNAME
C2单元格输入表达式:=ds1.SEX,显示值表达式为:=if(@value=="1","男","女")
D2单元格输入表达式:=ds1.DEGREE,显示值表示设置为:=ds2.getone(NAME,ID==@value) E2单元格输入表达式:=ds1.BONUS,设置为人民币格式,并保留2位小数
F2单元格输入表达式:= e2+f2[-1] ,设置为人民币格式,并保留2位小数
第三步:保存预览
第II条分组汇总
分组汇总与统计我们在前面讲述分组报表的时候已经讲过了,这里给大家一定的时间再次温习一下《入门教程》中的第五章第3节,为我们下面要讲的条件汇总做好准备。
第III 条 条件汇总
第一步:定义数据源
ds1:SELECT DEPT,SEX, DEGREE, BONUS, EMPNAME FROM EMPLOYEE where dept in (1,3) ds2:SELECT DEGREE.ID,https://www.doczj.com/doc/894937713.html, FROM DEGREE ds3: SELECT DEPT.DEPTID,DEPT.DEPTNAME FROM DEPT 第二步:设计表样,定义表达式