Comment corriger INVALID_FIELD dans les déploiements Salesforce

Une requête SOQL, une formule ou une automatisation référence un nom d'API de champ qui n'existe pas sur cet objet dans l'org cible.

Se manifeste lors de : compilation Apex ou exécution SOQL, le plus souvent lors de l'exécution de tests

Ce que cela signifie

INVALID_FIELD signifie que Salesforce n'a pas trouvé le nom de champ utilisé dans une requête SOQL, une formule ou une automatisation sur l'objet interrogé, dans l'org où s'exécute le déploiement ou le test. Contrairement à MISSING_FIELD, spécifique aux vues de liste et aux rapports, INVALID_FIELD apparaît le plus souvent dans les tests Apex, les requêtes SOQL ou les champs de formule, à la compilation ou à l'exécution.

Comme Apex compile contre le schéma en direct de l'org au moment du déploiement, une requête référençant un champ pas encore arrivé fait échouer la compilation de toute la classe, pas seulement de cette méthode de test, ce qui explique pourquoi cette erreur bloque souvent bien plus de tests que celui qui a réellement besoin du champ.

Diagnostic

Causes courantes

Un test Apex interroge un champ pas encore déployé
L'instruction SOQL d'une classe de test sélectionne un champ livré dans un déploiement ultérieur ou un package dépendant.
Champ renommé après l'écriture du code
Le nom d'API du champ a changé, mais du code Apex, une formule ou un Flow référence encore l'ancien nom.
Le champ appartient à un objet différent
La requête s'exécute contre le mauvais objet, donc un champ qui existe ailleurs dans l'org n'existe pas sur l'objet réellement interrogé.

La solution

  1. Déployer le champ avant le code qui l'interroge
    Séquencez le déploiement du champ avant tout code Apex ou Flow qui le référence dans une requête SOQL.
  2. Mettre à jour chaque référence après un renommage
    Recherchez l'ancien nom d'API dans le code Apex, les Flows et les champs de formule, et remplacez-le par le nom actuel.
    grep -rln "Legacy_Score__c" force-app/main/default/
  3. Confirmer que le champ appartient à l'objet interrogé
    Vérifiez l'objet du champ dans Setup par rapport à l'objet de la clause SOQL FROM ou du contexte de formule.
En pratique

Comment Serpent évite cela

Serpent AI délimite une tâche par tout ce qu'elle touche, y compris les champs qu'un test Apex ou un Flow interroge, de sorte qu'un champ dont dépend un test soit livré dans la même tâche plutôt que dans une tâche ultérieure. Voir la bibliothèque des erreurs de déploiement Salesforce.

Métadonnées et données dans un seul flux de déploiement dans Serpent

Prévention

Regrouper un nouveau champ avec le tout premier code qui l'interroge
Livrez les métadonnées d'un champ personnalisé dans le même déploiement que la première requête SOQL ou le premier trigger le référençant, jamais dans une release ultérieure séparée.
Traiter le renommage d'un champ comme une recherche-remplacement sur toute la base de code, pas une modification dans Setup
Recherchez l'ancien nom d'API dans chaque classe Apex, Flow et formule avant de renommer, et mettez-les tous à jour dans le même changement.
Compiler contre l'org cible réelle avant de publier
Exécutez un déploiement check-only contre le schéma actuel de la véritable org cible afin qu'un champ manquant ou renommé échoue en CI, pas dans la fenêtre de déploiement en production.
Questions fréquentes

INVALID_FIELD, expliqué

INVALID_FIELD est-il identique à MISSING_FIELD ?
Ils sont liés mais pas identiques. MISSING_FIELD est spécifique aux vues de liste, aux rapports et aux mises en page ; INVALID_FIELD apparaît dans SOQL, Apex et les formules, donc le correctif implique généralement un changement de code ou de requête plutôt qu'une référence de métadonnée.
Cela ne s'applique-t-il qu'aux champs personnalisés, ou les champs standard peuvent-ils aussi le déclencher ?
Les champs standard peuvent aussi le déclencher, le plus souvent lorsqu'un champ est conditionné par une édition ou une licence (comme un champ Person Accounts) et que l'édition de l'org cible ne l'inclut pas.
Pourquoi la même requête fonctionne-t-elle dans la Developer Console mais échoue-t-elle dans une classe de test ?
La Developer Console s'exécute directement contre l'org sur laquelle vous êtes connecté, avec son schéma actuel. Une classe de test déployée sur une org cible différente s'exécute contre le schéma de cette org, qui peut ne pas encore avoir le même champ.

Démarrez gratuitement. Pas de carte bancaire, pas d'installation, aucun engagement.

Configuration en moins de 15 minutes. Aucun recrutement DevOps nécessaire.

Curieux de livrer plus vite avant de vous lancer ? Parlons-en

Sans engagement.