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?
您看到的错误是由于您应将其写为引起的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一起使用。
| 归档时间: |
|
| 查看次数: |
7399 次 |
| 最近记录: |