Frage

Ich habe Probleme, die Ergebnisse, die ich von einem Salesforce / Apex / SOQL Abfrage möchten.

Ich möchte: Eine Liste von Kontaktobjekten, die nur Kontakte, die CampaignMembers einer Reihe von Kampagnen sind; und sie sollten die Daten von diesem Kampagnenelement leicht zugänglich sind. (Mein Endziel ist ein VF-Seite mit einer Liste aller auf jede dieser Kampagnen mit einem Netz verbunden Kontakte anzeigt, deren Status für jede Kampagne.)

Diese Arbeit:

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.

Hier ist mein Problem:

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. Warum nicht CampaignMember aus der Unterabfrage zurückgegeben werden Objekte?
  2. Warum wird die Kontaktliste gefiltert werden? (Na ja, offensichtlich b / c gibt es keine WHERE-Klausel drin, aber was WHERE-Klausel gibt, was ich will?)

Ich weiß, dass ich dies tun könnte die CampaignMember Abfrage auf seinem eigenen, indem Sie und Schleife durch eine Kontaktanfrag an prep, aber das scheint, wie viel zusätzliche Verarbeitung, wenn eine Unterabfrage funktionieren soll.

Danke!


Aktualisieren

Die CampaignMember Objekte jetzt zeigen sich - seltsam -. Ich ohne zu bemerken, einige kleine Tippfehler behoben haben muss (und ja, sie sind wiederkehr mehrere Spalten und das scheint in Ordnung zu sein)

Ich kann immer noch nicht herausfinden, wie die Kontaktanfrage zu filtern, obwohl ...

War es hilfreich?

Lösung

Sie könnten ein Semi-Join auf Kontakte verwenden, um die Kontakte zu dem Satz zu filtern, die Sie wollen, so etwas wie diese

[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];

Eine andere Möglichkeit wäre, statt von campaignMmeber zu fahren.

[select contact.id, contact.firstname, contact.lastname, 
  status, comment__c, campaignId from campaignMembers 
  where contactId !='' and  campaignId in :cams];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top