
# 如何按生产订单获取材料预留
## 本文解决的问题
通过生产订单分录获取获取该订单的所有的材料预留关系
## 需要自行了解的前置知识点
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**:源单的业务对象标识