美文网首页
finereport常用权限控制函数

finereport常用权限控制函数

作者: 猛犸象和剑齿虎 | 来源:发表于2024-02-04 09:45 被阅读0次
    1. 用于从finedb获取用户名sql函数,作用是用内置变量$fr_username,获取账号名通常用流水号比如000001匹配对应的用户名比如张三。
    --fr_realname
    SQL("finedb","select realname from FR_T_USER where username = '"+$fr_username+"'",1,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结构的数据。

    image.png

    $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) 则返回甲公司

    ⑤最后 image.png
    前面一坨都是甲公司,则最后也是甲公司。
    (坑爹的来回嵌套)作用之一:不是填报人员就获取不到公司名。
    1. companyid 获取用户的公司ID
    SQL("ccjt","select id from t_company where company = '"+$companyname+"'",1,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")
    

    相关文章

      网友评论

          本文标题:finereport常用权限控制函数

          本文链接:https://www.haomeiwen.com/subject/xzcfadtx.html