STANDARD_PRICE_NOT_DEFINED bei Salesforce-Deployments beheben

Ein Datensatz benötigt einen Standard Price Book-Eintrag für das Produkt, aber es wurde noch keiner erstellt.

Tritt auf bei: DML zur Laufzeit auf Pricing-Objekten, in CPQ-Migrationen und Produkt-Setup-Skripten

Was das bedeutet

STANDARD_PRICE_NOT_DEFINED bedeutet, dass eine Operation, meist das Hinzufügen eines Produkts zu einem benutzerdefinierten Price Book oder der Verweis darauf in einer Quote oder Opportunity Line, voraussetzt, dass das Produkt bereits einen Standard Price Book-Eintrag hat, und keiner existiert. Salesforce behandelt den Standard Price Book-Eintrag als Basis, auf der jeder benutzerdefinierte Price-Book-Eintrag aufbaut.

Diese Reihenfolgeanforderung ist eine Salesforce-Plattformregel, keine CPQ-spezifische, sie gilt also unabhängig davon, ob Produkte über die Standard-UI, den Data Loader oder die eigenen Provisioning-Tools eines CPQ-Pakets erstellt werden.

Diagnose

Häufige Ursachen

Benutzerdefinierter Price-Book-Eintrag vor dem Standardeintrag erstellt
Ein Migrationsskript fügt einen benutzerdefinierten PricebookEntry für ein Produkt ein, ohne zuvor dessen Standard Price Book-Eintrag zu erstellen.
Migrationsreihenfolge überspringt den Standard-Pricebook-Schritt komplett
Ein Datenladeprozess wurde um benutzerdefinierte Price Books herum konzipiert und enthielt nie einen Schritt für Standardeinträge.
Neues Produkt direkt zu einem benutzerdefinierten Price Book hinzugefügt
Ein durch Automatisierung oder ein Skript erstelltes Produkt wurde direkt mit einem benutzerdefinierten Price Book verknüpft, wobei das Standard-Price-Book umgangen wurde.

Die Lösung

  1. Zuerst den Standard Price Book-Eintrag einfügen
    Erstellen Sie immer zuerst den Standard Price Book-Eintrag eines Produkts, bevor Sie es zu einem benutzerdefinierten Price Book hinzufügen.
    Id standardPbId = Test.getStandardPricebookId();
    insert new PricebookEntry(
        Pricebook2Id = standardPbId,
        Product2Id = productId,
        UnitPrice = 100,
        IsActive = true
    );
  2. Preismigrationen in der richtigen Reihenfolge sequenzieren
    Ordnen Sie die Migration so, dass Standardeinträge in einem separaten, früheren Schritt vor benutzerdefinierten Price-Book-Einträgen erstellt werden.
  3. Auf Produkte ohne Standardeinträge prüfen
    Fragen Sie nach einer Migration Produkte mit benutzerdefinierten Price-Book-Einträgen, aber ohne Standard Price Book-Eintrag ab und ergänzen Sie diese nachträglich.
In der Praxis

Wie Serpent das verhindert

Serpent sequenziert datenabhängige Objekte genauso wie Metadatenabhängigkeiten, sodass eine CPQ-Migration Standard Price Book-Einträge vor allen davon abhängigen benutzerdefinierten Price-Book-Einträgen einfügt. Siehe die Bibliothek der Salesforce-Deploymentfehler.

Metadaten und Daten in einem einzigen Deployment-Flow in Serpent

Prävention

Das Erstellen des Standard Price Book-Eintrags zu Schritt eins jedes Produkterstellungsskripts machen
Integrieren Sie das Einfügen des Standardeintrags in dasselbe Skript oder denselben Trigger, der einen neuen Product2-Datensatz erstellt, damit es nie übersprungen werden kann.
Test.getStandardPricebookId() in jede produktbezogene Test-Factory einbinden
Standardisieren Sie das Testdaten-Setup für Pricing-Objekte von Anfang an auf Test.getStandardPricebookId(), da Apex-Tests die echte Standard Price Book Id der Org nicht direkt abfragen können.
Regelmäßige Prüfung auf Produkte ohne Standardpreis durchführen
Planen Sie eine wiederkehrende Prüfung für jeden aktiven Product2-Datensatz ohne aktiven Standard Price Book-Eintrag, damit Lücken auffallen, bevor die nächste Migration darauf stößt.
Häufige Fragen

STANDARD_PRICE_NOT_DEFINED, beantwortet

Benötigen alle benutzerdefinierten Price Books einen vorhandenen Standardeintrag?
Ja. Salesforce verlangt, dass das Produkt einen aktiven Standard Price Book-Eintrag hat, bevor es zu einem anderen Price Book hinzugefügt werden kann.
Kann der Standard Price Book-Eintrag einen anderen Preis haben als der benutzerdefinierte?
Ja. Der Standard Price Book-Eintrag muss lediglich existieren und aktiv sein; der darin enthaltene Preis kann frei von jedem benutzerdefinierten Price-Book-Eintrag für dasselbe Produkt abweichen.
Wie erhalten Apex-Tests die Id des Standard Price Books, da sie normalerweise nicht abfragbar ist?
Verwenden Sie Test.getStandardPricebookId() im Testkontext; das direkte Abfragen von Pricebook2 nach IsStandard = true ist außerhalb dieser testspezifischen Methode blockiert.

Kostenlos starten. Keine Kreditkarte, keine Installation, keine Verpflichtung.

In unter 15 Minuten eingerichtet. Keine DevOps-Einstellung nötig.

Neugierig auf schnelleres Shipping, bevor Sie einsteigen? Sprechen wir

Unverbindlich.