Salesforce Apex-从SOQL查询填充对象

Ron*_*nie 1 salesforce soql apex-code

我有一个简单的SOQL查询,该查询返回与Contact和CampaignMember有关的信息。我正在尝试使用SOQL查询的结果填充自定义对象。但是,加载Visualforce页面时出现以下错误:

CampaignMember的字段Campaign.name无效

列出campaignMembers = [从CampaignMember中选择campaign.name,contact.id,contact.firstname,contact.lastname,status,campaignId,其中contactId ='003U000000U0eNq'和:campaigns中的campaignId];

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

我已经在开发人员控制台中单独运行了SOQL查询,并且查询成功。为什么不能在for循环中从SOQL查询中提取campaign.name?

eye*_*eam 5

您看到的错误是由于您应将其写为引起的campaignMembers[i].Campaign.Name。或者,如果您坚持使用getter语法,则campaignMembers[i].getSobject('Campaign').get('Name')

您是否需要包装器对象(或其他任何特殊原因CampaignMemberResult)?我有一种奇怪的感觉,您正在编写太多的代码来实现简单的操作;)的语法campaignMembers[i].Campaign.Name也意味着您不必对字符串使用强制转换。


另外-如果您需要了解“ 此联系发生在哪些广告系列中 ”,您有两种方式:

平面

select contact.id,contact.firstname, contact.lastname, 
    campaignid, campaign.name, 
    status 
from CampaignMember 
where contactId = '003U000000U0eNq'
Run Code Online (Sandbox Code Playgroud)

子查询

从联系开始,您可以转到相关的广告系列成员列表,然后转到广告系列以获取其名称

SELECT Id, FirstName, LastName,
    (SELECT CampaignId, Campaign.Name FROM CampaignMembers)
FROM Contact WHERE Id = '003U000000U0eNq'
Run Code Online (Sandbox Code Playgroud)

示例如何直接在visualforce中使用“ flat”结果(不带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'];
Run Code Online (Sandbox Code Playgroud)

音频:

<apex:pageBlockTable value="{!flatMembers}" var="cm">
    <apex:column value="{!cm.Contact.LastName}" />
    <apex:column value="{!cm.Status}" />
    <apex:column value="{!cm.Campaign.Name}" />
Run Code Online (Sandbox Code Playgroud)

编辑

我的最终目标是在联系人记录上显示一个Visualforce页面,该页面显示所有活动的列表,每个活动旁边都有一个复选框,指示联系人是否为成员。

您是否意识到它可以快速成长为一张长桌子?可能对广告系列进行了一些过滤(如果您想了解某事,请参阅“ StandardSetController”文档)。另外,我很确定有一些方法可以从“广告系列”报告中向“广告系列”添加联系人/线索-也许开箱即用的东西可以节省您的时间,并且更易于维护...

但是,代码解决方案将非常简单,从一个辅助包装器类开始:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后查询并构建包装器列表:

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));
}
Run Code Online (Sandbox Code Playgroud)

您应该一切都准备好了;)如果仅用于显示-您甚至可能不需要wrapper类(visualforce表达式中的一些技巧Map<Campaign, Boolean>甚至可能会使用...

传递给Visualforce的集合数限制为1000条记录(如果您的页面为只读,则为10K条记录)。除此之外-分页,最有可能与上述StandardSetController一起使用。