31-01-2010, 12:53 PM
السلام عليكم و رحمة الله تعالى و بركاته : هذا الجزء رقم 08 أو الدرس الثامنمن مشروع انجاز برنامج
لتسيير المخزون و التسويق (GSM) .
اليوم أيضا إن شاء الله سنخطو شوطا كبيرا و هاما في مشروعنــا ، و لا زلنــا مع الفورم FGSM :
و قبل التطرق إلى النقطة التي أنهينـا بها درسنا السابق ، سوف نبرمج عمل كل من الأزرار: Modifier-Valider-Anuler :
الزر Modifier : مباشرة نحرر:
و هذا واضح و لا يتطلب أي شرح.
الزر Valider :
هذا يشبه كثيرا الزر Ajouter ، لكن هذا الأخير يتعلق بإضافة مادة جديدة (الزر Nouveau Produit) إلى قائمة مواد المبيعات ، و عليه بمجرد الضغط على Nouveau Produit و ملئ الحقول يقوم الزر Ajouter بإضافة القيم التي ملئت إلى الجداول مع التعديل في قيمة الكمية بالنسبة لجدول المواد Produit ، كذلك يقوم الزر باجراء تحقق من قيمة الكمية في حال أوشكت على النفاد من المخزون ليظر رسالة التنبيه.
تماما و نفس الشيء تقريبا بالنسبة للزر Valider ، لكن هذا الأخير يخص فقط التعديل ، يعني أنه سيكون معطلا و لن يكون مفعلا إلا بعد الضغط على زر Modifier ، الإختلاف يكمن فقط في حساب الكمية نالنسبة لرسالة التنبيه المتضمنة أن الكمية غير متوفرة في حال كانت تفوق الكمية المتوفرة بالمخزون+حفظ البيانات في جدول المواد Produit ، و أخيرا أمر هام جدا و هو تحديد السجل المراد تغيير كمية مادته بالنسبة للجدول Produit (انظر الكود باللون البرتقال_و للمزيد عن هذا الكود تفضل بزيارة هذا الرابط ) و السبب هو: إذا ضغط المستعمل زر Modifier ثم بطريقة أو بأخرى ذهب إلى الفورم FProduit و حدد سجلا مغايرا سوف يتم بذلك تغيير كمية المادة المتوقف المؤشر عن سجلها و ليست المقصودة و يحدث بذلك خلل كبير كما تقدم.
بعد هذا التوضيح أترككم مع:
الزر Anuler :
واضح و سهل الفهم ، نحرر:
كان هذا بخصوص الأزرار Modifier-Valider-Anuler ، الآن نعرج على الإشكالية المذكورة موضوع الدرس السابع:
يمكن بذلك إضافة شرط أن تكون القيمة موجبة يعني أكبر من الصفر ، يمكن و ضع الشرط في الزر Ajouter قبل تنفيد العملية ، كما يمكن التحقق منه (في الحدث) بعد مغادرة أو التغيير في sEdit1 .
في نفس السياق أقول أن sEdit1+2 هي خانة للأرقام ، لا يعقل تحرير أي حرف أو رمز و لعدم إتاحة المستخدم ارتكاب هكذا أخطاء ، نجبره على كتاة ما يلزم وفقط .
نذهب للحدث OnKeyPress الخاص بـ sEdit1 و نحرر:
الأمر Setfocus يعني الإنتقال ، يعني بعد ملئ الخانة نضغط على زر Enter فننتقل مباشرة إلى sEdit2 كوسيلة للسرعة و الراحة.
نذهب إلى sEdit2 (دوما في الحدث OnKeyPress) و نحرر :
- الآن في الزر Suprimer : يؤدي الضغط عليه لحذف سجل معين من قائمة المبيعات (من جدول Vente) في حال أخطأ المستخدم للبرنامج أو تراجع الزبون عن شراء هذه المادة مثلا ، المهم أن الحذف بواسطة الكود السالف طرحه يقتصر على الجدول Vente فقط ، هنا خطأ من حيث الكمية في الجدول Produit .
التوضيح: بيعت الكمية 10 من أصل 100 من مادة معينة ، و بالتالي المبيعات=10 و المتبقي في المخزن 90 ، بعد الحذف تبقى الكمية بالمخزن 90 و هذا خطأ لأن المفروض أن تبقى100 .
التصحيح: في الزر Suprimer نحرر :
انتهت مادة الدرس الثامن . إذا واجهت أخي الحبيب أي خلل أو إشكال تفضل بالسؤال.
بالتوفيق.
... / يتبع / ....
لتسيير المخزون و التسويق (GSM) .
اليوم أيضا إن شاء الله سنخطو شوطا كبيرا و هاما في مشروعنــا ، و لا زلنــا مع الفورم FGSM :
و قبل التطرق إلى النقطة التي أنهينـا بها درسنا السابق ، سوف نبرمج عمل كل من الأزرار: Modifier-Valider-Anuler :
الزر Modifier : مباشرة نحرر:
كود :
table2.Edit;
sBitBtn1.Enabled:=false;
sBitBtn2.Enabled:=false;
sBitBtn4.Enabled:=false;
sBitBtn6.Enabled:=false;
sBitBtn7.Enabled:=True;
sBitBtn8.Enabled:=True;
DateTimePicker1.enabled:=true;
Filtrage1.Enabled:=false; // fact_Statistique
Vente1.Enabled:=false; // Fiche Vente
DblookupCombobox1.ReadOnly:=False;
DblookupCombobox2.ReadOnly:=False;
DblookupCombobox3.ReadOnly:=False;
DblookupCombobox4.ReadOnly:=False;الزر Valider :
هذا يشبه كثيرا الزر Ajouter ، لكن هذا الأخير يتعلق بإضافة مادة جديدة (الزر Nouveau Produit) إلى قائمة مواد المبيعات ، و عليه بمجرد الضغط على Nouveau Produit و ملئ الحقول يقوم الزر Ajouter بإضافة القيم التي ملئت إلى الجداول مع التعديل في قيمة الكمية بالنسبة لجدول المواد Produit ، كذلك يقوم الزر باجراء تحقق من قيمة الكمية في حال أوشكت على النفاد من المخزون ليظر رسالة التنبيه.
تماما و نفس الشيء تقريبا بالنسبة للزر Valider ، لكن هذا الأخير يخص فقط التعديل ، يعني أنه سيكون معطلا و لن يكون مفعلا إلا بعد الضغط على زر Modifier ، الإختلاف يكمن فقط في حساب الكمية نالنسبة لرسالة التنبيه المتضمنة أن الكمية غير متوفرة في حال كانت تفوق الكمية المتوفرة بالمخزون+حفظ البيانات في جدول المواد Produit ، و أخيرا أمر هام جدا و هو تحديد السجل المراد تغيير كمية مادته بالنسبة للجدول Produit (انظر الكود باللون البرتقال_و للمزيد عن هذا الكود تفضل بزيارة هذا الرابط ) و السبب هو: إذا ضغط المستعمل زر Modifier ثم بطريقة أو بأخرى ذهب إلى الفورم FProduit و حدد سجلا مغايرا سوف يتم بذلك تغيير كمية المادة المتوقف المؤشر عن سجلها و ليست المقصودة و يحدث بذلك خلل كبير كما تقدم.
بعد هذا التوضيح أترككم مع:
كود :
if sEdit1.text>table1.FieldValues['Qut'][COLOR=Red][B]+[/B][/COLOR] table2.FieldValues['Qut']
then begin
if messageDlg('Vous navez pas cette valeur,vouler vous savoir La_Qut?',MtConfirmation
,[mbyes,mbno],0)=mryes then begin showmessage(Format('vous avez sellement: %s' ,
[table1.FieldValues['Qut'][COLOR=Red][B]+[/B][/COLOR] table2.FieldValues['Qut']]));
sEdit1.Text:=table1.FieldValues['Qut']+ table2.FieldValues['Qut'];
sEdit1.SetFocus; end; end
else begin
if [COLOR=DarkOrange]Table1.FindKey([Table2.FieldValues['Code_Prod']])[/COLOR] then begin
Table1.Edit;
Table1.FieldValues['Qut']:=Table1.FieldValues['Qut']
[B][COLOR=Red]+[/COLOR][/B]Table2.FieldValues['Qut'] ;
Table2.Post ;
Table2.edit;
Table2.FieldValues['Code_Prod']:=DBLookupComboBox1.Text;
Table2.FieldValues['Des_Prod']:=DBLookupComboBox2.Text;
Table2.FieldValues['Qut']:=sEdit1.Text;
Table2.FieldValues['Prix_U']:=sEdit2.Text;
Table2.FieldValues['Prix_T']:=sEdit3.Text;
Table2.FieldValues['TVA']:=sEdit4.Text;
Table2.FieldValues['Prix_TTC']:=strtofloat(sEdit5.Text);
Table2.FieldValues['Code_Client']:=DBLookupComboBox3.Text;
Table2.FieldValues['Code_Com_C']:=DBLookupComboBox4.Text;
Table2.FieldValues['Date']:=DateTimePicker1.DateTime;
Table2.Post;
Table1.Edit;
Table1.FieldValues['Qut']:=Table1.FieldValues['Qut']
-Table2.FieldValues['Qut'] ;
Table1.Post;
if table1.FieldValues['Seuil_Qut']>=Table1.FieldValues['Qut'] then
begin showmessage (' La Quantité de ce produit est Diminue En Dessous...'); end;
sBitBtn2.Enabled:=true;
sBitBtn3.Enabled:=false;
sBitBtn4.Enabled:=true;
sBitBtn5.Enabled:=true;
sBitBtn6.Enabled:=True;
sBitBtn7.Enabled:=False;
sBitBtn8.Enabled:=false;
Filtrage1.Enabled:=true; // fact_Statistique
Vente1.Enabled:=true; // Fiche Vente
DblookupCombobox1.ReadOnly:=true;
DblookupCombobox2.ReadOnly:=true;
DblookupCombobox3.ReadOnly:=true;
DblookupCombobox4.ReadOnly:=true;
end;
end;الزر Anuler :
واضح و سهل الفهم ، نحرر:
كود :
if Table2.IsEmpty then begin
sBitBtn1.Enabled:=True;
sBitBtn2.Enabled:=True;
sBitBtn3.Enabled:=False;
sBitBtn4.Enabled:=False;
sBitBtn5.Enabled:=False;
sBitBtn6.Enabled:=False;
sBitBtn7.Enabled:=False;
sBitBtn8.Enabled:=False;
sBitBtn9.Enabled:=False;
sBitBtn10.Enabled:=False;
sBitBtn11.Enabled:=False;
sBitBtn12.Enabled:=False;
end else begin
table2.Cancel;
sBitBtn1.Enabled:=True;
sBitBtn2.Enabled:=True;
sBitBtn3.Enabled:=False;
sBitBtn4.Enabled:=True;
sBitBtn5.Enabled:=True;
sBitBtn6.Enabled:=True;
sBitBtn7.Enabled:=True;
sBitBtn8.Enabled:=False;
DateTimePicker1.enabled:=true;
end;كان هذا بخصوص الأزرار Modifier-Valider-Anuler ، الآن نعرج على الإشكالية المذكورة موضوع الدرس السابع:
إقتباس :ننبه على وجود أمرين هامين أو إشكاليتين بخصوص الكمية بين الجدولين Produit و Vente ، تشملهما البرمجة في زر Suprimer و sEdit1 لاحقا ، المطلوب منك بعد هذا التبسيط البحث و الطرح ، و لنــا عودة لاكمال مشوارنا هذا إن شاء الله عز و جل.تابع معي: لو أن المستعمل بينما هو يكتب رقم معين في خانة الكمية (sEdit1) لامس سهوا إشارة الطرح بقسم الآلة الحاسبة من لوحة المفاتيح (وبديهيا هو يستخدم ذلك القسم) ماذا سيحدث بالنسبة لحقل الكمية في كل من جدول Produit و Vente ؟
يمكن بذلك إضافة شرط أن تكون القيمة موجبة يعني أكبر من الصفر ، يمكن و ضع الشرط في الزر Ajouter قبل تنفيد العملية ، كما يمكن التحقق منه (في الحدث) بعد مغادرة أو التغيير في sEdit1 .
في نفس السياق أقول أن sEdit1+2 هي خانة للأرقام ، لا يعقل تحرير أي حرف أو رمز و لعدم إتاحة المستخدم ارتكاب هكذا أخطاء ، نجبره على كتاة ما يلزم وفقط .
نذهب للحدث OnKeyPress الخاص بـ sEdit1 و نحرر:
كود :
if key=#13 then sEdit2.SetFocus;
if key in ['.' , ','] then
begin key:= DecimalSeparator; end;
if Not (Key in ['0'..'9',DecimalSeparator, #8 ]) then begin
Key := #0; Beep;
end;الأمر Setfocus يعني الإنتقال ، يعني بعد ملئ الخانة نضغط على زر Enter فننتقل مباشرة إلى sEdit2 كوسيلة للسرعة و الراحة.
نذهب إلى sEdit2 (دوما في الحدث OnKeyPress) و نحرر :
كود :
if key=#13 then DBLookupCombobox4.SetFocus;
if key in ['.' , ','] then
begin key:= DecimalSeparator; end;
if Not (Key in ['0'..'9',DecimalSeparator, #8 ]) then begin
Key := #0; Beep;
end;- الآن في الزر Suprimer : يؤدي الضغط عليه لحذف سجل معين من قائمة المبيعات (من جدول Vente) في حال أخطأ المستخدم للبرنامج أو تراجع الزبون عن شراء هذه المادة مثلا ، المهم أن الحذف بواسطة الكود السالف طرحه يقتصر على الجدول Vente فقط ، هنا خطأ من حيث الكمية في الجدول Produit .
التوضيح: بيعت الكمية 10 من أصل 100 من مادة معينة ، و بالتالي المبيعات=10 و المتبقي في المخزن 90 ، بعد الحذف تبقى الكمية بالمخزن 90 و هذا خطأ لأن المفروض أن تبقى100 .
التصحيح: في الزر Suprimer نحرر :
كود :
if not table2.IsEmpty then begin
if MessageDLG
('êtes vous sûr de vouloir suprimer l''enregistrement ?'
, MtConfirmation,[MbYes,MbNo],0)=MrYes then
begin
Table1.Edit;
Table1.FieldValues['Qut']:= Table1.FieldValues['Qut']+Table2.FieldValues['Qut'];
Table1.Post; Table2.Delete; Table6.Delete; end;end;
if table2.IsEmpty then begin
sBitBtn1.Enabled:=True; sBitBtn2.Enabled:=False;
sBitBtn3.Enabled:=False; sBitBtn4.Enabled:=False;
sBitBtn5.Enabled:=False; sBitBtn6.Enabled:=False;
sBitBtn7.Enabled:=False; sBitBtn8.Enabled:=False;
sBitBtn9.Enabled:=False; sBitBtn10.Enabled:=False;
sBitBtn11.Enabled:=False; sBitBtn12.Enabled:=False;
end;بالتوفيق.
... / يتبع / ....

