كل عام يفتح أحدهم في شركة خليجية تقرير المبيعات، فيرى فبراير مرتفعًا 40% ومارس منخفضًا 30%، ويسأل: ما الذي حدث؟ غالبًا لم يحدث شيء. رمضان تحرّك.
السنة الهجرية أقصر من الميلادية بنحو 11 يومًا، لذلك يبدأ رمضان قبل نحو 11 يومًا كل عام. في 2025 بدأ في 1 مارس، وفي 2026 بدأ في 18 فبراير، وفي 2027 سيبدأ تقريبًا في 8 فبراير. أي مقارنة مبنية على الأشهر الميلادية تخلط أيام رمضان بالأيام العادية، فتبدو النتيجة وكأنها اتجاه، وهي في الحقيقة مجرد تقويم.
لماذا تخطئ SAMEPERIODLASTYEAR في رمضان
تنقل SAMEPERIODLASTYEAR وDATEADD وبقية دوال الذكاء الزمني التواريخ بالأشهر الميلادية. قارن مارس 2026 بمارس 2025 وستجد أنك تقارن 19 يومًا من رمضان مع العيد بـ29 يومًا من رمضان. شهران مختلفان تمامًا في سلوك الشراء، يظهران كرقم نمو واحد.
في التجزئة والأغذية والاتصالات في الخليج، يعد رمضان والعيد من أكبر أسابيع السنة. وعندما ينقلهما التقويم من شهر إلى آخر، تتأرجح أرقام المقارنة السنوية لأسباب لا علاقة لها بالأداء.
الخطوة 1: أضف أعمدة هجرية إلى جدول التقويم
دوال التاريخ في Power BI تعمل بالتقويم الميلادي، لذلك يحمل جدول التقويم الإجابة الهجرية. تحتاج إلى خمسة أعمدة: Hijri Year وHijri Month Number وHijri Day وIs Ramadan وRamadan Day (من 1 إلى 30).
يبني مولّد جدول التقويم بلغة DAX المجاني جميع هذه الأعمدة لك وفق تقويم أم القرى الرسمي. يضمّن بدايات الأشهر الهجرية في جدول DATATABLE صغير داخل كود DAX، فلا حاجة إلى Power Query ولا إلى ملف خارجي. فعّل الخيار الهجري، واختر نطاق التواريخ، ثم انسخ الكود والصقه كجدول جديد.
الخطوة 2: مقياس رمضان الماضي
خذ أيام رمضان في سياق التصفية الحالي كأزواج من السنة الهجرية ويوم رمضان، وأرجع كل زوج سنة هجرية واحدة، ثم اقرأ تلك الأيام. هذه الأزواج هي ما يجعل البطاقة وصف الإجمالي صحيحين: فالبطاقة المفلترة على 2025 تضم أيضًا الأسابيع الأولى من 1447 هـ، وأخذ آخر سنة هجرية كان سيشير إلى رمضان 2025 نفسه.
Sales Last Ramadan =
VAR _RamadanDays =
FILTER (
SUMMARIZE ( 'Calendar', 'Calendar'[Hijri Year], 'Calendar'[Ramadan Day] ),
NOT ISBLANK ( 'Calendar'[Ramadan Day] )
)
VAR _SameDaysLastYear =
SELECTCOLUMNS (
_RamadanDays,
"Hijri Year", 'Calendar'[Hijri Year] - 1,
"Ramadan Day", 'Calendar'[Ramadan Day]
)
RETURN
CALCULATE (
[Total Sales],
REMOVEFILTERS ( 'Calendar' ),
TREATAS ( _SameDaysLastYear, 'Calendar'[Hijri Year], 'Calendar'[Ramadan Day] )
)
تزيل REMOVEFILTERS التواريخ الميلادية من التصفية، وتطبّق TREATAS الأزواج بعد إرجاعها، فيقابل اليوم الخامس من رمضان هذا العام اليوم الخامس من رمضان الماضي، أيًا كان التاريخ الميلادي لكل منهما. واحسب أيام رمضان فقط في جانب هذا العام أيضًا، ثم يكون مقياس النمو بالنمط المعتاد:
Sales This Ramadan =
CALCULATE ( [Total Sales], KEEPFILTERS ( 'Calendar'[Is Ramadan] = TRUE () ) )
Ramadan Growth % =
DIVIDE ( [Sales This Ramadan] - [Sales Last Ramadan], [Sales Last Ramadan] )
إذا لم تكن لديك بعد المقاييس الأساسية مثل [Total Sales]، فإن منشئ مقاييس DAX يكتبها بأسماء جداولك وأعمدتك، مع مقاييس YTD والمتوسطات المتحركة والمقارنة السنوية المعتادة لبقية العام.
الخطوة 3: الرسم البياني الذي يوضح الصورة
استخدم مخططًا خطيًا. ضع Ramadan Day على المحور الأفقي، وHijri Year في وسيلة الإيضاح، و[Total Sales] في القيم، ثم صفِّ المرئي على Is Ramadan = True. كل خط يمثل رمضانًا واحدًا، واليوم الأول يقابل اليوم الأول، وذروة ما قبل العيد تقابل ذروة ما قبل العيد.
ينطبق الأسلوب نفسه على عيد الفطر وعيد الأضحى: صفِّ على Hijri Month Number يساوي 10 أو 12، واستخدم Hijri Day على المحور.
ثلاثة أمور يجب الانتباه لها
- رؤية الهلال. تقويم أم القرى هو التقويم الرسمي في السعودية، وقد تجعل الرؤية المحلية رمضان يبدأ قبل يوم أو بعده. يستخدم خيار مواعيد رمضان والعيد المعلنة في المولّد المواعيد التي أعلنتها الإمارات منذ 2018: راجع دليل التقويم الخليجي.
- 29 أو 30 يومًا. كان رمضان 1446 تسعة وعشرين يومًا، ورمضان 1447 ثلاثين يومًا. اليوم الثلاثون ليس له مقابل في العام الماضي فيظهر فارغًا، وهذا صحيح. عند مقارنة الإجماليات، قارن متوسط اليوم إلى جانب المجموع.
- احتفظ بالعرضين. المالية ما زالت تُقفل الحسابات بالأشهر الميلادية، فأبقِ المقارنة السنوية المعتادة لها. واستخدم عرض رمضان للمبيعات والتسويق وتخطيط المخزون.
من المتوقع أن يبدأ رمضان 1448 تقريبًا في 8 فبراير 2027. جهّز التقويم الآن، وستكون أول مقارنة جاهزة من اليوم الأول.