首页 > 解决方案 > 处理结果返回后无法触发取消按钮动作

问题描述

在 Acumatica 19.201.0070 框架中,我创建了一个自定义处理页面,该页面使用PXFilteredProcessing旧式处理 UIpublic override bool IsProcessing => false;我定义了一个取消按钮(如下),它将清除图形并设置处理过滤器的一些值。

    public PXCancel<NPMasterSubGeneratorFilter> Cancel;

    [PXCancelButton()]
    protected virtual IEnumerable cancel(PXAdapter adapter)
    {
        NPMasterSubGeneratorFilter row = Filter.Current;
        if (row != null)
        {
            this.Clear();
            Filter.SetValueExt<NPMasterSubGeneratorFilter.segmentID>(Filter.Current, row.SegmentID);
            if (!(row.NewSegment ?? false)) Filter.SetValueExt<NPMasterSubGeneratorFilter.segmentValue>(Filter.Current, row.SegmentValue);
        }
        return adapter.Get();
    }

除了单个用例之外,这工作得非常好,如果用户按下取消按钮,则在显示处理结果后,相应的操作永远不会被击中。(我的同事办公室开发人员表示,核心 Acumatica 处理页面似乎运行相同。)

在此处输入图像描述

处理委托的设置在过滤器 RowSelected 事件中。

GeneratedSubs.SetProcessDelegate(list => CreateSubaccounts(list, row));

我已经实现了我的处理方法的一些迭代,但当前如下。

    protected virtual void CreateSubaccounts(List<NPGeneratedSub> subs, NPMasterSubGeneratorFilter filter)
    {
        if (filter.NewSegment ?? false)
        {
            try
            {
                SegmentMaint segGraph = PXGraph.CreateInstance<SegmentMaint>();
                segGraph.Segment.Update(segGraph.Segment.Search<Segment.dimensionID, Segment.segmentID>(AADimension.Subaccount, filter.SegmentID.Value));
                SegmentValue value = segGraph.Values.Insert(new SegmentValue() { Value = filter.SegmentValue, Descr = filter.Description });
                segGraph.Actions.PressSave();
            }
            catch
            {
                throw new PXOperationCompletedSingleErrorException(NonProfitPlusMessages.SegmentValueCannotCreate);
            }
        }

        SubAccountMaint subGraph = PXGraph.CreateInstance<SubAccountMaint>();
        NPSubAccountMaintExtension subGraphExt = subGraph.GetExtension<NPSubAccountMaintExtension>();
        subGraphExt.save.ConfirmSaving = false;

        Sub newSub;

        bool errored = false;
        foreach (NPGeneratedSub sub in subs)
        {
            PXProcessing<NPGeneratedSub>.SetCurrentItem(sub);
            try
            {
                newSub = subGraph.SubRecords.Insert(new Sub() { SubCD = sub.SubCD, Description = sub.Description });
                subGraph.Save.Press();
                subGraph.Clear();
                PXProcessing<NPGeneratedSub>.SetProcessed();
            }
            catch (Exception e)
            {
                PXProcessing<NPGeneratedSub>.SetError(e);

                errored = true;
            }
        }
        if (errored)
        {
            throw new PXOperationCompletedWithErrorException();
        }
    }

返回处理结果后,需要调整什么以允许在按下时触发按钮操作?

标签: acumatica

解决方案


单步执行 javascript 后,我​​发现当您在处理后单击此屏幕上的取消按钮时,它没有向服务器发送请求。原因是因为 SuppressActions 在 Cancel PXToolBarButton 上设置为 true。我将我在此屏幕上看到的内容与正常工作的屏幕上发生的情况进行了比较,并意识到 Acumatica 应该在 Schedule 下拉 PXToolBarButton 上将 SuppressActions 设置为 true 但由于某种原因,在此屏幕上,它错误地将其设置为在“计划”下拉按钮之后的任何按钮上都为 true。

我查看了 PX.Web.UI 中的代码,看起来当下拉按钮被禁用时他们将 SuppressActions 设置为 true,并且 PXProcessing 将 FieldSelecting 事件添加到 Schedule 按钮,该事件会在您单击进程后禁用该按钮。但是,我没有注意到为什么代码会将其设置在错误的 PXToolBarButton 上的任何明显问题,因此有人可能需要调试代码并查看发生了什么(我们无法在 PX.Web.UI 中调试代码.dll)。

我尝试在 aspx 文件中注释掉与 PXProcessing 视图无关的其他网格,这解决了问题。所以我的猜测是,在 PXProcessing 屏幕上有多个网格会以某种方式导致在错误的 PXToolBarButton 上设置 SuppressActions 的错误。但是,由于多个网格是业务需求,因此删除它们不是解决方案。相反,我建议将计划按钮之后的所有按钮移动到计划按钮之前。为此,只需在图中的 PXFilteredProcessing 视图之前声明 PXActions。


推荐阅读