تصميم و برمجة فاتورة المبيعات

 في الدرس السابق انتهينا من تصميم و برمجة فورم مرتجع الشراء بشكل كامل وشرحت لكم كافه تفاصيل الفورم وضعت لكم الاكواد بالتسلسل .

فاتورة المبيعات

 مشروعنا نظام السوبر ماركت يحتاج إلى اشياء كثيره حتئ يصبح متكامل للعمل عليه في اي سوبر ماركت وايضا ينفع للعمل عليه في شركات التجاريه لانه فرق فقط في الاصناف ونحن وصلنا نسبه كبيره في انجاز النظام ولو رجعنا للمشروع من بدايه الصفر سنرى فورمات عده قمنا بتصميمها وبرمجتها وكل فورم لها وظيفة معينه واغلب الفورمات مشتركه مع بعضها البعض .

 لو رجعنا إلى مشروعنا السوبر ماركت وتحديدا لفورم فاتوره الشراء هذه الفاتوره خاصه بالموردين اي تتعامل مع الموردين المسجلين لدينا في قاعده البيانات والتالي لا يمكننا التعامل مع العملاء في نفس فاتوره الشراء وبالتالي نحتاج الى عمل فورم لفاتوره المبيعات حتئ يصبح لدينا فورم فاتوره الشراء وفورم فاتوره المبيعات للتعامل مع العملاء المسجلين وغير المسجلين لدينا في قاعده البيانات .

  تصميم وبرمجة فورم فاتوره المبيعات طبعا فاتوره المبيعات طبق الاصل اي نفس تصميم فاتوره الشراء من ناحيه التصميم واختلاف بسيط جدا في تصميم اما من ناحيه البرمجه في اختلاف بسيط ايضا بين الاثنين .

تصميم فاتورة المبيعات

 تصميم وبرمجة فورم فاتورة المبيعات نذهب الى فورم فاتوره الشراء وفي التصميم نقوم بنسخ جميع محتويات الفاتوره من اداوات ثم نقوم باضافة فورم جديد ونسميه Selepill (فاتوره المبيعات ) ونلصق المحتويات في هذا الفورم الخاص بفاتورة المبيعات ويصبح الفورم النهائي لفاتوره المبيعات بالشكل التالي

 كما في  الصوره 

الشكل النهائي لتصميم فاتورة المبيعات


  تفاصيل ومتطلبات فاتوره المبيعات ادوات فاتوره المبيعات نفس ادوات فاتوره الشراء لذلك نسخنا محتويات فاتوره الشراء ولصقنا هذه الادوات بفورم فاتوره المبيعات selepill وتم تغير بسيط في تصميم فاتوره مبيعات كالتالي 

 _ تم مسح تكس بوكس الخاص برقم فاتوره لانه لا نحتاجه

  _ وتم اضافة تكس بوكس 1 وبوتن 1 وضعناهم تحت كاش والاجل خاصه باضافة الاصناف الى داتا كراند فيو _ تم تغير اسماء تكستات بوكس برمجيا بعد نسخها كالتالي : ➖التسلسل seleld ➖التاريخ seledate ➖الوقت seletime seleuser المستخدم الحالي➖ ➖اجمالي الجمهور seletotalg ➖اجمالي الشراء seletotals ➖عدد الاصناف seleltemcount ➖الربح المتوقع seleearn ➖نسبه الربح المتوقع seleearnpercent ➖اضافة مصروفات seleadd ➖الخصم seleminus ➖اضافة اصناف txtserarch ➖العميل selecustmer 

 _تم تغير اسم المورد الئ العميل في تصميم هذا كل مافي تغير البسيط الذي تم تغيره في فاتوره المبيعات…

 شاهد فيديو كيف تم ترتيب ونسخ ادوات فاتوره المشتريات ولصقها في فاتوره المبيعات


.

 لاحظ الشكل النهائي في الصوره  لفورم فاتوره المبيعات selepill بعد تعديل عليها

الشكل النهائي لتصميم فاتورة المبيعات بعد التعديل

……

اهم شي واول خطوه نعملها في فورم فاتوره المبيعات هي اضافة الحقول الى داتا كراند فيو اي الحقول التي نحتاجها تظهر على داتا كراند فيو لانه هي التي نشاهد من خلالها نتائج المخرجات بعد ادخال بيانات عليها وليس فقط هذا في فورم فاتوره المبيعات وانما في اي فورم يجب ان نحمل او نظيف الحقول التي تظهر على داتا كراند فيو .

 ماهي الحقول التي نحتاجها لتظهر على داتا كراند فيو ؟  

وكيف نضيف هذه الحقول على داتا كراند فيو ، كيف نربط هذه الحقول بقاعده البيانات بعد اضافتها على داتا كراند فيو ، كيف نغير نوع بيانات التي يستقبلها لكل حقل بعد الاضافة

    الحقول التي نحتاجها لتظهر على داتا كراند فيو هي كالتالي : 

 ➖رقم الصنف ➖الصنف ➖السعر ➖الرصيد الكلي ➖الصلاحية ➖الرصيد المتاح ➖الكمية ➖اجمالي الجمهور ➖الخصم ➖صافي الجمهور ➖متوسط سعر الشراء ➖اجمالي الشراء ➖قيمه الربح ➖الملاحظات هذه   التي نحتاجها في داتا كراند فيو . 

 كيف نضيف هذه الحقول على داتا كراند فيو 

في درس سابق عرفنا كيف نضيف هذه الحقول في داتا كراند فيو من خلال الضغط كلك ايسر على سهم الموجود على داتا كراند فيو (datagridview) من جهة اليمين ثم نختار خيار Edit columns ثم نختار خيار add ثم نكتب الحقل مثلا رقم الصنف في مربع Header text ثم نضغط على add للاضافة ونكرر العمليه الى ان ننتهي من اضافة جميع الحقول … .

 شاهد الفيديو   لتوضيح كيف تم اضافة حقول على داتا كراند فيو


     كيف نربط هذه الحقول بقاعده البيانات ؟ 

 نقوم بربط هذه الحقول اعلاه بمكان ما يقابله من حقول داخل قاعدة البيانات اي ياخذ كل حقل اعلاه مكانه في قاعدة بيانات (الجداول) وذلك من خلال نفس السهم الذي قمنا من خلاله باضافة الحقول اعلاه نضغط عليه ثم نختار Edit columns ثم تظهر لنا على جهة اليسار جميع الحقول التي قمنا باضافتها بعدها نختار مثلا حقل رقم الصنف وعلئ جهة اليمين نختار DatapropertyName ثم في مربع none نكتب معرف رقم الصنف الذي من خلاله يتم ربطه بقاعدة بيانات وهو ltemld ونضغط ok ثم نختار الحقل ثاني وهو الصنف ونفس خطوات سابقه في مربع none نكتب معرف حقل الصنف الذي يربطه بقاعدة بيانات وهو operltme ثم نضغط ok وهكذا الى ان ننتهي كتابه جميع معرفات الحقول التي من خلالها يربطها بقاعدة بيانات اي بما يقابلها من حقول في جداول قاعده بيانات وتصبح الحقول بعد ربطها بقاعدة بيانات كالتالي : ➖رقم الصنف ltemld ➖الصنف operltme ➖السعر ltemprice ➖الرصيد الكلي ltemqty ➖الصلاحية ➖الرصيد المتاح ➖الكمية saleqty ➖اجمالي الجمهور saletotalg ➖الخصم saledisconund ➖صافي الجمهور saletotalb ➖متوسط سعر الشراء ➖اجمالي الشراء ➖قيمه الربح ➖الملاحظات salenotes هكذا تم ربط الحقول بقاعدة بيانات 

شاهد تحت الفيديو   كيف تم ربط هذه الحقول بقاعده البيانات


 ملاحظه : 

5 حقول لم نكتب معرفها ولم نربطها بقاعدة بيانات لانه سوف يتم ادخال بيانات في هذه الحقول تلقائيا والحقول التي لم نربطها بقاعدة البيانات هي : ➖الصلاحية ➖الرصيد المتاح ➖متوسط سعر الشراء ➖اجمالي الشراء ➖قيمه الربح

 نغير شكل حقل الصلاحية في داتا كراند فيو من خلال Edit columns ومن نافذه نختار خانه Column Type ثم نختار خيار Datagridview ComboBox Column ونفس نافذة لحقل صلاحيه نختار خانه Displaystyle ثم نختار خيار ComboBox 

 شاهد الفيديو   كيف تم تغير شكل حقل الصلاحية


   ملاحظه 

شكل حقل الصلاحية سوف تلاحظون التغير عند اضافة الاصناف .


  كيف نغير نوع بيانات لكل حقل التي سوف من خلالها يستقبل البيانات سواء نصيه او رقيمه او عشريه ؟

 ماهي الحقول التي نغير نوع البيانات التي تستقبلها ؟ 

 الحقول التي نغير نوع بياناتها كالتالي : ➖السعر ➖الرصيد الكلي ➖الرصيد المتاح ➖الكمية ➖اجمالي الجمهور ➖الخصم ➖صافي الجمهور ➖متوسط سعر الشراء ➖اجمالي الشراء ➖قيمه الربح هذه  الحقول التي نغير نوع استقبالها للبيانات 

  نغير نوع هذه الحقول لاستقبالها للبيانات كالتالي : ايضا نضغط على Edit columns من جهه اليسار نحدد الحقل مثلا حقل السعر ومن جهه اليمين نختار خيار DefaultCellStyle نضغط عليه من يسار على نقط زر وسوف تفتح لنا نافذة نختار منها Format ونضغط على نقط على زر سوف تفتح لنا نافذة فيها انواع بيانات في خانه Farmat Type ونختار نوع البيانات التي يستقبلها لكل حقل وحقل السعر سوف ياخذ نوع Currency وفي تكس بوكس Null Values نكتب 0 ونضغط على Ok…… وهكذا في بقيه الحقول التي تحتاج إلى تغير نوع بيانات التي تستقبلها ونفس الخطوات وتكملة بقيه تغير نوع بيانات الحقل التي يستقبلها تصبح كالتالي : ➖السعر Currency ➖الرصيد الكلي Numeric ➖الرصيد المتاح. Numeric ➖الكمية Numeric ➖اجمالي الجمهور Currency ➖الخصم Numeric ➖صافي الجمهور Currency ➖متوسط سعر الشراء Currency ➖اجمالي الشراء Currency ➖قيمه الربح Currency هكذا  تم تغير نوع بيانات التي يستقبلها لكل حقل… 

  ملاحظه عند تغير نوع بيانات لكل حقل وفي تكس بوكس Null Values نكتب 0 في جميع حقول عند تغير نوع ببيانات التي يستقبلها 

شاهد الفيديو   كيف تم تغير نوع بيانات لكل حقل


.

  ربط فورم فاتورة المبيعات salepill بالفورم الرئيسي للمشروع manipage

 نفتح الفورم الرئيسي  manipage ونكتب قائمه جديده بجانب المشتريات ونسميها المبيعات ونكتب داخلها فرع ونسميه فاتوره المبيعات ثم ننقر نقرتين عليها ونكتب الكود التالي :

.vb
	  
salepill.MdiParent = Me

salepill.WindowState = FormWindowState.Maximized

salepill.Show()

	

شاهد الفيديو   توضيح كيف تم ربط فورم فاتوره المبيعات salepill بالفورم الرئيسي manipage 


 الاتصال بجدول فاتورة المبيعات

 ثم  كالعادة نقوم بانشاء متغيرات للداتا تيبل وداتا ادبتر و load لتحميل بيانات الجدول و code للترقيم تلقائي للصفوف 

 في المديول modul ننشئ هذه المتغيرات نفتح مديول ونكتب الاكواد الخاصه بالمتغيرات اعلاه كالتالي : ➖ كود متغيرات

.vb
	  
	
Public selepilldt As New DataTable

Public selepillda As New OleDbDataAdapter

Public mynewldselepill As Integer

Public selepillcmd As New OleDbCommand
	

➖ كود اللود load

.vb
	  
Public Sub load_selepill()

selepilldt.Clear()

selepillda = New OleDbDataAdapter("select * from salepill", con)

selepillda.Fill(selepilldt)

End Sub

	

➖ كود code

.vb
	  
Public Sub code_selepill()

Dim dt As New DataTable
Dim da As New

OleDbDataAdapter("select max(saleld) from salepill", con)

da.Fill(dt)

If IsDBNull(dt(0)(0)) = True Then

mynewldselepill = 1

Else

mynewldselepill = dt(0)(0) + 1

End If

End Sub

	

شاهد ترتيب الاكواد اعلاه الثلاثه كما في الصوره   


تحميل فاتورة المبيعات

 نذهب إلى فورم المبيعات وننقر عليه نقرتين وفي حدث اللود load نستدعي كود اللود load المتغير الذي عرفناه في مديول كما يلي

.vb
	  

load_selepill()
	

إجراء تفريغ تكستات بوكس من البيانات

نقوم بانشاء اجراء خاص بتفريغ تكستات بوكس من بيانات بعد الاضافة والحفظ اذن في فورم المبيعات وتحت

.vb
	  
public class selepill
	

نكتب الاجراء التالي :

.vb
	  
Public Sub newselepill()

code_selepill()

seleadd.Text = 0

selecash.Checked = True

seledate.Text = Now.Date

seleearn.Text = 0

seleearnpercent.Text = 0

seleld.Text =
mynewldselepill

selecustmer.Text = ""

seleltemcount.Text = 0

seleminus.Text = 0

selepostpone.Checked = False

seletime.Text = Now

seletotals.Text = 0

seletotalg.Text = 0

seleuser.Text = ""

End Sub
	

شاهد ترتيب الكود اعلاه كود افراغ  التكست بوكس من البيانات كما في الصورة 

تفريغ تكستات بوكس من البيانات

وفي حدث اللود load فورم مبيعات نستدعي اجراء اعلاه كما يلي

.vb
	  
newselepill() 
	

وايضا في زر فاتورة جديده نستدعي الكود

.vb
	  
newselepill()
	

 تحميل الفواتير على داتا كراند فيو

 نحتاج إلى كود لتحميل البيانات على الحقول التي قمنا باضافتها في داتا كراند فيو ويتم ذلك من خلال انشاء استعلام بين جدولين operations و ltems ومن ثم نختار من الجدولين الحقول التي نحتاجها والمطابقة مع الحقول التي قمنا باضافتها على الداتا كراند فيو 

الخطوات 

  نفتح قاعدة بيانات خاصه بالسوبر ماركت اكسس ونقوم بانشاء علاقه (استعلام) بين جدولين operations و ltems لكن قبل انشاء العلاقه نقوم باضافة حقل جديد في جدول operations خاص بالصلاحيه ونسميه saleexp من نوع نص 

  لاحظ توضيح بالصوره كيف تم اضافة حقل الصلاحية saleexp 


  بعد ذلك نقوم بانشاء العلاقه بين الجدولين ونحتاج الحقول التاليه في العلاقه بين الجدولين : Operld Saleld Operltem ltemld ltemprice ltemqty Saleexp Saleqty Saletotalg Saledisconund Saletotalb Salenotes 

 شاهد الفيديو  لتوضيح كيف تم انشاء العلاقه (استعلام) بين جدولين اعلاه


وبعد انشاء العلاقه نحفظ العلاقه باي اسم نريده مثلا اسم seleQ وبعد ذلك نفتح هذه الاستعلام ( العلاقه) سنلاحظ وجود بيانات محمله بالاستعلام لانه في دروس سابقه قمنا باضافة بيانات في فورم فاتوره الشراء وجدول operations مرتبط بعده جداول لذلك ظهرت بيانات في استعلام seleQ بعد ذلك ننقر كلك ايمن علئ اسم الاستعلام seleQ ونختار طريقه عرض sql بعدها ننسخ الكود ونذهب الى فورم المبيعات وننشئ اجراء خاص لتحميل بيانات هذا الاستعلام ونسمي الاجراء loadseleQ ثم نكتب الاكواد داخله كالتالي واثناء كتابه الاكواد نلصق الكود. الذي تم نسخه من استعلام seleQ ويصبح الاجراء كاملا كالتالي :

.vb
	  
Public Sub loadseleQ()

Try
Dim dt As New DataTable

Dim da As New OleDbDataAdapter

dt.Clear()

da = New OleDbDataAdapter("SELECT operations.operld, operations.saleld, operations.operltem, ltems.ltemld, ltems.ltemprice, ltems.ltemqty, operations.saleexp, operations.saleqty, operations.saletotalg, operations.saledisconund, operations.saletotalb, operations.salenotes FROM ltems , operations where ltems.ltemname=operations.operltem and saleld = " & seleld.Text & "", con)

da.Fill(dt)


DataGridView1.
AutoGenerateColumns = False

Catch ex As Exception

MsgBox(ex.Message)

End Try

End Sub

	

 شاهد بالفيديو ترتيب كود اجراء اعلاه بعد ذلك نقوم باستدعاء هذا الاجراء في حدث اللود load كما يلي

.vb
	  
loadseleQ() 
	

وايضا في زر فاتوره جديده نستدعي الكود

.vb
	  
loadseleQ()
	

فيديو  لتوضيح كيف تم نسخ كود من استعلام seleQ  


فيديو  توضيح وترتيب كود اجراء loadseleQ


برمجة فاتورة المبيعات

 في الجزاء سابق برمجنا اكواد خاصه بكود بتفريغ التكس بوكس من البيانات بعد الاضافة والحفظ وايضا كود تحميل بيانات علئ الحقول التي قمنا باضافتها في داتا كراند فيو .

 نكمل الدرس وسنبرمج الحسابات الخاصه بالتالي : ➖اجمالي الجمهور ➖اجمالي الشراء ➖اجمالي الشراء لمتوسط سعر الشراء ➖قيمه الربح

 ولعمل ذلك ننقر نقرتين على فورم المبيعات ونقوم بانشاء اجراء خاص بالحسابات ونسميه Salecale ونكتب بداخله الاكواد الخاصه بالحسابات كالتالي :

.vb
	  
Public Sub salecale()

'============اجمالي الجمهور
'7 = 6 * 2

DataGridView1(7,DataGridView1.CurrentRow.Index).Value = Val(DataGridView1(6, DataGridView1.CurrentRow
.Index).Value) *
Val(DataGridView1(2, DataGridView1.CurrentRow
.Index).Value)



'=========اجمالي الشراء
'9 = 7-(7*8)

DataGridView1(9, DataGridView1.CurrentRow.Index).Value = Val(DataGridView1(7, DataGridView1.CurrentRow
.Index).Value) - (Val(DataGridView1(7, DataGridView1.CurrentRow
.Index).Value) * (Val(DataGridView1(8, DataGridView1.CurrentRow
.Index).Value) / 100))


'========متوسط سعر الشراء 
'11= 10*6

DataGridView1(11, DataGridView1.CurrentRow
.Index).Value = Val(DataGridView1(10, DataGridView1.CurrentRow
.Index).Value) * DataGridView1(6, DataGridView1.CurrentRow
.Index).Value


'==========قيمة الربح
'12= 9-11

DataGridView1(12, DataGridView1.CurrentRow
.Index).Value = Val(DataGridView1(9, DataGridView1.CurrentRow
.Index).Value) -
DataGridView1(11, DataGridView1.CurrentRow
.Index).Value



'=======جمع اجمالي الحسابات  


Dim total, totalb, count, earn, perc As Double

For i As Integer = 0 To DataGridView1.Rows.Count - 1

total = total +
Val(DataGridView1(9, DataGridView1.Rows(i).Index)
.Value)

totalb = totalb + Val(DataGridView1(11, DataGridView1.Rows(i).Index)
.Value)


count = DataGridView1.Rows.Count
earn = total - totalb
perc = (1 - (totalb / total)) * 100


Next


'===لوضع الحسابات على التكس بوكس

seletotalg.Text = total

seletotals.Text = totalb

seleltemcount.Text = count

seleearn.Text = earn

seleearnpercent.Text = Math.Round(perc, 2)


End Sub
	

 الاكواد اعلاه تم شرحها في دروس سابقه لاحظ امام كل حساب عمليه حسابيه مثلا حساب متوسط الشراء امامه عمليه حسابيه هي 11= 10*6 نقصد بهذه المعادله كل رقم يدل على تسلسل او ترتيب حقل ما على داتا كراند فيو مثلا رقم 11 يدل على تسلسل حقل متوسط سعر الشراء في داتا كراند فيو اما 10 يدل على تسلسل حقل متوسط سعر شراء باعتبار اول حقل في داتا فيو لا يحسب بيساوي 0 ونحسب تسلسل اي حقل بعد ثاني حقل ويساوي 1 وصاعدا اما 6 يدل على تسلسل حقل الكمية في داتا كراند فيو وهكذا في بقيه الحسابات

    لاحظ كتابه كيف تم ترتيب كود الحسابات اعلاه كما في فيديو تحت  ثم نقوم باستدعاء هذا الاجراء الخاص بالحسابات في حدث اللود load الفورم كالتالي :

.vb
	  
Salecale()
	

فيديو توضيح كيف تم ترتيب كود الحسابات تكملة الدرس الخاص بفاتورة المبيعات selepill…… 

  تحميل العملاء في فاتوره المبيعات

 لكي نحمل بيانات العملاء نقوم باضافة فورم جديد ونسميه custmer_search ثم نضيف textbox عدد 1 ـ Button عدد 1 اداة datagridview 

 ويصبح شكل الفورم النهائي كما في صورة رقم 1 

 ثم ننقر نقرتين على فورم وفي حدث اللود load نكتب الكود التالي :

.vb
	  
load_customers()

DataGridView1.DataSource = customersdt

	

ثم نحدد اداة datagridview ومن الخصائص نختار الاحداث ونختار حدث selectionchanged ونكتب الكود التالي :

.vb
	  
Try

'لاضهار اسم العميل

selepill.selecustmer.Text = DataGridView1(1, DataGridView1.CurrentRow
.Index).Value


'لاضهار التليفون

selepill.Label4.Text = DataGridView1(3, DataGridView1.CurrentRow
.Index).Value


'لاضهار الرصيد الحالي

selepill.Label3.Text = DataGridView1(6, DataGridView1.CurrentRow
.Index).Value
Catch ex As Exception


End Try

End Sub

	

ثم ننقر علئ زر اختيار ونكتب الكود التالي :

.vb
	  
Me.Close()
	

لاحظ ترتيب الاكواد اعلاه كما في صورة رقم 2

بعد ذلك نقوم بربط custmer_search بفورم المبيعات من خلال النقر نقرتين على زر بجانب تكس بوكس العميل في فورم فاتوره المبيعات ونكتب الكود التالي :

.vb
	  
custmer_search.ShowDialog()

	

شاهد فيديو تحت   توضيح كيف تم ربط الفورم custmer_search وكيف تم تنفيذ البرنامج وتحميل البيانات صورة رقم 1 شكل نهائي لتصميم فورم custmer_search الخاص بتحميل العملاء فيديو توضيح كيف تم ربط فورم custmer_search العملاء بفورم فاتورة المبيعات وايضا مثال توضيح كيف تم تحميل وختيار العملاء 

تكملة الدرس الخاص بفاتورة المبيعات selepill…… في درس سابق برمجنا فورم خاص لتحميل بيانات العملاء وبرمجنا الحسابات… 

  برمجه فورم فاتورة المبيعات  اضافه اصناف الى في داتا كراند فيو

 في فورم فاتوره الشراء ضفنا بيانات عن طريق فورم ثاني ltme_search لكن في فورم فاتوره الشراء سنضيف الاصناف بطريقه تختلف عن طريقه سابقه وذلك من نفس الفورم المبيعات نضيف الاصناف ولك اخي المبرمج الخيار في اي طريقه تحبها اعملها… .. وسنستخدم ld لاضافة الصنف وبياناته اي كل صنف له ld (رقم ) تسلسلي في داتا كراند فيو وبالتالي عندما نريد اضافة صنف ما نكتب مثلا رقم 1 لصنف ما في تكس بوكس الخاصه بالبحث عن رقم 1 في فورم الاصناف وهكذا ولك اخي المبرمج حريه اختيار طريقه اضافة الصنف بالباركود او بالاسم او اي شي تحبه…… . 

 اذن ننقر نقرتين على تكس بوكس الخاص باضافة الاصناف txtsearch ونكتب الكود التالي :

.vb
	  
If Txtsearch.Text   Nothing Then

  Dim dt As New DataTable

  Dim da As New
  OleDbDataAdapter

  dt.Clear()

  da = New OleDbDataAdapter("select * from ltems where ltemld = " & Txtsearch.Text & "", con)

  da.Fill(dt)

  If dt.Rows.Count > 0 Then
  DataGridView1.Rows.Add()

  Dim last As Integer = DataGridView1.Rows.Count - 1


  DataGridView1(0, last)
  .Value =dt.Rows(0)
  .Item("ltemld")


  DataGridView1(1, last).Value = dt.Rows(0).Item("ltemname")


  DataGridView1(2, last).Value = dt.Rows(0).Item("ltemprice")


  DataGridView1(3, last).Value = dt.Rows(0).Item("ltemqty")


  Txtsearch.Text = Nothing

  Txtsearch.Focus()

  End If

  Else

  load_ltmes()

  End If

  End Sub
	

لاحظ كيف تم ترتيب كود الاضافة كما في صورة رقم 1 

  شرح الكود اعلاه الاضافة اول سطر if txtsearch تعني اذا تم اضافة صنف مثلا رقم 1 لصنف ما ثم مسحنا رقم 1 لضافة صنف اخر في اثناء مسح رقم لان يحدث خطا اي لا شي هذا معنئ if txtsearch ثم عرفنا داتا تيبل وداتا ادبتر وفضينا dt ثم حددنا البحث عن الصنف select من جدول الاصناف ltems بدلاله ltemld ثم ملئنا dt بالبيانات fill ثم جعلنا dt بشرط اذا كانت اكبر من صفر 0 اي عند اضافة صنف ما يجب ان يكون اكبر من صفر ثم عرفنا متغير last حتئ يلف لي داتا كراند فيو بعدها كتبنا بيانات حقول الصنف من جدول ltems التي نحتاجها للاضافة وهي ltemld رقم الصنف اسم الصنف ltemname سعر الصنف ltemprice كمية الصنف ltemqty وعليه سيكون اضافة الصنف وتفاصيله بالرقم ld ثم جعلنا txtsearch يساوي لا شي ويفوكس علئ تكس بوكس نفسه بعد اضافة صنف اخر واخر شي لودنا تحميل بيانات الاصناف بعد عمليه الاضافة losd_ltmes هذا كل مافي الكود

 شاهد فيديو تحت  توضيح كيف تم اضافة اصناف الئ داتا كراند فيو صورة رقم 1 ترتيب كود الخاص باضافة الاصناف في فاتوره المبيعات فيديو توضيح كيف تم تنفيذ البرنامج وكيف تم اضافة اصناف الئ داتا كراند فيو datagridview بدلاله ld الرقم التسلسلي لكل صنف في فورم الاصناف ltems

 في الجزاء السابق انتهينا من برمجة الحسابات الخاصه باجمالي الجمهور واجمالي الشراء وسعر الشراء للوحده وقيمه الربح وايضا برمجنا كيف نضيف اصناف الى داتا كراند فيو وكيف حملنا العملاء وسنكمل ماتبقى من برمجة فاتوره المبيعات… . 

 لو رجعنا لكود الخاص لضافة الاصناف الى داتا كراند فيو وستكون الاضافة بدلاله ld (رقم تسلسلي للصنف) وبالتالي عند اختيار مثلا رقم 1 سوف يضيف اسم صنف وسعره ورصيده الكلي الئ داتا كراند فيو لكن لم يضيف باقي تفاصيل مثل الصلاحيه والرصيد المتاح……

 لذلك نحتاج الى برمجة الاكواد التاليه

     كيف احمل صلاحية في داتا كراند فيو ؟ 

 كيف احمل رصيد(كميته) الصنف اي كم كميه الصنف في المخزن ؟ 

 كيف احسب متوسط سعر الشراء ؟ 

 الجواب 

 - تحميل صلاحية لو رجعنا لجدول expqty في قاعدة بيانات سوف نرى بيانات محفوظه من فاتوره الشراء لاصناف مختلفه وكل صنف له سعر وصلاحيه وكمية و هذا نتيجه شراء وحفظ من فاتوره المشتريات اي بيانات محفوظه نتيجه شراء اصناف من فاتوره الشراء وبالتالي سوف نحمل صلاحية من جدول expqty للاصناف… 

 - تحميل رصيد الصنف في داتا كراند فيو (الرصيد المتاح) حملنا صلاحية الصنف من جدول expqty ومن نفس جدول expqty نحمل رصيد صنف وبالتالي عند تحميل صلاحية صنف ما سوف يحمل لي رصيده تلقائيا لنفس صنف في داتا كراند فيو (الرصيد المتاح) لنفرض لدينا صنف في جدول expqtyuint تم شراءه مرتين لنفس الصلاحية ولكن كمية مختلفه وبالتالي عند بيع هذا صنف سوف يحملي لي صلاحية واحده في حقل داتا كراند فيو وبنفس وقت يحملي لي مجموع هذا الصنف من جدول expqty ويضيفة في حقل الرصيد المتاح وبالتالي بعد برمجة الاكواد اعلاه و عند تنفيذ البرنامج من جديد ونفتح فاتوره المبيعات ونختار صنف ما للاضافة سوف يحمل لي اسم صنف وسعره والرصيد الكلي وعند اختار صلاحيه صنف سوف يحمل لي رصيد متاح تلقائيا للصنف واذا تم بيع كميه ما من حقل الكمية لنفس الصنف سوف يحسبلي الحسابات الخاصه باجمالي الجمهور وصافي الجمهور وقيمه الربح earn واذا كان هناك اي ملاحظات نكتبها في حقل ملاحظات وهكذا نكون انتهينا من تحميل الصلاحية ورصيدها المتاح وتم حساب الحسابات تلقائيا بعد بيع كمية ما…… 

 - متوسط سعر الشراء للصنف : نرجع لجدول expqtyuint اذا كان هناك اصناف متشابهه لنفس صنف لكن يختلف بالسعر والكمية ولكن نفس الصلاحيه اي لنفرض لدينا في جدول expqtyuint عشره اصناف ومن ضمن هذه العشره هناك صنف تم شراءه ثلاثه مرات بسعر وكمية مختلفه ولكن نفس الصلاحية وبالتالي عند بيع هذا الصنف المتكرر سوف يحملي في داتا كراند فيو صلاحية واحده وبنفس الوقت يحملي لي مجموع متوسط سعر الشراء للوحده للثلاثه اصناف اي يجمع لي اسعار وحده للنصف نفسه سوف……

 لتوضيح اكثر ناخذ مثال التالي نفرض في جدول expqtyuint بيانات لاصناف محفوظه لفاتوره الشراء ومن ضمن هذه الاصناف تم شراء صنف (س) ثلاثه مرات في المره الاولى تم شراءه بـسعر (1000) ومره ثانيه لنفس صنف تم شراءه بـسعر (1500 ) وايضا مرة ثالثة تم شراءه نفس صنف بسعر (2000)وبالتالي عند بيع هذا الصنف في فاتوره المبيعات يتم جمع اسعار سعر الوحده للصنف نفس ويصبح المجموع 4500 ومن ثم نقسم هذا المجموع على 3 ويعطينا متوسط سعر الشراءه للوحدة في داتا كراند فيو للحقل متوسط سعر الشراء

  ولتطبيق الكلام اعلاه برمجيا سوف نحتاج الى برمجة اكواد التالية 

 كود تحميل صلاحية الصنف من جدول expqty وتحميلها في داتا كراند فيو في حقل الصلاحية 

  كود تحميل جميع صلاحيات المتشابهه للصنف نفسه في حالة تم شراءه اكثر من مره بسعر وكمية مختلفه وصلاحية متشابهه

      كود تحميل رصيد الصنف من جدول expqtyuint كود جمع جميع اسعار الشراء لمتوسط سعر الشراء للوحده في جدول expqtyuint 

 كود تقسيم مجموع اسعار شراء لسعر الشرأء للوحده للصنف وبالتالي يعطيني متوسط سعر الشراء للنصف في داتا كراند فيو برمجة الكلام اعلاه  جميع الاكواد اعلاه نكتبها في حدث CellEndEdit للداتا كراند فيو ونكتبها بالتسلسل 

 ملاحظه جدا مهمه حتئ لا يحدث لدينا خطا عند برمجة كود الصلاحية او اي كود نذهب الى قاعدة البيانات ونفتح جدول operations ثم نفتح الجدول في عرض التصميم ونغير نوع بيانات حقل saleexp الى نص text وايضا نذهب إلى جدول expqty ونغير نوع بيانات حقل exp الى نص text 

 نبدا علئ بركة الله ببرمجة الاكواد وبما ان الاكواد كلها في حدث CellEndEdit سوف اضع جميع الاكواد كلها واشرحها كود تلو الاخر 

 نحدد داتا كراند فيو ومن الخصائص نختار الاحداث ونختار حدث CellEndEdit ونكتب جميع الاكواد كالتالي :

.vb
	  
  '======كوداضافة صلاحية في داتا

  Dim exp As New DataGridViewComboBoxCell

  exp =
  DataGridView1.Rows(DataGridView1.Rows.Count - 1).Cells(4)



  '========كودتحميل جميع صلاحيات متشابه للصنف نفسة من جدول اكسباير كونتي expqtyuint



  Dim dt As New DataTable

  Dim da As New OleDbDataAdapter

  dt.Clear()

  da = New OleDbDataAdapter("select * from expqty where drugname = '" & DataGridView1(1, DataGridView1.CurrentRow
  .Index).Value & "' and qty > 0", con)

  da.Fill(dt)

  If dt.Rows.Count > 0 Then

  exp.Items.Clear()

  '===============


  For i As Integer = 0 To
  dt.Rows.Count - 1 ' 
  exp.Items.Add(dt.Rows(i)
  .Item("exp"))


  '============ايجاد رصيد الصنف للصلاحية نفسها


  If DataGridView1(4, DataGridView1.CurrentRow
  .Index).Value = dt.Rows(i).Item("exp") Then

  DataGridView1(5, DataGridView1.CurrentRow
  .Index).Value = dt.Rows(i).Item("qty")

  End If

  Next

  End If


  '====================='
  '==========كود تقسيم الاصناف متشابهه على عددهم يعطينا متوسط سعر الشراء


  Dim dt2 As New DataTable

  Dim da2 As New
  OleDbDataAdapter("select * from Expqtyuint where drugname = '" &
  DataGridView1(1, DataGridView1.CurrentRow.Index).Value & "' and qty > 0  ", con)

  da2.Fill(dt2)

  Dim count As Integer = dt2.Rows.Count



  '==================ايجاد مجموع سعر الشراء لجميع الاصناف المتشابهه للصنف نفسه


  Dim mynewldexpqtyunit As Double

  Dim dt1 As New DataTable

  Dim da1 As New OleDbDataAdapter("select sum(unitprice) from Expqtyuint where drugname = '" & DataGridView1(1, DataGridView1.CurrentRow.Index).Value & "' and qty > 0  ", con)

  da1.Fill(dt1)

  If IsDBNull(dt1(0)(0)) = True Then

  mynewldexpqtyunit = 0

  Else

  mynewldexpqtyunit = dt1(0)(0)

  End If

  DataGridView1(10, DataGridView1.CurrentRow
  .Index).Value = (mynewldexpqtyunit) / count


  ''========استدعاء اجراء الحسابات

  salecale()
	

شرح الاكواد اعلاه  

 الكود الاول الخاص باضافه الصلاحية عرفنا متغير exe لتحديد خيله حقل الصلاحيه في الداتا كراند فيو ثم جعلنا متغير exe يساوي حقل الصلاحية في داتا كراند فيو تسلسله 4 

 شاهد فيديو تحت رقم 1 توضيح كيف تم تحميل الصلاحية 

كود تحميل الصلاحية عرفنا داتا تيبل و داتا ادبتر ثم افرغنا بيانات بعد تحميل صلاحية ثم حددنا select الصلاحية من جدول expqty بشرط where اذا كان الصنف كميته اكبر من صفر ثم ملئنا دتي بالبيانات اذا كانت اكبر من صفر 

 شاهد فيديو تحت رقم 2 توضيح كيف تم تحميل الصلاحية للاصناف المتشابهه 

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

    الشرط اذا كانت داتا كراند فيو في حقل صلاحية 4 تساوي قيمه value دتي الي هي الصلاحية بيضهرلي الرصيد في داتا كراند فيو الي في حقل الرصيد المتاح تسلسله 5 بيساوي قيمه داتا كراند فيو من حقل qty في قاعده بيانات لجدول expqty 

 شاهد فيديو تحت رقم 3 توضيح كيف تم تحميل رصيد الصنف بعد تحميل الصلاحية 

 كود تقسيم الاصناف المتشابهه في الصلاحية والمختلفه في كمية عددهم

     عرفنا متغيرات للداتا تيبل وداتا ادبتر وحددنا select سعر وحده شراء للوحده للصنف من جدول expqtyuint بشرط اذا كان صنف بيساوي كمية الصنف اكبر من صفر ثم ملئنا دتي بالبيانات 

 شاهد فيديو تحت رقم 4 توضيح كيف تم تقسيم وايجاد متوسط سعر الشراء 

 كود جمع اسعار شراء للوحده للاصناف المتشابهه 

 عرفنا متغير count وايضا عرفنا متغير. Mynewldexpqtyunit من نوع عشري ثم عرفنا متغيرات للداتا تيبل وداتا ادبتر ثم حددنا select جميع الاصناف وجمعنا الاصناف المتشابهه SUM من جدول expqtyuint للوحده unitprice بشرط where اذا كانت الصنف في داتا كراند فيو تسلسله 1 يساوي قيمه كمية من جدول expqty من حقل qty ثم ملئنا دتي بالبيانات واخيرا استدعينا اجراء خاص بالحسابات Salecale 

 ملاحظه 

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

 شاهد فيديو تحت رقم 5 توضيح كيف تم تحميل ايجاد اجمالي الشراء 

 شاهد فيديو رقم 1 توضيح كيف تم تحميل الصلاحية 

 شاهد فيديو رقم 2 توضيح كيف تم تحميل الصلاحيات المتشابهه للصنف نفسه في حاله تم بيعه عده مرات بسعر وكمية مختلفه وبصلاحيه متشابهه 

شاهد فيديو رقم 3 توضيح كيف تم تحميل تحميل الرصيد المتاح في داتا كراند فيو datagridview…… 

شاهد فيديو رقم 4 توضيح كيف تم ايجاد متوسط سعر الشراء في داتا كراند فيو في حاله بيع نفس صنف بسعر وكمية مختلفه وصلاحيه متشابهه وايضا ايجاد مجموع اسعار للوحده 

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

شاهد فيديو رقم 6 كيف تم كتابه وترتيب وبرمجة جميع الاكواد المذكوره في الشرح اعلاه ملف نصي بصيغه text وضعت لكم فيه جميع الاكواد المستخدمه في الشرح اعلاه جاهزه للاستخدام 

 لم يتبقى الا القليل وننتهي من برمجة فاتوره المبيعات بشكل كامل وفي الدرس القادم سنبرمج التالي : زر الخاص بحفظ فاتوره المبيعات ❌ زر الحذف للصنف

    وبرمجة كود تعديل الكمية في المخزن بحيث اذا تم بيع كمية لصنف معين وكانت الكمية اكبر من الرصيد الموجود في المخزن الرئيسي سوف تظهر رساله للمستخدم لتنبيه علئ ان الكمية المطلوبه اكبر من الرصيد الحالي

………

برمجة زر الحذف وزر الحفظ

 بقئ لدينا برمجة زر الحذف وزر الحفظ وكود اذا تم بيع كمية اكبر من رصيد في المخزن الرئيسي تظهر رساله للمستخدم تنبيه على ان الكمية المطلوبه اكبر من الرصيد المتاح وبالتالي نكون قد انتهينا من برمجة فورم فاتوره المبيعات بشكل كامل… 

  برمجة زر الحذف 

 ننقر نقرتين على زر الحذف ونكتب الكود التالي :

.vb
	  
	
  If DataGridView1.Rows.Count > 0 Then
  DataGridView1.Rows.RemoveAt(DataGridView1.CurrentRow
  .Index)

  ElseIf

  DataGridView1.Rows.Count = 0 Then

  MsgBox("لاتوجد اصناف لحذفها")

  End If
	

شرح الكود 

 اذا كانت داتا كراند فيو اكبر من صفر احذف لي الصنف اي عندما تكون فاتوره المبيعات تم اضافة فيها اصناف او صنف يتم الحذف او ElseIf اذا كانت داتا كراند فيو اقل من صفر اضهرلي رساله لا توجد اصناف لحذفها اي عند ضغط على زر الحذف وليس هناك صنف لحذفه تضهر لي الرساله هذا كل مافي الكود… ..

 لاحظ ترتيب الكود اعلاه في الفورم كما في صورة رقم 1 

شاهد بالفيديو رقم 1 مثال كيف تم حذف الصنف

   برمجة كود الكمية المطلوبه اكبر من الرصيد المتاح 

في نفس حدث الذي استخدمناه سابقا وهو حدث الداتا كراند فيو CellEndEdit نكتب الكود التالي وراء كود سابق في نفس الحدث كالتالي : .vb

	

  If DataGridView1(6, DataGridView1.CurrentRow
  .Index).Value > DataGridView1(3, DataGridView1.CurrentRow
  .Index).Value Then


  DataGridView1(6, DataGridView1.CurrentRow
  .Index).Value = 0


  DataGridView1(7, DataGridView1.CurrentRow
  .Index).Value = 0 


  DataGridView1(9, DataGridView1.CurrentRow
  .Index).Value = 0 


  DataGridView1(11, DataGridView1.CurrentRow
  .Index).Value = 0 


  DataGridView1(12, DataGridView1.CurrentRow
  .Index).Value = 0 


  DataGridView1(10, DataGridView1.CurrentRow
  .Index).Selected = True


  MsgBox("الكمية المطلوبة اكبر من الرصيد المتاح")

  End If
  

شرح الكود 

 اذا كانت If داتا كراند فيو في حقل الكميه المطلوبه تسلسله 6 اكبر من كمية موجوده في مخزن الرئيسي في حقل الرصيد الكلي تظهر رساله للمستخدم الكمية المطلوبة اكبر من الرصيد المتاح وقبل رساله مسج بيصفر لي الحقول بعد رفض كمية وهذه الحقول هي حقل الكمية تسلسله 6 في داتا كراند فيو حقل اجمالي الجمهور تسلسله 7 حقل صافي الجمهور تسلسله 9 حقل اجمالي الشراء تسلسله 11 حقل قيمه الربح تسلسله 12 🌇لاحظ كيف تم ترتيب كود كمية اعلاه كما في صورة رقم 2 🌇شاهد فيديو🎞 رقم 2 توضيح مثال كيف تم رفض كمية المطلوبه اذا كانت اكبر من الرصيد المتاح في المخزن الرئيسي صورة رقم 1 توضيح ترتيب كود الحذف 🌇فيديو🎞 رقم 1 توضيح مثال كيف تم حذف صنف ❌ من داتا كراند فيو datagridview…… 🌇صورة رقم 2 توضيح لكود الكمية المطلوبه اكبر من الرصيد المتاح💰 🌇فيديو🎞 رقم 2 توضيح مثال كيف تم رفض كمية مطلوبه عند بيع كمية اكبر من الرصيد الحالي في المخزن الرئيسي

برمجة زر الحفظ طبعا حفظ فاتورة المبيعات

 اهم شي في الفورم واعتبره اهم واكبر كود في الفورم ولا قيمه للاكواد السابقه ما لم يتم حفظ الفاتورة في قاعده بيانات طيب كيف يتم حفظ الفاتورة وماهي هي الحقول التي نريد حفظها في قاعده بيانات ؟

 زر حفظ الفاتورة يتكون من الاكواد التاليه : 

 كود ادراج الحقول التي نريد حفظها في قاعده بيانات 

 كود تعديل كمية في مخزن الرئيسي بعد بيع كميات معينه 

 كود تعديل رصيد العميل 

كود ادراج الحقول في قاعدة بيانات اي حفظ جميع الحقول في داتا كراند فيو لفاتوره المبيعات في قاعده بيانات وبالخصوص في جدول salepill طيب ماهي الحقول التي نحتاجها لادراجها وحفظها في قاعدة بيانات ؟ اخي المبرمج لديك الحريه في ادراج الحقول التي تريد ان تحفظها في جدول salepill من خلال جملة lnsert بحيث وضع ما يقابل حقل معين من جدول salepill مع ما يقابلها في جملة lnsert وكل حقل له نوع بيانات مثلا حقل الصنف هو من نوع نص وبالتالي عند وضع اسم الصنف في جملة lnsert يجب وضعه بين علامتين كونتيشن وتنصيص ' " & & " ' اما اذا كان من نوع رقمي فيتم وضعه بين علامتين "&&" وهكذا لكن كود insert فقط لادراج اما الحفظ نحتاج الى كود لحفظ جميع حقول وسنعمله في اجراء خاص للحفظ 

 -  كود تعديل كمية المخزون

 نفرض لدينا مخزن رئيسي فيه اصناف معينه وكل صنف له كمية معينه وبالتالي عند بيع صنف معين وكمية معينه سوف يتم طرح كميه مباعه من المخزن الرئيسي….. 

 - كود تعديل رصيد العميل

 اي اذا تم بيع فاتوره بالاجل سوف يتم اضافة مبلغ اجمالي بيع فاتوره المبيعات الئ رصيده السابق بشرط اذا كان رصيده سابق صفر اما اذا كان رصيده سابق مثلا 5000 او اي رقم سوف يتم طرح اجمالي بيع فاتوره من رصيده الحالي #اذا كان بيع فاتوره اجل فسيكون لدينا حالتين 

-- الحاله الاولئ اذا تم بيع فاتوره اجل ورصيده صفر سوف يتم اضافة مبلغ فاتوره كاملا 

-- الحاله الثانيه اذا تم بيع فاتوره اجل ولديه رصيد معين ايضا لدينا حالتين ➖اذا كان رصيده اكبر من مبلغ فاتورة مبيعات سوف يتم طرح مبلغ فاتوره من رصيده سابق ويبقى باقي من رصيده يطلب شركه او سوبر ماركت 

- اما اذا كان رصيده اقل من مبلغ فاتورة مبيعات سوف يتم طرح مبلغ فاتوره من رصيده ويبقى مطلوب باقي مبلغ فاتوره مبيعات للشركه 

لنفرض لدنيا عميل (س) من ناس ولديه رصيد 400 وتم بيع له فاتوره مبيعات بالاجل بقيمه 500 وبالتالي عند حفظ الفاتورة سوف يتم تعديل على رصيده بحيث يتم طرح 400 من 500 ويبقى 100 سالب اي العميل مطلوب 100 للشركه او سوبر ماركت التي بيع له فاتوره 

اما اذا كان بيع فاتوره له كاش سوف يقوم بالعميل بدفع 100 اضافية فوق رصيده سابق 400 حتئ يصبح مبلغ فاتوره 500 مساوي لرصيده 400 و 100 التي قام بدفعها 

اذن نقوم ببرمجة الكلام اعلاه نقوم بانشاء اجراء خاص لحفظ حقول جدول salepill 

 ننقر نقرتين على فورم فاتوره مبيعات ونقوم بانشاء الاجراء الخاص بالحفظ ونمسيه save_selepill ويصبح الكود كالتالي :

.vb
	  
  Public Sub save_selepill()


  selepilldt.Rows.Add()
  Dim last As Integer = selepilldt.Rows.Count - 1


  selepilldt.Rows(last).Item
  ("saleadd") = seleadd.Text


  selepilldt.Rows(last).Item
  ("salecash") = selecash.Checked


  selepilldt.Rows(last).Item
  ("salecustomer") = selecustmer.Text


  selepilldt.Rows(last).Item
  ("saledate") = seledate.Value


  selepilldt.Rows(last).Item
  ("saleearn") = seleearn.Text


  selepilldt.Rows(last).Item
  ("saleearnpercent") = seleearnpercent.Text


  selepilldt.Rows(last).Item
  ("saleld") = seleld.Text


  selepilldt.Rows(last).Item
  ("saleltemcount") = seleltemcount.Text


  selepilldt.Rows(last).Item
  ("saleminus") = seleminus.Text


  selepilldt.Rows(last).Item
  ("salepostpone") = selepostpone.Checked


  selepilldt.Rows(last).Item
  ("saletime") = seletime.Value


  selepilldt.Rows(last).Item
  ("saletotalg") = seletotalg.Text


  selepilldt.Rows(last).Item
  ("saletotals") = seletotals.Text


  selepilldt.Rows(last).Item
  ("saleuser") = seleuser.Text


  Dim save As New OleDbCommandBuilder
  (selepillda)


  selepillda.Update(selepilldt)


  selepilldt.AcceptChanges()


  End Sub
	

الكود لا يحتاج إلى شرح لانه واضح وتم شرحه اكثر من مره وملخص الكود وضعنا كل حقل من حقول في جدول salepill ما يقابله من تكس بوكس مخص له على تصميم الفورم

 لاحظ ترتيب برمجه كود اعلاه كما في صورة رقم 1 صورة رقم 1 توضيح ترتيب الاجراء save_selepill تكملةالدرس الخاص بزر الحفظ لفاتوره المبيعات قبل برمجة زر الحفظ نقوم بانشاء ثلاثه متغيرات عامه في مديول لانه سوف نحتاجهم في كود ادراج الحقول وكود تعديل كمية وكود تعديل رصيد مورد وكالتالي :

.vb
	  
  Public custmerscmd As New OleDbCommand 

  Public opertioncmd As New OleDbCommand 

  Public ltemscmd As New OleDbCommand  
	

لاحظ ترتيب اكواد متغيرات كما في صوره رقم 1

 برمجة زر حفظ فاتورة

 ننقر نقرتين على زر الحفظ ونكتب الاكواد الثلاثه الخاصه بكود ادراج الحقول للحفظ وكود تعديل كمية المخزن الرئيسي بعد بيع وكود تعديل رصيد المورد وكالتالي :

.vb
	  
  If selecash.Checked = False And selepostpone.Checked = False Then

  MsgBox("يرجى اختيار نوع التعامل اجل او نقدي")
  selecash.Focus()


  ElseIf


  selepostpone.Checked = True And selecustmer.Text = Nothing Then

  MsgBox("يجب اختيار عميل للفاتورة")


  ElseIf


  DataGridView1.Rows.Count = 0 Then
  MsgBox("لاتوجد اصناف لحفظها")

  Else


  loadseleQ()

  salecale()


  ===كود ادراج حقول داخل جدول salepill=======



  For i As Integer = 0 To DataGridView1.Rows.Count - 1


  opertioncmd = New OleDbCommand("insert into operations (operltem,saleqty,saletotalb,
  saletotalg,saleld) values ('" &
  DataGridView1(1, DataGridView1.Rows(i).Index).Value & "'," & DataGridView1(6, DataGridView1.Rows(i).Index).Value & ",'" & DataGridView1(11, DataGridView1.Rows(i).Index).Value & "'," & DataGridView1(9, DataGridView1.Rows(i).Index)
  .Value & ",'" & seleld.Text & " )", con)


  con.Open()
  opertioncmd.ExecuteNonQuery()

  con.Close()

  Next



  '=== كود تعديل الكمية اي طرح مايتم بيعة من المخزن


  For z As Integer = 0 To DataGridView1.Rows.Count - 1


  Dim newqtw As Double
  newqtw =


  Val(DataGridView1(3, DataGridView1.Rows(z).Index).Value) - Val(DataGridView1(6, DataGridView1.Rows(z).Index).Value)


  ltemscmd = New OleDbCommand("update ltems Set ltemqty = " & newqtw & " where ltemname = '" & DataGridView1(1, DataGridView1.Rows(z).Index).Value & "' ", con)


  con.Open()

  ltemscmd.ExecuteNonQuery()

  con.Close()


  Next




  '=======كود تعديل رصيد المورد 



  If selepostpone.Checked = True Then


  Dim newbalenc As Double


  newbalenc = Val(Label3.Text) - Val(seletotalg.Text)


  custmerscmd = New OleDbCommand("update customers set customerbalance = " & newbalenc & " where customername = '" & selecustmer.Text & "'", con)


  con.Open()

  custmerscmd.ExecuteNonQuery()


  con.Close()


  End  if


  save_selepill()


  MsgBox("تم حفظ البانات بنجاح")


  load_selepill()


  newselepill()


  loadseleQ()


  End If
	

صورة رقم 1 توضيح ترتيب اكواد متغيرات الثلاثه في مديول 

 شرح الاكواد الثلاثه الخاصه بزر الحفظ ➖في بدايه الاكواد وضعنا رسائل تاكيد على المستخدم بادخال البيانات المطلوبه منه مثلا رساله نوع التعامل اجل او كاش ورساله اختيار عميل للفاتوره ورساله اذا تم حفظ بدون اضافة اصناف الئ داتا كراند فيو تضهر رساله توكد لا توجد اصناف لحفظها ➖ثم استدعينا كود اجراء تحميل بيانات الاستعلام للحقول ➖و استدعينا ايضا اجراء الخاص بالحسابات 

 شرح كود ادراج حقول في جدول salepill عرفنا جملة for حتئ يلف لي من اول حقل تسلسله 0 الى اخر صف في داتا كراند فيو ثم جعلنا متغير opertioncmd الخاص بالحقول الذي عرفنا في مديول يساوي اتصال كومند لادراج الحقول insert في جدول operations باعتبار هناك علاقه بين حقول هذا الجدول وجدول salepill وايضا جدول operations يعتبر بمثابة حركة فاتورة الشراء وفاتورة المبيعات ثم فتحنا اتصال con.Open وجعلناه يقراء الاتصال واخير انهينا اتصال con.Close

 ⚙🔸شرح كود تعديل كمية ايضا عرفنا جملة for حتئ يلف حول كل حقول داتا كراند فيو ثم عرفنا متغير newqty اي كمية جديده مضافة ثم جعلنا متغير newqty يساوي قيمه رصيد الكلي في داتا كراند فيو تسلسله 3 ناقص الكمية الجديده المدخله من قبل مستخدم تسلسله 6 ثم جعلنا متغير ltemscmd الذي عرفناه في مديول الخاص بالكمية بيساوي بين قوسين update لتعديل كمية في جدول الاصناف ltems عندما تساوي الكمية الجديده newqty للصنف ltemname في داتا كراند فيو تسلسله 1 الصنف ثم فتحنا اتصال con.Open ثم قراءة الاتصال ثم انهينا الاتصال con.close

 شرح كود تعديل رصيد العميل

 اذا كان if تم بيع بالاجل يساوي true اي عندما نضع اشاره علئ زر اجل ثم عرفنا متغير newbalenc حتى ياخذ متغير رصيد ثم جعلنا متغير newbalenc يساوي قيمه ليبل label3 الذي هو( الرصيد الحالي )في تصميم ناقص قيمه اجمالي الجمهور (تكس بوكس) ثم جعلنا متغير custmerscmd الذي عرفنا في مديول الخاص بالعميل يساوي update تعديل رصيد العميل في جدول Customers من حقل Customerbalance عندما يساوي هذا حقل كمية جديده بشرط where اذا كان اسم العميل تم اختياره customername ثم فتحنا الاتصال con.open ثم قراءة الاتصال ثم انهينا الاتصال con.close بعدها استدعينا اجراء الخاص بحفظ الخقول save_selepill بعدها رساله تاكيد تم حفظ البيانات بنجاح msgbox ثم استدعينا لود load جدول salepill بعد كل عمليه حفظ ثم استدعينا اجراء newselepill الخاص بتفريغ تكستات بوكس من بيانات بعد كل عمليه حفظ واخير استدعينا اجراء الخاص بتحميل حقول داتا كراند فيو loadseleQ هذه كل مافي الاكواد اعلاه من توضيح 

 شاهد بالفيديو رقم 1 مثال توضيح كيف تم تعديل الكمية في المخزن الرئيسي بعد بيع كميات معينه 

 شاهد بالفيديو رقم 2 مثال توضيح كيف تم تعديل رصيد العميل بعد بيع بالاجل والكاش 

شاهد بالفيديو رقم 3 كيف تم حفظ فاتوره المبيعات في قاعده بيانات

 شاهد بالفيديو رقم 4 توضيح كيف تم كتابه وترتيب وبرمجة الاكواد اعلاه في زر الحفظ لفورم فاتوره المبيعات 

فيديو🎞 رقم 1 لتوضيح كيف تم تعديل كمية في مخزن الرئيسي بعد بيع كمية معينه 🌇فيديو 🎞رقم 2 توضيح كيف تم تعديل رصيد العميل بعد بيع فاتوره المبيعات اجل او كاش 🌇فيديو 🎞رقم 3 توضيح كيف تم حفظ فاتوره المبيعات في قاعدة البيانات 🌇فيديو 🎞رقم 4 توضيح كيف تم كتابه وترتيب وبرمجة الاكواد الثلاثه الخاصه بزر الحفظ لادراج الحقول وتعديل الكمية وتعديل رصيد العميل في فورم فاتوره المبيعات 

ملف نصي بصيغه text وضعت لكم فيه اكواد الثلاثه الخاصه بزر الحفظ الذي يتكون من كود لادراج الحقول وكود تعديل كمية في المخزن الرئيسي بعد البيع وكود تعديل رصيد العميل بعد بيع فاتوره مبيعات اجل او كاش 

الئ هنا ننتهي من تصميم وبرمجة فورم فاتورة المبيعات بشكل كامل بعد دروس متواصله ومتسلسله… .. 

سنكمل في الدرس القادم بتصميم وبرمجة ماتبقى من مشروعنا الكبير (السوبر ماركت )

الفورمات كالتالي : 

فورم الموردين 

فورم العملاء 

 فورم الاصناف 

 فورم المكان 

فورم المجموعة 

 فورم الشركة  

فورم فاتوره المبيعات 

 فورم مرتجع البيع

 فورم فاتوره المشتريات

 فورم مرتجع الشراء 

  فورم الحضور

  فورم الانصراف  

فورم الموظفين  المسخدمين

فورم صرف وتوريد النقديه

  فورم المصروفات

  فورم حساب الايراد اليومي

   هذه جميع فورمات التي تم تصميمها وبرمجتها في نظام السوبر ماركت و بالتالي نستطيع ان نمنع الموظف من الدخول لاحد الفورمات من خلال فورم الصلاحيات او العكس .