Hoe je INVALID_ID_FIELD in Salesforce-implementaties oplost

Een record-ID dat aan een lookup of DML-bewerking is doorgegeven is misvormd, heeft de verkeerde lengte, of hoort bij het verkeerde object.

Komt voor tijdens: DML op runtime en lookup-toewijzing, niet bij metadata-implementatie

Wat het betekent

INVALID_ID_FIELD betekent dat het ID dat Salesforce ontving niet oplost naar een geldig record voor het veld waaraan het werd doorgegeven. Dit is bijna altijd een hardcoded of verkeerd verwerkt ID: de verkeerde lengte, de verkeerde hoofdlettering, of een ID dat bij een ander object hoort dan het veld verwacht.

Elk Salesforce-record-ID draagt een drieledig sleutelvoorvoegsel dat het object identificeert, 001 voor Account, 003 voor Contact, enzovoort, dus deze fout is vaak terug te voeren op een ID van het verkeerde object dat wordt toegewezen aan een lookup die een ander object verwacht.

Diagnose

Veelvoorkomende oorzaken

15-tekens ID in plaats van 18
Een record-ID gekopieerd uit een browser-URL is de hoofdlettergevoelige 15-tekens versie, en hoofdlettergebruik of afkapping heeft het onderweg beschadigd.
Org-specifiek ID hergebruikt in de doelorganisatie
Een ID uit de bronorganisatie is hardcoded opgenomen in metadata of testcode, maar dat exacte ID komt niet overeen met enig record in de doelorganisatie.
Verkeerd objecttype voor de lookup
Het sleutelvoorvoegsel van het ID hoort bij een ander object dan het lookupveld verwacht, bijvoorbeeld een Contact-ID dat wordt doorgegeven aan een Account-veld.

De oplossing

  1. Gebruik altijd het 18-tekens ID
    Standaardiseer in code op het niet-hoofdlettergevoelige 18-tekens record-ID en hardcode nooit een 15-tekens versie.
  2. Zoek in plaats daarvan op een extern ID
    Vervang hardcoded record-ID's door een query op een stabiel extern ID of uniek veld, zodat de verwijzing per organisatie correct oplost.
  3. Controleer of het objecttype overeenkomt
    Controleer het drieledige sleutelvoorvoegsel van het ID tegen het object dat het veld verwacht, voordat je het doorgeeft.
    Id anyId = '001XXXXXXXXXXXXXXX';
    String prefix = String.valueOf(anyId).left(3);
    System.debug(Schema.getGlobalDescribe().values());
In de praktijk

Hoe Serpent dit voorkomt

Serpent AI lost verwijzingen op via een business key in plaats van een ruw record-ID bij het verplaatsen van wijzigingen tussen omgevingen, zodat dit type fout een implementatie nooit bereikt. Zie de bibliotheek met Salesforce-implementatiefouten.

Metadata en data in één deploymentflow in Serpent

Preventie

Typeer record-ID-variabelen als Id, niet als String
Gebruik het Apex-type Id in plaats van String voor alles wat een recordidentificatie bevat, zodat een misvormde of verkeerd gelengde waarde al bij toewijzing faalt, niet diep in een DML-aanroep.
Kopieer nooit record-ID's uit een browser-URL naar code
Query naar het record op basis van een stabiel veld in plaats van een in een URL waargenomen ID te plakken, wat gemakkelijk kan worden afgekapt of verkeerd getypt.
Valideer het objecttype bij toewijzing voor dynamische lookups
Wanneer het doelobject van een lookupveld dynamisch wordt bepaald, controleer dan het sleutelvoorvoegsel van het binnenkomende ID tegen het verwachte object voordat je toewijst.
Veelgestelde vragen

INVALID_ID_FIELD, uitgelegd

Hoe onderscheid ik een 18-tekens ID van een 15-tekens ID?
Het 18-tekens ID eindigt altijd op drie extra niet-hoofdlettergevoelige tekens na de oorspronkelijke 15. Als een ID precies 15 tekens telt, behandel het dan als onveilig om te hardcoden.
Zijn sleutelvoorvoegsels hetzelfde in elke Salesforce-organisatie?
Standaardobjectvoorvoegsels zoals 001 voor Account zijn consistent over organisaties heen, maar aangepaste objectvoorvoegsels worden per organisatie toegewezen bij het aanmaken van het object en verschillen tussen omgevingen.
Vangt Id.valid() in Apex elk geval van deze fout af?
Het controleert of een string syntactisch de vorm van een geldig ID heeft, maar bevestigt niet dat het record daadwerkelijk bestaat of bij het juiste object hoort; beide controles blijven nodig.

Begin gratis. Geen creditcard, geen installatie, geen verplichtingen.

In minder dan 15 minuten ingericht. Geen DevOps-aanwerving nodig.

Benieuwd naar sneller releasen voordat je instapt? Laten we praten

Vrijblijvend.