
# 如何按生产订单获取材料预留
## 本文解决的问题
通过生产订单分录获取获取该订单的所有的材料预留关系
## 需要自行了解的前置知识点
1. 熟悉C#编程,环境版本:.net framework 4.0
2. 熟悉金蝶云星空BOS二次开发流程(开发表单插件,开发操作插件)
3. 生产订单与生产用料清单的逻辑结构
4. 预留关系的逻辑数据结构
## 问题解决步骤
1.根据生产订单获取对应的用料清单分录集合
2.根据用料清单分录集合构造预留查询参数
3.调用计划模块的预留查询服务
## 根据生产订单获取对应的用料清单分录集合
```SQL
--参考取数sql
-- FMOENTRYID 生产订单分录内码
-- FPPBOMID 用料清单内码
-- FPPBOMENTRYID 用料清单分录内码
-- FMATERIALID 生产订单的生产组织下材料物料的内码,可以额外添加物料表的链接获取对应的物料编码
SELECT T1.FENTRYID AS FMOENTRYID,T2.FID AS FPPBOMID,T3.FENTRYID AS FPPBOMENTRYID,T3.FMATERIALID FROM T_PRD_MOENTRY T1
INNER JOIN T_PRD_PPBOM T2 ON T1.FENTRYID = T2.FMOENTRYID
INNER JOIN T_PRD_PPBOMENTRY T3 ON T2.FID = T3.FID
```
## 根据用料清单分录集合构造预留查询参数
### 预留查询参数解析
```csharp
//参考代码
List<OriBillInfo> oriBillInfos = new List<OriBillInfo>();
DynamicObjectCollection ppbomlEntrys = GetPPBomEntryDatas();//获取用料清单数据包
foreach (var ppbomEntry in ppbomlEntrys)
{
OriBillInfo oriBillInfo = new OriBillInfo(MFGFormIdConst.SubSys_PRD.PPBOMBill, ppbomEntry ["FPPBomId"].ToString(), ppbomEntry["FPPBomEntryId"].ToString());
oriBillInfos.Add(oriBillInfo);
}
IReserveLinkQueryService reserveLinkQueryService = AppServiceContext.GetService<IReserveLinkQueryService>();
DynamicObject[] reserveDatas = reserveLinkQueryService.GetReserveLinkByType(this.Context, oriBillInfos,
Enums.PLN_ReserveModel.Enu_ReserveQueryType.KdDemand);
```
#### 参数类OriBillInfo
源单信息参数,构造函数包含3个参数定义
1. **billFormId**:源单的业务对象标识码(BOSIDE可查),这里是生产用料清单,为PRD_PPBOM
2. **billInterId**:源单的单据头内码,样例里是用料清单表头的内码
3. **billEntryId**:源单分录内码,用于查询预留关系所属的分录数据的实体内码,预留关系建在什么实体数据上,就取什么实体数据的内码,比如生产订单的材料预留挂在上用料清单分录上,就取用料清单分录内码。
#### 预留查询服务IReserveLinkQueryService
1. 需引用Kingdee.K3.MFG.App.dll,Kingdee.K3.MFG.Contracts.dll
2. 推荐调用AppServiceContext静态类获取接口实例
#### 接口方法GetReserveLinkByType
用于批量获取预留数据包,包含3个入口参数定义
1. **Context**:上下文
2. **List<OriBillInfo>**:源单信息参数集合
3. **Enums.PLN_ReserveModel.Enu_ReserveQueryType**:查询的预留类型:
- Enums.PLN_ReserveModel.Enu_ReserveQueryType.KdDemand:源单信息集合作为预留关系的需求方获取
- Enums.PLN_ReserveModel.Enu_ReserveQueryType.KdSupply:源单作为预留关系的供应单据获取。(如果需要查询的是采购订单被什么需求单预留的,那么OriBillInfo应该以采购订单单据标识,采购订单内码和采购订单分录内码作为构造参数)
#### 返回结果集合reserveDatas
元素类型:DynamicObject,对应的业务对象为**PLN_RESERVELINK**,自行在BOS设计器使用查找功能进行查询

逻辑结构:表头为预留的需求信息,包含源单的单据标识,内码,分录内码,需求数量等,具体业务定义在BOS设计器中自行参考。表体为预留的供应信息,包含该预留关系中所有参与供应的单据以及供应数量。供应数量只有基本单位统计,有业务单位数量转换是需求请自行处理。(相关知识点:获取单位换算率)