这样一个要求:当用户为集团公司用户时,可以看到所有公司的数据,当用户为子公司用户时,只能看到本公司数据,而且子公司用户存在跨公司兼职的情况,就是说存在跨公司兼职的用户,可以看到对应公司的数据。
select replace(name,'-基准账簿','') from org_accountingbook
where (replace(name,'-基准账簿','') in ('${aaa}') or '集团' = '${bbb}')
我们知道当条件中存在OR则表示一真为真,假如参数bbb='集团',那么where '集团'='集团' 成立,相当于取出所有公司的值。
而当'集团' = '${bbb}',bbb参数为'A公司',那么'集团' = 'A公司'不成立,则需要看aaa参数的写法了。
aaa
JOINARRAY(GetRoleCompany(GETUSERDEPARTMENTS(),"集团","公司"),"','")
bbb
GetRoleCompany(GETUSERDEPARTMENTS(),"集团","公司")
-
只有GetRoleCompany函数为自定义函数
package com.fr.function;
import com.fr.general.FArray;
import com.fr.script.AbstractFunction;
/**
* 自定义函数
*/
public class GetRoleCompany extends AbstractFunction {
/**
* @param args
* 函数的参数,是经过了算子处理了其中特殊参数的
* @return 经过函数处理的值,用于参与最终计算
*/
public Object run(Object[] args) {
if (null == args || args.length == 0) {
return "无参数";
} else if (args.length == 1) {
return args[0];
} else if (args.length == 2) {
FArray<String> list = new FArray<String>();
if (args[0] instanceof FArray) {
FArray array = (FArray) args[0];
String in = args[1].toString();
for (int i = 0; i < array.length(); i++) {
String item = array.elementAt(i).toString();
String[] str = item.split(",");
for (String s : str) {
if (s.indexOf(in) != -1) {
list.add(s);
}
}
}
} else {
String array = args[0].toString();
String in = args[1].toString();
String[] str = array.split(",");
for (String s : str) {
if (s.indexOf(in) != -1) {
list.add(s);
}
}
}
return list;
} else if (args.length == 3) {
FArray<String> list = new FArray<String>();
FArray<String> list2 = new FArray<String>();
Boolean boo = false;
if (args[0] instanceof FArray) {
FArray array = (FArray) args[0];
String in = args[1].toString();
String out = args[2].toString();
for (int i = 0; i < array.length(); i++) {
String item = array.elementAt(i).toString();
if (item.indexOf(in) != -1 && item.indexOf(out) == -1) {
boo = true;
String[] str = item.split(",");
for (String s : str) {
if (s.indexOf(in) != -1) {
list.add(s);
}
}
} else if (item.indexOf(out) != -1) {
String[] str = item.split(",");
for (String s : str) {
if (s.indexOf(out) != -1) {
list2.add(s);
}
}
} else {
list2.add("31");
}
}
} else {
String array = args[0].toString();
String in = args[1].toString();
String out = args[2].toString();
if (array.indexOf(in) != -1 && array.indexOf(out) == -1) {
boo = true;
String[] str = array.split(",");
for (String s : str) {
if (s.indexOf(in) != -1) {
list.add(s);
}
}
} else if (array.indexOf(out) != -1) {
String[] str = array.split(",");
for (String s : str) {
if (s.indexOf(out) != -1) {
list2.add(s);
}
}
} else {
list2.add("32");
}
}
if (boo) {
return list;
} else {
return list2;
}
} else {
return "4";
}
}
}
这段时java代码,简单来说参数可以有0个参数,1个参数,2个参数,3个参数,以及4个以上的情况,
当0个参数时,返回无参数
当1个参数时,返回该参数值
当2个参数时,返回一个list列表
当3个参数时,返回两个列表,满足第二参数的放在list中,满足第三参数放在list2中
当4个及以上参数时返回 '4'
- 比较抽象,套进实际运用得场景来解释:3个参数的场景
bbb为
GetRoleCompany(GETUSERDEPARTMENTS(),"集团","公司") - 假如小张是集团员工,GETUSERDEPARTMENTS(),返回小张所在的部门:假如取出3个角色名:
技术支持,集团,信息部
则返回集团那么'集团'='集团' 成立 - 假如小红是A公司员工,GETUSERDEPARTMENTS(),返回小张所在的部门:假如取出3个角色名:
填报人员,A公司,办公室
则返回A公司那么'集团'='A公司' 不成立 需要重新看参数aaa的情况
而参数aaa与参数bbb的区别只有外层的joinarray(),这是个拼接数组函数目的也是如果用户同时存在A公司,和B公司都任职,则取出list2 假如是这样的['A公司','B公司'] 而finereport解读数据没有列表这个概念,需要转为数组,以',' 进行拼接以符合sql语句in('A公司','B公司')
当然帆软的自定义函数应用情况还是少的,碰到这种情况的话,只需要调用知道大概意思就行。
参数面板设置
用公司下拉框
控件值用函数
if(GetRoleCompany(GETUSERDEPARTMENTS(),"集团","公司")="集团","A公司",INDEXOFARRAY(GetRoleCompany(GETUSERDEPARTMENTS(),"集团","公司"),1))
假如获取的员工部门角色为集团,则用A公司作为默认值,否则用改员工做在的第一个公司作为默认值。
数据集用数据字典
这样就如果用户为分公司角色,则数据集只能取出该用户的公司名,假如用户为集团角色,则取出所有的公司名。