كيفية إصلاح CANNOT_CASCADE_PRODUCT_ACTIVE في عمليات نشر Salesforce

لا يمكن إلغاء تفعيل أو حذف سجل Product2 لأن PricebookEntry نشطًا لا يزال يشير إليه.

يظهر أثناء: عمليات DML على سجلات Product2، عادة ضمن سكربت ترحيل بيانات أو تنظيف

المعنى

يظهر خطأ CANNOT_CASCADE_PRODUCT_ACTIVE عندما تحاول عملية إلغاء تفعيل أو إزالة سجل Product2 بينما لا يزال يُشار إليه من قبل PricebookEntry نشط. لا يقوم Salesforce بترحيل التغيير تلقائيًا عبر سجلات التسعير التابعة، لذا يبقى المنتج محظورًا حتى تتم إزالة التبعية صراحةً.

هذا خطأ بيانات وقت التشغيل، وليس خطأ نشر ميتاداتا: يحدث لحظة تنفيذ عبارة DML، سواء من Data Loader أو سكربت ترحيل بيانات مكتوب بلغة Apex أو مهمة تنظيف CPQ، وليس أثناء نشر عبر Metadata API.

التشخيص

الأسباب الشائعة

سكربت إلغاء التفعيل يعمل قبل إدخالات دفتر الأسعار التابعة
يقوم ترحيل بيانات بإلغاء تفعيل سجل Product2 قبل إلغاء تفعيل PricebookEntries التي لا تزال تشير إليه.
قواعد تسعير CPQ لا تزال تعتبر المنتج نشطًا
الإعدادات في Price Rules أو إعداد Bundle تتعامل مع المنتج كنشط حتى بعد محاولة إلغاء التفعيل.
ترتيب الترحيل يعالج المنتجات قبل السجلات التابعة
عملية تحميل مجمّعة تعالج سجلات Product2 قبل سجلات Quote Line أو Order Product التي لا تزال تشير إليها.

الحل

  1. ألغِ تفعيل PricebookEntries أولاً
    قم بتحديث أو إلغاء تفعيل كل PricebookEntry مرتبط بالمنتج قبل محاولة إلغاء تفعيل سجل Product2 نفسه.
    List<PricebookEntry> entries = [
        SELECT Id FROM PricebookEntry WHERE Product2Id = :productId AND IsActive = true
    ];
    for (PricebookEntry pbe : entries) pbe.IsActive = false;
    update entries;
  2. رتّب ترحيلات CPQ لفصل التبعيات أولاً
    رتّب خطوات ترحيل البيانات بحيث تتم إزالة مراجع الحزم وقواعد التسعير قبل تغيير حالة المنتج الأصلي.
  3. تحقق من وجود مراجع نشطة لـ Quote Line أو Order Product
    تأكد من عدم وجود Quote Lines أو Order Products مفتوحة لا تزال تشير إلى المنتج قبل إلغاء تفعيله.
من واقع الاستخدام

إزاي Serpent بتمنع ده

يتم تطبيق تسلسل النشر المدرك للتبعيات في Serpent على كائنات CPQ والتسعير بنفس الطريقة التي يُطبَّق بها على أي ميتاداتا أخرى، بحيث يتم ترتيب إلغاء تفعيل المنتج وإدخالات دفتر أسعاره بالترتيب الصحيح بدلاً من التصادم في منتصف النشر. راجع مكتبة أخطاء نشر Salesforce.

الـ metadata والبيانات في مسار نشر واحد داخل Serpent

الوقاية

اكتب إلغاء التفعيل كمهمة واحدة مرتبة
ألغِ تفعيل PricebookEntries وسجل Product2 في سكربت ترحيل واحد بترتيب صريح، وليس كخطوتين مجدولتين بشكل منفصل.
استعلم عن التبعيات قبل كل عملية إلغاء تفعيل لمنتج
اجعل الفحص المسبق لسجلات PricebookEntry وQuote Line وOrder Product النشطة خطوة قياسية في أي أتمتة لدورة حياة المنتج.
قم بإيقاف المنتجات عبر حقل حالة، وليس عبر إلغاء تفعيل مباشر
حيثما تسمح متطلبات العمل، ضع علامة على المنتج كمتوقف باستخدام حقل مخصص أولاً، وأجّل إلغاء التفعيل الفعلي إلى عملية تنظيف مجدولة بعد إزالة التبعيات.
أسئلة شائعة

أسئلة شائعة حول CANNOT_CASCADE_PRODUCT_ACTIVE

هل يمكنني فرض إلغاء التفعيل على أي حال؟
لا، ليس مباشرة. يجب إلغاء تفعيل PricebookEntries التابعة أولاً؛ فSalesforce لا يقوم بترحيل التغيير نيابة عنك.
هل يمنع هذا حذف سجل Product2 أيضًا، أم فقط إلغاء تفعيله؟
كلاهما. يفشل حذف منتج يحتوي على إدخالات دفتر أسعار نشطة بنفس الطريقة؛ يجب إلغاء تفعيل الإدخالات أو إزالتها أولاً بغض النظر عن العملية التي تحاولها.
هل ينطبق هذا أيضًا على إدخال Standard Price Book؟
نعم. يمنع إدخال Standard Price Book النشط إلغاء التفعيل بنفس طريقة إدخال دفتر الأسعار المخصص؛ يجب إزالة كلاهما.

ابدأ مجانًا. بدون بطاقة ائتمان، وبدون تثبيت، وبدون التزام.

الإعداد في أقل من 15 دقيقة. لا حاجة لتوظيف مختص DevOps.

هل تريد معرفة كيف يمكنكم الشحن أسرع قبل البدء؟ لنتحدث

بدون التزام.