15-10-12, 08:07 AM
كاتب الموضوع : أحمد جمال
بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .
لأن التقارير هي أكثر شاشات البرنامج تشعباً فقد تركناها مؤقتاً لاكمال باقي الاجزاء ومن ثم العودة إليها ، ولذا سوف ننتقل إلى قائمة ( مهام ) مباشرة .
وكما قمنا مع شاشة ( تعديل نوع ومصنع ) والتي دمجنا فيها الشاشتين معاً ، فكذلك سنفعل مع شاشتي البيع والشراء . واللتان تحتاجان إلى المحتويات التالية :
السلام عليكم ورحمة الله وبركاته .
لأن التقارير هي أكثر شاشات البرنامج تشعباً فقد تركناها مؤقتاً لاكمال باقي الاجزاء ومن ثم العودة إليها ، ولذا سوف ننتقل إلى قائمة ( مهام ) مباشرة .
وكما قمنا مع شاشة ( تعديل نوع ومصنع ) والتي دمجنا فيها الشاشتين معاً ، فكذلك سنفعل مع شاشتي البيع والشراء . واللتان تحتاجان إلى المحتويات التالية :
* أداة عنوان
Lable لتوضيح نوع العملية .
* قائمة تحتوي على البضائع الموجودة حالياً .
* حقل التاريخ والذي سيكون من نوع جديد هو أداة
* حقل التاريخ والذي سيكون من نوع جديد هو أداة
MaskEdit وسنرى كيف نستخدمها .
* الكمية المطلوبة للبيع أو الشراء . وبجانبها
Option لتحديد هل العدد بالصندوق أم بالوحدة . واجعل خاصية Value=True للوحدة .
* السعر المدفوع في العملية .
* زر لاضافة العملية ، وزر لاغلاق الشاشة .
وقبل أن نبدأ في شرح استخدام أداة نعود إلى الموديول ، فكما جعلنا T1 ترمز لجدول البضائع ، T2,T3 لجدولي الانواع والموردين ، فإننا سنجعل T5 ترمز لجدول المبيعات ... أما T4 فستظل من أجل الاستعلامات .
* زر لاضافة العملية ، وزر لاغلاق الشاشة .
وقبل أن نبدأ في شرح استخدام أداة نعود إلى الموديول ، فكما جعلنا 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
والآن من الخصائص اضغط على (...) التي بجانب Custem ستظهر لك شاشة بأهم خصائص هذه الأداة ، ومنها :
Format
: والتي سنضع فيها التنسيق المناسب لعملية التاريخ ، وهو :
dd/mm/yyyy
، وتحدد هذه الخاصية كيفية قراءة وعرض الرقم لاحقاً . وبهذا نستطيع أن نقول أن الناتج سيكون على شكل تاريخ ، لكننا لا يمكن بهذه الخاصية أن نمنع المستخدم من ادخال أكثر من 10 خانات ( عدد خانات التاريخ ) ولا أن نمنعه من ادخال حروف .
Mask
: تحدد هذه الخاصية ما يمكن أن ندعوه ( قناع الإدخال ) والذي سيحدد طبيعة المدخلات وعددها ، ولأننا لا نحتاج سوى أرقام فسوف نستخدم الرمز # لتشكيل قناع بالشكل التالي : ##/##/####
Prompt Char
: الحرف الذي سيوضع في مكان الفارغ ( لاحظ أنه سيوضع كصورة فقط في حين أنه لن يؤثر على القيمة ) ولنجعلها 0 مثلاً .
بعدها قم باكمال الفورم بالطريقة التي نقوم بها مع كل فورم .
ولا تنس اضافة أمر Refresh_Me والذي سنقوم ببرمجته لاحقاً .
لماذا لم استخدم أداة
ولا تنس اضافة أمر 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 ، وذلك حتى نتيح للمستخدم استخدام البرنامج كحافظة لعمليات البيع والشراء ليس إلا .
وفي الواقع لعدة أسباب ، أولها أن هذه التعلمية تعطينا قيمة بالشكل التالي : 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]
يتبع ...