STANDARD_PRICE_NOT_DEFINED in Salesforce-deployments oplossen

Een record heeft een Standard Price Book-vermelding voor het product nodig, maar die is nog niet aangemaakt.

Komt voor bij: runtime DML op pricingobjecten, in CPQ-migraties en productsetupscripts

Wat het betekent

STANDARD_PRICE_NOT_DEFINED betekent dat een bewerking, meestal het toevoegen van een product aan een custom price book, of het ernaar verwijzen op een Quote- of Opportunity Line, vereist dat het product al een Standard Price Book-vermelding heeft, en die bestaat niet. Salesforce behandelt de Standard Price Book-vermelding als de basis waarop elke custom price book-vermelding wordt gebouwd.

Deze volgorde-eis is een Salesforce-platformregel, geen CPQ-specifieke regel, dus deze geldt ongeacht of producten worden aangemaakt via de standaard-UI, Data Loader of de eigen provisioningtools van een CPQ-pakket.

Diagnose

Veelvoorkomende oorzaken

Custom price book-vermelding aangemaakt vóór de standaardvermelding
Een migratiescript voegt een custom PricebookEntry toe voor een product zonder eerst de bijbehorende Standard Price Book-vermelding aan te maken.
Migratievolgorde slaat de standaard-pricebookstap volledig over
Een dataloadproces is opgezet rond custom price books en bevatte nooit een stap voor standaardvermeldingen.
Nieuw product rechtstreeks toegevoegd aan een custom price book
Een product dat via automatisering of een script is aangemaakt, werd rechtstreeks gekoppeld aan een custom price book, waarbij de standaardvermelding werd overgeslagen.

De oplossing

  1. Voeg eerst de Standard Price Book-vermelding toe
    Maak altijd de Standard Price Book-vermelding van een product aan voordat je het aan een custom price book toevoegt.
    Id standardPbId = Test.getStandardPricebookId();
    insert new PricebookEntry(
        Pricebook2Id = standardPbId,
        Product2Id = productId,
        UnitPrice = 100,
        IsActive = true
    );
  2. Sequentieer prijsmigraties in de juiste volgorde
    Order de migratie zodat standaardvermeldingen in een aparte, eerdere stap worden aangemaakt dan custom price book-vermeldingen.
  3. Controleer op producten zonder standaardvermeldingen
    Bevraag na een migratie producten met custom price book-vermeldingen maar zonder Standard Price Book-vermelding en vul deze alsnog aan.
In de praktijk

Hoe Serpent dit voorkomt

Serpent sequentieert data-afhankelijke objecten op dezelfde manier als het metadata-afhankelijkheden sequentieert, zodat een CPQ-migratie Standard Price Book-vermeldingen invoegt vóór alle custom price book-vermeldingen die ervan afhangen. Zie de bibliotheek met Salesforce-deploymentfouten.

Metadata en data in één deploymentflow in Serpent

Preventie

Maak het aanmaken van de Standard Price Book-vermelding stap één van elk productaanmaakscript
Bak het invoegen van de standaardvermelding in hetzelfde script of dezelfde trigger die een nieuw Product2-record aanmaakt, zodat dit nooit kan worden overgeslagen.
Neem Test.getStandardPricebookId() op in elke productgerelateerde testfactory
Standaardiseer testdatasetup voor pricingobjecten vanaf dag één op Test.getStandardPricebookId(), aangezien Apex-tests de echte Standard Price Book Id van de org niet rechtstreeks kunnen bevragen.
Voer een periodieke controle uit op producten zonder standaardprijs
Plan een terugkerende controle op elk actief Product2-record zonder actieve Standard Price Book-vermelding, zodat hiaten aan het licht komen vóór de volgende migratie ertegen aanloopt.
Veelgestelde vragen

STANDARD_PRICE_NOT_DEFINED, beantwoord

Hebben alle custom price books een bestaande standaardvermelding nodig?
Ja. Salesforce vereist dat het product een actieve Standard Price Book-vermelding heeft voordat het aan enig ander price book kan worden toegevoegd.
Kan de Standard Price Book-vermelding een andere prijs hebben dan de custom-vermelding?
Ja. De Standard Price Book-vermelding hoeft alleen te bestaan en actief te zijn; de prijs die deze bevat kan vrij verschillen van elke custom price book-vermelding voor hetzelfde product.
Hoe krijgen Apex-tests de Id van het Standard Price Book, aangezien deze normaal niet bevraagbaar is?
Gebruik Test.getStandardPricebookId() binnen testcontext; het rechtstreeks bevragen van Pricebook2 op IsStandard = true is buiten die testspecifieke methode geblokkeerd.

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

Binnen 15 minuten ingesteld. Geen DevOps-aanwerving nodig.

Benieuwd naar sneller releasen voordat je instapt? Laten we praten

Vrijblijvend.