ardb函数常见的几种用法

10180
5

tangmq 数据达人Lv4

发表于2019-11-6 12:57

楼主
>>ardb函数介绍<<
ardb返回数组对象,ardb返回的数组对象规则:
  • 当SQL中的字段只有一个时,那么返回的是一个一维数组。
  • 当字段个数超过一个时,返回的是一个二维数组,而SQL返回数据中的一列对应二维数组的一行,相当于把当前SQL查询出来的数组进行行列转换。可以通过math.transpose函数进行行列转换。


ardb 函数体内就是一个select语句,把色select 查询结果,以数组形式返回
  • 举例:ardb("   select zb1 from tableA  where zb2>0  group by zb1 ")
  • 返回:['aaa','bbb','ccc']


>>ardb函数在过滤中的应用<<
ardb返回的是一个数组,比较典型的应用场景是做某个字段in的过滤。 xxb.zd  in ardb("select ……")
例1:不传参,过滤条件写法
          xxb.zb in ardb('select nsrdzdah from fact_nsrxx_p')
例2:传一个参数,过滤条件写法
         xxb.zb not in ardb("select nsrdzdah from fact_nsrxx_p where nsrdzdah=' "+@rootbbh+" ' ")
例3:传递多个参数,过滤写法(来自客户真实应用场景)
         BI_T_ACCT_ENTRY.TRAN_SEQNO IN (<#=ardb("SELECT TRAN_SEQNO FROM BI_T_ACCT_ENTRY WHERE ITM_NO='3017'  AND TRAN_SEQNO = '"+@lsh+"' AND TRAN_DATE='"+@rq+"' GROUP BY TRAN_SEQNO")#>)

>>ardb函数在参数默认值中的应用<<
报表计算参数,是BI报表模板的一个重要元素,有一些需求,需要计算参数的值自带默认值,且默认值需要通过数据库查询得到一个动态的默认值
!!注意:因为默认值返回需要是一个字符串,但是ardb返回的是数组,所以我们需要用ardb("select ……").join(','),将数组转成一个字符(数组对象join的作用:将数组中的每个元素连接起来,每个元素之间用指定的分隔符分割,返回连接后的字符串)
   例1:日期参数默认值为数据库中最大日期值:
          <#=ardb("select max(to_char(DATA_DT)) from M01_DEPLOAN_COMPLETE").join(';')#>
          <#=ardb("select max(bbq_) from fact_srzc").join(';')#>
   例2:默认值为某个数组返回的第一个值
           <#=ardb("select ORGID_  FROM ES10_ORG")[0]#>

>>ardb函数在参数枚举值中的应用<<
报表有一种计算参数是枚举下拉,枚举下拉的枚举值定义格式是:  语文:01;数学:02;英语:03,这样就会形成下拉的三个选项,每个选项之间用 英文分号分隔,选项内部的文本和编码,用英文冒号分隔
那么有一种需求场景,需要实现枚举下拉的选择,但是枚举下拉的内容,是通过数据库获取动态的值得到的,并不是固定写死的。这个时候就可以用ardb实现,目标就是将查询到的数据,组合成枚举值需要的格式规范
     例:<#=ardb("select   a.BIMONTH||':'||a.BIMONTH  from MQT_CW_GL_DXSLYJZ a group by a.BIMONTH  order by a.BIMONTH    desc").join(";")#>

>>ardb函数在参数联动行为中的应用<<
           例1:参数行为联动枚举下拉数据
           同样如上文枚举值应用场景为例,枚举下拉的内容需要通过sql动态获取,并且sql动态获取枚举的时候,存在报表当前参数的传参,这样一个附加条件,就无法直接在枚举值里面定义表达式可以实现的,因为在枚举值的定义中,无法实现传参计算。
           此时需要通过参数行为,例如,报表含三个计算参数 @year  @dep 和 @month,其中@month是一个枚举下拉,且枚举值需要通过@year 和@dep 传参带入sql中进行查询得到。(以下方式,写到枚举值定义,无效的),可以在@year 或者 @dep的参数/高级,行为中,添加一个行为,行为类型为枚举值:
          ardb("select month||':'||month from V_NPCS_ODS_EXESCH_DEPT      where year = '"+@year+"'    and dept_code=  '"+@dep+"'    group by month order by month").join(';')   
            !!注意:行为联动的时候,ardb不要写到宏里面,直接定义函数。此处无法识别宏表达式!!
截图201911061248315146.png

             例2:参数行为联动维下拉数据
场景和需求,类似,通过一个参数,控制选择另一个维下拉参数的值,此处单独举例的原因,维下拉是一个通用式多级次维,ardb要返回的内容必须带上完整级次数据,即:级次1$级次2
            该场景来自客户真实案例,通用级次维 @ver,即需要定义默认值,也需要年度参数联动赋值,
             默认值:<#=ardb("select max(a.month)|| '$'||max(a.vershort_orderid) from APP_GMA_f11_VERSHORT_VW a").join(";")#>
             @yuefen参数上的行为定义f赋值: ardb("select max(a.month)||'$'||max(a.vershort_orderid) from APP_GMA_f11_VERSHORT_VW a where a.month='"+@yuefen+"'").join(";")

          例3:一个完整且真实的,ardb函数在参数联动中的应用
       http://help.esensoft.com/doc-view-126.html
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
以上内容抛转引玉,有更多经典的应用场景和实现方案,欢迎楼下跟帖讨论。




最近看过此主题的会员

esen_4RKHEF6NCS

我们安然如初

wxw

myoekk

klor

esen_4Q6MZ9SWVR

vip

yiyiyiyiy

yangqh

Gardenia

jiangqiao

DJY

Marcoco

5个回答

只看楼主

辰哥 管理员

发表于2019-12-5 14:28

只看该作者

取消 关注该作者的回复

沙发

大神分享,惊喜不断!

tangmq 数据达人Lv4

发表于2019-12-6 15:38

只看该作者

取消 关注该作者的回复

板凳

ardb里面,是支持sql嵌套的。例如某项目,
<#=ardb("select distinct t.xm_name1||':'||t.xm_code1 from npcs_ods_fb_dept t where t.year='2019' and t.dept_code='048001'  and t.yw_type='1404' and length(t.xm_code1)=3 ").join(";")#>生成的下拉选项是:凌乱的,如下图
截图201912061536439210.png
如果我对ardb中的sql,先根据某个字段  排序,order by 一次,然后再select 排序后的结果,出来的效果就很工整
<#=ardb("select  dd from (
select distinct t.xm_name1||':'||t.xm_code1 as dd,t.xm_code1 as cc from npcs_ods_fb_dept t where t.year='2019' and t.dept_code='048001'  and t.yw_type='1404' and length(t.xm_code1)=3  
order by cc) ").join(";")#>


效果图:
截图201912061537567633.png

缱绻 数据领袖Lv6

发表于2019-12-12 11:02

只看该作者

取消 关注该作者的回复

地板

ch023011 数据小白Lv1

发表于2020-9-27 09:47

只看该作者

取消 关注该作者的回复

5#

大佬们,问一下ardb函数可以在ETL过程中使用吗,比如过滤组件中的自定义过滤或者参数中的默认值上使用

zengxq 数据达人Lv4

发表于2022-9-6 10:53

只看该作者

取消 关注该作者的回复

6#

本帖最后由 zengxq 于 2022-9-6 12:01 编辑

<#=ardb("select  DISTINCT id ||':'|| name from dim_du1 where  id ='"+@cs+"'").join(";")#>测试可用oracle,如果是mysql使用字符拼接函数CONCAT_WS(')<#=ardb("select  DISTINCT   CONCAT_WS(':',name,id) from dim_du1 where  STORENO='"+@cs+"'").join(";")#>

登录后可回答问题,请登录注册

快速回复 返回顶部 返回列表

小时

全天响应

分钟

快速处理问题

工程师强势助力

明星产品
解决方案
联系合作

渠道咨询电话:137-0120-6790

技术支持QQ:400-0011-866(工作日9:00-18:00)

产品建议邮箱yixin@esensoft.com

关注我们

扫TA学习更多干货

一对一专家交流

版权所有© 2006-2024 北京亿信华辰软件有限责任公司 京ICP备07017321号 京公网安备11010802016281号