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

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

  ماهو مرتجع الشراء ؟ 

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

 وفورم مرتجع الشراء بقوه فورم فاتورة الشراء .

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


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

الخطوات : 
  نفتح مشروعنا ونضيف فورم جديد من خلال قائمه project ثم نختار add windows from ثم نكتب اسم الفورم Rebuy ونضغط على add للاضافة 

 من صندوق الادوات نضيف الادوات التالية على الفورم كما يلي :- 

 نضيف 4 RadioButton ونسمي كل واحد من الاربعه تسميه Text كما يلي 

 الصنف RadioB1 

  المورد RadioB2 

  كاش RadioB3 

  اجل RadioB4

 اما تسميه برمجية يبقى اسمها كما هو RadioButton1 -  نضيف 3 Button ونسمي كل واحد منهم من الثلاثه تسميه Text كما يلي : 

 حفظ المرتجع 

  مرتجع جديد 

 بحث ايضا التسميه البرمجية تبقئ كما هي Button

 - نضيف 2 ComboBox 

 -  نضيف 4 TextBoxt ونضع امام كل textbox ليبل label ونسمي الليبلات الاربعه تسميه Text كما يلي :  التسلسل 

  المستخدم

     اجمالي المرتجع 

 عدد الاصناف المرتجعه

      نحن وضعنا امام كل textbox ليبل label وسمينا الليبلات بحيث اخذ TextBox تسميته من اللايبلات وبالتالي نسمي TextBox تسميه برمجية كما يلي : 

 التسلسل نسميه rebuyld 

  المستخدم نسميه rebuyuser 

 اجمالي المرتجع نسميه rebuytotolg 

  عدد الاصناف المرتجعه نسميه rebuyltemcount 

 - ثم  نضيف 4 DateTimePicker ثم نضع امام كل واحد ليبل label ونغير اسم اللايبلات تسميه Text كما يلي : التاريخ الان 

 الوقت الان ➖ ونغير اسم (التاريخ الان ) تسميه برمجيه Rebuydate ونغير اسم (الوقت الان) تسميه برمجيه Rebuytime * نحدد Rebuytime مقابيل (الوقت الان) الذي قمنا بتسميته ومن الخصائص نختار CustomFomat ونكتب الكود تالي yyyy/MM/dd ss:mm:hh tt حتئ يضهر لنا الوقت بالساعات واالدقايق والثواني……… 

 ➖ يبقى لدينا اثنين DateTimePicker ايضا نضع امام كل واحد ليبل label ونغير اسم الليبل تسميه Text كما يلي :

  من تاريخ DateTimePicker1 

 الى تاريخ DateTimePicker2 اما تسميه برمجيه تبقئ كما هي اعلاه 

 -  نضيف اداة datagridview لتحميل البيانات عليها  

هذه جميع  الادوات التي نحتاجها في فورم مرتجع الشراء .

 يصبح الفورم النهائي كما في الصورة .

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

ربط فورم مرتجع الشراء ب الفورم الرئيسي

بعدها نربط فورم المرتجع بفورم الرئيسي manipage وبالتالي نذهب الى فورم manipage وعند قائمه المشتريات نضيف فرع ونسميه مرتجع الشراء ثم ننقر عليه ونكتب الكود التالي : mainpage.vb

	  Rebuy.MdiParent = Me

	  Rebuy.WindowState = FormWindowState.Maximized

	  Rebuy.Show()

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

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

كيف يتم استرجاع المشتريات ؟ 

  كيف يعمل مرتجع شراء ؟ 

 لنفرض جاء احد موردين الى شركة وقام بشراء فاتوره باصناف مختلفه بتاريخ 2019/4/20 ثم جاء نفس المورد الى شركة بتاريخ 2019/4/25 اي 5 ايام مرت من بيع هذه الاصناف وقال لديه 3 اصناف فيها خلل مصنعي اي يوجد بها عيوب والتكن الثلاثه اصناف من نوع واحد هي (مكينه لحام) ويريد استرجاعها الى شركة في هذه حاله ياتي صاحب البائع الذي سجل فاتوره شراء للمورد حتئ يتاكد هل هو بالفعل باع هذه ثلاثه اصناف الى مورد فيها عيوب وبالتالي اذا كان المورد صادق سوف يتم استرجاعها او اذا قال بائع انا لم ابيع هذا الاصناف سوف لم يتم استرجاعها ولنفرض المورد صادق بكلامه وبالتالي يتم استرجاع الاصناف بعد مايتم خصم كميتها من المخزن الرئيسي في الشركه من خلال فتح نظام سوبر ماركت الذي نعمل عليه ثم نفتح فورم مرتجع الشراء وناخذ تاريخ شراء الاصناف ثلاثه 2019/4/20 ونذهب الى خانه بحث ونختار نوع بحث اما بحث بالصنف او المورد او اجل ام كاش ولنفرض بحث بالصنف نضع اشارة امام RadioButton الصنف ثم نحدد تاريخ شراء من خلال DateTimePicker1 باعتبار يوم تاريخ الذي نسترجع فيه الاصناف هو 2019/4/25 وبالتالي نقوم بتغير تاريخ من خلال البحث من تاريخ ونجعله 2019/4/20 ونضغط على زر بحث سوف يبحث لي ويظهر لي تواريخ لبيانات كثيره وبالتالي نعرفه من خلال اسم مورد وبعد حصولنا على بيانات مورد نكتب في داتا كراند فيو في حقل كمية الاسترجاع كم صنف 3 ثم وبالتالي يتم سعر هذه الاصناف من رصيد مورد بشرط ان يكون نقدا فاتوره شراء ولديه رصيد متبقي يتم خصم منه سعر هذه الاصناف .

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


صورة  ربط فورم مرتجع الشراء بفورم الرئيسي manipage للبرنامج  وكتبنا فرع داخل قائمة المشتريات باسم مرتجع الشراء .

صورة  ربط فورم مرتجع الشراء بفورم الرئيسي manipage للبرنامج


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

كود  ربط فورم مرتجع الشراء بفورم الرئيسي manipage للبرنامج


ما يهمنا قبل برمجة الفورم هي داتا كراند فيو datagridview .

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

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

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


بعد ذلك نقوم بربط هذه الحقول اعلاه بمكان ما يقابله من حقول داخل قاعدة البيانات اي ياخذ كل حقل اعلاه مكانه في قاعدة بيانات (الجداول) وذلك من خلال نفس السهم الذي قمنا من خلاله باضافة الحقول اعلاه نضغط عليه ثم نختار Edit columns ثم تظهر لنا على جهة اليسار جميع الحقول التي قمنا باضافتها بعدها نختار مثلا حقل رقم الفاتورة وعلئ جهة اليمين نختار DatapropertyName ثم في مربع none نكتب معرف حقل رقم فاتوره وهو Rebuyld ونضغط ok ثم نختار الحقل ثاني وهو تاريخ الفاتورة وايضا في مربع none نكتب معرف حقل في جدول Buydate ثم نضغط ok وهكذا الى ان ننتهي كتابه جميع الحقول وتكملة البقية كالتالي : رقم الفاتورة ➖ ➖➖Buyld تاريخ الفاتورة ➖➖➖ Buydate كاش ➖➖➖Buycash اجل ➖➖➖ Buypostpone المورد➖➖➖ Buylmporter الصنف ➖➖➖ Operltem الصلاحية ➖➖➖Operltemexp كمية الشراء➖➖➖Buyqty كمية المرتجع ➖➖➖ اجمالي المرتجع ➖➖➖ الملاحظات ➖➖➖ الخصم ➖➖➖ Buydisconund اجمالي الجمهور ➖➖➖ Buytotalg سعر شراء الوحدة ➖➖Buyunitprice اجمالي الشراء ➖➖➖Buytotalb قيمه الربح ➖➖➖Buyearn رقم المرتجع ➖➖➖ Rebuyld عدد الاصناف المرتجعه ➖➖ ➖ 

  ملاحظه 

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

     ملاحظه

  حقل كاش والاجل يجب تغير نوع البيانات التي سوف تحفظ فيها من خلال داتا كراند فيو وسهم بجانب اليمن كلك ايسر ثم Edit columns ثم نحدد حقل كاش ثم من خيارات ع جهته اليمين نختار خيار Column Type ثم نختار خيار DatagridviewChecBoxColumn باعتبار هذا الحقل نوع بياناته نعم / لا وكذلك حقل اجل نغير نوع بيانات كما في الكاش

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


في الفيديو انا ربطت كم حقل وانت اخي المبرمج بتكمل البقيه فقط اخذ معرف مايقابل حقل وضعه في مربع none

 صورة  توضيح لاضافة حقول على داتا كراند فيو datagridview

صورة  توضيح لاضافة حقول على داتا كراند فيو datagridview

صورة رقم 2 توضيح تكملة اضافة الحقول في داتا كراند فيو datagridview .



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

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

الان  سنحمل بيانات الصنف في ComboBox1 الموجود على داتا كراند فيو وايضا نحمل بيانات المورد في ComboBox2 الموجود على داتا كراند فيو ويتم ذلك من خلال النقر على فورم مرتجع الشراء Rebuy نقرتين وفي حدث اللود load نكتب الكود التالي الخاص بتحميل بيانات الصنف وبيانات المورد : Rebuy.vb .

    
  === تحميل الاصناف في كوكبو بوكس

  load_ltmes()


  ComboBox1.DataSource = ltmesdt

  ComboBox1.DisplayMember = "ltemname"


  ComboBox1.ValueMember = "ltemld"


  '=== تحميل المورد في كوكبو بوكس

  load_lmporters()


  ComboBox2.DataSource = lmportersdt

  ComboBox2.DisplayMember = "lmportername"


  ComboBox2.ValueMember = "lmporterld"

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

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

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


الاتصال بجدول مرتجع الشراء

بعد ذلك وكالعادة نقوم بتعريف متغيرات داتا تيبل dt و داتا اول دبيدي ادبتر da وكذلك نعرف ld جنيريشن وايضا نعرف Code وجملة اللود load الخاصه بجدول مرتجع الشراء Rebuypill .

 اذن نقوم بفتح مديول module ونعرف المتغيرات اعلاه ونكتب الاكواد التاليه : Module1.vb

  Public Redbuypilldt As New DataTable

  Public Redbuypillda As New OleDbDataAdapter

  Public mynewldredbuypill As Integer

  Public Redbuypillcmd As New OleDbCommand



  Public Sub code_redbuypill()

  Dim dt As New DataTable
  Dim da As New

  OleDbDataAdapter("select max(rebuyld) from rebuypill", con)

  da.Fill(dt)

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

  mynewldredbuypill = 1

  Else

  mynewldredbuypill = dt(0)(0) + 1

  End If

  End Sub




  Public Sub load_Redbuypill()

  Redbuypilldt.Clear()

  Redbuypillda = New OleDbDataAdapter("select *
  from rebuypill", con)

  Redbuypillda.Fill(Redbuypilldt)

  End Sub

 الكود اعلاه لا يحتاج إلى شرح لانه تم شرحه في دروس سابقه عده مرات .

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

كود الاتصال بجدول مرتجع الشراء

 تحميل بيانات مرتجعات الشراء

وفي نفس لود load الخاص بالفورم نستدعي متغير من مديول لتحميل بيانات جدول Rebuypill مرتجع الشراء ونكتب الاستدعاء التالي : Rebuy.vb

  load_Redbuypill()

  DataGridView1.DataSource = Redbuypilldt

 لاحظ الصورة كيف تم استدعاء تحميل جدول Rebuypill في حدث اللود load 


 بعدنا نتكلم عن داتا كراند فيو datagridview لانها هي التي نرى النتائج من خلالها وهي التي تضهر لنا بيانات على الفورم في الدرس سابق قمنا باضافة الحقول على داتا ثم ربطنا هذه الحقول بما يقابلها في قاعده بيانات وبالتالي نريد عندما يتم تنفيذ البرنامج وتشغيل فورم مرتجع الشراء يجب ان يحمل لي بيانات الحقول التي قمنا باضافتها .
 وبما ان الحقول التي قمنا باضافتها ليست من جدول واحد اي اخذنا حقول متنوعه وليس من المعقول ان نحمل جدولين في نفس وقت ليضهرلي البيانات التي نحتاجها وفي هذه الحاله نحتاج إلى عمل تصميم علاقه استعلام اي نستعلم عن الحقول التي نريدها من خلال جدولين هما جدول Operations , and buypill 
 

كيف نقوم بانشاء هذه العلاقة ؟

 انا قمت بشرح هذه الطريقه سابقا ولكن لا بأس باعاده الطريقه لتعم الفائده اكثر……
الخطوات
 نفتح قاعده بيانات اكسس ثم نذهب الى قائمه انشاء ثم نضغط على تصميم الاستعلام Query Design بعدها تظهر لنا قائمه فيها جميع جداول نختار منها جدولين operations و buypill بعدها نقوم باختيار الحقول التي نحتاجها من خلال الجدولين وهذه الحقول هي : Buyld Buydate Buycash Buypostpone Buylmporter Operltme Operltemexp Buyqty Buydisconund Buytotalg Buyunitprice Buytotalb Buyearn Rebuyqty Rebuytotalg Rebuynotes نختار هذه الحقول اعلاه بالضغط عليها ضغطتين وسوف يسقط الحقل تحت الئ ان ننتهي من اختيار جميع حقول اعلاه ثم نحفظ الاستعلام ونسميه اي اسم تريده وهكذا قمنا بانشاء تصميم استعلام علاقه بين جدولين…….. 
 لاحظ كيف تم انشاء تصميم علاقه الاستعلام بالصور ؟ ايضا للتوضيح اكثر شاهد الفيديو كيف تم انشاء العلاقه ؟ بعد ذلك نفتح فورم مرتجع الشراء وننقر نقرتين عليه ونقوم بانشاء اجراء خاص بتحميل بيانات حقول الاستعلام الذي قمنا بانشاءه ونسمي الاجراء rebuyQ ونكتب داخله الكود التالي : Rebuy.vb
  Public Sub rebuyQ()

  Dim dt As New DataTable
  Dim da As New


  OleDbDataAdapter("SELECT buypill.buyld, buypill.buydate, buypill.buylmporter, buypill.buycash, buypill.buypostpone, operations.operltem, operations.operltemexp, operations.buyqty, operations.buytotalg, operations.buydisconund, operations.buyunitprice, operations.buytotalb, operations.buyearn, operations.rebuyqty, operations.rebuytotalg, operations.rebuynotes FROM buypill INNER JOIN operations ON buypill.buyld = operations.buyld", con)


  da.Fill(dt)
  DataGridView1.AutoGenerateColumns = False


  DataGridView1.DataSource = dt

  End Sub

⚙  شرح الكود
    الكود سهل وتم شرحه عده مرات في دروس سابقه لكن احب ان انوه على ثاني سطر من الاجراء وهو كود تحميل بيانات الحقول select هذا الكود يمكنك اخي المبرمج الحصول عليه من الاستعلام الذي قمنا بانشاءه وذلك من خلال فتح الاستعلام في قاعده بيانات ثم الضغط كلك ايمن على اسم الاستعلام ثم نختار خيار طريقه عرض SQL بعدها سوف تفتح لنا نافذة وفيها الكود قم بنسخ الكود وفي الاجراء الذي قمنا بانشاءه بعد كلمة داتا ادبتر الصق الكود بين قوسين…… 
  لاحظ طريقه نسخ كود الاستعلام من قاعده بيانات بالصور 
  ايضا شاهد فيديو كيف تم ترتيب كود الاستعلام
     شاهد ايضا فيديو بعد تنفيذ البرنامج وكيف ضهرت البيانات في فورم مرتجع الشراء على داتا كراند فيو 
 
بعد ذلك نقوم باستدعاء هذا الاجراء في حدث اللود load الفورم 
  ملاحظه مهمه بعد استدعاء الاجراء في حدث اللود load قم بمسح كود داتا سورس الذي وضعناه في درس سابق وهو DataGridView1.DataSource = Redbuypilldt لانه في درس سابق قمنا بالتجربه فقط ولكن بعد انشاء اجراء خاص بتحميل بيانات الحقول التي نريدها لا نحتاج إلى كود سابق لتحميل بيانات جدول مرتجع الشراء  rebuypill 


عند تنفيذ البرنامج وفتح فورم مرتجع الشراء سوف يحمل بيانات الحقول التي قمنا باضافتها اي عند اضافة بيانات في فاتورة الشراء وحفظ الفاتوره ثم نفتح مرتجع الشراء سوف نلاحظ ضهور هذه البيانات وبالتالي مايتم اضافته في فاتوره الشراء يضهر في فورم مرتجع الشراء ويحملي بيانات الحقول التي نحتاجها تلقائيا مثلا يحملي رقم فاتوره من جدول operations تاريخ الفاتوره نوع تعامل كاش ام اجل المورد الصنف الصلاحية كمية الشراء الخصم اجمالي الجمهور سعر الشراء الوحده اجمالي الشراء قيمه الربح هذه الحقول اعلاه سوف يحملي فيها بيانات من فاتورة الشراء تلقائيا ولا يمكننا التحكم فيها او تعديل او التعديل عليها اما الحقول التي لم نذكرها مثلا كمية المرتجع اجمالي المرتجع ملاحظات رقم المرتجع عدد الاصناف المرتجعه هذه الحقول  نتحكم بها عند استرجاع احد الاصناف لسبب ما وفي الدرس القادم ان شاء الله سوف يكون موضوعنا هذا……
 .. صورة رقم 1 كيف تم انشاء استعلام

صورة رقم 2 تكملة كيف تم انشاء استعلام

صورة رقم 3 تكملة كيف تم انشاء استعلام

صورة رقم 4 واخيرا تكملة كيف تم انشاء استعلام

فيديو توضيح اكثر كيف تم تصميم علاقه استعلام بين جدولين operations , and buypill

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

صورة رقم 2 تكملة كيف تم نسخ كود الاستعلام 

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


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

برمجة زر اضافه مرتجع الشراء جديد

نقوم بانشاء اجراء خاص بتفريغ خانه كل من تكس بوكس خاص باجمالي الشراء وتكس بوكس خاص بعدد الاصناف المرتجعه اذن نفتح فورم مرتجع الشراء وننقر نقرتين عليه وفوق اعلاه نقوم بانشاء الاجراء ونسميه newrebuy او اي اسم تريده اخي المبرمج….. ويصبح الكود كالتالي: Rebuy.vb
  Public Sub newrebuy()

  code_redbuypill()

  rebuyld.Text = mynewldredbuypill

  rebuyltemcount.Text = 0

  rebuytotolg.Text = 0

  rebuyuser.Text = ""

  End Sub
⚙ شرح الكود
   استدعينا كود code_redbuypill من مديول ثم جعلنا تكس بوكس الخاص بالتسلسل rebuyld.Text ياخذ ترقيم تلقائي عند حفظ الاصناف وجعلنا تكس بوكس اجمالي الشراء وعدد الاصناف مرتجعه تساوي قيمه 0……
 هذا كل مافي الكود  نقوم بعد ذلك باستدعاء هذا كود في كل من حدث اللود load وفي زر مرتجع جديد موجود على تصميم فورم المرتجع…… 
  لاحظ ترتيب كود اعلاه كما في صورة رقم 1
برمجة زر اضافه مرتجع الشراء جديد

ثم نقوم بتغير نوع البيانات للحقول الثلاثه التاليه : كمية المرتجع  - اجمالي المرتجع  - الملاحظات الفائده هي جعل هذه الحقول تاخذ نوع البيانات التي تسجل عليها من خلال داتا كراند فيو… . 
اذن ننقر على داتا كراند فيو على سهم بالجانب الايمن ونختار Edit columns ثم نختار الحقل مثلا حقل كمية المرتجع ثم نختار DefaultCellStyle ثم نختار Format ثم تظهر قائمه فيها نوع بيانات نختار منها Numeric ونكتب 0 في تكس بوكس Null value ثم نضغط على ok ثم ok 
 نكرر نفس خطوات في حقل اجمالي المرتجع ونختار نوع بيانات Currency ونكتب في Null value ـ 0 
 نكرر نفس خطوات في حقل الملاحظات وتبقى نوع بيانات نفسها هي no Formatting ولكن في Null value نكتب لا توجد
  شاهد فيديو كيف تم تغير نوع بيانات للحقول اعلاه…… 

برمجة ازرار البحث عن مرتجع الشراء

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

برمجة زر البحث عن مرتجع الشراء 

 سنبرمج اكواد خاصه بالبحث لـ 5 انواع من البحث وهي : البحث عام 
 البحث باسم الصنف 
 البحث باسم المورد 
 البحث بالتعامل النقدي 
 البحث بالتعامل اجل
 اذن نفتح فورم مرتجع الشراء ثم ننقر على زر البحث الموجود على الفورم ونكتب الاكواد الخمسة لانواع البحث : Rebuy.vb
  🔸🔸'==========بحث عام


  If RadioButton1.Checked = True And RadioButton2.Checked = False And RadioButton3.Checked = False And RadioButton4.Checked = False Then


  Dim dt As New DataTable

  Dim da As New
  OleDbDataAdapter("SELECT buypill.buyld, buypill.buydate, buypill.buylmporter, buypill.buycash, buypill.buypostpone, operations.operltem, operations.operltemexp, operations.buyqty, operations.buytotalg, operations.buydisconund, operations.buyunitprice, operations.buytotalb, operations.buyearn, operations.rebuyqty, operations.rebuytotalg, operations.rebuynotes FROM buypill , operations where buypill.buyld = operations.buyld and buydate between #" & DateTimePicker1.Value.ToString("yyyy/MM/dd") & "# and #" & DateTimePicker2.Value.ToString("yyyy/MM/dd") & "#", con)


  da.Fill(dt)
  DataGridView1.AutoGenerateColumns = False
  DataGridView1.DataSource = dt
  End If



  🔸🔸 '========بحث بالصنف

  If RadioButton1.Checked = True And RadioButton2.Checked = False And RadioButton3.Checked = False And RadioButton4.Checked = False Then


  Dim dt As New DataTable


  Dim da As New OleDbDataAdapter("SELECT buypill.buyld, buypill.buydate, buypill.buylmporter, buypill.buycash, buypill.buypostpone, operations.operltem, operations.operltemexp, operations.buyqty, operations.buytotalg, operations.buydisconund, operations.buyunitprice, operations.buytotalb, operations.buyearn, operations.rebuyqty, operations.rebuytotalg, operations.rebuynotes FROM buypill , operations where buypill.buyld = operations.buyld and buydate between #" & DateTimePicker1.Value.ToString("yyyy/MM/dd") & "# and #" & DateTimePicker2.Value.ToString("yyyy/MM/dd") & "# and operltem = '" & ComboBox1.Text & "'", con)


  da.Fill(dt)

  DataGridView1.AutoGenerateColumns = False

  DataGridView1.DataSource = dt


  End If


  🔸🔸'=========بحث بالمورد

  If RadioButton1.Checked = False And RadioButton2.Checked = True And RadioButton3.Checked = False And RadioButton4.Checked = False Then


  Dim dt As New DataTable


  Dim da As New OleDbDataAdapter("SELECT buypill.buyld, buypill.buydate, buypill.buylmporter, buypill.buycash, buypill.buypostpone, operations.operltem, operations.operltemexp, operations.buyqty, operations.buytotalg, operations.buydisconund, operations.buyunitprice, operations.buytotalb, operations.buyearn, operations.rebuyqty, operations.rebuytotalg, operations.rebuynotes FROM buypill , operations where buypill.buyld = operations.buyld and buydate between #" & DateTimePicker1.Value.ToString("yyyy/MM/dd") & "# and #" & DateTimePicker2.Value.ToString("yyyy/MM/dd") & "# and buylmporter = '" & ComboBox2.Text & "'", con)


  da.Fill(dt)

  DataGridView1.AutoGenerateColumns = False

  DataGridView1.DataSource = dt


  End If

  🔸🔸 '=========بحث نقدي


  If RadioButton1.Checked = False And RadioButton2.Checked = False And RadioButton3.Checked = True And RadioButton4.Checked = False Then


  Dim dt As New DataTable
  Dim da As New OleDbDataAdapter("SELECT buypill.buyld, buypill.buydate, buypill.buylmporter, buypill.buycash, buypill.buypostpone, operations.operltem, operations.operltemexp, operations.buyqty, operations.buytotalg, operations.buydisconund, operations.buyunitprice, operations.buytotalb, operations.buyearn, operations.rebuyqty, operations.rebuytotalg, operations.rebuynotes FROM buypill , operations where buypill.buyld = operations.buyld and buydate between #" & DateTimePicker1.Value.ToString("yyyy/MM/dd") & "# and #" & DateTimePicker2.Value.ToString("yyyy/MM/dd") & "# and buycash = " & RadioButton3.Checked & "", con)


  da.Fill(dt)

  DataGridView1.AutoGenerateColumns = False

  DataGridView1.DataSource = dt


  End If




  🔸🔸'========بحث اجل


  If RadioButton1.Checked = False And RadioButton2.Checked = False And RadioButton3.Checked = False And RadioButton4.Checked = True Then


  Dim dt As New DataTable


  Dim da As New OleDbDataAdapter("SELECT buypill.buyld, buypill.buydate, buypill.buylmporter, buypill.buycash, buypill.buypostpone, operations.operltem, operations.operltemexp, operations.buyqty, operations.buytotalg, operations.buydisconund, operations.buyunitprice, operations.buytotalb, operations.buyearn, operations.rebuyqty, operations.rebuytotalg, operations.rebuynotes FROM buypill , operations where buypill.buyld = operations.buyld and buydate between #" & DateTimePicker1.Value.ToString("yyyy/MM/dd") & "# and #" & DateTimePicker2.Value.ToString("yyyy/MM/dd") & "# and buypostpone = " & RadioButton4.Checked & "", con)


  da.Fill(dt)

  DataGridView1.AutoGenerateColumns = False

  DataGridView1.DataSource = dt


  End If


  End Sub
  
شرح الاكواد الخمسة اعلاه
الاكواد الخمسة كلها نفس الاكواد مع اختلاف بسيط وسوف اشرح كود واحد الخاص بالبحث العام ينوب عن الاكواد البقيه… . 
 السطر الاول يقصد بـRadioButton هي الاداة التي تخص بنوع معين من البحث وكل RadioButton اخذ نوع من البحث مثلا البحث بالصنف RadioButton1 البحث بالمورد RadioButton2 البحث بالكاش RadioButton3 البحث بالاجل RadioButton4 اما البحث العام يبحث عندما لا نعلم على اي نوع من انواع بحث اعلاه تكمله سطر اول في حاله RadioButton1 يساوي False و RadioButton2 يساوي True و RadioButton3 يساوي False و RadioButton4 يساوي True اذا كان غير معلم على احد هذه الانواع وقمنا بالبحث يتم البحث عام اما اذا علمنا على احد انواع بحث يم البحث بالبحث الذي علمنا عليه وهكذا  السطر الثاني عرفنا داتا تيبل 
  السطر الثالث عرفنا داتا ادبتر وبين قوسين كتبنا جملة select وكتبنا اسماء الحقول نفسها التي تظهر على داتا كراند فيو وكلمة between تعني البحث بين تاريخين من تاريخ DateTimePicker1 الى تاريخ DateTimePicker2 
ثم ملئنا داتا تيبل بالبيانات بعد البحث هذا كل مافي الكود وبقيه الاكواد نفس الكلام مع اختلاف فقط في نوع البحث الذي نبحث عليه سواء بالبحث بالصنف او المورد او كاش او اجل ويتم اختيار اسم الاداه التي تقابل نوع البحث  .
 
 فيديو توضيح بعد تنفيذ البرنامج وفتحنا فورم مرتجع الشراء وبحثنا بالانواع الخمسة عن البيانات 


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


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

 مثال تطبيقي لدينا ثلاثه اصناف مختلفه وسعر شراء الصنف الواحد بـ 2000 وكمية الاسترجاع 3 عند استرجاع الاصناف سوف يتم ادخال كمية المرتجع وهي 3 ويحسب لي اجمالي مرتجع تلقائيا بيساوي 6000 لان سعر سعر في كميته وجمع لي الاصناف الثلاثه واصبح اجمالي المرتجع 6000
 طيب كيف تم عمل ذلك ؟ 
للتنبيه ادخال كمية المرتجع واجمالي مرتجع وعدد الاصناف المرتجعه و الملاحظات سوف نتعامل معهم من خلال داتا كراند فيو datagridview…… 

 حساب اجمالي المرتجع 


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

 اذن نحدد اداة datagridview ومن الاحداث نختار حدث CellEndEdit ونكتب الكود التالي : Rebuy.vb
  Try

  Dim total, count As Double 

  '= حساب اجمالي المرتجع في داتا كراند

  DataGridView1(9, DataGridView1.CurrentRow.
  Index).Value = DataGridView1(8, DataGridView1.CurrentRow.
  Index).Value * DataGridView1(13, DataGridView1.CurrentRow.
  Index).Value 


  '=====,ترقيم الاصناف المرتجعه

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


  If DataGridView1(8,
  DataGridView1.Rows(i).Index).
  Value > 0 Then


  DataGridView1(16, DataGridView1.Rows(i).Index).
  Value = rebuyld.Text


  DataGridView1(17, DataGridView1.Rows(i).Index).
  Value = 1


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


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

  count = count + DataGridView1(17, DataGridView1.Rows(i).Index).
  Value

  Else


  '=======رقم المرتجع

  DataGridView1(16, DataGridView1.Rows(i).Index).
  Value = Nothing

  '========اجمالي المرتجع
  DataGridView1(17, DataGridView1.Rows(i).Index).
  Value = Nothing


  End If


  rebuytotolg.Text = total

  rebuyltemcount.Text = count

  Next

  Catch ex As Exception

  MsgBox(ex.Message)

  End Try

  End sub

⚙ شرح الاكواد 

 حساب اجمالي المرتجع من خلال داتا كراند فيو 


،،، ترتيب او تسلسل حقل اجمالي الشراء هو 9 يساوي كمية المرتجع المدخله في داتا كراند فيو وترتيب حقلها هو 8 مضروب في سعر الشراء الوحده وتسلسلها هو 13

  حساب رقم مرتجع عملنا جمله لوب for ثم وضعنا كمية المرتجع المدخله من قبل المستخدم و تسلسلها 8 بعد ذلك جعلنا خانه حقل رقم مرتجع الذي تسلسله 16 يساوي rebuyld.Text وجعلنا كل صنف نقوم بارجاعه يساوي 1 (رقم صنف ) 
 

وضع اجمالي مرتجع وعدد الاصناف المرتجعه في تكس مخصص لهم 

 عرفنا متغيرين فوق لاجمالي المرتجع وعدد الاصناف ثم جعلنا اجمالي total يساوي اجمالي مرتجع + مرتجع الشراء نفسه وتسلسل حقله 9 ثم جعلنا عدد الاصناف count تساوي حقل عدد الاصناف + عدد الاصناف نفسه تسلسله 17 اما Else جعلنا رقم مرتجع لا يساوي شي Nothing بحيث عند الغاء عمليه الاسترجاع يرجع حقل رقم مرتجع خالي ونفس الكلام في حقل عدد الاصناف مرتجعه تسلسلها 17 واخيرا جعلنا تكس بوكس الموجود على فورم مرتجع الخاص باجمالي المرتجع يساوي مجموع total ونفس كلام عدد الاصناف مرتجعه تساوي count هذا كل مافي الاكواد
   لاحظ ترتيب كود الحسابات اعلاه في صورة رقم 1
حساب اجمالي المرتجع

و 2

 ايضا للتوضيح اكثر شاهد فيديو كيف تم كتابه وترتيب الاكواد السابقه 

ايضا شاهد بالفيديو مثال كيف تم حساب حسابات الاكواد اعلاه

… .. 
……

  كيف يتم حفظ الصنف بعد استرجاعه ؟

 الجواب / نحتاج الى كود اضافه الحقول و كود لحفظ الصنف وكود لتعديل كميه المخزن الرئيسي بعد استرجاع كمية للمخزن…… ..
 حفظ الصنف وبياناته داخل قاعده بيانات
 لو رجعنا إلى فورم مرتجع الشراء وبالاخص الحقول التي تظهر على داتا كراند فيو وهذه الحقول ليس كلها تحفظ في جدول rebuypill بعتبار هذا جدول يخص فورم مرتجع شراء كلا وانما لماذا عملنا علاقه بين جدول operations وجدول Rebuypill حتئ يتم حفظ قسم من هذه الحقول في جدول operations وقسم ثاني في جدول Rebuypill وسيتضح لكم ذلك بعد برمجه زر الحفظ.. 

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


 نفرض لدينا بالمخزن الرئيسي صنف (س) كميته 500 وحده وتم بيع منه 100 وحده وبعد كم يوم من البيع تم استرجاع 30 وحده من الـ100 وحده وبالتالي عند استرجاع 30 وحده الئ مخزن الرئيسي سوف يتم خصم هذه الكمية من المخزن الرئيسي ويصبح كميه المخزن من صنف (س) 475 و يتم طرح هذه الكمية المسترجعه من فورم الاصناف للصنف المسترجع منه وهكذا…… 

اذن ننقر نقرتين على زر الحفظ ونكتب الاكواد التاليه الخاصه بالحفظ وتعديل الكمية كالتالي : Rebuy.vb
  '=== كود اضافة حقول 

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

  If DataGridView1(8, DataGridView1.Rows(z).Index).Value > 0 Then


  oprationscmd = New OleDbCommand(" insert into operations (buyunitprice,operltem,operltemexp,rebuyld,rebuynotes,rebuyqty,rebuytotalg) values (" & DataGridView1(13, DataGridView1.Rows(z).Index).Value & ", '" & DataGridView1(5, DataGridView1.Rows(z).Index).Value & "', #" & DataGridView1(6, DataGridView1.Rows(z).Index).Value & "#, " & rebuyld.Text & " ,'" & DataGridView1(10, DataGridView1.Rows(z).Index).Value & "', " & DataGridView1(8, DataGridView1.Rows(z).Index).Value & " ," & DataGridView1(9, DataGridView1.Rows(z).Index).Value & ")", con)


  con.Open()
  oprationscmd.ExecuteNonQuery()

  con.Close()


  End If



  Next



  '======كود حفظ حقول 

  Redbuypilldt.Rows.Add()


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

  Redbuypilldt.Rows(last).Item("rebuydate") = Rebuydate.Value
  Redbuypilldt.Rows(last).Item("rebuyld") = rebuyld.Text
  Redbuypilldt.Rows(last).Item("rebuyltemcount") = rebuyltemcount.Text
  Redbuypilldt.Rows(last).Item("rebuytime") = Rebuytime.Value
  Redbuypilldt.Rows(last).Item("rebuytotalg") = rebuytotolg.Text
  Redbuypilldt.Rows(last).Item("rebuyuser") = rebuyuser.Text

  Dim save As New OleDbCommandBuilder(Redbuypillda)
  Redbuypillda.Update(Redbuypilldt)
  Redbuypilldt.AcceptChanges()

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

  load_Redbuypill()

  '=======

  newrebuy()


  '==كود ايجاد كمية 

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

  If DataGridView1(8, DataGridView1.Rows(x).Index).Value > 0 Then

  Dim dt As New DataTable

  Dim da As New OleDbDataAdapter

  dt.Clear()

  da = New
  OleDbDataAdapter("select * from ltems where ltemname = '" & DataGridView1(5, DataGridView1.Rows(x).Index).Value & "'", con)


  da.Fill(dt)

  If dt.Rows.Count > 0 Then

  cruinqty  =dt.Rows(0).Item("ltemqty")

  MsgBox(cruinqty)

  End If

  '=====كود تعديل كمية

  Dim newqtw As Double

  newqtw = cruinqty -
  Val(DataGridView1(8, DataGridView1.Rows(x).Index).Value)


  ltemscmd = New OleDbCommand("update ltems set ltemqty = " & newqtw & " where ltemname = '" & DataGridView1(5, DataGridView1.Rows(x).Index).Value & "' ", con)

  con.Open()
  ltemscmd.ExecuteNonQuery()

  con.Close()

  End If

  Next

  End Sub
⚙ هذه اكواد 
اضافة وحفظ وتعديل كمية شرح الاكواد اعلاه اعتقد الاكواد تم شرحها في دروس سابقه بما فيه الكفايه 
 ملاحظه
 جدا مهمه نعرف ثلاثه متغيرات في مديول لانه سوف نحتاج هذه متغيرات في كود الحفظ كالتالي : Module1.vb
  Dim cruinqty As Double


  Public ltemscmd As New OleDbCommand


  Public oprationscmd As New OleDbCommand

شرح اكواد الحفظ 
 الكود الاول خاص بادراج الحقول insert في قاعدة البيانات ثم عرفنا متغير oprationscmd في مديول 

 الكود الثاني خاص بحفظ الحقول في قاعده بيانات وضعنا ما يقابل تكس بوكس مع حقول في قاعده بيانات 

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

الكود الرابع تابع الى كود ثالث خاص بتعديل بيانات بعد ايجادها… 
 شاهد ترتيب كود كما في صور


كود حفظ مرتجع الشراء





شاهد بالفيديو للتوضيح اكثر كيف تم كتابه وترتيب كود الحفظ باكمله

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