1个回答
-
esen_4WI8JHGYXX 初学数据Lv2
可以,试用ardb()函数
定义
ARDB(C1),或ARDB(C1,C2)
执行一个sql语句,并将查询结果作为数组返回。
参数
C1
sql语句
C2
如果不指定第二个参数,那么缺省的使用当前报表的缺省连接池;
如果需要跨库查询,需要指定第二个参数,参数是数据库连接池的编号。
示例
将sql语句的查询结果作为数组返回
ARDB("select name from xxb"), 返回该缺省连接池中xxb表的name字段的值,返回结果形如["张三","李四"]
ARDB("select name, id_ from xxb"), 返回该缺省连接池中xxb表的name和id_字段的值,返回结果形如[["张三","李四"], ["1","2"]]
ARDB("select name, id_ from xxb").matrix(), 返回该缺省连接池中xxb表的name和id_字段的值并转置,返回结果形如[["张三","1"], ["李四","2"]]
ARDB("select name from xxb","DEFAULT_SYS_BI")), 返回编号为DEFAULT_SYS_BI的连接池中xxb表的name字段的值,返回结果形如["张三","李四"]
ARDB("select name from xxb").get(0), 返回该缺省连接池中xxb表的第一个name字段的值,返回结果形如张三
ARDB("select name from xxb").join(";"), 返回该缺省连接池中xxb表的name字段的值,并用;分隔,返回结果形如张三;李四
如下,物理数据库表mytablea有两个字段id_和name_,参数@a是允许多选的枚举下拉框,@a选择值后要过滤id_字段联动另一个枚举下拉框控件@b,过滤让@b只能选@a多选后的对应标题,有in/or/dimfilter三种实现方式:
ARDB("select name_ from mytablea where " + if(@a is null or @a="", "1=1", "id_ in ("+@a.value.split("\|").select(1=1, "'"+@+"'").join(",") + ")")).matrix().join(";")
其中,对@a判空避免出现空where,@a.value取多选枚举值,当多选时为用|分隔的字符串,对该字符串调用split方法能拆分字符串成多部分,特殊字符|要用\转义,sql内的字符串常量要用单引号包含,matrix函数执行对ardb返回的二维数组转置,join负责将数组用指定连接符连接成一个字符串,注意in有个数限制,采用此方法,不建议超过元素超过500个!
ARDB("select name_, id_ from mytablea where " + if(@a is null or @a="", "1=1", @a.value.split("\|").select(1=1, "id_ = '" + @ + "'").join(" or "))).matrix().select(1=1, @[0]+":"+@[1]) 基本同上,但上面用in,这里是用or,更灵活
ARDB("select name_ from mytablea where " + dimfilter("[DEFAULT_SYS_YFTEST1].[mytablea].[id_]", @a, "mytablea", "id_", true)).matrix().join(";")
其中,dimfilter负责复杂多选情况的统一处理,当能与维度对应时,第一个参数指定维表名,当为纯数据库表,没有维表与之对应时,第一个参数字符串值格式形如:[连接池代号].[数据库表名].[字段名],第二个参数为多选报表参数名,第三个参数为待过滤数据库表别名,第四个参数为待过滤字段别名,第五个参数表示参数值为空时返回值串规则,为true表示and返回1=1,为false表示or返回1=2.
注意
该函数仅为内存计算函数,不能用于数据库计算,函数参数中不能有 主题表字段


