【二开指导】凭证录入根据指定的核算维度值自动带出对应的凭证字原创
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); } } }
推荐阅读