目前PLM物料属性发生变更后,引用该物料的BOM重新保存或检入的时候才会更新这个物料关联的属性值,如果想要物料属性变化时就及时更新BOM中关联属性值,可以通过二次开发实现。
例如:当物料由非虚拟件转换成虚拟件时,刷新所有引用到该物料的BOM结构的对应跳层复选框执行勾选。
操作步骤:
一、获取引用该物料的BOM的方法
BOM和其下层物料的关系表是T_PLM_CFG_RELATION,FID是BOM内码,FSLAVERELATIONID是子项物料内码,所以可通过脚本查询引用该物料的BOM,例如:
SELECT * FROM T_PLM_CFG_RELATION WHERE FSLAVERELATIONID=@FSLAVERELATIONID
然后也可以根据业务要求自行补充过滤条件,例如只想要查询EBOM,则可以再关联查询PDM基础对象表T_PLM_PDM_BASE,例如:
SELECT RE.* FROM T_PLM_CFG_RELATION RE LEFT JOIN T_PLM_PDM_BASE BASE ON RE.FID=BASE.FID WHERE FSLAVERELATIONID=@FSLAVERELATIONID AND BASE.FCATEGORYID=1030100000000000000
二、修改BOM中关联属性值的方法
如果只是简单的修改BOM组成中的关系属性值,则可以直接使用脚本更新,例如
1、UPDATE T_PLM_CFG_RELATION SET FISSKIP=1 WHERE FSLAVERELATIONID=@FSLAVERELATIONID
2、UPDATE T_PLM_CFG_RELATION RE SET RE.FISSKIP=1 WHERE RE.FSLAVERELATIONID=@FSLAVERELATIONID AND EXISTS (SELECT 1 FROM T_PLM_PDM_BASE BASE WHERE RE.FID=BASE.FID AND BASE.FCATEGORYID=1030100000000000000)
public void UpdateRelation(PLMContext ctx, long objectId) { var lst = new List<SqlParam> { new SqlParam("@FID", KDDbType.Int64, objectId) }; string sql = "UPDATE T_PLM_CFG_RELATION RE SET RE.FISSKIP=1 WHERE RE.FSLAVERELATIONID=@FSLAVERELATIONID AND EXISTS (SELECT 1 FROM T_PLM_PDM_BASE BASE WHERE RE.FID=BASE.FID AND BASE.FCATEGORYID=1030100000000000000)"; PLMDBUtils.Instance.Execute(ctx, sql, lst); }
三、物料保存时更新BOM
可以在物料执行“保存”、“检入”操作后,判断物料由非虚拟件转换成虚拟件,执行步骤二中修改BOM中关联属性值的方法即可,添加新的单据插件或列表插件,重载AfterDoOperation方法。
public override void AfterDoOperation(AfterDoOperationEventArgs e) { if (物料由非虚拟件转换成虚拟件) { switch (e.Operation.Operation.ToUpper()) { //保存 case "SAVE": //修改BOM中关联属性值的方法 UpdateRelation(); break; //检入 case "OPCHECKIN": //修改BOM中关联属性值的方法 UpdateRelation(); break; } } base.AfterDoOperation(e); }
推荐阅读