Salesforce Apex-从SOQL查询填充对象

Salesforce Apex-从SOQL查询填充对象,salesforce,apex-code,soql,Salesforce,Apex Code,Soql,我有一个简单的SOQL查询,它返回与联系人和活动成员相关的信息。我试图用SOQL查询的结果填充自定义对象。但是,在加载Visualforce页面时,我遇到以下错误: CampaignMember的字段campaign.name无效 我已经在开发人员控制台中单独运行了SOQL查询,它成功地进行了查询。为什么我不能在for循环中从SOQL查询中提取campaign.name?您看到的错误是由于您应该将其作为campaignMembers[I].campaign.name写入而导致的。或者如果您坚持使

我有一个简单的SOQL查询,它返回与联系人和活动成员相关的信息。我试图用SOQL查询的结果填充自定义对象。但是,在加载Visualforce页面时,我遇到以下错误:

CampaignMember的字段campaign.name无效


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

您看到的错误是由于您应该将其作为campaignMembers[I].campaign.name写入而导致的。或者如果您坚持使用getter语法

是否有任何特殊原因需要包装器对象或任何结果? 我有一种奇怪的感觉,你写了太多的代码来实现一些简单的东西;campaignMembers[i].Campaign.Name的语法还意味着您不必对字符串使用强制转换

另外-如果您需要了解此联系人在哪些活动中出现,您有两种方法:

平坦的

选择contact.id、contact.firstname、contact.lastname, campaign id,campaign.name, 地位 来自竞选成员 其中contactId='003U000000U0eNq' 子查询

从contact(联系人)中,您可以进入相关的活动成员列表,然后进入活动以获取他们的姓名

选择Id、FirstName、LastName、, 从活动成员中选择活动ID、活动名称 来自Id为'003U000000U0eNq'的联系人 示例如何在visualforce中直接使用平面结果而不使用活动成员结果:

顶点:

公共列表成员{get;set;}//在此处插入 flatMembers=[选择contact.id、contact.firstname、contact.lastname, campaign id,campaign.name, 地位 来自竞选成员 其中contactId='003U000000U0eNq']; VF:

编辑

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

你知道它会很快变成一张很长的桌子吗?如果你想阅读一些高级的东西,也许可以对活动进行一些筛选-查看StandardSetController的文档。另外,我很确定有一些方法可以从活动报告中为活动添加联系人/潜在客户-也许一些现成的方法可以节省您的时间,并且更易于维护

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

公共类活动包装器{ 已选择公共布尔值{get;set;} 公共活动c{get;private set;} 公共运动包装运动{ 这个.c=c; 所选=!c.CampaignMembers.isEmpty; } } 然后查询并构建包装器列表:

列表包装器=新列表; forCampaign c:[选择Id、名称,从活动成员中选择Id,其中ContactId='…' 从竞选活动 上限1000]{ wrappers.addnew活动成员c; } 你应该准备好了;如果只是为了显示-您甚至可能不需要包装器类visualforce表达式中的一些技巧,或者甚至可以使用Map


如果您的页面为只读,则1000条记录是传递给Visualforce 10K的集合的限制。超过该值-分页,最有可能与上述StandardSetController一起使用。

您看到的错误是由于您应该将其作为活动成员[i].Campaign.Name写入而导致的。或者如果您坚持使用getter语法

是否有任何特殊原因需要包装器对象或任何结果? 我有一种奇怪的感觉,你写了太多的代码来实现一些简单的东西;campaignMembers[i].Campaign.Name的语法还意味着您不必对字符串使用强制转换

另外-如果您需要了解此联系人在哪些活动中出现,您有两种方法:

平坦的

选择contact.id、contact.firstname、contact.lastname, campaign id,campaign.name, 地位 来自竞选成员 其中contactId='003U000000U0eNq' 子查询

从contact(联系人)中,您可以进入相关的活动成员列表,然后进入活动以获取他们的姓名

选择Id、FirstName、LastName、, 从活动成员中选择活动ID、活动名称 来自Id为'003U000000U0eNq'的联系人 示例如何在visualforce中直接使用平面结果而不使用活动成员结果:

顶点:

公共列表成员{get;set;}//在此处插入 flatMembers=[选择contact.id、contact.firstname、contact.lastname, campaign id,campaign.name, 地位 来自竞选成员 其中contactId='003U000000U0eNq']; VF:

编辑

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

你知道它会很快变成一张很长的桌子吗?如果你想读一些关于高级的东西,也许可以在活动中进行一些过滤 检查StandardSetController的文档。另外,我很确定有一些方法可以从活动报告中为活动添加联系人/潜在客户-也许一些现成的方法可以节省您的时间,并且更易于维护

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

公共类活动包装器{ 已选择公共布尔值{get;set;} 公共活动c{get;private set;} 公共运动包装运动{ 这个.c=c; 所选=!c.CampaignMembers.isEmpty; } } 然后查询并构建包装器列表:

列表包装器=新列表; forCampaign c:[选择Id、名称,从活动成员中选择Id,其中ContactId='…' 从竞选活动 上限1000]{ wrappers.addnew活动成员c; } 你应该准备好了;如果只是为了显示-您甚至可能不需要包装器类visualforce表达式中的一些技巧,或者甚至可以使用Map


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

谢谢你,我认为你认为我为简单的东西写了太多代码是对的。我的最终目标是在联系人记录上显示一个Visualforce页面,显示所有活动的列表,每个活动旁边都有一个复选框,指示联系人是否为成员。使用上面的例子进行一些调整,我认为这应该是可能的?谢谢眼霜,像往常一样,你的答案是一个伟大的洞察力!您好,眼霜,我已经更新了我的控制器,以使用您在上面的编辑中描述的模式。当我们从wrappers添加新的活动成员时,我不得不更新这一行;到wrappers.addnew-CampaignMemberCampaign=c;因为我有一个编译错误。但是,我现在遇到了与包装器类相关的以下编译错误:不兼容的元素类型SOBJECT:CampaignMember,用于CampaignMailingGroupController.CampaignWrapper的集合。我的包装器类位于我的主控制器类中,对吗?我很惊讶你不得不使用像Campaign=c这样奇怪的东西。我的意思是,这就像说整数=5,它甚至可以编译吗?你能用更大的代码片段编辑你的问题吗?两个包装器类都是def。你用来填充列表的查询…我觉得在我写它的时候很奇怪,但是它编译了??无论如何,我已经看到了我的错误的方式,并恢复了变化。我现在正在添加新的活动C;到包装器列表,结果正是我想要的!再次感谢你的帮助。谢谢你的眼霜,我认为你认为我为简单的东西写了太多代码是对的。我的最终目标是在联系人记录上显示一个Visualforce页面,显示所有活动的列表,每个活动旁边都有一个复选框,指示联系人是否为成员。使用上面的例子进行一些调整,我认为这应该是可能的?谢谢眼霜,像往常一样,你的答案是一个伟大的洞察力!您好,眼霜,我已经更新了我的控制器,以使用您在上面的编辑中描述的模式。当我们从wrappers添加新的活动成员时,我不得不更新这一行;到wrappers.addnew-CampaignMemberCampaign=c;因为我有一个编译错误。但是,我现在遇到了与包装器类相关的以下编译错误:不兼容的元素类型SOBJECT:CampaignMember,用于CampaignMailingGroupController.CampaignWrapper的集合。我的包装器类位于我的主控制器类中,对吗?我很惊讶你不得不使用像Campaign=c这样奇怪的东西。我的意思是,这就像说整数=5,它甚至可以编译吗?你能用更大的代码片段编辑你的问题吗?两个包装器类都是def。你用来填充列表的查询…我觉得在我写它的时候很奇怪,但是它编译了??无论如何,我已经看到了我的错误的方式,并恢复了变化。我现在正在添加新的活动C;到包装器列表,结果正是我想要的!再次感谢你的帮助。 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 )); }