常见的函数--帆软(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},如下图所示:

222

      数组中行和列分别用逗号、分号来间隔。逗号表示行,行之间的关系比较紧密,用逗号分割;列之间,关系相对比较疏远一点,用分号分割。   

      又比如:"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},如下图所示:

222

      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} 
222

      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}。

222

      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}

222

增强公式编辑器

  解决方案:

    1.1 安装插件

      设计器插件管理

      服务器插件管理

      注:该插件推荐用于2017年12月20日之后的9.0版本,之前的版本虽然也能用,但是存在一些界面操作和设计器添加行列是公式不能自动变化的BUG,另外不能使用内置的int、number和array函数。

      注:安装了该插件的并且使用了脚本公式的模板,在没有安装该插件的服务器上依然可以运行,只是在没有安装该插件的设计器上无法进行编辑。

    1.2 增强公式编辑器视图

      先来看一看安装了增强公式编辑器后的公式编辑界面视图,如下图所示:

222

      除了可以支持常规公式和脚本公式外,还能提供实时计算功能,免去了每次写公式之后要知道计算结果,还得预览一次报表的烦恼。

  使用教程:

    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格子中增加一个公式,切换为脚本公式,并输入内容:

  1. 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的场景,实际上这个完全是可以简化成

  1. var a1 = number('${A1}'); return int(a1 / 10) + 1;  

 

      效果如下图:
222

    3.2 循环函数的使用

 

除了可以使用逻辑判断函数以外,脚本公式最大的优势就在于可以使用循环函数,比如遍历一个数组,过滤出需要的值。

考虑下面一种场景:

A1格子是一个随机的从1到20的数组,用公式:=range(1, rand()*20, rand() * 3)可以大致模拟,希望A2的值是A1中值大于5的数减一形成的新数组,这种情况用现有的常规公式实现就会比较麻烦,但是用脚本公式则很轻松:

 
 
  1. var a1 = array('${A1}'); var r = []; a1.forEach(function(value, index) { if (value > 5) { r.push(value - 1); } }); return r;  
效果如下图:
222
3.3 嵌套常规函数
在脚本函数中,可以出了可以使用单元格和参数外,也可以正常的调用常规的公式,比如要求和,可以采用如下的方式:
 
 
  1. var r = number('${sum(A1:D1)}'); if (r < 5) { return "汇总值小于5"; } else { return "汇总值不小于5"; }  
这样就可以求出A1到D1的所有格子的的和,并且当和大于5的时候,A2格子的值为:汇总值小于5,当和大于等于5的时候,A2格子的值为:汇总时不小于5。
效果如下图:
222
 

4. 辅助函数

 

在脚本公式中,内置了3个函数,用于处理不同的数值类型:

函数名  作用   调用方式 
int   将参数转换为整数   var x = int('${A2}');
number   将参数转换为浮点数   var y = number('${A3}');
array     将参数转换为数组   var z = array('${A4}');

 

5. 实时计算

 

在编辑公式的过程中,比较痛苦的就是虽然实际变量不多,但是公式的逻辑比较复杂,每次修改了公式,都得点击报表的预览,才能知道修改正确了没有。增强公式编辑器插件就为了解决这个问题而提供了实时计算的功能。

我们就以上面的循环函数使用为例子,直接点击实时计算:

222

输入变量值之后直接点击确定,可以看得到计算结果:

222

 

6. 语法规则

公式中的脚本完全遵循ECMAScript3语法规则,支持大部分ES5语法规则,具体使用文档可以参考:http://wiki.jikexueyuan.com/project/javascript/syntax.html

 

友情链接:  

数知鸟文档链接:https://help.fanruan.com/shuzhiniao/

数知鸟是帆软推出的一款企业级的数据需求管理平台

帆软考试认证:http://bbs.fanruan.com/thread-108404-1-1.html

      

 

posted @ 2021-12-16 20:39  倾晴雨轩  阅读(1189)  评论(0编辑  收藏  举报