Acumatica 使用“在网格中上下移动记录”;SortOrder“;字段和;“向上”/&引用;“向下”;按钮

Acumatica 使用“在网格中上下移动记录”;SortOrder“;字段和;“向上”/&引用;“向下”;按钮,acumatica,Acumatica,我正在处理的当前定制项目需要显示/编辑带有记录“排序顺序”的网格。“SortOrder”字段是只读的,带有向上/向下按钮,允许用户在网格中重新排序项目 DAC中的“SortOrder”列是一个简单的Int字段 网格的PXSelect语句使用OrderBy>>来显示记录 ASPX中的网格定义为“SyncPosition=true” 我添加了一个向上/向下按钮,用于增加/减少当前所选记录的“SortOrder”值 我遇到的问题是,第一次单击“向上”或“向下”时,“SortOrder”字段会更新,但行

我正在处理的当前定制项目需要显示/编辑带有记录“排序顺序”的网格。“SortOrder”字段是只读的,带有向上/向下按钮,允许用户在网格中重新排序项目

DAC中的“SortOrder”列是一个简单的Int字段

网格的PXSelect语句使用OrderBy>>来显示记录

ASPX中的网格定义为“SyncPosition=true”

我添加了一个向上/向下按钮,用于增加/减少当前所选记录的“SortOrder”值

我遇到的问题是,第一次单击“向上”或“向下”时,“SortOrder”字段会更新,但行不会移动。单击Save持久化更新后,网格将按正确的顺序刷新

我已经浏览了代码的其余部分,但所有其他情况下,这是用于树视图,而不是网格

我已尝试在操作结束时添加View.RequestRefresh(),但这不会导致重新排序

在每次移动后不使用Persist来更新网格并从缓存值反映当前顺序的最佳方法是什么?像往常一样,我假设我忽略了一些简单的事情


任何建议都将不胜感激。

我查看了通用查询设计器源代码-它在网格中有一个向上/向下按钮来重新排序字段。这些视图没有OrderBy子句:

public PXSelect<GIFilter, Where<GIFilter.designID, Equal<Current<GIDesign.designID>>>> Parameters;

最后,在ASPX代码中有一些JavaScript代码——这可能是您为了让功能正常工作而缺少的,也可能不是;我不太清楚它在做什么,但我鼓励您在编辑器中打开SM208000.aspx并查找
commandResult
。另外,请查看在支持向上/向下的网格上定义的回调命令-这可能与此有关。

感谢您提供的指针。最后,它删除了初始视图中的“orderby”,并更新了move方法,使其与上面的方法更加相似。javascript方法只是在移动后保持当前行处于选中状态,以便您可以继续单击向上/向下
    public abstract class lineNbr : IBqlField { }
    [PXDBInt(IsKey = true)]
    [PXDefault]
    [PXLineNbr(typeof(GIDesign))]
    [PXParent(typeof(Select<GIDesign,
        Where<GIDesign.designID, Equal<Current<GIFilter.designID>>>>))]
    public virtual int? LineNbr { get; set; }
        [PXButton(ImageKey = Sprite.Main.ArrowUp, Tooltip = ActionsMessages.ttipRowUp)]
        [PXUIField(DisplayName = ActionsMessages.RowUp, MapEnableRights = PXCacheRights.Update)]
        protected void moveUpFilter()
        {
            if (this.Parameters.Current == null)
                return;
            GIFilter prev = PXSelect<GIFilter, Where<GIFilter.designID, Equal<Current<GIDesign.designID>>, And<GIFilter.lineNbr, Less<Current<GIFilter.lineNbr>>>>, OrderBy<Desc<GIFilter.lineNbr>>>.Select(this);
            if (prev != null)
                this.SwapItems(this.Parameters.Cache, prev, this.Parameters.Current);
        }
        [PXButton(ImageKey = Sprite.Main.ArrowDown, Tooltip = ActionsMessages.ttipRowDown)]
        [PXUIField(DisplayName = ActionsMessages.RowDown, MapEnableRights = PXCacheRights.Update)]
        protected void moveDownFilter()
        {
            if (this.Parameters.Current == null)
                return;
            GIFilter next = PXSelect<GIFilter, Where<GIFilter.designID, Equal<Current<GIDesign.designID>>, And<GIFilter.lineNbr, Greater<Current<GIFilter.lineNbr>>>>, OrderBy<Asc<GIFilter.lineNbr>>>.Select(this);
            if (next != null)
                this.SwapItems(this.Parameters.Cache, next, this.Parameters.Current);
        }
    private void SwapItems(PXCache cache, object first, object second)
    {
        object temp = cache.CreateCopy(first);
        foreach (Type field in cache.BqlFields)
            if (!cache.BqlKeys.Contains(field))
                cache.SetValue(first, field.Name, cache.GetValue(second, field.Name));
        foreach (Type field in cache.BqlFields)
            if (!cache.BqlKeys.Contains(field))
                cache.SetValue(second, field.Name, cache.GetValue(temp, field.Name));
        cache.Update(first);
        cache.Update(second);
    }