IN操作高级使用技巧:判断物料名称是否包含多个关键词原创
金蝶云社区-深圳周少斌
深圳周少斌
57人赞赏了该文章 2139次浏览 未经作者许可,禁止转载编辑于2022年4月13日 18:49:36

针对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。

说明:

  1. 上述表达式中的for…name…in循环遍历用法是精髓,属于“Python生成器推导式”。name为循环计数器,用于遍历并依次承载IN[]中的关键词,去逐次与FMaterialId.FName(物料名称)比较字符串包含关系。

  2. name也可以自行随意另取名称,但首尾两处一定要名称一致(两处蓝色字体部分要名称一致)。

  3. any(x)判断括号内的对象成员是否全部为 False,则返回 False,如果其中有1个为 True,则返回 True。若any(x)返回True,说明[]中的多个关键词与物料名称依次比较包含关系,至少有1个关键词被包含于当前行的物料.名称中。在本例中,代表了该行物料名称被判定为属于IT电脑设备,需要执行“电脑详细配置型号字段必录”的操作校验(表单服务)规则:“合法性检查,字段必录”。



1.png



扩展知识:

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(假)。


5、 Python生成器推导式详解


image.png

57