4.1التقارير الفرعية (مرتبطة وغير مرتبطة)
الأساسي في 30 ثانية
- التقرير الفرعي = تقرير كامل داخل التقرير الرئيسي : مصدره الخاص وحقوله وتنسيقه — الحل عندما لا تكفي وصلة (Jointure) بسيطة (مصادر مختلفة، علاقات واحد-إلى-متعدد).
- مرتبط أو غير مرتبط، كل شيء يتغير : غير المرتبط = البيانات نفسها تُعرض مرة واحدة (ملخص عام) ؛ المرتبط = البيانات الموافقة حسب حقل الربط، يُنفَّذ من جديد لكل قيمة في الرئيسي.
- منعكس فارس : التقرير الفرعي المرتبط يوضع على مستوى مجموعة (تنفيذ واحد لكل مجموعة)، وليس أبدا في التفاصيل لتقرير ضخم — وتُفضَّل الوصلة عندما تكون الجداول في القاعدة نفسها.
mini-cas filé — فارس وكشف حساب العميل مع الفواتير
فارس، مراقب تسيير في الجزائر، عليه إعداد الكشف الشهري للعملاء : التقرير الرئيسي يسرد العملاء من قاعدة التسيير، لكن الفواتير المفصلة تأتي من استخراج آخر قد تُضخّمه الوصلة بتكرارات (علاقتا واحد-إلى-متعدد : الطلبات والمدفوعات). يُدرج تقريرا فرعيا مرتبطا على معرف العميل، موضوعا في رأس مجموعة العميل : لكل عميل، يعرض التقرير الفرعي فواتير هذا العميل، بتنفيذ واحد لكل عميل. أول محطة في الخيط الأحمر : فارس يجمع بين مصدرين دون تكرار ودون قتل الأداء.
الحالة نفسها تعود في الدرس، والرسم، والنص الجاهز وتحدّي 48 ساعة — وتستمر في 4.2 و4.3 و4.4 و4.5.
1. تقرير داخل تقرير : متى يفرض التقرير الفرعي نفسه
يفتتح المستوى 4 الوظائف الخبيرة. أولها : التقارير الفرعية (Subreports) — تقرير كامل (مصدره الخاص وحقوله وتنسيقه) مُدرج في مقطع من التقرير «الرئيسي». كما في كشف فارس، تكمن قوته في الجمع بين بيانات لا تصلح لوصل بسيط : مصادر مختلفة (قاعدتان، قاعدة + ملف)، علاقات معقدة أو واحد-إلى-متعدد قد تُحدث تكرارات، ومعلومات مرتبطة تُعرض على حدة (لكل عميل، فواتيره الأخيرة).
قاعدة القرار : عندما تكون الجداول في القاعدة نفسها وترتبط بشكل سليم بمفتاح، تبقى الوصلة أبسط وأعلى أداء — وهي الخيار الافتراضي. التقرير الفرعي هو أداة الحالات التي لا تناسبها الوصلة : مصادر غير قابلة للربط، وتكرارات الوصلة، ومنطق أو تجميع مستقل. يُدرَج عبر «إدراج → Sous-rapport» (تقرير جديد أو استيراد موجود)، ثم تُضبط الروابط.
2. مرتبط مقابل غير مرتبط : حقل الربط يصنع كل شيء
تمييز أساسي. التقرير الفرعي غير المرتبط (unlinked) مستقل : يعرض البيانات نفسها أيا كان موضعه — مثلا ملخص عام يُعرض مرة واحدة في تذييل تقرير. أما التقرير الفرعي المرتبط (linked) فمتصل بالرئيسي عبر حقل ربط : لكل سجل أو مجموعة في الرئيسي، يعرض البيانات الموافقة — طلبات هذا العميل، مثل فواتير كل عميل عند فارس.
الآلية : في خطوة «الروابط» (Subreport Links)، نختار حقل الرئيسي (مثلا Client.ID) ؛ فينشئ Crystal Reports معاملا في التقرير الفرعي ويربطه بالحقل الموافق (مثلا Factures.ClientID) — فيُطبَّق الترشيح تلقائيا، والأفضل جهة الخادم. يجب أن يوجد حقل الربط في الطرفين. الفخ الكلاسيكي : نسيان الربط — فيعرض التقرير الفرعي كل بياناته، كغير المرتبط.
3. الأداء : الموضع يقرر الكلفة
التقرير الفرعي المرتبط يُنفَّذ من جديد لكل قيمة ربط في الرئيسي. موضوعا في مقطع التفاصيل، يُنفَّذ مرة لكل سطر — كارثي على الأحجام الكبيرة. وموضوعا في رأس مجموعة أو تذييلها، لا يُنفَّذ إلا مرة واحدة لكل مجموعة — وهذه إيماءة فارس : تنفيذ واحد لكل عميل بدلا من واحد لكل فاتورة.
تكملة احترازية : حصر بيانات التقرير الفرعي (ترشيح جهة الخادم، والحقول المفيدة فقط)، وتجنّب التقارير الفرعية المتداخلة (كلفة مضاعفة)، والنظر في بديل (وصلة، أو أمر SQL في 4.4، أو عرضة موحدة) والاختبار على حجم حقيقي. تتشارك التقارير الفرعية البيانات مع الرئيسي بصعوبة (المتغيرات المشتركة = متقدم).
🔎 مثال ملموس — 🔎 مثال ملموس — فواتير كل عميل
كشف فارس : رئيسي للعملاء، وتقرير فرعي للفواتير مرتبط وموضوع جيدا.
الرئيسي : قائمة العملاء (مجمّعة حسب العميل).
تقرير فرعي مرتبط على معرف العميل ← فواتير هذا العميل.
موضوع في رأس المجموعة (تنفيذ واحد لكل عميل، لا لكل سطر).
القراءة : الربط بالمفتاح المشترك، والترشيح جهة الخادم، والوضع على مستوى المجموعة.
الدرس : بيانات مرتبطة في سياقها، دون تكرار ودون انهيار الأداء.
مفردات القسم
- التقرير الفرعي (Subreport)
- تقرير كامل مُدرج داخل آخر (الرئيسي) : مصدره الخاص وحقوله وتنسيقه، يُعرض في مقطع من الرئيسي.
مثال بسيط: يعرض فارس الفواتير (استخراج آخر) في كشف العملاء دون ربطها.
ما ليس كذلك: مجرد مقطع إضافي بسيط من التقرير نفسه.
رد فعل: مصادر غير قابلة للربط أو تكرارات الوصلة : فكّر في التقرير الفرعي.
- التقرير الفرعي المرتبط (linked)
- متصل بالرئيسي عبر حقل ربط : يعرض البيانات الموافقة لكل سجل أو مجموعة، ويُعاد تنفيذه لكل قيمة ربط.
مثال بسيط: لكل عميل عند فارس، يعرض التقرير الفرعي فواتير هذا العميل.
ما ليس كذلك: ملخص عام متماثل في كل مكان.
رد فعل: بيانات موافقة لكل سجل : اضبط الربط في الطرفين.
- التقرير الفرعي غير المرتبط (unlinked)
- مستقل : يعرض البيانات نفسها أيا كان موضعه في الرئيسي.
مثال بسيط: يعرض فارس ملخصا عاما للديون غير المسددة مرة واحدة في تذييل التقرير.
ما ليس كذلك: تفصيل يتبع كل سجل.
رد فعل: ملخص عام يُعرض مرة واحدة : غير مرتبط في تذييل التقرير.
- الكلفة لكل تنفيذ
- التقرير المرتبط يُنفَّذ مرة لكل قيمة ربط : التفاصيل = مرة لكل سطر (مكلف)، والمجموعة = مرة لكل مجموعة.
مثال بسيط: انتقل فارس من مئات التنفيذات (التفاصيل) إلى واحد لكل عميل (المجموعة).
ما ليس كذلك: كلفة ثابتة لا تتأثر بالموضع.
رد فعل: مرتبط + حجم كبير : ارفع دائما إلى مستوى المجموعة.
في التطبيق — عمليا — إدراج تقرير فرعي
- أدرج تقريرا فرعيا («إدراج → Sous-rapport») : أنشئ تقريرا جديدا أو استورد موجودا، بمصدره الخاص وحقوله.
- قرر : مرتبط أو غير مرتبط : غير المرتبط لملخص عام (البيانات نفسها) ؛ والمرتبط لبيانات موافقة لكل سجل أو مجموعة.
- للتقرير المرتبط، اضبط حقل الربط (مثلا معرف العميل) : سيعرض البيانات الموافقة لكل قيمة في الرئيسي.
- للأداء، ضع التقرير المرتبط في رأس مجموعة أو تذييلها (مرة لكل مجموعة) بدلا من التفاصيل (مرة لكل سطر).
نص جاهز للقول — تبرير التقرير الفرعي أمام المسؤول (30 ثانية)
«معك فارس : لكشف العملاء، لا يمكنني ربط الفواتير دون إحداث تكرارات — لذلك وضعت تقريرا فرعيا مرتبطا بمعرف العميل، على مستوى المجموعة. تنفيذ واحد لكل عميل بدلا من واحد لكل سطر : فيبقى الكشف صحيحا ويُفتح في ثوانٍ.»
يُقال عندما يُسأل لماذا لا «نربط ببساطة» : أظهر المجموع المتضخم بالتكرارات.
نموذج جاهز للنسخ — بطاقة تأطير تقرير فرعي
الحاجة : [كشف العملاء + فواتير من استخراج آخر]
الاختيار : [الوصلة مستحيلة ← تقرير فرعي]
النوع : [مرتبط على معرف العميل | غير مرتبط — ملخص عام]
الربط : الرئيسي [Client.ID] ← الفرعي [Factures.ClientID]، ترشيح جهة الخادم [نعم]
الموضع : [رأس مجموعة العميل — تنفيذ واحد لكل عميل]
المحتوى : [الحقول المفيدة فقط : رقم الفاتورة، التاريخ، المبلغ]
كشف عميل متعدد المصادر
مثل فارس : رئيسي على قاعدة التسيير، وتقرير فرعي مرتبط على الاستخراج الآخر — تنفيذ واحد لكل عميل.
علاقة واحد-إلى-متعدد مزدوجة
طلبات العميل ومدفوعاته : تقرير فرعي لكل علاقة لتجنّب تضاعف الأسطر.
ملخص عام
مجموع الديون غير المسددة يُعرض مرة واحدة في تذييل التقرير : تقرير فرعي غير مرتبط، دون حقل ربط.
حجم كبير يتعثر
ارفع التقرير الفرعي إلى المجموعة، ورشّح جهة الخادم، وانظر في أمر SQL أو عرضة (انظر 4.4).
✓ ممارسات جيدة
- ضع التقرير الفرعي المرتبط على مستوى مجموعة، لا في التفاصيل.
- رشّح التقرير الفرعي جهة الخادم ولا تضع فيه إلا الحقول المفيدة.
- فضّل الوصلة عندما تكون الجداول في القاعدة نفسها.
✗ أخطاء شائعة
- تقرير فرعي مرتبط في تفاصيل تقرير ضخم (أداء كارثي).
- نسيان الربط (فيعرض التقرير الفرعي كل بياناته).
- تسلسل تقارير فرعية متداخلة (كلفة مضاعفة).
النقاط الأساسية
- التقرير الفرعي تقرير كامل مُدرج داخل آخر. قوته : الجمع بين بيانات يصعب ربطها — مصادر مختلفة، وعلاقات معقدة، ومعلومات مرتبطة.
- تمييز أساسي : مرتبط (حقل ربط — بيانات موافقة لكل سجل/مجموعة) مقابل غير مرتبط (مستقل، البيانات نفسها).
- الأداء : المرتبط يُنفَّذ مرة لكل قيمة ربط. التفاصيل = مكلف جدا ؛ ورأس/تذييل المجموعة = تنفيذات أقل بكثير.
- الإدراج عبر «إدراج → Sous-rapport» ثم ضبط الروابط. واختبر على حجم حقيقي.
تحدّي 48 ساعة — طبّق غدا
على كشف حقيقي : أدرج تقريرا فرعيا مرتبطا (مفتاح مشترك في الطرفين)، وضعه على مستوى المجموعة، واحصر حقوله وقارن زمن الفتح مع الوضع في التفاصيل.
- أستطيع إدراج تقرير فرعي واختيار المرتبط أو غير المرتبط حسب الحاجة.
- أستطيع ضبط حقل ربط موجود في الطرفين، مُرشَّح جهة الخادم.
- أضع التقرير المرتبط على مستوى المجموعة وأختبر على حجم حقيقي.
أسئلة شائعة
متى أستخدم تقريرا فرعيا بدلا من الوصلة، وكيف أتجنب مشاكل الأداء؟
عندما تكون الجداول في القاعدة نفسها وترتبط بمفتاح، فالوصلة أبسط وأعلى أداء — وهي الخيار الافتراضي. واحتفظ بالتقرير الفرعي للحالات التي لا تناسبها الوصلة : مصادر مختلفة غير قابلة للربط، وعلاقات واحد-إلى-متعدد قد تُحدث تكرارات، وبيانات مرتبطة تُعرض على حدة. الأداء : التقرير المرتبط يُعاد تنفيذه لكل قيمة ربط — فلا تضعه أبدا في تفاصيل تقرير ضخم : ضعه في رأس مجموعة أو تذييلها، واحصر بياناته (ترشيح جهة الخادم، والحقول المفيدة)، وتجنّب المتداخلة، وانظر في أمر SQL أو عرضة (انظر 4.4)، واختبر على حجم حقيقي.
كيف أطابق بيانات التقرير الفرعي مع كل سجل في التقرير الرئيسي؟
بربط التقرير الفرعي بالرئيسي عبر حقل مشترك (مثلا معرف العميل). لكل سجل أو مجموعة، يمرر الرئيسي قيمة ربط فيرشّح التقرير الفرعي بياناته عليها. عمليا : أدرج التقرير الفرعي، ثم في خطوة «الروابط» اختر حقل الرئيسي (Client.ID) واربطه بالحقل الموافق في التقرير الفرعي (Factures.ClientID) — فينشئ Crystal Reports المعامل ويطبق الترشيح تلقائيا. النقاط الأساسية : مفتاح موجود في الطرفين، وترشيح جهة الخادم، وموضع (التفاصيل أو المجموعة) يضبط تواتر التنفيذ. ودون ربط، يعرض التقرير الفرعي كل بياناته.
أين نضع تقريرا فرعيا مرتبطا للحفاظ على الأداء؟