So beheben Sie CANNOT_CASCADE_PRODUCT_ACTIVE bei Salesforce-Deployments

Ein Product2-Datensatz kann nicht deaktiviert oder gelöscht werden, weil ein aktiver PricebookEntry noch darauf verweist.

Tritt auf bei: DML auf Product2-Datensätzen, meist in einem Datenmigrations- oder Bereinigungsskript

Was das bedeutet

CANNOT_CASCADE_PRODUCT_ACTIVE tritt auf, wenn ein Vorgang versucht, einen Product2-Datensatz zu deaktivieren oder zu entfernen, während er noch von einem aktiven PricebookEntry referenziert wird. Salesforce leitet die Änderung nicht automatisch an abhängige Preisdatensätze weiter, sodass das Produkt blockiert bleibt, bis die Abhängigkeit explizit aufgelöst wird.

Es handelt sich um einen Laufzeit-Datenfehler, keinen Metadaten-Deployment-Fehler: Er tritt in dem Moment auf, in dem die DML-Anweisung ausgeführt wird, sei es über den Data Loader, ein Apex-Datenmigrationsskript oder einen CPQ-Bereinigungsjob, nicht während eines Metadata-API-Deployments.

Diagnose

Häufige Ursachen

Deaktivierungsskript läuft vor abhängigen Preisbucheinträgen
Eine Datenmigration deaktiviert den Product2-Datensatz, bevor die PricebookEntries deaktiviert werden, die noch darauf verweisen.
CPQ-Preisregeln referenzieren das Produkt weiterhin als aktiv
Die Konfiguration in Price Rules oder Bundle-Einstellungen behandelt das Produkt auch nach dem Deaktivierungsversuch als aktiv.
Migrationsreihenfolge verarbeitet Produkte vor abhängigen Datensätzen
Ein Massenladevorgang verarbeitet Product2-Datensätze, bevor die Quote-Line- oder Order-Product-Datensätze verarbeitet werden, die noch darauf verweisen.

Die Lösung

  1. Zuerst PricebookEntries deaktivieren
    Aktualisieren oder deaktivieren Sie jeden mit dem Produkt verknüpften PricebookEntry, bevor Sie versuchen, den Product2-Datensatz selbst zu deaktivieren.
    List<PricebookEntry> entries = [
        SELECT Id FROM PricebookEntry WHERE Product2Id = :productId AND IsActive = true
    ];
    for (PricebookEntry pbe : entries) pbe.IsActive = false;
    update entries;
  2. CPQ-Migrationen so ordnen, dass Abhängigkeiten zuerst gelöst werden
    Ordnen Sie die Schritte der Datenmigration so an, dass Bundle- und Preisregelverweise entfernt werden, bevor sich der Status des übergeordneten Produkts ändert.
  3. Auf aktive Quote-Line- oder Order-Product-Verweise prüfen
    Bestätigen Sie, dass keine offenen Quote Lines oder Order Products mehr auf das Produkt verweisen, bevor Sie es deaktivieren.
In der Praxis

Wie Serpent das verhindert

Die abhängigkeitsbewusste Deployment-Reihenfolge von Serpent gilt für CPQ- und Preisobjekte genauso wie für jede andere Metadaten, sodass eine Produktdeaktivierung und ihre Preisbucheinträge in der richtigen Reihenfolge ablaufen, statt mitten im Deployment zu kollidieren. Siehe die Bibliothek der Salesforce-Deployment-Fehler.

Metadaten und Daten in einem einzigen Deployment-Flow in Serpent

Prävention

Deaktivierung als einen einzigen geordneten Job skripten
Deaktivieren Sie PricebookEntries und den Product2-Datensatz in einem Migrationsskript mit expliziter Reihenfolge, nicht in zwei separat geplanten Schritten.
Vor jeder Produktdeaktivierung nach Abhängigkeiten abfragen
Machen Sie eine Vorabprüfung auf aktive PricebookEntry-, Quote-Line- und Order-Product-Datensätze zu einem Standardschritt in jeder Produktlebenszyklus-Automatisierung.
Produkte über ein Statusfeld ausmustern, nicht über eine harte Deaktivierung
Markieren Sie ein Produkt, wo es das Geschäft zulässt, zunächst über ein eigenes Feld als eingestellt und verschieben Sie die tatsächliche Deaktivierung auf eine geplante Bereinigung, sobald Abhängigkeiten aufgelöst sind.
Häufige Fragen

CANNOT_CASCADE_PRODUCT_ACTIVE, beantwortet

Kann ich die Deaktivierung trotzdem erzwingen?
Nein, nicht direkt. Die abhängigen PricebookEntries müssen zuerst deaktiviert werden; Salesforce leitet die Änderung nicht automatisch für Sie weiter.
Blockiert dies auch das Löschen des Product2-Datensatzes oder nur dessen Deaktivierung?
Beides. Das Löschen eines Produkts mit aktiven Preisbucheinträgen schlägt auf die gleiche Weise fehl; die Einträge müssen zuerst deaktiviert oder entfernt werden, unabhängig davon, welchen Vorgang Sie versuchen.
Gilt das auch für den Standard Price Book-Eintrag?
Ja. Ein aktiver Standard Price Book-Eintrag blockiert die Deaktivierung genauso wie ein benutzerdefinierter Preisbucheintrag; beide müssen aufgelöst werden.

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

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

Neugierig auf schnelleres Shipping, bevor Sie einsteigen? Sprechen wir

Unverbindlich.