Salesforce Apex代码如何从子查询中获取活动成员的数据

Salesforce Apex代码如何从子查询中获取活动成员的数据,salesforce,apex-code,visualforce,soql,Salesforce,Apex Code,Visualforce,Soql,我试图在我的VF页面上显示四个字段:名称、活动成员的状态、活动历史对象的主题和上次修改日期。我无法从活动成员中获取名称和状态字段 谁能告诉我如何从活动成员处获取名称和状态字段。下面是我的控制器代码 公共与共享类活动视图{ 公众运动营{get;set;} 公共列表lMemberWrappers{get;set;} 公共日期时间起始日期{get;set;} 公共活动ViewAPExpages.StandardController控制器{ camp=activatcontroller.getRecor

我试图在我的VF页面上显示四个字段:名称、活动成员的状态、活动历史对象的主题和上次修改日期。我无法从活动成员中获取名称和状态字段

谁能告诉我如何从活动成员处获取名称和状态字段。下面是我的控制器代码

公共与共享类活动视图{ 公众运动营{get;set;} 公共列表lMemberWrappers{get;set;} 公共日期时间起始日期{get;set;} 公共活动ViewAPExpages.StandardController控制器{ camp=activatcontroller.getRecord; lmemberwrapers=新列表; 成员; startDate=null; 对于活动c:[选择ID,选择ID,活动ID,来自活动成员的状态,其中活动ID=:camp.ID来自活动ID=:camp.ID]{ 劳工处处长:议员{ 对于ActivityHistory ah:ld.getSObjects'ActivityHistories'{ lMemberWrappers.addnewmemberwrapperld.Name,ah.Subject,ah.LastModifiedDate,ld.CampaignMembers.get0.Status; } } } } 私人名单成员; 公众成员名单{ 活动成员=[选择Id、姓名、电话、手机、电子邮件、LastModifiedDate、选择Id、Campaign.Name、Contact.Phone、Lead.FirstName、Lead.LastName、Lead.Name、LeadID、ContactID、Lead.Phone、Lead.Email、LastModifiedDate、Lead.LastModifiedDate、Status、Campaign.Id、Campaign\u Id\uu c、Lead.MobilePhone,来自Campaign Members,其中CampaignId=:camp.Id, 按lastModifiedDate描述限制1从ActivityHistories顺序中选择主题、Id、lastModifiedDate 从Lead where Id INselect Lead Id From campaignMember where campaignId=:camp.Id]; 返回成员; } 公共类成员包装器{ 公共对象状态{get;set;} 公共字符串名称{get;set;} 公共字符串主题{get;set;} 公共日期时间LastActivityHistory{get;set;} public MemberWrapperString名称、字符串主题、Datetime LastActivityHistory、对象状态{ this.Name=Name; this.Subject=主语; this.LastActivityHistory=LastActivityHistory; 这个状态=状态; } } }
由于ActivityHistory的要求,这将需要进行多个查询。此处有四个级别的关系:活动->活动成员->领导->活动历史,因此不能仅使用子查询执行此操作

以下代码将为您提供所需的信息:

Set<Id> leadIds = new Set<Id>();
List<Campaign> campaignList = [Select ID, (SELECT Id, Status, LeadId FROM CampaignMembers) FROM campaign WHERE id = :camp.Id ];

for (Campaign c : campaignList) {
    for (CampaignMember cm : c.CampaignMembers) {
        leadIds.add(cm.LeadId);
    }
}

Map<Id, Lead> leadMap = new Map<Id, Lead>([Select Id, Name, (Select Subject, LastModifiedDate from ActivityHistories Order By LastModifiedDate DESC limit 1) From Lead Where Id IN :leadIds]);
for (Campaign c : campaignList) {
    for (CampaignMember cm : c.CampaignMembers) {
        Lead ld = leadMap.get(cm.LeadId);
        if (ld.ActivityHistories.size() > 0) {
            ActivityHistory ah = ld.ActivityHistories[0];
            lMemberWrappers.add(new MemberWrapper(ld.Name, ah.Subject, ah.LastModifiedDate, cm.Status));                
        }
    }
}

如果没有活动,我只是跳过了创建MemberWrapper,但是如果愿意,您可以将其更改为只放入空白值。

谢谢Kyle。.我尝试了这段代码,但它给我一个错误,变量不存在:第一个for循环本身的LeadId