لماذا لا يطابق تقرير مبيعات SAP Business One الأرقام: خصم الرأس و INV1
بقلم زين عباس, كودينوفا · آخر تحديث
العَرَض
تبني تقرير مبيعات أو لوحة معلومات أو نموذج Power BI من SAP Business One. يكون الإجمالي قريبًا من رقم SAP لكنه لا يساويه. لا يثق قسم المحاسبة في لوحة المعلومات، وهو محق في ذلك.
واجهنا هذا أثناء اختبار لوحة معلومات SAP B1 من كودينوفا على شركة حقيقية. جمعت النسخة الأولى أسطر الفواتير وأعادت 49,085.44، بينما كان رقم SAP نفسه للفترة ذاتها 49,058.00. جاء الفرق البالغ 27.44 من شيء واحد: خصم كُتب في تذييل الفاتورة.
لماذا يحدث ذلك
تخزّن فاتورة المبيعات القيم على مستويين:
- INV1 (الأسطر):
LineTotalوGrssProfitوQuantity. و LineTotal بعد خصم السطر. - OINV (الرأس):
DiscPrcntوDiscSumلخصم المستند، إضافة إلىDocTotalوVatSumوTotalExpns.
يُطبَّق خصم التذييل على المستند كله، ولا يُكتب مرة أخرى في كل سطر. لذلك عندما تنفّذ SUM(T1."LineTotal") فأنت تجمع قيمًا ما زالت قبل ذلك الخصم. معظم الفواتير لا تحمل خصم تذييل، ولهذا يكون الخطأ صغيرًا ويسهل أن يمر دون ملاحظة.
الحل في SQL
أدخل خصم الرأس في استعلام الأسطر وطبّقه لكل مستند:
SELECT T0."DocEntry", T0."DocDate", T0."CardCode", T0."DiscPrcnt",
T1."ItemCode",
SUM(T1."LineTotal") AS "Net",
SUM(T1."GrssProfit") AS "GP"
FROM OINV T0
INNER JOIN INV1 T1 ON T0."DocEntry" = T1."DocEntry"
WHERE T0."CANCELED" = 'N' AND T0."DocDate" >= '20250101'
GROUP BY T0."DocEntry", T0."DocDate", T0."CardCode", T0."DiscPrcnt", T1."ItemCode"
ثم لكل صف:
- الصافي بعد الخصم =
Net − Net × DiscPrcnt / 100 - إجمالي الربح بعد الخصم =
GP − Net × DiscPrcnt / 100
شغّل الاستعلام نفسه على ORIN و RIN1 للإشعارات الدائنة وتعامل مع قيمها على أنها سالبة.
نطبّق النسبة في الكود بدل SQL لأن بعض البيئات، مثل SQLQueries في Service Layer مع قائمة سماح مقيّدة، ترفض التعبيرات في قائمة SELECT. إذا كانت بيئتك تسمح بالعمليات الحسابية، فيمكنك تنفيذ ذلك مباشرة في SQL.
كيف تطابق رقمك مع SAP
قبل أن تثق في أي تقرير، طابقه مرة واحدة باستعلام على مستوى الرأس. صافي المبيعات دون ضريبة القيمة المضافة والشحن هو:
SELECT
(SELECT SUM(T0."DocTotal" - T0."VatSum" - T0."TotalExpns")
FROM OINV T0 WHERE T0."CANCELED" = 'N' AND T0."DocDate" >= '20250101')
-
(SELECT ISNULL(SUM(T0."DocTotal" - T0."VatSum" - T0."TotalExpns"), 0)
FROM ORIN T0 WHERE T0."CANCELED" = 'N' AND T0."DocDate" >= '20250101')
على SAP HANA استخدم IFNULL بدل ISNULL. في اختبارنا أعاد هذا الاستعلام 49,058.00، وهو بالضبط ما أعطاه استعلام الأسطر المصحَّح.
قد تظهر فروق صغيرة إذا كانت المستندات تستخدم التقريب أو الدفعات المقدمة، لأنها موجودة أيضًا على الرأس. إذا رأيت فجوة، فراجع تلك الحقول بعد ذلك.
قائمة تحقق لأي تقرير مبيعات في SAP B1
- صفِّ بالشرط
CANCELED = 'N'. - اطرح الإشعارات الدائنة (ORIN/RIN1).
- طبّق خصم الرأس على صافي المبيعات وإجمالي الربح معًا.
- استخدم حقل عملة واحدًا باتساق (
LineTotalللعملة المحلية). - طابق مرة واحدة مع
DocTotal − VatSum − TotalExpnsقبل الإطلاق.
استعلامات جاهزة تطبّق هذا الحل، إما بقراءة إجماليات الرأس أو بتطبيق معامل الخصم على الأسطر: المبيعات حسب العميل لفترة زمنية، وأعلى 20 صنفًا مبيعًا، والمبيعات حسب موظف المبيعات، واتجاه المبيعات الشهري.
أين يهم هذا أكثر
كل أداة تقرأ الأسطر بدل الرؤوس معرّضة لهذه المشكلة: تصدير Excel، و Crystal Reports، ونماذج Power BI، ولوحات المعلومات المخصصة. تطبّق لوحة معلومات SAP B1 من كودينوفا خصم الرأس تلقائيًا عبر موصلها المحلي، فتطابق إجمالياتها أرقام SAP المذكورة أعلاه.
إذا كانت تقاريرك لا تتفق مع SAP ولم تجد السبب، أرسل لنا الاستعلام. عادةً ما يُكتشف هذا النوع من عدم التطابق في جلسة واحدة.
المصادر
- SAP Learning: إدارة استعلامات SQL عبر واجهة Service Layer API
- SAP Learning: إنشاء الاستعلامات (SAP Business One)
خدمات ذات صلة
أسئلة شائعة
هل INV1.LineTotal قبل خصم المستند أم بعده؟
قبله. LineTotal هو إجمالي السطر بعد خصم السطر لكن قبل الخصم المُدخل في تذييل المستند. يُخزَّن خصم التذييل على الرأس في DiscPrcnt (النسبة) و DiscSum (المبلغ).
هل يتضمن GrssProfit خصم الرأس؟
يُحسب GrssProfit لكل سطر، لذلك لا يرى المجموع على مستوى الأسطر خصم التذييل. نطرح مبلغ الخصم من إجمالي الربح كما نطرحه من صافي المبيعات. وللتأكد على بياناتك، قارن بحقل الرأس OINV.GrosProfit لفاتورة عليها خصم.
هل يجب طرح الإشعارات الدائنة؟
نعم. تقرير المبيعات الذي يتجاهل ORIN و RIN1 يضخّم الإيرادات. تعامل مع أسطر الإشعارات الدائنة كقيم سالبة وطبّق خصم رأسها الخاص بالطريقة نفسها.
هل يجب تضمين الفواتير الملغاة؟
لا. صفِّ بالشرط CANCELED = 'N'. الفاتورة الملغاة ومستند إلغائها يحملان كلاهما علامة CANCELED (القيمتان 'Y' و 'C')، وتضمين أي منهما يشوّه الإجماليات.
هل النتيجة بالعملة المحلية؟
LineTotal بالعملة المحلية، و TotalFrgn يحمل القيمة بالعملة الأجنبية. استخدم أحدهما باتساق واكتب العملة على التقرير.
جاهز للبدء؟
أخبرنا بما تحتاجه. ستحصل على إجابة تقنية واضحة ونطاق عمل محدد وسعر ثابت، عادةً خلال 24 ساعة.
