您看到的错误是由于您应该将其写为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 一起使用。