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

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


الحذف .


في هذا الدرس سوف نتعلم كيفية القيام بعملية الحذف ، والتي نستخدم لها الوظيفة Delete .
في البداية لا بد أن نتأكد من أن ثم معلومات في قاعدة البيانات وإلا فإننا لن نقوم بأي شيء ، وقبل ذلك لا بد من التأكد من نيته في الحذف عن طريق اظهار رسالة تحذيريه :



كود :
Dim sure
sure = MsgBox("هل أنت متأكد أنك تريد القيام بحذف هذه البضاعة ؟", vbExclamation + vbYesNo + arabic, "حذف بضاعة")
If sure = vbNo Then Exit Sub
والآن نريد أن نصل إلى السجل المحدد ، وهو الذي يظهر رقمه في Text7.Text ، لاحظ على سبيل المثال الأمر التالي :



كود :
If T1.RecordCount = 0 Then
MsgBox "لا توجد أي بضاعة !", vbExclamation + arabic, "حذف بضاعة"
Exit Sub
End If
والآن فإننا سوف نتنقل من خلالها حتى العثور على السجل المطلوب :


كود :
T1.MoveFirst
For i = 0 To T1.RecordCount - 1
If T1!Number = Text7.Text Then Exit For
T1.MoveNext
Next i
ولكن هذه الطريقة تصبح أقل فاعلية في حالة كون عدد السجلات كبيراً . من الأفضل دائماً استخدام جمل لغة الاستعلامات الهيكلية لحذف السجل في جملة بهذا الشكل مثلاً :

كود :
SQL = "delete * from Tb_Product where number=" & Text7.Text
المشكلة أن الداو Dao لا تدعم أياً من جمل الإستعلام ما عدا جملة Select - حسبما أعلم - . ولهذا سوف اضطر - مرغماً - على استخدام حلول بديلة أكثر جهداً وأقل فاعلية .


والآن سنقوم بحذف السجل الذي عثرنا عليه :


كود :
T4.Delete
وأخيراً نقوم بتحديث المحتويات مرة أخرى .


كود :
Refresh_Me
تبقى أمر صغير ذو بال في عملية الحذف ، وهو أننا نختبر المصنع أو النوع الخاص بالعنصر المحذوف ، فإذا كان هذا المصنع محذوفاً View=False فإننا سنحذف ذلك المصنع ، ولقد شرحنا هذه النقطة في بداية الدروس .

الاحتفاظ بقيم هذين الحقلين في متغيرين :


كود :
A1 = T1!Category
A2 = T1!Factory

الانتقال إليها في T2 و T3


كود :
T2.MoveFirst
For i = 0 To T2.RecordCount - 1
If T2!Number = A1 Then Exit For
T2.MoveNext
Next i

T3.MoveFirst
For i = 0 To T3.RecordCount - 1
If T3!Number = A2 Then Exit For
T3.MoveNext
Next i
التأكد من أن View <> False وإلا فإننا نحذفها لو كانت قد فرغت .


كود :
If T2!View = False Then
SQL = "select count(*) as mycount from tb_product where category=" & A1 & ""
Set T4 = D1.OpenRecordset(SQL, dbOpenDynaset)
If T4!mycount = 0 Then T2.Delete
T4.Close
End If

If T3!View = False Then
SQL = "select count(*) as mycount from tb_product where factory=" & A2 & ""
Set T4 = D1.OpenRecordset(SQL, dbOpenDynaset)
If T4!mycount = 0 Then T3.Delete
T4.Close
End If
سؤال : أيضاً بالامكان عمل جملة استعلام واحدة بدل كل ما سبق من الأكواد ، هل تستطيع القيام بتكوينها !!!


وبهذا يصبح الكود الكامل لعملية الحذف :

كود :
Dim sure
sure = MsgBox("هل أنت متأكد أنك تريد القيام بحذف هذه البضاعة ؟", vbExclamation + vbYesNo + arabic, "حذف بضاعة")
If sure = vbNo Then Exit Sub

If T1.RecordCount = 0 Then
MsgBox "لا توجد أي بضاعة !", vbExclamation + arabic, "حذف بضاعة"
Exit Sub
End If

T1.MoveFirst
For i = 0 To T1.RecordCount - 1
If T1!Number = Text7.Text Then Exit For
T1.MoveNext
Next i
Dim A1, A2
A1 = T1!Category
A2 = T1!Factory
T1.Delete

T2.MoveFirst
For i = 0 To T2.RecordCount - 1
If T2!Number = A1 Then Exit For
T2.MoveNext
Next i

T3.MoveFirst
For i = 0 To T3.RecordCount - 1
If T3!Number = A2 Then Exit For
T3.MoveNext
Next i

If T2!View = False Then
SQL = "select count(*) as mycount from tb_product where category=" & A1 & ""
Set T4 = D1.OpenRecordset(SQL, dbOpenDynaset)
If T4!mycount = 0 Then T2.Delete
T4.Close
End If

If T3!View = False Then
SQL = "select count(*) as mycount from tb_product where factory=" & A2 & ""
Set T4 = D1.OpenRecordset(SQL, dbOpenDynaset)
If T4!mycount = 0 Then T3.Delete
T4.Close
End If

Refresh_Me

يتبع ...
}}}}
تم الشكر بواسطة:
#2
[b]التعديل .

[/b]
من أجل التعديل سوف نقوم بانشاء شاشة جديدة ، ولكنها ليست من Child الفورم الرئيسي ذلك أننا نريد أن نظهرها بالتعليمة Show 1 حتى ينهي التعديل قبل العودة للتحكم ثانية .

قم بتصميم الفورم كما يحلو لك مع مراعاة احتواءه على كافة الحقول ما عدا حقل الرقم فقط . واضف زرين للتعديل ، ولالغاء الأمر .
ولا تنس ضبط خواص TabIndex لمزيد من السهولة في الاستخدام .
وأخيراً قم بتسميته Frm_Edit .

لا تنس أمراً هاماً جداً ، وهو أن حقلي المصنع والنوع سوف يظهران على هيئة قائمة بها كل المصانع والأنواع لتسهيل عملية الاختيار .
لا تنس أن تضع مكان أو متغير لتحتفط فيه برقم البضاعة التي يتم تعديلها من أجل عملية التعديل لاحقاً .
ولا تنس أخيراً أن تجعل MaxLength لحقل الاسم 30 للتوافق مع قاعدة البيانات ، أما الارقام فاجعلها = 10 كحد أقصى .

وبعد أن قمنا بتصميم الشاشة ، سوف نقوم بتصميم حدث البداية لها Form_Load والذي سيتضمن وضع جميع المصانع والأنواع المتوفرة في القائمتين Combo1 و Combo2 .


كود :
T2.MoveFirst
T3.MoveFirst
Combo1.Clear
Combo2.Clear

For i = 0 To T2.RecordCount - 1
Combo1.AddItem T2!Name
T2.MoveNext
Next i

For i = 0 To T3.RecordCount - 1
Combo2.AddItem T3!Name
T3.MoveNext
Next i
والآن إلى أمر تشغيل هذا الفورم ، فسوف نقوم بتشغيله ومن ثم ننقل القيم الحالية إلى اماكنها المناسبة في فورم التعديل . ولا تنس أن تحتفظ بالنوع والمصنع القديمين والتأكد من عدم خلوهما من البضائع - كما هو الأمر في عملية الحذف تماماً .


كود :
Dim A1, A2
SQL = "select number from tb_category where name='" & Text2.Text & "'"
Set T4 = D1.OpenRecordset(SQL, dbOpenDynaset)
A1 = T4!Number
SQL = "select number from tb_factory where name='" & Text3.Text & "'"
Set T4 = D1.OpenRecordset(SQL, dbOpenDynaset)
A2 = T4!Number

Load Frm_Edit

With Frm_Edit
.Text1.Text = Text1.Text
.Combo1.Text = Text2.Text
.Combo2.Text = Text3.Text
.Text2.Text = Text4.Text
.Text3.Text = Text5.Text
.Text4.Text = Text6.Text
.lbl_name = "تعديل البضاعة : " & Text1.Text
.lbl_num = "no." & Text7.Text
End With

Frm_Edit.Show 1

T2.MoveFirst
For i = 0 To T2.RecordCount - 1
If T2!Number = A1 Then Exit For
T2.MoveNext
Next i

T3.MoveFirst
For i = 0 To T3.RecordCount - 1
If T3!Number = A2 Then Exit For
T3.MoveNext
Next i

If T2!View = False Then
SQL = "select count(*) as mycount from tb_product where category=" & A1 & ""
Set T4 = D1.OpenRecordset(SQL, dbOpenDynaset)
If T4!mycount = 0 Then T2.Delete
T4.Close
End If

If T3!View = False Then
SQL = "select count(*) as mycount from tb_product where factory=" & A2 & ""
Set T4 = D1.OpenRecordset(SQL, dbOpenDynaset)
If T4!mycount = 0 Then T3.Delete
T4.Close
End If

Refresh_Me
إذا قمنا بالضغط على ( الغاء الأمر ) في فورم التعديل فلن يكون أكثر من اغلاق الفورم :


كود :
Unload Me
أما إذا ضغطنا على زر التعديل فتنتظرنا جملة استعلام لعملية التعديل .
وأولاً علينا أن نعرف ما هو رقم البضاعة ، ولو لاحظت في البرنامج أنني اخزن رقم البضاعة في أداة تحتوي قبل الرقم على no. ولذا يمكنني استخلاص الرقم بالطريقة التالية :


كود :
Dim My_Number
My_Number = Mid(lbl_num.Caption, 4, Len(lbl_num.Caption))

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


كود :
SQL = "select * from tb_product where name='" & Text1.Text & "'"
Set T4 = D1.OpenRecordset(SQL, dbOpenDynaset)
If T4.RecordCount <> 0 Then
If T4!Number <> Val(My_Number) Then
MsgBox "توجد بضاعة لها نفس الاسم ، فضلاً اختر اسماً آخر", vbExclamation + arabic, "تعديل بضاعة"
Exit Sub
End If
End If
ثم لا تنس أن تعرف رقم المصنع والنوع الجديدين ، فالرقم هو من ستخزنه في جدول البضائع لا الاسم .


كود :
Dim Num1, Num2
SQL = "select number from tb_category where name='" & Combo1.Text & "'"
Set T4 = D1.OpenRecordset(SQL, dbOpenDynaset)
Num1 = T4!Number
T4.Close
SQL = "select number from tb_factory where name='" & Combo2.Text & "'"
Set T4 = D1.OpenRecordset(SQL, dbOpenDynaset)
Num2 = T4!Number
T4.Close

وأخيراً ... قم بعملية التعديل .

ومجددأ ظهرت لدي مشاكل مع لغة الاستعلامات الهيكلية ومع الأمر
Update تحديدأ ، لذا اضطررت إلى استخدام تلك الطريقة التي استخدمتها في الحذف وذلك للتعديل :


كود :
T1.MoveFirst
For i = 0 To T1.RecordCount - 1
If T1!Number = Val(My_Number) Then Exit For
T1.MoveNext
Next i

With T1
.Edit
!Name = Text1.Text
!category = Num1
!factory = Num2
!price = Val(Text2.Text)
!Count = Val(Text3.Text)
!Box_count = Val(Text4.Text)
.Update
End With
ولا تنس اغلاق الشاشة :


كود :
If KeyAscii > 58 Or KeyAscii < 48 Then
KeyAscii = 0
End If
لا تنس التأكد من أن المدخلات عبارة عن ارقام فقط في خانات ( العدد - السعر - وحدة/صندوق ) وذلك بالشكل التالي


كود :
If (KeyAscii > 58 Or KeyAscii < 48) And KeyAscii <> 46 And KeyAscii <> 8 Then
KeyAscii = 0
End If
وسنضع هذا الأمر في حدث KeyPress الذي يمثل ضغطة المفاتيح .

حيث أن رقم آسكي للأعداد يتراوح بين هذين العددين .
ولكننا سنحتاج لبعض الاستثناءات فرقم 8 يمثل عملية BackSpace كما أن 46 يمثل الفاصلة ، لذلك سوف نستثيهما :



كود :
If T4!View = False Then MsgBox "لا تنس أنك اخترت مورداً سبق لك حذفه وهو موجود بصورة مؤقتة حتى انتهاء البضائع من نفس المورد", vbExclamation + arabic, "مورد محذوف"
هذه الطريقة هي أبسط الطرق وأسهلها ، لكنها لا تفيد في حالة قام المستخدم بلصق الرقم باستخدام الماوس ، كما أنها تمنع بعض العمليات المفيدة مثل النقر على Ctrl+V للصق Paste ، Ctrl+X للقص Cut .

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


كود :
If T4!View = False Then MsgBox "لا تنس أنك اخترت نوعاً سبق لك حذفه وهو موجود بصورة مؤقتة حتى انتهاء البضائع من نفس النوع", vbExclamation + arabic, "نوع محذوف"
و


كود :
If T4!View = False Then MsgBox "لا تنس أنك اخترت نوعاً سبق لك حذفه وهو موجود بصورة مؤقتة حتى انتهاء البضائع من نفس النوع", vbExclamation + arabic, "نوع محذوف"

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


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  الدرس الرابع والثلاثون والأخير - نبذة عن العملية العكسية + تجهيز البرنامج على Cd RaggiTech 0 1,436 15-10-12, 09:10 AM
آخر رد: RaggiTech
  الدرس الثالث والثلاثون - كيفية عمل اعداد Setup للبرنامج RaggiTech 0 1,230 15-10-12, 09:08 AM
آخر رد: RaggiTech
  الدرس الثاني والثلاثون - التحويل إلى exe RaggiTech 0 1,161 15-10-12, 09:07 AM
آخر رد: RaggiTech
  الدرس الحادي والثلاثون - تعددية المستخدمين - البحث وطباعة الفواتير - التعليمات ... RaggiTech 2 1,754 15-10-12, 09:05 AM
آخر رد: RaggiTech
  الدرس الثلاثون - التعامل مع شريط الأدوات ToolBar RaggiTech 0 991 15-10-12, 08:59 AM
آخر رد: RaggiTech
  الدرس التاسع والعشرون - التعامل مع أشرطة الحالة Statues Bar RaggiTech 0 837 15-10-12, 08:57 AM
آخر رد: RaggiTech
  الدرس الثامن والعشرون -الطباعة في البرنامج . RaggiTech 4 1,559 15-10-12, 08:56 AM
آخر رد: RaggiTech
  الدرس السابع والعشرون - مقدمة إلى التعامل مع التقارير من خلال DataReport RaggiTech 2 1,710 15-10-12, 08:45 AM
آخر رد: RaggiTech
  الدرس السادس والعشرون - التقارير اليومية ، والتقارير بين تاريخين RaggiTech 1 1,222 15-10-12, 08:39 AM
آخر رد: RaggiTech
  الدرس الخامس والعشرون - الإحصائيات والرسوم البيانية RaggiTech 0 1,101 15-10-12, 08:37 AM
آخر رد: RaggiTech

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


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