2012-03-22 63 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(); 

它爲我工作。

乾杯