2.5التسلسلات الهرمية (Hierarchies) وجدول التواريخ (Date Table) (التقويم)
الأساسي في 30 ثانية
- التحليل الزمني يتطلب جدول تواريخ مخصصًا: سطر واحد لكل يوم، متواصل، مربوط بتاريخ الحقائق ومُعلَّم كجدول تواريخ.
- نولّده بلغة DAX: CALENDARAUTO() (يمسح تواريخ النموذج) أو CALENDAR(البداية؛ النهاية) (حدود صريحة).
- نرتّب الشهور بعمود رقمي (رقم_الشهر) ونبني التسلسل الهرمي السنة ← الربع ← الشهر ← اليوم لجعل كل مرئي قابلًا للاستكشاف.
حالة مصغّرة متسلسلة — زينب تبني تقويم نموذجها
تريد زينب، مراقبة التسيير في شركة صغيرة للصناعة الغذائية بالجزائر، تتبع التطور الشهري لرقم الأعمال، لكن شهورها تظهر في ترتيب فوضوي (أبريل قبل جانفي). فتطبق القسم: تنشئ جدول تواريخ مخصصًا التواريخ = CALENDARAUTO()، وتضيف السنة والشهر ورقم_الشهر والربع، وترتب الشهر حسب رقم_الشهر، وتربط التواريخ[التاريخ] بـ المبيعات[التاريخ] ثم تُعلِّم كجدول تواريخ. وأخيرًا تنشئ التسلسل الهرمي السنة ← الربع ← الشهر ← اليوم وتستخدمه في منحنى التطور: فتظهر أزرار الاستكشاف. وتدوّن المنعكس: تعطيل التسلسل الهرمي التلقائي لتواريخ Power BI.
حالة مستقلة لهذا القسم: تعود في الدرس والمخطط والنص البرمجي وتحدي 48 ساعة للقسم 2.5.
1. جدول التواريخ المخصص
يتطلب التحليل الزمني — التطور، والتراكمات، ومقارنة N-1 — أساسًا: جدول التواريخ المخصص. بُعد تقويمي بـ سطر واحد لكل يوم، متواصل على الفترة، وأعمدته السنة/الربع/الشهر/اليوم، مُعلَّم كـ«جدول تواريخ» ومربوط بالحقائق. وبدونه لا يعمل ذكاء الوقت بموثوقية؛ ومعه يصبح كل شيء بسيطًا. وتولّده زينب بلغة DAX: CALENDARAUTO() أو CALENDAR(البداية؛ النهاية).
2. ترتيب الشهور
فخ كلاسيكي: «أبريل» يُرتَّب قبل «جانفي» أبجديًا. ونعالج ذلك بترتيب عمود الشهر حسب عمود رقمي رقم_الشهر (أدوات العمود ← الترتيب حسب العمود). وتنشئ زينب دائمًا رقم_الشهر = MONTH(التواريخ[التاريخ]) بجانب تسمية شهرها.
3. التسلسل الهرمي وتقويم واحد
ثم نبني التسلسل الهرمي (Hierarchy) السنة ← الربع ← الشهر ← اليوم، الذي يجعل كل مرئي زمني قابلًا للاستكشاف (drill down). وجدول تواريخ واحد يخدم النموذج كله: فكل التحليلات الزمنية تتصل به. وتعطّل زينب التسلسل الهرمي التلقائي لتواريخ Power BI، الذي ينشئ جدولًا مخفيًا لكل عمود ويثقل الملف.
🔎 مثال ملموس — 🔎 مثال ملموس — التقويم بلغة DAX
تولّد زينب جدول تواريخها وتكمله:
التواريخ = CALENDARAUTO()
السنة = YEAR(التواريخ[التاريخ])
الشهر = FORMAT(التواريخ[التاريخ], "mmmm")
رقم_الشهر = MONTH(التواريخ[التاريخ]) // يُستخدم لترتيب الشهر
الربع = "ر" & QUARTER(التواريخ[التاريخ])
← اربط التواريخ[التاريخ] بـ المبيعات[التاريخ]، ثم علّم كجدول تواريخ (Mark as Date Table).
القراءة: «ر» & QUARTER(التواريخ[التاريخ]) يدمج «ر» ورقم الربع (ر1، ر2…).
الدرس: رقم_الشهر موجود فقط لترتيب الشهر ترتيبًا صحيحًا في المرئيات.
مفردات القسم
- جدول التواريخ (Date Table)
- بُعد تقويمي: سطر واحد لكل يوم، متواصل على الفترة، مربوط بتاريخ الحقائق — الأساس الزمني.
مثال بسيط: تنشئ زينب جدول التواريخ المربوط بـ المبيعات[التاريخ].
ما ليس كذلك: تواريخ مبعثرة في جدول الحقائق، دون تقويم.
رد فعل: تحليل زمني ← جدول تواريخ مخصص.
- CALENDARAUTO / CALENDAR
- دالتا DAX اللتان تولّدان التقويم: CALENDARAUTO() يمسح تواريخ النموذج؛ وCALENDAR(البداية؛ النهاية) يحددها.
مثال بسيط: تكتب زينب التواريخ = CALENDARAUTO() للبداية.
ما ليس كذلك: قائمة تواريخ مُدخَلة يدويًا.
رد فعل: نموذج نظيف ← CALENDARAUTO؛ حدود مضبوطة ← CALENDAR.
- التعليم كجدول تواريخ (Mark as Date Table)
- الإعداد الرسمي (أدوات الجدول) الذي يفعّل السلوك الصحيح لدوال ذكاء الوقت.
مثال بسيط: تُعلّم زينب التواريخ كجدول تواريخ بعد ربطه.
ما ليس كذلك: جدول تواريخ غير مُعلَّم، يتجاهله ذكاء الوقت.
رد فعل: جدول تواريخ مبني ← علّمه رسميًا.
- التسلسل الهرمي (Hierarchy)
- السنة ← الربع ← الشهر ← اليوم: الاستكشاف بمستويات في المرئيات (أزرار drill).
مثال بسيط: تستكشف زينب منحناها من السنة إلى الشهر عبر drill down.
ما ليس كذلك: مستوى واحد مسطّح، غير قابل للاستكشاف.
رد فعل: جعل المرئيات الزمنية قابلة للاستكشاف ← تسلسل هرمي.
- الترتيب حسب العمود (Sort by Column)
- نرتّب عمود الشهر (تسمية) حسب عمود رقم_الشهر (أدوات العمود ← الترتيب حسب العمود).
مثال بسيط: تحصل زينب على جانفي، وفيفري… لا أبريل، جانفي.
ما ليس كذلك: ترتيب أبجدي للشهور، خاطئ.
رد فعل: شهر معروض ← رتّبه حسب رقمه.
في التطبيق — تطبيق عملي — بناء تقويم النموذج
- جدول جديد (عرض الجدول ← جدول جديد): التواريخ = CALENDARAUTO()، مثل زينب.
- أضف الأعمدة: السنة = YEAR(التواريخ[التاريخ])؛ والشهر = FORMAT(التواريخ[التاريخ]؛ "mmmm")؛ ورقم_الشهر = MONTH(التواريخ[التاريخ])؛ والربع = "ر" & QUARTER(التواريخ[التاريخ]).
- رتّب الشهر حسب رقم_الشهر (أدوات العمود ← الترتيب حسب العمود)، واربط التواريخ[التاريخ] بـ المبيعات[التاريخ]، ثم علّم كجدول تواريخ (Mark as Date Table).
- أنشئ التسلسل الهرمي (نقرة يمنى على السنة ← تسلسل هرمي جديد، أضف الربع، والشهر) واستخدمه في منحنى تطورك: فتظهر أزرار الاستكشاف.
نص برمجي خطوة بخطوة — بناء التقويم مثل زينب (10 دقائق)
1) جدول جديد: التواريخ = CALENDARAUTO(). 2) أضف السنة = YEAR(التواريخ[التاريخ])، والشهر = FORMAT(التواريخ[التاريخ], "mmmm")، ورقم_الشهر = MONTH(التواريخ[التاريخ])، والربع = "ر" & QUARTER(التواريخ[التاريخ]). 3) رتّب الشهر حسب رقم_الشهر (أدوات العمود ← الترتيب حسب العمود). 4) اربط التواريخ[التاريخ] بـ المبيعات[التاريخ]، ثم علّم كجدول تواريخ (Mark as Date Table). 5) أنشئ التسلسل الهرمي السنة ← الربع ← الشهر واختبر drill down في منحنى. 6) عطّل التسلسل الهرمي التلقائي للتواريخ في الخيارات (Options).
إذا كانت تواريخ دخيلة (1900، تواريخ ميلاد) عالقة في النموذج، ففضّل CALENDAR(البداية؛ النهاية) على CALENDARAUTO().
نموذج للنسخ واللصق — تقويمي بلغة DAX
التواريخ = CALENDARAUTO()
السنة = YEAR(التواريخ[التاريخ])
الشهر = FORMAT(التواريخ[التاريخ], "mmmm")
رقم_الشهر = MONTH(التواريخ[التاريخ])
الربع = "ر" & QUARTER(التواريخ[التاريخ])
[ ] ترتيب الشهر حسب رقم_الشهر [ ] ربط التواريخ[التاريخ] ← المبيعات[التاريخ]
[ ] التعليم كجدول تواريخ (Mark as Date Table) [ ] التسلسل الهرمي السنة ← الربع ← الشهر ← اليوم
توليد التقويم
تكتب زينب التواريخ = CALENDARAUTO(): سطر واحد لكل يوم يغطي تواريخ النموذج.
ترتيب الشهور
ترتب زينب الشهر حسب رقم_الشهر: جانفي، فيفري، مارس… لا أبريل، جانفي.
تعليم الجدول
تربط زينب التواريخ بالمبيعات ثم تُعلِّمه كجدول تواريخ: فيتفعّل ذكاء الوقت.
الاستكشاف بالتسلسل الهرمي
تسحب زينب التسلسل الهرمي السنة ← الشهر إلى منحنى: فيكشف drill down كل مستوى.
✓ ممارسات جيدة
- إنشاء جدول تواريخ واحد، متواصل ومُعلَّم رسميًا.
- ترتيب الشهور بعمود رقمي («الترتيب حسب العمود»).
- بناء التسلسل الهرمي السنة ← الشهر لجعل المرئيات قابلة للاستكشاف.
✗ أخطاء شائعة
- الاكتفاء بـالتسلسل الهرمي التلقائي للتواريخ (جدول مخفي لكل عمود).
- نسيان ترتيب الشهر حسب رقم_الشهر (ترتيب أبجدي خاطئ).
- استخدام CALENDARAUTO مع تواريخ دخيلة (1900، ميلاد).
النقاط الأساسية
- جدول تواريخ مخصص، متواصل، مُعلَّم رسميًا: غير قابل للتفاوض للتحليل الزمني.
- مرّ ترتيب الشهور بعمود رقمي: «الترتيب حسب العمود» هو المنعكس.
- التسلسل الهرمي السنة ← الشهر يجعل كل مرئي زمني قابلًا للاستكشاف (drill down).
- جدول تواريخ واحد لكل النموذج: كل التحليلات الزمنية تتصل به.
تحدي 48 ساعة — طبّقه غدًا
ابنِ تقويم زينب: أنشئ التواريخ = CALENDARAUTO()، وأضف السنة/الشهر/رقم_الشهر/الربع، ورتّب الشهر حسب رقم_الشهر، واربط التواريخ[التاريخ] بـ المبيعات[التاريخ] وعلّم الجدول كجدول تواريخ. واختم بتسلسل هرمي السنة ← الشهر مختبر في منحنى.
- أولّد جدول تواريخ (CALENDARAUTO أو CALENDAR).
- أرتّب الشهور حسب رقم_الشهر وأعلّم الجدول كجدول تواريخ.
- أبني تسلسلًا هرميًا السنة ← الشهر وأستكشف بـ drill down.
أسئلة شائعة
ألا يكفي التسلسل الهرمي التلقائي لتواريخ Power BI؟
يُسعف في ملف صغير، لكنه ينشئ جدول تواريخ مخفيًا لكل عمود تاريخ (ما يثقل الملف)، ولا يسمح بترتيب مخصص للشهور ولا بتحليل زمني نظيف. ويعطّله المحترفون (الخيارات ← تحميل البيانات ← التاريخ/الوقت التلقائي) لصالح جدول تواريخ مخصص، فريد، يتحكمون فيه بالكامل.
CALENDARAUTO أم CALENDAR: أيهما نختار؟
CALENDARAUTO() يمسح كل التواريخ الموجودة في النموذج ويولّد تقويمًا يغطيها: عملي وبلا إعداد. وCALENDAR(DATE(2024؛1؛1)؛ DATE(2026؛12؛31)) يحدد حدودًا صريحة. ونفضّل CALENDAR عندما تكون هناك تواريخ دخيلة (تاريخ ميلاد، قيمة 1900) عالقة في النموذج: فحينها يولّد CALENDARAUTO تقويمًا هائلًا ويثقل الملف.
ماذا يتطلب ذكاء الوقت (التطور، التراكمات، N-1)؟