2012-03-22 61 views
1

使用Salesforce的Apex,是否有任何方法对日期字段值对列表项进行排序。请参阅以下代码的TODO部分,谢谢。如何为日期字段值(Apex,Salesforce)排序列表项

/** 
* Select list of jobOccurrences belongs to particular list of jobs 
*/ 
private List<Job_Occurrence__c> getJobsByJobCode(List<Job__c> jobList) { 

// Select relevant Job Occurrence objects 
    List<Job_Occurrence__c> jobOccuList = new List<Job_Occurrence__c>(); 

    for (Job__c job : jobList) { 

     Job_Occurrence__c jobOccurrence = [SELECT Id, Job__c, 
                Schedule_Start_Date__c 
              FROM Job_Occurrence__c 
              WHERE Job__c =: job.Id]; 

     if((jobOccurrence != null) && (jobOccurrence.Id != null)) { 
      jobOccuList.add(jobOccurrence); 
     }   
    } 

    if((jobOccuList != null) && (jobOccuList.size() > 0)) { 

     // TODO 
     // How I sort the 'jobOccuList' with Date field 'Schedule_Start_Date__c', 
     // for select the items according to sequence of latest jobOccurrence  

     return jobOccuList; 

    } else { 
     throw new RecordNotFoundException ('Could not found any jobOccurrence for given list of jobs'); 
    }        
} 

回答

4

你真的应该bulkify这段代码,即不运行一个循环,可能导致潜在的与州长限制造成的问题,因为你只想合并列表中的所有Job__c记录,这使得您的订购方便内部查询你也可以在查询中做到这一点!

你想改变的代码是这样的:

// Select relevant Job Occurrence objects 
List<Job_Occurrence__c> jobOccuList = new List<Job_Occurrence__c>(); 

for (Job__c job : jobList) { 

    Job_Occurrence__c jobOccurrence = [SELECT Id, Job__c, 
               Schedule_Start_Date__c 
             FROM Job_Occurrence__c 
             WHERE Job__c =: job.Id]; 

    if((jobOccurrence != null) && (jobOccurrence.Id != null)) { 
     jobOccuList.add(jobOccurrence); 
    }   
} 

本质上讲,我们可以优化这不仅是为了使用一个查询,而不是N(N为jobList.size()),并让他们在同一时间订购。首先,我们需要收集Job__c ID列表,然后我们可以在WHERE子句SOQL在使用IN声明:

// Select relevant Job Occurrence objects 
List<Job_Occurrence__c> jobOccuList; 
Set<Id> setJobIds = new Set<Id>(); 

setJobIds.addAll(jobList); 

// get the job occurances starting with the latest, use ASC for reverse! 
jobOccuList = [SELECT Id, Job__c, Schedule_Start_Date__c 
       FROM Job_Occurrence__c 
       WHERE Job__c IN : setJobIds 
       ORDER BY Schedule_Start_Date__c DESC]; 

最后,如果你需要能够方便地从Job_Occurrence_ 映射回c记录到Job _c记录,你可以用下面的地图代替集合,但考虑到你只是想要这个列表,我不认为这是必要的(只是为了完整性)。

Map<Id, Job__c> mapJobs = new Map<Id, Job__c>(); 

for (Job__c job : jobList) { 
    mapJobs.put(job.Id, job); 
} 

** snip ** 

for (Job_Occurrence__c jobOccu : jobOccuList) { 
    Job__c theJob = mapJobs.get(jobOccu.Job__c); 
    // do stuff with the job 
} 

所有这些代码已经写在浏览器中,所以可能有一些语法错误,但它应该是好的!

+0

嗨LaceySnr!非常感谢您的宝贵答案。玩得开心! – Channa 2012-03-22 09:38:23

+1

我喜欢在SOQL查询中使用排序而不是在代码中。这里的一个小改进可能是将添加列表项的循环交换到使用setJobIds.addAll(jobList)的集合; – Born2BeMild 2012-05-21 21:30:31

+0

好点!更新了示例以反映这一点。 – 2012-05-21 23:31:17

-1

你可以试试:

liDates.sort(); 

它为我工作。

干杯