منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : أحتاج كود اعادة ترقيم حقل المسلسل بعد حذف صف ما في الجدول
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2
السلام عليكم ورحمة الله وبركاته

إخواني الكرام تحياتي لكم جميعا

اريد كود يقوم باعادة ترقيم حقل المسلسل في جدول sql server 2008 .

وذلك بعد حذف سجل ما من الجدول

أو حل لهذه المشكلة

جزاكم الله خيرا
(08-09-17, 07:02 PM)Abdelazez.Ahmad كتب : [ -> ]السلام عليكم ورحمة الله وبركاته

إخواني الكرام تحياتي لكم جميعا

اريد كود يقوم باعادة ترقيم حقل المسلسل في جدول sql server 2008 .

وذلك بعد حذف سجل ما من الجدول

أو حل لهذه المشكلة

جزاكم الله خيرا


ضع هذا الكود بعد كود الحذف


PHP كود :
Try
            Application.DoEvents()
            Dim cmd As sqlDbCommand = New sqlDbCommand("SELECT field1,field2  from Table order by id "Con)
            da = New OleDbDataAdapter(cmd)
            'Dim cmd As New OleDb.OleDbCommand("", con)
            '
cmd.Connection Con()
            If Not con.State ConnectionState.Open Then
                con
.Open()
            End If
            ' ID كود حذف المفتاح من حقل الترقيم التلقائي الي اسمه   
            cmd.CommandText = "ALTER TABLE Table DROP CONSTRAINT PrimaryKey"
            cmd.ExecuteNonQuery()
            ' 
ID كود حذف حقل الترقيم التلقائي الي اسمه  
            cmd
.CommandText "ALTER TABLE Table DROP COLUMN id"
            cmd.ExecuteNonQuery()
            'مع وضع مفتاح له ID كود انشاء حقل الترقيم التلقائي الي اسمه  
            cmd1.CommandText = "ALTER TABLE Table ADD COLUMN id COUNTER CONSTRAINT [PrimaryKey] Primary key"
            cmd.ExecuteNonQuery()
            '
تحديث قاعدة البيانات
            ds 
= New DataSet
            ds
.Clear()
            da.Fill(ds"Table")

            con.Close()
        Catch ex As Exception
         End 
Try 
ابسط طريقة بحسب ما ارى ان تقم بعمل عمود الرقم (id) غير تلقائي 
بعد ذالك في الكود البرمجي عند كل اضافه معلوماتجديده للجدول تقوم بقرائه اخر رقم (id) من الجدول و تضيف اليه 1

وهذه هي الطريقه :

فنكشن لقرائه اخر رقم من الجدول :

 
كود :
Private Function GetRowsCount() As Integer
        Dim da As New SqlDataAdapter("select * from table", SQL.conn)
        Dim ds As New DataSet
        da.Fill(ds)
        Return ds.Tables(0).Rows.Count
    End Function

بعد ذلك عند الاضافه تقوم بوضع هذا الكود ليضاف لل id :
GetRowsCount() + 1
هكذا تحل مشكلتك صديقي
جزاك الله خيرا أخي الكريم ( [b]tryold[/b] ) جاري التجربة
أسأل الله العظيم أن يجعل من الخير نصيبا بالدنيا والآخرة

جزاك الله خيرا أخي الكريم (  [b]Rabeea Qbaha  ) [/b]

[b]فقد أتيت بالمطلوب وما أريده بالظبط[/b]
[b]أسأل الله العظيم أن يجعل من الخير نصيبا بالدنيا والآخرة[/b]

(08-09-17, 11:56 PM)Rabeea Qbaha كتب : [ -> ]ابسط طريقة بحسب ما ارى ان تقم بعمل عمود الرقم (id) غير تلقائي 
بعد ذالك في الكود البرمجي عند كل اضافه معلوماتجديده للجدول تقوم بقرائه اخر رقم (id) من الجدول و تضيف اليه 1

وهذه هي الطريقه :

فنكشن لقرائه اخر رقم من الجدول :

 
كود :
Private Function GetRowsCount() As Integer
        Dim da As New SqlDataAdapter("select * from table", SQL.conn)
        Dim ds As New DataSet
        da.Fill(ds)
        Return ds.Tables(0).Rows.Count
    End Function

بعد ذلك عند الاضافه تقوم بوضع هذا الكود ليضاف لل id :
GetRowsCount() + 1
هكذا تحل مشكلتك صديقي
[b]Rabeea Qbaha
[/b]أخي الكريم فكرتك صحيحة مليون المية لكن أود ألفت نظرك لحاجة مهمة جدا
انا جربت طريقتك هذه من قبل وبها مشكلة وهي
هب انك عندك بالجدول 10 عناصر  وتم حذف الصف رقم 7
سيكون ترتيب الجدول كالتالي 1 - 2 - 3 - 4 - 5 - 6 - 8 - 9 - 10 بدون الترتيب 7 صح ؟
سيكون اخر رقم 10 وعدد الصفوف الفعلية 9 وبطريقتك التي تعتمد علي احضار عدد الصفوف + 1 سيحدث تكرار بالجدول وهذا غير منطقي ولا مطلوب

لكن أن اريد
أكبر قيمة بحقل الـ ID ومن ثم اضافة عليها 1 وبذلك لا يحدث خطا عند اضافة عنصر جديد

فالمطلوب أكبر قيمة بحقل الـ Id
لقد جربت فكرة طرات في بالي وهي اضافة عمود ليس ترقيم تلقائي وهذه الفكرة
كود :
Public Class Form1
   Dim str As String = "provider=microsoft.ace.oledb.12.0;data source=|DataDirectory|\db.accdb"
   Dim con As New OleDb.OleDbConnection(str)
   Dim dt As DataTable
   Dim da As OleDb.OleDbDataAdapter
   Dim cmd As OleDb.OleDbCommandBuilder

   Private Function gid() As Integer
       Try
           Dim cm As New OleDb.OleDbCommand("select Last(tid) from tb", con)
           If con.State = ConnectionState.Closed Then con.Open()
           Return cm.ExecuteScalar
       Catch ex As Exception
           Return Nothing
       End Try
   End Function

   Private Sub gd()
       ListBox1.DataSource = Nothing
       dt = New DataTable
       da = New OleDb.OleDbDataAdapter("select * from tb", con)
       cmd = New OleDb.OleDbCommandBuilder(da)
       da.Fill(dt)
       ListBox1.DataSource = dt
       ListBox1.DisplayMember = "tid"
   End Sub
   Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
       gd()
   End Sub

   Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
       Dim row As DataRow = dt.NewRow
       row(0) = gid() + 1
       dt.Rows.Add(row)
       da.Update(dt)
       gd()
       ListBox1.SelectedIndex = ListBox1.Items.Count - 1
   End Sub

   Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
       If ListBox1.SelectedIndex < 0 Then MsgBox("اختر الرقم المراد حذفه من القائمة", MsgBoxStyle.Critical, "") : Return

       dt.Rows(ListBox1.SelectedIndex).Delete()
       da.Update(dt)
       gd()
   End Sub

   Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
       ListBox1.DataSource = Nothing

       For r As Integer = 0 To dt.Rows.Count - 1
           Dim row As DataRow = dt.Rows(r)
           row.BeginEdit()
           row(0) = r
           row.EndEdit()
           da.Update(dt)
       Next
       gd()
   End Sub
End Class


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

الدالة بالكود لم استخدمها مع اني كتبتها 
كود :
Private Function gid() As Integer
       Try
           Dim cm As New OleDb.OleDbCommand("select Last(tid) from tb", con)
           If con.State = ConnectionState.Closed Then con.Open()
           Return cm.ExecuteScalar
       Catch ex As Exception
           Return Nothing
       End Try
   End Function
(09-09-17, 04:26 AM)سعود كتب : [ -> ]لقد جربت فكرة طرات في بالي وهي اضافة عمود ليس ترقيم تلقائي وهذه الفكرة
كود :
Public Class Form1
   Dim str As String = "provider=microsoft.ace.oledb.12.0;data source=|DataDirectory|\db.accdb"
   Dim con As New OleDb.OleDbConnection(str)
   Dim dt As DataTable
   Dim da As OleDb.OleDbDataAdapter
   Dim cmd As OleDb.OleDbCommandBuilder

   Private Function gid() As Integer
       Try
           Dim cm As New OleDb.OleDbCommand("select Last(tid) from tb", con)
           If con.State = ConnectionState.Closed Then con.Open()
           Return cm.ExecuteScalar
       Catch ex As Exception
           Return Nothing
       End Try
   End Function

   Private Sub gd()
       ListBox1.DataSource = Nothing
       dt = New DataTable
       da = New OleDb.OleDbDataAdapter("select * from tb", con)
       cmd = New OleDb.OleDbCommandBuilder(da)
       da.Fill(dt)
       ListBox1.DataSource = dt
       ListBox1.DisplayMember = "tid"
   End Sub
   Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
       gd()
   End Sub

   Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
       Dim row As DataRow = dt.NewRow
       row(0) = gid() + 1
       dt.Rows.Add(row)
       da.Update(dt)
       gd()
       ListBox1.SelectedIndex = ListBox1.Items.Count - 1
   End Sub

   Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
       If ListBox1.SelectedIndex < 0 Then MsgBox("اختر الرقم المراد حذفه من القائمة", MsgBoxStyle.Critical, "") : Return

       dt.Rows(ListBox1.SelectedIndex).Delete()
       da.Update(dt)
       gd()
   End Sub

   Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
       ListBox1.DataSource = Nothing

       For r As Integer = 0 To dt.Rows.Count - 1
           Dim row As DataRow = dt.Rows(r)
           row.BeginEdit()
           row(0) = r
           row.EndEdit()
           da.Update(dt)
       Next
       gd()
   End Sub
End Class


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

الدالة بالكود لم استخدمها مع اني كتبتها 
كود :
Private Function gid() As Integer
       Try
           Dim cm As New OleDb.OleDbCommand("select Last(tid) from tb", con)
           If con.State = ConnectionState.Closed Then con.Open()
           Return cm.ExecuteScalar
       Catch ex As Exception
           Return Nothing
       End Try
   End Function

هذا ما كنت أفكر فيه بالفعل ( اضافة عمود ليس ترقيم تلقائي ) 
جزاك الله خيرا أخي الكريم / سعود
أسأل الله العظيم أن يجزيك خيرا في الدنيا والآخرة
(09-09-17, 04:26 AM)سعود كتب : [ -> ]لقد جربت فكرة طرات في بالي وهي اضافة عمود ليس ترقيم تلقائي وهذه الفكرة
كود :
Public Class Form1
   Dim str As String = "provider=microsoft.ace.oledb.12.0;data source=|DataDirectory|\db.accdb"
   Dim con As New OleDb.OleDbConnection(str)
   Dim dt As DataTable
   Dim da As OleDb.OleDbDataAdapter
   Dim cmd As OleDb.OleDbCommandBuilder

   Private Function gid() As Integer
       Try
           Dim cm As New OleDb.OleDbCommand("select Last(tid) from tb", con)
           If con.State = ConnectionState.Closed Then con.Open()
           Return cm.ExecuteScalar
       Catch ex As Exception
           Return Nothing
       End Try
   End Function

   Private Sub gd()
       ListBox1.DataSource = Nothing
       dt = New DataTable
       da = New OleDb.OleDbDataAdapter("select * from tb", con)
       cmd = New OleDb.OleDbCommandBuilder(da)
       da.Fill(dt)
       ListBox1.DataSource = dt
       ListBox1.DisplayMember = "tid"
   End Sub
   Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
       gd()
   End Sub

   Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
       Dim row As DataRow = dt.NewRow
       row(0) = gid() + 1
       dt.Rows.Add(row)
       da.Update(dt)
       gd()
       ListBox1.SelectedIndex = ListBox1.Items.Count - 1
   End Sub

   Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
       If ListBox1.SelectedIndex < 0 Then MsgBox("اختر الرقم المراد حذفه من القائمة", MsgBoxStyle.Critical, "") : Return

       dt.Rows(ListBox1.SelectedIndex).Delete()
       da.Update(dt)
       gd()
   End Sub

   Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
       ListBox1.DataSource = Nothing

       For r As Integer = 0 To dt.Rows.Count - 1
           Dim row As DataRow = dt.Rows(r)
           row.BeginEdit()
           row(0) = r
           row.EndEdit()
           da.Update(dt)
       Next
       gd()
   End Sub
End Class


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

الدالة بالكود لم استخدمها مع اني كتبتها 
كود :
Private Function gid() As Integer
       Try
           Dim cm As New OleDb.OleDbCommand("select Last(tid) from tb", con)
           If con.State = ConnectionState.Closed Then con.Open()
           Return cm.ExecuteScalar
       Catch ex As Exception
           Return Nothing
       End Try
   End Function
أخي الكريم / سعود
مع الاسف الكود لم يعمل معي الفارق الوحيد بيني وبينك ان قاعدة البيانات دي Sql server 2008

كود :
       Try
           Dt = New DataTable
           SQL = "select * from Tab_Users"
           Da = New SqlDataAdapter(SQL, Con)
           Da.Fill(Dt)

           Lst_Users.DataSource = Nothing

           For n As Integer = 0 To Dt.Rows.Count - 1

               Dim rr As DataRow = Dt.Rows(n)

               rr.BeginEdit()
               rr(1) = n + 1
               rr.EndEdit()
           Next
           Da.Update(Dt)

           fill_lstbox()

       Catch ex As Exception
           MsgBox(ex.Message)
       End Try
مع اني انشأت حقل اخر للتسلسل بدون مفتاح أساسي .

فهل ممكن نحل المشكلة بعمل دالة ترجع اكبر قيمة في حقل المسلسل ولما نضيف عنصر جديد نضيف القيمة دي + 1
انا عملت لهذه الطريقة كل الاحتمالات وكلها صحيحة بدون مشاكل ؟

بس مش عارف طريقة احضار اكبر قيمة في الحقل بالكود كيف ؟
كود :
  Sub CL()
       Dim GetCode As String = "0"
       CMD = New SqlCommand()
       CMD.Connection = con
       CMD.CommandText = "SELECT TOP(1) * FROM أسم الجدول ORDER BY أسم العمود DESC"
       Try
           con.Open()
           Dim reader As SqlDataReader = CMD.ExecuteReader(CommandBehavior.SingleRow)
           If (reader.HasRows = True) Then
               While reader.Read()
                   GetCode = (reader.GetString(reader.GetOrdinal("أسم العمود")))
               End While
           End If
           reader.Close()
       Catch ex As System.Exception
           MsgBox(ex.Message)
       Finally
           con.Close()
       End Try

       If (GetCode = "0") Then
           ' إذا حاب تظيف لرقم تصنيف
           txt_Num_Recorde.Text = "C00001"

       ElseIf (GetCode <> "0") Then
           Dim TotalCodeWithoutLable As String = GetCode.Count - 1
           Dim OldNum As String = GetCode.Substring(GetCode.Length - TotalCodeWithoutLable)
           txt_Num_Recorde.Text = "C" + Format(OldNum + 1, "00000").ToString

       End If
   End Sub
إقتباس :بس مش عارف طريقة احضار اكبر قيمة في الحقل بالكود كيف ؟
هل هذه فقط هي النقطة التي لم تعمل؟

استبدل Last بـ Max بالاستعلام ويمشي ان شالله

كود :
Private Function gid() As Integer
       ' Try
       Dim cm As New SqlClient.SqlCommand("select Max(tid) from tb", con)
       If con.State = ConnectionState.Closed Then con.Open()
       Return cm.ExecuteScalar
       '  Catch ex As Exception
       'Return Nothing
       ' End Try
   End Function

بالنسبة للدالة الحصول على اعلى رقم اذا كان فارغ يظهر خطا لكن لو نجعل الدالة فيها Try وعند الكاتش نعيد Nothng فان الرقم المعاد يكون 0 وهنا اختصار عن كتابة كود كشف عدد السجلات.

الكلاس بعد التعديل
كود :
Public Class Form1
   Dim str As String = "server=(Local)\sqlexpress;Initial Catalog=ForTesting;Integrated Security=True"
   Dim con As New SqlClient.SqlConnection(str)
   Dim dt As DataTable
   Dim da As SqlClient.SqlDataAdapter
   Dim cmd As SqlClient.SqlCommandBuilder

   Private Function gid() As Integer
       Try
           Dim cm As New SqlClient.SqlCommand("select Max(tid) from tb", con)
           If con.State = ConnectionState.Closed Then con.Open()
           Return cm.ExecuteScalar
       Catch ex As Exception
           Return Nothing
       End Try
   End Function

   Private Sub gd()
       ListBox1.DataSource = Nothing
       dt = New DataTable
       da = New SqlClient.SqlDataAdapter("select * from tb", con)
       cmd = New SqlClient.SqlCommandBuilder(da)
       da.Fill(dt)
       ListBox1.DataSource = dt
       ListBox1.DisplayMember = "tid"
   End Sub
   Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
       gd()
   End Sub

   Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
       Dim row As DataRow = dt.NewRow
       row(0) = gid() + 1
       dt.Rows.Add(row)
       da.Update(dt)
       gd()
       ListBox1.SelectedIndex = ListBox1.Items.Count - 1
   End Sub

   Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
       If ListBox1.SelectedIndex < 0 Then MsgBox("اختر الرقم المراد حذفه من القائمة", MsgBoxStyle.Critical, "") : Return

       dt.Rows(ListBox1.SelectedIndex).Delete()
       da.Update(dt)
       gd()
   End Sub

   Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
       ListBox1.DataSource = Nothing

       For r As Integer = 0 To dt.Rows.Count - 1
           Dim row As DataRow = dt.Rows(r)
           row.BeginEdit()
           row(0) = r
           row.EndEdit()
           da.Update(dt)
       Next
       gd()
   End Sub

 
End Class
جزاك الله خيرا أخي الكريم / طلال

= = = = = = = = = = = = =
جزاك الله خيرا أخي الكريم / سعود
الصفحات : 1 2