حلول لبعض المشاكل البرمجية الشائعة
تواجه المبرمجين كثير من المشكلات التي
يتطلب حلها وقتاً طويلاً وجهداً مضنياً، ليس لأن حلها صعب بطبيعته، بل لأن الوصول
إلى الحل، ضمن الكم الهائل من المصادر والكتب التي تتحدث عن المواضيع البرمجية،
يشبه البحث عن أبرة في كومة قش! ومما يزيد الطين بلة أن بعض الحلول غير مذكورة في
الكتب، أو المصادر التي توفرها الشركات المنتجة، فيضطر المبرمج في هذه الحالة، إلى
اعتماد أسلوب التجربة والخطأ، أو الغوص في بحار مصادر أخرى، للوصول إلى الحل.
سنوفر على الكثيرين منكم هذا الجهد، ونبين حلول بعض المشكلات الشائعة، الخاصة بلغة
Visual Basic.
رسالة خطأ Error opening
database، عند تنفيذ البرنامج
تظهر هذه المشكلة للمبرمجين الذين يكتبون
برامج تتعامل مع قواعد البيانات، بعد إكمال البرنامج وتحضير ملفات الإعداد، ونسخها
إلى أقراص مرنة ثم تركيب البرنامج على حاسوب آخر، ومحاولة تنفيذ البرنامج، على
الرغم من انتهاء عملية الإعداد بسلاسة وبدون مشكلات. لكنها لا تظهر ة على الجهاز
الذي طور عليه البرنامج. سبب المشكلة أن برنامج إنشاء أقراص الإعداد Setup Wizard،
المرفق ببيئة التطوير للغة Visual Basic، والكثير من البرامج المتخصصة بتهيئة
ملفات الإعداد، تهمل إضافة الملف EXPSRV.DLL إلى ملفات الإعداد، على الرغم من أن
هذا الملف مهم جداً للبرامج التي تتعامل مع قواعد البيانات، ولا يمكن فتح قواعد
البيانات بدونه. الحل بسيط ويتمثل بإضافة هذا الملف إلى ملفات الإعداد يدوياً في
النافذة المخصصة لذلك، فتتخلص من تلك المشكلة تماماً.
مشكلات في التعريب، عند تركيب البرنامج على
حاسوب آخر
مشكلة شائعة أخرى، سببها أيضاً، خطأ في
تهيئة برامج الإعداد. وهي تظهر عند تركيب برنامج يوفر واجهة عربية على بعض الحواسيب،
وتبدو على شكل أخطاء في التعامل مع التعريب، حيث تظهر بعض العناصر، مثل Combo box
و List box وغيرها، بصورة غير معربة، أي من اليسار إلى اليمين، على الرغم من أنها
كانت تعمل بصورة طبيعية، في الحاسوب الذي طور عليه البرنامج. سبب هذه المشكلة
كذلك، هو نقص ملف من نوع DLL من ملفات الإعداد أيضاً هو الملف VBA332ME.DLL،
المسؤول عن إضافة ميزات التعريب إلى عناصر واجهات التطبيق، ويسبب غيابه ظهور جميع
العناصر بصيغتها الأولى قبل التعريب. تظهر هذه المشكلة على بعض الأنظمة، ولا تظهر
على أخرى، لوجود نسخة في بعضها من هذا الملف، ركبتها برامج أخرى عند تركيبها على
تلك الأنظمة. حل هذه المشكلة بسيط أيضاً، ويتم بإضافة الملف المذكور يدوياً، إلى
قائمة ملفات الإعداد.
التعامل مع قيم التاريخ في
جمل SQL
تواجه بعض المبرمجين مشكلة التعامل مع هيئة
التاريخ في قواعد البيانات. انظر إلى العبارتين التاليتين، اللتين تطلبان استرجاع
قيود جميع الموظفين الذين بدأوا العمل في تاريخ 3/4/1999:
SQL = "SELECT * FROM Employees WHERE
StartDate = #3-4-1999#"
SQL = "SELECT * FROM Employees WHERE
StartDate = #" & MyDate & "#"
حيث وضع التاريخ ضمن العبارة الأولى
مباشرة، بينما تقرأ قيمة التاريخ في العبارة الثانية من المتغير المسمى MyDate.
تبدو هاتان العبارتان صحيحتين تماماً من الناحية البرمجية، ولن يعترض عليها مترجم
لغة فيجوال بيسك، لكن العبارة الأولى ستعطي عملياً نتائج خاطئة تماماً، بينما
ستنتج العبارة الثانية نتائج صحيحة أحياناً، وخاطئة أحياناً أخرى. والسبب هو الطرق
المختلفة المتبعة في التعبير عن قيم التاريخ. فالصيغة الأمريكية، مثلاً، تعتمد
أسلوب mm/dd/yyyy، أي يكتب رقم الشهر، يليه رقم اليوم، ثم السنة، أما الأسلوب
الإنجليزي فيأتي بالصيغة dd/mm/yyyy، أي يكتب رقم اليوم، ثم الشهر، ثم السنة، وهي
الصيغة المتبعة في الدول العربية أيضاً. تكمن المشكلة في كيفية التعرف على القيمة
الحقيقة للتواريخ، مع وجود طرق مختلفة للتعبير عنها. فهل نقرأ 3/4/1999 على أنه
اليوم الثالث من الشهر الرابع؟ أم نقرأه على أنه اليوم الرابع، من الشهر الثالث؟
اتفق عالمياً على أن تكتب قيم التواريخ في
عبارات SQL، حسب الصيغة الأمريكية، أي رقم الشهر قبل اليوم. ولهذا، فإن على
المبرمج تحويل جميع قيم التواريخ إلى هذه الصيغة، قبل إدخالها في عبارات SQL. ونتيجة
لذلك، فإن العبارة الأولى المذكورة سابقاً، يجب أن تكتب بالصيغة:
SQL = "SELECT * FROM Employees WHERE
StartDate = #4-3-1999#"
أما العبارة الثانية، فسوف تعمل أحياناً
بصورة صحيحة، وأحياناً بصورة خاطئة، كما ذكرنا، والسبب أن مترجم فيجوال بيسك، يحول
المتغير MyDate إلى صيغة حرفية قبل إدخاله في عبارة SQL. ويتم هذا التحويل
التلقائي بناءً على صيغة التاريخ المعرفة في تحديدات نظام التشغيل. فإذا كانت تنص
على عرض التاريخ بصيغة mm/dd/yyyy، فإن العبارة ستعمل بصورة صحيحة، أما إذا كانت
تعتمد صيغة dd/mm/yyyy فستعطي نتائج خاطئة. ويتم حل هذه المشكلة بتجاوز التحويل
التلقائي واستعمال تحويل آخر، يحول التاريخ دائماً بالصيغة الصحيحة، وذلك باستعمال
الأمر Format$() كالآتي:
SQL = "SELECT * FROM Employees WHERE
StartDate = #" & Format$(MyDate, "mm-dd-yyyy") &
"#"
ويجب التأكيد هنا على استعمال yyyy في صيغة
التاريخ، وليس yy كما يفعل البعض لغرض الاختصار. والسبب في ذلك أن الصيغة الثانية
ستظهر خطأً عند التعامل مع السنوات التي تلي سنة 2000 ، لأنها تظهر قيمة السنة
بخانتين فقط، بدلا من أربع.
رسالة الخطأ Invalid Use of
Null، عند القراءة من قواعد البيانات
تظهر هذه الرسالة في الكثير من الأحيان عند
قراءة البيانات من قاعدة البيانات وإحلالها في أحد المتغيرات، كما في المثال
التالي:
Dim Name as string0
Dim Age as Integer
Name = rsEmployees!Name ' Here a run-time error my occur
Age = rsEmpolyees!Age ' Here also a run-time error my occur
يكمن سبب هذا الخطأ، في أن حقول قواعد
البيانات يمكن أن تأخذ القيمة Null، التي تستعمل للدلالة على أن الحقل خال من أي
معلومة. لكن، في الوقت ذاته، لا تقبل المتغيرات المستعملة في لغة فيجوال بيسك هذه
القيمة (باستثناء المتغيرات من نوع Variant). وينتج عن ذلك ظهور رسالة الخطأ
المذكورة عندما تكون قيمة الحقل المقروء Null.
يمكن تجاوز هذا الخطأ باستعمال الأمر
IsNull()، للتمييز بين القيم الحقيقة وقيم Null واختيار القيم الحقيقية فقط،
لوضعها في المتغيرات، أي أن تعاد كتابة العبارات السابقة بالصيغة:
Name = IIf(IsNull(rsEmployees!Name,
"", rsEmployees!Name))
Age = IIf(IsNull(rsEmpolyees!Age, 0,
rsEmployees!Age))
ويمكن كتابة العبارة الأولى التي تتعامل مع
المتغيرات الحرفية بصيغة أخرى أكثر اختصاراً، كما يلي:
Name = rsEmployees!Name &
""
ستحل هذه الصيغة أيضاً، المشكلة لأن مترجم
فيجوال بيسك سيضيف قيمة Null إلى قيمة النص الخالي التي يرمز لها بعلامتي اقتباس
متتاليتين، وستكون النتيجة نصاً خالياً، وليس قيمة Null.
لا توجد نهاية للمشاكل البرمجية التي تواجه
المبرمجين، لكن تتوفر الكثير من المصادر التي يستطيع المبرمج من خلالها العثور على
الحلول التي يحتاجها. ويوجد العديد منها على شبكة إنترنت بشكل مجاني، كخدمات الدعم
الفني التي تقدمها الشركات المنتجة لزبائنها، والتي توفر الكثير من الحلول في معظم
الأحيان. توجد أيضاً، لوائح البريد mailing list، التي يشترك فيها الآلاف من
المبرمجين، ويناقشون فيها المشاكل التي تواجههم، ويتعاونون في إيجاد الحلول لها،
بالإضافة إلى الكثير من المواقع المتخصصة بتوفير الحلول والمعلومات للمبرمجين في
المجالات المختلفة.
من مجلة إنترنت العالم العربى وليد خالد عبد الله