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

يحتاج سجل إلى إدخال Standard Price Book للمنتج، لكن لم يتم إنشاء أي إدخال بعد.

تظهر أثناء: DML وقت التشغيل على كائنات التسعير، في عمليات ترحيل CPQ وسكربتات إعداد المنتج

المعنى

يعني STANDARD_PRICE_NOT_DEFINED أن عملية ما، عادةً إضافة منتج إلى price book مخصص، أو الإشارة إليه في Quote أو Opportunity Line، تتطلب أن يمتلك المنتج بالفعل إدخال Standard Price Book، وهو غير موجود. يعامل Salesforce إدخال Standard Price Book كخط الأساس الذي يُبنى عليه كل إدخال price book مخصص.

يُعد شرط الترتيب هذا قاعدة منصة Salesforce، وليس خاصًا بـ CPQ، لذا ينطبق سواء تم إنشاء المنتجات عبر الواجهة القياسية، أو Data Loader، أو أدوات التزويد الخاصة بحزمة CPQ.

التشخيص

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

إدخال price book مخصص أُنشئ قبل الإدخال القياسي
يُدرج سكربت ترحيل PricebookEntry مخصصًا لمنتج دون إنشاء إدخال Standard Price Book الخاص به أولاً.
ترتيب الترحيل يتخطى خطوة price book القياسي تمامًا
تم تحديد نطاق عملية تحميل البيانات حول price books مخصصة ولم تتضمن أبدًا خطوة للإدخالات القياسية.
منتج جديد أُضيف مباشرة إلى price book مخصص
تم ربط منتج تم إنشاؤه عبر الأتمتة أو سكربت مباشرة بـ price book مخصص، متجاوزًا القياسي.

الحل

  1. أدرج إدخال Standard Price Book أولاً
    أنشئ دائمًا إدخال Standard Price Book لمنتج قبل إضافته إلى أي price book مخصص.
    Id standardPbId = Test.getStandardPricebookId();
    insert new PricebookEntry(
        Pricebook2Id = standardPbId,
        Product2Id = productId,
        UnitPrice = 100,
        IsActive = true
    );
  2. رتّب عمليات ترحيل التسعير بالترتيب الصحيح
    رتّب الترحيل بحيث تُنشأ الإدخالات القياسية في خطوة منفصلة وأبكر من إدخالات price book المخصصة.
  3. دقّق للتحقق من المنتجات التي تفتقر إلى الإدخالات القياسية
    بعد الترحيل، استعلم عن المنتجات التي تملك إدخالات price book مخصصة لكن بدون إدخال Standard Price Book واملأ النقص فيها.
من واقع الاستخدام

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

يرتب Serpent الكائنات المعتمِدة على البيانات بنفس الطريقة التي يرتب بها تبعيات metadata، بحيث يُدرج ترحيل CPQ إدخالات Standard Price Book قبل أي إدخالات price book مخصصة تعتمد عليها. راجع مكتبة أخطاء نشر Salesforce.

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

الوقاية

اجعل إنشاء إدخال Standard Price Book الخطوة الأولى في كل سكربت لإنشاء المنتجات
أدمج إدراج الإدخال القياسي في نفس السكربت أو الـ trigger الذي ينشئ سجل Product2 جديدًا، حتى لا يتم تخطيه أبدًا.
أدرج Test.getStandardPricebookId() في كل مصنع اختبار متعلق بالمنتج
وحّد إعداد بيانات الاختبار لكائنات التسعير على Test.getStandardPricebookId() منذ اليوم الأول، لأن اختبارات Apex لا يمكنها الاستعلام مباشرة عن Standard Price Book Id الحقيقي للمؤسسة.
شغّل تدقيقًا دوريًا للمنتجات التي تفتقر إلى التسعير القياسي
جدول فحصًا متكررًا لأي سجل Product2 فعّال بدون إدخال Standard Price Book فعّال، حتى تظهر الفجوات قبل أن يصطدم بها الترحيل التالي.
أسئلة شائعة

STANDARD_PRICE_NOT_DEFINED، بالإجابات

هل تحتاج كل price books المخصصة إلى وجود إدخال قياسي؟
نعم. يتطلب Salesforce أن يمتلك المنتج إدخال Standard Price Book فعّالاً قبل أن يمكن إضافته إلى أي price book آخر.
هل يمكن أن يمتلك إدخال Standard Price Book سعرًا مختلفًا عن الإدخال المخصص؟
نعم. يكفي أن يكون إدخال Standard Price Book موجودًا وفعّالاً؛ يمكن أن يختلف السعر الذي يحمله بحرية عن أي إدخال price book مخصص لنفس المنتج.
كيف تحصل اختبارات Apex على Id الخاص بـ Standard Price Book، بما أنه غير قابل للاستعلام عادةً؟
استخدم Test.getStandardPricebookId() ضمن سياق الاختبار؛ يُحظر الاستعلام المباشر عن Pricebook2 حيث IsStandard = true خارج تلك الطريقة الخاصة بالاختبار.

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

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

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

بدون التزام.