2.2محرر الاستعلامات وSQL
الأساسي في 30 ثانية
- الاستعلام هو استجواب لقاعدة البيانات؛ ويوفر WinDev مقاربتين متكاملتين: محرر الاستعلامات المرئي (الذي يولّد SQL) وSQL المباشر للحالات المعقدة.
- لبنات SQL الأساسية: SELECT (ماذا)، FROM (من أين)، WHERE (التصفية)، ORDER BY (الفرز)، JOIN (دمج ملفات مرتبطة)، GROUP BY + الدوال التجميعية (SUM، COUNT، AVG، MIN/MAX).
- ممارستان جيدتان رئيسيتان: جعل الاستعلام معامليًا (قابلًا لإعادة الاستخدام)، والتصفية على مستوى القاعدة باستخدام WHERE بدلًا من جلب كل شيء ثم الفرز في WLangage.
حالة مصغّرة متسلسلة — ياسين يستجوب مبيعات تجارته
ياسين، مطوّر WinDev في شركة صغيرة لتجارة العتاد الكهربائي بوهران، عليه أن يعرض بجانب كل طلب اسم العميل لا رمزه وحده. يفتح محرر الاستعلامات المرئي، يختار ملفي Commande وClient، يحدد الحقول النافعة ويضع ربطًا (jointure) على كود العميل: فيولّد WinDev استعلام SQL دون خطر خطأ في الصياغة. وللوحة معلومات المدير، يضيف GROUP BY مع SUM للحصول على رقم الأعمال حسب العميل. ثم يدرك أن الاستعلام مكتوب بشكل ثابت على فترة: فيجعله معامليًا ({pDateDebut, pDateFin}) لإعادة استخدامه شهرًا بعد شهر، ويحرص على إبقاء التصفية على مستوى القاعدة (WHERE) بدلًا من جلب كل الصفوف وفرزها في WLangage.
حالة مستقلة لهذا القسم: تعود في الدرس والمخطط والسكربت وتحدي 48 ساعة للقسم 2.2.
1. طريقتان لكتابة استعلام
الاستعلام هو استجواب لقاعدة البيانات: «أعطني الطلبات التي تتجاوز 1000 € مع اسم العميل». ويوفر WinDev (1) محرر الاستعلامات: أداة مرئية نختار فيها الملفات، ونحدد الحقول، ونضع الشروط والفرز والتجميع — فيولّد WinDev ما يقابلها من SQL، وهو مثالي للبدء دون خطأ في الصياغة؛ (2) SQL المباشر (SELECT، FROM، WHERE، ORDER BY…)، للحالات المعقدة أو عندما تتحكم في اللغة. وبما أن HFSQL يدعم SQL، فإن المقاربتين تتعايشان.
2. لبنات SQL والربط (jointure)
المفاهيم الأساسية: SELECT (أي الحقول)، FROM (أي الملفات)، WHERE (تصفية الصفوف)، ORDER BY (الفرز). والربط (JOIN) يدمج عدة ملفات مرتبطة — ولا غنى عنه لعرض اسم العميل بجانب طلبه. وGROUP BY مع الدوال التجميعية (SUM، COUNT، AVG، MIN/MAX) ينتج الإحصائيات والمجاميع حسب الفئة.
3. إعادة الاستخدام والتصفية على مستوى القاعدة
الاستعلام قابل لإعادة الاستخدام في كل مكان: مصدرًا لحقل Table، أو مصدرًا لـطبعة، أو يُمسح في WLangage. وممارستان جيدتان: المعاملات (تصبح المدينة أو الفترة متغيرًا بدل أن تُكتب كتابةً ثابتة — استعلام واحد قابل لإعادة الاستخدام بدل عشرة)، والتصفية على مستوى القاعدة (ترك المحرك يصفّي بـ WHERE بدلًا من جلب كل شيء وفرزه في WLangage: أسرع بكثير إلى ما لا نهاية).
🔎 مثال ملموس — 🔎 مثال ملموس — الربط والمعاملات
عرض اسم العميل وحساب رقم الأعمال حسب العميل: يكتب ياسين ما يقابله من SQL.
SELECT C.NomClient, SUM(L.MontantLigne) AS ChiffreAffaires
FROM Client C
JOIN Commande CD ON CD.CodeClient = C.CodeClient
JOIN LigneCommande L ON L.NumCommande = CD.NumCommande
WHERE CD.DateCommande >= {pDateDebut} // parametre, pas en dur
GROUP BY C.NomClient
ORDER BY ChiffreAffaires DESC
Lecture : JOIN affiche le nom du client ; GROUP BY + SUM donnent le CA
Reflexe : filtrer C0TE BASE (WHERE) et parametrer la periode
القراءة: JOIN يدمج الملفات المرتبطة لعرض اسم العميل؛ وGROUP BY + SUM يجمعان رقم الأعمال حسب العميل.
الدرس: المعامل {pDateDebut} يجعل الاستعلام قابلًا لإعادة الاستخدام، وWHERE يترك المحرك يصفّي على مستوى القاعدة — أسرع بكثير.
مفردات القسم
- استعلام
- استجواب لقاعدة البيانات: تحديد البيانات وتصفيتها وفرزها وتجميعها؛ قابل لإعادة الاستخدام كمصدر جدول أو طبعة أو في WLangage.
مثال بسيط: يكتب ياسين استعلام «رقم الأعمال حسب العميل».
ما ليس كذلك: مجرد عرض لملف دون شرط ولا فرز.
رد فعل: استجواب البيانات → استعلام.
- محرر الاستعلامات
- أداة WinDev المرئية: نختار الملفات ونحدد الحقول ونضع الشروط والفرز والتجميع؛ ويولّد WinDev SQL.
مثال بسيط: يربط ياسين Client وCommande دون كتابة سطر SQL.
ما ليس كذلك: كتابة الاستعلام يدويًا بـ SQL مباشر.
رد فعل: الإنشاء المرئي دون خطأ في الصياغة → محرر الاستعلامات.
- WHERE (التصفية)
- الشرط الذي لا يُبقي إلا بعض الصفوف؛ ووُضع على مستوى القاعدة، يتيح للمحرك استخدام فهارسه وإرسال النافع فقط.
مثال بسيط: لا يعرض ياسين إلا طلبات الفترة المطلوبة.
ما ليس كذلك: تحميل كل شيء ثم التصفية في WLangage لاحقًا.
رد فعل: تقليص الحجم المُرسَل → التصفية على مستوى القاعدة بـ WHERE.
- الربط (JOIN)
- دمج عدة ملفات مرتبطة في الاستعلام نفسه — لا غنى عنه لعرض اسم العميل بجانب طلبه.
مثال بسيط: يربط ياسين Commande وClient على كود العميل.
ما ليس كذلك: عرض معرّف العميل وحده دون اسمه.
رد فعل: تقاطع معلومات عدة ملفات → ربط.
- GROUP BY + الدوال التجميعية
- التجميع لحساب إحصائيات: SUM (المجموع)، COUNT (العدد)، AVG (المتوسط)، MIN/MAX.
مثال بسيط: يجمع ياسين رقم الأعمال حسب العميل.
ما ليس كذلك: سرد كل طلب سطرًا سطرًا دون مجموع.
رد فعل: مجاميع حسب الفئة → GROUP BY مع دوال تجميعية.
في التطبيق — عمليًا — إنشاء استعلام واستغلاله
- أنشئ استعلامًا بالمحرر المرئي: اختر الملفات، وحدد الحقول النافعة، وأضف شروط التحديد والفرز، كما يفعل ياسين.
- أضف ربطًا إذا احتجت معلومات من عدة ملفات مرتبطة (عرض اسم العميل في سطر الطلب).
- للإحصائيات، استخدم GROUP BY مع الدوال التجميعية (SUM، COUNT، AVG) — مثلاً رقم الأعمال حسب العميل أو حسب التاجر.
- اجعل الاستعلام معامليًا (تصبح المدينة والفترة معاملات) لإعادة استخدامه، واترك التصفية تحدث على مستوى القاعدة (WHERE).
سكربت خطوة بخطوة — كتابة استعلام ياسين (5 دقائق)
1) افتح محرر الاستعلامات، وأضف ملفات Client وCommande وLigneCommande. 2) حدد NomClient وضع ربطًا على كود العميل. 3) أضف GROUP BY على NomClient مع SUM(MontantLigne) لرقم الأعمال. 4) صرّح بمعامل {pDateDebut} بدلًا من كتابة الفترة كتابةً ثابتة. 5) اترك التصفية على مستوى القاعدة (WHERE) واختبر النتيجة.
سيخدم هذا الاستعلام كمصدر لحقل Table (2.4) ولطبعة (2.3): اكتبه مرة واحدة وأعد استخدامه في كل مكان.
قالب للنسخ واللصق — استعلامي المعاملي
SELECT C.NomClient, SUM(L.MontantLigne) AS CA
FROM Client C JOIN Commande CD ON CD.CodeClient = C.CodeClient
JOIN LigneCommande L ON L.NumCommande = CD.NumCommande
WHERE CD.DateCommande >= {pDateDebut}
GROUP BY C.NomClient ORDER BY CA DESC
Regles : (1) requete parametree = reutilisable
(2) filtrage COTE BASE (WHERE) > tout ramener et trier en WLangage
تحديد بسيط
يسرد ياسين المنتجات التي يقل مخزونها عن الحد، بـ WHERE بسيط ودون ربط.
ربط العميل
يعرض ياسين اسم العميل بجانب كل طلب بربط Commande وClient.
إحصائيات حسب التاجر
يجمع ياسين بـ GROUP BY وSUM لرقم الأعمال حسب التاجر.
استعلام معاملي
يستبدل ياسين الفترة المكتوبة كتابةً ثابتة بـ {pDateDebut, pDateFin}: فيخدم الاستعلام كل شهر.
✓ ممارسات جيدة
- ابدأ بـالمحرر المرئي: فهو يولّد SQL دون خطأ في الصياغة.
- استخدم ربطًا لعرض المعلومات المرتبطة (اسم العميل).
- اجعله معامليًا وصفِّ على مستوى القاعدة (WHERE).
✗ أخطاء شائعة
- جلب كل شيء ثم الفرز في WLangage (إشباع الشبكة/الذاكرة).
- كتابة المعايير كتابةً ثابتة بدلًا من جعل الاستعلام معامليًا.
- نسيان الربط وعرض كود العميل وحده.
النقاط الأساسية
- مقاربتان متكاملتان: محرر الاستعلامات المرئي (يولّد SQL) وSQL المباشر.
- مفاهيم مفتاحية: SELECT، FROM، WHERE، ORDER BY، JOIN، GROUP BY + دوال تجميعية (SUM، COUNT، AVG، MIN/MAX).
- الاستعلام قابل لإعادة الاستخدام كمصدر جدول أو طبعة أو يُمسح في WLangage.
- ممارسات جيدة: استعلامات معاملية وتصفية على مستوى القاعدة (WHERE).
تحدي 48 ساعة — طبّقه غدًا
كما يفعل ياسين، أنشئ استعلامًا يربط ملفين مرتبطين (مثلاً الطلبات والعملاء) لعرض اسم العميل، ثم أضف GROUP BY مع SUM لمجموع حسب العميل. ثم حوّل الفترة إلى معامل {pDateDebut} واشرح في جملة واحدة لماذا التصفية على مستوى القاعدة أسرع من جلب كل شيء وفرزه في WLangage.
- أنشئ استعلامًا بالمحرر المرئي وأقرأ SQL المولَّد.
- أعرف كيف أستخدم ربطًا ودوالًا تجميعية (GROUP BY، SUM).
- أجعل استعلاماتي معاملية وأصفّي على مستوى القاعدة.
أسئلة شائعة
لماذا ينبغي التصفية على مستوى القاعدة بدلًا من جلب كل البيانات؟
لأن المحرك يستخدم فهارسه ولا يرسل إلا الصفوف النافعة، بينما جلب كل شيء يستهلك الشبكة والذاكرة ليتخلص في النهاية من معظم البيانات — وهو أكثر أخطاء الأداء شيوعًا. ضع الشروط في الاستعلام (WHERE)، ودع القاعدة تفرز (ORDER BY)، وفوّض الدوال التجميعية.
هل يكفي محرر الاستعلامات، أم يجب كتابة SQL مباشر؟
يكفي المحرر المرئي للغالبية العظمى من الاحتياجات (التحديد، المرشّحات، الفرز، الربط، التجميع) ويولّد SQL دون خطأ في الصياغة. أما SQL المباشر فيخدم الحالات المعقدة أو عندما تريد تحكمًا دقيقًا؛ والمقاربتان تتعايشان لأن HFSQL يدعم SQL.
لماذا ينبغي التصفية على مستوى القاعدة بدلًا من جلب كل البيانات؟