03-08-21, 02:43 AM
(آخر تعديل لهذه المشاركة : 03-08-21, 02:52 AM {2} بواسطة ابراهيم ايبو.)
السلام عليكم ورحمة الله وبركاته
الكثير من الاخوة تزعجهم الفجوات الرقمية التسلسلية للاي دي عند حذف السجلات من الجدول
وبالرغم من ان الامر طبيعي وحقيقي لان الاي دي هو معرف فريد لكل سجل ولايجوز تكراره او تغييره لانه هو الدليل الذي تتم به عمليات الحذف والتعديل
والاهم هو ان المعرف هو حقل الربط العلائقي بين جدول (أب) وجدول (ابن) اي مفتاح رئيسي ومفتاح فرعي وبمجرد التفكير في اعادة التسلسل
للاي دي هو بحد ذاته خطأ برمجي قاتل ويترتب على اعادة الترقيم كارثة في البيانات وسيختلط الحابل بالنابل
كما ان الاي دي ان كان ترقيم تلقائي فإننا لايمكن اعادة الترقيم للجدول لاننا سنضطر الى حذف المفتاح ومن ثم حقل الاي دي وبعدها اعادة انشائه وحذف كل البيانات واعادة الادخال (حفلة طويلة)
اذا ماهي الحالة الممكن اعادة ترقيم الاي دي فيها ؟
اذا كان الجدول ليس له اي ارتباط مع جداول اخرى وحقل الاي دي لايؤثر على التعامل مع السجل ورقم الاي دي غير مهم بالنسبة للسجل
وايضا يجب ان لايكون ترقيم تلقائي (AutoNumber) اي اننا ندخل الاي دي عبر دالة Max في هذه الحالة فقط يمكننا اعادة تسلسله (بالرغم من اني لاأحبذ ذلك)
وقد بحثت كثيرا في المنتدى والانترنت عن كود يؤدي المطلوب لكن دون جدوى وكل الاجابات عن الاسئلة المتعلقة بالموضوع هي رفض اعادة الترقيم او الاحجام عن الاجابة وانا من انصار هذا الرأي
لكن الحاح السائلين جعلني ابحث عن الطريقة والكود من باب العلم بالشيئ ويكون لمنتدنا الغالي السبق في الاجابة
الصراحة لم استفد من اي معلومة من قرأتها وهذا الكود أخذ مني وقتا ليس باليسير واتعبني حتى تم المطلوب
المعضلة كانت كيف سيتم تعدبل التسلسل القديم بالجديد وبخاصة اننا سنستخدم الرقم القديم ليكون شرط التعدبل !!!!!
لن اطيل عليكم انشأت مثال لجدول وحيد يمكن الحفط والتعديل والحذف فيه لنترك الفجوات وبعدها نضغط عل زر اعادة ترتيب الاي دي
وهذا هو الكود
الكثير من الاخوة تزعجهم الفجوات الرقمية التسلسلية للاي دي عند حذف السجلات من الجدول
وبالرغم من ان الامر طبيعي وحقيقي لان الاي دي هو معرف فريد لكل سجل ولايجوز تكراره او تغييره لانه هو الدليل الذي تتم به عمليات الحذف والتعديل
والاهم هو ان المعرف هو حقل الربط العلائقي بين جدول (أب) وجدول (ابن) اي مفتاح رئيسي ومفتاح فرعي وبمجرد التفكير في اعادة التسلسل
للاي دي هو بحد ذاته خطأ برمجي قاتل ويترتب على اعادة الترقيم كارثة في البيانات وسيختلط الحابل بالنابل
كما ان الاي دي ان كان ترقيم تلقائي فإننا لايمكن اعادة الترقيم للجدول لاننا سنضطر الى حذف المفتاح ومن ثم حقل الاي دي وبعدها اعادة انشائه وحذف كل البيانات واعادة الادخال (حفلة طويلة)
اذا ماهي الحالة الممكن اعادة ترقيم الاي دي فيها ؟
اذا كان الجدول ليس له اي ارتباط مع جداول اخرى وحقل الاي دي لايؤثر على التعامل مع السجل ورقم الاي دي غير مهم بالنسبة للسجل
وايضا يجب ان لايكون ترقيم تلقائي (AutoNumber) اي اننا ندخل الاي دي عبر دالة Max في هذه الحالة فقط يمكننا اعادة تسلسله (بالرغم من اني لاأحبذ ذلك)
وقد بحثت كثيرا في المنتدى والانترنت عن كود يؤدي المطلوب لكن دون جدوى وكل الاجابات عن الاسئلة المتعلقة بالموضوع هي رفض اعادة الترقيم او الاحجام عن الاجابة وانا من انصار هذا الرأي
لكن الحاح السائلين جعلني ابحث عن الطريقة والكود من باب العلم بالشيئ ويكون لمنتدنا الغالي السبق في الاجابة
الصراحة لم استفد من اي معلومة من قرأتها وهذا الكود أخذ مني وقتا ليس باليسير واتعبني حتى تم المطلوب
المعضلة كانت كيف سيتم تعدبل التسلسل القديم بالجديد وبخاصة اننا سنستخدم الرقم القديم ليكون شرط التعدبل !!!!!
لن اطيل عليكم انشأت مثال لجدول وحيد يمكن الحفط والتعديل والحذف فيه لنترك الفجوات وبعدها نضغط عل زر اعادة ترتيب الاي دي
وهذا هو الكود
كود :
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Try
Dim Cmd1, Cmd2 As New OleDbCommand()
Dim da As New OleDbDataAdapter()
Dim Dt1, dt2 As New DataTable()
Dim Lstb As New ListBox()
Dt1.Clear()
' جلب كل البيانات
da = New OleDbDataAdapter("select * from Personal ", Con)
da.Fill(Dt1)
Lstb.Items.Clear()
' اضافة الاي دي الى الليست بوكس لاستخدامها
For x As Integer = 0 To Dt1.Rows.Count - 1
Lstb.Items.Add(Dt1.Rows(x)(0))
Next
For i As Integer = 0 To Lstb.Items.Count - 1
dt2.Clear()
' جلب بيانات صف واحد بدلالة الاي دي المخزن في الليست بوكس
da = New OleDbDataAdapter("select * from Personal where Cv_id = " & CInt(Lstb.Items(i)) & "", Con)
da.Fill(dt2)
'تخزين السجل في مصفوفة
Dim MyString() As String = {dt2.Rows(0)(0).ToString(), dt2.Rows(0)(1).ToString(), dt2.Rows(0)(2).ToString(), dt2.Rows(0)(3).ToString(), dt2.Rows(0)(4).ToString(), dt2.Rows(0)(5).ToString(), dt2.Rows(0)(6).ToString()}
Try
'حذف السجل الذي خزن في المصفوفة
Cmd2 = New OleDbCommand("Delete From Personal Where CV_ID=@CV_ID", Con)
Cmd2.Parameters.Add(New OleDbParameter("@CV_ID", OleDbType.Integer)).Value = CInt(Lstb.Items(i))
If Con.State = ConnectionState.Open Then Con.Close()
Con.Open()
Cmd2.ExecuteNonQuery()
Con.Close()
Catch ex As Exception
Finally
Con.Close()
End Try
' اضافةالسجل مع الترقيم الجديد الى الجدول
Cmd1 = New OleDbCommand("insert into Personal(CV_ID,CV_Name,CV_BirthDay,CV_Job,CV_Salary,CV_Programer,CV_Adress) Values(@CV_ID,@CV_Name,@CV_BirthDay,@CV_Job,@CV_Salary,@CV_Programer,@CV_Adress)", Con)
Cmd1.Parameters.Add(New OleDbParameter("@CV_ID", OleDbType.Integer)).Value = i + 1
Cmd1.Parameters.Add(New OleDbParameter("@CV_Name", OleDbType.VarWChar)).Value = MyString(1)
Cmd1.Parameters.Add(New OleDbParameter("@CV_BirthDay", OleDbType.Date)).Value = MyString(2)
Cmd1.Parameters.Add(New OleDbParameter("@CV_Job", OleDbType.VarWChar)).Value = MyString(3)
Cmd1.Parameters.Add(New OleDbParameter("@CV_Salary", OleDbType.VarWChar)).Value = Convert.ToUInt32(MyString(4))
Cmd1.Parameters.Add(New OleDbParameter("@CV_Programer", OleDbType.Boolean)).Value = MyString(5)
Cmd1.Parameters.Add(New OleDbParameter("@CV_Adress", OleDbType.VarWChar)).Value = MyString(6)
If Con.State = ConnectionState.Open Then Con.Close()
Con.Open()
Cmd1.ExecuteNonQuery()
Con.Close()
Next
Catch ex As Exception
End Try
SelectAll_Personal()
MessageBox.Show("تمت عملية اعادة الترقيم بنجاح", "تعديل", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
اعمل الخير وأجرك لا تنتظره فالله خير من إليك يرده
البرمجة ليست مجرد كود بل هي منهج تفكير منطقي لحل المشكلات