本文介绍了IronPython中IN运算符的灵活运用,特别是通过Python生成器推导式来判断物料名称是否包含多个关键词。示例展示了如何结合`any()`函数与生成器推导式来实现复杂条件判断,以及在不同操作校验规则下如何访问DynamicObject对象的数据。还扩展了关于DynamicObject访问、Python条件判断及生成器推导式的相关知识。
针对IronPython(遵循Python2.7的语法)IN运算符(成员运算符)。
官方有一篇贴子介绍如何运用:二开案例.表达式.IN操作
https://vip.kingdee.com/link/s/MUOjJ
而我来分享一次我的灵活运用经验,会比官方知识运用得更加高阶一些。
实际例子:判断物料名称是否包含多个关键词
FMaterialId.FName <> null and any(name in FMaterialId.FName for name in ['电脑','笔记本','计算机','服务器','台式机','主机','工控机'])
注释:物料.名称不为空,并且,物料.名称包含 ['电脑','笔记本','计算机','服务器','台式机','主机','工控机'],则执行XXXX。
说明:
上述表达式中的for…name…in循环遍历用法是精髓,属于“Python生成器推导式”。name为循环计数器,用于遍历并依次承载IN[]中的关键词,去逐次与FMaterialId.FName(物料名称)比较字符串包含关系。
name也可以自行随意另取名称,但首尾两处一定要名称一致(两处蓝色字体部分要名称一致)。
any(x)判断括号内的对象成员是否全部为 False,则返回 False,如果其中有1个为 True,则返回 True。若any(x)返回True,说明[]中的多个关键词与物料名称依次比较包含关系,至少有1个关键词被包含于当前行的物料.名称中。在本例中,代表了该行物料名称被判定为属于IT电脑设备,需要执行“电脑详细配置型号字段必录”的操作校验(表单服务)规则:“合法性检查,字段必录”。
扩展知识:
1、本文用例使用的操作校验(表单服务)规则是:“合法性检查,字段必录”,在它的前置条件中,FMaterialId返回的是BOSDynamicRow(行级数据包)对象,可以直接用FMaterialId.FName获取当前行物料基础资料字段的物料名称,不需要遍历。
2、如果,操作校验(表单服务)规则是:“单据合法性校验”,在它的前置条件中,FMaterialId返回的是LazyCollection<object, DynamicObject>,可以简单理解为懒加载DynamicObject对象集合(单据体所有行中的FMaterialId字段DynamicObject对象集合),此对象可以简单理解为DynamicObject对象的集合,每1行是1个DynamicObject对象,每1行对象仅存放了该行FMaterialId字段的数据包(绝不含其他字段)。LazyCollection对象(例如FMaterialId)具有TargetObjects属性,可通过FMaterialId.TargetObjects[行号从0开始]属性,获取指定行号的DynamicObject对象;或者,可通过for in表达式遍历FMaterialId,遍历获取每行DynamicObject对象。
3、需要注意,访问DynamicObject对象的属性值,需要用.【绑定实体属性】名(也叫ORM实体名),例如获取“物料.名称”,需要用到“物料”基础资料中名称字段的【绑定实体属性】名,如下图所示,所以,正确的写法是DynamicObject对象.Name,而非DynamicObject对象.FName。
4、对于Python条件判断而言,被放置在条件判断位置的对象,如果为None、False、""、0、[]、()、{},则直接视为False(假)。
推荐阅读