التنبيهات التالية ظهرت :
Warning [2] count(): Parameter must be an array or an object that implements Countable - Line: 864 - File: showthread.php PHP 7.4.33 (Linux)
File Line Function
/showthread.php 864 errorHandler->error



تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
اعادة الترقيم لحقل الاي دي
#1
السلام عليكم ورحمة الله وبركاته
الكثير من الاخوة تزعجهم الفجوات الرقمية التسلسلية للاي دي عند حذف السجلات من الجدول
وبالرغم من ان الامر طبيعي وحقيقي لان الاي دي هو معرف فريد لكل سجل ولايجوز تكراره او تغييره لانه هو الدليل الذي تتم به عمليات الحذف والتعديل
والاهم هو ان المعرف هو حقل الربط العلائقي بين جدول (أب) وجدول (ابن) اي مفتاح رئيسي ومفتاح فرعي وبمجرد التفكير في اعادة التسلسل
للاي دي هو بحد ذاته خطأ برمجي قاتل ويترتب على اعادة الترقيم كارثة في البيانات وسيختلط الحابل بالنابل
كما ان الاي دي ان كان ترقيم تلقائي فإننا لايمكن اعادة الترقيم للجدول لاننا سنضطر الى حذف المفتاح ومن ثم حقل الاي دي وبعدها اعادة انشائه وحذف كل البيانات واعادة الادخال (حفلة طويلة)
اذا ماهي الحالة الممكن اعادة ترقيم الاي دي فيها ؟
اذا كان الجدول ليس له اي ارتباط مع جداول اخرى وحقل الاي دي لايؤثر على التعامل مع السجل ورقم الاي دي غير مهم بالنسبة للسجل 
وايضا يجب ان لايكون ترقيم تلقائي (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


الملفات المرفقة
.zip   Kebboud_Renumbring_Id.zip (الحجم : 126.23 ك ب / التحميلات : 121)
اعمل الخير وأجرك لا تنتظره فالله خير من إليك يرده
البرمجة ليست مجرد كود بل هي منهج تفكير منطقي لحل المشكلات







الرد }}}
تم الشكر بواسطة: asemshahen5 , kebboud , tryold , homid2008 , سعود


الردود في هذا الموضوع
اعادة الترقيم لحقل الاي دي - بواسطة ابراهيم ايبو - 03-08-21, 02:43 AM


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


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