心有所想,即时分享,源于我做的表单插件案例;
金蝶云社区-陈宋良
陈宋良
0人赞赏了该文章 589次浏览 未经作者许可,禁止转载编辑于2017年06月08日 15:41:05

给客户做这么一张单据,实现【我】想知道这些物料在【我】指定的即时库存中的库存量是多少,便以利用。具体操作: 1,选物料 -- > 指定即时库存 ---> 点查询;
2,填需求量 --> 点保存 (自动删调不填需求量的所有行)

先发两张效果图:

直接上我的插件核心(随手复制张贴):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Orm.Metadata.DataEntity;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Core.DynamicForm;

namespace KingdeeHaikou.BOS.Core.ApplicationRequisition
{
//供应链 - 库存管理 - 申请调拨单插件
public class applicationRequisition : AbstractBillPlugIn
{
/// 编者:陈宋良 2017-05-25
/// 申请调拨单插件:
/// 以物料编码、仓库编码为标,匹配当前调拨申请单中选中的物料和仓库去对应即时库存的物料和仓库,如果一致,则取到该即时库存的库存量,
/// 并遍历给申请调拨单单据体(分录列表)赋值。
/// 优化: 1 - n - 1
///
///
/// 主要参解:
/// selectItems : 即时库存的字段片段信息
/// filters : 即时库存的快速过滤对象
/// newLibraryDataModels: 即时库存的数据模型(即【key - value】 <==> ORM模型映射)
/// cons :申请调拨单列表数据模型
/// dyObjects1、dyObjects2、dyObjects3: 当前选到的仓库数据信息(此方式取要先引用属性用上该基础资料的要取的字段)
///

//菜单保存操作控制--删除需求量为 0 的单据体行
public override void BarItemClick(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.BarItemClickEventArgs e)
{
base.BarItemClick(e);
//取单据体的需求量列值
//如果取到行为0,获取当前行号,删除
Entity entitys = this.View.BillBusinessInfo.GetEntity("FEntity");
DynamicObjectCollection cons = entitys.DynamicProperty.GetValue(this.Model.DataObject) as DynamicObjectCollection;

if (e.BarItemKey == "tbSave" || e.BarItemKey == "tbSplitSave") //
{

for (int i = cons.Count - 1; i >= 0; i--)
{
//int ii = Convert.ToInt32(cons[i]["Seq"]);
if (Convert.ToInt32(cons[i]["F_CMK_Qty3"]) == 0) //
{
this.View.Model.DeleteEntryRow("FEntity", i); //ii-1 删除少行的原因:此句执行会导致,cons减一,即行数少了,导致循环条件不满足。未进行下面的遍历删除 (故得i--处理)
}

}

}
}

public override void ButtonClick(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.ButtonClickEventArgs e)
{
base.ButtonClick(e);
List selectItems = new List();
selectItems.Add(new SelectorItemInfo("FStockId"));
selectItems.Add(new SelectorItemInfo("FStockName"));
selectItems.Add(new SelectorItemInfo("FQty"));
selectItems.Add(new SelectorItemInfo("FMaterialId"));
selectItems.Add(new SelectorItemInfo("FMaterialName"));
selectItems.Add(new SelectorItemInfo("F_CMK_Text"));
OQLFilter filters = new OQLFilter();
filters.Add(new OQLFilterHeadEntityItem { FilterString = string.Format("FStockOrgId = {0}", this.Model.Context.CurrentOrganizationInfo.ID) });
DynamicObject[] newLibraryDataModels = BusinessDataServiceHelper.Load(this.Context, "STK_Inventory", selectItems, filters);
//String str = Convert.ToString(newLibraryDataModels[0]["MaterialID_Id"]);
Entity entitys = this.View.BillBusinessInfo.GetEntity("FEntity");
DynamicObjectCollection cons = entitys.DynamicProperty.GetValue(this.Model.DataObject) as DynamicObjectCollection;
DynamicObject dyObjects1 = this.View.Model.GetValue("F_CMK_WareHouseOne") as DynamicObject;
DynamicObject dyObjects2 = this.View.Model.GetValue("F_CMK_WareHouseTwo") as DynamicObject;
DynamicObject dyObjects3 = this.View.Model.GetValue("F_CMK_WareHouseThree") as DynamicObject;

String LibraryNumber01 = Convert.ToString(dyObjects1["Number"]); //申请调拨单的仓库一编码
String LibraryNumber02 = Convert.ToString(dyObjects2["Number"]); //申请调拨单的仓库二编码
String LibraryNumber03 = Convert.ToString(dyObjects3["Number"]); //申请调拨单的仓库三编码

if (e.Key.ToUpper() == "F_CMK_BUTTON")
{

for (int i = 0; i < cons.Count; i++)
{
Decimal sum01 = 0; // 用于累加即时库存中多行同一物料的
Decimal sum02 = 0;
Decimal sum03 = 0;
for (int j = 0; j < newLibraryDataModels.Count(); j++)
{
DynamicObject libraryDatas = newLibraryDataModels[j]["StockID"] as DynamicObject;
String LibraryNumber = Convert.ToString(libraryDatas["Number"]); //即时库存的仓库编码

DynamicObject materialDatas = cons[i]["F_CMK_Base3"] as DynamicObject;
String MaterialNumber = Convert.ToString(materialDatas["Number"]); //申请调拨单的物料编码
DynamicObject newLibaryDatas = newLibraryDataModels[j]["MaterialID"] as DynamicObject;
String MaterialNumber01 = Convert.ToString(newLibaryDatas["Number"]); //即时库存的物料编码

if(LibraryNumber01.Equals(LibraryNumber) && MaterialNumber.Equals(MaterialNumber01))
{
sum01 += Convert.ToDecimal(newLibraryDataModels[j]["FQty"]);
this.Model.SetValue("F_CMK_Qty", sum01, i);
}
if (LibraryNumber02.Equals(LibraryNumber) && MaterialNumber.Equals(MaterialNumber01))
{
sum02 += Convert.ToDecimal(newLibraryDataModels[j]["FQty"]);
this.Model.SetValue("F_CMK_Qty1", sum02, i);
}
if (LibraryNumber03.Equals(LibraryNumber) && MaterialNumber.Equals(MaterialNumber01))
{
sum03 += Convert.ToDecimal(newLibraryDataModels[j]["FQty"]);
this.Model.SetValue("F_CMK_Qty2", sum03, i);
}
}

}

}
this.View.UpdateView("FEntity");
}

}
// 有疑问的可以一起学习............................