二开实现单据体上移下移数据行,导致上下游关系丢失或是单据体数据行丢失原创
金蝶云社区-Running
Running
3人赞赏了该文章 197次浏览 未经作者许可,禁止转载编辑于2024年01月06日 11:37:17

1、问题现象

  • 单据下推或是选单新增,单据体上移下移数据行,单据保存后,单据上下游关系丢失

  • 新增单据,单据体上移下移数据行,单据保存后,单据体数据行丢失


2、实现思路

    第一个问题可能原因是因为上移下移是通过删除行插入行实现,导致关联关系被删除。

    第一个问题一般是因为删除重新插入数据后,新增的数据行会被识别为空数据行,而平台在保存时会删除空数据行导致。解决第二个问题除了通过调整代码,还可通过为单据体设置关键字段处理,需确保关键字段有值。

image.png


3、案例演示

    设计器配置:

image.png

image.png

image.png

image.png

    运行时效果:

image.png

image.png


4、示例代码

using System;
using System.ComponentModel;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;
using Kingdee.BOS.Util;

namespace Running.Sample.PlugIn.BusinessPlugIn.Bill
{
    [Description("测试单据体上移下移"), HotUpdate]
    public class P20240106EntryUpDownMoveEdit : AbstractBillPlugIn
    {
        /// <summary>
        /// 分录行菜单点击事件
        /// </summary>
        /// <param name="e"></param>
        public override void EntryBarItemClick(BarItemClickEventArgs e)
        {
            //单据体标识
            string entityKey = "FEntity";

            //上移
            if (e.BarItemKey.Equals("tbMoveUp", StringComparison.OrdinalIgnoreCase))
            {
                EntryUpDownMove(entityKey, true);
            }
            //下移
            if (e.BarItemKey.Equals("tbMoveDown", StringComparison.OrdinalIgnoreCase))
            {
                EntryUpDownMove(entityKey, false);
            }
        }

        /// <summary>
        /// 移动分录行。
        /// </summary>
        /// <param name="entityKey">单据体标识。</param>
        /// <param name="isUp">是否上移。</param>
        private void EntryUpDownMove(string entityKey, bool isUp)
        {
            int rowIndex = this.View.GetControl<EntryGrid>(entityKey).GetFocusRowIndex();
            if (isUp)
            {
                // 上移
                if (rowIndex <= 0)
                {
                    return;
                }
                ((IDynamicFormModelService)this.Model).MoveToSpecifyRow(entityKey, rowIndex, rowIndex - 1);
                MoveGoToPage(entityKey, rowIndex - 1);
            }
            else
            {
                // 下移
                var rowCount = this.View.Model.GetEntryRowCount(entityKey);
                if (rowIndex < 0 || rowIndex >= rowCount - 1)
                {
                    return;
                }
                ((IDynamicFormModelService)this.Model).MoveToSpecifyRow(entityKey, rowIndex, rowIndex + 1);
                MoveGoToPage(entityKey, rowIndex + 1);
            }
        }

        /// <summary>
        /// 移动分录时,焦点跳转逻辑。
        /// </summary>
        /// <param name="entityKey">单据体标识。</param>
        /// <param name="targetRowIndex">移动目标行索引。</param>
        private void MoveGoToPage(string entityKey, int targetRowIndex)
        {
            IEntryState entryState = this.View.GetEntryState(entityKey);
            EntryGrid entryGrid = this.View.GetControl<EntryGrid>(entityKey);
            if (entryState != null)
            {
                if (entryState.PageRows > 0)
                {//单据体分页
                    var rowCount = this.View.Model.GetEntryRowCount(entityKey);
                    if (rowCount > 0)
                    {
                        var targetPageIndex = targetRowIndex / entryState.PageRows;
                        if (entryState.CurrentPageIndex != targetPageIndex)
                        {
                            ((IDynamicFormViewService)this.View).EntryGotoPage(entityKey, targetPageIndex + 1);
                        }
                    }
                }
                entryGrid.SetFocusRowIndex(targetRowIndex);
            }
        }
    }
}



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

您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!

请选择打赏金币数 *

10金币20金币30金币40金币50金币60金币
可用金币: 0