![]() |
|
تعلم معي خطوة خطوة صنع برنامج لتسيير المخزون و التسويق - نسخة قابلة للطباعة +- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum) +-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3) +--- قسم : دروس دلفي للمبتدئين (https://delphi4arab.net/forum/forumdisplay.php?fid=13) +--- الموضوع : تعلم معي خطوة خطوة صنع برنامج لتسيير المخزون و التسويق (/showthread.php?tid=293) |
تعلم معي خطوة خطوة صنع برنامج لتسيير المخزون و التسويق - nabilkeb - 31-01-2010 السلام عليكم و رحمة الله تعالى و بركاته : هذا الجزء رقم 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;بالتوفيق. ... / يتبع / .... تعلم معي خطوة خطوة صنع برنامج لتسيير المخزون و التسويق - nabilkeb - 01-02-2010 - الآن أخي المتابع سوف نتطرق للواجهة (الفورم) الخاصة بالزبون - المبيعات - المشتريات - المواد : و لأن العناصر المستعملة من أزرار و غيرها مرت معنا في الفورم الرئيسي ، فقد فضلت توفير الجهد و عناء الشرح ، المطلوب منك فقط انشاء عناصر كل فورم و ترتيبها (الملف مرفق) ، و في الدرس الموالي إن شاء الله سوف نباشر برمجة عمل كل زر ، و سيكون الأمر سهلا فعمل كل زر يشبه إلى حد كبير ما مر معنــا. ليبقى أهم شيء بعدها و المتمثل في الفورم FFactureEtStatistique ، هذه المرحلة تتطلب شرح مفصل نظرا لأهميتها البالغة و نظرا لأننا سنستعمل SQL الذي لم يمر معنا أي شيء عنه. و ختاما نأتي لتقارير الطباعة و ينتهي كل شيء. بالتوفيق. تعلم معي خطوة خطوة صنع برنامج لتسيير المخزون و التسويق - nabilkeb - 03-02-2010 السلام عليكم و رحمة الله تعالى و بركاته : هذا الجزء رقم 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;كود : if sCheckBox2.Checked=true then begin
sCheckBox1.Checked:=false;
sCheckBox3.Checked:=false;
sCheckBox4.Checked:=false;
sCheckBox5.Checked:=false;
sComboBox1.SetFocus;
end;- الآن مع 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;نجعل الكابشن الخاصة به تأخذ القيمة 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 ، و نذكر بأن هذا الأخير في غاية الأهمية و سنعطي بعض الوقت قبل الطرح لغرض اللحاق لجميع المشاركين و المهتمين. بالتوفيق . ..../ يتبـع / .... تعلم معي خطوة خطوة صنع برنامج لتسيير المخزون و التسويق - nabilkeb - 03-02-2010 قبل إتمام المشروع بما تبقى ، هناك خطأ أو نقص في برمجة زر الحذف في الفورم FGSM قد يؤدي إلى الوقوع في الخطأ. المطلوب ايجاد هذا النقص و تعديله ، لكي لا تقع فيه أيضا في نفس الزر على الفورم FAchat لأن وظيفة الأزرار تتشابه كما سلف الذكر. بالتوفيق. تعلم معي خطوة خطوة صنع برنامج لتسيير المخزون و التسويق - nabilkeb - 05-02-2010 nabilkeb كتب :قبل إتمام المشروع بما تبقى ، هناك خطأ أو نقص في برمجة زر الحذف في الفورم FGSM قد يؤدي إلى الوقوع في الخطأ. فقط إضافة الشرط المكتوب باللون البرتقالي: كود : 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;- إذن المشروع مرفق ، و به التعديل المذكور إضافة إلى اتمام برمجة وظيفة العناصر على الفورم(المشتريات و الزبائن و الممونين): FAchat - FِClient - FFournisseur فقط تنبيه : عن سهو و من غير قصد لم أطلب فهرسة حقل Code_Client في الجدول Client ، و كذلك Code_Fournisseur في الجدول Fournisseur . - كذلك سميت حقل الإسم التجاري في الجدول Produit بالإسم Code_ Com_F عوضا عن Code_Com_F ، يعني هناك فراغ قبل Com ، و قد تم تعديل التسمية بالجدول و كذا موضوع الفهرسة . فعذرا لأنني أسرع و لا أحضر للطرح ، رغبة مني في اكمال الموضوع لنستفيد من نقد و توجيه و أفكار المحترفين أصحاب الخبرة. -كما ألفت الإنتباه إلى أنني أضيف أشياء طفيفة لا أذكرها ، في المرفقات من مرفق لآخر ، لبساطة تلك الإضافة و لعدم التحدث و طرح كل شيء لكي لا أطيل و ربما تختلط الأمور عليك صديقي ، فإني أراعي أنه قسم للمبتدئين أمثالي. المهم المشروع إلى غاية هذه المرحلة مرفق . لم يتبق الكثير ، في الدرس القادم إن شاء الله سنعمل على الفورم FFactureEtStatistique و بعدها تقارير الطباعة و ينتهي كل شيء. بالتوفيق. تعلم معي خطوة خطوة صنع برنامج لتسيير المخزون و التسويق - nabilkeb - 05-02-2010 قبل بداية الدرس العاشر بحول الله ، و لاختزال الوقت و عدم التكثير من الطرح الممل و الحديث عن إضافة عناصر مرت معنا ، المطلوب انشاء و ترتيب مكونات الفورم FFactureEtStatistique ، إستنادا إلى المرفق ، و سنباشر البرمجة على هذه الأخيرة في الطرح اللاحقا إن شاء الله . بالتوفيق تعلم معي خطوة خطوة صنع برنامج لتسيير المخزون و التسويق - nabilkeb - 06-02-2010 السلام عليكم و رحمة الله تعالى و بركاته : هذا الدرس العاشر من مشروع انجاز برنامج لتسيير المخزون و التسويق (GSM) . نربط DataSource1 مع Query1 من الخاصية DataSet ، و 2 مع 2 ، و هكذا. نربط DBGrid1 مع DataSource1 نحدد العنضر Query1 و من الخاصية SQL في TStrings نكتب كود : Select * from Vente
where N_Fact=: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;-كتبنا في الكود أعلاه الشرط إقتباس : 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;كود : (*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 ;كود : begin
If FGSM.Table7.FindKey( [(sEdit1.text)] ) Then
sEdit6.Text:= FGSM.Table7.FieldValues['Valeur_Reste'] else
sEdit5.Text:=FloatTostr(StrToFloat(sEdit4.Text));
end;كود : 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;كود : 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 ، من الدرس العاشر في المرة المقبلة ، و سيكون المشروع مرفق. بالتوفيق. ... / يتبــع / .... تعلم معي خطوة خطوة صنع برنامج لتسيير المخزون و التسويق - nabilkeb - 06-02-2010 - الجزء2 من الدرس العاشر على الفورم FFactureEtStatistique نمر إلى الصفحة : Consultation des Dettes نعمل عليها لأنها متعلقة بشكل مباشر مع Facture . * أولا لا ننسى مع كل Query نحدد الخاصية : DataBaseName=GSM - الآن نحن بحاجة لانشاء جدولين جديدين ، الأول للديون ، و الثاني خاص بوصل الدفع. لم أذكر هذين الجدولين سابقين ، أولا لعدم الحاجة ، ثانيا لعدم لخبطة الأمور ، لكننا في المرحلة الأخيرة (الدرس ما قبل الأخير) و لن ننشئ بعدهما أي جدول. أسماء الجداول و الحقول و أنواع الحقول ، مرفقة (Table). - في Query2 في الخاصية SQL نكتب: كود : SELECT *
FROM Dettes_Clientكود : SELECT *
FROM Dettes_Client
where Code_Client=:Code_Client- نربط 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;كود : 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;بالتوفيق. .../ يتبع / .... تعلم معي خطوة خطوة صنع برنامج لتسيير المخزون و التسويق - nabilkeb - 07-02-2010 - الجزء 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- من الحدث 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;- نضغط مرتين على DBLookupComboBox1 و نكتب : كود : DBLookupComboBox2.KeyValue:=FGSM.Table4.FieldValues['Code_Com_C'];كود : DBLookupComboBox1.KeyValue:=FGSM.Table4.FieldValues['Code_Client'] ;كود : 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;كود : 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;كود : 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;كود : 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;كود : 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;كود : 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;كود : 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;أخيرا في الخاصية 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'];بالتوفيق. ... / يتبع / ... تعلم معي خطوة خطوة صنع برنامج لتسيير المخزون و التسويق - nabilkeb - 08-02-2010 - الجزء 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- الآن في الخاصية SQL للــ Query7 نكتب : كود : SELECT *
FROM Vente
Where Code_Client=:Code_Client- في الحدث 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;كما نجعل نفس القيمة للحدث 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 على التوالي و اتمام مايلزم . بالتوفيق . .../ يتبــع / .... |