2.4مسح السجلات وجداول الملفات
الأساسي في 30 ثانية
- يمرّ المسح على السجلات في ملف أو استعلام؛ مقاربتان: حلقة POUR TOUT (حديثة، موصى بها) والمسح اليدوي (HLitPremier / HLitSuivant مع اختبار HEnDehors).
- حقل Table يعرض عدة سجلات؛ وجدول الملف مرتبط بملف أو استعلام ويُملأ تلقائيًا، فلا يحمّل سوى الصفوف المعروضة.
- جدول الذاكرة يُملأ بالكود (TableAjouteLigne): حرية تامة لكن التحميل مسؤوليتك — يُخصَّص للبيانات المُنشأة أو ذات الحجم المتحكَّم فيه.
حالة مصغّرة متسلسلة — ياسين يعرض كتالوج المنتجات ويمسحه
ياسين، مطوّر WinDev في شركة صغيرة لتجارة العتاد الكهربائي بوهران، عليه عرض كتالوج المنتجات وتحديد ما يحتاج إلى إعادة تزويد. وللقائمة المعروضة على الشاشة، يختار جدول ملف مرتبطًا بـاستعلام مصفّى: فيُملأ تلقائيًا ولا يحمّل إلا الصفوف المرئية، حتى مع آلاف المراجع. ولحساب تنبيهات المخزون، يكتب مسحًا بحلقة POUR TOUT Produit، الموجزة والموصى بها، ثم يضيف الصفوف المعنية إلى جدول ثانٍ. ويحرص على كتابة المسح اليدوي أيضًا (HLitPremier / HLitSuivant + اختبار HEnDehors) لفهم الآلية الكامنة. وأخيرًا، يمنع نفسه من ملء جدول ذاكرة بمسح ملف كبير كامل: ففي الأحجام الكبيرة، يفضّل جدول الملف مع مرشّح واستعلامات بدلًا من حلقة تعالج كل سجل على حدة.
حالة مستقلة لهذا القسم: تعود في الدرس والمخطط والسكربت وتحدي 48 ساعة للقسم 2.4.
1. شكلان للمسح
بعد التعامل مع سجل واحد، نعالج مجموعات. يمرّ المسح على سجلات ملف أو استعلام. (1) حلقة POUR TOUT: شكل حديث وموصى به، موجز وواضح — تمرّ تلقائيًا على كل السجلات وتدير نهاية المسح. (2) الحلقة اليدوية مع HLitPremier ثم HLitSuivant، مع اختبار HEnDehors لمعرفة متى نتوقف: أكثر إسهابًا لكن فهمها ضروري. وفي الحالتين، يمكن المسح حسب ترتيب (مفتاح/فهرس) ومع مرشّح.
2. جدول ملف أم جدول ذاكرة
حقل Table هو الرفيق الطبيعي للمسح: يعرض عدة سجلات في صفوف وأعمدة. (1) جدول الملف (الملقّب «على الملف/الاستعلام») مرتبط بمصدر بيانات ويُملأ تلقائيًا؛ ولا يحمّل WinDev سوى الصفوف اللازمة للعرض، مما يجعله فعّالًا حتى مع الأحجام الضخمة — وهو الوضع المفضّل في الإدارة. (2) جدول الذاكرة يُملأ بالكود (TableAjouteLigne): حرية تامة لكن التحميل مسؤوليتك — يُخصَّص للبيانات المُنشأة أو ذات الحجم المتحكَّم فيه.
3. الحذر من ناحية الأداء
في الأحجام الكبيرة، لا تحمّل كل شيء في الذاكرة: فضّل جدول الملف مع مرشّح. وللمعالجات الضخمة، آثر الاستعلامات أو الدوال المجموعية بدلًا من حلقة تعالج مليون سجل واحدًا واحدًا. والمزلق الكلاسيكي — ملء جدول ذاكرة بمسح ملف كبير كامل — لا يظهر بوضوح إلا في الإنتاج، حين تصل البيانات الحقيقية.
🔎 مثال ملموس — 🔎 مثال ملموس — POUR TOUT مقابل المسح اليدوي
كتابتان للمسح نفسه: يحدد ياسين المنتجات التي تحتاج إلى إعادة تزويد.
// Forme recommandee : POUR TOUT
POUR TOUT Produit
SI Produit.Stock < 5 ALORS
TableAjouteLigne(TABLE_Alerte, Produit.CodeProduit, Produit.Stock)
FIN
FIN
// Forme manuelle (comprendre le mecanisme)
HLitPremier(Produit, hOrdreCroissant, "CodeProduit")
TANTQUE HEnDehors(Produit) = Faux
// ... traiter Produit ...
HLitSuivant(Produit)
FIN
Lecture : POUR TOUT gere la progression et la fin ; le manuel montre le mecanisme
Reflexe : table FICHIER pour afficher, pas de tout charger en memoire
القراءة: POUR TOUT يمرّ على كل السجلات ويتوقف وحده؛ والمسح اليدوي يوضّح HLitPremier / HLitSuivant واختبار HEnDehors.
الدرس: للعرض، فضّل جدول ملف مرتبطًا باستعلام بدلًا من تحميل كل شيء في الذاكرة.
مفردات القسم
- مسح
- المرور على سجلات ملف أو استعلام، وربما حسب ترتيب (مفتاح) ومع مرشّح.
مثال بسيط: يمسح ياسين ملف Produit لتحديد المخزونات الضعيفة.
ما ليس كذلك: قراءة سجل واحد محدّد بمفتاحه.
رد فعل: معالجة مجموعة سجلات → مسح.
- POUR TOUT
- الشكل الحديث والموصى به للمسح: موجز وواضح، يدير التقدم ونهاية المسح تلقائيًا.
مثال بسيط: يكتب ياسين POUR TOUT Produit لحساب التنبيهات.
ما ليس كذلك: حلقة يدوية بـ HLitPremier / HLitSuivant.
رد فعل: مسح بسيط وواضح → POUR TOUT.
- المسح اليدوي
- الشكل الكلاسيكي: HLitPremier ثم HLitSuivant، مع اختبار HEnDehors لاكتشاف النهاية.
مثال بسيط: يكتب ياسين النسخة اليدوية لفهم الآلية.
ما ليس كذلك: حلقة POUR TOUT التي تُخفي هذه الخطوات.
رد فعل: رؤية ما يحدث فعلًا → المسح اليدوي.
- جدول ملف
- حقل جدول مرتبط مباشرةً بملف أو استعلام: تعبئة تلقائية، ولا يحمّل WinDev إلا الصفوف المعروضة.
مثال بسيط: يعرض ياسين كتالوجه في جدول ملف مبني على استعلام.
ما ليس كذلك: جدول يُملأ سطرًا سطرًا بالكود.
رد فعل: عرض أحجام كبيرة → جدول ملف.
- جدول ذاكرة
- حقل جدول يُملأ بالكود (TableAjouteLigne): حرية تامة لكن التحميل تديره بنفسك.
مثال بسيط: يملأ ياسين جدول ذاكرة بالمنتجات في حالة التنبيه وحدها.
ما ليس كذلك: جدول مرتبط باستعلام من القاعدة.
رد فعل: بيانات مُنشأة بالكود → جدول ذاكرة.
في التطبيق — عمليًا — مسح السجلات وعرضها
- اكتب مسحًا بـ POUR TOUT (الشكل الموصى به) لمعالجة كل سجلات ملف أو استعلام، كما يفعل ياسين.
- اكتب المسح نفسه بنسخة يدوية (HLitPremier / HLitSuivant + اختبار HEnDehors) لفهم الآلية الكامنة جيدًا.
- للعرض، استخدم بالأحرى جدول ملف مرتبطًا بملف أو استعلام: يُملأ تلقائيًا ويبقى فعّالًا في الأحجام الكبيرة.
- خصّص جدول الذاكرة (TableAjouteLigne) للبيانات المُنشأة بالكود، وفي الأحجام الكبيرة صفِّ بدلًا من تحميل كل شيء.
سكربت خطوة بخطوة — مسح الكتالوج كما يفعل ياسين (5 دقائق)
1) أنشئ جدول ملف مرتبطًا باستعلام Produit مصفّى (stock < حد). 2) اكتب مسحًا POUR TOUT Produit يختبر Produit.Stock. 3) أضف المنتجات في حالة التنبيه إلى جدول ذاكرة عبر TableAjouteLigne. 4) أعد كتابة المسح بنسخة يدوية (HLitPremier / HLitSuivant + HEnDehors) لتحليلها. 5) على حجم كبير، تحقق من أنك لا تحمّل كل شيء في الذاكرة.
العادة الافتراضية في الإدارة: بمجرد أن تأتي البيانات من القاعدة، استخدم جدول ملف مبنيًا على استعلام.
قالب للنسخ واللصق — مسحي وجدولي
Parcours POUR TOUT : POUR TOUT Produit ... FIN (recommande)
Parcours manuel : HLitPremier(...) ; TANTQUE HEnDehors(...) = Faux ... HLitSuivant(...) ; FIN
Table FICHIER : liee a un fichier/requete, remplissage AUTO, lignes affichees
Table MEMOIRE : remplie par CODE (TableAjouteLigne)
Regles : (1) affichage sur base -> table FICHIER
(2) gros traitements de masse -> REQUETES, pas une boucle ligne a ligne
مسح POUR TOUT
يمسح ياسين ملف Produit كله لإعادة حساب تنبيهات المخزون.
مسح يدوي
يكتب ياسين نسخة HLitPremier / HLitSuivant لفهم سير العمل.
جدول ملف
يعرض ياسين الكتالوج عبر جدول مرتبط باستعلام، محمَّل عند الطلب.
جدول ذاكرة
يملأ ياسين بالكود جدولًا صغيرًا بالمنتجات المنقطعة وحدها.
✓ ممارسات جيدة
- استخدم POUR TOUT افتراضيًا، واعرف المسح اليدوي.
- اعرض بيانات القاعدة بـجدول ملف مرتبط باستعلام.
- لا تحمّل كل شيء في الذاكرة في الأحجام الكبيرة.
✗ أخطاء شائعة
- ملء جدول ذاكرة بمسح ملف كبير.
- الاعتقاد أن جدول ملف غير قابل للفرز.
- معالجة مليون سجل واحدًا واحدًا بدلًا من استعلام.
النقاط الأساسية
- شكلان للمسح: POUR TOUT (موصى به) والمسح اليدوي (HLitPremier / HLitSuivant + HEnDehors).
- حقل Table يعرض السجلات؛ وجدول الملف مرتبط بملف/استعلام ولا يحمّل إلا الصفوف المعروضة.
- جدول الذاكرة يُملأ بالكود (TableAjouteLigne) — يُخصَّص للبيانات المُنشأة.
- في الأحجام الكبيرة: جدول ملف + مرشّح؛ والمعالجات الضخمة عبر الاستعلامات.
تحدي 48 ساعة — طبّقه غدًا
كما يفعل ياسين، اكتب مسحًا بـ POUR TOUT على ملف من تطبيقك، ثم أعد كتابته بنسخة يدوية (HLitPremier / HLitSuivant + اختبار HEnDehors). اعرض بعد ذلك هذه البيانات في جدول ملف مرتبط باستعلام وتحقق من أنه لا يحمّل إلا الصفوف المرئية. اشرح في جملة واحدة لماذا لا ينبغي ملء جدول ذاكرة بمسح ملف كبير كامل.
- أعرف كيف أكتب مسحًا بـ POUR TOUT وبنسخة يدوية.
- أختار بين جدول الملف وجدول الذاكرة حسب مصدر البيانات وحجمها.
- أعرف كيف لا أحمّل كل شيء في الذاكرة في الأحجام الكبيرة.
أسئلة شائعة
ما الفرق بين جدول الملف وجدول الذاكرة؟
جدول الملف مرتبط بملف أو استعلام ولا يحمّل إلا الصفوف المعروضة: فهو فعّال حتى في الأحجام الضخمة. أما جدول الذاكرة فيُملأ بالكود ويحمّل كل شيء في الذاكرة: حرية تامة لكنه غير ملائم للأحجام الكبيرة. لذلك نفضّل في الإدارة جدول الملف.
لماذا أتعلم المسح اليدوي ما دام POUR TOUT موجودًا؟
لأنه يُظهر ما يحدث فعلًا (التقدم من سجل إلى آخر، واختبار النهاية) ويبقى مفيدًا في حالات خاصة. فـ POUR TOUT هو الشكل الحديث والموصى به للاستخدام اليومي؛ وفهم المسح اليدوي يساعد على تشخيص المواقف الدقيقة.
ما الفرق بين جدول الملف وجدول الذاكرة؟