1

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

CampaignMember 的字段 Campaign.name 无效

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

for (整数 i = 0; i < campaignMembers.size(); i++) {
    results.add(新的 CampaignMemberResult(
        (String)campaignMembers[i].get('CampaignId'),
        (String)campaignMembers[i].get('campaign.name'),
        真的
    ));
}

我已经在开发者控制台中单独运行了 SOQL 查询,并且查询成功。为什么我不能从 for 循环中的 SOQL 查询中提取活动名称?

4

1 回答 1

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'

子查询

从联系人向下到活动成员的相关列表,然后向上到活动以获取他们的姓名

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

示例如何在视觉力中直接使用“平面”结果(不带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'];

音频:

<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”的文档)。此外,我很确定有一些方法可以从活动报告中将联系人/潜在客户添加到活动中 - 也许开箱即用的东西可以节省您的时间并且更易于维护......

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

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 条记录是传递给 Visualforce 的集合的限制(如果您的页面是只读的,则为 10K)。过去 - 分页,很可能与上述 StandardSetController 一起使用。

于 2013-04-12T11:47:55.183 回答