-
缱绻 数据领袖Lv6
发表于2019-2-15 15:51
楼主
本帖最后由 缱绻 于 2019-2-15 16:05 编辑
解决方案:
实现方法: 有两种思路处理:
注:1、diminf函数说明可参数BI函数字典:http://help.esensoft.com/doc-view-176.html;
2、其中 .split() 、.select()、 .distinct()均为数组常用写法,以下是函数说明:
报表模板上有维下拉参数(@dw,可多选,仅选择叶子节点),需要求出维下拉所选择的节点的上级名称并去重,在分析区去表格中展示。
多级维:市/县/区/险种-第1级-第2级,维表结构和部分数据场景如下:
例如:
维下拉参数选择了市本级(一票征缴),市本级(企业养老),奎文区(一票征缴),奎文区(企业养老),奎文区(机关养老),潍城区(一票征缴),潍城区(企业养老),潍城区(机关养老),文本中需要显示出对应文字 “市本级,奎文区,潍城区”(即已选择节点对应的上级节点的文本并去重显示)。
解决方案:
A1表元表达式:
<#=@dw^"".split("\\|").select(true,diminf("单位",@,"$UPID")).distinct()#>
B1表元表达式:
diminf("单位",self.leftcell.value)
公式解析:
1、用@dw^””.split("\\|")将选中的维下拉节点ID以数组格式返回,其中需注意@dw后面需要加上^””将参数对象返回成字符串格式;
2、.select(true,diminf("单位",@,"$UPID"))表示将数组中的每一项用diminf返回upid,组成一个新数组,@表示数组中的每一项;
3、.distinct()表示对数组项去重处理,返回一个新的数组。
4、用diminf("单位",self.leftcell.value)取出ID对应的name。
注:此方法多级维与通用为都适用。
场景扩展以上所述只是解决了当前所选择叶子节点的直接上级并去重的场景,那么,
如果维表级次有4级、5级、6级……想求出指定级次的父节点名称并去重,该如何实现呢?其实,实现思路同上,只需修改数组表达式中diminf部分即可,下面举两个例子:
1、通用维有a-b-c-d四级通用维,维表结构如下图,例如需求出维下拉(可多选且仅选择叶子节点)当前所选的叶子节点对应的的b级节点名称去重并展示。
A1表元表达式改成如下:
<#=@aa^"".split("\\|").select(true,diminf("机构",@,"b")).distinct()#>
Ps:其中diminf("机构",@,"b")返回维下拉所选节点对应的b级节点ID。
2、多级维比如维表共有4级:地区-省-市-区县(2-2-2-2)求出维下拉(可多选且仅选择叶子节点)当前所选的叶子节点对应的第二级节点名称去重并展示。
思路1:区县级的上上级就是省级,可以用嵌套diminf表达式求出上上级;
A1表元的表达式写法如下:
<#=@dw^"".split("\\|").select(true,diminf("单位",diminf("单位",@,"$UPID"),"$UPID")).distinct()#>
思路2:通过当前选择节点的ID用left函数截取前4位获得省级ID
A1表元的表达式写法如下:
<#=@dw^"".split("\\|").select(true,left(@,4)).distinct()#>
注:1、diminf函数说明可参数BI函数字典:http://help.esensoft.com/doc-view-176.html;
2、其中 .split() 、.select()、 .distinct()均为数组常用写法,以下是函数说明: