- 用于从finedb获取用户名sql函数,作用是用内置变量$fr_username,获取账号名通常用流水号比如000001匹配对应的用户名比如张三。
--fr_realname
SQL("finedb","select realname from FR_T_USER where username = '"+$fr_username+"'",1,1)
- 获取部门角色所在的公司
-- companyname
INDEXOFARRAY(GREPARRAY(GETUSERDEPARTMENTS(2),FIND(item,INDEXOFARRAY(GREPARRAY($fr_userposition, FIND($postname, item) != 0), 1))!=0),1)
函数
①INDEXOFARRAY(array, index):返回数组array的第index个元素。
示例:
INDEXOFARRAY(["第一个", "第二个", "第三个"], 2)返回"第二个"。
②GREPARRAY(array,fn):函数(返回true或者false)是条件,过滤此数组,最后形成一个新数组。
示例:
GREPARRAY([3,4,2,3,6,8,7], item != 3)等于[4,2,6,8,7].
③GETUSERDEPARTMENTS():返回角色部门
示例:
GETUSERDEPARTMENTS():返回角色所有部门,若多个部门则数组
GETUSERDEPARTMENTS(3,2):返回角色该部门的第三层和第二层名字,
若多个部门则返回数组,若没有第三层则只显示第二层
④ FIND(find_text,within_text,start_num):从指定的索引(start_num)处开始,返回第一次出现的指定子字符串(find_text)在此字符串(within_text)中的索引。
Find_text:需要查找的文本或包含文本的单元格引用。
Within_text:包含需要查找文本的文本或单元格引用。
Start_num:指定进行查找字符的索引位置。within_text里的索引从1开始。如果省略start_num,则假设值为1。
备注:
如果find_text不在within_text中,FIND函数返回值为0。
如果start_num不大于0,FIND函数返回错误信息VALUE!。
如果start_num大于within_text的长度,FIND函数返回值为0。
如果find_text是空白文本,FIND函数将在搜索串中匹配第一个字符(即编号为start_num或1的字符)。
示例:
FIND("I","Information")等于1。
FIND("i","Information")等于9。
FIND("o","Information",2)等于4。
FIND("o","Information",12)等于0。
FIND("o","Information",-1)等于VALUE!。
⑤ 使用权限时,$fr_userposition就是部门角色,
格式如:{"departments":"销售","jobTitle":"销售经理"},
部门角色是以部门和职务组成的数组。
⑥ $postname
自定义的参数这里指代填报人员,作用是权限为填报人员时才执行操作特殊功能。
解析
①嵌套函数解读一般从易到难,从里到外,GETUSERDEPARTMENTS()获取用户的所有部门角色例如获取到:
填报人员,甲公司,IT部
构成为角色,公司,部门,取参数2取到甲公司。
②GREPARRAY($fr_userposition, FIND($postname, item) != 0)
从函数解析中GREPARRAY(array,fn)得知fn是一个函数,item指代array本身。
$fr_userposition是帆软内置的变量
{"jobTitle":"填报人员","departments":"A集团,甲公司,IT部"}
形成了这种类似字典或者json结构的数据。
$postname这里是填报人员
那么FIND($postname, item)从0的位置开始找填报人员,结果从0位置找到,(字典中"jobtitle"指的是键key,填报人员指值item),这个就返回0
0!=0显然为假false,那么数组没有过滤掉任何值,则还是$fr_userposition即:
{"jobTitle":"填报人员","departments":"A集团,甲公司,IT部"}
如果这里不是填报人员,则FIND($postname, item) 返回空null
null!=0为true
则过滤掉所有数组,GREPARRAY($fr_userposition, FIND($postname, item) != 0)就会返回空值。
③INDEXOFARRAY(GREPARRAY($fr_userposition, FIND($postname, item) != 0), 1)
INDEXOFARRAY(["第一个", "第二个", "第三个"], 2)返回"第二个"。返回数组第一个元素目的是防止有用户多权限组织形成多条数据,则返回{"jobTitle":"填报人员","departments":"A集团,甲公司,IT部"}。
④GREPARRAY(GETUSERDEPARTMENTS(2),FIND(item,INDEXOFARRAY(GREPARRAY($fr_userposition, FIND($postname, item) != 0), 1))!=0)
GETUSERDEPARTMENTS(2)取到值公司名:甲公司;
INDEXOFARRAY(GREPARRAY($fr_userposition, FIND($postname, item) != 0)取到值{"jobTitle":"填报人员","departments":"A集团,甲公司,IT部"}
则FIND(item,INDEXOFARRAY(GREPARRAY($fr_userposition, FIND($postname, item) != 0), 1))这里返回了40或者其他值反正不等于0
GREPARRAY(GETUSERDEPARTMENTS(2),FIND(item,INDEXOFARRAY(GREPARRAY($fr_userposition, FIND($postname, item) != 0), 1))!=0) 则返回甲公司
前面一坨都是甲公司,则最后也是甲公司。
(坑爹的来回嵌套)作用之一:不是填报人员就获取不到公司名。
- companyid 获取用户的公司ID
SQL("ccjt","select id from t_company where company = '"+$companyname+"'",1,1)
- 获取公司结账周期
SQL("ccjt","select datenum from T_ACCOUNT where companyid = '"+$companyid+"'",1,1)
5.拼接序列号在另一篇finereport主键自定义自增序列技巧
文章有详细介绍。
CONCATENATE(FORMAT(IF(DAY(TODAY())>8,DATEINMONTH(TODAY(),1),MONTHDELTA(DATEINMONTH(TODAY(),1),-1)),"yyyyMMdd"),FORMAT($companyid,"00"),"0000")
网友评论