方式适用于Oracle数据库
需求:
I表元使用代码组,存储内容格式为1,2,3类似格式,如下图:

BI有一个多选维下拉框(单层级)和I的代码组内容一直,如果BI中选择 了1|3两项,那么过滤出的数据就是所有包含1和3 的记录(例如1,2,3/1,3,4/3,1,5/)都包含1和3

如果下拉框为空,显示全部数据
数据内容不是维表的id字段,是维表的caption内容,例如 如果选择了1|3,择得到结果1,3,4,此时Bi界面需要显示的内容为:北京,广州,武汉
解决方案:
1、通过sql数据源获取需要的结果集(此处应用到oracle的regexp_substr,将单表元内容 变成多条记录显示 ,在利用mimus的方式获取差集)
2、通过显示表达式的方式将 id显示为 文本内容(此处应用到数据函数)
具体步骤
一、sql数据源设置:
select b1 from IXJRW_B01 where b1 in(
select b1 from IXJRW_B01
minus
select b1 from IXJRW_B01 aa where exists (
select b1
from (select REGEXP_SUBSTR("<#=if(len(@dq)=0,ardb("select distinct id from DIM_DQ").join(","),substitute(asstr(@dq),"|",","))#>", "[^,]+", 1, level) AS b1
from dual bb
connect by level <= LENGTH("<#=if(len(@dq)=0,ardb("select distinct id from DIM_DQ").join(","),substitute(asstr(@dq),"|",","))#>") - LENGTH(REPLACE("<#=if(len(@dq)=0,ardb("select distinct id from DIM_DQ").join(","),substitute(asstr(@dq),"|",","))#>", ",")) + 1) b
minus
select REGEXP_SUBSTR(<#=if(len(@dq)=0,"""^asstr(ardb("select distinct id from DIM_DQ").join(","))^""","B1")#>, "[^,]+", 1, level) AS b1
from IXJRW_B01 where b1 =aa.b1
connect by level <= LENGTH(<#=if(len(@dq)=0,"""^asstr(ardb("select distinct id from DIM_DQ").join(","))^""","B1")#>) - LENGTH(REPLACE(<#=if(len(@dq)=0,"""^asstr(ardb("select distinct id from DIM_DQ").join(","))^""","B1")#>, ",")) + 1
)
)
其中,用到了红表达式:
<#=if(len(@dq)=0,ardb("select distinct id from DIM_DQ").join(","),substitute(asstr(@dq),"|",","))#>
<#=if(len(@dq)=0,"""^asstr(ardb("select distinct id from DIM_DQ").join(","))^""","B1")#>
1、如果为空情况,相当于全选minus全选,所以得到全部结果
2、如果有选项,择把选项内容由于1|3的格式变成 1,3的格式,minus B1字段(1,3 被变成两条记录 1 一条,3一条, minus B1字段 字段内容也变成了多条记录 )
二、显示表达式设置
@txt.split(",").select(true,diminf("DQ",@,"NAME")).join(",")
先识别‘," 把记录1,3,4变成数组[1,3,4]在利用select遍历数组 把id 通过diminf 获取到name字段,在将数组["北京","广州","武汉"]通过join的方式变成字符串 北京,广州,武汉
附件中内容三个分别是:
请先登录