تعلم معي خطوة خطوة صنع برنامج لتسيير المخزون و التسويق
#21
السلام عليكم و رحمة الله تعالى و بركاته : هذا الجزء رقم 08 أو الدرس الثامنمن مشروع انجاز برنامج
لتسيير المخزون و التسويق (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;
انتهت مادة الدرس الثامن . إذا واجهت أخي الحبيب أي خلل أو إشكال تفضل بالسؤال.

بالتوفيق.

... / يتبع / ....


الملفات المرفقة
.rar   6_GSM.rar (الحجم : 112.79 ك ب / التحميلات : 1,531)
الرد
#22
- الآن أخي المتابع سوف نتطرق للواجهة (الفورم) الخاصة بالزبون - المبيعات - المشتريات - المواد :
و لأن العناصر المستعملة من أزرار و غيرها مرت معنا في الفورم الرئيسي ، فقد فضلت توفير الجهد و عناء الشرح ، المطلوب منك فقط انشاء عناصر كل فورم و ترتيبها (الملف مرفق) ، و في الدرس الموالي إن شاء الله سوف نباشر برمجة عمل كل زر ، و سيكون الأمر سهلا فعمل كل زر يشبه إلى حد كبير ما مر معنــا.
ليبقى أهم شيء بعدها و المتمثل في الفورم FFactureEtStatistique ، هذه المرحلة تتطلب شرح مفصل نظرا لأهميتها البالغة و نظرا لأننا سنستعمل SQL الذي لم يمر معنا أي شيء عنه.
و ختاما نأتي لتقارير الطباعة و ينتهي كل شيء.

بالتوفيق.


الملفات المرفقة
.rar   7_GSM.rar (الحجم : 245.53 ك ب / التحميلات : 1,815)
الرد
#23
السلام عليكم و رحمة الله تعالى و بركاته : هذا الجزء رقم 09 أو الدرس التاسع مشروع انجاز برنامج
لتسيير المخزون و التسويق (GSM) .

بصفة فردية و مباشرة اختزالا للجهد و الوقت ، قمت باضافة العناصر اللازمة في كل من الفورم FProduit-FClient-FFournisseur-FAchat ، فأما الفورم المواد أو فورم المخزن فقد قمت ببرمجة عمل كل عنصر ، المطلوب من على نفس الشاكلة تقريبا إتمام العمل في يخص برمجة عناصر و أزرار كل من فورم الزبائن و الممونين ، كذلك على نفس شاكلة الفرم FGSM المتضمنة عملية البيع أو العملية على جدول المبيعات قم باتمام ما يلزم بخصوص فورم المشتريات .
بهذا أكون قد فضلت عدم شرح أمور سبق التطرق إليها من جهة ، و من جهة أخرى أحببت تفاعلك معي و اختبار مدى استعابك لما سلف ، لذلك قم بما هو مطلوب و عجل الإنجاز.
بالتوفيق.



الآن سنتكلم عن أمر آخر تم إضافته في الفورم FGSM:
عندما يباشر المستعمل ، القيام بعمليات بيع لمختلف المواد ، و مع كثرة المواد و ربما تشابه أسمائها قد يغيب عنه كود أو اسم مادة معينة (خصوصا إذا كان موظف جديد) الشيء الذي سيجبره على فتح قائمة DBLookupCombobox2 و التمعن و البحث في كل القائمة ، أو سيذهب إلى الفورم FProduit ليبحث في الجدول بكامله عن المادة المقصودة ، و ماذا لو كان المحل يتعامل بقدر هائل من البيانات لا سيما مئات الأنواع من المواد ؟ نفس الشيء لو كان المحل يتعامل مع زبائن كثر ، رغم أن الزبون سيقول لك مثلا نحن مؤسسة MagiInfo (كإسم تجاري) و لنفرض أن لك زبائن كثر تتشابه أسماؤها و لديك الكثير كل يبدأ بحرف M ، أكيد أنك تخسر وقتا أنت بحاجة إليه.

مما ذكر ، جاءت فكرة مضمونها العام هو اتاحة طريقة سريعة للبحث عن كود أو إسم مادة أو زبون .

الطريقة
:
نستعمل كل من العناصر: زر واحد ، عنصر واحد من ComboBox ، و 5 عناصر من RadioButton .(تجدها من القائمة في صفحة Standard )
و لأننا استعملنا سكين فإننا نفضل البحث عن نفس العناصر الشبيهة من صفحة AlphaLite سنجد
sBitBtn و sComboBox و لا نجد بديل عن RadioButton ، لكننا نجد كبديل عن هذا الأخير العنصر sCheckBox و الفرق بينهما واضح و هو أن الأول لا يتيح لك امكانية تحديد عنصرين معا ، بينما الآخر يمكنك من ذلك ، و يمكننا تجاوز ذلك بالطبع بإضافة شرط حذف التحديد عن البقية في حال تم تحديد أحدها.
أترككم مع الكود ، نضغط مرتين على العنصر sCheckBox1 و نكتب :
كود :
if sCheckBox1.Checked=true then begin sCheckBox2.Checked:=false; sCheckBox3.Checked:=false; sCheckBox4.Checked:=false; sCheckBox5.Checked:=false; sComboBox1.SetFocus; end;
نفس الشيء مع sCheckBox2 :
كود :
if sCheckBox2.Checked=true then begin sCheckBox1.Checked:=false; sCheckBox3.Checked:=false; sCheckBox4.Checked:=false; sCheckBox5.Checked:=false; sComboBox1.SetFocus; end;
و نفس الشيء مع sCheckBox3-4-5 .


- الآن مع sCombobox1 : أولا نجعل الخاصية Style لهذا العنصر تأخذ القيمة csSimple ، ثم في الحدث OnEnter للــ sCombobox1 نكتب :
كود :
If sCheckBox1.Checked=true then Begin sCombobox1.Items.Clear; Table1.first; While not Table1.EOF Do Begin sCombobox1.Items.Add(Table1.FieldByName('Code_Prod').asString); Table1.Next; End; Table1.First; While Not Table1.EOF Do If Table1.FieldValues['Code_Prod']=sCombobox1.text Then BREAK Else Table1.Next; end; If sCheckBox2.Checked=true then Begin sCombobox1.Items.Clear; Table1.first; While not Table1.EOF Do Begin sCombobox1.Items.Add(Table1.FieldByName('Des_Prod').asString); Table1.Next; End; Table1.First; While Not Table1.EOF Do If Table1.FieldValues['Des_Prod']=sCombobox1.text Then BREAK Else Table1.Next; end; If sCheckBox3.Checked=true then Begin sCombobox1.Items.Clear; Table4.first; While not Table4.EOF Do Begin sCombobox1.Items.Add(Table4.FieldByName('Code_Client').asString); Table4.Next; End; Table4.First; While Not Table4.EOF Do If Table4.FieldValues['Code_Client']=sCombobox1.text Then BREAK Else Table4.Next; end; If sCheckBox4.Checked=true then Begin sCombobox1.Items.Clear; Table4.first; While not Table4.EOF Do Begin sCombobox1.Items.Add(Table4.FieldByName('Code_Com_C').asString); Table4.Next; End; Table4.First; While Not Table4.EOF Do If Table4.FieldValues['Code_Com_C']=sCombobox1.text Then BREAK Else Table4.Next; end; If sCheckBox5.Checked=true then Begin sCombobox1.Items.Clear; Table4.first; While not Table4.EOF Do Begin sCombobox1.Items.Add(Table4.FieldByName('Nom_C').asString); Table4.Next; End; Table4.First; While Not Table4.EOF Do If Table4.FieldValues['Nom_C']=sCombobox1.text Then BREAK Else Table4.Next; end;
الآن الزر الذي أضفنـاه أنا عندي هو sBitBtn13 :
نجعل الكابشن الخاصة به تأخذ القيمة Plus D'information يعني معلومات إضافية أو معلومات أخرى . نريد من هذا الزر إعطاء معلومات إضافية يمكن للمستعمل أن يحتاجها (و أنا غرضي منه تمكينك من رؤية طريقة بحث بواسطة الأمر Lookup و للمزيد راجع هذا الرابط )
كود :
var LookupResult : Variant; begin if sCheckBox1.Checked=true then begin lookupResult := Table1.Lookup('Code_Prod',sCombobox1.Text,'Des_Prod;Qut'); if Not VarIsnull( lookupResult) then Showmessage ('- Code de Produit : '+sCombobox1.text+#13+'- Designation de Produit : '+vartostr(lookupresult[0])+ #13+'- Qut : ' + vartostr(lookupresult[1] ) ); end; if sCheckBox2.Checked=true then begin lookupResult := Table1.Lookup('Des_Prod',sCombobox1.Text,'Code_Prod;Qut'); if Not VarIsnull( lookupResult) then Showmessage ('- Code de Produit : '+vartostr(lookupresult[0])+#13+'- Designation de Produit : '+sCombobox1.text+ #13+'- Qut : ' + vartostr(lookupresult[1] ) ); end; if sCheckBox3.Checked=true then begin lookupResult := Table4.Lookup('Code_Client',sCombobox1.Text,'Code_Com_C;Nom_C'); if Not VarIsnull( lookupResult) then Showmessage ('- Code de Client : '+sCombobox1.text+#13+'- Code Commercial de Client : '+vartostr(lookupresult[0])+ #13+'- Nom et Prénom de Client : ' + vartostr(lookupresult[1] ) ); end; if sCheckBox4.Checked=true then begin lookupResult := Table4.Lookup('Code_Com_C',sCombobox1.Text,'Code_Client;Nom_C'); if Not VarIsnull( lookupResult) then Showmessage ('- Code de Client : '+vartostr(lookupresult[0])+#13+'- Code Commercial de Client : '+sCombobox1.text+ #13+'- Nom et Prénom de Client : ' + vartostr(lookupresult[1] ) ); end; if sCheckBox5.Checked=true then begin lookupResult := Table4.Lookup('Nom_C',sCombobox1.Text,'Code_Client;Code_Com_C'); if Not VarIsnull( lookupResult) then Showmessage ('- Code de Client : '+vartostr(lookupresult[0])+#13+'- Code Commercial de Client : '+vartostr(lookupresult[1] )+ #13+'- Nom et Prénom de Client : ' +sCombobox1.text); end; end;
ملاحظة: المرفق بواجهة فرنسية ، بعد أن سبق إدراج مرفق المشروع بواجهة عربية (نزولا لرغبة أحد الأعضاء) ، و بهذا يمكن للأي عضو لا يفهم اللغة الفرنسية (و أنا أصلا لا أجيدها) ، فهم معنى كل عبارة عن طريق المقارنة بين المرفقين عند الحاجة .
- في الدرس القادم سوف نرفق المشروع مع اتمام برمجة كل من فورم المشتريات و الزبائن و الممونين ، مع بداية الطرح لغرض ما يلزم بخصوص الفورم FFactureEtStatistique ، و نذكر بأن هذا الأخير في غاية الأهمية و سنعطي بعض الوقت قبل الطرح لغرض اللحاق لجميع المشاركين و المهتمين.


بالتوفيق .


..../ يتبـع / ....


الملفات المرفقة
.rar   8_GSM.rar (الحجم : 116.82 ك ب / التحميلات : 1,514)
الرد
#24
قبل إتمام المشروع بما تبقى ، هناك خطأ أو نقص في برمجة زر الحذف في الفورم FGSM قد يؤدي إلى الوقوع في الخطأ.
المطلوب ايجاد هذا النقص و تعديله ، لكي لا تقع فيه أيضا في نفس الزر على الفورم FAchat لأن وظيفة الأزرار تتشابه كما سلف الذكر.

بالتوفيق.
الرد
#25
nabilkeb كتب :قبل إتمام المشروع بما تبقى ، هناك خطأ أو نقص في برمجة زر الحذف في الفورم FGSM قد يؤدي إلى الوقوع في الخطأ.
المطلوب ايجاد هذا النقص و تعديله ، لكي لا تقع فيه أيضا في نفس الزر على الفورم FAchat لأن وظيفة الأزرار تتشابه كما سلف الذكر.

بالتوفيق.

فقط إضافة الشرط المكتوب باللون البرتقالي:
كود :
if not table2.IsEmpty then begin if (MessageDLG ('êtes vous sûr de vouloir suprimer l''enregistrement ?' , MtConfirmation,[MbYes,MbNo],0)=MrYes) and [COLOR=DarkOrange](Table1.FindKey([Table2.FieldValues['Code_Prod']]))[/COLOR] then begin Table1.Edit; Table1.FieldValues['Qut']:= Table1.FieldValues['Qut']+Table2.FieldValues['Qut']; Table1.Post; Table2.Delete; end;
لأنه إذا تم تحديد سجل مغاير (على DBGrid في الفورم FVente) فإنه سيحذف السجل المحدد ، و هو غير المقصود حذفه على الفورم FGSM . سبق التطرق إلى هذا الأمر في الدرس الثامن (الكود باللون البرتقالي أيضا).

- إذن المشروع مرفق ، و به التعديل المذكور إضافة إلى اتمام برمجة وظيفة العناصر على الفورم(المشتريات و الزبائن و الممونين):
FAchat - FِClient - FFournisseur

فقط تنبيه : عن سهو و من غير قصد لم أطلب فهرسة حقل Code_Client في الجدول Client ، و كذلك Code_Fournisseur في الجدول Fournisseur .
- كذلك سميت حقل الإسم التجاري في الجدول Produit بالإسم Code_ Com_F عوضا عن Code_Com_F ، يعني هناك فراغ قبل Com ، و قد تم تعديل التسمية بالجدول و كذا موضوع الفهرسة . فعذرا لأنني أسرع و لا أحضر للطرح ، رغبة مني في اكمال الموضوع لنستفيد من نقد و توجيه و أفكار المحترفين أصحاب الخبرة.
-كما ألفت الإنتباه إلى أنني أضيف أشياء طفيفة لا أذكرها ، في المرفقات من مرفق لآخر ، لبساطة تلك الإضافة و لعدم التحدث و طرح كل شيء لكي لا أطيل و ربما تختلط الأمور عليك صديقي ، فإني أراعي أنه قسم للمبتدئين أمثالي.

المهم المشروع إلى غاية هذه المرحلة مرفق .

لم يتبق الكثير ، في الدرس القادم إن شاء الله سنعمل على الفورم FFactureEtStatistique و بعدها تقارير الطباعة و ينتهي كل شيء.


بالتوفيق.


الملفات المرفقة
.rar   9_GSM.rar (الحجم : 119.5 ك ب / التحميلات : 1,428)
الرد
#26
قبل بداية الدرس العاشر بحول الله ، و لاختزال الوقت و عدم التكثير من الطرح الممل و الحديث عن إضافة عناصر مرت معنا ، المطلوب انشاء و ترتيب مكونات الفورم FFactureEtStatistique ، إستنادا إلى المرفق ، و سنباشر البرمجة على هذه الأخيرة في الطرح اللاحقا إن شاء الله .


بالتوفيق


الملفات المرفقة
.rar   10_GSM.rar (الحجم : 122.63 ك ب / التحميلات : 1,409)
الرد
#27
السلام عليكم و رحمة الله تعالى و بركاته : هذا الدرس العاشر من مشروع انجاز برنامج
لتسيير المخزون و التسويق (GSM) .

نربط DataSource1 مع Query1 من الخاصية DataSet ، و 2 مع 2 ، و هكذا.
نربط DBGrid1 مع DataSource1
نحدد العنضر Query1 و من الخاصية SQL في TStrings نكتب
كود :
Select * from Vente where N_Fact=:afficher_Facture
يعني قمنا بتحديد كل الحقول من الجدول Vente إذا تحقق الشرط المتمثل في رقم الفاتورة يساوي القيمة afficher_Facture ، و هذه الأخيرة إختيارية يعني اكتب ماتشاء ، المهم شيء يدلك على المراد (وهنا المراد لعرض الفاتورة).
نذهب الآن إلى الخاصية Params ، يوف تظهر لنا القيمة التي كتبناها (afficher_Facture) ، نحددها و نذهب إلى خصائصها و نعدل على الخاصية DataType ، و نحدد ftFloat لأن هذه القيمة بطبيعة الحال عدد حقيقي لأنها توازي نوع الحقل (N_Fact) .


ثم من الحدث OnChange للــ sEdit1 نكتب
كود :
if sEdit1.text='' then begin sEdit1.text:=floattostr(0); sEdit1.SelectAll ; end; Query1.Close; Query1.ParamByName('Afficher_Facture').Value:=sEdit1.text; Query1.Open; if sEdit1.Text=Query1.FieldValues['N_Fact'] then begin sLabel3.Caption:=Query1.FieldValues['Date'] ; sLabel5.Caption:=Query1.FieldValues['Code_Com_C'] ; end else begin sLabel3.Caption:='. . . . . . . . . . . . . . .'; sLabel5.Caption:='. . . . . . . . . . . . . . .' ; end;
-أولا : قيمة sEdit1 هي لرقم الفاتورة ، يعني نكتب رقم الفاتورة فيها فنتحصل على عرض للفاتورة بالــ DBgrid ، لابد ألا تكون قيمة sEdit1 خالية ، هذا كود بسيط يرجع القيمة 0 إذا كانت خالية .
-كتبنا في الكود أعلاه الشرط
إقتباس : where N_Fact=:afficher_Facture
و موازاة مع ذلك فعلينا أن نعطي قيمة sEdit1 للــ Query1.ParamByName('Afficher_Facture').Value
و قبل ذلك يتطلب الأمر إغلاق Query1 ، بعد ذلك نقوم بفتحه. بهذا تعرض الفاتورة بالـ DBGrid1 . و في sLabel3 و 5 يتم عرض تاريخ الفاتورة و الإسم التجاري للزبون كما يمكن إضافة كود الزبون في sLabel آخر .


- بقي الآن جمع قيمة السعر و كذا الضريبة و السعر الإجمالي :
في الحدث OnChange للــ sEdit1 كتب فقط الجز الذي شرحته ، الكود الكامل:
كود :
begin if sEdit1.text='' then begin sEdit1.text:=floattostr(0); sEdit1.SelectAll ; end; Query1.Close; Query1.ParamByName('AFficher_Facture').Value:=sEdit1.text; Query1.Open; if sEdit1.Text=Query1.FieldValues['N_Fact'] then begin sLabel3.Caption:=Query1.FieldValues['Date'] ; sLabel5.Caption:=Query1.FieldValues['Code_Com_C'] ; end else begin sLabel3.Caption:='. . . . . . . . . . . . . . .'; sLabel5.Caption:='. . . . . . . . . . . . . . .' ; end; (* Majmoo3e Total_HT*) RecordPlaceTotal_HT := Query1.GetBookmark; MajmoueTotal_HT:=0; Query1.First; while not Query1.Eof Do begin MajmoueTotal_HT:= MajmoueTotal_HT+Query1.FieldByName('prix_T').AsCurrency; Query1.Next; end; sEdit2.text:=CurrToStr(MajmoueTotal_HT); (* Majmoo3eTVA *) RecordPlaceTVA := Query1.GetBookmark; MajmoueTVA:=0; Query1.First; while not Query1.Eof Do begin MajmoueTVA:= MajmoueTVA+Query1.FieldByName('tva').AsCurrency; Query1.Next; end; sEdit3.text:=CurrToStr(MajmoueTVA); sEdit4.text:=FloatToStr(StrToFloat(sEdit2.text) + StrToFloat(sEdit3.text)); If FGSM.Table7.FindKey( [(sEdit1.text)] ) Then sBitBtn2.Enabled:=True else sBitBtn2.Enabled:=False; end;
و نعرف (أعلاه) في Var قبل implementation :
كود :
(*Pour Majmoo3eTotal_HT*) MajmoueTotal_HT: Currency; RecordPlaceTotal_HT: TBookmark ; (*Pour Majmoo3eTVA*) MajmoueTVA: Currency; RecordPlaceTVA: TBookmark ; (*Pour Majmoo3eDettesTotales*) MajmoueDettesTotales: Currency; RecordPlaceDettesTotales: TBookmark ; (*Pour Majmoo3eDettesClient*) MajmoueDettesClient: Currency; RecordPlaceDettesClient: TBookmark ;
- في الحدث ONchange للــ sEdit4 نكتب :
كود :
begin If FGSM.Table7.FindKey( [(sEdit1.text)] ) Then sEdit6.Text:= FGSM.Table7.FieldValues['Valeur_Reste'] else sEdit5.Text:=FloatTostr(StrToFloat(sEdit4.Text)); end;
- في الحدث ONchange للــ sEdit5 نكتب :
كود :
Var Total_TTC:real; begin if sEdit5.Text='' then begin sEdit5.Text:=floattostr(0); sEdit5.SelectAll;end; Total_TTC:=StrToFloat(sEdit4.Text); if Total_TTC>=StrToFloat(sEdit5.text) then sEdit6.Text:=floattostr(Total_TTC-strtofloat(sEdit5.text)) else begin showmessage('Valeur Incorrecte'); sEdit5.text:=FloatToStr(Total_TTc); sEdit5.SelectAll; end; end;
- في الحدث ONchange للــ sEdit6 نكتب :
كود :
Var Total_TTC:real; begin if sEdit6.Text='' then begin sEdit6.Text:=floattostr(0); sEdit6.SelectAll;end; Total_TTC:=StrToFloat(sEdit4.Text); if Total_TTC>=StrToFloat(sEdit6.text) then sEdit5.Text:=floattostr(Total_TTC-strtofloat(sEdit6.text)) else begin showmessage('Valeur Incorrecte'); sEdit5.text:=FloatToStr(Total_TTc); sEdit6.SelectAll; end; end;

-نتابع الجزء2 ، من الدرس العاشر في المرة المقبلة ، و سيكون المشروع مرفق.

بالتوفيق.

... / يتبــع / ....
الرد
#28
- الجزء2 من الدرس العاشر

على الفورم FFactureEtStatistique نمر إلى الصفحة : Consultation des Dettes نعمل عليها لأنها متعلقة بشكل مباشر مع Facture .

* أولا لا ننسى مع كل Query نحدد الخاصية : DataBaseName=GSM


- الآن نحن بحاجة لانشاء جدولين جديدين ، الأول للديون ، و الثاني خاص بوصل الدفع.
لم أذكر هذين الجدولين سابقين ، أولا لعدم الحاجة ، ثانيا لعدم لخبطة الأمور ، لكننا في المرحلة الأخيرة (الدرس ما قبل الأخير) و لن ننشئ بعدهما أي جدول.
أسماء الجداول و الحقول و أنواع الحقول ، مرفقة (Table).


- في Query2 في الخاصية SQL نكتب:
كود :
SELECT * FROM Dettes_Client
- في Query3 في الخاصية SQL نكتب:
كود :
SELECT * FROM Dettes_Client where Code_Client=:Code_Client
في الخاصية Params للــ Query3 نحدد Code_Clientو نعطيه في DataType القيمة ftString لأنه خاص بحقل نوع نصي.

- نربط DBGrid7 و DBNavigator1 بــ DataSource2
نجعل sEdit17 (الخاصية) : ReadOnly=True.


- في الحدث OnChange للــ sEdit16 :
كود :
if sEdit16.Text='*' then begin Query2.Close; Query3.Close; (* Majmoo3eDettesTotales *) RecordPlaceDettesTotales:= Query2.GetBookmark; MajmoueDettesTotales:=0; Query2.Active:=true; Query2.First; while not Query2.Eof Do begin MajmoueDettesTotales:= MajmoueDettesTotales +Query2.FieldByName('Valeur_reste').AsCurrency; Query2.Next; end; sEdit17.text:=CurrToStr(MajmoueDettesTotales); end else begin Query2.Close; Query3.Close; Query3.ParamByName('Code_Client').Value:=sEdit16.text; DbGrid6.DataSource:=DataSource3; Query3.Open; (* Majmoo3eDettesClient *) RecordPlaceDettesClient := Query3.GetBookmark; MajmoueDettesClient:=0; Query3.First; while not Query3.Eof Do begin MajmoueDettesClient:= MajmoueDettesClient +Query3.FieldByName('Valeur_reste').AsCurrency; Query3.Next; end; sEdit17.text:=CurrToStr(MajmoueDettesClient); end;
- نرجع للصفحة Facture و على الضغط للزر sBitBtn1 نكتب :
كود :
If Not FGSM.Table7.FindKey( [(sEdit1.text)] ) Then begin FGSM.Table7.Insert; FGSM.Table7.FieldValues['Code_Client']:=query1.FieldValues['Code_Client'] ; FGSM.Table7.FieldValues['Code_Com_C']:=query1.FieldValues['Code_Com_C'] ; FGSM.Table7.FieldValues['N_Fact']:=query1.FieldValues['N_Fact'] ; FGSM.Table7.FieldValues['Date']:=query1.FieldValues['Date'] ; FGSM.Table7.FieldValues['Prix_TTC']:=sEdit4.text ; FGSM.Table7.FieldValues['Valeur_Reste']:=sEdit6.text ; FGSM.Table7.post; sBitbtn2.Enabled:=true; ShowMessage('Les données sont enregistrées avec succès'); end else begin if messageDLG (' Le Mode De Paiment est deja Valider ,Voulez-vous changer ?', MtConfirmation,[MbYes,MbNo],0)=MrYes then begin FGSM.Table7.Edit; FGSM.Table7.FieldValues['Valeur_Reste']:=sEdit6.text ; FGSM.Table7.post; sBitbtn2.Enabled:=true; end; end;
-كل شيء على مايرام ، المشروع مرفق.


بالتوفيق.


.../ يتبع / ....


الملفات المرفقة
.rar   Table.rar (الحجم : 8.76 ك ب / التحميلات : 925)
.rar   11_GSM.rar (الحجم : 38.28 ك ب / التحميلات : 1,070)
الرد
#29
- الجزء 3 من الدرس العاشر

على الفورم FFactureEtStatistique دائما ، نمر إلى الصفحة : Gestion de Versements ، نجعل ReadOnly=True لكل من العناصر : sBitBtn9-sBitBtn10-sEdit14-sEdit15-DBLookupcimboBox1-DBLookupcomboBox2 .

للتعريف ، نكتب قبل implementation :
كود :
(*Pour Majmoo3eVersement_Totals*) MajmoueVersement_Totals: Currency; RecordPlaceVersement_Totals: TBookmark ; (*Pour Majmoo3eVersement_Client*) MajmoueVersement_Client: Currency; RecordPlaceVersement_Client: TBookmark ;

- نجعل الخاصية SQL للــ Query4 تأخذ القيمة :
كود :
Select * From Bon_Versement

- نجعل الخاصية SQL للــ Query5 تأخذ القيمة :
كود :
Select * From Bon_Versement Where Code_Client=:Code_Client
و من Params نحدد Code_Client و نجعل DataType تأخذ القيمة : ftString



- من الحدث OnChange للــ sEdit12 نكتب :
كود :
if sEdit12.Text='*' then begin Query4.Close; sBitBtn5.Enabled:=false; DbGrid4.DataSource:=DataSource4; Query4.Open; (* Majmoo3eVersement_Totals *) RecordPlaceVersement_Totals := Query4.GetBookmark; MajmoueVersement_Totals:=0; Query4.Active:=true; Query4.First; while not Query4.Eof Do begin MajmoueVersement_Totals:= MajmoueVersement_Totals +Query4.FieldByName('Somme_Versée').AsCurrency; Query4.Next; end;sEdit13.text:=CurrToStr(MajmoueVersement_Totals); FGSM.Table8.Refresh; Query4.Refresh; end else begin Query5.Close; Query5.ParamByName('Code_Client').Value:=sEdit12.text; DbGrid4.DataSource:=DataSource5; Query5.Open; if Query5.FieldValues['Code_Client']=sEdit12.text then begin sBitBtn5.Enabled:=true ; end else begin sBitBtn5.Enabled:=false; end; (* Majmoo3eVersement_Client *) RecordPlaceVersement_Client := Query5.GetBookmark; MajmoueVersement_Client:=0; Query5.Active:=true; Query5.First; while not Query5.Eof Do begin MajmoueVersement_Client:= MajmoueVersement_Client +Query5.FieldByName('Somme_Versée').AsCurrency; Query5.Next; end; sEdit13.text:=CurrToStr(MajmoueVersement_Client); FGSM.Table8.Refresh; Query5.Refresh; end;
في OnEnter للــ sEdit12 نكتب : sEdit12Change


- نضغط مرتين على DBLookupComboBox1 و نكتب :
كود :
DBLookupComboBox2.KeyValue:=FGSM.Table4.FieldValues['Code_Com_C'];
ثم DBLookupComboBox2
كود :
DBLookupComboBox1.KeyValue:=FGSM.Table4.FieldValues['Code_Client'] ;
- على الزر sBitBtn7 الذي يحمل الكابشن : Nouveau ، نكتب:
كود :
var NumBV:integer; begin if not FGSM.Table8.IsEmpty then begin FGSM.Table8.Last; NumBV:=FGSM.Table8.FieldValues['N_Bon']; sEdit14.Text:=inttostr(NumBV+1); end else begin sEdit14.Text:=inttostr(1); end; FGSM.Table8.Insert; sEdit12.Enabled:=False; sEdit15.Clear; sEdit14.ReadOnly:=false; sEdit15.ReadOnly:=false; DBLookupComBobox1.ReadOnly:=false; DBLookupComBobox2.ReadOnly:=false; DBGrid5.Enabled:=False; sBitBtn7.Enabled:=False; sBitBtn8.Enabled:=False; sBitBtn9.Enabled:=True; sBitBtn10.Enabled:=True; sBitBtn11.Enabled:=False; sBitBtn12.Enabled:=False; sBitBtn13.Enabled:=False; sBitBtn14.Enabled:=False; sBitBtn15.Enabled:=False; sBitBtn16.Enabled:=False; DateTimePicker5.DateTime:=Now; end;
- الزر sBitBtn8 المسمى Modifier
كود :
if not FGSM.Table8.IsEmpty then begin sEdit14.Text:= FGSM.Table8.FieldValues['N_Bon']; FGSM.Table8.Edit; FGSM.Table8.FieldValues['N_Bon']:='0'; sEdit14.ReadOnly:=True; sEdit15.text:=FGSM.Table8.FieldValues['Somme_Versée']; sEdit15.ReadOnly:=false; DBLookupComBobox1.ReadOnly:=false; DBLookupComBobox2.ReadOnly:=false; DBGrid5.Enabled:=False; sBitBtn7.Enabled:=False; sBitBtn8.Enabled:=False; sBitBtn9.Enabled:=True; sBitBtn10.Enabled:=True; sBitBtn11.Enabled:=False; sBitBtn12.Enabled:=False; sBitBtn13.Enabled:=False; sBitBtn14.Enabled:=False; sBitBtn15.Enabled:=False; sBitBtn16.Enabled:=False; sEdit12.Enabled:=False; end else sBitBtn8.Enabled:=False;
-الزر Valider المسمى sBitBtn9 نكتب:
كود :
Var DBL1,DBL2:String; begin if (Dblookupcombobox1.Text='') Or (Dblookupcombobox2.Text='') Or (sEdit14.Text='') Or (sEdit15.Text='') then showmessage('compliter touts les champs') else begin DBL1:= DBLookupComboBox1.Text; DBL2:= DBLookupComboBox2.Text; if FGSM.Table8.FindKey( [(sEdit14.text)] ) then begin ShowMessage ('N°_Bon Existe Déjà ,Essayez à Nouveau') ; if FGSM.Table8.FindKey(['']) then FGSM.Table8.Delete; sBitBtn7.Enabled:=true; sBitBtn8.Enabled:=true; sBitBtn9.Enabled:=False; sBitBtn10.Enabled:=False; sBitBtn11.Enabled:=true; sBitBtn12.Enabled:=true; sBitBtn13.Enabled:=true; sBitBtn14.Enabled:=true; sBitBtn15.Enabled:=true; sBitBtn16.Enabled:=true; end else if (Not FGSM.Table8.FindKey([(sEdit14.text)])) then begin FGSM.Table8.Edit; FGSM.Table8.FieldValues['N_Bon']:=sEdit14.Text; FGSM.Table8.FieldValues['Code_Client']:=DBL1; FGSM.Table8.FieldValues['Code_com_C']:=DBL2; FGSM.Table8.FieldValues['Somme_Versée']:=sEdit15.Text; FGSM.Table8.FieldValues['Date_Versement']:=DateTimePicker3.DateTime; FGSM.Table8.Post; sBitBtn7.Enabled:=true; sBitBtn8.Enabled:=true; sBitBtn9.Enabled:=False; sBitBtn10.Enabled:=False; sBitBtn11.Enabled:=true; sBitBtn12.Enabled:=true; sBitBtn13.Enabled:=true; sBitBtn14.Enabled:=true; sBitBtn15.Enabled:=true; sBitBtn16.Enabled:=true; sEdit12.Enabled:=True; sEdit12.SetFocus; DBGrid5.Enabled:=True; sEdit14.ReadOnly:=True; sEdit15.ReadOnly:=True; DBLookupComboBox1.ReadOnly:=True; DBLookupComboBox2.ReadOnly:=True; end; end; end;
-الزر Anuler المسمى sBitBtn10 :
كود :
FGSM.Table8.Cancel; sBitBtn7.Enabled:=true; sBitBtn8.Enabled:=true; sBitBtn9.Enabled:=False; sBitBtn10.Enabled:=False; sEdit12.Enabled:=True; sEdit12.SetFocus; sEdit14.Clear; sEdit15.Clear; sEdit14.ReadOnly:=True; sEdit15.ReadOnly:=True; DBLookupComboBox1.ReadOnly:=True; DBLookupComboBox2.ReadOnly:=True; DBGrid5.Enabled:=True; if FGSM.Table8.IsEmpty then begin sBitBtn11.Enabled:=False; sBitBtn12.Enabled:=False; sBitBtn13.Enabled:=False; sBitBtn14.Enabled:=False; sBitBtn15.Enabled:=False; sBitBtn16.Enabled:=true; end else begin sBitBtn11.Enabled:=True; sBitBtn12.Enabled:=true; sBitBtn13.Enabled:=true; sBitBtn14.Enabled:=true; sBitBtn15.Enabled:=true; sBitBtn16.Enabled:=true end;
-الزر Supprimer المسمى sBitBtn11 :
كود :
if not FGSM.table8.IsEmpty then begin if MessageDLG ('êtes vous sûr de vouloir suprimer l''enregistrement ?' , MtConfirmation,[MbYes,MbNo],0)=MrYes then FGSM.Table8.Delete; end else if FGSM.table8.IsEmpty then begin sBitBtn11.Enabled:=False; sBitBtn12.Enabled:=False; sBitBtn13.Enabled:=False; sBitBtn14.Enabled:=False; sBitBtn15.Enabled:=False; sBitBtn16.Enabled:=False; end;
-الزر Vider LaTableالمسمى sBitBtn12
كود :
if messageDLG ('cette méthode de suppression conduira à la perte de toutes les données ' ,MTinformation,[mbyes,mbcancel],0) =MRyes then if messageDLG ('êtes vous sûr de vouloir vider toute les données de la table Bon_Versement ?',MTconfirmation,[mbyes,mbno],0) =MRyes then begin sBitBtn11.Enabled:=False; sBitBtn12.Enabled:=False; sBitBtn13.Enabled:=False; sBitBtn14.Enabled:=False; sBitBtn15.Enabled:=False; sBitBtn16.Enabled:=False; While not FGSM.table8.isEmpty Do FGSM.table8.Delete; end;
-الزر Suivant المسمى sBitBtn13
كود :
if Not FGSM.Table8.IsEmpty then begin FGSM.Table8.Next; sEdit14.Text:=FGSM.Table8.FieldValues['N_Bon']; DblookupCombobox1.KeyValue:=FGSM.Table8.FieldValues['Code_Client']; DblookupCombobox2.KeyValue:=FGSM.Table8.FieldValues['Code_com_C']; sEdit15.Text:=FGSM.Table8.FieldValues['Somme_Versée']; DateTimePicker3.DateTime:=FGSM.Table8.FieldValues['Date_Versement']; end;
- نفس الشيء بالنسبة الأزرار: Précedent-Début-Fin فقط نكتب مكان Next ما يلزم ( Prior-First-Last)

أخيرا في الخاصية DataSource للـ DBGrid5 نكتب (FGSM.DataSource8) ، و مع نفس العنصر نختار ما يناسب من الأحداث مثل OnKeyDown+UP :
كود :
if Not FGSM.Table8.IsEmpty then begin sEdit14.Text:=FGSM.Table8.FieldValues['N_Bon']; DblookupCombobox1.KeyValue:=FGSM.Table8.FieldValues['Code_Client']; DblookupCombobox2.KeyValue:=FGSM.Table8.FieldValues['Code_com_C']; sEdit15.Text:=FGSM.Table8.FieldValues['Somme_Versée']; DateTimePicker3.DateTime:=FGSM.Table8.FieldValues['Date_Versement'];
.

بالتوفيق.

... / يتبع / ...


الملفات المرفقة
.rar   12_GSM.rar (الحجم : 41.41 ك ب / التحميلات : 1,085)
الرد
#30
- الجزء 4 من الدرس العاشر

على الفورم FFactureEtStatistique دائما ، نمر إلى الصفحة : Historique Client ،

* على هذه الأخيرة نريد إتاحة امكانية معرفة كل عمليات الشراء التي قام بها زبون معين ، و كذا معرفة مجموع ما دان به ، مرفق بمجموع المبالغ المدفوعة تحت الحساب و بذلك معرفة رصيده الحالي و بما يدين أحدنا للآخر ، كما يمكن إتاحة معرفة حوصلة عمليات الشراء المقيدة بين تاريخين و القيمة المالية لكل هذه العمليات . دون الخوض بالحاجة و الغرض من هذه الإتاحة فهي لأسباب عديدة و معروفة .

نبدأ بعون الله:

نجعل ReadOnly=True لكل من العناصرsEdit8-9-10 .
- سوف نستعمل العنصرين Query6-7 .

قبل كل شيء ، و رغم أنني نبهت في الدرس 4 ، على عدم استعمال اسماء حقول محجوزة في لغة الإستفسار البنيوي (SQL) ، إلا أنني سميت حقل التاريخ في الجدول Vente باسم Date عوضا مثلا عن Date_Vente ، مما سبب لي مشكلة أثناء العمل على Historique Client ، و هو الشيء الذي جعلني أكتشفه . فمعذرة مرة أخرى (و بما أننا مبتدئين أخي الكريم ، فحتى في هذه الأخطاء و العمل على تصحيحها فيه فائدة) .
الحل ببساطة نعدل الجدول بتسمية الحقل بــ (Date_Vente) ، و نعدل هذه التسمية في مكان استعمالها ، و لم نستعملها إلا في الفورم FGSM و FFactureEtStatistique ، يعني كلما وجدنــا ('Date') نغيرها بــ ('Date_Vente') .


- الآن في الخاصية SQL للــ Query6 نكتب :
كود :
SELECT * FROM Vente Where Code_Client=:Code_Client and Date_Vente Between :Date01 and :Date02
و في الخاصية Params نحدد : Code_Client و نجعل DataType تأخذ القيمة ftString . و نفس الشيء مع Date01-02 نجعل ftDate .



- الآن في الخاصية SQL للــ Query7 نكتب :
كود :
SELECT * FROM Vente Where Code_Client=:Code_Client
و من Params نحدد : Code_Client و نجعل DataType تأخذ القيمة ftString.



- في الحدث OnChange للــ sEdit7 :
كود :
sEdit12.text:=sEdit7.Text ; sEdit16.text:=sEdit7.Text ; sEdit9.text:=sEdit13.Text ; sEdit8.Text:=sEdit17.text; if (sCheckBox1.Checked=True) and (sEdit7.text<>'') then begin Query6.Close; Query6.ParamByName('Code_Client').Value:=sEdit7.text; DbGrid2.DataSource:=DataSource6; Query6.Open; (* Majmoo3eClient_TTC_Date *) RecordPlaceClient_TTC_Date := Query2.GetBookmark; MajmoueClient_TTC_Date:=0; Query6.Active:=true; Query6.First; while not Query6.Eof Do begin MajmoueClient_TTC_Date:= MajmoueClient_TTC_Date +Query6.FieldByName('Prix_TTC').AsCurrency; Query6.Next; end; sLabel19.Caption:=CurrToStr(MajmoueClient_TTC_Date); sLabel19.Caption:=FormatFloat('0.00 DA',StrtoFloat(sLabel19.Caption)); if FGSM.Table4.Locate('Code_Client',sEdit7.Text,[ ]) then sLabel17.Caption:=sEdit7.Text +' / '+FGSM.Table4.FieldValues['Code_Com_C'] else sLabel17.Caption:='. . . . . . . . . . . . . . . . . . '; end; if (sCheckBox1.Checked=False) and (sEdit7.text<>'') then begin Query7.Close; Query7.ParamByName('Code_Client').Value:=sEdit7.text; DbGrid2.DataSource:=DataSource7; Query7.Open; (* Majmoo3eClient_TTC *) RecordPlaceClient_TTC := Query7.GetBookmark; MajmoueClient_TTC:=0; Query7.Active:=true; Query7.First; while not Query7.Eof Do begin MajmoueClient_TTC:= MajmoueClient_TTC +Query7.FieldByName('Prix_TTC').AsCurrency; Query7.Next; end; sLabel19.Caption:=CurrToStr(MajmoueClient_TTC); sLabel19.Caption:=FormatFloat('0.00 DA',StrtoFloat(sLabel19.Caption)); if FGSM.table4.Locate('Code_Client',sEdit7.Text,[ ]) then sLabel17.Caption:=sEdit7.Text +' / '+FGSM.table4.FieldValues['Code_Com_C'] else sLabel17.Caption:='. . . . . . . . . . . . . . . . . . '; end;



- نضغط مرتين على sCheckBox1 : نكتب
كود :
if sCheckBox1.Checked=true then begin sPanel5.Visible:=true; DateTimePicker1.Visible:=true; DateTimePicker2.date:=Now; DateTimePicker2.Visible:=true; DateTimePicker1.SetFocus; end else if sCheckBox1.Checked=false then begin sPanel5.Visible:=false; DateTimePicker1.Visible:=false; DateTimePicker2.Visible:=false; sEdit7.SetFocus; end;



- في الحدث Onchange للــ DateTimePicker1 نكتب:
كود :
Query6.Close; Query6.ParamByName('date01').AsDate:=DateTimePicker1.date; Query6.ParamByName('date02').AsDate:=DateTimePicker2.date; Dbgrid2.DataSource:=datasource6; Query6.Open; if (sCheckBox1.Checked=true) and (sEdit7.text<>'') then begin Query6.Close; Query6.ParamByName('Code_Client').Value:=sEdit7.text; DbGrid2.DataSource:=DataSource6; Query6.Open; (* Majmoo3eClient_TTC_Date *) RecordPlaceClient_TTC_Date := Query6.GetBookmark; MajmoueClient_TTC_Date:=0; Query6.Active:=true; Query6.First; while not Query6.Eof Do begin MajmoueClient_TTC_Date:= MajmoueClient_TTC_Date +Query6.FieldByName('Prix_TTC').AsCurrency; Query6.Next; end; sLabel19.Caption:=CurrToStr(MajmoueClient_TTC_Date); sLabel19.Caption:=FormatFloat('0.00 DA',StrtoFloat(sLabel19.Caption)); if FGSM.Table4.Locate('Code_Client',sEdit7.Text,[ ]) then slabel17.Caption:=sEdit7.Text +' / '+FGSM.table4.FieldValues['Code_Com_C'] else slabel17.Caption:='. . . . . . . . . . . . . . . . . . '; end;
نجعل الخاصية OnEnter لهذا العنصر تأخذ القيمة DateTimePicker1Change
كما نجعل نفس القيمة للحدث OnChange للـعنصـر DateTimePicker2 .


* أخيرا نعرف عملية حساب المجموع : قبل implementation نكتب :
كود :
(*Pour Majmoo3eClient_TTC_Date*) MajmoueClient_TTC_Date: Currency; RecordPlaceClient_TTC_Date: TBookmark ; (*Pour Majmoo3eClient_TTC*) MajmoueClient_TTC: Currency; RecordPlaceClient_TTC: TBookmark ;

* المشروع مرفق ، حاول العمل و تدبر أمورك ، و قارن مع المرفق .

- المطلوب : هناك شبه كامل و واضح بالنسبة لهذا العمل و ما يلزم فعله على الصفحة Historique Fournisseur ، المطلوب استعمال Query8-9 على التوالي و اتمام مايلزم .


بالتوفيق .


.../ يتبــع / ....


الملفات المرفقة
.rar   13_GSM.rar (الحجم : 42.03 ك ب / التحميلات : 1,113)
الرد


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


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