Pergunta

Estou tendo problemas para obter os resultados que quero de uma consulta Salesforce/Apex/Soql.

Eu quero: Uma lista de objetos de contato contendo apenas contatos que são membros de campanhas de um conjunto de campanhas; E eles devem ter os dados desse membro da campanha facilmente acessíveis. (Meu objetivo eventual é uma página VF com uma lista de todos os contatos conectados a qualquer uma dessas campanhas com uma grade indicando seu status para cada campanha.)

Estes trabalham:

Campaign[] cams = [SELECT id, name 
                     FROM Campaign 
                    WHERE parentid = '70170000000LRIe'];  
System.debug(cams);  
// returns ~4 Campaign objects

CampaignMember[] cmembers = [SELECT id, status, contactid, campaignid 
                               FROM CampaignMember 
                              WHERE campaignid in :cams];  
System.debug(cmembers);  
// returns about 40 CampaignMember objects.

Aqui está o meu problema:

Contact[] members = [SELECT id, firstname, lastname, 
                            (SELECT id, status, comment__c, campaignid 
                               FROM Contact.CampaignMembers 
                              WHERE campaignid in :cams) 
                       FROM Contact];  
System.debug(members);  
// contains ALL Contacts in the DB, but I wanted filtered results.
System.debug(members[x].CampaignMembers);
// this is a contact I've verified has a qualifying CampaignMember, but the list is empty.
// UPDATE: CampaignMembers are now being returned, not sure what changed...

  1. Por que nenhum objetivo de campanha não está sendo devolvido da subconsulta?
  2. Por que a lista de contatos não está sendo filtrada? (Bem, obviamente, b/c não há cláusula nela, mas o que a cláusula fornece o que eu quero?)

Sei que poderia fazer isso fazendo a consulta do membro de campanha por conta própria e percorrendo -a para preparar uma consulta de contato, mas isso parece muito processamento extra quando uma subconsulta deve funcionar.

Obrigado!


Atualizar

Os objetos do membro de campanha agora estão aparecendo - estranhamente - devo ter corrigido alguns erros de digitação sem perceber (e sim, eles estão retornando várias colunas e isso parece estar bem).

Ainda não consigo descobrir como filtrar a consulta de contato ...

Foi útil?

Solução

Você pode usar uma semi-joa nos contatos para filtrar os contatos para o conjunto que você deseja, algo assim

[select id, firstname, lastname, 
     (select id, status, comment__c, campaignid from CampaignMembers)
     from contact where id in 
          (select contactId from campaignMember where campaignId in :cams];

Outra opção seria dirigir da CampaignMMeber.

[select contact.id, contact.firstname, contact.lastname, 
  status, comment__c, campaignId from campaignMembers 
  where contactId !='' and  campaignId in :cams];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top