جدول التواريخ المعتاد في Power BI يعرف الأشهر من يناير إلى ديسمبر وعطلة واحدة فقط. أما الأعمال في الخليج فتسير على أكثر من ذلك: رمضان والعيد يتحركان كل عام، والشهر الهجري يحدد الموسم، وعطلة نهاية الأسبوع تختلف حسب الدولة والسنة. إذا أغفلت أيًا منها، أظهر التقرير اتجاهات هي في الحقيقة مجرد تقويم.

يبني هذا الدليل جدول تقويم واحدًا يضبط كل ذلك بلغة DAX في دقيقة تقريبًا، ومعه ثلاثة مقاييس تستخدمه.

أربعة أمور يخطئ فيها التقويم المعتاد في الخليج

  • رمضان يتحرك. بدأ في 1 مارس في 2025، وفي 18 فبراير في 2026، ويُتوقع أن يبدأ نحو 8 فبراير في 2027: أي قبل نحو 11 يومًا كل عام. مقارنة مارس 2026 بمارس 2025 تقارن موسمين مختلفين.
  • العيد فترة وليس يومًا. يزداد الشراء في الأيام التي تسبق عيد الفطر وعيد الأضحى، وتقع هذه الأيام في شهر ميلادي مختلف من سنة إلى أخرى.
  • العطلة تغيّرت. نقلت الإمارات عطلة القطاع الحكومي من الجمعة والسبت إلى السبت والأحد في 1 يناير 2022 (بإعلان من وام). وتبقى السعودية والكويت وقطر والبحرين وعُمان على الجمعة والسبت. وأيًا كانت العطلة الثابتة في تقويم إماراتي، فأحد جانبي 2022 خاطئ: السبت والأحد يجعلان الجمعة 31 ديسمبر 2021 يوم عمل، والجمعة والسبت يجعلان الجمعة 7 يناير 2022 يوم عطلة.
  • الأسماء تُرتَّب أبجديًا. فيأتي أبريل قبل يناير، والجمعة قبل الاثنين، والأشهر الهجرية بترتيب لا يستخدمه أحد، ما لم يُرتَّب كل اسم برقمه.

المواعيد المعلنة أم التقويم المحسوب؟

دوال التاريخ في Power BI (مثل YEAR وMONTH وDATE) تعمل بالتقويم الميلادي، ولا تعطي شهراً هجرياً ولا علامة لرمضان، لذلك يحمل جدول التقويم التواريخ الهجرية. والمصدر المعتاد هو تقويم أم القرى، التقويم المحسوب الرسمي في السعودية. لكن رمضان والعيدين تحددهما رؤية الهلال، وقد يختلف الإعلان عن الحساب بيوم واحد.

راجعنا كل إعلانات الإمارات من 2018 إلى 2026: 27 تاريخًا (أول أيام رمضان وعيد الفطر وعيد الأضحى في كل عام). 26 منها طابقت أم القرى، وواحد لم يطابقها: بدأ رمضان 2018 يوم الخميس 17 مايو، لا الأربعاء 16 مايو. كل تاريخ ومصدره موجود في ملف المصادر.

التواريخ من 2027 فصاعدًا لم تُعلن بعد. إنها تقديرات، وقد تنقل رؤية الهلال كلًا منها يومًا واحدًا، لذلك يميّزها التقويم.

ابنِ التقويم في دقيقة

افتح مولّد جدول التقويم بلغة DAX المجاني واضبط ثلاثة أمور:

  • التاريخ الهجري ورمضان والعيد: مفعّل.
  • مواعيد رمضان والعيد المعلنة (الإمارات): مفعّل. يبدأ رمضان وشوال وذو الحجة في المواعيد المعلنة، وتتبع بقية الأشهر تقويم أم القرى.
  • عطلة نهاية الأسبوع: دولتك. يعرف خيار كل دولة تاريخ تغيّر عطلتها.

انسخ كود DAX، ثم اختر في Power BI Desktop Modeling → New table والصقه. إلى جانب أعمدة السنة والربع والشهر والسنة المالية المعتادة، يضم الجدول هذه الأعمدة الخليجية:

  • Hijri Year وHijri Month Number وHijri Day وHijri Month Name وHijri Date: التاريخ الهجري لكل يوم.
  • Is Ramadan وRamadan Day (من 1 إلى 30) لمقارنة رمضان يومًا بيوم.
  • Is Eid al-Fitr (من 1 إلى 3 شوال) وIs Eid al-Adha (من 10 إلى 13 ذي الحجة).
  • Is Estimated Date: قيمته TRUE في أيام رمضان والعيد التي لم تُعلن بعد.
  • Is Weekend وIs Working Day: العطلة الصحيحة لكل تاريخ.
  • Is After UAE Weekend Change (للإمارات فقط): قيمته TRUE من 1 يناير 2022، لفصل اتجاهات أيام العمل عند التغيير.
  • Day Name (Arabic) وMonth Name (Arabic) وHijri Month Name (Arabic): الأسماء نفسها بالعربية، لصفحات التقارير العربية (خيار إضافة أعمدة الأسماء العربية).

عمود العطلة مجرد IF بسيط على التاريخ، فتستطيع قراءته وتعديله. وهذا عمود الإمارات:

Is Weekend =
IF (
    [Date] >= DATE ( 2022, 1, 1 ),
    WEEKDAY ( [Date], 1 ) IN { 7, 1 },        -- Saturday, Sunday
    IF (
        [Date] >= DATE ( 2006, 9, 1 ),
        WEEKDAY ( [Date], 1 ) IN { 6, 7 },    -- Friday, Saturday
        WEEKDAY ( [Date], 1 ) IN { 5, 6 }     -- Thursday, Friday
    )
)

رتّب الأسماء

حدد Month Name واختر Column tools → Sort by column → Month Number. وافعل الشيء نفسه مع Day Name بالعمود Day of Week، ومع Hijri Month Name بالعمود Hijri Month Number، ويأخذ كل عمود (Arabic) رقم العمود الإنجليزي نفسه. ثم علّم الجدول كجدول تواريخ على العمود Date واربطه بجدول الحقائق.

ثلاثة مقاييس تستخدمه

1. اليوم N من رمضان مقارنة بالعام الماضي. يُرجع مقياس Last Ramadan من دليل مبيعات رمضان كل يوم من رمضان المعروض سنة هجرية واحدة. ضع Ramadan Day على المحور فيقابل اليوم الخامس اليوم الخامس.

2. رمضان هذا العام مقارنة برمضان الماضي. في بطاقة مفلترة على سنة، يقارن vs Last Ramadan % أيام رمضان في تلك السنة بالأيام نفسها من رمضان الذي سبقه. وإذا جاء رمضان من 30 يومًا بعد رمضان من 29 يومًا، فلا مقابل لليوم الثلاثين ولا يضيف شيئًا إلى جانب العام الماضي.

3. فترة العيد. الأيام التي تسبق العيد كثيرًا ما تكون أهم من العيد نفسه. يجمع هذا المقياس الأيام السبعة قبل كل عيد فطر وأيامه الثلاثة، لكل عيد يقع أول أيامه ضمن التواريخ المعروضة:

Sales Eid al-Fitr Window =
VAR _DaysBefore = 7
VAR _EidDays = 3
VAR _Eids =
    SELECTCOLUMNS (
        FILTER ( 'Calendar', 'Calendar'[Hijri Month Number] = 10 && 'Calendar'[Hijri Day] = 1 ),
        "@Eid", 'Calendar'[Date]
    )
VAR _Window =
    FILTER (
        ALL ( 'Calendar'[Date] ),
        VAR _Day = 'Calendar'[Date]
        RETURN
            NOT ISEMPTY (
                FILTER ( _Eids, _Day >= [@Eid] - _DaysBefore && _Day <= [@Eid] + _EidDays - 1 )
            )
    )
RETURN
    IF (
        NOT ISEMPTY ( _Eids ),
        CALCULATE ( [Total Sales], REMOVEFILTERS ( 'Calendar' ), _Window )
    )

وقع عيد الفطر 2025 يوم الأحد 30 مارس، فتمتد فترته من 23 مارس إلى 1 أبريل وتُحسب لمارس: يُظهر المرئي حسب الشهر الفترة كاملة في مارس، ويظهر أبريل فارغًا. ويكتب منشئ مقاييس DAX هذا المقياس بأسماء جداولك وأعمدتك، ومعه المقياس نفسه لعيد الأضحى، وفترة العام الماضي، ونسبة التغيّر.

نختبر هذه المقاييس على نموذج مختلَق (متجران، ومبالغ من معادلة، بلا بيانات حقيقية). فحوصه الثلاثة والأربعون، ولكل منها الرقم المحسوب مسبقًا، موجودة على GitHub، فتستطيع تشغيلها في Power BI Desktop لديك.

ثلاثة أمور يجب الانتباه لها

  • عطلة شركتك. تتبع خيارات الدول العطلة الحكومية الرسمية. كثير من شركات القطاع الخاص لها عطلة أخرى، وحكومة الشارقة تعطل من الجمعة إلى الأحد منذ 2022. إن اختلفت عطلتك، فاختر العطلة الثابتة المطابقة لها.
  • حدّث بعد كل إعلان. عندما يُعلن رمضان 2027، أنشئ الجدول من جديد لتحل المواعيد المعلنة محل التقديرات.
  • رؤية الدول الأخرى. المواعيد المعلنة هي مواعيد الإمارات. الدولة التي تعتمد على رؤيتها الخاصة قد تبدأ بفارق يوم، فراجع الإعلان الرسمي في البلد الذي تُعدّ له التقرير.

من المتوقع أن يبدأ رمضان 1448 نحو 8 فبراير 2027. ابنِ التقويم الآن، وستكون أول مقارنة جاهزة من اليوم الأول.