أهم أقسام المدونة

الصفحات

الأحد، 17 فبراير 2019

كوني أنت



* الجِنانُ: الجنّات.
* الجَناةُ: الثمرة المقطوفة، والجمع جَنَى (أي ما تجنيه من الثمار).
* أَلْفَيتُ: وجدتُ.

قاعدة تقريب رجال المصارف!!


قاعدة تقريب رجال المصارف!!

ذكرت في منشور سابق إن أحد الفروق بين فيجوال بيزيك وسي شارب، هو أن تحويل عدد به كسر عشري إلى عدد صحيح يتم في فيجوال بيزيك بالتقريب (تحويل 3.8 إلى عدد صحيح يعطي 4) بينما يتم في سي شارب بالتخلص من الكسر العشري بدون تقريب الجزء الصحيح (تحويل 3.8 إلى عدد صحيح يعطي 3)!

المفاجأة التي اكتشفتها الآن بعد 21 سنة من التعامل مع فيجوال بيزيك، هي الطريقة الغريبة التي تقرب بها فيجوال بيزيك الكسر 0.5 ، فهي تقربه إلى أقرب عدد زوجي!!.. فمثلا العدد 3.5 سيتم تقريبه إلى 4، والعدد 4.5 سيتم تقريبه إلى 4 أيضا وليس 5!!.. هذه القاعدة في تقريب النصف تسمى قاعدة تقريب رجال المصارف Bankers rounding!.. الحقيقة أنني لم أمر بأي موقف يكشف هذا التصرف الغريب من قبل، وأشك أنه لم يكن موجودا في VB6 وربما كذلك في الإصدارات الأولى من VB.NET!.. لاحظ أن هذه هي الطريقة التي تعمل بها أيضا الدالة Math.Round ما لم تستخدم معاملها الأخير لاختيار تقريب نقطة المنتصف إلى العدد الأبعد عن الصفر (سالبا أو موجبا).
جرب:
VB.NET:
Console.WriteLine(CInt(4.5)) ' 4
Console.WriteLine(CInt(3.5)) '  4 

C#:
Console.WriteLine((int)4.5); // 4
Console.WriteLine((int)3.5); // 3

 

 

DataTableReader Class


فئة قارئ جدول البيانات DataTableReader Class 

هذه الفئة ترث فئة قارئ البيانات الأم DbDataReader Class، وهي تشبه قارئ البيانات العادي في طريقة عملها، لكنها لا تستخدم كائن أمر للحصول على السجلات من قاعدة البيانات، فهي تقرأ السجلات من جداول مجموعة البيانات مباشرة.

ولإنشاء قارئ بيانات يقرأ سجلات أحد الجداول، عليك باستخدام الوسيلة CreateDataReader الخاصة بهذا الجدول كالتالي:
var Tr = Ds.Tables["Authors"].CreateDataReader( );
while (Tr.Read( )) {
     MessageBox.Show(Tr["ID"].ToString( ));
     MessageBox.Show(Tr["Author"].ToString( ));
}
ولإنشاء قارئ بيانات يقرأ سجلات كل الجداول، عليك باستخدام الوسيلة CreateDataReader الخاصة بمجموعة البيانات DataSet كالتالي:
DataTableReader Tr = Ds.CreateDataReader( );
do {
   while (Tr.Read( )) {
          string RowTxt = "";
          for (var I = 0; I < Tr.FieldCount; I++)
                  RowTxt += Tr.GetName(I) + " = "
                         + Tr[I].ToString( ) + "\r\n";
            MessageBox.Show(RowTxt);
   }
} while (Tr.NextResult( ));
لاحظ أننا لم نستخدم أسماء الأعمدة عند قراءة خانات كل سجل، وذلك لأن السجلات ستختلف من جدول إلى آخر في عدد الأعمدة وأسمائها.. وبدلا من هذا استخدمنا الخاصية FieldCount لإنشاء حلقة تكرار تمر عبر كل الأعمدة، لقراءة كل خانة باستخدام رقم العمود بدلا من اسمه.
ويمكنك تجربة هذا الكود في المشروع DataTableReaderSample.
ولحدث إنشاء الفئة DataTableReader الصيغتان التاليتين:
الأولى تستقبل كائن الجدول DataTable الذي ستقرأ سجلاته.
والثانية تستقبل مصفوفة جداول DataTable Array لتقرأ سجلاتها.
ولا تمتلك هذه الفئة أية خصائص أو وسائل جديدة غير ما ترثه من الفئة الأم.

من كتاب من الصفر إلى الاحتراف: برمجة قواعد البيانات بتقنية ADO.NET
 

جافا سكربت


أسهل جزء أكتب عنه عند شرح إحدى لغات البرمجة هو أسلوب صياغتها Syntax ومنطق عملها، لأني أشرح الأمور بأسلوبي بحرية.. أما أكثر جزء متعب فهو شرح مكتبة الفئات الخاصة باللغة (الواجهة البرمجية API)، بسبب كمية التفاصيل التي أضطر أن أكتب عنها، وكلها تحتاج لمراجعة وثائق اللغة، وهي عملية بطيئة ومملة لا أستطيع أن استمر فيها أكثر من ساعتين متصلتين، وأحيانا أمل بعد نصف ساعة!! تخيلوا أن كل فئة في المتوسط تحتوي على 20 خاصية ووسيلة وحدث، بمعاملاتها وقيمها العائدة وضوابط استخدامها والأخطاء المحتملة عند استدعائها، والمفروض أن أقرأ كل هذا في وثائق اللغة لأختصره وأكتبه!

لهذا أنهيت شرح لغة جافا سكربت في كتاب HTML5 بسرعة، لكني غارق منذ أكثر من شهرين في شرح DOM (Document Object Model) أي الكائنات التي تمثل الصفحة وكل عناصر HTML التي توضع فيها للتعامل معها من كود جافا سكربت!.. ورغم أن الفئات ووسائلها تشبه إطار العمل بل موجودة في دوت نت في الأداة WebBrowser Control (والتي أفكر أن أشرحها بالمرة في ملحق في نهاية هذا الكتاب حتى لا أعيد شرح DOM في كتاب آخر)، فإن هناك بعض الاختلافات المستفزة، فجافا سكربت مثلا لا تحتوي على المرقمات Enums ولهذا تعيد بعض الخصائص أرقاما، بينما تعيد بعضها الأخرى قيما نصية، والأعجب أن بعض الخصائص تعيد قيمة منطقية bool والبعض الآخر يعيد نصا قيمته 'true' أو 'false' مما يكاد يصيبني بالجنون!!

هناك الكثير من عدم التناسق في الواجهة البرمجية لجافا سكربت، لأنها تشكلت عبر سنوات طويلة عبر شركات مختلفة إلى أن استقروا على المقاييس الموحدة الحالية!

ربنا يسهل وأخرج من هذه الدوامة قريبا!