复杂报表组件
在“组件-通用”里选择报表(DataSheet2)组件,可以制作多表头复杂报表。
报表计算模型介绍
在DataSheet2中单元格之间存在依赖关系,对于任意一个单元格都可以设置它的左父格与上父格。单元格父格是可选的,默认情况下,单元格的左父格就是其最近左边与其位于同一行的单元格;上父格则是其最近上方与其位于同一列的的单元格。如果一个单元格位于第一行,那默认它就没有上父格,同样,如果位于第一列,默认它就没有左父格。打开DataSheet2报表设计器,选中任意单元格,都可以在其属性面板看到它的默认上父格或左父格,如下
如上图所示,对于某一特定单元格,我们可以手动更改它的左父格或上父格。任意单元格在绑定数据集中某个字段会,如果这个字段有一条以上的数据,那么单元格就可以展开以显示这些数据。对于父格而言,父格展开时会带动子格一起展开,如父格向下展开,则带其下所有子格及子格的子格一起向下展开;同时,如果子格中绑定的数据集与父格中数据集同属一个,则子格中的数据将受父格限制。子格绑定的数据集字段数据在展开时,同样也会带动其下子格一起展开,而当前子格的父格如与子格处于同一行或列,则会将父格拉大。利用上述迭代单元格的特性,我们就可以制作出各种复杂的报表样式,掌握了这一报表计算模型的特点,是开发报表的前提。
数据集选择
打开DataSheet2的报表设计器,在操作面板选择数据集页签,页签下可以引用数据集模块创建好的数据集
双击要使用的数据集,将数据集引入报表,自动列出数据集的全部字段
左侧选中某个单元格,双击字段即可给单元格绑定字段。
参数与筛选器
参数指的是从报表筛选器传入报表的值,在DataSheet2中,下面介绍如何SQL数据集如何定义参数。
SQL数据集参数
在SQL数据集SQL编辑器中需要添加动态参数,供报表筛选器绑定,动态参数形式如下:<p1>and 产品种类 =?[p1]</p1> 其中p1代表参数名称,报表查询时如果没有参数值,则改条件不生效,相当于不存在。如果有参数值,则自动加到列过滤。 写好sql后点击刷新按钮,右侧会刷出数据、字段信息以及识别的参数
筛选器
在报表设计界面,点击工具栏上方的查询表单设计器按钮
在组件区域可以拖动组件到右侧预览区域,默认从左到右排列,可以通过先放置布局组件,在放置查询组件的方式调整查询布局,如下图
选中某个查询组件,左侧切换到属性面板,可以针对改组件设置属性,例如绑定参数,设置数据来源、设置必填、显示名称等
绑定查询参数:查询条件需要绑定参数才能用于数据筛选,参数来自于关联的数据集参数
数据来源:下拉组件的待选项数据可以是固定值,也可以从数据集中动态查询,选择数据来源为数据集后,可设置来源数据集、来源字段、显示字段等属性
级联筛选
以省份-城市-区县级联为例:
前提:3个组件的数据来自同一个数据集的3个字段,数据上构成分组级联关系
选中省份组件,在属性面板设置属性“级联组件标题,多个用,隔开”, 将要级联控制的“城市”、“区县”组件的名称配置好即可。效果如下
页面进入时默认不查询
页面进入时默认不查询
表达式
在报表使用过程当中,不可避免的要使用函数及表达式实现一些数据的计算,在DataSheet2当中,很多地方都支持编写表达式,比如最典型的我们可以将单元格类型改为“表达式”,这样就可以在下面的表达式编辑器里输入相应的表达式与函数,除此之外,DataSheet2还允许我们在条件、图片来源、二维码数据来源等地方使用表达式,所以学习并掌握DataSheet2中提供的表达式,是制作复杂报表的前提。
基本语法
与一般的编程语言类似,DataSheet2中的表达式也有一些基本的数据类型,比如数字、字符串、布尔值等。上述的有三种基本的数据类型,可以单独使用,也可以用“+”、"-"、"*"、"/"、"%"连接,进行组合运算,如下表所示:
操作符
描述
示例
+
求两个数的和,或者是连接两个值
21+31,这就表示求这两个数的和,结果就是52,“值:”+331则表示连接两个值,其结果就是“值:331”
-
求两个数差
21 - 31,这就表示求这两个数的差,结果就是-10
*
求两个数的乘积
3*6,结果就是18
/
求两个数除的结果
6/3,结果就是2,如果除不尽,则会保留8位小数
%
求两个数除的余值
5%3,结果是2;6%2结果是0
DataSheet2中还提供了几种类型的条件判断运算符,我们首先来看一下三元表达式。
三元表达式
基本所有的语言都支持三元表达式判断,它的特点是简洁明晰,可以用最少的代码进行条件判断,DataSheet2中的三元表达式语法结构如下图所示:
可以看到,和普通的三元表达式一样,它的第一部分是条件部分,条件部分可以有多个条件(用and或or连接),“?”后面是条件满足后执行并返回的表达式部分,“:”后面则是条件不满足时执行返回的表达式部分。
三元表达式示例
说明
A1>1000 ? "正常值" : "低值"
表达式计算时,先取到A1单元格的值,判断值是否大于1000,如果是返回“正常值”字符串,否则返回“低值”字符串
A1>1000 and A1<20000 ? "正常值" : "修正值:"+(A1+100)
条件部分,判断A1值是否大于1000且小于20000,如果是返回"正常值",否则返回字符串”修正值“与A1值加100后结果连接的值,如果A1是2000,那么就返回”修正值:2100“
if判断
DataSheet2中if判断表达式语法结构如下图所示:
从图中可以看到,if判断表达式则一个if条件判断部分加若干个可选的elseif条件判断部分,最后再加一个可选的else部分构成,语法结构类似java或javascript。
if判断表达式示例
说明
if(A1>1000){
return "正常值"
}
判断A1单元格的值是不是大于1000,如果是返回”正常值“字符串,否则什么都不做
if(A1>1000){
return "正常值"
}else{
"低值";
}
判断A1单元格的值是不是大于1000,如果是返回”正常值“字符串,否则返回”低值“字符串。
这里需要注意的是,在if表达式中,return关键字是可选的,同是行尾添加';'也是可选的,这主要是为了照顾一些java及javascript程序的习惯
if(A1>1000 and A1<20000){
return "正常值:"+A1
}else if(A>20000 and A1<40000){
return "超高值"
}else{
"低值"
}
在这个例子当中,条件部分添加了多个组合条件,同时elseif多重判断
case判断
case判断是DataSheet2中提供的另一种条件判断形式,与if判断有些类似,但case判断看起来更为简洁,其语法结构图如下所示:
可以看到,case判断要由case{...}包裹,然后是若干条件加返回值。
case表达式示例
说明
case{
A1==100
return "正常值",
A1>100 and A1<1000
return '偏高'
}
有两个条件,分别返回不同的值
case{
A1==100
return "正常值",
A1>100 and A1<1000
'偏高'
}
在case表达式中,return关键字同样是可选
单元格引用
在报表当中,大多数的计算都是针对单元格或与单元格有关,因为报表中单元格多数都与数据绑定,而数据往往又是多条,所以计算后的报表一个单元格会产生多个,这样对于单元格的引用就变的比较复杂。在DataSheet2中,引用的目标单元格是相对当前单元格来进行计算的,引用方法就是直接在表达式里书写单元格名称,比如引用A1单元格,就直接写A1即可,如下面的例子:
在上图当中,我们在D1单元格中输入表达式A1,这就表示,在D1单元格里填入相对当前D1单元格的A1单元格的值,运行后的效果如下:
可以看到,因为D1是A1的子格,A1单元格绑定的数据就是分组结构,根据当前D1单元格的位置,就产生的上图所示的结果。如果在D1单元格中输入B1,那么运行后的效果又是下图的样子:
同样,如果在D1中输入表达式C1,那么运行后将会在每个D1单元格中填入与D1单元格位于同一行的C1单元格的值,运行结果这里就不再贴出来了。
通过上面的例子我们可以看到,DataSheet2中某个单元格的表达式引用目标单元格,首先判断的是目标单元格与其所在单元格是否位于同一行或行,如果是则直接取对应行或列上目标单元格的值。如果当前单元格与目标单元格不在同一行或列,那情况又不