参考:遍历单据体,lambda函数的应用:https://vip.kingdee.com/link/s/lvVjD
Lambda 用来循环判断销售订单明细各字段是否符合条件
Filter 返回符合条件的值列表
Len 判断filter返回列表的值个数
组合起来就是:把符合条件的明细行集合为一个值列表,然后看该列表中值个数。
例: len(filter(lambda x : (x.F_JD_Base.FProperty['Name'].ToString = '采购员'), FEntity)) > 0
这个红框中是写条件的地方,可以多个条件使用and、or连接;注意括号的位置。
关于lambda表达式的说明如下:
例:单据体字段
单据体中的字段,公式取到的是一个集合,不能直接跟常量进行比较。
需要lambda表达式,对单据体行进行循环,逐行取基础资料字段值进行比较:
len(filter(lambda x : (x.F_JD_Base.FProperty['Name'].ToString = '采购员'), FEntity)) > 0
说明:FEntity是单据体标识,公式中取到的是 BOSDynamicRow
集合 x 代表单据体当前行,类型为BOSDynamicRow;
允许直接使用"."取字段值;
F_JD_Base.FProperty['Name'] 返回的是多语言文本对象,需要使用ToString()函数,转换成纯文本 ;
例:基础资料单据体属性值
如需对基础资料字段,单据体中属性进行比较,也需要使用lambda进行循环:
len(filter(lambda x: ( x['Post']['Name'].ToString() = '璧山分公司总经理' ), FStaffId.PostEntity)) > 0
说明: FStaffId.PostEntity中,PostEntity 是基础资料单据体的Orm实体名
FStaffId.PostEntity 返回值,是DynamicObject集合,需要通过x['PropName']的方式,取各属性值
例:单据检查没有启用序列号的物料是否填写了序列号
len(filter(lambda x:(x.FMaterialID != null and x.FMaterialID.FIsSNManage=False and len(x.FSerialSubEntity)>0), FInStockEntry))>0
其中 FInStockEntry 是单据体标识,FSerialSubEntity 是序列号子单据体标识
推荐阅读