Verwenden von Bindungsvariablen und Aggregatfunktionen
Lernziele
Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:
- Erstellen einer dynamischen Abfrage durch Einfügen von Apex-Bindungsvariablen
- Verwenden einer Aggregationsfunktion, um Daten in einer Abfrage zusammenzufassen
- Anwenden einer Gruppierung auf Abfrageergebnisse
- Erkennen, wann Sie die WHERE-Klausel und wann die HAVING-Klausel verwenden sollten
Mit Trail Together einem Dozenten folgen
Möchten Sie bei diesem Schritt einem Experten folgen? Schauen Sie sich dieses Video an, das Teil der Reihe "Trail Together" auf Trailhead Live ist.
(Dieser Clip beginnt bei Minute 01:10:42, für den Fall, dass Sie zurückspringen und den Anfang des Schritts noch einmal sehen möchten.)
Einführung
Wir haben erörtert, wie Sie eine grundlegende SOQL-Abfrage schreiben und Abfragen formulieren können, die Felder in über- oder untergeordneten Objekten einbeziehen. Doch wie Sie wissen, ist jedes Anwendungsentwicklungsprojekt einzigartig. Daher ist es wichtig zu wissen, wie Geschäftslogik auf ein bestimmtes Problem zugeschnitten werden kann.
Bindungsvariablen
Das Nutzen von Bindungsvariablen ist eine Möglichkeit zur Anpassung Ihres Codes. Es ist vergleichbar mit dem Öffnen eines Formulars auf der Benutzeroberfläche und Ändern eines Eingabefelds, um nach bestimmten Ergebnissen zu suchen. Sehen wir uns ein Beispiel aus der Anwendung DreamHouse an. Sie sind ein Immobilienmakler, der Immobilien verkauft, und möchten Ihren Bestand an Immobilien mit einem Preis von unter 200.000 USD prüfen. Also schreiben Sie diese Abfrage:
List<Property__c> property = [SELECT Id, Name, Price__c FROM Property__c WHERE Price__c < 200000];
Das ist ziemlich einfach – für Sie. Aber es ist auch statisch. Diese Abfrage gibt immer Immobilien unter 200.000 USD zurück. Was ist mit anderen Immobilienmaklern und potenziellen Käufern, die keine SOQL-Abfragen schreiben und in der Developer Console ausführen können? Sie benötigen eine einfachere Möglichkeit, Immobilien nach dem für sie passenden Preis zu filtern. Wie können Sie eine Abfrage schreiben, die für einen Käufer mit einem Budget von 200.000 USD und einen anderen Käufer mit einem Budget von 800.000 USD funktioniert? Hier kommen Bindungsvariablen ins Spiel. Eine Bindungsvariable ist eine Apex-Variable, die Sie in einer SOQL-Abfrage verwenden. Nutzen Sie Bindungsvariablen als Platzhalter für bestimmte Werte, die später angegeben werden sollen.
Nehmen Sie eine Bindungsvariable namens maxHomeValue. Wir deklarieren die Variable in Apex und verwenden sie dann in einer Abfrage, etwa so:
Integer maxHomeValue = 200000; List<Property__c> property = [SELECT Name, Price__c FROM Property__c WHERE Price__c < :maxHomeValue];
Beachten Sie, dass der Bindungsvariablen in der Abfrage ein Doppelpunkt ( :
) vorangestellt ist. Diese Abfrage gibt den Namen und Preis des Immobilienobjekts zurück. Aber die Ergebnisse werden nach dem Preis der Immobilie gefiltert: WHERE Price__c < :maxHomeValue
. Der Wert der Bindungsvariablen, maxHomeValue
, wird außerhalb der Abfrage festgelegt. Sehen wir uns das in der Praxis an.
- Klicken Sie in Ihrem Trailhead Playground auf . Geben Sie
Dream
in das Suchfeld ein und wählen Sie dann die Anwendung DreamHouse aus.
- Klicken Sie auf Property Explorer.
Der "Property Explorer" sucht auf der Grundlage verschiedener Filter wie beispielsweise dem Maximalpreis nach verfügbaren Immobilien. Der Schieberegler "Max Price" akzeptiert Werte für die Bindungsvariable maxHomeValue.
- Verschieben Sie den Schieberegler "Max Price" auf 550K.
Bei jedem Verschieben des Schiebereglers wird sein zugehöriger Wert im Code über dessen Bindungsvariable geändert. Die Abfrage wird ausgeführt und fügt die Ergebnisse einer Liste mit Immobilien hinzu, die auf der Seite des Property Explorers angezeigt wird.
Die Angabe von Bindungsvariablen in der WHERE
-Klausel ermöglicht Ihnen, Variablenwerte in Ihrem Code festzulegen, ehe die Abfrage ausgeführt wird. Durch Bindungsvariablen wird eine Abfrage dynamisch. Um eine Abfrage für den jeweiligen Benutzer anzupassen, legen Sie Werte für Bindungsvariablen auf Grundlage von Benutzereingaben fest. Bei der weiteren Bearbeitung und Überprüfung des Codes werden Sie viele Arten von Feldern entdecken, deren Daten sich ständig ändern.
Aggregationsfunktionen
In Berichten verwenden Sie Rollup-Zusammenfassungsfelder, um Werte aus verwandten Datensätzen zu berechnen. Sie möchten beispielsweise die Gesamtanzahl der Immobilien oder den durchschnittlichen oder höchsten Wert von Immobilien in einer Stadt berechnen. In SOQL nutzen Sie Aggregationsfunktionen, um diese und andere Berechnungen durchzuführen.
Aggregationsfunktion für SOQL-Abfragen
Aggregationsfunktion |
Beschreibung |
Beispiel |
---|---|---|
COUNT() |
Gibt die Anzahl der Zeilen zurück, die mit dem Feld verknüpft sind |
SELECT COUNT(Name)FROM Broker__c |
COUNT_DISTINCT() |
Gibt die Anzahl der eindeutigen Zeilen zurück, die den Abfragekriterien entsprechen |
SELECT COUNT_DISTINCT(City__c)FROM Property__c |
MIN() |
Gibt den Mindestwert eines Felds zurück |
SELECT MIN(Days_On_Market__c)FROM Property__c |
MAX() |
Gibt den Höchstwert eines Felds zurück |
SELECT MAX(Beds__c)FROM Property__c |
AVG() |
Gibt den durchschnittlichen Wert eines numerischen Felds zurück |
SELECT City__c, AVG(Days_On_Market__c)FROM Property__c GROUP BY City__c |
SUM() |
Gibt den Gesamtwert eines numerischen Felds zurück |
SELECT SUM(Price__c), Broker__r.Name FROM Property__c GROUP BY Broker__r.Name |
Nehmen wir als Beispiel Immobilien in einer Stadt. Angenommen, wir beginnen mit dieser einfachen Abfrage:
SELECT City__c FROM Property__c
Die Abfrage gibt für jede der 12 Immobilien die Stadt zurück.
Da wir nicht die gesamte Liste der Städte benötigen, ändern Sie die Abfrage so, dass eine Aggregationsfunktion verwendet wird. Um die Gesamtanzahl der Immobilien zu ermitteln, wählen Sie die Funktion COUNT().
Die Aggregationsfunktion gehört in die SELECT-Klausel einer Abfrage, etwa so:
Die Klammern hinter dem Namen der Funktion enthalten den Namen des Felds, das in der Berechnung verwendet werden soll. In diesem Beispiel zählen wir die Werte im Feld City__c.
Ausführen einer COUNT()-Abfrage
- Geben Sie im Query Editor Folgendes ein:
SELECT City__c FROM Property__c
- Klicken Sie auf Execute (Ausführen).
Ihre Abfrageergebnisse sollten 12 Zeilen mit der Stadt jeder Immobilie enthalten.
- Bearbeiten Sie die Abfrage so, dass das Feld City__c in die Funktion COUNT() eingefügt wird, etwa so:
SELECT COUNT(City__c) FROM Property__c
- Klicken Sie auf Execute (Ausführen).
Das Ergebnis Ihrer Abfrage sollte 12 sein, also die Anzahl der Immobilien, die auf dem Feld City__c basieren.
Wenn Ihnen aufgefallen ist, dass sich alle 12 Immobilien in nur 2 Städten befinden, fragen Sie sich vielleicht, warum die Anzahl 12 und nicht 2 ist. Das liegt daran, dass die Funktion COUNT() alle Werte zählt, was oft mehrere Datensätze mit demselben Wert einschließt.
Angenommen, wir möchten allen Immobilien in einer Stadt einen Makler zuweisen. Wie viele Makler werden benötigt? Oder anders gefragt: Auf wie viele eindeutige Städte sind die 12 Immobilien verteilt? Um nur eindeutige Städte zu zählen, benötigen wir eine weitere Funktion. (Wenn Sie "eindeutig" hören, denken Sie an "unterschiedlich").
COUNT_DISTINCT() ist vergleichbar mit COUNT(), gibt aber nur eindeutige Werte zurück (keine Duplikate).
Ausführen einer COUNT_DISTINCT-Abfrage
- Bearbeiten Sie im Query Editor die Abfrage so, dass sie die Funktion COUNT_DISTINCT() verwendet, etwa so:
SELECT COUNT_DISTINCT(City__c) FROM Property__c
- Klicken Sie auf Execute (Ausführen).
Jetzt sollte Ihr Ergebnis 2 sein, also die Anzahl der eindeutigen Werte für City__c unter allen Immobilien.
Cambridge, Boston und Brookline sind die einzigen eindeutigen Werte, die im Feld City__c gefunden wurden. Beachten Sie, dass bei den Funktionen COUNT() und COUNT_DISTINCT() Groß- und Kleinschreibung berücksichtigt wird. Das bedeutet, dass Cambridge kein Duplikat von cambridge ist. Cambridge und cambridge werden als zwei eindeutige Werte betrachtet.
MIN(), MAX(), AVG() und SUM()
Weitere nützliche Aggregationsfunktionen sind MIN(), MAX(), AVG() und SUM().
Die Funktionen MIN() und MAX() sind einfach zu verstehen. MIN() findet den minimalen (niedrigsten) Wert und MAX() den maximalen (höchsten) Wert. Aber diese Funktionen haben etwas Besonderes an sich. Sie können sowohl Datums- und Uhrzeitangaben als auch Zahlen handhaben.
- Geben Sie im Query Editor Folgendes ein:
SELECT MIN(Date_Listed__c) FROM Property__c
- Klicken Sie auf Execute (Ausführen).
Die Funktion MIN() gibt das früheste Datum zurück. Die Funktion MAX() gibt das letzte (jüngste) Datum zurück.
Die Funktionen MIN() und MAX() erkennen auch die Sortierreihenfolge von Auswahllistenwerten, sodass Sie den ersten oder letzten Wert in einer Auswahlliste finden können.
Die Funktion AVG() berechnet den Durchschnitt aller Werte. Die Funktion SUM() berechnet die Summe aller Werte. Da diese beiden Funktionen Berechnungen durchführen, eignen sie sich nur für Felder mit numerischen Werten.
Gruppieren der Ergebnisse von Aggregationsfunktionen
Nach dem Berechnen von Werten auf Grundlage aggregierter Daten möchten Sie die Ergebnisse möglicherweise wie bei den Zusammenfassungsberichten in Gruppen ausweisen. Zum Gruppieren von Werten in einer SOQL-Abfrage verwenden Sie die GROUP BY-Klausel. Beispielsweise möchte ein Kunde von DreamHouse Realty wissen, welche Makler eine Immobilie verkauft haben.
Praktische Übung mit der GROUP BY-Klausel
Als Nächstes setzen Sie die GROUP BY-Klausel in einer Abfrage ein.
- Geben Sie im Query Editor Folgendes ein:
SELECT MAX(Status__c), Broker__r.Name FROM Property__c GROUP BY Broker__r.Name
- Klicken Sie auf Execute (Ausführen).
Ihre Ergebnisse sollten acht Zeilen enthalten.
Denken Sie daran, dass diese Abfrage Immobilien nach Makler gruppiert. Für die Immobilien der einzelnen Makler führen wir den am weitesten fortgeschrittenen Wert von Status__c auf. Dies ist der Auswahllistenwert "Status", der dem endgültigen Auswahllistenwert am nächsten kommt. Wir suchen nach Maklern mit verkauften Immobilien, um die Ergebnisse noch weiter einzugrenzen. Zurück zum Zeichenbrett.
Filtern der Ergebnisse von Aggregationsfunktionen
Eine weitere Möglichkeit, die Ergebnisse einzugrenzen, bietet eine HAVING-Klausel. Die HAVING-Klausel filtert die von einer Aggregationsfunktion zurückgegebenen Ergebnisse.
Hmm... das klingt nach etwas, das wir für die Suche nach Maklern verwenden können, die Immobilien verkauft haben. Unsere vorherige Abfrage ergab eine Liste von Maklern, die Immobilien mit beliebigem Status betreuen. Verwenden Sie nun die HAVING-Klausel, um diese Ergebnisse einzugrenzen.
- Geben Sie im Query Editor Folgendes ein:
SELECT MAX(Status__c), Broker__r.Name FROM Property__c GROUP BY Broker__r.Name HAVING MAX(Status__c) = 'Closed'
- Klicken Sie auf Query (Abfragen). Daraufhin sollte ein Makler angezeigt werden.
Ja! Das war's schon. Die HAVING-Klausel schränkt die Ergebnisse auf Eigenschaften mit dem Status "Closed" (Verkauft) ein. Gut gemacht!
Die WHERE-Klausel ist vergleichbar mit der HAVING-Klausel, richtig? Hier erfahren Sie, wie Sie entscheiden, wann Sie WHERE und wann HAVING verwenden sollten.
- Die WHERE-Klausel filtert Datensätze in einer SOQL-Abfrage ohne Aggregationsfunktion.
- Die HAVING-Klausel filtert die Ergebnisse, nachdem die Daten durch eine Aggregationsfunktion aggregiert wurden.
Wie Sie in diesem Modul gelernt haben, ist SOQL ein hervorragendes Instrument für den Zugriff auf Daten in Ihrer Salesforce-Organisation. Während Sie Ihre Fertigkeiten in der Apex-Programmierung weiter ausbauen, werden Sie viele Gelegenheiten finden, Ihre SOQL-Kenntnisse anzuwenden. Denken Sie währenddessen daran, dass Sie Details, Beispiele und weitere Informationen über Apex und SOQL in den Ressourcen dieses Moduls finden. Machen Sie sich an die Abfrage Ihrer Daten... mit SOQL.
Ressourcen
-
Dokumentation für Salesforce-Entwickler: Verwenden von Apex-Variablen in SOQL- und SOSL-Abfragen
-
Dokumentation für Salesforce-Entwickler: Aggregationsfunktionen
-
Dokumentation für Salesforce-Entwickler: Beispiele für SELECT-Klauseln
-
Dokumentation für Salesforce-Entwickler: GROUP BY