FIELD_FILTER_VALIDATION_EXCEPTION oplossen in Salesforce-deployments

Een lookupveldwaarde voldoet niet aan het lookupfilter dat op dat veld is ingesteld.

Treedt op bij: runtime-DML, overal waar een lookupwaarde wordt ingesteld, inclusief Apex-tests

Wat het betekent

FIELD_FILTER_VALIDATION_EXCEPTION betekent dat een lookup- of master-detailrelatie wordt ingesteld op een waarde die niet voldoet aan het lookupfilter dat op dat veld is gedefinieerd. Lookupfilters beperken welke records kunnen worden geselecteerd op basis van criteria zoals status of recordtype, en Salesforce handhaaft ze bij elke opslag, niet alleen via de UI.

In tegenstelling tot een validatieregel wordt een lookupfilter op het veld zelf in Setup ingesteld in plaats van als formule geschreven, waardoor het makkelijk is te vergeten dat het bestaat totdat seed-data of een migratiescript een waarde instelt die het filter juist moest weigeren.

Diagnose

Veelvoorkomende oorzaken

Gemigreerde data verwijst naar een record dat het filter niet doorstaat
Een migratiescript stelt een lookup in op een record waarvan de status of het type niet voldoet aan de huidige filtercriteria van de doelorg.
Een lookupfilter is aangescherpt nadat de seed-data was geschreven
De criteria van het filter zijn in een latere release gewijzigd, en bestaande test- of seed-scripts zijn niet bijgewerkt om daarmee overeen te komen.
Testsetup verwijst naar een record dat sindsdien is uitgesloten
De data-setup voor een Apex-test verwijst naar een record met een status die een lookupfilter nu uitsluit, waardoor de test bij deployment breekt.

De oplossing

  1. Werk migratie- of seed-data bij zodat deze aan de huidige filtercriteria voldoet
    Richt de lookup op een record dat voldoet aan het actieve lookupfilter van de doelorg.
  2. Controleer het lookupfilter bij het deployen van data die een uitzondering nodig heeft
    Verruim het filter tijdelijk als een specifieke bulklading het echt moet omzeilen, en herstel het daarna.
  3. Controleer lookupfilters na wijzigingen in het objectmodel
    Controleer bij elke wijziging van filtercriteria bestaande automatisering en testdata op verwijzingen die er nu niet meer aan zouden voldoen.
In de praktijk

Hoe Serpent dit voorkomt

Serpent valideert deployments tegen de huidige metadata van de doelorg voordat een taak wordt gepromoveerd, zodat een lookupfilter dat in een latere release is aangescherpt naar voren komt tijdens CI in plaats van tijdens een productiedata-load. Zie de bibliotheek met Salesforce-deploymentfouten.

Metadata en data in één deploymentflow in Serpent

Preventie

Documenteer de criteria van elk lookupfilter naast het veld
Houd een korte notitie bij in de veldomschrijving of in schemadocumentatie over wat het filter beperkt, zodat toekomstige migraties weten dat de beperking bestaat.
Behandel wijzigingen aan lookupfilters als breaking changes die beoordeling vereisen
Markeer elke deployment die de criteria van een lookupfilter aanscherpt voor controle tegen bestaande automatisering en testdata voordat deze wordt gemerged.
Houd testsetuprecords in lijn met de huidige filtercriteria
Beoordeel Apex-testdatafactories opnieuw zodra een lookupfilter op een object dat ze raken wijzigt, niet alleen wanneer de test zelf verandert.
Veelgestelde vragen

FIELD_FILTER_VALIDATION_EXCEPTION, uitgelegd

Blokkeert een lookupfilter API-inserts op dezelfde manier als de UI?
Ja. Lookupfilters worden bij elke opslag afgedwongen, ongeacht of het record afkomstig is van de UI, de API, of een data-load.
Is een lookupfilter hetzelfde als een validatieregel?
Nee. Een lookupfilter wordt rechtstreeks op het lookupveld in Setup ingesteld en beperkt welke records kunnen worden geselecteerd; een validatieregel is een aparte, op formules gebaseerde controle die elk veld van het record kan raadplegen.
Kan een lookupfilter optioneel zijn in plaats van verplicht?
Ja. Salesforce ondersteunt zowel verplichte filters, die niet-overeenkomende records altijd blokkeren, als optionele filters, die de gebruiker alleen in de UI waarschuwen maar API- of Apex-inserts niet blokkeren.

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

Binnen 15 minuten ingericht. Geen DevOps-aanwerving nodig.

Benieuwd naar sneller releasen voordat je instapt? Laten we praten

Vrijblijvend.