单据转换来源数据包是没有结构的,是通过sql脚本查询到的表数据集合,所以在写表达式时不能像实体服务,值更新服务那样使用实体的key来代表集合数据源;单据转换用关键字“Sources" 代表来源数据包集合,通过Sources得到唯一的字段所在的实体内码和字段值集合。
1、单据合并汇总值
错误写法:sum(fqty) ,运行时会报fqty不是一个集合
正确写法:sum(Sources.fqty)
2、单据合并或分录合并连接字符
错误写法:",".join(fstrKey), 虽然不会报错,但运行是只是第一个数据包中的值的两个字母的连接,因为字符串每个字母可以看作集合项。
正确写法:",".join(Sources.fstrKey)
去重复写法:",".join(set(","join(Sources.fstrKey).split(","))) , set函数去重复值
带过滤去重复:",".join(set(",".join(filter(lambda x: x<>null,Sources.fstrKey)).split(","))) , 其中filter为过滤函数,lambda 为具体执行的匿名函数
3、很多时候需要if...else的表达式
1)如果判断的字段是简单字段直接写: IfTrueKey if fSimpleKey =="" else IfFalsekey
2)如果判断的字段是基础资料,使用fBaseDataKey ==null 做判断的时候fBaseDataKey 返回的是一个转换对象,永远都不会为null, 这里要使用基础资料的里面一个字段,一般使用基础资料编码就可以,
正确写法: IfTrueKey if fBaseDataKey.FNumber ==null else IfFalsekey
3)如果判断使用基础资料中的基础资料,比如: fBaseDataKey.FOrgId ==123456,这个fBaseDataKey.FOrgId返回的是 基础资料名称,所以正确的写法是: fBaseDataKey.FOrgId ==“莫某组织”
4)赋值,如果使用的是基础资料中的基础资料字段,比如: fBaseDataKey.FOrgId if fBaseDataKey.FOrgId =="莫某事业部" else fBaseDataKey.FOrgId2, 则得到的最终结果是组织的名称,故基础资料中的基础资料字段是不能为基础资料赋值的。
4、注意事项
如果是选单,并且给单据头字段赋值,每次都会覆盖,这时候可能需要两个字段,一个隐藏字段得到当前来源值,另外一个字段使用服务策略中的服务赋值,把隐藏字段的值加上已存在的值合并赋值。
5、参考帖子
推荐阅读