تعاريف و أمثلة بسيطة حول ق البيانات و ربط جدول بالدلفي،و بعض العمليات عليه/-1
#6
استعمال (ادخال) قيم حقل لجدول معين ، من جدول آخر (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 ، لنستطيع القيام بالعمليات عليه ، من بيع و شراء.
أما بخصوص الكمية: نضع زرين بالفورم الأولى واحد نعطيه الكابشن تأكيد أو حفظ- الآخر جديد:
على الأول
كود :
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;

ولا نمكن المستخدم من ضغط الزر حفظ إلا بعد إكمال ملئ كل الفراغات ، نعمل OnChange للـ Edit1
كود :
if (edit1.text<>'') and (edit2.text<>'') and (DBLookupComBobox1.text<>'') then begin Button3.Enabled:=true end else Button3.Enabled:=false ;
حيث Button3 هو حفظ أو تأكيد . و نفس الشيء للفورم2 (achat) ، مع تبديل عملية الطرح بالجمع، و الحقل Client بــ Fournisseur
الباقي بالمشروع المرفق.
.../ يتبع /....
[-] كل من 2 users say قال شكرا ل nabilkeb على المشاركة المفيدة
  • zouaidahmed, aljathmi
الرد


الردود في هذا الموضوع
تعاريف و أمثلة بسيطة حول ق البيانات و ربط جدول بالدلفي،و بعض العمليات عليه/-1 - بواسطة nabilkeb - 14-12-2008, 03:08 PM

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 2 ) ضيف كريم