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


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

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

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

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


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

PHP كود :
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...) 
كما هو واضح المتغيرات الجدول و الاعمدة و قيم هذه الاعمدة و باقي النص ثابت
و على هذا لو كان لدي مصفوفة من الاعمدة و القيم تمرر بدل هذه المتغيرات اكون قد ارتحت من اعادة كتابة نفس الجملة
هذا من طرف الجملة , اما من طرف اطار العمل سيكون لدي كائن يقوم بتنفيذ هذه الجملة و هذا الكائن يحتاج الى اتصال و يحتاج الجملة السابقة و يحتاج الى بارمترات موافقة لعدد الحقول و قيم لهذه البارمترات و في النهاية سيقوم بالتنفيذ بعد اكتفائه بالمعلوممات المطلوبة.
الان لننظر الى هذا الكود الخاص بهذا الكائن و لنكتشف ما يمكننا الاستفادة منه
كائن ينفذ عملية ادخال سجل جديد في جدول
PHP كود :
   Private Sub Insert_SomeData()
 
       Dim Insert_Statement As String "INSERT INTO table_name (column1,column2,column3) VALUES (@column1, @column2, @column3)"
 
       Using Cmd As New SqlClient.SqlCommand(Insert_StatementCon)
 
           Cmd.Parameters.AddWithValue("@column1"Txt_column1.Text)
 
           Cmd.Parameters.AddWithValue("@column2"Txt_column2.Text)
 
           Cmd.Parameters.AddWithValue("@column3"Txt_column3.Text)
 
           Con.Open()
 
           Cmd.ExecuteNonQuery()
 
           Con.Close()
 
       End Using
    End Sub 
بعد التمعن في الكود السابق سنرى ان اغلبها ثوابت تتكرر كل مرة باستثناء ما اشرنا اليه سابقا من اسم الجدول و قائمة الحقول و القيم الموافقة لتلك الحقول و التي يشترك فيها ايضاً الكائن (Command)  و حتى كائن الاتصال Con يعتبر ثابت ايضاً لاننا نعرف هذا الكائن غالباً على مستوى المشروع لذا سيكون الوصول اليه متاح من كل انحاء المشروع
اذاً ما علينا في هذه الحالة ان نمرر اسم الجدول كبارميتر لهذا الاجراء و كذلك نمرر اسماء الحقول و قيمها ايضاً كبارميتر عبر مصفوفة و نكون قد تحصلنا على اجراء ادخال عام يستطيع الادخال في اي جدول بمجرد استدعائه و تمرير وسائطه المطلوبة
و لو دققنا اكثر في الاجراء السابق الخاص بالاضافة سنرى انه ينفذ عملية في داخله و هي ExecuteNonQuery  و التي بدورها تعيد قيمة رقمية بعد تنفيذها فهي تعيد اما 0 او 1  نجاح او فشل التنفيذ و عليه يمكننا استغلال الرقم العائد و عرض رسالة في حال نجح او فشل , و عليه فاننه يمكننا تحويل الاجراء السابق الى دالة تعيد الرسالة .
و بمنطق اعمق , بما انني اضيف سجل جديد و فق الدالة السابقة فالاولى ان اتحصل على رقم السجل المضاف الى الجدول لاستفيد منه و بناءً على ذلك اريد ان اجري عملية اضافية بعد الادخال و هي تحصيل رقم السجل و فق الكود التالي
PHP كود :
           Cmd.CommandText "Select @@IDENTITY"
 
           Resuilt CType(Cmd.ExecuteScalar(), Integer
هكذا اصبحت الدالة عملية اكثر تقوم بعملية ادخال و من بعدها تعيد رقم السجل المضاف.
الى هنا ينتهي غرضي من هذا التقديم لانتقل بك الى الجزء التالي


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


يتبع...

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

ساضيف لهذا الكلاس بعض التمهيدات الاولية كما يلي
PHP كود :
   Protected Shared MyConnectionString As String ""
 
   Protected Shared ConSql As New SqlClient.SqlConnection(MyConnectionString)


 
   Shared Sub New(ByVal ConnectionString As String)
 
       SetConnectionString ConnectionString
        If ConSql
.ConnectionString Nothing Then ConSql.ConnectionString MyConnectionString
    End Sub 

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


PHP كود :
   ''' <summary>
    ''' 
Set Or Get ConnectionString
    
''' </summary>
    ''' 
<returns></returns>
 
   Public Shared Property SetConnectionString() As String
        Set
(value As String)
 
           MyConnectionString value
        End Set
        Get
            Return MyConnectionString
        End Get
    End Property


    
''' <summary>
    ''' 
Close Connection To Data Base
    
''' </summary>
    Protected Shared Sub CloseConnect()
        If ConSql.State = ConnectionState.Open Then
            ConSql.Close()
        End If
    End Sub

    ''' 
<summary>
 
   ''' Open Connection To Datat Base
    ''' 
</summary>
 
   Protected Shared Sub OpenConnect()
 
       If ConSql.State ConnectionState.Closed Then
            If ConSql
.ConnectionString Nothing Then ConSql.ConnectionString MyConnectionString
            ConSql
.Open()
 
       End If
 
   End Sub 

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

PHP كود :
   ''' <summary>
    ''' 
اضافة سجل جديد الى جدول
    
''' </summary>
    ''' 
<param name="TableName">اسم الجدول</param>
 
   ''' <param name="Table">الجدول الذي يحوي الحقول و قيمها وهو مصفوفة</param>
    ''' 
<param name="KeyFiled">اسم حقل المفتاح الرئيسي ليتم استثنائه من جملة الاضافة</param>
 
   ''' <param name="Msg">رسالة الاضافة وهي اختيارية</param>
    ''' 
<returns>يعود بقيمة الحقل المضاف للمفتاح الرئيسي</returns>
 
   Protected Function Add_New(ByVal TableName As StringByVal Table As Dictionary(Of StringObject), ByVal KeyFiled As StringOptional ByVal Msg As Boolean False) As Integer

        Dim Resuilt 
As Integer 0
        Dim Insert_Statement 
As String "insert Into " TableName " ("

 
       If Table.ContainsKey(KeyFiledThen
            Table
.Remove(KeyFiled)
 
       End If


 
       Dim Column As String String.Empty
 
       For X As Integer 0 To Table.Count 1
            Column 
Table.Keys.ElementAt(X)
 
           Insert_Statement += Column ","
 
       Next
        
'
        If Insert_Statement.EndsWith(",") Then Insert_Statement = Insert_Statement.Remove(Insert_Statement.Count - 1, 1)
        Insert_Statement += ")" & " Values ("
        '
 
       For X As Integer 0 To Table.Count 1
            Column 
Table.Keys.ElementAt(X)
 
           Insert_Statement += "@" Column ","
 
       Next

        If Insert_Statement
.EndsWith(","Then Insert_Statement Insert_Statement.Remove(Insert_Statement.Count 11)
 
       Insert_Statement += ")"

 
       '
        OpenConnect()
        Using Cmd As New SqlClient.SqlCommand(Insert_Statement, ConSql)
            For i As Integer = 0 To Table.Count - 1
                Cmd.Parameters.AddWithValue("@" + Table.Keys.ElementAt(i), Table.Values.ElementAt(i))
            Next

            For Each parm As SqlClient.SqlParameter In Cmd.Parameters
                If IsNothing(parm.Value) Or IsDBNull(parm.Value) Then
                    parm.Value = DBNull.Value
                End If
            Next

            Resuilt = Cmd.ExecuteNonQuery

            '
تحصيل رقم السجل
            Cmd
.CommandText "Select @@IDENTITY"
 
           Resuilt CType(Cmd.ExecuteScalar(), Integer)

 
           If Msg True Then
                If Resuilt 
0 Then
                    MessageBox
.Show("تمت الاضافة بنجاح""حفظ التعديلات"MessageBoxButtons.OKMessageBoxIcon.InformationMessageBoxDefaultButton.Button1MessageBoxOptions.RightAlign)
 
               Else
                    MessageBox
.Show("فشلت عملية الاضافة""حفظ التعديلات"MessageBoxButtons.OKMessageBoxIcon.StopMessageBoxDefaultButton.Button1MessageBoxOptions.RightAlign)
 
                   Resuilt 0
                End 
If
 
           End If
 
       End Using
        CloseConnect
()
 
       Return Resuilt

    End 
Function 

شرح الدالة الخاصة بالاضافة 
وسائط الدالة هي 
TableName : اسم الجدول الذي سنتعامل معه
Table As Dictionary : جدول البيانات الذي سنتعامل معه و هو عبارة عن مصفوفه من النوع Dictionary تحتوي على عمودين واحد اخزن فيه اسماء الاعمدة و الثاني اخزن فيه قيمة كل عمود (ستتضح اليتها مع العمل و هي بسيطة جداً)
KeyFiled : اسم حقل المفتاح الرئيسي الخاص بالجدول ليتم استثنائه في عملية الاضافة
Msg : متغير منطقي (بولياني) اتحكم عن طريقه بعرض رسالة الاضافة من عدمها

PHP كود :
       Dim Resuilt As Integer 0
        Dim Insert_Statement 
As String "insert Into " TableName " ("

 
       If Table.ContainsKey(KeyFiledThen
            Table
.Remove(KeyFiled)
 
       End If


 
       Dim Column As String String.Empty
 
       For X As Integer 0 To Table.Count 1
            Column 
Table.Keys.ElementAt(X)
 
           Insert_Statement += Column ","
 
       Next 
انشاء متغير نصي يحمل جملة الاضافة بشكل ديناميكي يقوم بتجميعها وفق الوسائط المرسلة للدالة و من ثم يحذف حقل المفتاح الرئيسي من المصفوفة السابقة الخاصة بالجدول و بعدها يمر على باقي حقول الجدول و يضيفها لجملة الاستعلام

PHP كود :
       If Insert_Statement.EndsWith(","Then Insert_Statement Insert_Statement.Remove(Insert_Statement.Count 11)
 
       Insert_Statement += ")" " Values ("
 
       '
        For X As Integer = 0 To Table.Count - 1
            Column = Table.Keys.ElementAt(X)
            Insert_Statement += "@" & Column + ","
        Next

        If Insert_Statement.EndsWith(",") Then Insert_Statement = Insert_Statement.Remove(Insert_Statement.Count - 1, 1)
        Insert_Statement += ")" 
نزيل الفاصلة اخر جملة الاضافة و بعدها نمر مرة اخرى على حقول المصفوفة لنكون بارميتر لكل حقل و نضيفه لجملة الاضافة
و نزيل بعدها الفاصلة الاخيرة و نكون بذلك قد كونا جملة اضافة لكل الحقول الموجودة في المصفوفة و التي تمثل حقول الجدول 

PHP كود :
       OpenConnect()
 
       Using Cmd As New SqlClient.SqlCommand(Insert_StatementConSql)
 
           For i As Integer 0 To Table.Count 1
                Cmd
.Parameters.AddWithValue("@" Table.Keys.ElementAt(i), Table.Values.ElementAt(i))
 
           Next

            For Each parm 
As SqlClient.SqlParameter In Cmd.Parameters
                If IsNothing
(parm.Value) Or IsDBNull(parm.ValueThen
                    parm
.Value DBNull.Value
                End 
If
 
           Next

            Resuilt 
Cmd.ExecuteNonQuery 
نفتح الاتصال و نعرف كائن Command مع الوسائط المطلوبة 
نضيف بارمترات لكائن الـ Command عبر المرور على عناصر المصفوفة حيث نضيف اسم البارمتر موافق لاسم الحقل و نعطيه القيمة المخزنة في العمود الثاني الخاص بقيمة العمود
بعدها نقوم بالمرور على بارمترات الكائن Command و نسند القيمة Null لكل القيم الفارغة ان وجدت حتى لا نقع في مشاكل الادخالات الفارغة
و اخيراً ننفذ عملية الاضافة

PHP كود :
           'تحصيل رقم السجل
            Cmd.CommandText = "Select @@IDENTITY"
            Resuilt = CType(Cmd.ExecuteScalar(), Integer)

            If Msg = True Then
                If Resuilt > 0 Then
                    MessageBox.Show("تمت الاضافة بنجاح", "حفظ التعديلات", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
                Else
                    MessageBox.Show("فشلت عملية الاضافة", "حفظ التعديلات", MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
                    Resuilt = 0
                End If
            End If
        End Using
        CloseConnect()
        Return Resuilt 
بعد العملية السابقة سنقوم بتحصيل رقم السجل المضاف
و سنفحص قيمة المتغير البولياني و على اساسه نعرض رسالة الاضافة
اخيراً نعود بقيمة السجل المضاف لنستفيد منها و نورثها للابناء

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

اتمنى ان تكون الدالة مفهومة و سهلة الادراك


يتبع...
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد }}}
#2
الان مع جملة تحديث الجدول وفق حقل المفتاح الرئيسي

PHP كود :
       ''' <summary>
    ''' 
تحديث سجل في جدول وفق قيمة حقل المفتاح الرئيسي
    
''' </summary>
    ''' 
<param name="TableName">اسم الجدول المراد تحديثه</param>
    ''' <param name="Table">الجدول الذي يحوي الحقول و قيمها وهو مصفوفة</param>
    ''' 
<param name="FiledKey">اسم حقل المفتاح الرئيسي</param>
    ''' <param name="ID">قيمة حقل المفتاح الرئيسي</param>
    ''' 
<param name="Msg">رسالة حفظ اختيارية</param>
    Protected Sub Update_Table(ByVal TableName As StringByVal Table As Dictionary(Of StringObject), ByVal FiledKey As StringID As IntegerOptional ByVal Msg As Boolean False)

        If FiledKey String.Empty Then
            MessageBox
.Show("حدد حقل المفتاح الرئيسي من فضلك""تنبيه"MessageBoxButtons.OKMessageBoxIcon.StopMessageBoxDefaultButton.Button1MessageBoxOptions.RightAlign)
            Exit Sub
        End 
If

        If Table.ContainsKey(FiledKeyThen
            Table
.Remove(FiledKey)
        End If


        Dim Resuilt As Integer 0
        Dim UpdatetStr 
As String "Update " TableName " Set "

        Dim Column As String String.Empty
        For As Integer 0 To Table.Count 1
            Column 
Table.Keys.ElementAt(X)
            UpdatetStr += Column "=" "@" Column ","
        Next
        
'
        If UpdatetStr.EndsWith(",") Then UpdatetStr = UpdatetStr.Remove(UpdatetStr.Count - 1, 1)
        UpdatetStr += " Where (" & FiledKey & " = " & "@" & FiledKey & ")"
        '
        '
        Using Cmd As New SqlClient.SqlCommand(UpdatetStr, Con)

            For i As Integer = 0 To Table.Count - 1
                Cmd.Parameters.AddWithValue("@" + Table.Keys.ElementAt(i), Table.Values.ElementAt(i))
            Next
            Cmd.Parameters.AddWithValue("@" & FiledKey, ID)

            For Each parm As SqlClient.SqlParameter In Cmd.Parameters
                If IsNothing(parm.Value) Or IsDBNull(parm.Value) Then
                    parm.Value = DBNull.Value
                End If
            Next
            '
            OpenConnect()
            Resuilt Cmd.ExecuteNonQuery()
            CloseConnect()

            If Msg True Then
                
If Resuilt 0 Then
                    MessageBox
.Show("تم التعديل بنجاح""حفظ التعديلات"MessageBoxButtons.OKMessageBoxIcon.InformationMessageBoxDefaultButton.Button1MessageBoxOptions.RightAlign)
                Else
                    MessageBox.Show("فشلت عملية التعديل""حفظ التعديلات"MessageBoxButtons.OKMessageBoxIcon.StopMessageBoxDefaultButton.Button1MessageBoxOptions.RightAlign)
                End If

            End If
        End Using
    End Sub 
نفس الكلام السابق سوى انها تقوم بتحديث الجدول بالمعطيات الجديدة

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

PHP كود :
   ''' <summary>
    ''' 
تحديث جدول وفق مجموعة شروط جدول مصفوفة
    
''' </summary>
    ''' 
<param name="TblNmae">اسم الجدول</param>
 
   ''' <param name="Table"> جدول يحتوي على الحقول المراد تحديثها مع قيمها - مصفوفة</param>
    ''' 
<param name="CondFileds">جدول يحتوي على الشروط المراد التحديث وفقها مع قيمها مصفوفة</param>
 
   ''' <param name="Msg"></param>
    Protected Sub Update_TableByMultiCounditions(ByVal TblNmae As String, ByVal Table As Dictionary(Of String, Object), ByVal CondFileds As Dictionary(Of String, Object), Optional ByVal Msg As Boolean = False)

        If Table.Count = 0 Then
            MessageBox.Show("املئ جدول الحقول")
            Exit Sub
        End If
        If CondFileds.Count = 0 Then
            MessageBox.Show("املئ جدول الحقول الشرطية")
            Exit Sub
        End If
        ' 
 ملئ الحقول و بارمتراتها
        Dim UpdatetStr 
As String "Update " TblNmae " Set "
 
       Dim Column As String String.Empty
 
       For X As Integer 0 To Table.Count 1
            Column 
Table.Keys.ElementAt(X)
 
           UpdatetStr += Column "=" "@" Column ","
 
       Next
        If UpdatetStr
.EndsWith(","Then UpdatetStr UpdatetStr.Remove(UpdatetStr.Count 11)
 
       'ملئ الشروط و بارمتراتها
        UpdatetStr += " Where ("
        For p As Integer = 0 To CondFileds.Count - 1
            UpdatetStr += "(" + CondFileds.Keys.ElementAt(p) & " = @" & CondFileds.Keys.ElementAt(p) + ")" + "And"
        Next
        If UpdatetStr.EndsWith("And") Then UpdatetStr = UpdatetStr.Remove(UpdatetStr.Count - 3, 3)
        '
 
       Dim Resuilt As Integer 0

        Using Cmd 
As New SqlClient.SqlCommand(UpdatetStrCon)

 
           For i As Integer 0 To Table.Count 1
                Cmd
.Parameters.AddWithValue("@" Table.Keys.ElementAt(i), Table.Values.ElementAt(i))
 
           Next
            
'
            For p As Integer = 0 To CondFileds.Count - 1
                Cmd.Parameters.AddWithValue("@" + CondFileds.Keys.ElementAt(p), CondFileds.Values.ElementAt(p))
            Next

            For Each parm As SqlClient.SqlParameter In Cmd.Parameters
                If IsNothing(parm.Value) Or IsDBNull(parm.Value) Then
                    parm.Value = DBNull.Value
                End If
            Next
            '
 
           OpenConnect()
 
           Resuilt Cmd.ExecuteNonQuery()
 
           CloseConnect()

 
           If Msg True Then
                If Resuilt 
0 Then
                    MessageBox
.Show("تم التعديل بنجاح""حفظ التعديلات"MessageBoxButtons.OKMessageBoxIcon.InformationMessageBoxDefaultButton.Button1MessageBoxOptions.RightAlign)
 
               Else
                    MessageBox
.Show("فشلت عملية التعديل""حفظ التعديلات"MessageBoxButtons.OKMessageBoxIcon.StopMessageBoxDefaultButton.Button1MessageBoxOptions.RightAlign)
 
               End If
 
           End If

 
       End Using

    End Sub 

حذف سجل من جدول وفق شرط واحد (قيمة المفتاح الرئيسي)

PHP كود :
   ''' <summary>
    ''' 
حذف سجل من جدول وفق قيمة المفتاح الرئيسي
    
''' </summary>
    ''' 
<param name="TableName">اسم الجدول المراد الحذف منه</param>
 
   ''' <param name="FiledKey">اسم حقل المفتاح الرئيسي</param>
    ''' 
<param name="ID">قيمة حقل المفتاح الرئيسي</param>
 
   ''' <param name="Msg">رسالة تأكيد الحذف اختيارية</param>
    Protected Sub Delete_Table(ByVal TableName As String, ByVal FiledKey As String, ByVal ID As Integer, Optional ByVal Msg As Boolean = False)

        If FiledKey = String.Empty Then
            MessageBox.Show("حدد حقل المفتاح الرئيسي من فضلك", "تنبيه", MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
            Exit Sub
        End If

        Dim DeletetStr As String = "Delete From " & TableName & "  Where " & FiledKey & " = " & "@" & FiledKey

        Dim Result As Integer = 0

        OpenConnect()

        Using Cmd As New SqlClient.SqlCommand(DeletetStr, Con)
            Cmd.Parameters.AddWithValue("@" & FiledKey, ID)
            Result = Cmd.ExecuteNonQuery()
        End Using
        CloseConnect()

        If Msg = True Then
            If Result > 0 Then
                MessageBox.Show("تم الحذف بنجاح", "حذف", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
            Else
                MessageBox.Show("فشلت عملية الحذف", "حذف", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
            End If
        End If
    End Sub 
و كذلك الحذف وفق مجموع شروط كما هو حال التحديث

PHP كود :
   ''' <summary>
    ''' 
حذف مجموعة سجلات من جدول وفق مجموعة شروط
    
''' </summary>
    ''' 
<param name="TableName">اسم الجدول المراد الحذف منه</param>
 
   ''' <param name="CondFileds">مصفوفة الشروط مع قيمها</param>
    ''' 
<param name="Msg">رسالة تأكيد الحذف اختيارية</param>
 
   Protected Sub Delete_TableByMultiCounditions(ByVal TableName As StringByVal CondFileds As Dictionary(Of StringObject), Optional ByVal Msg As Boolean False)


 
       If CondFileds.Count 0 Then
            MessageBox
.Show("قائمة الشروط فارغة حاول ملئها اولاً""تنبيه"MessageBoxButtons.OKMessageBoxIcon.StopMessageBoxDefaultButton.Button1MessageBoxOptions.RightAlign)
 
           Exit Sub
        End 
If
 
       '
        If TableName = String.Empty Then
            MessageBox.Show("حدد اسم الجدول من فضلك", "تنبيه", MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
            Exit Sub
        End If
        ' 
 ملئ الحقول و بارمتراتها
        Dim DeletetStr 
As String "Delete From " TableName "  Where "
 
       Dim Column As String String.Empty
 
       For X As Integer 0 To CondFileds.Count 1
            Column 
CondFileds.Keys.ElementAt(X)
 
           DeletetStr += "(" Column "=" "@" Column ")" " And "
 
       Next
        If DeletetStr
.EndsWith("And "Then DeletetStr DeletetStr.Remove(DeletetStr.Count 55)
 
       'مصفوفة بارمترات لكوماند الحذف
        Dim parms As New List(Of SqlClient.SqlParameter)
        For i As Integer = 0 To CondFileds.Count - 1
            Dim parm As New SqlClient.SqlParameter("@" & CondFileds.Keys.ElementAt(i), CondFileds.Values.ElementAt(i))
            parms.Add(parm)
        Next
        '
 
       Dim Result As Integer 0
        
'
        Using Cmd As New SqlClient.SqlCommand(DeletetStr, Con)
            '
تزويد الكوماند بالبارمترات
            For Each Parm 
As SqlClient.SqlParameter In parms
                Cmd
.Parameters.Add(Parm)
 
           Next
            
'
            OpenConnect()
            Result = Cmd.ExecuteNonQuery()
            CloseConnect()

            If Msg = True Then
                If Result > 0 Then
                    MessageBox.Show("تم الحذف بنجاح", "حذف", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
                Else
                    MessageBox.Show("فشلت عملية الحذف", "حذف", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
                End If
            End If

        End Using

    End Sub 
الان ناتي الى عمليات تعبئة الجدول بالبيانات , وله عدة انواع مثل الملئ العادي او الملئ وفق ترتيب محدد و بشرط او بدونه او وفق مجموع شروط 

اولاً الملئ بترتيب او بدونه بدون شروط
PHP كود :
   ''' <summary>
    ''' 
تعبئة جدول بكامل الصفوف مع ترتيب
    
''' </summary>
    ''' 
<param name="TblNmae">اسم الجدول</param>
 
   ''' <param name="Table">الجدول الذي يحوي الحقول و قيمها وهو مصفوفة</param>
    ''' 
<param name="OrderBy">اسم الحقل الذي على اساسه يتم الترتيب</param>
 
   ''' <returns>يعود بجدول معبئ بالبيانات</returns>
    Protected Overloads Shared Function Fill_Table(ByVal TblNmae As String, ByVal Table As Dictionary(Of String, Object), Optional OrderFiled As String = Nothing, Optional OrderBy As Boolean = False) As DataTable

        If Table.Count = 0 Then
            MessageBox.Show("املئ جدول الحقول")
            Return Nothing
        End If

        If Table.Count = 0 Then
            MessageBox.Show("املئ جدول الحقول ")
            Return Nothing
        End If


        Dim SelectStatement As String = "Select "

        Dim Column As String = String.Empty
        For X As Integer = 0 To Table.Count - 1
            Column = Table.Keys.ElementAt(X)
            SelectStatement += Column + ","
        Next

        If SelectStatement.EndsWith(",") Then SelectStatement = SelectStatement.Remove(SelectStatement.Count - 1, 1)
        SelectStatement += " From " & TblNmae
        If OrderBy = True Then
            If Not IsNothing(OrderFiled) Then
                SelectStatement += " Order By " & OrderFiled
            Else
                ' 
MsgBox("حقل الترتيب معدوم القيمة")
 
           End If
 
       End If


 
       Dim Dt As New DataTable
        Dt
.Clear()

 
       Using Cmd As New SqlClient.SqlCommand(SelectStatementCon)
 
           Using Da As New SqlClient.SqlDataAdapter(Cmd)
 
               Da.Fill(Dt)
 
           End Using
        End Using

        Return Dt
    End 
Function 
الدالة تعيد كائن جدول معبئ بالبيانات 

ثانياً الملئ وفق شرط
PHP كود :
   ''' <summary>
    ''' 
تعبئة جدول بحقول محددة وفق شرط
    
''' </summary>
    ''' 
<param name="TblNmae">اسم الجدول</param>
 
   ''' <param name="Fileds">مصفوفة الحقول</param>
    ''' 
<param name="CondFiled">شرط المطابقة حقل</param>
 
   ''' <param name="id">قيمة الحقل الشرطي</param>
    ''' 
<returns>القيمة المعادة جدول بيانات</returns>
 
   Protected Overloads Function Fill_TableWithCoundition(ByVal TblNmae As StringByVal Fileds As Dictionary(Of StringObject), ByVal CondFiled As StringByVal ID As Object) As DataTable

        If Fileds
.Count 0 Then
            MessageBox
.Show("تاكد من ملئ مصفوفة الحقول")
 
           Return Nothing
        ElseIf TblNmae 
"" Or CondFiled "" Then
            MessageBox
.Show("تاكد من ملئ اسم الجدول او اسم الحقل الشرطي")
 
           Return Nothing
        ElseIf IsNothing
(IDThen
            MessageBox
.Show("قيمة الحقل الشرطي معدومة")
 
           Return Nothing
        End 
If


 
       Dim SelectStatement As String "Select "

 
       Dim Column As String String.Empty
 
       For X As Integer 0 To Fileds.Count 1
            Column 
Fileds.Keys.ElementAt(X)
 
           SelectStatement += Column ","
 
       Next


        If SelectStatement
.EndsWith(","Then SelectStatement SelectStatement.Remove(SelectStatement.Count 11)
 
       SelectStatement += " From " TblNmae " Where " CondFiled " = @" CondFiled

        Dim Dt 
As New DataTable
        Dt
.Clear()

 
       Using Cmd As New SqlClient.SqlCommand(SelectStatementCon)
 
           Cmd.Parameters.AddWithValue("@" CondFiledID)
 
           Using Da As New SqlClient.SqlDataAdapter(Cmd)
 
               Da.Fill(Dt)
 
           End Using
        End Using

        Return Dt
    End 
Function 

ثالثاً الملئ وفق مجموعة شروط
PHP كود :
   ''' <summary>
    ''' 
تعبئة جدول بالبيانات وفق مجموعة شروط 
    
''' </summary>
    ''' 
<param name="TableName">اسم الجدول</param>
 
   ''' <param name="CondFileds">قائمة الشروط</param>
    ''' 
<returns>يعيد جدول بيانات مملوء وفق الشروط المحددة</returns>
 
   Protected Overloads Function Fill_TableWithMultiCounditions(ByVal TableName As StringByVal CondFileds As Dictionary(Of StringObject)) As DataTable
        If TableName 
"" Then
            MessageBox
.Show("تاكد من ملئ اسم الجدول")
 
           Return Nothing
        End 
If

 
       If CondFileds.Count 0 Then
            MessageBox
.Show("املئ مصفوفة الحقول")
 
           Return Nothing
        End 
If

 
       Dim Serch As String "Select "
 
       Dim Column As String String.Empty
 
       For X As Integer 0 To CondFileds.Count 1
            Column 
CondFileds.Keys.ElementAt(X)
 
           Serch += Column ","
 
       Next


        If Serch
.EndsWith(","Then Serch Serch.Remove(Serch.Count 11)
 
       Serch += " From " TableName " Where "

 
       For X As Integer 0 To CondFileds.Count 1
            Column 
CondFileds.Keys.ElementAt(X)
 
           Serch += "(" Column "=" "@" Column ")" " And "
 
       Next

        If Serch
.EndsWith("And "Then Serch Serch.Remove(Serch.Count 55)
 
       '
        Dim Dt As New DataTable
        Dt.Clear()
        '
 
       Dim parms As New List(Of SqlClient.SqlParameter)
 
       For i As Integer 0 To CondFileds.Count 1
            Dim parm 
As New SqlClient.SqlParameter("@" CondFileds.Keys.ElementAt(i), CondFileds.Values.ElementAt(i))
 
           parms.Add(parm)
 
       Next

        Using Cmd 
As New SqlClient.SqlCommand(SerchCon)
 
           For Each Parm As SqlClient.SqlParameter In parms
                Cmd
.Parameters.Add(Parm)
 
           Next

            Using Da 
As New SqlClient.SqlDataAdapter(Cmd)
 
               Da.Fill(Dt)
 
           End Using
        End Using
        Return Dt

    End 
Function 
كل دوال الملئ تعود بجدول بيانات DataTable
ساكتفي بهذا العدد من الدوال حتى الان و اذا اردت التوسع يمكنك ذلك

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

يتبع...
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد }}}
#3
جميل جداً بارك الله فيك

الله يجعل عملك خالصا لوجهه الكريم

ويكتب لك عن كل حرف الف خير والف حسنة
الرد }}}
تم الشكر بواسطة: abdualla , ابو ليلى , Amir_Alzubidy
#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 
اتمنى ان تكون الامور مفهومة و واضحة , و اتمنى من الله ان يكون هذا العمل فيه الفائدة لكم
و لاتنسونا من دعواتكم
بالتوفيق للجميع
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد }}}
#5
ما شاء الله وجزاك الله خير
الرد }}}
تم الشكر بواسطة: ابو ليلى , ابو ليلى , Amir_Alzubidy
#6
زادك الله من علمة
يعطيك العافية
Mish3l
الرد }}}
تم الشكر بواسطة: abdualla , ابو ليلى , Amir_Alzubidy , Amir_Alzubidy
#7
(09-04-17, 03:45 AM)sendbad100 كتب : جميل جداً بارك الله فيك

الله يجعل عملك خالصا لوجهه الكريم

ويكتب لك عن كل حرف الف خير والف حسنة
آمين , جزاك الله خيراً و شكراً لمرورك
(09-04-17, 05:21 AM)abdualla كتب : ما شاء الله وجزاك الله خير
شكرا لك و جزالك الله خيراً
(09-04-17, 03:45 PM)tryold كتب : زادك الله من علمة
يعطيك العافية
و زادك الله و جزاك بالخير
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد }}}
تم الشكر بواسطة: sendbad100 , sendbad100 , abdualla , Amir_Alzubidy
#8
السلام عليكم 
اخي / ابو ليلى ..... جزاك الله الف خير 

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


انا جديد ايضا على فجوال بيسك دوت نت  كنت استخدم فجوال بيسك6  فقط   والان احاول اتقدم قليلاً

هل يمكن اخي الفاضل / ابو اليلى


ان ترفع المثال  كي اطبق خطوة خطوة واراجع عملي بنفسي

اكون لك من الشاكرين 
.
طبعا بدون قاعدة البيانات

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

باذن الله تعالى


الملفات المرفقة صورة/صور
   
الرد }}}
تم الشكر بواسطة: ابو ليلى , abdualla , Amir_Alzubidy , Amir_Alzubidy
#9
لا ادري ان كانت متوفرة في نسخة 2012 ام لا
بكل الاحوال يمكنك استخدام الاختصار (. + Ctrl) اذا كانت متوفرة سيعمل الاختصار
او عليك بانشاء الخصائص يدوياً و هو المحبب لدي لانه يعطيك خبرة و مرونة في الكتابة
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد }}}
تم الشكر بواسطة: sendbad100 , sendbad100 , abdualla , Amir_Alzubidy
#10
(10-04-17, 03:59 PM)ابو ليلى كتب : لا ادري ان كانت متوفرة في نسخة 2012 ام لا
بكل الاحوال يمكنك استخدام الاختصار   (. + Ctrl) اذا كانت متوفرة سيعمل الاختصار
او عليك بانشاء الخصائص يدوياً و هو المحبب لدي لانه يعطيك خبرة و مرونة في الكتابة

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

شكرا لك 


هل يمكن اخي الفاضل / ابو اليلى 


ان ترفع المثال  كي اطبق خطوة خطوة واراجع عملي بنفسي 

اكون لك من الشاكرين 
.
طبعا بدون قاعدة البيانات 

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

باذن الله تعالى
الرد }}}
تم الشكر بواسطة: ابو ليلى , abdualla , Amir_Alzubidy , Amir_Alzubidy


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

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


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