1.4ربط الحقول بالبيانات والتعامل مع السجلات
الأساسي في 30 ثانية
- ربط حقل ↔ بند عالي الإنتاجية: ÉcranVersFichier() ينسخ الإدخال إلى البنود، وFichierVersÉcran() يفعل العكس للعرض.
- دوال HFSQL (البادئة H) تتعامل مع البيانات: HAjoute، HModifie، HSupprime، HLitPremier/Suivant، HLitRecherche، HRAZ.
- اختبر HEnDehors دائمًا بعد قراءة أو بحث: وإلا تعمل على بيانات غير موجودة — بل قد تعدّل السجل الخطأ.
حالة مصغّرة متسلسلة — ياسين يربط بطاقة طلبه بالبيانات
رسم ياسين نافذة «بطاقة الطلب». الآن يربطها بالبيانات. أولًا يربط كل حقل ببنده: SAI_NomClient ↔ Client.Nom، وSAI_Ville ↔ Client.Ville. ثم يكتب كود التسيير. لإنشاء طلب: يستدعي HRAZ لتفريغ البنود، ويترك المستخدم يُدخل، ثم ÉcranVersFichier() ينسخ الإدخال دفعة واحدة وHAjoute يسجّل. وللبحث عن عميل برمزه، يستخدم HLitRecherche ثم يختبر HEnDehors: إذا لم يُعثر على شيء، يعرض رسالة واضحة بدل استغلال بيانات وهمية. بفضل الحقول المرتبطة، يستغرق تعديل بطاقة أسطرًا قليلة. يستخلص ياسين: الربط يؤتمت تبادل الشاشة/الملف، واختبار HEnDehors انعكاس إلزامي.
حالة مستقلة لهذا القسم: تعود في الدرس والمخطّط والسكربت وتحدّي 48 ساعة للقسم 1.4.
1. ربط الحقل ↔ البند
هذه إحدى أكثر آليات WinDev إنتاجية: الرابط بين حقول نافذة وبنود التحليل. عندما يُربط حقل ببند (SAI_NomClient ↔ Client.Nom)، يعرف WinDev من أين يأخذ القيمة وأين يضعها.
ودالتان تقومان بكل العمل: ÉcranVersFichier() (تنسخ إدخال الشاشة إلى البنود قبل التسجيل) وFichierVersÉcran() (تنسخ قيم الملف إلى الحقول للعرض). انتهت عشرات الإسنادات اليدوية — ومصدر أخطاء أقل.
2. دوال HFSQL
لـالتعامل مع البيانات، يوفّر WLangage دوال HFSQL، كلها ببادئة H: HAjoute (إضافة)، وHModifie (تحديث السجل الجاري)، وHSupprime، وHLitPremier / HLitDernier / HLitSuivant / HLitPrécédent (التنقل)، وHLitRecherche (البحث على مفتاح)، وHRAZ (تفريغ البنود في الذاكرة قبل إدخال).
مفهوم أساسي: السجل الجاري. في لحظة معينة، يكون سجل ما «جاريًا» في الذاكرة، وهو الذي سيؤثر فيه HModifie أو HSupprime. والخطأ في السجل الجاري خطأ كلاسيكي.
3. انعكاس HEnDehors
بعد قراءة أو بحث، يبيّن HEnDehors هل نحن خارج الملف: لا شيء وُجد، أو بلغنا النهاية. ويجب دائمًا اختباره قبل استغلال النتيجة.
إذًا دورة البطاقة النموذجية هي: HRAZ → إدخال → ÉcranVersFichier → HAjoute (أو HModifie). ونسيان اختبار HEnDehors يعني عرض بيانات متبقية، بل تعديل السجل الخطأ — فساد صامت يجب تجنّبه قطعًا.
🔎 مثال ملموس — 🔎 مثال ملموس — تسجيل بطاقة والبحث عنها
دورة ياسين لبطاقة طلبه:
// Créer une nouvelle commande (champs liés)
HRAZ(Commande) // vider les rubriques en mémoire
// ... l'utilisateur saisit dans les champs liés ...
ÉcranVersFichier(Commande) // recopier la saisie vers les rubriques
HAjoute(Commande) // enregistrer le nouvel enregistrement
// Rechercher un client, puis TOUJOURS tester HEnDehors
HLitRecherche(Client, IDClient, 1042)
SI HEnDehors(Client) ALORS
Info("Client introuvable : vérifiez le code.")
SINON
FichierVersÉcran(Client) // afficher la fiche trouvée
FIN
القراءة: استدعاءان (ÉcranVersFichier / FichierVersÉcran) يعوّضان عشرات الإسنادات؛ واختبار HEnDehors يحمي من بحث فارغ.
الانعكاس: يُختبر HEnDehors فورًا بعد القراءة أو البحث، قبل أي استغلال.
مفردات القسم
- حقل مرتبط ببند
- حقل شاشة مرتبط ببند (SAI_NomClient ↔ Client.Nom): يعرف WinDev كيف يقرأ القيمة ويسجّلها تلقائيًا.
مثال بسيط: يربط ياسين SAI_Ville بـClient.Ville في نافذته.
ما ليس كذلك: نسخ كل قيمة يدويًا في الكود، حقلًا بحقل.
رد فعل: حقل شاشة ↔ بند → اربطهما.
- ÉcranVersFichier / FichierVersÉcran
- دالتا الربط الأساسيتان: ÉcranVersFichier تنسخ الإدخال إلى البنود؛ وFichierVersÉcran تنسخ قيم الملف إلى الحقول.
مثال بسيط: يستدعي ياسين ÉcranVersFichier قبل HAjoute مباشرة.
ما ليس كذلك: إسناد ثلاثين بندًا يدويًا ونسيان واحد.
رد فعل: نقل شاشة ↔ ملف → هاتان الدالتان.
- دوال HFSQL (البادئة H)
- دوال التعامل مع البيانات: HAjoute، HModifie، HSupprime، HLitPremier/Suivant/Précédent/Dernier، HLitRecherche، HRAZ.
مثال بسيط: يضيف ياسين طلبًا بـHAjoute ويعيد قراءته بـHLitRecherche.
ما ليس كذلك: تعديل سجل بالكتابة مباشرة في الملف.
رد فعل: بيانات → دوال ببادئة H.
- السجل الجاري
- السجل «الجاري» في الذاكرة: هو الذي سيؤثر فيه HModifie أو HSupprime.
مثال بسيط: يتموضع ياسين على العميل الصحيح قبل استدعاء HModifie.
ما ليس كذلك: استدعاء HModifie دون التموضع على السجل الصحيح.
رد فعل: تعديل/حذف → تحقق من السجل الجاري.
- HEnDehors (يجب اختباره)
- يبيّن أننا خارج الملف بعد قراءة أو بحث (لا شيء وُجد، أو بلغنا النهاية)؛ ويجب اختباره منهجيًا.
مثال بسيط: يعرض ياسين «العميل غير موجود» عندما يكون HEnDehors صحيحًا.
ما ليس كذلك: استغلال نتيجة بحث دون اختبار HEnDehors.
رد فعل: بعد القراءة/البحث → اختبر HEnDehors.
في التطبيق — عمليًا — تسجيل بطاقة وإعادة قراءتها
- اربط حقول النافذة بالبنود المقابلة في التحليل (SAI_NomClient ↔ Client.Nom) عبر خصائص الحقل.
- للـإنشاء: استدعِ HRAZ لتفريغ البنود، واترك المستخدم يُدخل، ثم ÉcranVersFichier متبوعة بـHAjoute.
- للـتعديل: تموضع على السجل الصحيح (HLitRecherche)، واعرضه بـFichierVersÉcran، ثم بعد الإدخال ÉcranVersFichier وHModifie.
- اختبر HEnDehors منهجيًا بعد كل قراءة أو بحث، قبل استغلال النتيجة.
سكربت خطوة بخطوة — اربط البطاقة كما يفعل ياسين (4 دقائق)
1) اربط كل حقل ببنده (SAI_NomClient ↔ Client.Nom) في خصائص الحقل. 2) الإنشاء: HRAZ، إدخال المستخدم، ÉcranVersFichier، HAjoute. 3) التعديل: HLitRecherche للتموضع، ثم FichierVersÉcran للعرض، ثم ÉcranVersFichier وHModifie. 4) بعد كل قراءة أو بحث، اختبر HEnDehors وعالج حالة «غير موجود». 5) الحذف: تموضع ثم HSupprime.
لا تتابع كتابة بعد بحث دون أن تختبر HEnDehors.
نموذج للنسخ واللصق — دورة البطاقة عند ياسين
// Création
HRAZ(Fichier)
< saisie de l'utilisateur >
ÉcranVersFichier(Fichier)
HAjoute(Fichier)
// Recherche + contrôle
HLitRecherche(Fichier, Clé, valeur)
SI HEnDehors(Fichier) ALORS
< cas non trouvé >
SINON
FichierVersÉcran(Fichier)
FIN
// Modification / Suppression (enregistrement en cours)
ÉcranVersFichier(Fichier)
HModifie(Fichier) // ou HSupprime(Fichier)
استعراض للقراءة فقط
يستخدم ياسين HLitRecherche ثم FichierVersÉcran فقط لعرض طلب، دون تسجيل.
إضافة من جدول
من جدول الطلبات، يفتح ياسين بطاقة الإضافة، ثم HRAZ، وÉcranVersFichier، وHAjoute، ثم يحدّث الجدول.
بحث فاشل
عندما يكون HEnDehors صحيحًا، يقترح ياسين إنشاء عميل جديد بدل عرض بطاقة فارغة.
نقل يدوي
لحقل محسوب (المجموع مع الرسم)، يحسب ياسين القيمة ثم يسندها يدويًا، دون حقل مرتبط.
✓ ممارسات جيدة
- اربط الحقول بالبنود بدل الإسناد اليدوي.
- استخدم ÉcranVersFichier / FichierVersÉcran قبل التسجيل أو العرض.
- اختبر HEnDehors بعد كل قراءة أو بحث.
✗ أخطاء شائعة
- نسيان اختبار HEnDehors بعد بحث.
- تعديل السجل الخطأ (السجل الجاري).
- إعادة كتابة عشرات الإسنادات يدويًا بدل الحقول المرتبطة.
النقاط الأساسية
- الربط حقل ↔ بند عالي الإنتاجية: ÉcranVersFichier تنسخ الإدخال، وFichierVersÉcran تعرض القيم.
- دوال HFSQL (البادئة H) تتعامل مع البيانات: HAjoute، HModifie، HSupprime، HLit…، HLitRecherche، HRAZ.
- السجل الجاري هو الذي يؤثر فيه HModifie أو HSupprime: والخطأ فيه خطأ كلاسيكي.
- انعكاس إلزامي: اختبار HEnDehors بعد كل قراءة أو بحث قبل استغلال النتيجة.
تحدي 48 ساعة — طبّقه غدًا
خذ ملفًا من تحليلك واكتب، كما يفعل ياسين، الدورة الكاملة لبطاقة: HRAZ → ÉcranVersFichier → HAjoute، ثم بحث HLitRecherche يتبعه اختبار HEnDehors. اكتب في جملة واحدة ما يحدث إذا نُسي اختبار HEnDehors.
- أعرف كيف أربط حقول نافذة ببنود التحليل.
- أعرف كيف أضيف سجلًا وأبحث عنه وأعدّله بدوال HFSQL.
- لديّ انعكاس اختبار HEnDehors بعد كل قراءة أو بحث.
أسئلة شائعة
لماذا يجب اختبار HEnDehors منهجيًا بعد بحث؟
لأن البحث قد لا يجد شيئًا. وبدون هذا الاختبار، يواصل الكود استغلال القيم المتبقية في الذاكرة — غالبًا آخر سجل مقروء — فيعرض التطبيق بيانات خاطئة دون تعطل. والأسوأ: متابعة HModifie بعد بحث فاشل قد تعدّل سجلًا غير المقصود. لذا نختبر HEnDehors فورًا بعد القراءة أو البحث، قبل أي استغلال.
ما الفرق بين الحقول المرتبطة والكود اليدوي؟
الحقول المرتبطة تؤتمت النقل شاشة ↔ ملف عبر ÉcranVersFichier / FichierVersÉcran: سريعة وآمنة ويُفضَّل اعتمادها. أما الكود اليدوي (إسناد واحدًا واحدًا) فيبقى مفيدًا للحالات الخاصة: بيانات محوّلة عند العرض (حساب، تحويل) أو حقول غير مرتبطة (مرشحات، مجاميع، مؤشرات). في بطاقة من ثلاثين حقلًا، توفّر الحقول المرتبطة وقتًا كبيرًا وتجنّب كثرة النسيان.
كيف نسجّل البيانات المُدخلة في نافذة مرتبطة؟