【已解决】构建物料数据包并保存的问题(不调用物料窗...
金蝶云社区-王兴旺
王兴旺
1人赞赏了该文章 1,939次浏览 未经作者许可,禁止转载编辑于2015年07月24日 13:32:57

各位管理员并丁工好:
上次此需求中,丁工回复如下,经过这几天努力,解决了部分问题,还有部分问题请指点(以下丁工的回复引文):

[quote]开发步骤:
1. 定义一个动态表单;
2. 在动态表单上添加文本字段 - 产品图号;添加按钮 - 引入PDM系统数据;
3. 把动态表单发布到主控台;
4. 编写动态表单插件,重载ButtonClick事件,在事件中,实现如下功能:
4.1. 根据用户录入的产品图号,读取第三方系统的资料;
4.2. 利用物料(BD_Material)的元数据,构建出物料数据包,把从第三方系统读取的物料,填写到数据包;
4.3 调用Save操作,保存物料
4.4 重复4.2 - 4.3步骤,保存其他数据

参考文档:
第4步:插件开发百问百答 - 1.1.1 如何创建并启用动态表单插件

第4.2:抱歉,没有针对性的文档,现场写一个:
BusinessInfo info = (Kingdee.BOS.ServiceHelper.MetaDataServiceHelper.Load(this.Context, "BD_Material") as FormMetaData).BusinessInfo;
DynamicObject newMaterial = new DynamicObject(info.GetDynamicObjectType());
newMaterial["Number"] = "编码";
newMaterial["其他属性"] = "其他属性值";
...

第4.3:查看开发白问百答 - 2.1.2 如何调用保存(Save)操作[/quote]
需求场景:
1、通过动态表单已可以从PDM中提取工程BOM结构,以及零件的工艺路线信息,以下需求基于以下假设:
A)从PDM系统中读取工程BOM已没有问题;
B)操作者已把EBOM中的零件信息转换为K3物料模板格式,数据层面已具备创建K3物料的条件(见下图);

需要解决的问题:
1、不想调用K3物料维护窗体,如何在上图插件中实现通过代码保存物料(暂不考虑物料属性校验,以及字典合法性校验);
2、引文上文4.2 是否可以给我一点完整的代码;
3、百问百答中,保存操作有2种(Web层插件、APP层插件),此需求中应该选择哪种,还是其它方案?
3.1、WEB层插件示例代码中,结合上文需求, DataObject 应该如何构建?
[indent] [System.ComponentModel.Description("区分当前类应用在哪个模型上")]
public class Class2 : AbstractBillPlugIn
{
public override void ButtonClick(ButtonClickEventArgs e)
{
//直接调用Orm保存,把数据保存到数据库
BusinessDataServiceHelper.Save(this.Context, this.View.Model.DataObject);
//执行保存服务端服务和保存操作的服务端插件
BusinessDataServiceHelper.Save(this.Context, this.View.BusinessInfo, this.View.Model.DataObject);
}
}
[/indent]
3.2、App层插件示例中,结合需求,如何新增物料代码如何写?(示例是打开)
即 DynamicObject[] objs = viewService.Load(this.Context,new object[] { 10001 },
materialMetadata.BusinessInfo.GetDynamicObjectType());
[code] [System.ComponentModel.Description("区分当前类应用在哪个操作上")]
public class Class1 : AbstractOperationServicePlugIn
{
public override void BeforeExecuteOperationTransaction(
BeforeExecuteOperationTransaction e)
{
//例如:保存id为10001的物料
//获取元数据服务
IMetaDataService metadataService = Kingdee.BOS.App.ServiceHelper.GetService();
//获取保存服务
ISaveService saveService = Kingdee.BOS.App.ServiceHelper.GetService();
//获取加载数据服务
IViewService viewService = Kingdee.BOS.App.ServiceHelper.GetService();

//获取物料元数据
FormMetadata materialMetadata = metadataService.Load(this.Context,"BD_Material") as FormMetadata;
//获取id为10001的物料数据
DynamicObject[] objs = viewService.Load(
this.Context,
new object[] { 10001 },
materialMetadata.BusinessInfo.GetDynamicObjectType());
//保存id为10001的物料
saveService.Save(this.Context, objs);
saveService.Save(this.Context, materialMetadata.BusinessInfo, objs);
}
}
[/code]