常见的函数--帆软(1)
函数
数组的加减乘除运算
定义:
所谓数组,是相同数据类型的元素按一定顺序排列的集合。
若将有限个类型相同的变量的集合命名,那么这个名称为数组名。
组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。
用于区分数组的各个元素的数字编号称为下标。
数组是在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。
分类:
数组就是元素的集合,按行、列进行排列。 数组分为一维数组和多维数组。
单行或多列的数组,我们称为一维数组。
多行多列(含2行2列)的数组是多维数组或二维数组。
数组的运算
一维数组和二维数组的运算规律
1)单行x与数组arry运算 执行x与arry中每一个元素分别运算并返回结果,也就是与arry本身行列、尺寸一样的结果。
比如:2*{1,2;3,4;5,6},执行2*1、2*2、2*3、2*4、2*5、2*6运算,并返回3行2列的二维数组结果{2,4;6,8;10,12},如下图所示:
数组中行和列分别用逗号、分号来间隔。逗号表示行,行之间的关系比较紧密,用逗号分割;列之间,关系相对比较疏远一点,用分号分割。
又比如:"A"&{"B","C"}返回{"AB","AC"}。"A"={"B","A","C"}返回{FALSE,TRUE,FALSE}
也就是说,数组是可以与单独字符或数值进行比较、合并、运算等处理的。
2)同向一维数组运算 执行arry1与arry2对应位置的元素分别运算并返回结果。要求arry1与arry2尺寸必须相同,否则多余部分返回#N/A错误。
比如: {1;2;3}*{4;5;6}返回{4;10;18}; {1,2,3,4}*{4,5,6}返回{4,10,18,#N/A},如下图所示:
3)异向一维数组运算 arry1的每一元素与arry2的每一元素分别运算并返回结果,得到两个数组的行数*列数个元素,也就是M行数组与N列数组运算结果为M*N的矩阵数组。
比如:{1;2;3}*{4,5,6,7,8},执行1*4、1*5、1*6、1*7、1*8、2*4、2*5、2*6、2*7、2*8、3*4、3*5、3*6、3*7、3*8,返回{4,5,6,7,8;8,10,12,14,16;12,15,18,21,24}
4)一维数组与二维数组运算 二维数组其中一个方向与一维数组同向同尺寸,比如M*N的二维数组与M行或者N列的数组运算,
在同向的运算类似同向一维数组之间的位置对应,在异向的运算则 类似单值与数组之间的一一运算。超出尺寸范围都返回错误值。
例:{1,2,3,4}*{1,2,3,4,5;6,7,8,9,10}即4列一维数组与2行5列二维数组运算,列方向上两个数组运算按位置一一对应的,不足部分用#N/A补齐,行方向上则是一对多的运算。
即:1*1,2*2,3*3,4*4,#N/A *5;1*6,2*7,3*8,4*9,#N/A *10;返回{1,4,9,16,#N/A;6,14,24,36,#N/A}。
5)二维数组之间运算 要求尺寸相同,并执行相同位置元素一一对应的运算,超出尺寸部分返回错误。
例:{1,2;3,4}*{1,2,3;4,5,6;7,8,9}执行1*1,2*2,3*4,4*5,其余部分用#N/A补齐,返回={1,4,#N/A;12,20,#N/A;#N/A,#N/A,#N/A}
增强公式编辑器
解决方案:
1.1 安装插件
设计器插件管理
注:该插件推荐用于2017年12月20日之后的9.0版本,之前的版本虽然也能用,但是存在一些界面操作和设计器添加行列是公式不能自动变化的BUG,另外不能使用内置的int、number和array函数。
注:安装了该插件的并且使用了脚本公式的模板,在没有安装该插件的服务器上依然可以运行,只是在没有安装该插件的设计器上无法进行编辑。
1.2 增强公式编辑器视图
先来看一看安装了增强公式编辑器后的公式编辑界面视图,如下图所示:
除了可以支持常规公式和脚本公式外,还能提供实时计算功能,免去了每次写公式之后要知道计算结果,还得预览一次报表的烦恼。
使用教程:
3.1 逻辑判断函数的使用
随意的新建一张报表,在A1格子中写入公式:=RAND() * 60,该公式的含义是返回一个0到60之间的随机数。我们需要A2格子的值根据A1格子的值的不同而不同——当A1格子的值为0到10之间的时候,A2格子的值为1,在10到20之间的时候,A2格子的值为2,如此类推,在50到60之间的时候,A2格子的值为6。
为了实现这个功能,我们可以采用条件属性中的新值、也可以采用常规公式中的SWITCH函数,这两种实现我们不再多说,添加条件属性肯定是很麻烦的,用SWITCH函数要稍微好些。
下面我们用脚本公式可以比较简洁的方式来实现,在A2格子中增加一个公式,切换为脚本公式,并输入内容:
- var a1 = number('${A1}'); if (a1 >= 0 && a1 < 10) { return 1; } else if (a1 >= 10 && a1 < 20){ return 2; } else if (a1 >= 20 && a1 < 30) { return 3; } else if (a1 >= 30 && a1 < 40) { return 4; } else if (a1 >= 40 && a1 < 50) { return 5; } else if (a1 >= 50 && a1 <= 60) { return 6; }
当然,这个示例只是为了体现使用多个if的场景,实际上这个完全是可以简化成
- var a1 = number('${A1}'); return int(a1 / 10) + 1;
效果如下图:
除了可以使用逻辑判断函数以外,脚本公式最大的优势就在于可以使用循环函数,比如遍历一个数组,过滤出需要的值。
考虑下面一种场景:
A1格子是一个随机的从1到20的数组,用公式:=range(1, rand()*20, rand() * 3)可以大致模拟,希望A2的值是A1中值大于5的数减一形成的新数组,这种情况用现有的常规公式实现就会比较麻烦,但是用脚本公式则很轻松:
- var a1 = array('${A1}'); var r = []; a1.forEach(function(value, index) { if (value > 5) { r.push(value - 1); } }); return r;
![222 222](http://help.finereport.com/uploads/201807/20180725103804_7324.png)
- var r = number('${sum(A1:D1)}'); if (r < 5) { return "汇总值小于5"; } else { return "汇总值不小于5"; }
![222 222](http://help.finereport.com/uploads/201807/20180725103804_5732.png)
在脚本公式中,内置了3个函数,用于处理不同的数值类型:
函数名 | 作用 | 调用方式 |
---|---|---|
int | 将参数转换为整数 | var x = int('${A2}'); |
number | 将参数转换为浮点数 | var y = number('${A3}'); |
array | 将参数转换为数组 | var z = array('${A4}'); |
在编辑公式的过程中,比较痛苦的就是虽然实际变量不多,但是公式的逻辑比较复杂,每次修改了公式,都得点击报表的预览,才能知道修改正确了没有。增强公式编辑器插件就为了解决这个问题而提供了实时计算的功能。
我们就以上面的循环函数使用为例子,直接点击实时计算:
输入变量值之后直接点击确定,可以看得到计算结果:
公式中的脚本完全遵循ECMAScript3语法规则,支持大部分ES5语法规则,具体使用文档可以参考:http://wiki.jikexueyuan.com/project/javascript/syntax.html
友情链接:
数知鸟文档链接:https://help.fanruan.com/shuzhiniao/
数知鸟是帆软推出的一款企业级的数据需求管理平台
帆软考试认证:http://bbs.fanruan.com/thread-108404-1-1.html