Skip to main content

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.

Hinweis

Dieses Konzept ist nicht neu. Im Modul Objektorientierte Programmierung für Administratoren haben Sie erfahren, wie ein Parameter als Platzhalter in einer Methode angegeben wird. Wenn Sie die Methode aufrufen, übergeben Sie ein Argument, das den Parameter ersetzt. Eine Bindungsvariable in einer Abfrage ist vergleichbar mit einem Parameter in einer Methode. Die Bindungsvariable wird bei Ausführung der Abfrage durch einen bestimmten Wert ersetzt.

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.

  1. Klicken Sie in Ihrem Trailhead Playground auf App Launcher. Geben Sie Dream in das Suchfeld ein und wählen Sie dann die Anwendung DreamHouse aus.
  2. 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.
  3. 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.

Der Schieberegler legt den Variablenwert im Apex-Code fest. Diese Werte ersetzen die Platzhalter der Variablen in der Abfrage.

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.

Abfrageergebnis – Zeilen insgesamt: 12. Die Tabelle enthält eine Spalte mit Städten.

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:

SELECT COUNT(City__c) FROM Property__c. COUNT ist die Aggregationsfunktion, City__c das Feld und Property__c das Objekt.

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

  1. Geben Sie im Query Editor Folgendes ein:
    SELECT City__c FROM Property__c
  2. Klicken Sie auf Execute (Ausführen).
    Ihre Abfrageergebnisse sollten 12 Zeilen mit der Stadt jeder Immobilie enthalten.
  3. 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
  4. 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.
    Abfrageergebnis – Zeilen insgesamt: 1. Die Tabelle enthält einen Wert: 12.

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

  1. 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
  2. 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.
    Abfrageergebnis – Zeilen insgesamt: 1. Spalte: count_distinct(City__c) Wert 2.

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.

  1. Geben Sie im Query Editor Folgendes ein:
    SELECT MIN(Date_Listed__c) FROM Property__c
  2. 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.

  1. Geben Sie im Query Editor Folgendes ein:
    SELECT MAX(Status__c), Broker__r.Name
    FROM Property__c
    GROUP BY Broker__r.Name
  2. Klicken Sie auf Execute (Ausführen).
    Ihre Ergebnisse sollten acht Zeilen enthalten.
    Abfrageergebnis – Zeilen insgesamt: 8, Spalte 1: max(Status__c), Spalte 2: Name.

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.

  1. 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'
  2. Klicken Sie auf Query (Abfragen). Daraufhin sollte ein Makler angezeigt werden.
    Abfrageergebnis – Zeilen insgesamt: 1. Spalte 1: max(Status__c). Spalte 2: Name.

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

Teilen Sie Ihr Trailhead-Feedback über die Salesforce-Hilfe.

Wir würden uns sehr freuen, von Ihren Erfahrungen mit Trailhead zu hören: Sie können jetzt jederzeit über die Salesforce-Hilfe auf das neue Feedback-Formular zugreifen.

Weitere Infos Weiter zu "Feedback teilen"