Salesforce:在Visualforce页面中对数据进行分组

时间:2014-01-14 15:19:16

标签: salesforce visualforce apex

我想创建一个时间表页面,将所有时间表组合在一起(即,在两个项目之间分配时间表,然后创建两个时间表记录)。

所以,我想根据开始日期将时间表分组一周,然后根据资源显示分组结果

像 截止日期 - 2012年1月3日;资源名称 - abc

  • 项目名称 - 测试,总计16小时
  • 项目名称 - test2,总时数20

所有这些详细信息都可以在时间表记录中找到。

以下是我的控制器:

public class TimesheetHeader {

    public Map<Date,Set<pse__Timecard_Header__c>> getTimecardMap(){
    return timecardMap;
    }

   public Map<Date,Set<pse__Timecard_Header__c>> timecardMap = new Map<Date,Set<pse__Timecard_Header__c>>();
   Set<pse__Timecard_Header__c> timecardSet = new Set<pse__Timecard_Header__c>(); 

   Date tcdate;

    public TimesheetHeader(ApexPages.StandardSetController controller) {

     List<pse__Timecard_Header__c> timecardheader = [Select f.Id,f.Name,f.pse__Start_Date__c,f.pse__End_Date__c,f.pse__Project__r.Name,f.pse__Status__c,f.pse__Total_Hours__c From pse__Timecard_Header__c f ]; 

         for(pse__Timecard_Header__c tc :timecardheader ){
          tcdate = tc.pse__End_Date__c;
          System.debug('tcdate---->'+tcdate);

           if(timecardMap.containsKey(tcdate)){
          Set<pse__Timecard_Header__c> temp = new Set<pse__Timecard_Header__c>();
          temp = timecardMap.get(tcdate);
          temp.add(tc);
          timecardMap.put(tcdate,temp);
          temp.clear();
          }
         else{
         timecardSet.add(tc);
         timecardMap.put(tcdate,timecardSet);

        }       
    }
    System.debug('timecardMap------>'+timecardMap.keySet());
   } 
}

1 个答案:

答案 0 :(得分:0)

首先在查询编辑器中微调您的查询。您可能应该阅读SUM(),MAX()等聚合函数和GROUP BY子句。

我很难弄清楚你的所有数据(比如什么是“资源”?Timesheet_Header记录的所有者?)但这个相当类似的查询应该会给你一些想法:

SELECT CloseDate, Account.Name, SUM(Amount) amount
FROM Opportunity
GROUP BY CloseDate, Account.Name

我的开发者版本的结果:

enter image description here

你需要WHERE子句将它限制在同一周但仍然 - 这是什么? 如果天数不完全匹配(在您的方案中似乎不太可能),您可以使用the date functions中的一些。

SELECT CALENDAR_YEAR(CloseDate) cy, CALENDAR_MONTH(CloseDate) cm, WEEK_IN_MONTH(CloseDate) cw, SUM(Amount) amount
FROM Opportunity
GROUP BY CALENDAR_YEAR(CloseDate), CALENDAR_MONTH(CloseDate), WEEK_IN_MONTH(CloseDate)

enter image description here

不管怎样 - 您应该最终得到显示您想要的内容的查询。

下一步是在Visualforce中显示数据。这些“聚合查询”返回一个叫做AggregateResult的怪异东西。从列中取出列并将它们映射到一些辅助类变量将是你的工作。此类至少应包含标记为public get;的字段。

我懒得输入所有内容;)请在https://salesforce.stackexchange.com/questions/21978/display-the-related-aggregated-value-on-a-vf-page查看我的答案,或者只关注Google如何处理汇总查询结果。


如果您不想进行汇总查询,那么它仍然可行。

想想你的独特钥匙是什么。我会说周(ok,可能是Date字段)和资源(无论是什么)的组合。甚至可能只是资源,因为你希望在同一周显示数据。

价值观? List<something>其中包含项目名称和总小时数。我仍然使“某事”成为一个帮助包装类,包括字符串(项目名称),id(构造链接)和数值(总小时)。

一旦你有这样的设计,就开始构建一个Map<string, List<wrapper>>,其中字符串是资源或资源+周。