本文介绍了新版套打功能的特点,支持单据实体动态字段配置,并详细说明了基础资料取数、判空、字段相等判断及嵌套基础资料判断的实现细则,包括隐式转换、显示调用函数、处理多语言名称等,还分享了表达式示例和注意事项,如不支持两级嵌套取数、表达式间不构建依赖关系、建议做空异常判断等。
<0>新版套打功能:套打支持单据实体动态字段(基于Python表达式进行配置)
不知道功能的先看这个帖子,目前只支持单据。
后续这个帖子直接提问或者补充,将更多常用的表达式放在文章上
小tips:
1.如果要文本和非文本一起显示(如数字、日期),那么应该将非文本转换为文本,其中str()为python函数,.ToString()为C#函数,看情况使用
<1>基础资料默认默认取名称字段(名称-》编码-》内码)
实现细则:平台自动优化,当数据包作为脚本返回时在运行过程中为数据包,控件绑定时自动隐式转换为调用.ToString(),输出为名称字段(名称-》编码-》内码);同时,支持显式调用.ToString()输出;特别的,python脚本调用的str()也将由重写的ToString接管;
性能:ToString()>str()>implicit operator
插件干预时的数据包:
<2>基础资料支持按照字段标识、属性名称取数据,使用更加便捷;支持取内码、编码、名称、嵌套字段
实现细则:对于不太熟悉的用户建议使用字段标识,字段标识能够解决字段位于不同层级的优化处理(如子单据头、单据体);表达式返回类型与数据包中的数据结构相关,如上图中最后一个示例为在采购订单上取“供应商”基础资料的“默认税率”,返回的则为数据表对象,控件绑定时使用隐式转换转为名称显示
<3>判断基础资料是否为空的实现(xxx == null /xxx != null)
实现细则:重点关注基础资料为空时访问基础资料内部变量的问题,使用字段名隐式转换显示的不会中断(显示空),显式显示字段名的会中断异常(若不确定是否一定有值,那么就要做空异常判断,堆栈异常的表达式可以快速定位错误的表达式,进行相关的修复)
在可能为空的基础资料,使用三元运算符输出如(空仅仅只是为了验证表达式执行,原则上输出''空串):
FAssignSupplierId.Id if FAssignSupplierId != null else '空'
<4>判断基础资料字段绑定的字段是否相等(f_base1 == f_base2/f_base1 != f_base2)
实现细则:建议不要自己写判断表达式,应该使用平台重载的相等、不等运算符,处理了基础资料类型是否匹配,是否为空的场景,代码上更加简约;(目前是想不到到有什么需要自己写判断相等表达式的场景,难道有可能针对两者都空,任一为空输出不同的值吗?)
<5>判读单据上的基础资料的嵌套基础资料是否等于某特殊值
使用内码、编码、名称判断值是否匹配,其中名称是具有多语言的特性的,如果名称在不同语言下进行值类型匹配,那么需要考虑公式仅在部分语言下才能匹配成功;
案例分享:采购订单上的供应商的默认税率,如果为13%和6%是增值税专用,1%的普票,其他显示其他;
名称匹配表达式(查找子字符串,值不为空版本):
'增值税' if (FSupplierId.FTaxRateId.FName.find('13%')>=0 or FSupplierId.FTaxRateId.ToString().find('6%')>=0) else ('普票' if FSupplierId.FTaxRateId.FName.find('1%')>=0 else '其他种类')
编码匹配表达式(查找是否在集合内,值不为空版本):
'增值税' if (FSupplierId.FTaxRateId.Number in ('SL02_SYS','SL06_SYS')) else ('普票' if FSupplierId.FTaxRateId.Number == 'SL001' else '其他种类')
编码匹配表达式(值可能为空版本)
'' if FSupplierId == null or FSupplierId.FTaxRateId == null else ('增值税' if (FSupplierId.FTaxRateId.Number in ('SL02_SYS','SL06_SYS')) else ('普票' if FSupplierId.FTaxRateId.Number == 'SL001' else '其他种类'))
<6>注意事项
a):目前不支持嵌套两级的基础资料内的数据取数(如采购订单.供应商.默认税率.税率,目前取不到,只建议使用编码、名称匹配);后续考虑在按需加载且性能可控的情况下,放开多级嵌套取数;
b):各表达式之间不要构建依赖关系,一个表达式完整的执行一个计算逻辑(由于性能的问题,表达式之间是采用并行运算的,在并行运算下,无法保证每一个表达式之间的计算顺序,如果依赖中间量可能会导致部分行表达式有值部分行没有值的可能);暂时不会考虑改为串行,如果需要后续会动态构建表达式按依赖关系计算;
c):如果不确定是否为空,那么都应该在表达式做非空判断运算;
d):值匹配更多的使用编码匹配;
e):名称字段建议只用作在输出时替换用,不建议在表达式用作判定条件(多语言相关);
f):后续补充
推荐阅读