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

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


التحكم في عمليات البيع والشراء .


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


وبأسفل الفورم يوجد زرين ، للحذف ، وللانهاء . كما يوجد بأعلاه زر ( نفذ ) والذي يقوم بتحديث الفورم حسب التاريخ أو العملية الجديدة .
ونسمي هذا الفورم Frm_Sel_Bay2 .

ولا تنس لهذا الفورم أن تجعل خاصية MDIChild = True .
وكا هي العادة عندما نشغل أي فورم تابع للفورم MDIForm1 .

Frm_Sel_Bay2.Show


لكن في حدث Form_Load نضبط الأبعاد ونستدعي حدث Refresh_Me ، ونجعل حقل التاريخ يحتوي على تاريخ اليوم الحالي :
** نضبط الأبعاد فيما إذا كنا نريد شاشة بارزة.



كود :
[align=right]Me.Height = 4335
Me.Width = 5895
Me.Left = ((MDIForm1.Width - Me.Width) / 2)
Me.Top = ((MDIForm1.Height - Me.Height) / 2) - 400
Me.Show

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

Refresh_Me[/align]


وسنرى الآن على ماذا سيحتوي أمر
Refresh_Me :

في بداية الأمر نحتاج إلى استدعاء دالة باسم Flex تقوم باعداد الجدول .
وستقوم هذه الدالة بمعرفة عدد العمليات بناء على عمليات البيع أو الشراء أولاً .



كود :
[align=right]If Option1.Value = True Then
SQL = "select count(*) as cnt from tb_sel_bay where kind=0 and date=#" & Format(MaskEdBox1.Text, "mm/dd/yyyy") & "#"
Else
SQL = "select count(*) as cnt from tb_sel_bay where kind=1 and date=#" & Format(MaskEdBox1.Text, "mm/dd/yyyy") & "#"
End If
Set T4 = D1.OpenRecordset(SQL, dbOpenDynaset)
MyCnt = T4!cnt[/align]
حيث نكون قد عرفنا المتغير MyCnt في Genral لإننا سنستخدمه لاحقاً .

ثم تجهز الجدول :



كود :
[align=right]MSFlexGrid1.Clear
MSFlexGrid1.Cols = 6
MSFlexGrid1.Rows = MyCnt + 1

MSFlexGrid1.Row = 0
MSFlexGrid1.Col = 0
MSFlexGrid1.Text = "ت"
MSFlexGrid1.Col = 1
MSFlexGrid1.Text = "رقم"
MSFlexGrid1.Col = 2
MSFlexGrid1.Text = " اسم البضاعة"
MSFlexGrid1.Col = 3
MSFlexGrid1.Text = "التاريخ"
MSFlexGrid1.Col = 4
MSFlexGrid1.Text = "الكمية"
MSFlexGrid1.Col = 5
MSFlexGrid1.Text = "السعر"

MSFlexGrid1.ColAlignment(0) = 5
MSFlexGrid1.ColAlignment(1) = 5
MSFlexGrid1.ColAlignment(2) = 3
MSFlexGrid1.ColAlignment(3) = 5
MSFlexGrid1.ColAlignment(4) = 5
MSFlexGrid1.ColAlignment(5) = 5

MSFlexGrid1.ColWidth(0) = 500
MSFlexGrid1.ColWidth(1) = 500
MSFlexGrid1.ColWidth(2) = 1500
MSFlexGrid1.ColWidth(3) = 1200[/align]
نستدعي هذا الأمر في بداية اجراء


Refresh_Me .


ثم ننتقل إلى أول سجل في الجدول T5 إذا لم تكن فارغة ، ونبدأ في الدوران من أول سجل إلى آخر سجل ووضع السجل الذي له Kind والتاريخ المناسب في الجدول .



كود :
[align=right]Sub Refresh_Me()
Flex
Dim Key, n As Integer
n = 0
If T5.RecordCount <> 0 Then T5.MoveFirst
If Option1.Value = True Then
Key = 0
Else
Key = 1
End If

For i = 0 To T5.RecordCount - 1
If T5!kind = Key And Format(T5!Date, "dd/mm/yyyy") = MaskEdBox1.Text Then
n = n + 1
MSFlexGrid1.Row = n
MSFlexGrid1.Col = 0
MSFlexGrid1.Text = n
MSFlexGrid1.Col = 1
MSFlexGrid1.Text = T5!Number
MSFlexGrid1.Col = 2
SQL = "select name from tb_product where number=" & T5!product & ""
Set T4 = D1.OpenRecordset(SQL, dbOpenDynaset)
MSFlexGrid1.Text = T4!Name
T4.Close
MSFlexGrid1.Col = 3
MSFlexGrid1.Text = T5!Date
MSFlexGrid1.Col = 4
MSFlexGrid1.Text = T5!Count
MSFlexGrid1.Col = 5
MSFlexGrid1.Text = T5!price
End If
T5.MoveNext
Next i
End Sub[/align]
هل تعرف أين نحتاج هذا الامر أيضاً ... في زر ( تنفيذ ) . حيث سنستدعي أمر Refresh_Me .


التعديل في عمليات البيع والشراء .


سنضيف زراً جديداً بجانب زر الحذف ، ونسميه تعديل . ويختص هذا الزر بتعديل محتويات البضاعة الحالية إلى محتويات جديدة .

سوف نقوم باعداد فورم سريع يحتوي على خانات التعديل ، وسيكون عبارة عن نسخة من فورم اضافة عملية بيع وشراء ، إلا أن النوع يوضع افتراضياً كما توضع البيانات افتراضياً أيضاً . كما ستحتوي على Varibale متغير يوضح رقم العملية التي نقوم بتعديلها حالياً . وسنقوم بذلك عن طريق تعريفه Public .



كود :
[align=right]Public Num As Integer[/align]
كما أننا لن نعيد اظهار ( وحدة - صندوق ) مرة اخرى .
أيضاً سيظهر اسم البضاعة على أنه ثابت Lable .


والآن إلى أمر اظهار هذا الفورم :



كود :
[align=right]If MSFlexGrid1.Row = 0 Then Exit Sub

MSFlexGrid1.Col = 1
Frm_Edit_SP.Num = MSFlexGrid1.Text
MSFlexGrid1.Col = 2
Frm_Edit_SP.Label3.Caption = MSFlexGrid1.Text
MSFlexGrid1.Col = 3
Frm_Edit_SP.MaskEdBox1.Text = Format(MSFlexGrid1.Text, "dd/mm/yyyy")
MSFlexGrid1.Col = 4
Frm_Edit_SP.Text2.Text = MSFlexGrid1.Text
MSFlexGrid1.Col = 5
Frm_Edit_SP.Text1.Text = MSFlexGrid1.Text

Frm_Edit_SP.Show 1
Refresh_Me[/align]
يتبع ...
}}}
تم الشكر بواسطة:
#2
ولنعد الآن إلى الفورم الجديد ولنر كيف ستتم عملية التعديل .
في البداية نتأكد من ادخال عدد للبضاعة :


كود :
[align=right]If Val(Text2.Text) <= 0 Then
MsgBox "لا بد من ادخال الكمية", vbExclamation + arabic, "اضافة عملية"
Exit Sub
End If[/align]
ثم ننتقل إلى السجل صاحب العملية الحالية :


كود :
[align=right]If T5.RecordCount = 0 Then Exit Sub
T5.MoveFirst
For i = 0 To T5.RecordCount - 1
If T5!Number = lbl_num.Caption Then Exit For
T5.MoveNext
Next i[/align]
والآن تعني عملية التعديل هذه أن نقوم باعادة الأوضاع كما كانت عليه قبل هذه العملية ، ومن ثم تنفيذ عملية البيع ( حذف العملية القديمة ، اضافة العملية الجديدة ) تقريباً .

لذا سننتقل أولاً إلى البضاعة المطلوبة :



كود :
[align=right]If T1.RecordCount <> 0 Then T1.MoveFirst
For i = 0 To T1.RecordCount - 1
If T1!Number = T5!product Then Exit For
T1.MoveNext
Next i[/align]
ثم نقوم تحديث معلومات

T5 وذلك بالشكل التالي :





كود :
[align=right]If T5!kind = 0 Then
BUY
Else
SEL
End If[/align]
حيث أن Sel و Buy هما العمليتان اللذان قمنا ببرمجتهما خلال الاضافة مع بعض التعديلات البسيطة :





كود :
[align=right]Sub BUY()
If Val(Text2.Text) > T1!Count + T5!Count Then
MsgBox "الكمية التي تطلبها غير متوفرة وهي : " & Val(Text2.Text) & " الموجود - إذا تم التعديل - حالياً : " & T1!Count + T5!Count, vbExclamation + arabic, "كمية غير متوفرة"
Exit Sub
End If

T1.Edit
T1!Count = T1!Count + T5!Count
T1!Count = T1!Count - Val(Text2.Text)
T1.Update

With T5
.Edit
!product = T1!Number
!Date = MaskEdBox1.Text
!Count = Val(Text2.Text)
!price = Val(Text1.Text)
!kind = 0
.Update
End With

MsgBox "تمت العملية بنجاح ، يوجد من البضاعة حالياً : " & T1!Count & " وحدة", vbInformation + arabic, "اتمام العملية"
Unload Me
End Sub[/align]
و





كود :
[align=right]Sub SEL()
T1.Edit
T1!Count = T1!Count - T5!Count
T1!Count = T1!Count + Val(Text2.Text)
T1.Update

With T5
.Edit
!product = T1!Number
!Date = MaskEdBox1.Text
!Count = Val(Text2.Text)
!price = Val(Text1.Text)
!kind = 1
.Update
End With

MsgBox "تمت العملية بنجاح ، يوجد من البضاعة حالياً : " & T1!Count & " وحدة", vbInformation + arabic, "اتمام العملية"
Unload Me
End Sub[/align]

تغيير لون الصف المحدد :


لنحقق عملية تغير لون الصف الذي حددناه نحتاج بادئ ذي بدئ إلى عمل دالة تقوم بميح جميع الالوان الموجودة في MSFlexGrid ، وسيسير التغيير بعدد الصفوف وهو العدد المخزن في المتغير Mycnt ، وبالعرض بعدد الأعمدة وهو 5 مع تجاهل العمود الرئيسي والصف الرئيسي ... ولنر الآن هذه الدالة :




كود :
[align=right]Sub Clear_Color()
For i = 1 To MyCnt
For j = 1 To 5
MSFlexGrid1.Row = i
MSFlexGrid1.Col = j
MSFlexGrid1.CellBackColor = QBColor(15)
Next j
Next i[/align]
حيث أن QBColor(15) تعني الأبيض لمزيد من المعلومات حول الألوان في فيجوال بيسك ، راجع الدرس التالي :الموجود في القسم العام .


ويتم اطلاق هذه الدالة بداية في حدث النقر على الجدول . ولكن بعد أن نحتفظ برقم الصف الحالي في متغير ما .
ماذا سيحدث أيضاً في أمر النقر على الجدول Click ، كل ما لدينا أننا سنبدا من العمود الثاني وحتى السادس مع ثبات الصف ونجعل اللون أحمراً .
لاحظ الكود التالي :





كود :
[align=right]If MSFlexGrid1.Row = 0 Then Exit Sub
Now_Row = MSFlexGrid1.Row
Clear_Color
MSFlexGrid1.Row = Now_Row
For i = 1 To 5
MSFlexGrid1.Col = i
MSFlexGrid1.CellBackColor = QBColor(12)
Next i[/align]
*** ويمكن بدلاً من مسح كل الجدول باللون الأبيض مع كل ضغطة عليه ، يمكننا مسح فقط آخر سجل تم تحديده ، وذلك بتخزين قيمة آخر سجل بعد عملية التحديد .


سنبدأ الآن في برمجة زر الحذف :

في بداية عملية الحذف نقوم باظهار الرسالة التقليدية ، هل ما زلت تريد الاستمرار ؟ وذلك بعد التأكد من أننا لسنا في Row=0 .




كود :
[align=right]If MSFlexGrid1.Row = 0 Then Exit Sub
Dim sure
sure = MsgBox("هل تريد بالتأكيد حذف هذه العملية ؟", vbQuestion + vbYesNo + arabic, "")
If sure = vbNo Then Exit Sub[/align]
والآن سنظهر خياراً جديداً ، هل تريد حذف هذه العملية وكافة النتائج التي ترتبت عليها ( زيادة أو انقاص البضاعة ) أم الحذف المجرد فقط ، أم الغاء الأمر بالكلية ؟





كود :
[align=right]sure = MsgBox("هل تريد حذف العملية وكافة النتائج المترتبة عليها ( زيادة أو نقص للبضاعة ) أم الحذف فقط ؟", vbQuestion + vbYesNoCancel + arabic, "تأكيد الحذف")
If sure = vbCancel Then Exit Sub[/align]
والآن نتنقل كما هي العادة إلى السجل المطلوب :





كود :
[align=right]MSFlexGrid1.Col = 1
If T5.RecordCount <> 0 Then T5.MoveFirst
MsgBox MSFlexGrid1.Text
For i = 0 To T5.RecordCount - 1
If T5!Number = MSFlexGrid1.Text Then Exit For
T5.MoveNext
Next i[/align]
والآن إذا كان يريد ازالتها مع كافة النتائج المترتبة عليها فسنقوم بعمل ذلك ، وذلك بالشكل التالي :





كود :
[align=right]If sure = vbYes Then
If T1.RecordCount <> 0 Then T1.MoveFirst
For i = 0 To T1.RecordCount - 1
If T1!Number = T5!product Then Exit For
T1.MoveNext
Next i
T1.Edit
Select Case T5!kind
Case 0
T1!Count = T1!Count + T5!Count
Case 1
T1!Count = T1!Count - T5!Count
End Select
T1.Update
End If[/align]
ثم يأتي دور أمر الحذف .




كود :
[align=right]T5.Delete[/align]
أخيراً لا تنس أن تستدعي أمر Refresh_Me ثانية .




كود :
[align=right]Refresh_Me[/align]



تعديلات بسيطة في أمر Refresh_Me الخاص بشاشة التحكم في المبيعات .


التعديل الأول بسيط جداً ، كل ما عليك هو اضافة الامر التالي لنهاية الإجراء :




كود :
[align=right]MSFlexGrid1.Row = 0[/align]
وذلك لكي يقف المؤشر على ( لاشيء ) بعد هذه العملية .

التعديل الثاني هو استخدام Frm_Wait في العملية ، لذلك سنضع الأمر التالي قبل حلقة التكرار :




كود :
[align=right]Frm_Wait.Show
Frm_Wait.ProgressBar1.Max = T5.RecordCount
Frm_Wait.ProgressBar1.Min = 0
Frm_Wait.ProgressBar1.Value = 0[/align]
وبداخل حلقة التكرار نكتب الأمر التالي :




كود :
[align=right]Frm_Wait.ProgressBar1.Value = Frm_Wait.ProgressBar1.Value + 1
DoEvents[/align]

وفي نهاية الكود :




كود :
[align=right]Unload Frm_Wait[/align]
وذلك كما تعلمنا سابقاً في Frm_Show .


والملف في المرفقات ...


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



الملفات المرفقة
.zip   prog12.zip (الحجم : 185.69 ك ب / التحميلات : 79)
}}}
تم الشكر بواسطة: أبو البراء الجزائري


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  الدرس الرابع والثلاثون والأخير - نبذة عن العملية العكسية + تجهيز البرنامج على Cd RaggiTech 0 11,107 15-10-12, 09:10 AM
آخر رد: RaggiTech
  الدرس الثالث والثلاثون - كيفية عمل اعداد Setup للبرنامج RaggiTech 0 3,978 15-10-12, 09:08 AM
آخر رد: RaggiTech
  الدرس الثاني والثلاثون - التحويل إلى exe RaggiTech 0 4,063 15-10-12, 09:07 AM
آخر رد: RaggiTech
  الدرس الحادي والثلاثون - تعددية المستخدمين - البحث وطباعة الفواتير - التعليمات ... RaggiTech 2 4,951 15-10-12, 09:05 AM
آخر رد: RaggiTech
  الدرس الثلاثون - التعامل مع شريط الأدوات ToolBar RaggiTech 0 3,822 15-10-12, 08:59 AM
آخر رد: RaggiTech
  الدرس التاسع والعشرون - التعامل مع أشرطة الحالة Statues Bar RaggiTech 0 3,602 15-10-12, 08:57 AM
آخر رد: RaggiTech
  الدرس الثامن والعشرون -الطباعة في البرنامج . RaggiTech 4 5,290 15-10-12, 08:56 AM
آخر رد: RaggiTech
  الدرس السابع والعشرون - مقدمة إلى التعامل مع التقارير من خلال DataReport RaggiTech 2 6,105 15-10-12, 08:45 AM
آخر رد: RaggiTech
  الدرس السادس والعشرون - التقارير اليومية ، والتقارير بين تاريخين RaggiTech 1 4,347 15-10-12, 08:39 AM
آخر رد: RaggiTech
  الدرس الخامس والعشرون - الإحصائيات والرسوم البيانية RaggiTech 0 3,766 15-10-12, 08:37 AM
آخر رد: RaggiTech

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


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