【二开指导】凭证录入根据指定的核算维度值自动带出对应的凭证字原创
金蝶云社区-战斗的凯文
战斗的凯文
7人赞赏了该文章 135次浏览 未经作者许可,禁止转载编辑于2024年01月12日 15:52:19

前言:

        有客户希望在凭证录入时实现当选择不同银行账号时,自动指定不同的凭证字。通常情况下,凭证录入时是先指定凭证字,然后再在分录上录入不同的分录及核算维度,如银行账号,且一张凭证上的分录会有多行,银行账号也可能会有多个,如果要实现根据银行账号来反向自动带出凭证字,就会面临如果分录上有多个不同的银行账号时,最终应该取哪一个对应的凭证字的问题。本方案使用最后录入银行账号对应的凭证字。

实现思路:

        每次数据发生变化时,判断如果是核算维度数据,就取其值,解析出核算维度组合中的银行账号维度的值是否不为空,如不为空,就根据这个维度值,取对应的凭证字,最后将这个凭证字的值更新到凭证字字段上去。

重难点讲解:

        二开插件干预的事件为DataChanged事件。伪代码如下:

public override void DataChanged(DataChangedEventArgs e)
{
    base.DataChanged(e);
    switch (e.Field.Key.ToUpperInvariant())
    {
        case "FDETAILID":                                
        //核算维度F8开窗时也会触发DataChanged事件,此时的e.FlexField不为空,只有真正的FDETAILID字段的值更新事件才需要执行后续操作
            if (e.FlexField == null && e.NewValue.IsNullOrEmptyOrWhiteSpace())
            {
                //根据银行账号指定凭证字
                SetVoucherGroupIDByBankAccount(e.Row);                                      
            }
            break;
    }
}
                  
private void SetVoucherGroupIDByBankAccount(int iRow)
{
    Kingdee.BOS.Core.Metadata.EntityElement.Entity entry = this.View.Model.BusinessInfo.GetEntryEntity(strEntryKey);
    var dyRow = this.View.Model.GetEntityDataObject("FENTITY", iRow);
    //得到核算维度组合对象
   DynamicObject dyFlexObj = dyRow["DETAILID"] as DynamicObject;
   if (dyFlexObj != null)
    {
        //假设银行账号的核算维度标识是FF100001
        var id = Convert.ToInt64(dyFlexObj["F100001_Id"]);
        if(id>0)
        {
            //根据银行账号取对应的凭证字ID,该方法请根据需求自行定义
            var lVoucherGroupID = GetVoucherGroupIDByBankAccountID(id);
            //将这个凭证字的值更新到凭证字字段上去
            this.View.Model.SetValue("FVOUCHERGROUPID",lVoucherGroupID,-1);
        }
    }
}


赞 7