Acumatica 返回处理结果后无法触发取消按钮操作

Acumatica 返回处理结果后无法触发取消按钮操作,acumatica,Acumatica,在Acumatica 19.201.0070框架内,我创建了一个自定义处理页面,该页面利用旧式处理UIpublic override bool IsProcessing=>false的PXFilteredProcessing我定义了一个取消按钮(如下),它将清除图形并设置处理过滤器的一些值 public PXCancel<NPMasterSubGeneratorFilter> Cancel; [PXCancelButton()] protected virt

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

    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();
    }
我已经实现了我的处理方法的一些迭代,但是当前的情况如下

    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();
        }
    }
受保护的虚拟void CreateSubaccounts(列表子帐户、NPMasterSubGeneratorFilter筛选器)
{
if(filter.NewSegment??false)
{
尝试
{
SegmentMaint segGraph=PXGraph.CreateInstance();
segGraph.Segment.Update(segGraph.Segment.Search(AADimension.Subaccount,filter.SegmentID.Value));
SegmentValue=segGraph.Values.Insert(新的SegmentValue(){value=filter.SegmentValue,Descr=filter.Description});
segGraph.Actions.PressSave();
}
抓住
{
抛出新的PXOperationCompletedSingleErrorException(非专业人士plusMessages.SegmentValueCannotCreate);
}
}
SubAccountMaint子图=PXGraph.CreateInstance();
NPSubAccountMaintExtension subgraphText=子图.GetExtension();
subgraphText.save.ConfirmSaving=false;
新闻分部;
布尔误差=假;
foreach(子系统中的NPGeneratedSub子系统)
{
PXProcessing.SetCurrentItem(子项);
尝试
{
newSub=subGraph.SubRecords.Insert(new Sub(){SubCD=Sub.SubCD,Description=Sub.Description});
subGraph.Save.Press();
子图.Clear();
PXProcessing.SetProcessed();
}
捕获(例外e)
{
PXProcessing.SetError(e);
错误=正确;
}
}
如果(出错)
{
抛出新的PXOperationCompletedWithErrorException();
}
}
返回处理结果后,需要调整哪些内容才能在按下按钮时触发按钮操作?

请尝试此操作

  • 重写
    IsDirty
    属性
  • 使用
    PXAction
    而不是
    PXCancel
  • 添加具有启用权限的
    PXUIField
    属性
  • 操作名称应以小写字母开头
  • 代理名称应以大写字母开头
请参阅下面的代码

public override bool IsDirty => false;
public override bool IsProcessing
{
    get { return false;}
    set { }
}

public PXAction<NPMasterSubGeneratorFilter> cancel;

[PXUIField(MapEnableRights = PXCacheRights.Select)]
[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();
}
public override bool IsDirty=>false;
公共覆盖布尔处理
{
获取{return false;}
集合{}
}
公共行动取消;
[PXUIField(MapEnableRights=PXCacheRights.Select)]
[按钮]
受保护的虚拟IEnumerable取消(PXAdapter)
{
NPMasterSubGeneratorFilter行=Filter.Current;
如果(行!=null)
{
这个.Clear();
Filter.SetValueExt(Filter.Current,row.SegmentID);
if(!(row.NewSegment??false))Filter.SetValueExt(Filter.Current,row.SegmentValue);
}
返回适配器Get();
}

在遍历javascript之后,我发现在处理后单击此屏幕上的取消按钮时,它没有向服务器发送请求。原因是取消按钮上的SuppressActions设置为true。我将在这个屏幕上看到的与在正常工作的屏幕上看到的进行了比较,并意识到Acumatica应该在Schedule下拉按钮上将SuppressActions设置为true,但由于某些原因,在这个屏幕上,它在Schedule下拉按钮之后的任何按钮上都错误地将其设置为true

我查看了PX.Web.UI中的代码,当下拉按钮被禁用时,它们似乎将SuppressActions设置为true,PXProcessing向Schedule按钮添加了一个FieldSelecting事件,该事件在您单击process后禁用该按钮。但是,我没有注意到任何明显的问题,比如为什么代码会将其设置在错误的PXToolbar按钮上,以便有人可能需要调试代码并查看发生了什么(我们无法在PX.Web.UI.dll中调试代码)


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

不幸的是,这并没有解决问题,行为与当前实现相同。奇怪的是,在我的环境中工作正常,看起来我们遗漏了一些东西。你用什么针灸疗法?请提供有关您的处理委托的更多详细信息,您如何处理所选记录,如何将其标记为已成功处理?添加了其他详细信息
public override bool IsDirty => false;
public override bool IsProcessing
{
    get { return false;}
    set { }
}

public PXAction<NPMasterSubGeneratorFilter> cancel;

[PXUIField(MapEnableRights = PXCacheRights.Select)]
[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();
}