So beheben Sie INVALID_FIELD in Salesforce-Deployments

Eine SOQL-Abfrage, Formel oder Automatisierung verweist auf einen Feld-API-Namen, der auf diesem Objekt in der Ziel-Org nicht existiert.

Tritt auf bei: Apex-Kompilierung oder SOQL-Ausführung, meist innerhalb von Testläufen

Was das bedeutet

INVALID_FIELD bedeutet, dass Salesforce den in einer SOQL-Abfrage, Formel oder Automatisierung verwendeten Feldnamen auf dem abgefragten Objekt in der Org, in der das Deployment oder der Test läuft, nicht finden konnte. Anders als MISSING_FIELD, das spezifisch für Listenansichten und Berichte ist, taucht INVALID_FIELD meist innerhalb von Apex-Tests, SOQL-Abfragen oder Formelfeldern bei der Kompilierung oder Ausführung auf.

Da Apex zur Deployzeit gegen das aktuelle Schema der Org kompiliert, lässt eine Abfrage, die auf ein noch nicht angekommenes Feld verweist, die Kompilierung der gesamten Klasse fehlschlagen, nicht nur der einen Testmethode, weshalb dieser Fehler oft weit mehr Tests blockiert als den einen, der das Feld tatsächlich benötigt.

Diagnose

Häufige Ursachen

Apex-Test fragt ein Feld ab, das noch nicht deployt wurde
Die SOQL-Anweisung einer Testklasse selektiert ein Feld, das erst in einem späteren Deployment oder einem abhängigen Paket ausgeliefert wird.
Feld umbenannt, nachdem der Code geschrieben wurde
Der API-Name des Feldes hat sich geändert, aber Apex, eine Formel oder ein Flow verweisen noch auf den alten Namen.
Feld gehört zu einem anderen Objekt
Die Abfrage läuft gegen das falsche Objekt, sodass ein Feld, das an anderer Stelle in der Org existiert, auf dem tatsächlich abgefragten Objekt nicht existiert.

Die Lösung

  1. Das Feld vor dem Code deployen, der es abfragt
    Ordnen Sie das Deployment des Feldes vor jedem Apex oder Flow ein, der es in einer SOQL-Abfrage referenziert.
  2. Jede Referenz nach einer Umbenennung aktualisieren
    Durchsuchen Sie Apex, Flow und Formelfelder nach dem alten API-Namen und ersetzen Sie ihn durch den aktuellen.
    grep -rln "Legacy_Score__c" force-app/main/default/
  3. Bestätigen, dass das Feld zum abgefragten Objekt gehört
    Prüfen Sie das Objekt des Feldes in Setup gegen das Objekt in der SOQL-FROM-Klausel oder dem Formelkontext.
In der Praxis

Wie Serpent das verhindert

Serpent AI grenzt eine Aufgabe anhand von allem ab, was sie berührt, einschließlich der Felder, die ein Apex-Test oder Flow abfragt, sodass ein Feld, von dem ein Test abhängt, in derselben Aufgabe ausgeliefert wird statt in einer späteren. Siehe die Bibliothek der Salesforce-Deployment-Fehler.

Metadaten und Daten in einem einzigen Deployment-Flow in Serpent

Prävention

Ein neues Feld mit dem allerersten Code bündeln, der es abfragt
Liefern Sie die Metadaten eines benutzerdefinierten Feldes im selben Deployment aus wie die erste SOQL-Abfrage oder den ersten Trigger, der es referenziert, niemals in einem späteren, separaten Release.
Eine Feldumbenennung als codebasenweite Suche-und-Ersetzen behandeln, nicht als Setup-Änderung
Durchsuchen Sie jede Apex-Klasse, jeden Flow und jede Formel nach dem alten API-Namen, bevor Sie umbenennen, und aktualisieren Sie alle in derselben Änderung.
Vor der Veröffentlichung gegen die tatsächliche Ziel-Org kompilieren
Führen Sie ein Check-only-Deployment gegen das aktuelle Schema der echten Ziel-Org aus, damit ein fehlendes oder umbenanntes Feld in der CI fehlschlägt, nicht im Produktions-Deployment-Fenster.
Häufige Fragen

INVALID_FIELD, beantwortet

Ist INVALID_FIELD dasselbe wie MISSING_FIELD?
Sie sind verwandt, aber nicht identisch. MISSING_FIELD ist spezifisch für Listenansichten, Berichte und Layouts; INVALID_FIELD tritt in SOQL, Apex und Formeln auf, sodass die Behebung meist eine Code- oder Abfrageänderung statt einer Metadatenreferenz bedeutet.
Gilt das nur für benutzerdefinierte Felder, oder können auch Standardfelder das auslösen?
Standardfelder können das ebenfalls auslösen, meist wenn ein Feld editions- oder lizenzabhängig ist (wie ein Person-Accounts-Feld) und die Edition der Ziel-Org es nicht enthält.
Warum funktioniert dieselbe Abfrage in der Developer Console, schlägt aber in einer Testklasse fehl?
Die Developer Console läuft direkt gegen die Org, bei der Sie angemeldet sind, mit deren aktuellem Schema. Eine in eine andere Ziel-Org deployte Testklasse läuft gegen das Schema dieser Org, die dasselbe Feld möglicherweise noch nicht hat.

Kostenlos starten. Keine Kreditkarte, keine Installation, keine Verpflichtung.

Einrichtung in unter 15 Minuten. Keine DevOps-Einstellung nötig.

Neugierig auf schnelleres Shipping, bevor Sie einsteigen? Sprechen wir

Unverbindlich.