2013-04-12 24 views
1

我有一個簡單的SOQL查詢,它返回與聯繫人和CampaignMember相關的信息。我試圖用SOQL查詢的結果填充自定義對象。但是我得到加載Visualforce頁面時出現以下錯誤:Salesforce Apex - 從SOQL查詢中填充對象

無效的字段campaign.name爲CampaignMember

List campaignMembers = [select campaign.name, contact.id,contact.firstname, contact.lastname, status, campaignId from CampaignMember where contactId = '003U000000U0eNq' and campaignId in :campaigns]; 

for (Integer i = 0; i < campaignMembers.size(); i++) { 
    results.add(new CampaignMemberResult(
     (String)campaignMembers[i].get('CampaignId'), 
     (String)campaignMembers[i].get('campaign.name'), 
     true 
    )); 
} 

我在開發者控制檯seperately跑SOQL查詢併成功查詢。爲什麼我不能從for循環中的SOQL查詢中提取campaign.name?

回答

3

您看到的錯誤是由於您應將其編寫爲campaignMembers[i].Campaign.Name而引起的。或者如果你堅持getter語法,campaignMembers[i].getSobject('Campaign').get('Name')

您需要包裝對象(或任何CampaignMemberResult是)的任何特殊原因? 我有些奇怪的感覺,你正在編寫太多的代碼來實現簡單的事情;)campaignMembers[i].Campaign.Name的語法也意味着你不必使用強制轉換爲String。


加 - 如果你需要知道 「其中廣告活動時,這種聯繫發生」 你中有2種方式:

select contact.id,contact.firstname, contact.lastname, 
    campaignid, campaign.name, 
    status 
from CampaignMember 
where contactId = '003U000000U0eNq' 

子查詢

從你去到campaignmembers的相關列表中的聯繫人,然後由系列,以獲得他們的名字

SELECT Id, FirstName, LastName, 
    (SELECT CampaignId, Campaign.Name FROM CampaignMembers) 
FROM Contact WHERE Id = '003U000000U0eNq' 

示例演示如何使用「扁平化」導致直visualforce(無CampaignMemberResult):

頂點:

public List<CampaignMember> flatMembers {get;set;} // insert dick joke here 

flatMembers = [select contact.id,contact.firstname, contact.lastname, 
    campaignid, campaign.name, 
    status 
from CampaignMember 
where contactId = '003U000000U0eNq']; 

VF:

<apex:pageBlockTable value="{!flatMembers}" var="cm"> 
    <apex:column value="{!cm.Contact.LastName}" /> 
    <apex:column value="{!cm.Status}" /> 
    <apex:column value="{!cm.Campaign.Name}" /> 

編輯

我的最終目標是,如果接觸是成員或不被顯示在顯示一個複選框並排 表示所有活動的列表中的聯繫人 記錄一個Visualforce頁面。

你是否意識到它可以快速發展成一個很長的桌子?也許對廣告系列進行一些過濾(如果您想閱讀有關高級的內容 - 請查看「StandardSetController」的文檔)。此外,我很確定有一些方法可以通過Campaign報告添加聯繫人/潛在客戶活動 - 也許開箱即用會節省您的時間,並且更易於維護...

但是代碼的解決方案是非常簡單的,先從一個輔助包裝類:

public class CampaignWrapper{ 
    public Boolean selected {get;set;} 
    public Campaign c {get; private set;} 
    public CampaignWrapper(Campaign c){ 
     this.c = c; 
     selected = !c.CampaignMembers.isEmpty(); 
    } 
} 

然後查詢並建立包裝清單:

List<CampaignWrapper> wrappers = new List<CampaignWrapper>(); 
for(Campaign c : [SELECT Id, Name, (SELECT Id FROM CampaignMember WHERE ContactId = '...') 
    FROM Campaign 
    LIMIT 1000]){ 
    wrappers.add(new CampaignMember(c)); 
} 

您應該所有設置;)如果只是用於顯示 - 你可能甚至不需要包裝類(在Visualforce表達式中的一些技巧可能或使用Map<Campaign, Boolean>甚至...

1000 r ecords是傳遞給Visualforce的集合的限制(如果您的頁面是隻讀的,則爲10K)。過去 - 分頁,最有可能與上述StandardSetController一起使用。

+0

謝謝eyescream,我想你是對的,因爲我正在爲簡單的東西編寫太多的代碼。我的最終目標是在聯繫人記錄上顯示的Visualforce頁面,其中顯示了所有具有複選框的所有廣告系列的列表,旁邊顯示聯繫人是否爲會員。使用上面的例子進行一些調整,我應該可以做到這一點嗎? – Ronnie

+0

謝謝eyescream,像往常一樣,你的答案是一個偉大的見解! – Ronnie

+0

乾杯&祝你好運:) :) – eyescream