BODS全局变量存储多IDOC值、运行时打印及邮件发送方案问询
BODS多IDOC编号存储及邮件输出解决方案
问题根因
BODS的标量类型全局变量仅支持存储单个值,调用sql()函数返回多记录结果集时,默认仅返回第一条记录的第一个字段值,因此原有写法只能获取到第一个IDOC编号。
推荐方案:字符串聚合存储(适配邮件发送场景,实现最简单)
直接通过数据库原生聚合函数,将多个IDOC编号拼接为单个分隔符分隔的字符串,存入标量全局变量即可,同时单独统计总数量:
- 步骤1:创建2个标量全局变量:存储IDOC列表的
$GV_IDOC_NO_LIST(varchar类型,长度建议设为2000以上)、存储总数量的$GV_IDOC_COUNT(int类型) - 步骤2:根据你使用的数据源数据库类型,选择对应聚合语法赋值:
MySQL数据源语法:
$GV_IDOC_COUNT = sql('DS_STG','SELECT COUNT(DISTINCT IDOC_NO) FROM table_xyz'); $GV_IDOC_NO_LIST = sql('DS_STG','SELECT GROUP_CONCAT(DISTINCT IDOC_NO SEPARATOR \', \') FROM table_xyz');Oracle数据源语法:
$GV_IDOC_COUNT = sql('DS_STG','SELECT COUNT(DISTINCT IDOC_NO) FROM table_xyz'); $GV_IDOC_NO_LIST = sql('DS_STG','SELECT LISTAGG(DISTINCT IDOC_NO, \', \') WITHIN GROUP (ORDER BY IDOC_NO) FROM table_xyz');SQL Server数据源语法:
$GV_IDOC_COUNT = sql('DS_STG','SELECT COUNT(DISTINCT IDOC_NO) FROM table_xyz'); $GV_IDOC_NO_LIST = sql('DS_STG','SELECT STRING_AGG(DISTINCT IDOC_NO, \', \') FROM table_xyz'); - 步骤3:打印验证多值输出,在脚本中加入如下打印语句,运行作业后可在作业执行日志中查看完整输出:
print('本次推送IDOC总数量:' || cast($GV_IDOC_COUNT as varchar(10))); print('本次推送IDOC编号列表:' || $GV_IDOC_NO_LIST); - 步骤4:邮件内容拼接:在BODS邮件组件的正文中直接引用上述两个变量即可,若需要IDOC编号每行显示,可将聚合的分隔符替换为换行符
\n。
可选方案:数组变量存储(适用于后续需要逐个处理IDOC的场景)
如果你使用的是BODS 4.2及以上版本,支持创建数组类型的全局变量存储多值:
- 创建数组类型全局变量
$GV_IDOC_ARR,设置对应数据类型和足够的数组长度 - 通过数据流或循环脚本,将查询到的所有IDOC编号依次写入数组即可,打印时可循环遍历数组输出每个值。
内容的提问来源于stack exchange,提问作者sayan nandi
相关产品推荐
相关产品推荐

