微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在自定义屏幕上的视图委托中需要帮助

如何解决在自定义屏幕上的视图委托中需要帮助

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

解决方法

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

  1. 使用BQL视图时,它实际上仅请求您在屏幕上看到的记录数。例如,如果您具有带分页的网格,并且页面上仅可见20条记录,则SQL选择将具有TOP 20限制。但是,一旦选择了委托,优化就停止了,因为框架不知道您想对所选数据做什么。解决方案是将SelectWithViewContextDelegateResult返回对象一起使用,而不是常规选择。在那种情况下,用户过滤,分页和排序保留在选择中。 (仅当屏幕上的结果记录与您选择的记录成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中使用选项“包括实际执行计划”(https://docs.microsoft.com/en-us/sql/relational-databases/performance/display-an-actual-execution-plan?view=sql-server-ver15)执行SQL。通常,在这种模式下,MS SQL服务器会建议加快查询执行速度所需的索引。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。