Hoe je INVALID_FIELD in Salesforce-deployments oplost

Een SOQL-query, formule of automatisering verwijst naar een veld-API-naam die niet op dat object bestaat in de doelorg.

Treedt op bij: Apex-compilatie of SOQL-uitvoering, meestal tijdens testruns

Wat het betekent

INVALID_FIELD betekent dat Salesforce de veldnaam die is gebruikt in een SOQL-query, formule of automatisering niet kon vinden op het object waartegen deze werd opgevraagd, in de org waar de deployment of test draait. In tegenstelling tot MISSING_FIELD, dat specifiek is voor lijstweergaven en rapporten, verschijnt INVALID_FIELD meestal binnen Apex-tests, SOQL-queries of formulevelden tijdens compilatie of uitvoering.

Omdat Apex compileert tegen het live schema van de org op deploytijd, laat een query die verwijst naar een veld dat nog niet is geland de compilatie van de hele klasse falen, niet alleen die ene testmethode, wat verklaart waarom deze fout vaak veel meer tests blokkeert dan alleen degene die het veld daadwerkelijk nodig heeft.

Diagnose

Veelvoorkomende oorzaken

Apex-test bevraagt een veld dat nog niet is gedeployed
Een SOQL-statement van een testklasse selecteert een veld dat pas in een latere deployment of een afhankelijk package wordt uitgeleverd.
Veld hernoemd nadat de code was geschreven
De API-naam van het veld is gewijzigd, maar Apex, een formule of een Flow verwijst nog naar de oude naam.
Veld hoort bij een ander object
De query wordt uitgevoerd tegen het verkeerde object, waardoor een veld dat elders in de org bestaat niet bestaat op het object dat daadwerkelijk wordt bevraagd.

De oplossing

  1. Deploy het veld vóór de code die het bevraagt
    Plan de deployment van het veld vóór elke Apex of Flow die ernaar verwijst in een SOQL-query.
  2. Werk elke verwijzing bij na een hernoeming
    Doorzoek Apex, Flow en formulevelden op de oude API-naam en vervang deze door de huidige.
    grep -rln "Legacy_Score__c" force-app/main/default/
  3. Bevestig dat het veld op het bevraagde object staat
    Controleer het object van het veld in Setup tegen het object in de SOQL FROM-clausule of formulecontext.
In de praktijk

Hoe Serpent dit voorkomt

Serpent AI bepaalt de scope van een taak op basis van alles wat deze raakt, inclusief de velden die een Apex-test of Flow opvraagt, zodat een veld waarvan een test afhankelijk is in dezelfde taak wordt uitgeleverd in plaats van in een latere. Zie de bibliotheek met Salesforce-deploymentfouten.

Metadata en data in één deploymentflow in Serpent

Preventie

Bundel een nieuw veld met de allereerste code die het bevraagt
Lever de metadata van een custom veld uit in dezelfde deployment als de eerste SOQL-query of trigger die ernaar verwijst, nooit in een latere, aparte release.
Behandel het hernoemen van een veld als een volledige codebase-zoek-en-vervangactie, niet als een Setup-wijziging
Doorzoek elke Apex-klasse, Flow en formule op de oude API-naam voordat je hernoemt, en werk ze allemaal bij in dezelfde wijziging.
Compileer tegen de daadwerkelijke doelorg vóór je release
Voer een check-only deploy uit tegen het actuele schema van de echte doelorg, zodat een ontbrekend of hernoemd veld faalt in CI in plaats van in het productiedeploymentvenster.
Veelgestelde vragen

INVALID_FIELD, beantwoord

Is INVALID_FIELD hetzelfde als MISSING_FIELD?
Ze zijn verwant maar niet identiek. MISSING_FIELD is specifiek voor lijstweergaven, rapporten en layouts; INVALID_FIELD verschijnt in SOQL, Apex en formules, dus de oplossing betekent meestal een code- of querywijziging in plaats van een metadataverwijzing.
Geldt dit alleen voor custom velden, of kunnen standaardvelden dit ook veroorzaken?
Standaardvelden kunnen dit ook veroorzaken, meestal wanneer een veld is gebonden aan een editie of licentie (zoals een Person Accounts-veld) en de editie van de doelorg dit niet bevat.
Waarom werkt dezelfde query wel in de Developer Console maar faalt hij in een testklasse?
De Developer Console draait rechtstreeks tegen de org waarop je bent ingelogd, met het huidige schema. Een testklasse die naar een andere doelorg is gedeployed, draait tegen het schema van die org, dat mogelijk nog niet hetzelfde veld heeft.

Start gratis. Geen creditcard, geen installatie, geen verplichting.

Binnen 15 minuten ingericht. Geen DevOps-medewerker nodig.

Benieuwd naar sneller releasen voordat je instapt? Laten we praten

Vrijblijvend.