Salesforce Apex-实现嵌套表输出的更好方法

时间:2018-10-26 12:03:05

标签: salesforce apex visualforce

foo1.c

这是我班上的工作方法。本质上,我正在对自定义对象Hours__c进行查询。我想做的是让每个员工部门首先嵌套表上的输出。然后按每个工作周期嵌套,该部门在每个工作周期的所有工作时间均会套用。我基本上是通过以这种方式对查询进行排序从一开始就实现了这一点。现在是关于如何在我需要的时候掌握逻辑。但是,如果员工每周的工作时间超过一个小时,则还需要汇总总工作时间。最后,我每13周输出一次该季度的总计小时数。

如果您有兴趣看到我在前端实现的目标,但是想以更有效的方式在后端实现的目标,这里是我的自定义报告的截屏视频。我的逻辑问题是,如果要查询大量数据,它就会起作用。这个逻辑很慢。因为首先它循环查询结果一次。但是在第一个for循环中,我循环了相同的查询2次不同的时间... :: slaps head :: ...我知道这很糟糕。

所以我想看看是否有可能通过映射或其他包装器类更有效的方法来实现此目标?因为它也都在一个包装器类中。我使用前端逻辑根据包装类中的结果对表进行排序。我只是隐藏并显示行。就像我说的那样,它的工作效率不如我希望的逻辑运行。

这是屏幕投射:

https://screencast-o-matic.com/watch/cF60cwYAiB

1 个答案:

答案 0 :(得分:0)

我的第一个想法是在SOQL之后在控制器中准备新的data-container-for映射。借助此地图,您将可以通过特定的Map<Date, List<Hour__c>> dateWorkedToHoursMapHour__c)快速Date条记录,并在子循环中仅仅通过它们

Date_worked__c

如果您认为会更好,那么可以尝试准备地图,如:

public class Controller { // (...) Map<Date, List<Hour__c>> dateWorkedToHoursMap; // New map in controller // (...) // Updated "getData()" method which will prepare "dateWorkedToHoursMap" // map just after SOQL and then will use in both sub for loops public pageReference getData() { // (...) // Your SOQL for Hour__c records // dateWorkedToHoursMap = prepareDateWorkedToHoursMap(hList); // (...) // main for through hList // (...) // 1 sub for through list returned by: dateWorkedToHoursMap.get(h.Date_worked__c) // (...) // 2 sub for through list returned by: dateWorkedToHoursMap.get(h.Date_worked__c) // (...) // end of main for } // New "prepareDateWorkedToHoursMap()" method used to prepare "dateWorkedToHoursMap" map private void prepareDateWorkedToHoursMap(List<Hour__c> hours) { dateWorkedToHoursMap = new Map<Date, List<Hour__c>>(); for(Hour__c hour : hours) { if(hour.Date_worked__c != null) { if(!dateWorkedToHoursMap.containsKey(hour.Date_worked__c)) { dateWorkedToHoursMap.put(hour.Date_worked__c, new List<Hour__c>()); } dateWorkedToHoursMap.get(hour.Date_worked__c).add(h); } } } }

然后您应该能够基于Map<String, Map<Date, List<Hour__c>>> departmentToDateWorkedToHoursMapHour__c快速获得DEPARTMENT记录的列表。