实现价格汇总到单据头需求,DataChanged例子,C#改写python例子,数据模型查找字段原创
金蝶云社区-空鹅机
空鹅机
4人赞赏了该文章 62次浏览 未经作者许可,禁止转载编辑于2024年09月25日 09:37:55
summary-icon摘要由AI智能服务提供

本文描述了在金蝶软件中为采购订单添加总价格字段并实时更新的过程。通过编写插件代码,当采购数量("FQty")或含税单价("FTaxPrice")发生变化时,计算每一行的价税合计,并汇总到采购订单的单体头总价格("FTotalAmount")字段。文章还探讨了如何在金蝶平台中导出和查找字段,以及处理过程中遇到的错误和注意事项,如正确使用字段标识和绑定实体属性。

需求:

在采购订单中!

将每一行的    价税合计      汇总到单体头的  总价格("FTotalAmount")字段

其中,价税合计  由  采购数量("FQty") * 含税单价("FTaxPrice")

并且,要更新了采购数量或者含税单价之后,要自动更新 总价格 字段。


整体思路:

  • 新建一个总价格("FTotalAmount")字段

  • 搞清楚这采购数量和含税单价字段的标识是什么?

  • 搞清楚这里面的逻辑(需求写的很明白了)

  • 编写代码


搞清楚字段标识

image.png

选择数据模型,导出这个采购订单的设计文档,能够帮你快捷找到字段的中文信息。

(当然你也可以使用 工具栏-编辑 -批量编辑字段属性 来进行查找,只是效率比较低,最不能接受的一点就是,他会锁住我的协同开发平台,难受,这不是极端的选择,根据你的需求来定,有时候还是很好用的。)

image.png

导出,写个名字

image.png

打开效果

image.png

小插曲
你有没有想过,如果我把整个金蝶里面的单据都导出为文档,那我岂不是一劳永逸,随便查找字段?
答案是:我这么干过,导出的html文件数据量庞大,一张单据数据量为1M,我导出的文件大小为500M左右。 你的浏览器加载这些文档需要耗费大量的内存,结果就是,整个浏览器卡死,自动退出。 

另外一个,如果你多选了单据,并选择了导出呢?
答案:是的,他们会合并在一起。 这在你面临涉及多个单据的需求的时候,导出一份这样的文档还挺有用的。



image.png

添加总价格字段!

在工具箱,业务,找到金额,拖出来

然后将他们的标识,字段名,绑定实体属性都设置为 FTotalAmount 

image.png


整体逻辑

使用DataChanged方法

此方法会在你每次操作之后,检查你修改了什么字段 

e.Field.Key这表明修改字段的标识 

e.Row 是发生改变的行 

e.NewValue 是改变后的值 

e.OldValue 是改变前的值 


那么,我们检测用户是否填写采购数量 或是 含税单价 

如果这两个字段的值发生了改变 

那么,我们就计算单据体中这一行的价税合计 

然后,计算所有行的价税合计,写到单据头的总价格

image.png

代码来咯!

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!");
            }
        }
    }
}

生成这个插件,放到金蝶的目录之下,在表单插件中注册此插件。

image.png

运行!

image.png


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"]);//错误的,这个是标识

什么时候用标识什么时候用绑定实体标识呢?
在数据包之外(使用括号的时候),都用标识, 如果你已经在数据包了(使用中括号的时候),就要用绑定实体标识

image.png

还有更多的时候,没有什么反应,点了,也没反应,也没报错。

原来是我写错字段标识了,我用了Upper()方法。 嗯????为什么呢? 不知道。

image.png


image.png



图标赞 4
4人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!