在某些实际业务场景下,可能需要将某两种物料成批销售给客户,即不允许单独将某一物料销售给客户,这种需求除了写二开插件代码外,还可以通过在销售订单保存操作上添加'单据合法性校验'来实现的,本文将演示相关步骤。
首先打开BOSIDE,扩展销售订单,在销售订单的保存操作的校验规则中添加相关配置,如下图1-1所示:
图1-1
上图1-1中利用了python表达式:(len(filter(lambda x: x.FMaterialId.FNumber = '1.0.0.6', FSaleOrderEntry)) > 0 AND len(filter(lambda x: x.FMaterialId.FNumber = '1.0.0.5', FSaleOrderEntry)) <= 0 ) OR ( len(filter(lambda x: x.FMaterialId.FNumber = '1.0.0.5', FSaleOrderEntry)) > 0 AND len(filter(lambda x: x.FMaterialId.FNumber = '1.0.0.6', FSaleOrderEntry)) <= 0 )
其中的1.0.0.5和1.0.0.6分别代表两种要成对销售的物料编码(客户可按需要替换成对应的物料编码),filter函数利用lambda表达式过滤销售订单单据体中的某种物料后再调用len函数计算过滤后的条目数,当有销售订单单据体中有1.0.0.5物料但没有1.0.0.6物料,或者有1.0.0.6物料但没有1.0.0.5物料时,校验不通过。如果是成对销售的物料的数量必需一致,则可以使用sum函数汇总数量,如下图1-2所示:
图1-2
上图1-2中的表达式为:sum(map(lambda x : (x.FQty if(x.FMaterialId.FNumber = '1.0.0.6') else 0), FSaleOrderEntry)) <> sum(map(lambda x : (x.FQty if(x.FMaterialId.FNumber = '1.0.0.5') else 0), FSaleOrderEntry))
其中的map函数利用lambda表达式投影销售数量字段(如果是成对销售的物料,则投影对应的销售数量,否则投影数量0),再利用sum函数计算汇总值。
BOSIDE里面保存以上二开的校验后,当销售订单只录入一个要成对销售的物料时,保存操作将拦住,提示如下图2-1所示:
图2-1
当销售订单录入了两个要成对销售的物料,但数量不一致时,保存操作也将拦住,提示如下图2-2所示:
图2-2
当销售订单录入了两个要成对销售的物料,且数量一致时,保存操作将成功执行,如下图2-3所示:
图2-3
推荐阅读