作者分享了关于处理物料加工规格辅助属性取值和赋值的开发经验。客户需求是物料启用加工规格辅助属性,并在销售订单下推采购申请单时自动赋值为默认加工规格。实现通过编程在采购申请单的AfterCreateNewData事件中处理,代码主要展示了如何获取单据体、查询辅助属性数据、为辅助属性赋值,并最终将赋值结果应用到单据体中。
辅助属性是一个特殊的数据,论坛中有一些说明,不够系统,近期一个客户的开发涉及到辅助属性的取值和赋值问题,折腾了好久,总算搞定,把经验分享给大家,供大家参考。
关于辅助属性取值问题,详见另一个帖子:
https://vip.kingdee.com/article/54526652264285184
先说下需求:
客户的物料启用了加工规格辅助属性,该辅助属性值来源为辅助资料
该物料设置了加工规格的默认值
业务流程为销售订单下推采购申请单,在采购申请单中为明细自动赋值为默认加工规格
实现思路:
在采购申请单中的AfterCreateNewData中处理
代码如下:
---------------------------------------------------------------
public override void AfterCreateNewData(EventArgs e)
{
//获取单据体
Entity fentity = this.View.BillBusinessInfo.GetEntity("FEntity");
DynamicObjectCollection entityObs = this.Model.GetEntityDataObject(fentity);
//将辅助属性保存到auxObj数组中,应该也可以不用定义,有兴趣的小伙伴可以试下不要定义数组来保存
//使用数组来保存每个明细的辅助属性,是因为开始的代码,所有的辅助属性总是明细的最后一条,所以用数组来区分,后来搞定后,就没改代码
DynamicObject[] auxObj = new DynamicObject[entityObs.Count];
//定义数组来保存查询结果,定义数组来保存的原因同上
DynamicObjectCollection[] doc = new DynamicObjectCollection[entityObs.Count];
//定义DynamicObject数据类型,这个是关键
//每个辅助属性都有两个字段来保存,一个是F100001,就是F加上该辅助属性内码,另一个是F100001_Id,用于保存该辅助属性对应的辅助资料的Id
DynamicObjectType auxType = new DynamicObjectType("myAuxType");
DynamicProperty FNumber = auxType.RegisterSimpleProperty("FNumber", typeof(string), string.Empty);
DynamicProperty FDataValue = auxType.RegisterSimpleProperty("FDataValue", typeof(string), string.Empty);
DynamicProperty Id = auxType.RegisterSimpleProperty("Id", typeof(string), string.Empty);
for (int i = 0; i < entityObs.Count; i++)
{
string spec = "";
if (this.Model.GetValue("F_QHOQ_TEXT", i)!=null)
{
//取物料的默认加工规格,其值等于物料的默认加工规格
spec = this.Model.GetValue("F_QHOQ_TEXT", i).ToString();
//搜索该辅助属性对应的FNumber,Id,FDatavalue
string sql = @"select a1.FNUMBER a1n,a1.FENTRYID a1f,a2.FNUMBER a2n,a3.FDATAVALUE a3n from T_BAS_ASSISTANTDATAENTRY a1
left join T_BAS_ASSISTANTDATA a2 on a1.FID=a2.FID
left join T_BAS_ASSISTANTDATAENTRY_L a3 on a1.FENTRYID=a3.FENTRYID
where a2.FNUMBER like 'JGGG' AND a3.FLOCALEID=2052 AND a3.FDATAVALUE like '" + spec + "' ";
doc[i] = DBUtils.ExecuteDynamicObject(this.Context, sql, null, null, CommandType.Text, null);
DynamicObject material = this.Model.GetValue("FMATERIALID", i) as DynamicObject;
if (material != null && doc[i].Count != 0)
{
//获取明细的辅助属性
auxObj[i] = this.Model.GetValue("FAUXPROPID", i) as DynamicObject;
//给辅助属性赋默认值
t[i] = new DynamicObject(auxType);
t[i]["FNumber"] = doc[i][0]["a1n"].ToString();
t[i]["FDataValue"] = doc[i][0]["a3n"].ToString();
t[i]["Id"] = doc[i][0]["a1f"].ToString();
auxObj[i]["F100001"] = t[i];
auxObj[i]["F100001_Id"] = doc[i][0]["a1f"].ToString();
//这个不要貌似也可以
this.Model.SetValue("FAUXPROPID", auxObj[i], i);
}
}
}
}
---------------------------------------------------------------
推荐阅读