在自定义屏幕中查看委派时需要帮助



我们创建了一个自定义屏幕,根据过滤条件显示销售数据列表,如(今天、昨天、本周、本月、本季度、今年(,我们为此创建了SQL视图,然后从view创建了DAC,并在自定义屏幕中使用它。我们的屏幕上也有过滤器。对于筛选条件,我们使用视图委托并返回数据。问题是为什么屏幕花费大约70秒的时间来加载2K个记录。正在使用视图代理降低加载数据的速度。我们可以使用GI,但我们需要在GRID中显示图像,所以我们选择了自定义屏幕,而且我们在页眉中有一些打印报告的报告按钮。因为我们不能在GI中显示图像,所以我们选择了这个。

您看到的速度慢很可能是由两个原因共同造成的。

  1. 当您使用BQL视图时,它实际上只请求您在屏幕上看到的记录数。例如,如果您有带分页的网格,并且页面上只有20条记录可见,则SQL select将具有TOP 20限制。然而,一旦您选择了委托,优化就会停止工作,因为框架不知道您想对所选数据做什么。这里的解决方案是将SelectWithViewContextDelegateResult返回对象一起使用,而不是常规选择。在这种情况下,用户过滤、分页和排序将保留在select中。(只有当屏幕上的结果记录与您选择的记录以1比1的方式关联时,才使用此方法。如果您使用任何类型的聚合或插入来自2个不同选择的记录,则该方法不起作用(

示例:

protected virtual IEnumerable ardocumentlist()
{
PXSelectBase<BalancedARDocument> cmd =
new PXSelectJoinGroupBy<BalancedARDocument,
...
OrderBy<Asc<BalancedARDocument.docType, //Set necessary sorting fields: use the key fields
Asc<BalancedARDocument.refNbr>>>> //Set necessary sorting fields: use the key fields
(this);
PXDelegateResult delegResult = new PXDelegateResult
{
IsResultFiltered = true, //set these fields to indicate that the result does not need re-filtering, resorting and re-paging
IsResultTruncated = true,
IsResultSorted = true
}
foreach (PXResult<BalancedARDocument> res_record in cmd.SelectWithViewContext())
{
// add the code to process res_record
delegResult.Add(res_record);
}
return delegResult;
}
  1. 可能您的表上没有正确的索引,因为即使您一次选择所有2k条记录,也不会导致70秒的加载时间。这里建议使用请求探查器来捕获生成的确切SQL(https://help-2020r2.acumatica.com/Help?ScreenId=ShowWiki&pageid=e4c450bb-86bc-4fb2-b7e6-1f715abe3c8b(,并在MS SQL Management studio中使用选项"包括实际执行计划"执行SQL(https://learn.microsoft.com/en-us/sql/relational-databases/performance/display-an-actual-execution-plan?view=sql-服务器-服务器15(。通常在这种模式下,MSSQL服务器会建议加快查询执行所需的索引

最新更新