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