我有一个简单的视图:
public PXSelect<MPEmployeeTermination, Where<MPEmployeeTermination.employeeID,
Equal<Current<TerminationFilter.employeeID>>,
And<MPEmployeeTermination.payRunID, Equal<Current<TerminationFilter.payRunID>>>>> EmployeeTerminations;
以及初始化它的方法:
public IEnumerable employeeTerminations()
{
return _terminationHandler.GetEmployeeTerminations(EmployeeTerminations, EmployeeTerminationItems, OtherTerminationPayments);
}
GetEmployeeTerminations
方法(返回IEnumerable
)很繁重并且经常运行-此UI中的任何单个操作。当调用此方法时,我找不到任何控件,而在初始化过程中(调用构造函数时)只能调用一次方法GetEmployeeTerminations
。我可以使用布尔静态字段一次运行该方法,但是我相信存在Acumatica模式推荐的其他属性(例如属性等)。可以设置EmployeeTerminations = GetEmployeeTerminations
,但尚不清楚如何将IEnumerable
转换为PXSelect<MPEmployeeTermination>
]。我该如何在适当的Acumatica模式中做到这一点,或者存在比静态字段更好的模式?
我将不胜感激任何意见或建议。
我正在更新我的问题:
每次更改UI上的任何可编辑属性时,构造函数都会调用。使用静态布尔值的解决方案不起作用,因为当我打开和关闭UI时,静态字段已经保存。如果该字段不是静态的,那么它将在每次构造函数运行时重置,因此,它也将不起作用。
此方法
_terminationHandler.GetEmployeeTerminations(EmployeeTerminations, EmployeeTerminationItems, OtherTerminationPayments)
计算“主” DAC MPEmployeeTermination
和“详细信息” DAC MPEmployeeTerminationItem
的值。 DAC MPEmployeeTerminationItem
负责向导中的2个数据网格,并计算两个DAC中的数据,与远程服务器等进行通信。有时它的运行速度更快,有时更慢,但是主观用户的时间感觉太慢了:
并且总是在序列的末尾,我们有一个神秘的踏步。睡眠会花费比我们的手术更长的时间,并发生在Acumatica幕后:我相信建议也只能在加载一次运行此方法。最好的地方是什么?当DAC上的每个属性都更改时,甚至构造函数都在此处运行。
在事件MPEmployeeTermination_TerminationDate_FieldUpdated
中调用了另一个重方法,不能将其移动到另一个位置,并且该日期更改后必须运行所有计算。
主要思想是改善用户体验并防止UI卡死。也许我可以使用异步编程?
例如,如果我将方法更改为
public async Task<IEnumerable> employeeTerminations()
{
return await Task.Run(() => _terminationHandler.GetEmployeeTerminations(EmployeeTerminations, EmployeeTerminationItems, OtherTerminationPayments));
}
UI不再卡住了,但是我不确定Acumatica框架上的所有可能的副作用。由于Acumatica的限制,它还会发生MPEmployeeTermination_TerminationDate_FieldUpdated这样的事件。
我对您共享的屏幕不熟悉,因此我需要坚持更笼统的答复,并希望它能给您足够的帮助,以克服您的障碍,直到其他人可以提供更好的答案为止。我有点担心过滤器如何嵌入到选项卡中,但是我对构建这种屏幕结构并不十分熟悉。我的屏幕非常简单,过滤器始终位于顶部。
如您所述,您正在为视图定义一个构造函数。您会在Acumatica标准代码中找到许多示例,这些示例中的视图是通过构造函数控制的。在执行操作时,可以使用构造函数来限制根据屏幕上某些用户可选选项检索的结果。这为PO.POCreate中的“过滤器”和“ fixedDemand”构造函数提供了一个示例。这些填充各自的视图,并且fixedDemand对如何解释IEnumerable具有一些适用的概念。
嗯,如果您真的只想在加载中运行一次此方法,则应执行以下操作