Comment corriger CANNOT_CASCADE_PRODUCT_ACTIVE dans les déploiements Salesforce

Un enregistrement Product2 ne peut pas être désactivé ou supprimé car une PricebookEntry active y fait toujours référence.

Survient pendant : un DML sur des enregistrements Product2, généralement dans un script de migration de données ou de nettoyage

Ce que cela signifie

CANNOT_CASCADE_PRODUCT_ACTIVE se déclenche lorsqu'une opération tente de désactiver ou de supprimer un enregistrement Product2 alors qu'il est encore référencé par une PricebookEntry active. Salesforce ne propage pas automatiquement le changement aux enregistrements de tarification dépendants, donc le produit reste bloqué jusqu'à ce que la dépendance soit levée explicitement.

Il s'agit d'une erreur de données à l'exécution, pas d'une erreur de déploiement de métadonnées : elle survient au moment où l'instruction DML s'exécute, que ce soit via Data Loader, un script de migration de données Apex ou une tâche de nettoyage CPQ, et non lors d'un déploiement Metadata API.

Diagnostic

Causes courantes

Le script de désactivation s'exécute avant les entrées de catalogue de prix dépendantes
Une migration de données désactive l'enregistrement Product2 avant de désactiver les PricebookEntries qui y font encore référence.
Les règles de tarification CPQ considèrent toujours le produit comme actif
La configuration des Price Rules ou des Bundles traite le produit comme actif même après la tentative de désactivation.
L'ordre de migration traite les produits avant les enregistrements dépendants
Un chargement en masse traite les enregistrements Product2 avant les enregistrements Quote Line ou Order Product qui y font encore référence.

La solution

  1. Désactivez d'abord les PricebookEntries
    Mettez à jour ou désactivez chaque PricebookEntry liée au produit avant de tenter de désactiver l'enregistrement Product2 lui-même.
    List<PricebookEntry> entries = [
        SELECT Id FROM PricebookEntry WHERE Product2Id = :productId AND IsActive = true
    ];
    for (PricebookEntry pbe : entries) pbe.IsActive = false;
    update entries;
  2. Séquencez les migrations CPQ pour détacher les dépendances en premier
    Ordonnez les étapes de la migration de données pour que les références de bundle et de règles de prix soient supprimées avant que le produit parent ne change d'état.
  3. Vérifiez les références actives de Quote Line ou Order Product
    Confirmez qu'aucune Quote Line ou Order Product ouverte ne fait encore référence au produit avant de le désactiver.
En pratique

Comment Serpent évite cela

Le séquencement de déploiement de Serpent, tenant compte des dépendances, s'applique aux objets CPQ et de tarification de la même façon qu'à toute autre métadonnée, si bien qu'une désactivation de produit et ses entrées de catalogue de prix associées se déroulent dans le bon ordre au lieu de se percuter en plein déploiement. Voir la bibliothèque des erreurs de déploiement Salesforce.

Métadonnées et données dans un seul flux de déploiement dans Serpent

Prévention

Scriptez la désactivation comme une seule tâche ordonnée
Désactivez les PricebookEntries et l'enregistrement Product2 dans un seul script de migration avec un ordre explicite, plutôt qu'en deux étapes planifiées séparément.
Interrogez les dépendances avant chaque désactivation de produit
Faites d'une vérification préalable des enregistrements actifs PricebookEntry, Quote Line et Order Product une étape standard de toute automatisation du cycle de vie produit.
Retirez les produits via un champ de statut, pas une désactivation directe
Lorsque l'activité métier le permet, marquez d'abord un produit comme discontinué via un champ personnalisé, puis reportez la désactivation effective à un nettoyage planifié une fois les dépendances levées.
Questions fréquentes

CANNOT_CASCADE_PRODUCT_ACTIVE, expliqué

Puis-je quand même forcer la désactivation ?
Non, pas directement. Les PricebookEntries dépendantes doivent d'abord être désactivées ; Salesforce ne propage pas le changement à votre place.
Cela bloque-t-il aussi la suppression de l'enregistrement Product2, ou seulement sa désactivation ?
Les deux. La suppression d'un produit avec des entrées de catalogue de prix actives échoue de la même façon ; ces entrées doivent d'abord être désactivées ou supprimées, quelle que soit l'opération tentée.
Cela s'applique-t-il aussi à l'entrée du Standard Price Book ?
Oui. Une entrée Standard Price Book active bloque la désactivation de la même manière qu'une entrée de catalogue de prix personnalisée ; les deux doivent être levées.

Démarrez gratuitement. Sans carte bancaire, sans installation, sans engagement.

Configuration en moins de 15 minutes. Aucun recrutement DevOps nécessaire.

Curieux de livrer plus vite avant de vous lancer ? Parlons-en

Sans engagement.