تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
مثال للتعامل مع الجداول المرتبطة - عن طريق الكلاسات
#4
القاعدة ستكون على SQL Server و هي كما بالصورة مؤلفة من جدولين الطلاب و دفعات الطلاب



بعد ذلك سنضيف كلاس خاص لكل جدول في مشروعنا اضف كلاس جديد و سميه Tb_Studant و هو خاص بجدول الطلاب
و اضف كلاس اخر سميه Tb_Payes و هو خاص بجدول الدفعات

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



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

كما يلي
PHP كود :
Public Class Tb_Studant
    Inherits DbGo
    
'
    Private _Stu_ID As Integer
    Private _Stu_Name As String

    Private _Stu_Phone As String
    Private _Date_Affiliation As Object
    '
    Private ID_Key As String "Stu_ID"
    Private TableName As String "Studants_TB"

    Public Property Stu_ID As Integer
        Get
            
Return _Stu_ID
        End Get
        Set
(value As Integer)
            _Stu_ID value
        End Set
    End Property

    
Public Property Stu_Name As String
        Get
            
Return _Stu_Name
        End Get
        Set
(value As String)
            _Stu_Name value
        End Set
    End Property

    
Public Property Stu_Phone As String
        Get
            
Return _Stu_Phone
        End Get
        Set
(value As String)
            _Stu_Phone value
        End Set
    End Property

    
Public Property Date_Affiliation As Object
        Get
            
Return _Date_Affiliation
        End Get
        Set
(value As Object)
            _Date_Affiliation value
        End Set
    End Property 
الان ناتي الى تخصيص العمليات على هذا الجدول و سانشئ مصفوفة خاصة بحقول الجدول كما يلي
PHP كود :
       'جدول الطلاب
    Private Function Studants_Table() As Dictionary(Of String, Object)
        Dim Stu_Tb As New Dictionary(Of String, Object)
        Stu_Tb.Add("Stu_ID", Stu_ID)
        Stu_Tb.Add("Stu_Name", Stu_Name)
        Stu_Tb.Add("Stu_Phone", Stu_Phone)
        Stu_Tb.Add("Date_Affiliation", Date_Affiliation)
        Return Stu_Tb
    End Function 
و ناتي الى تخصيص عمليات الملئ و الاضافة و التحديث و الحذف 

اولاً الملئ
PHP كود :
   ''' <summary>
    ''' 
تعبئة جدول بحقول محددة
    
''' </summary>
    ''' 
<returns>يعيد جدول بيانات</returns>
 
   Public Function FillTable() As DataTable
        Return MyBase
.Fill_Table(TableNameStudants_Table"Stu_ID")
 
   End Function 
ثانياً الاضافة
PHP كود :
   ''' <summary>
    ''' 
اضافة سجل جديد
    
''' </summary>
    ''' 
<param name="Msg">رسالة الاضافة اختيارية</param>
 
   ''' <returns>يعود بقيمة رقم الحقل الذي تمت اضافته</returns>
    Public Function AddNew(Optional ByVal Msg As Boolean = False) As Integer
        If Msg = True Then
            Return Add_New(TableName, Studants_Table, ID_Key, True)
        Else
            Return Add_New(TableName, Studants_Table, ID_Key)
        End If
    End Function 
ثالثاً التحديث
PHP كود :
   ''' <summary>
    ''' 
تحديث سجل
    
''' </summary>
    ''' 
<param name="ID">قيمة حقل المفتاح الرئيسي</param>
 
   ''' <param name="Msg">عرض رسالة الحفظ اختياري</param>
    Public Sub Update(ID As Integer, Optional ByVal Msg As Boolean = False)
        If Msg = True Then
            MyBase.Update_Table(TableName, Studants_Table, ID_Key, ID, True)
        Else
            MyBase.Update_Table(TableName, Studants_Table, ID_Key, ID, False)
        End If

    End Sub 
رابعاً الحذف وفق شرط
PHP كود :
   ''' <summary>
    ''' 
حذف سجل من جدول وفق قيمة المفتاح الرئيسي
    
''' </summary>
    ''' 
<param name="ID">قيمة حقل المفتاح الرئيسي</param>
 
   ''' <param name="Msg">رسالة تأكيد الحذف اختيارية</param>
    Public Sub Delete(ID As Integer, Optional Msg As Boolean = False)
        If Msg = True Then
            MyBase.Delete_Table(TableName, ID_Key, ID, True)
        Else
            MyBase.Delete_Table(TableName, ID_Key, ID, False)
        End If
    End Sub 
انتهينا الكلاس اصبح يحتوي على كل العمليات اللازمة للعمل

شكل الكلاس
PHP كود :
Public Class Tb_Studant
    Inherits DbGo
    
'
    Private _Stu_ID As Integer
    Private _Stu_Name As String

    Private _Stu_Phone As String
    Private _Date_Affiliation As Object
    '
    Private ID_Key As String "Stu_ID"
    Private TableName As String "Studants_TB"

    Public Property Stu_ID As Integer
        Get
            
Return _Stu_ID
        End Get
        Set
(value As Integer)
            _Stu_ID value
        End Set
    End Property

    
Public Property Stu_Name As String
        Get
            
Return _Stu_Name
        End Get
        Set
(value As String)
            _Stu_Name value
        End Set
    End Property

    
Public Property Stu_Phone As String
        Get
            
Return _Stu_Phone
        End Get
        Set
(value As String)
            _Stu_Phone value
        End Set
    End Property

    
Public Property Date_Affiliation As Object
        Get
            
Return _Date_Affiliation
        End Get
        Set
(value As Object)
            _Date_Affiliation value
        End Set
    End Property


    
'جدول الطلاب
    Private Function Studants_Table() As Dictionary(Of String, Object)
        Dim Stu_Tb As New Dictionary(Of String, Object)
        Stu_Tb.Add("Stu_ID", Stu_ID)
        Stu_Tb.Add("Stu_Name", Stu_Name)
        Stu_Tb.Add("Stu_Phone", Stu_Phone)
        Stu_Tb.Add("Date_Affiliation", Date_Affiliation)
        Return Stu_Tb
    End Function


    ''' 
<summary>
    ''' تعبئة جدول بحقول محددة
    ''' 
</summary>
    ''' <returns>يعيد جدول بيانات</returns>
    Public Function FillTable() As DataTable
        Return MyBase.Fill_Table(TableName, Studants_Table, "Stu_ID")
    End Function


    ''' 
<summary>
    ''' اضافة سجل جديد
    ''' 
</summary>
    ''' <param name="Msg">رسالة الاضافة اختيارية</param>
    ''' 
<returns>يعود بقيمة رقم الحقل الذي تمت اضافته</returns>
    Public Function AddNew(Optional ByVal Msg As Boolean False) As Integer
        
If Msg True Then
            
Return Add_New(TableNameStudants_TableID_KeyTrue)
        Else
            Return Add_New(TableNameStudants_TableID_Key)
        End If
    End Function


    ''' <summary>
    ''' 
تحديث سجل
    
''' </summary>
    ''' 
<param name="ID">قيمة حقل المفتاح الرئيسي</param>
    ''' <param name="Msg">عرض رسالة الحفظ اختياري</param>
    Public Sub Update(ID As Integer, Optional ByVal Msg As Boolean = False)
        If Msg = True Then
            MyBase.Update_Table(TableName, Studants_Table, ID_Key, ID, True)
        Else
            MyBase.Update_Table(TableName, Studants_Table, ID_Key, ID, False)
        End If

    End Sub


    ''' 
<summary>
    ''' حذف سجل من جدول وفق قيمة المفتاح الرئيسي
    ''' 
</summary>
    ''' <param name="ID">قيمة حقل المفتاح الرئيسي</param>
    ''' 
<param name="Msg">رسالة تأكيد الحذف اختيارية</param>
    Public Sub Delete(ID As IntegerOptional Msg As Boolean False)
        If Msg True Then
            MyBase
.Delete_Table(TableNameID_KeyIDTrue)
        Else
            MyBase.Delete_Table(TableNameID_KeyIDFalse)
        End If
    End Sub


End 
Class 

ثانياً جدول الدفعات بنفس الطريقة السابقة تماماً , مع تخصيص اضافي كونه جدول ابن

كلاس جدول الدفعات
PHP كود :
Public Class Tb_Payes
    Inherits DbGo
    
'
    Private _Pay_ID As Integer
    Private _Principal_Payment As String
    Private _Payment_Date As Object
    Private _Stu_ID As Integer
    '
 
   Private ID_Key As String "Pay_ID"
 
   Private TableName As String "PayMents_TB"

 
   Public Property Pay_ID As Integer
        Get
            Return _Pay_ID
        End Get
        Set
(value As Integer)
 
           _Pay_ID value
        End Set
    End Property

    Public Property Principal_Payment 
As String
        Get
            Return _Principal_Payment
        End Get
        Set
(value As String)
 
           _Principal_Payment value
        End Set
    End Property

    Public Property Payment_Date 
As Object
        Get
            Return _Payment_Date
        End Get
        Set
(value As Object)
 
           _Payment_Date value
        End Set
    End Property

    Public Property Stu_ID 
As Integer
        Get
            Return _Stu_ID
        End Get
        Set
(value As Integer)
 
           _Stu_ID value
        End Set
    End Property


    
'جدول الدفعات
    Private Function Payes_Table() As Dictionary(Of String, Object)
        Dim Payes_Tb As New Dictionary(Of String, Object)
        Payes_Tb.Add("Pay_ID", Pay_ID)
        Payes_Tb.Add("Principal_Payment", Principal_Payment)
        Payes_Tb.Add("Payment_Date", Payment_Date)
        Payes_Tb.Add("Stu_ID", Stu_ID)
        Return Payes_Tb
    End Function


    ''' 
<summary>
 
   ''' تعبئة جدول بحقول محددة
    ''' 
</summary>
 
   ''' <returns>يعيد جدول بيانات</returns>
    Public Function FillTable() As DataTable
        Return MyBase.Fill_Table(TableName, Payes_Table)
    End Function


    ''' 
<summary>
 
   ''' تعبئة جدول بحقول محددة وفق شرط
    ''' 
</summary>
 
   ''' <param name="ID">قيمة الحقل الشرطي</param>
    ''' 
<returns>يعيد جدول بيانات</returns>
 
   Public Function FillTable(ID As Object) As DataTable
        Return MyBase
.Fill_TableWithCoundition(TableNamePayes_Table"Stu_ID"ID)
 
   End Function

 
   ''' <summary>
    ''' 
اضافة سجل جديد
    
''' </summary>
    ''' 
<param name="Msg">رسالة الاضافة اختيارية</param>
 
   ''' <returns>يعود بقيمة رقم الحقل الذي تمت اضافته</returns>
    Public Function AddNew(Optional ByVal Msg As Boolean = False) As Integer
        If Msg = True Then
            Return Add_New(TableName, Payes_Table, ID_Key, True)
        Else
            Return Add_New(TableName, Payes_Table, ID_Key)
        End If
    End Function


    ''' 
<summary>
 
   ''' تحديث سجل
    ''' 
</summary>
 
   ''' <param name="ID">قيمة حقل المفتاح الرئيسي</param>
    ''' 
<param name="Msg">عرض رسالة الحفظ اختياري</param>
 
   Public Sub Update(ID As IntegerOptional ByVal Msg As Boolean False)
 
       If Msg True Then
            MyBase
.Update_Table(TableNamePayes_TableID_KeyIDTrue)
 
       Else
            MyBase
.Update_Table(TableNamePayes_TableID_KeyIDFalse)
 
       End If

 
   End Sub


    
''' <summary>
    ''' 
حذف سجل من جدول وفق قيمة المفتاح الرئيسي
    
''' </summary>
    ''' 
<param name="ID">قيمة حقل المفتاح الرئيسي</param>
 
   ''' <param name="Msg">رسالة تأكيد الحذف اختيارية</param>
    Public Sub Delete(ID As Integer, Optional Msg As Boolean = False)
        If Msg = True Then
            MyBase.Delete_Table(TableName, ID_Key, ID, True)
        Else
            MyBase.Delete_Table(TableName, ID_Key, ID, False)
        End If

    End Sub


    ''' 
<summary>
 
   ''' حذف مجموعات دفعات للطالب الحالي وفق رقم الطالب 
    ''' 
</summary>
 
   ''' <param name="StudantID">رقم الطالب - المعرف الفريد للطالب</param>
    Public Sub Delete_Multi(StudantID As Integer)
        '
قائمة الشروط
        Dim CondConditions 
As New Dictionary(Of StringObject)
 
       CondConditions.Add("Stu_ID"StudantID)
 
       Delete_TableByMultiCounditions(TableNameCondConditions)
 
   End Sub

End 
Class 


بعد هذا التخصيص ننتقل الى ادراج نموذج في المشروع لنبدأ التطبيق العملي
يتبع...

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



و اضف له كائن BindingSource و سميه BnStudant  سوف نستخدمه للتنقل بين السجلات فقط

نعرف بعض المتغيرات في بداية النموذج

PHP كود :
Public Class Form_Studants
    Dim Dt_Studant
Dt_Payes As New DataTable
    Dim Studant 
As New Tb_Studant
    Dim Payes 
As New Tb_Payes
    
'
    Dim Add_Edit As Boolean = False 
جدول يحمل بيانات الطلاب و جدول يحمل بيانات الدفعات
نعرف نسخة لكل كلاس لدينا 
و نعرف متغير بولياني مهمته الكشف عن العملية هل هي اضافة ام تعديل

تحميل النموذج
PHP كود :
   Private Sub Form_Studants_Load(sender As ObjectAs EventArgsHandles MyBase.Load

        Dt_Studant 
Studant.FillTable
        BnStudant
.DataSource Dt_Studant
        Data_Bind
()

 
       Try
            Dt_Payes 
Payes.FillTable(CType(Lb_ID.TextInteger))
 
           DG_Payes.DataSource Dt_Payes
        Catch ex 
As Exception

        End 
Try
 
   End Sub 
لا شيئ سوى ملئ البيانات بالاعتماد على الكلاسات السابقة

اضافة طالب
PHP كود :
   'زر اضافة طالب
    Private Sub Btn_AddStud_Click(sender As Object, e As EventArgs) Handles Btn_AddStud.Click
        Txt_Name.Clear()
        Txt_Phone.Clear()
        Txt_Name.Focus()
        Dt_Payes.Clear()
        '
 
       Btn_AddStud.Enabled False
        Btn_Delete
.Enabled False
        Btn_EditStud
.Enabled False
        Btn_Save
.Enabled True
        Btn_First
.Enabled False
        Btn_Last
.Enabled False
        Btn_Next
.Enabled False
        Btn_Prev
.Enabled False
        
'
        DG_Payes.ReadOnly = False
        Add_Edit = True
    End Sub 
الخطوات التي تجري
مسح مربعات النصوص و جدول الدفعات
تعطيل الازارا و تمكين قريد الدفعات للاضافة 
و اعطاء قيمة للمتغير البولياني ان الحالة اضافة


تعديل طالب
PHP كود :
   'زر تعديل طالب
    Private Sub Btn_EditStud_Click(sender As Object, e As EventArgs) Handles Btn_EditStud.Click
        Btn_AddStud.Enabled = False
        Btn_Delete.Enabled = False
        Btn_EditStud.Enabled = False
        Btn_Save.Enabled = True
        '
 
       Btn_First.Enabled False
        Btn_Last
.Enabled False
        Btn_Next
.Enabled False
        Btn_Prev
.Enabled False
        
'
        DG_Payes.ReadOnly = False
        Add_Edit = False
    End Sub 
نفس زر الاضافة و لكن المتغير البولياني حمل القيمة False دالاً على ان العملية هي تحديث بيانات

زر الحفظ
PHP كود :
   'زر حفظ الكل
    Private Sub Btn_Save_Click(sender As Object, e As EventArgs) Handles Btn_Save.Click
        If Add_Edit = True Then
            Bind_Studant()
            Lb_ID.Text = Studant.AddNew(True)
        Else
            Bind_Studant()
            Studant.Update(CInt(Lb_ID.Text), True)
        End If
        Save_Payes()

        Btn_AddStud.Enabled = True
        Btn_Delete.Enabled = True
        Btn_EditStud.Enabled = True
        Btn_Save.Enabled = False
        '
 
       Btn_First.Enabled True
        Btn_Last
.Enabled True
        Btn_Next
.Enabled True
        Btn_Prev
.Enabled True
        
'
        DG_Payes.ReadOnly = True
        Add_Edit = False
    End Sub 
الخطوات
فحص حالة المتغير البولياني اذا كان True يعني اضافة
شحن جدول الطلاب بالبيانات ثم اضافة بيانات الطالب و استقبال القيمة الراجعة منه و التي تمثل رقم الطالب في Lable المسمى Lb_ID 
و في حال كانت العملية تعديل يتم استدعاء دالة التحديث الخاصة بالطلاب
و اخيراً حفظ الدفعات (اجراء الدفعات سيرد لاحقاً)
و تعطيل الازرار و ابقاء الحالة على تعديل


حذف طالب مع دفعاته
PHP كود :
       'حذف طالب
    Private Sub Btn_Delete_Click(sender As Object, e As EventArgs) Handles Btn_Delete.Click
        If Dt_Payes.Rows.Count > 0 Then
            Payes.Delete_Multi(CType(Lb_ID.Text, Integer))
        End If
        Dim pos As Integer = BnStudant.Position

        Studant.Delete(CType(Lb_ID.Text, Integer))
        '
اعادة لملئ
        Dt_Studant 
Studant.FillTable
        BnStudant
.DataSource Dt_Studant

        
If BnStudant.Count 0 Then
            BnStudant
.Position pos 1
        End 
If
    End Sub 

اجراء شحن جدول الطلاب
PHP كود :
   'شحن جدول الطلاب
    Private Sub Bind_Studant()
        Studant = New Tb_Studant With {.Stu_Name = Txt_Name.Text,
                                       .Stu_Phone = Txt_Phone.Text,
                                       .Date_Affiliation = DT_Affiliation.Value}
    End Sub 
اسناد قيم عادية لحقول كلاس الطلاب

شحن جدول الدفعات
PHP كود :
   'شحن جدول الدفعات
    Private Sub Bind_Payes(Row As DataRow)
        Payes = New Tb_Payes With {.Principal_Payment = Row.Item("Principal_Payment"),
                                   .Payment_Date = Row.Item("Payment_Date"),
                                   .Stu_ID = Lb_ID.Text}
    End Sub 
نفس الطريقة السابقة سوى انها تحمل وسيطة تمثل الصف الذي نريد العمل عليه من جدول الدفعات

اجراء حفظ الدفعات
PHP كود :
   ''' <summary>
    ''' 
حفظ او تعديل او حذف دفعات
    
''' </summary>
    ''' 
<param name="Add_Update">If is True Then The case is Add New , Else The Case is Update</param>
 
   Private Sub Save_Payes()
 
       If Dt_Payes.Rows.Count 0 Then
            For Each row 
As DataRow In Dt_Payes.Rows
                Bind_Payes
(row)
 
               If row.RowState DataRowState.Modified Then
                    Payes
.Update(row("Pay_ID"))
 
               ElseIf row.RowState DataRowState.Added Then
                    row
.Item("Pay_ID") = Payes.AddNew(False)
 
                   row.Item("Stu_ID") = Lb_ID.Text
                ElseIf row
.RowState DataRowState.Deleted Then
                    Payes
.Delete(row.Item("Pay_ID"DataRowVersion.Original))
 
               End If
 
           Next
        End 
If
 
   End Sub 
لاننا نتعامل مع كل السطور في DataGridView و لا ندري عن المستخدم هل اضاف ام عدل ام حذف 
لذا استوجب منا ان نفحص حالة كل سطر من سطور جدول الدفعات و معرفة حالته عبر الخاصية DataRowState و نرسل الدالة المناسبة مع حالة كل سطر بعد تعبئته ببيانات الصف المحدد

ازارا التنقل بين الطلاب
PHP كود :
   'اول
    Private Sub Btn_First_Click(sender As Object, e As EventArgs) Handles Btn_First.Click
        BnStudant.MoveFirst()
    End Sub
    '
سابق
    Private Sub Btn_Prev_Click
(sender As ObjectAs EventArgsHandles Btn_Prev.Click
        BnStudant
.MovePrevious()
 
   End Sub
    
'تالي
    Private Sub Btn_Next_Click(sender As Object, e As EventArgs) Handles Btn_Next.Click
        BnStudant.MoveNext()
    End Sub
    '
اخير
    Private Sub Btn_Last_Click
(sender As ObjectAs EventArgsHandles Btn_Last.Click
        BnStudant
.MoveLast()
 
   End Sub 
حدث التنقل بين الطلاب و اعادة ملئ دفعات كل طالب
PHP كود :
   'تعبئة الدفعات بتغيير الطالب
    Private Sub BnStudant_CurrentChanged(sender As Object, e As EventArgs) Handles BnStudant.CurrentChanged, BnStudant.PositionChanged
        Dt_Payes = Payes.FillTable(CType(Lb_ID.Text, Integer))
        DG_Payes.DataSource = Dt_Payes
    End Sub 
و اخيراً ربط عناصر الادخال بمصدر البيانات
PHP كود :
   'ربط العناصر بمصدر البيانات
    Private Sub Data_Bind()
        Txt_Name.DataBindings.Clear()
        Txt_Phone.DataBindings.Clear()
        Lb_ID.DataBindings.Clear()
        '
 
       Txt_Name.DataBindings.Add(New Binding("text"BnStudant"Stu_Name"))
 
       Txt_Phone.DataBindings.Add(New Binding("text"BnStudant"Stu_Phone"))
 
       Lb_ID.DataBindings.Add(New Binding("text"BnStudant"Stu_ID"))
 
   End Sub 
اتمنى ان تكون الامور مفهومة و واضحة , و اتمنى من الله ان يكون هذا العمل فيه الفائدة لكم
و لاتنسونا من دعواتكم
بالتوفيق للجميع
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد }}}


الردود في هذا الموضوع
RE: مثال للتعامل مع الجداول المرتبطة - عن طريق الكلاسات - بواسطة ابو ليلى - 09-04-17, 03:47 AM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  ابسط كود لرفع الملفات عن طريق سيرفر FTP Basil Abdallah 2 4,275 20-11-20, 07:21 PM
آخر رد: walihn
  لفهم كيفية الربط الذي يتم بين الجداول viv 4 5,404 03-10-20, 05:34 PM
آخر رد: Arfat007
  العلاقات بين الجداول-الاضافة و الحذف و التعديل-برنامج لحفظ مصادر الموقع ابو ليلى 12 18,121 04-04-19, 10:08 PM
آخر رد: اباذر
  مثال القراءة والكتابه على ملف تيكست Txt على الانترنت + مثال + شرح m.sami.ak 11 9,056 02-06-18, 09:46 PM
آخر رد: YousefOkasha
Exclamation [VB.NET] التعامل مع ال CMD عن طريق ال TextBox YousefOkasha 5 5,486 02-06-18, 09:34 PM
آخر رد: YousefOkasha
  [درس فيديو] مثال بسيط لبرنامج إجازات فقط لأغراض الشرح (الدرس الأول) عبدالله الدوسري 7 12,080 28-04-18, 06:55 PM
آخر رد: moniam
  موضوع الاستاذ رامي مثال \ لطريقة تفعيل برنامجك عند العميل وتغيير كلمة مرور اRamilove سعود 8 8,137 06-10-17, 01:43 AM
آخر رد: حمادة دراز
  الترقيم التلقائي في الجداول مشاكل و حلول ابو ليلى 4 4,136 09-04-17, 01:35 AM
آخر رد: ابو ليلى
  صمم الكلاس الخاص بك - كلاس للتعامل مع SQL SERVER ابو ليلى 11 9,596 03-09-16, 07:43 PM
آخر رد: tryold
  [درس فيديو] تشغيل اوامر Run من البرنامج & مثال غلق الويندوز بعد وقت محدد باستخدام VB.net أحمد النجار 1 4,103 23-12-15, 04:26 AM
آخر رد: الماجيك مسعد

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


يقوم بقرائة الموضوع: