تقييم الموضوع :
  • 1 أصوات - بمعدل 5
  • 1
  • 2
  • 3
  • 4
  • 5
الدرس الخامس عشر - اضافة عمليات البيع والشراء
#1
كاتب الموضوع : أحمد جمال

بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .


لأن التقارير هي أكثر شاشات البرنامج تشعباً فقد تركناها مؤقتاً لاكمال باقي الاجزاء ومن ثم العودة إليها ، ولذا سوف ننتقل إلى قائمة ( مهام ) مباشرة .


وكما قمنا مع شاشة ( تعديل نوع ومصنع ) والتي دمجنا فيها الشاشتين معاً ، فكذلك سنفعل مع شاشتي البيع والشراء . واللتان تحتاجان إلى المحتويات التالية :


* أداة عنوان
Lable لتوضيح نوع العملية .
* قائمة تحتوي على البضائع الموجودة حالياً .
* حقل التاريخ والذي سيكون من نوع جديد هو أداة


MaskEdit وسنرى كيف نستخدمها .
* الكمية المطلوبة للبيع أو الشراء . وبجانبها


Option لتحديد هل العدد بالصندوق أم بالوحدة . واجعل خاصية Value=True للوحدة .
* السعر المدفوع في العملية .
* زر لاضافة العملية ، وزر لاغلاق الشاشة .


وقبل أن نبدأ في شرح استخدام أداة نعود إلى الموديول ، فكما جعلنا T1 ترمز لجدول البضائع ، T2,T3 لجدولي الانواع والموردين ، فإننا سنجعل T5 ترمز لجدول المبيعات ... أما T4 فستظل من أجل الاستعلامات .


كود :
[align=right]Set T5 = D1.OpenRecordset("Tb_Sel_Bay", dbOpenTable)[/align]
والآن ... قم بالضغط على زري Ctrl+T واختر الاداة Microsoft Masked Edit Control 6.0 ، وقم برسمها بالحجم المطلوب على الفورم .
والآن من الخصائص اضغط على (...) التي بجانب Custem ستظهر لك شاشة بأهم خصائص هذه الأداة ، ومنها :

Format


: والتي سنضع فيها التنسيق المناسب لعملية التاريخ ، وهو :
dd/mm/yyyy


، وتحدد هذه الخاصية كيفية قراءة وعرض الرقم لاحقاً . وبهذا نستطيع أن نقول أن الناتج سيكون على شكل تاريخ ، لكننا لا يمكن بهذه الخاصية أن نمنع المستخدم من ادخال أكثر من 10 خانات ( عدد خانات التاريخ ) ولا أن نمنعه من ادخال حروف .
Mask


: تحدد هذه الخاصية ما يمكن أن ندعوه ( قناع الإدخال ) والذي سيحدد طبيعة المدخلات وعددها ، ولأننا لا نحتاج سوى أرقام فسوف نستخدم الرمز # لتشكيل قناع بالشكل التالي : ##/##/####
Prompt Char


: الحرف الذي سيوضع في مكان الفارغ ( لاحظ أنه سيوضع كصورة فقط في حين أنه لن يؤثر على القيمة ) ولنجعلها 0 مثلاً .


بعدها قم باكمال الفورم بالطريقة التي نقوم بها مع كل فورم .
ولا تنس اضافة أمر Refresh_Me والذي سنقوم ببرمجته لاحقاً .


لماذا لم استخدم أداة


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


والآن سنعود إلى MDIForm1 وسنكتب أمر اظهار هذه الشاشة .



كود :
[align=right]Private Sub Operation_Click(Index As Integer)
If T1.RecordCount = 0 Then
MsgBox "لا توجد أي بضائع لعرضها ، لاضافة بضاعة جديدة اختر اضافة - اضافة بضاعة", vbExclamation + arabic, "عرض البضائع"
Exit Sub
End If
Select Case Index
Case 0
Frm_Sel_Bay.lbl_name.Caption = "اضافة عملية بيع"
Frm_Sel_Bay.Refresh_Me
Frm_Sel_Bay.Show 1
Case 1
Frm_Sel_Bay.lbl_name.Caption = "اضافة عملية شراء"
Frm_Sel_Bay.Refresh_Me
Frm_Sel_Bay.Show 1
End Select
End Sub[/align]

ولكن ما هي محتويات أمر


Refresh_Me ؟
سوف يحتوي هذا الأمر على ملء قائمة البضائع بجميع البضائع المتوفرة ، كما سيحتوي على أمر لملء خانة التاريخ بالتاريخ الحالي ، ولأننا لا نريد تغيير التاريخ مع كل عملية اضافة إلى التاريخ الحالي لمنع الازعاج لأنه قد يسجل عمليات تمت باليوم السابق ، وكما كنا نفعل مع كل شاشة فسنكتب الأمر بالشكل التالي :


كود :
[align=right]Public Sub Refresh_Me()
Combo1.Clear
For i = 0 To T1.RecordCount - 1
Combo1.AddItem T1!Name
T1.MoveNext
Next i
Combo1.ListIndex = 0

Dim Myday, Mymonth, Myyear
Myday = Day(Now)
If Len(Myday) = 1 Then Myday = 0 & Myday
Mymonth = Month(Now)
If Len(Mymonth) = 1 Then Mymonth = 0 & Mymonth
Myyear = Year(Now)
MaskEdBox1.Text = Myday & "/" & Mymonth & "/" & Myyear
End Sub[/align]
يبدو الجزء الأول مفهوماً ، أما لماذا قمنا بذلك مع الجزء الثاني ولم نكتب = DateTime.Date مباشرة .
وفي الواقع لعدة أسباب ، أولها أن هذه التعلمية تعطينا قيمة بالشكل التالي : DD/MM/YY أي بصيغة Short ونحن نحتاج إلى صيغة Long للعمل في البرنامج .
أما عند اضافة 0 فهذا لازم لأن تعليمة مثل Day(Now) قد تعطينا مثلاً : 1 أو 2 ، فلابد من تحويلها إلى 01 و 02 .

لا تنس أمر الاغلاق Unload Me في زر الإنهاء .


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



كود :
[align=right]If Val(Text2.Text) <= 0 Then
MsgBox "لا بد من ادخال الكمية", vbExclamation + arabic, "اضافة عملية"
Exit Sub
End If[/align]
وأخيراً نتأكد من نوع العملية المطلوبة ، والتي سننشأ لكل منها اجراء باسمي Sel و Buy ونستدعيهما من خلال الأمر السابق .



كود :
[align=right]If lbl_name.Caption = "اضافة عملية بيع" Then
BUY
Else
SEL
End If[/align]
* برمجة أمر


SEL :

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



كود :
[align=right]T1.MoveFirst
For i = 0 To T1.RecordCount - 1
If T1!Name = Combo1.Text Then Exit For
T1.MoveNext
Next i

Dim cnt
cnt = Val(Text2.Text)
If Option2.Value = True Then cnt = cnt * T1!Box_count[/align]
هنا يتم الانتقال للبضاعة ، ومن ثم تعريف المتغير cnt والذي سيحتوي على العدد ، والذي قد يتم ضربه بعدد الوحدات في الصندوق إذا كان مدخلاً بالصندوق .



كود :
[align=right]With T5
.AddNew
!product = T1!Number
!Date = MaskEdBox1.Text
!Count = cnt
!price = Val(Text1.Text)
!kind = 1
.Update
End With

T1.Edit
T1!Count = T1!Count + cnt
T1.Update[/align]
وهذا الجزء الخاص بالاضافة إلى قاعدة البيانات ، وزيادة عدد البضاعة الموجودة .
أخيراً سنظهر رسالة باتمام العملية والعدد المتوفر حالياً .



كود :
[align=right]MsgBox "تمت العملية بنجاح ، يوجد من البضاعة حالياً : " & T1!Count & " وحدة", vbInformation + arabic, "اتمام العملية"

ونفرغ الخانات تمهيداً لعملية جديدة :


Text1.Text = ""
Text2.Text = ""[/align]

يتبع ...
}}}}
تم الشكر بواسطة:
#2
برمجة الأمر

BUY :

يشبه هذا الأمر SEL إلى حد كبير ، ويختلف عنه في أننا نحتاج أولاً إلى أن نتأكد من توفر الكمية المطلوبة قبل العملية ، وإلا فإننا نظهر رسالة تحذيريه بالكمية الموجودة حالياً .

وكما هي بداية أمر Sel يبدأ الأمر BUY بالانتقال إلى السجل المطلوب وتحديد الكمية في cnt :


كود :
[align=right]T1.MoveFirst
For i = 0 To T1.RecordCount - 1
If T1!Name = Combo1.Text Then Exit For
T1.MoveNext
Next i

Dim cnt
cnt = Val(Text2.Text)
If Option2.Value = True Then cnt = cnt * T1!Box_count[/align]
ومن ثم أمر التأكد من توفر الكمية المطلوبة :


كود :
[align=right]If cnt > T1!Count Then
MsgBox "الكمية التي تطلبها غير متوفرة وهي : " & cnt & "الموجود حالياً : " & T1!Count, vbExclamation + arabic, "كمية غير متوفرة"
Exit Sub
End If[/align]
ومن ثم أوامر الاضافة في قاعدة البيانات ونقص العدد بمقدار العملية :


كود :
[align=right]With T5
.AddNew
!product = T1!Number
!Date = MaskEdBox1.Text
!Count = cnt
!price = Val(Text1.Text)
!kind = 0
.Update
End With

T1.Edit
T1!Count = T1!Count - cnt
T1.Update[/align]

وأخيراً الرسالة التي تفيد اتمام العملية بنجاح :


كود :
[align=right]MsgBox "تمت العملية بنجاح ، يوجد من البضاعة حالياً : " & T1!Count & " وحدة", vbInformation + arabic, "اتمام العملية"[/align]
ونفرغ الخانات تمهيداً لعملية جديدة :


كود :
[align=right]Text1.Text = ""
Text2.Text = ""[/align]

والآن عد مجدداً إلى Frm_Show واكتب في زري ( عملية بيع ، عملية شراء ) الأوامر التالية :

* عملية بيع :


كود :
[align=right]Frm_Sel_Bay.lbl_name.Caption = "اضافة عملية بيع"
Frm_Sel_Bay.Refresh_Me
Frm_Sel_Bay.Combo1.Text = Text1.Text
Frm_Sel_Bay.Text1 = Text4.Text
Frm_Sel_Bay.Show 1

Refresh_Me[/align]
*** هناك خطأ في تسمية الفورم Frm_Sel_Bay ، ولم الحظ انني كتبت a بدلاً من u إلا مؤخراً .
وهذا الخطأ مكرر أيضاً في قاعدة البيانات ( جدول


Tb_Sel_Bay ) أيضاً .



* عملية شراء :


كود :
[align=right]Frm_Sel_Bay.lbl_name.Caption = "اضافة عملية شراء"
Frm_Sel_Bay.Refresh_Me
Frm_Sel_Bay.Combo1.Text = Text1.Text
Frm_Sel_Bay.Text1 = Text4.Text
Frm_Sel_Bay.Show 1

Refresh_Me[/align]
حيث أن هذه الأوامر اظهار طبيعي للشاشة لكن مع وضع اسم البضاعة الحالية كافتراضي ، ووضع السعر الحالي كافتراضي ايضاً ، ومن ثم اطلاق أمر التحديث .


والله الموفق ...
والسلام عليكم ورحمة الله وبركاته .

}}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  الدرس الرابع والثلاثون والأخير - نبذة عن العملية العكسية + تجهيز البرنامج على Cd RaggiTech 0 1,443 15-10-12, 09:10 AM
آخر رد: RaggiTech
  الدرس الثالث والثلاثون - كيفية عمل اعداد Setup للبرنامج RaggiTech 0 1,238 15-10-12, 09:08 AM
آخر رد: RaggiTech
  الدرس الثاني والثلاثون - التحويل إلى exe RaggiTech 0 1,168 15-10-12, 09:07 AM
آخر رد: RaggiTech
  الدرس الحادي والثلاثون - تعددية المستخدمين - البحث وطباعة الفواتير - التعليمات ... RaggiTech 2 1,763 15-10-12, 09:05 AM
آخر رد: RaggiTech
  الدرس الثلاثون - التعامل مع شريط الأدوات ToolBar RaggiTech 0 999 15-10-12, 08:59 AM
آخر رد: RaggiTech
  الدرس التاسع والعشرون - التعامل مع أشرطة الحالة Statues Bar RaggiTech 0 844 15-10-12, 08:57 AM
آخر رد: RaggiTech
  الدرس الثامن والعشرون -الطباعة في البرنامج . RaggiTech 4 1,568 15-10-12, 08:56 AM
آخر رد: RaggiTech
  الدرس السابع والعشرون - مقدمة إلى التعامل مع التقارير من خلال DataReport RaggiTech 2 1,720 15-10-12, 08:45 AM
آخر رد: RaggiTech
  الدرس السادس والعشرون - التقارير اليومية ، والتقارير بين تاريخين RaggiTech 1 1,229 15-10-12, 08:39 AM
آخر رد: RaggiTech
  الدرس الخامس والعشرون - الإحصائيات والرسوم البيانية RaggiTech 0 1,106 15-10-12, 08:37 AM
آخر رد: RaggiTech

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


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