
文主要讲述如何将缺料分析子项明细的字段携带到缺料清单汇总表
## 需要提前了解的知识点
1.操作插件的开发(本文使用python操作插件作为案例,有编译条件的可以使用.net作为开发语言,一样的效果)
2.缺料分析单与缺料分析子项明细的元数据模型关系
## 样例
### 我希望在缺料分析单的缺料清单带入子项明细的订单编号信息。
#### 需要做的事情
1.缺料清单加入需要携带的目标字段(跟缺料分析子项明细的字段类型,字段的元数据类型需要保持一致)。比如下图所示,扩展缺料分析单,在缺料清单加入F_ISVCODE_MOBILLNO,元数据类型参考缺料分析子项明细的订单编号字段


2.检查缺料分析子项明细对应字段所在的物理表,确定是否在拆分表。当前缺料分析子项明细的订单编号在默认表下为T_PRD_PMPPBOMENTRY。如果字段是在拆分表上,则该字段对应的物理表为表名+拆分表后缀。如调拨数量则在_A拆分表上,物理表全名为T_PRD_PMPPBOMENTRY_A

3.扩展缺料分析单,于操作列表>保存操作>插件列表>注册Python插件加入二次开发插件,实现功能。有编译部署条件的朋友可以用.net实现,注册插件也是一样的。


4.在插件的SQL里加入需要更新的字段,具体修改在于SQL语句中U2加入子项明细字段的取数列默认表是([S1.字段名],拆分表为[S2.字段名]),更新语句加入U2更新U1的子句。以下附上本次样例的插件脚本以作参考
#### 插件代码
```python
import clr
clr.AddReference('Kingdee.BOS.ServiceHelper')
from Kingdee.BOS.ServiceHelper import DBServiceHelper
from Kingdee.BOS import SqlParam
from Kingdee.BOS import KDDbType
from System.Collections.Generic import List
def AfterExecuteOperationTransaction(e):
sql="MERGE INTO T_PRD_LACKENTRY U1 USING(SELECT S.FID,S.FSUMMARYID,S.FENTRYID,S1.FMOBILLNO FROM (SELECT T1.FID,T2.FSUMMARYID,MIN(T1.FENTRYID) AS FENTRYID FROM T_PRD_PMPPBOMENTRY T1 INNER JOIN T_PRD_PMPPBOMENTRY_A T2 ON T1.FENTRYID = T2.FENTRYID and t1.fid = @lFId GROUP BY T1.FID,T2.FSUMMARYID) S INNER JOIN T_PRD_PMPPBOMENTRY S1 ON S.FENTRYID = S1.FENTRYID INNER JOIN T_PRD_PMPPBOMENTRY_A S2 ON S.FENTRYID = S2.FENTRYID) U2 ON U1.FID = U2.FID AND U1.FSUMMARYID = U2.FSUMMARYID WHEN MATCHED THEN UPDATE SET U1.F_ISVCODE_MOBILLNO = U2.FMOBILLNO;"
para = SqlParam('@lFId',KDDbType.Int64,e.DataEntitys[0]['Id'])
pls = List[SqlParam]()
pls.Add(para)
DBServiceHelper.Execute(this.Context,sql,pls)
```
#### SQL语句
MERGE INTO T_PRD_LACKENTRY U1 USING(SELECT S.FID,S.FSUMMARYID,S.FENTRYID,==S1.FMOBILLNO== FROM (SELECT T1.FID,T2.FSUMMARYID,MIN(T1.FENTRYID) AS FENTRYID FROM T_PRD_PMPPBOMENTRY T1 INNER JOIN T_PRD_PMPPBOMENTRY_A T2 ON T1.FENTRYID = T2.FENTRYID and t1.fid = @lFId GROUP BY T1.FID,T2.FSUMMARYID) S INNER JOIN T_PRD_PMPPBOMENTRY S1 ON S.FENTRYID = S1.FENTRYID INNER JOIN T_PRD_PMPPBOMENTRY_A S2 ON S.FENTRYID = S2.FENTRYID) U2 ON U1.FID = U2.FID AND U1.FSUMMARYID = U2.FSUMMARYID WHEN MATCHED THEN UPDATE SET ==U1.F_ISVCODE_MOBILLNO = U2.FMOBILLNO==;
## FAQ
1.缺料分析子项明细为什么在缺料分析单元数据上不可见?
答:因为缺料分析的数据范围比较大,缺料分析输出的子项明细数据规模不可控,可能会达到上万到十几万的级别。上限太高,如果这部分数据附带在缺料分析单,作为一个单据体进行展示,无论从渲染角度还是从数据对照角度都是非常的不友好,故子项明细被分离出去作为独立的列表进行展示,通过列表加载数据的机制优化界面渲染以及数据查找速度。
2.缺料清单的数据是如何从子项明细汇总进来的?
答:缺料分析完成后,各子项明细的数据按照料号+BOM版本+货主+MTO跟踪号+辅助属性进行汇总。因为存在汇总逻辑,对于一些订单相关的字段,在缺料清单里因为取数不唯一而没有添加。
3.我如何知道缺料清单分录是从什么子项明细汇总生成的?
答:缺料清单以及子项明细均添加了汇总标识字段,在BOS设计器打开缺料分析单的元数据,可以在缺料清单实体找的到标识为FSUMMARYID的汇总标识字段,这个字段的值在当前的缺料清单唯一,并且会在完成汇总逻辑后将其写回缺料分析子项明细的同名字段FSUMMARYID。通过从缺料清单的FSUMMARYID反向查找缺料分析子项明细的数据,即可能追溯到汇总前的子项明细。
4.我如何将我需要的字段加入缺料清单?
答:可以通过使用FSUMMARYID找到对应子项明细并把值通过SQL写入缺料清单的汇总表,这可以在缺料分析完成后进行加入二次开发逻辑实现。因为每次分析完毕后,标准产品会自动调用一次缺料分析单的保存以保存分析生成的缺料清单,二次逻辑可以附带在缺料分析单的保存操作上进行实现。