-
忘记你 初学数据Lv2
发表于2018-6-29 10:10
需求:
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界面需要显示的内容为:北京,广州,武汉
3个回答
解决方案:
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的方式变成字符串 北京,广州,武汉