Hoe je CANNOT_CASCADE_PRODUCT_ACTIVE in Salesforce-deployments oplost

Een Product2-record kan niet worden gedeactiveerd of verwijderd omdat een actieve PricebookEntry er nog naar verwijst.

Komt voor bij: DML op Product2-records, meestal in een datamigratie- of opschoonscript

Wat het betekent

CANNOT_CASCADE_PRODUCT_ACTIVE treedt op wanneer een bewerking probeert een Product2-record te deactiveren of te verwijderen terwijl het nog wordt gerefereerd door een actieve PricebookEntry. Salesforce cascadeert de wijziging niet automatisch door naar afhankelijke prijsrecords, dus het product blijft geblokkeerd totdat de afhankelijkheid expliciet is opgeheven.

Het is een runtime datafout, geen metadata-deploymentfout: het gebeurt op het moment dat de DML-instructie wordt uitgevoerd, of dat nu via Data Loader, een Apex-datamigratiescript of een CPQ-opschoonjob is, en niet tijdens een Metadata API-deployment.

Diagnose

Veelvoorkomende oorzaken

Deactiveringsscript draait vóór afhankelijke prijsboekregels
Een datamigratie deactiveert het Product2-record voordat de PricebookEntries die er nog naar verwijzen worden gedeactiveerd.
CPQ-prijsregels verwijzen nog steeds naar het product als actief
Configuratie in Price Rules of Bundle-instellingen behandelt het product als actief, zelfs na de deactiveringspoging.
Migratievolgorde verwerkt producten vóór afhankelijke records
Een bulklaadproces verwerkt Product2-records voordat de Quote Line- of Order Product-records die er nog naar verwijzen aan de beurt zijn.

De oplossing

  1. Deactiveer eerst de PricebookEntries
    Werk elke PricebookEntry die aan het product is gekoppeld bij of deactiveer deze, voordat je probeert het Product2-record zelf te deactiveren.
    List<PricebookEntry> entries = [
        SELECT Id FROM PricebookEntry WHERE Product2Id = :productId AND IsActive = true
    ];
    for (PricebookEntry pbe : entries) pbe.IsActive = false;
    update entries;
  2. Volgorde CPQ-migraties zo dat afhankelijkheden eerst worden losgekoppeld
    Orden de stappen van de datamigratie zodat bundel- en prijsregelverwijzingen worden opgeheven voordat het bovenliggende product van status verandert.
  3. Controleer op actieve Quote Line- of Order Product-verwijzingen
    Bevestig dat er geen openstaande Quote Lines of Order Products meer naar het product verwijzen voordat je het deactiveert.
In de praktijk

Hoe Serpent dit voorkomt

Serpents afhankelijkheidsbewuste deploymentvolgorde geldt voor CPQ- en prijsobjecten op dezelfde manier als voor alle andere metadata, zodat een productdeactivering en de bijbehorende prijsboekregels in de juiste volgorde worden verwerkt in plaats van halverwege de deployment te botsen. Zie de bibliotheek met Salesforce-deploymentfouten.

Metadata en data in één deploymentflow in Serpent

Preventie

Script deactivering als één geordende job
Deactiveer PricebookEntries en het Product2-record in één migratiescript met een expliciete volgorde, niet als twee apart geplande stappen.
Vraag bij elke productdeactivering vooraf afhankelijkheden op
Maak een vooraf-controle op actieve PricebookEntry-, Quote Line- en Order Product-records een standaardstap in elke automatisering van de productlevenscyclus.
Trek producten in via een statusveld, niet via een harde deactivering
Markeer een product waar de business dat toelaat eerst als uitgefaseerd met een custom veld en stel de daadwerkelijke deactivering uit tot een geplande opschoning zodra de afhankelijkheden zijn opgeheven.
Veelgestelde vragen

CANNOT_CASCADE_PRODUCT_ACTIVE, uitgelegd

Kan ik de deactivering toch afdwingen?
Nee, niet direct. De afhankelijke PricebookEntries moeten eerst worden gedeactiveerd; Salesforce cascadeert de wijziging niet automatisch voor je.
Blokkeert dit ook het verwijderen van het Product2-record, of alleen het deactiveren ervan?
Beide. Het verwijderen van een product met actieve prijsboekregels mislukt op dezelfde manier; de regels moeten eerst worden gedeactiveerd of verwijderd, ongeacht welke bewerking je uitvoert.
Geldt dit ook voor de Standard Price Book-regel?
Ja. Een actieve Standard Price Book-regel blokkeert deactivering op dezelfde manier als een aangepaste prijsboekregel; beide moeten worden opgeheven.

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

Binnen 15 minuten ingericht. Geen DevOps-specialist nodig.

Benieuwd naar sneller releasen voordat je instapt? Laten we praten

Vrijblijvend.