本文描述了在金蝶软件中为采购订单添加总价格字段并实时更新的过程。通过编写插件代码,当采购数量("FQty")或含税单价("FTaxPrice")发生变化时,计算每一行的价税合计,并汇总到采购订单的单体头总价格("FTotalAmount")字段。文章还探讨了如何在金蝶平台中导出和查找字段,以及处理过程中遇到的错误和注意事项,如正确使用字段标识和绑定实体属性。
需求:
在采购订单中!
将每一行的 价税合计 汇总到单体头的 总价格("FTotalAmount")字段
其中,价税合计 由 采购数量("FQty") * 含税单价("FTaxPrice")
并且,要更新了采购数量或者含税单价之后,要自动更新 总价格 字段。
整体思路:
新建一个总价格("FTotalAmount")字段
搞清楚这采购数量和含税单价字段的标识是什么?
搞清楚这里面的逻辑(需求写的很明白了)
编写代码
搞清楚字段标识
选择数据模型,导出这个采购订单的设计文档,能够帮你快捷找到字段的中文信息。
(当然你也可以使用 工具栏-编辑 -批量编辑字段属性 来进行查找,只是效率比较低,最不能接受的一点就是,他会锁住我的协同开发平台,难受,这不是极端的选择,根据你的需求来定,有时候还是很好用的。)
导出,写个名字
打开效果
小插曲 你有没有想过,如果我把整个金蝶里面的单据都导出为文档,那我岂不是一劳永逸,随便查找字段? 答案是:我这么干过,导出的html文件数据量庞大,一张单据数据量为1M,我导出的文件大小为500M左右。 你的浏览器加载这些文档需要耗费大量的内存,结果就是,整个浏览器卡死,自动退出。 另外一个,如果你多选了单据,并选择了导出呢? 答案:是的,他们会合并在一起。 这在你面临涉及多个单据的需求的时候,导出一份这样的文档还挺有用的。
添加总价格字段!
在工具箱,业务,找到金额,拖出来
然后将他们的标识,字段名,绑定实体属性都设置为 FTotalAmount
整体逻辑
使用DataChanged方法
此方法会在你每次操作之后,检查你修改了什么字段
e.Field.Key这表明修改字段的标识
e.Row 是发生改变的行
e.NewValue 是改变后的值
e.OldValue 是改变前的值
那么,我们检测用户是否填写采购数量 或是 含税单价
如果这两个字段的值发生了改变
那么,我们就计算单据体中这一行的价税合计
然后,计算所有行的价税合计,写到单据头的总价格
代码来咯!
using System; using Kingdee.BOS.Core.Bill.PlugIn; using Kingdee.BOS.Util; using System.ComponentModel; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; namespace testBlue { [Description("HotUpdateEnabled"), HotUpdate] public class test : AbstractBillPlugIn { public override void DataChanged(DataChangedEventArgs e) { base.DataChanged(e); switch (e.Field.Key) { case "FQty"://采购数量发生变化的话,就用新的采购数量(e.NewValue) 乘 采购数量 decimal price = Convert.ToDecimal(this.Model.GetValue("FTaxPrice", e.Row)); this.Model.SetValue("FAllAmount", price * Convert.ToInt32(e.NewValue), e.Row); ComputeTotalAmount(); break; case "FTaxPrice"://含税单价 , 逻辑同上 int qty = Convert.ToInt32(this.Model.GetValue("FQty")); this.Model.SetValue("FAllAmount", qty * Convert.ToInt32(e.NewValue), e.Row); ComputeTotalAmount(); break; } } private void ComputeTotalAmount() { //获取单据体信息 var entryEntity = this.View.BillBusinessInfo.GetEntryEntity("FPOOrderEntry"); //获取单据体的数据包 var entryData = this.Model.GetEntityDataObject(entryEntity); //用于汇总每一行的价税合计 decimal totalAmount = 0; //遍历每一行,将价税合计加到totalAmount中 foreach (var entryRow in entryData) { totalAmount += Convert.ToDecimal(entryRow["AllAmount"]); } //将总价格 的值 设置为 totalAmount this.Model.SetValue("FTotalAmount", totalAmount); } public override void AfterBarItemClick(AfterBarItemClickEventArgs e) { base.AfterBarItemClick(e); if(e.BarItemKey.EqualsIgnoreCase("test")) { this.View.ShowMessage("HotUpdate!yes!"); } } } }
生成这个插件,放到金蝶的目录之下,在表单插件中注册此插件。
运行!
python版本
import clr clr.AddReference("System") from System import * def DataChanged(e): #switch(e.Field.Key) #python中没有switch语句! if e.Field.Key == "FQty": price = Convert.ToDecimal(this.Model.GetValue("FTaxPrice", e.Row)) this.Model.SetValue("FAllAmount", price * Convert.ToInt32(e.NewValue), e.Row) ComputeTotalAmount() if e.Field.Key == "FTaxPrice": qty = Convert.ToInt32(this.Model.GetValue("FQty")); this.Model.SetValue("FAllAmount", qty * Convert.ToDecimal(e.NewValue), e.Row) ComputeTotalAmount() def ComputeTotalAmount(): entryEntity = this.View.BillBusinessInfo.GetEntryEntity("FPOOrderEntry") entryData = this.Model.GetEntityDataObject(entryEntity) totalAmount = 0 for entryRow in entryData: totalAmount += Convert.ToDecimal(entryRow["AllAmount"]) this.Model.SetValue("FTotalAmount", totalAmount)
看起来一帆风顺一气呵成的文章
其实中途也发生很多错误,这是忘记使用绑定实体属性,而使用标识。
totalAmount += Convert.ToDecimal(entryRow["AllAmount"]); // 正确的,在数据包中要用绑定实体标识 totalAmount += Convert.ToDecimal(entryRow["FAllAmount"]);//错误的,这个是标识 什么时候用标识什么时候用绑定实体标识呢? 在数据包之外(使用括号的时候),都用标识, 如果你已经在数据包了(使用中括号的时候),就要用绑定实体标识
还有更多的时候,没有什么反应,点了,也没反应,也没报错。
原来是我写错字段标识了,我用了Upper()方法。 嗯????为什么呢? 不知道。
推荐阅读