14-12-2008, 03:08 PM
استعمال (ادخال) قيم حقل لجدول معين ، من جدول آخر (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;ولا نمكن المستخدم من ضغط الزر حفظ إلا بعد إكمال ملئ كل الفراغات ، نعمل OnChange للـ Edit1
كود :
if (edit1.text<>'') and (edit2.text<>'') and (DBLookupComBobox1.text<>'')
then begin Button3.Enabled:=true end else Button3.Enabled:=false ;الباقي بالمشروع المرفق.
.../ يتبع /....


![[-]](https://delphi4arab.net/forum/D4A2020/collapse.png)