اقسام المنجم
- اخبار تقنية (23)
- اختراعات (27)
- افتكاسات (36)
- الابراج (3)
- المواضيع الجديدة (50)
- أهم المواضيع (36)
- جديد * جديد (36)
- حكم وامثال (14)
- دورات تدريبية (5)
- رمضانيات (29)
- شخصية المنجم (3)
- صبايا (12)
- صحتك (20)
- طرائف وغرائب (22)
- فكرة عمل...... (13)
- قصة ققصيره (20)
- كتب (7)
- مشاكل وحلول (25)
- مقالات (30)
معلومة اليوم:
لماذا التكبر ؟
من تراب ، على تراب ، إلى تراب !!
جديد المنجم
اختر ما تود أن تتعلمه
أرشيف المنجم
- أبريل 2011 (121)
- مايو 2011 (65)
- يونيو 2011 (133)
- يوليو 2011 (248)
- أغسطس 2011 (110)
- سبتمبر 2011 (44)
- أكتوبر 2011 (11)
تعاريف و أمثلة بسيطة حول ق البيانات و ربط جدول بالدلفي،و بعض العمليات عليه/-1
10:30 م |
مرسلة بواسطة
helly
هذا تعاريف و أمثلة بسيطة حول قواعد البيانات و ربط جدول بيانات بمشروع دلفي
بعض العمليات عليه: سنتناول إن شاء الله :
تعريف قواعد البيانات .
- الجداول : أساسيات + الإنشاء و التعديل
-إدراج جدول بمشروع دلفي و الاطلاع على محتوياته DbGrid مع التعديل.
- استعمال بعض المكونات الأخرى للاطلاع على محتويات الجدول ، و ادخال أو تعديل البيانات.
-استعمال (ادخال) قيم حقل لجدول معين ، من جدول آخر.
- خمس طرق للبحث عن البيانات ، و مختلف الإستعمالات مع مشاريع مرفقة.
-برنامج بسيط لفتح أي ملف بيانات Paradox بالجهاز .
تعريف قواعد البيانات هي تركيب تستطيع من خلاله تخزين كمية ضخمة من المعطيات التي تربطها علاقات معينة، وحقيقة الأمر ما هي إلا ملف ككل الملّفات العادية، ولكن ما يميزها عن باقي الملّفات، هو قدرتك على كتابة المعطيات فيها وقراءتها منها، باستخدام الوسائل التي تمنحها لك برامج قواعد المعطيات، دون الحاجة إلى التعامل مع الملف مباشرة ، وهو ما يجعل الأمر أكثر سهولة وتنظيما بالنسبة لك. /- ولا مانع أن تخزن بياناتك في ملف خاص بك بالطريقة التي تريحك، ولكن استخدام قواعد المعطيات يوفر لك الكثير من الوقت والجهد. /-وهناك أنواع كثيرة من قواعد المعطيات، تبعا للشركة التي تنتجها والبرامج التي تنشئها، فهناك قواعد بيانات برنامج Access و برنامج SQL Server وهما من إنتاج ميكروسوفت، وهناك عشرات البرامج غيرهما من إنتاج شركات أخرى.
وتسمى هذه البرامج أنظمة إدارة قواعد المعطيات (Database Management Systems ، (DBMS
ومهمتها الأساسية أن تمنحك الوسائل والأدوات اللازمة لإنشاءِ قواعد المعطيات والتعامل معها،بأسهل طريقة وأفضل إمكانيات، بحيث تقوم بدور الوسيط بينك وبين المعطيات المخزنة في ملف قاعدةالمعطيات. ومهما كا ن نوع قاعدة المعطيات التي تتعامل معها، ومهما كانت طريقة تخزينها في الملف،فإن كل قواعد المعطيات تتبع قواعد أساسية وتحقق شروطا معينة متعارفا عليها دوليا، كما أنها كلها بلااستثناء تستخدم لغة الاستعلام المركبة Structured Query Language -SQL
وهي لغة خاصة لحفظ واسترجاع وتحديث المعطيات في قواعد المعطيات.
ومهمتها الأساسية أن تمنحك الوسائل والأدوات اللازمة لإنشاءِ قواعد المعطيات والتعامل معها،بأسهل طريقة وأفضل إمكانيات، بحيث تقوم بدور الوسيط بينك وبين المعطيات المخزنة في ملف قاعدةالمعطيات. ومهما كا ن نوع قاعدة المعطيات التي تتعامل معها، ومهما كانت طريقة تخزينها في الملف،فإن كل قواعد المعطيات تتبع قواعد أساسية وتحقق شروطا معينة متعارفا عليها دوليا، كما أنها كلها بلااستثناء تستخدم لغة الاستعلام المركبة Structured Query Language -SQL
وهي لغة خاصة لحفظ واسترجاع وتحديث المعطيات في قواعد المعطيات.
-الجداول : العنصر الأساسي في أي قاعدة بيانات هو الجدول ويتألف الجدول من أعمدة وأسطريدعى كل سطر سجل وكل عمود بحقل وبالتالي فإن السجل مكون من عدة حقول.
السجل الحالي : هو السجل الذي يقف مؤشر قاعدة البيانات عنده والحقل الحالي هو تقاطع السجلالحالي مع العمود الحالي حيث يمكنك دائمًا تحرير قاعدة البيانات عند السجل الحالي وفي الحقلالحالي (انظر الصورة 001)
يمكن أن تتكون قاعدة المعطيات من عدة جداول وهذه الجداول قد تكون مخزنة في ملف واحد (قاعدة بيانات أكسيس مثلا ) أو أن يكون كل جدول في ملف على حدة كما في قاعدة بيانات بارادوكس .
يعرف كل حقل (عمود) في قواعد المعطيات نوع المعطيات التي سيحويها فمثلا الحقل (الإسم) يكون من النوع نص ، و الحقل (تاريخ الإزدياد) من النوع Date .
*/ يوجد العديد من برامج بناء قواعد البيانات ويعتمد الأمر على نوع القاعدة التي تريد استخدامهافلبناء قاعدة محلية تستخدم جداول باردوكس هناك البرنامج Borland Paradox ولبناء جداولتستخدم Oracle هناك البرنامج Oracle 9i، ... وهكذا.
وقد زودتنا دلفي بأداة سهلة لإنشاء قواعد البيانات وتعديل الجداول بدون العودة إلى تلك البرامج ،حيث يوجد ضمن مجموعة أدوات دلفي البرنامج (DataBase Deskto)
(Module Base de données ) الذي يمكن عن طريقه تصميم العديد من أنواع جداول البيانات .
(Module Base de données ) الذي يمكن عن طريقه تصميم العديد من أنواع جداول البيانات .
Field Name - 1 : اسم الحقل.
يوضع في هذا القسم اسم الحقل، وأسماء الحقول في جداول الباردوكس يجب أن لا تتجاوز 25 حرف،كما يمكن أن تحتوي على فراغات ويمكن أن يكون اسم الحقل باللغة العربية ولكن ينصح باستخدامأسماء حقول إنكليزية دائمًا وعدم احتوائها على فراغات وخاصة عند استخدام SQL ، كما يجب الابتعادعن بعض الأسماء المحجوزة في لغة SQL مثل SELECT أو From أو... Date 2-Type: نوع الحقل
يصف هذا الأخير نوع المعطيات التي ستخزن في هذا الحقل ، وهناك عدد من الأنواع التي يمكن أن ينتمي إليها الحقل ولمعرفة هذه الأنواع إضغط بزر الفأرة اليميني في العمود Typeأو اضغط على مفتاح المسافة Space عندما يكون العمود Typeفعالا، والجدول التالي يبين الأنواع التي توفرها جداول Paradox (انظر الصورة003)
-/ المفتاح الرئيسي (الأساسي) Key : اضغط بزر الفأرة الأيسر في هذا الحقل إذا أردت أن يكون هذا الحقل مفتاح رئيسي (شكل أو رمز نجمة ).
فما هو المفتاح الرئيسي ؟
-تأتي فاعلية نظام قاعدة البيانات العلائقية من القدرة على العثور على المعلومات المخزنة في جداول منفصلة بسرعة وتجميعها معًا باستخدام استعلامات ونماذج وتقارير . لكي يتم ذلك، يجب أن يحتوي كل جدول على حقل أومجموعة حقول تقوم بتعريف كل سجل مخزن في الجدول بشكل فريد، وتسمى هذه المعلومة المفتاح الأساسي للجدول.
متى قمت بتعيين مفتاحًا أساسيًا للجدول، يمنع إدخال أي قيم مكررة أو قيم "خالية .
هناك ثلاثة أنواع من المفاتيح الأساسية التي يمكن تعريفها :
المفاتيح الأساسية من نوع الترقيم التلقائي ، يمكن إعداد حقل الترقيم التلقائي لإدخال رقم تسلسلي تلقائيًا عند إضافة كل سجل إلى الجدول
. تعد أبسط طريقة لإنشاء مفتاح أساسي هي تعيين مثل هذا الحقل كمفتاح أساسي ولتعريف حقل ترقيم تلقائي اختر Auto Increment .
المفاتيح الأساسية من نوع الحقل المفرد :إذا كان لديك حقل لا يتضمن قيم فريدة مثل رقم الهوية الشخصية، يمكنك تعيين هذا الحقل على أنه المفتاح الأساسي .
ويمكنك تحديد مفتاح أساسي لحقل يحتوي بالفعل على بيانات طالما لا يحتوي هذا الحقل على قيم مكررة أو قيم خالية Null .
المفاتيح الأساسية من نوع الحقل المتعدد ، في الحالات التي لا يمكنك فيها ضمان وجود حقل فردي، قد يكون بإمكانك تعيين حقلين أو أكثر باعتبارهما مفتاحا أساسيا ، والحالة الأكثر شيوعا التي يحدث فيها ذلك هي الجدول المستخدم لربط جدولين آخرين في علاقة أطراف بأطراف Many to Many - على سبيل المثال، يمكن أن يربط جدول "مؤلفي الكتب" بين جدولي "الكتب " و"المؤلفين". ويتكون مفتاحه الأساسي من حقلي: "رقم الكتاب" و"رقم المؤلف".(و للمزيد من التفاصيل ، ارجع إلى كتاب لغة البرمج دلفي - ص69 - محمد خالد ناصر آغا )
*/ لفتح الجدول نختار File__Open__Table
*/ لتعديل الجدول نقوم بفتح الملف File__Open__Table ثم Restructure
ملاحظات:
1/ تخزن قواعد البيانات( Paradox) في نوعين من الملفات :
-ملفات من الامتداد Db حيث يتم تخزين معظم بيانات الجدول .
- ملفات من الامتداد Mbحيث يتم تخزين الأجزاء الكبيرة مثل المفكرات و الصور .....
2/ سرية المعلومات في قواعد المعطيات المحلية مثل Paradox, dBASE, FoxPro, Access. : ضعيفة جدًا يمكن كسرها بسهولة. فهناك مئات البرامج التي تستطيع اكتشاف كلمة سر القاعدة ، ويستطيع أي هاوي أن يدخل إلى جداولك والحصول على معلوماتها وتعديلها .عمليا أقوى قواعد البيانات من حيث السرية والسماحيات أيضا هي قواعد البيانات MS SQL Server- Oracle-MySQL
و هذه الأخيرة يمكن أن يصل حجم قواعد المعطيات فيها إلى كميات هائلة ( بلغ حجم معطيات إحدى شركات التسويق في أمريكا 3.6 تيرا بايت_ مأخود من الكتاب المذكور أعلاه). كما أنه يمكن لقواعد المعطيات هذه أن توجد على أجهزة مختلفة .
سرية المعلومات في هذه القواعد قوية جدًا ، كما أنها تعطي سماحيات للمستخدمين ، فموظف المكتبة المسئول عن إدخال أسماء الكتب لا يحق له الإطلاع على كمية المبيعات ......
- إدراج جدول بمشروع دلفي:
نبدأ مشروعا جديدا و نضع العناصر التالية:
Table : _ الخاصية DatabaseName مسار ملف قواعد البيانات (Alias) يمكن انشاؤه أولابشكل مستقل ، تحت اسم معين وكتابة اسمه في هذا المكان ، أو ادراج المسار مباشرة . وللمزيد استعمل ميزة البحث بالمنتدى حول موضوع Alis.
_ الخاصية TableName ندرج اسم ملف قواعد البيانات .
_ نفعل الخاصية Active .
DataSource : نعطي الخاصية DataSet القيمة أو الإسم Table1
DBNavigator - DBGride: نربط هذين العنصرين مع DataSource1 من الخاصية DataSource
__ بهذه الطريقة نكون قد أدرجنا الجدول بالمشروع ، و يمكننا الإطلاع على محتوياته . كما يمكننا التعديل بإدخال المعطيات مباشرة على عنصر DbGrid ، و باستعمال العنصر DbNavigator (الإدراج-التعديل-الحفظ-السجل التالي،السابق.... كما يمكن على هذا العنصر استعمال كل الأزرار أو بعضها من الخاصية VisibleButtons)
استعمال بعض المكونات الأخرى للاطلاع على محتويات الجدول ، و ادخال أو تعديل البيانات.
إنشاء عناصر الحقول TField :
_ الأمر سهل ، سنجرب تطبيق بسيط جدا بواسطة العنصر MaskEdit : على السادس حرر كما توجد أكواد عديدة أحرى ، و كما يمكنك استبدال العناصر المستعملة بعناصر أخرى مثل استبدال MaskEdit2 بـ : DateTimePIcker
فتحرر الكود البديل :
الآن نفد المشروع وجرب ادخال و تعديل البيانات مع الحفظ و الحذف . مارأيك ؟
يمكن استخدام محرر الحقول لتعريف لائحة من الحقول ضمن الجدول ( عنصر الجدول Table)
ومن أجل كل حقل تنشئ دلفي عنصر من النوع Tfield وهذا العنصر غير مرئي ولكن يمكن من خلاله الوصول إلى قيمة الحقل والتحكم بمواصفاتها .
_ لفتح صندوق حوار محرر الحقول اضغط مرتين على العنصر Table لتظهر النافذة المجاورة ، إضغط بزر الفأرة الأيمن في وسط هذه النافذة لتظهر قائمة اختر منها Ajouter tous les chapms - Add All Field عندها ستظهر حقول الجدول في هذه النافذة ، وفي هذه الحالة يمكنك تحديد حقل أو أكثر أو كل الحقول ثم تقوم بعملية سحب عادية بالزر الأيسر للفأرة إلى الفورم ، و سوف تلاحظ العنصر DataSource ينشأ تلقائيا و يربط بالعنصر Table.
كما يمكنك تعديل ترتيب الحقول (التي ستظهر على DbGrid) ، أو حذف أو إنشاء حقل معين
(ملاحظة : لا يحذف الحقل من ملف الجدول بذاته ، يعني بامكانك الحذف من هنا و عند فتح الجدول بطريقة أخرى سوف تجد كل الحقول المنشأة سلفا بواسطة DataBase Descktop موجودة ، كما بامكانك الإستعادة عن طريق خيار Ajouter des champs او Add Fiels).
كما يمكنك تعديل ترتيب الحقول (التي ستظهر على DbGrid) ، أو حذف أو إنشاء حقل معين
(ملاحظة : لا يحذف الحقل من ملف الجدول بذاته ، يعني بامكانك الحذف من هنا و عند فتح الجدول بطريقة أخرى سوف تجد كل الحقول المنشأة سلفا بواسطة DataBase Descktop موجودة ، كما بامكانك الإستعادة عن طريق خيار Ajouter des champs او Add Fiels).
_ بعد سحب الحقول إلى الفورم ، يخطر ببالك أنه بإمكانك عرض حقول الجدول و الإطلاع على البيانات بدون العنصر DbGrid ، ثم لاحظ إسم كل عنصر ، هل مرت معك هذه الأسماء ؟
إنها أسماء مكونات متواجدة بـالقائمة ControleBD ، ماذا يعني هذا ؟ يعني أنه بإمكانك إستعمال هذه المكونات على الفورم لتعرض فيها بيانات الجدول على طريقتك ، و تربط ما تحتاج إليه . و بدون توضيح للطريقة ، نقول لاحظ خواص نفس المكونات التي قمت بسحبها آنفا و اربط بنفسك ما تحتاج إليه من العناصر. و إن شئت اضف أيضا DbGrid +DbNavigator ومارس بعض العمليات ليتسنى لك معايشة الأمر.
_ هناك مكونات أخرى لك أن تجرب ما تسنى لك ، و سنتعرض للمكون DblookupCombobox في العنصر الموالي من الدرس أو الموضوع.
_ الآن : إذا استعملنا العنصر DbEdit أو DbComBobox ، و كان بالمشروع إحدى مكونات التجميل Skins التي لا تحتوي على تلك العناصر ، (ارجع إلى: http://www.delphi4arab.com/forum/showthread.php?t=481 )
_ فهل مظهر الواجهة بالعنصر DbComBobox أو sComBobox وكذلك DbEdit و sEdit يبدو نفسه (جميلا) ، لسبب بسيط جدا كهذا أو لأسباب برمجية ، نحتاج إلى إدراج عناصر غير عناصر DbNavigator فكيف الربط و التحكم بالجدول عن طريق هذه المكونات ؟
_ فهل مظهر الواجهة بالعنصر DbComBobox أو sComBobox وكذلك DbEdit و sEdit يبدو نفسه (جميلا) ، لسبب بسيط جدا كهذا أو لأسباب برمجية ، نحتاج إلى إدراج عناصر غير عناصر DbNavigator فكيف الربط و التحكم بالجدول عن طريق هذه المكونات ؟
_ الأمر سهل ، سنجرب تطبيق بسيط جدا بواسطة العنصر MaskEdit :
انشئ كمثال نفس الجدول الموضح بالصورة 001 أعلاه ، الذي يحتوي على حقلين (بالإنجليزية) : Name - - B_Day . ضع العناصر Table - DataSource – DbGrid - DbNavigator و اربط الخصائص كما مر معنا ، ضع عنصرين Maskedit تحت اسم MaskEdit1 - MaskEdit2 ، ضع 6 أزرار تأخد الكابشن :
جديد – حفظ – تعديل – التالي – السابق – حذف.
*/ ملاحظة : لم نقم بوضع العناصر DbGrid – DbNavigator إلا لملاحظة التحكم في الجدول ، وإلا فلسنا بحاجة لها .
على الزر الأول حرر
كود:
Table1.Insert;
على الزر الثاني حرر
كود:
begin
{ Ajouter les donées / add data}
Table1.FieldValues['Name']:=Maskedit1.Text;
{ou bien / or
Table1.FieldByName('Name').AsString:=Maskedit1.Text; }
Table1.FieldValues['B_Day']:=Maskedit2.Text;
Table1.Post; { pour sauvegarder / for save }
end;
على الزر الثالث حرر على الزر الرابع حرر
على الخـامس حرر كود:
Table1.ُEdit;
كود:
Table1.next;
كود:
Table1.Prior;
كود:
Table1.Delete
فتحرر الكود البديل :
كود:
Table1.FieldValues['B_Day']:=DateTimePicker1.Date;
الآن نفد المشروع وجرب ادخال و تعديل البيانات مع الحفظ و الحذف . مارأيك ؟
استعمال (ادخال) قيم حقل لجدول معين ، من جدول آخر (2/1) :
- أثناء تصميمك لأي برنامج يستخدم قواعد البيانات ، فإنك لا تكاد تستغني عن شيء مهم ، و هو ربط جدول بآخر ، مهما كانت طبيعة هذا الربط و مهما كان الدافع لذلك . و لعل بعض الأمثلة كفيلة لتستوعب الحاجة و الطريقة.
لنفرض أن عندك جدول مركب من ثلاثة حقول : إسم الزبون - السلعة - تاريخ الشراء.
بحيث كلما اشترى زبونا أي سلعة ، يدرج بالجدول ، مثلا: الزبون (مصطفى محمد الأمين ) اشترى ( تلفازا) بتاريخ ( 14/12/2008) . فستقوم أنت بادخال هذه المعلومات بالجدول ، حسب الحقول .
كما أن الحقل الأول (اسم الزبون) من نوع نصي ، و فرضا أن أطول اسم لا يتعدى 25 حرفا ، فسيكون الحقل نصي بقيمة 25 .
و إذا علمنا أن كل حرف يخزن ، فسوف يحجز مساحة تخزين تقدر بــ2بايت (يعني 1 أوكتي أو إن شئت قل 8 بت) ، على هذا مساحة تخزين اسم الزبون (مصطفى محمد الأمين ) فستكون 17Byte .
بينما مساحة التخزين للعدد يصل إلى 32000 لا تزيد عن 2Byte ، و أظن ان الفرق بين القيمتين واضح جدا ، خصوصا إذا قلنا أن اسم الزبون سوف يتكرر معنا 1000 مرة مثلا.
ما رأيك الآن لو ننشئ الجدول المذكور بطريقة أخرى ، عوضا عن اسم الزبون ، سنضع رقم الزبون . و جدول آخر يحوي أسماء الزبائن ، كل زبون له رقم فريد مخصص له ، يميزه عن غيره ، يعني جدول آخر بحقلين (رقم الزبون) - (إسم الزبون) .
في هذه الحالة فإننا ندرج اسم الزبون (مصطفى محمد الأمين ) ، في الجدول الأول برقم و ليكن مثلا 133 . و حتى لو تكرر معنا 1000 مرة فلن يتعدى 2000 بايت ، على غرار الحالة الأولى التي يصل حجم التخزين فيها إلى 17000 . ( و بهذا نربح مساحة التخزين بالأضعاف المضاعفة ).
إلا أنك سوف تتسائل : ما الفائدة و نحن قد أضفنا حقولا للأرقام ، وبأي حال سوف ننشئ حقل لإسم الزبون ؟
- أثناء تصميمك لأي برنامج يستخدم قواعد البيانات ، فإنك لا تكاد تستغني عن شيء مهم ، و هو ربط جدول بآخر ، مهما كانت طبيعة هذا الربط و مهما كان الدافع لذلك . و لعل بعض الأمثلة كفيلة لتستوعب الحاجة و الطريقة.
لنفرض أن عندك جدول مركب من ثلاثة حقول : إسم الزبون - السلعة - تاريخ الشراء.
بحيث كلما اشترى زبونا أي سلعة ، يدرج بالجدول ، مثلا: الزبون (مصطفى محمد الأمين ) اشترى ( تلفازا) بتاريخ ( 14/12/2008) . فستقوم أنت بادخال هذه المعلومات بالجدول ، حسب الحقول .
كما أن الحقل الأول (اسم الزبون) من نوع نصي ، و فرضا أن أطول اسم لا يتعدى 25 حرفا ، فسيكون الحقل نصي بقيمة 25 .
و إذا علمنا أن كل حرف يخزن ، فسوف يحجز مساحة تخزين تقدر بــ2بايت (يعني 1 أوكتي أو إن شئت قل 8 بت) ، على هذا مساحة تخزين اسم الزبون (مصطفى محمد الأمين ) فستكون 17Byte .
بينما مساحة التخزين للعدد يصل إلى 32000 لا تزيد عن 2Byte ، و أظن ان الفرق بين القيمتين واضح جدا ، خصوصا إذا قلنا أن اسم الزبون سوف يتكرر معنا 1000 مرة مثلا.
ما رأيك الآن لو ننشئ الجدول المذكور بطريقة أخرى ، عوضا عن اسم الزبون ، سنضع رقم الزبون . و جدول آخر يحوي أسماء الزبائن ، كل زبون له رقم فريد مخصص له ، يميزه عن غيره ، يعني جدول آخر بحقلين (رقم الزبون) - (إسم الزبون) .
في هذه الحالة فإننا ندرج اسم الزبون (مصطفى محمد الأمين ) ، في الجدول الأول برقم و ليكن مثلا 133 . و حتى لو تكرر معنا 1000 مرة فلن يتعدى 2000 بايت ، على غرار الحالة الأولى التي يصل حجم التخزين فيها إلى 17000 . ( و بهذا نربح مساحة التخزين بالأضعاف المضاعفة ).
إلا أنك سوف تتسائل : ما الفائدة و نحن قد أضفنا حقولا للأرقام ، وبأي حال سوف ننشئ حقل لإسم الزبون ؟
استعمال (ادخال) قيم حقل لجدول معين ، من جدول آخر (2/2) :
الجواب : الظاهر كذلك لكنك مخطئ .
التفصيل (نحسب الفرق بين الحالتين) : في الحالة الأولى لدينا اسم الزبون و السلعة (لا داعي للتعرض لحقل تاريخ الشراء مادام لا يوجد تغيير عليه) ،اسم الزبون يصل إلى 25 بايت ، و إذا فرضنا السلعة تأخد حجم 10 بايت ، فسيكون حجم التخزين الكلي إذا تكرر معنا الزبون 1000 مرة :
(25+10)*1000 النتيجة250000 .
في الحالة الثانية لدينا رقم الزبون + السلعة في الجدول الأول أي (2+10)*1000 النتيجة 20000 ، و في الثاني رقم الزبون + اسم الزبون أي( 2 + 25 ) النتيجة 50 و لا نضرب في 1000 لأن الإسم يحرر مرة واحدة فقط. . فيكون حجم التخزين الإجمالي في هذه الحالة 20000+50 النتيجة 20050
فهل 250000 أصغر من 20050 ؟ ثم كرر الأمر مع عدة زبائن ، هذا يتكرر 100 مرة و الآخر700 مرة و ....
هذه فائدة ، و هناك العديد من الفوائد نذكر مثلا:
- في الحالة الأولى على المستخدم ادخال في كل مرة اسم الزبون و في الثانية رقم الزبون ، فأي الحالتين أقرب لوقوع الخطأ ؟ و إذا كتب المستخدم (خطآ) في اسم الزبون ، فإن عليه تصحيح الإسم عدد مرات التكرار يعني لو ضل يكتب (مصطفى محمد أمين ) عوضا عن (مصطفى محمد الأمين ) فإن عليه تصحيح كل الأخطاء . و في هذه الخالة أيضا سنجم خطآ آخر ، فلو أراد البحث عن المبيعات المحققة مع الزبون (مصطفى محمد الأمين ) ، فإن كل الحقوق المحررة بصيغة (مصطفى محمد الأمين ) ، سوف تستثنى من البحث.
أما لو خطأ في الإسم في الحالة الثانية سوف يقوم بعملية التصحيح مرة واحدة . كذلك لو لم ينتبه لهذا الخطأ و أراد البحث عن المبيعات المحققة مع الزبون (مصطفى محمد الأمين ) فسوف تكون النتيجة لا شيء و هكذا سوف ينتبه للخطأ ، على غرار الحالة الأولى فلن ينتبه إذا أخطأ 10 مرات من 1000 .
- كذلك خفة البرنامج و سرعة التنفيد : فالبحث عن الرقم 133 أسرع بكثير من البحث عن (مصطفى محمد الأمين ) . . . . و هكذا . . . .
-// طبعا نستطيع أن نفعل نفس الشيء مع حقل السلع .
و القاعدة: كلما كان ممكنا ، قم بتقسيم المعطيات التي تتكرر كثيرا على أكثر من جدول ، و كلما زاد هذا التكرار زادت الحاجة لهذا التقسيم و عظمت الفائدة . و هذه العملية تسمى بالتطبيع Normalization .
العنصر DBLookupCombobox // الآن لدينا مثال مبسط :
لدينا 3 جداول . الأول به مجمل السلع يسمى المخزون - الثاني البيع - الثالث الشراء
الإستعمال: نريد إدخال نوع السلع بالجدول الأول ، بحيث لا نبيع (جدول البيع) و لا نشتري (جدول الشراء) إلا السلع المعينة أو الموجودة بجدول المخزون ، إضافة إلى مراعات الكمية التي تزيد بالشرلء و تنقص بالبيع .
التفصيل : الجدول الأول يحتوي حقلين : Produit- Qut. الثاني 3 حقول : مثل الأول + Client.
الثالث مثل الأول + Fournisseur.
لدينا 3 صفحات (فورم) .الرئيسية نربط بها جدول البيع . الثانية للمخزون . الثالثة للشراء.
- على الفورم الرئيسية نضع العناصر : لحجز أسم الزبونEdit1
لحجز السلع المراد بيعها DBLookupComboBox1
لحجز الكمية Edit2
و كذلك : Table1 - DataSource1 و نقوم بعملية الربط مع جدول البيع.
- نفس الشيء مع فورم الشراء.
- أما فورم المخزون : فنحتاج إلى : Table1 - DataSource1 - DBGrid1 و نقوم بالربط .
-الآن : العنصر DBLookupComboBox1 بالفورم الرئيسية نربطه بجدول البيع (حقل : السلعة) ، و يأتي بالمعطيات من الجدول (المخزون) بفورم المخزون (الفورم3) . بهذه الطريقة :
من الخاصية DataSource لهذا المكون نعمل DataSource1 يعني DataSource الذي يربط Tabla1 الخاص بالبيع (على هذه الفورم) ، ثم الخاصية التي تعلو الأولى مباشرة DataField نحدد الحقل (Produit) . نكون بهذا ربطنا العنصر ليؤدي قيمته بجدول البيع . الآن كيف يأتي بالقيمة من جدول المخزون : من الخاصية ListSource نضع القيمة Form3.DataSource1 يعني نربطه بالجدول المتواجد بالفورم 3 (المخزون) ، و نحدد حقل هذا الأخير من الخاصية keyField نعطيها اسم الحقل بجدول المخزون و هو Produit .
بهذه الكيفية لا نبيع إلا السلع الموجودة بالمخزن . نفس الشيء بالنسبة للشراء. و إذا أردنا شراء منتج جديد (غير متوفر بالمخزن) نضيف اسم المنتج بجدول المخزون من الفورم3 ، لنستطيع القيام بالعمليات عليه ، من بيع و شراء.
أما بخصوص الكمية: نضع زرين بالفورم الأولى واحد نعطيه الكابشن تأكيد أو حفظ- الآخر جديد:
على الأول على الثاني ولا نمكن المستخدم من ضغط الزر حفظ إلا بعد إكمال ملئ كل الفراغات ، نعمل OnChange للـ Edit1 حيث Button3 هو حفظ أو تأكيد . و نفس الشيء للفورم2 (achat) ، مع تبديل عملية الطرح بالجمع، و الحقل Client بــ Fournisseur
الجواب : الظاهر كذلك لكنك مخطئ .
التفصيل (نحسب الفرق بين الحالتين) : في الحالة الأولى لدينا اسم الزبون و السلعة (لا داعي للتعرض لحقل تاريخ الشراء مادام لا يوجد تغيير عليه) ،اسم الزبون يصل إلى 25 بايت ، و إذا فرضنا السلعة تأخد حجم 10 بايت ، فسيكون حجم التخزين الكلي إذا تكرر معنا الزبون 1000 مرة :
(25+10)*1000 النتيجة250000 .
في الحالة الثانية لدينا رقم الزبون + السلعة في الجدول الأول أي (2+10)*1000 النتيجة 20000 ، و في الثاني رقم الزبون + اسم الزبون أي( 2 + 25 ) النتيجة 50 و لا نضرب في 1000 لأن الإسم يحرر مرة واحدة فقط. . فيكون حجم التخزين الإجمالي في هذه الحالة 20000+50 النتيجة 20050
فهل 250000 أصغر من 20050 ؟ ثم كرر الأمر مع عدة زبائن ، هذا يتكرر 100 مرة و الآخر700 مرة و ....
هذه فائدة ، و هناك العديد من الفوائد نذكر مثلا:
- في الحالة الأولى على المستخدم ادخال في كل مرة اسم الزبون و في الثانية رقم الزبون ، فأي الحالتين أقرب لوقوع الخطأ ؟ و إذا كتب المستخدم (خطآ) في اسم الزبون ، فإن عليه تصحيح الإسم عدد مرات التكرار يعني لو ضل يكتب (مصطفى محمد أمين ) عوضا عن (مصطفى محمد الأمين ) فإن عليه تصحيح كل الأخطاء . و في هذه الخالة أيضا سنجم خطآ آخر ، فلو أراد البحث عن المبيعات المحققة مع الزبون (مصطفى محمد الأمين ) ، فإن كل الحقوق المحررة بصيغة (مصطفى محمد الأمين ) ، سوف تستثنى من البحث.
أما لو خطأ في الإسم في الحالة الثانية سوف يقوم بعملية التصحيح مرة واحدة . كذلك لو لم ينتبه لهذا الخطأ و أراد البحث عن المبيعات المحققة مع الزبون (مصطفى محمد الأمين ) فسوف تكون النتيجة لا شيء و هكذا سوف ينتبه للخطأ ، على غرار الحالة الأولى فلن ينتبه إذا أخطأ 10 مرات من 1000 .
- كذلك خفة البرنامج و سرعة التنفيد : فالبحث عن الرقم 133 أسرع بكثير من البحث عن (مصطفى محمد الأمين ) . . . . و هكذا . . . .
-// طبعا نستطيع أن نفعل نفس الشيء مع حقل السلع .
و القاعدة: كلما كان ممكنا ، قم بتقسيم المعطيات التي تتكرر كثيرا على أكثر من جدول ، و كلما زاد هذا التكرار زادت الحاجة لهذا التقسيم و عظمت الفائدة . و هذه العملية تسمى بالتطبيع Normalization .
العنصر DBLookupCombobox // الآن لدينا مثال مبسط :
لدينا 3 جداول . الأول به مجمل السلع يسمى المخزون - الثاني البيع - الثالث الشراء
الإستعمال: نريد إدخال نوع السلع بالجدول الأول ، بحيث لا نبيع (جدول البيع) و لا نشتري (جدول الشراء) إلا السلع المعينة أو الموجودة بجدول المخزون ، إضافة إلى مراعات الكمية التي تزيد بالشرلء و تنقص بالبيع .
التفصيل : الجدول الأول يحتوي حقلين : Produit- Qut. الثاني 3 حقول : مثل الأول + Client.
الثالث مثل الأول + Fournisseur.
لدينا 3 صفحات (فورم) .الرئيسية نربط بها جدول البيع . الثانية للمخزون . الثالثة للشراء.
- على الفورم الرئيسية نضع العناصر : لحجز أسم الزبونEdit1
لحجز السلع المراد بيعها DBLookupComboBox1
لحجز الكمية Edit2
و كذلك : Table1 - DataSource1 و نقوم بعملية الربط مع جدول البيع.
- نفس الشيء مع فورم الشراء.
- أما فورم المخزون : فنحتاج إلى : Table1 - DataSource1 - DBGrid1 و نقوم بالربط .
-الآن : العنصر DBLookupComboBox1 بالفورم الرئيسية نربطه بجدول البيع (حقل : السلعة) ، و يأتي بالمعطيات من الجدول (المخزون) بفورم المخزون (الفورم3) . بهذه الطريقة :
من الخاصية DataSource لهذا المكون نعمل DataSource1 يعني DataSource الذي يربط Tabla1 الخاص بالبيع (على هذه الفورم) ، ثم الخاصية التي تعلو الأولى مباشرة DataField نحدد الحقل (Produit) . نكون بهذا ربطنا العنصر ليؤدي قيمته بجدول البيع . الآن كيف يأتي بالقيمة من جدول المخزون : من الخاصية ListSource نضع القيمة Form3.DataSource1 يعني نربطه بالجدول المتواجد بالفورم 3 (المخزون) ، و نحدد حقل هذا الأخير من الخاصية keyField نعطيها اسم الحقل بجدول المخزون و هو Produit .
بهذه الكيفية لا نبيع إلا السلع الموجودة بالمخزن . نفس الشيء بالنسبة للشراء. و إذا أردنا شراء منتج جديد (غير متوفر بالمخزن) نضيف اسم المنتج بجدول المخزون من الفورم3 ، لنستطيع القيام بالعمليات عليه ، من بيع و شراء.
أما بخصوص الكمية: نضع زرين بالفورم الأولى واحد نعطيه الكابشن تأكيد أو حفظ- الآخر جديد:
على الأول
كود:
begin
table1.Edit;
table1.FieldValues['client']:=edit1.Text;
table1.FieldValues['produit']:=DBLookupCombobox1.Text;
table1.FieldValues['Qut']:=edit2.Text;
table1.Post;
form3.Table1.Edit;
form3.table1.FieldValues['Qut']:=form3.table1.FieldValues['Qut']-form1.table1.FieldValues['qut'];
form3.table1.Post;
edit1.Enabled:=False;
edit2.Enabled:=False;
DBLookupComBobox1.Enabled:=False;
end;
كود:
edit1.Enabled:=true;
edit2.Enabled:=true;
DBLookupComBobox1.Enabled:=true;
table1.Insert;
كود:
if (edit1.text<>'') and (edit2.text<>'') and (DBLookupComBobox1.text<>'')
then begin Button3.Enabled:=true end else Button3.Enabled:=false ;
التسميات:
Delphi
الاشتراك في:
تعليقات الرسالة (Atom)
0 التعليقات:
إرسال تعليق