(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")
ابسط طريقة بحسب ما ارى ان تقم بعمل عمود الرقم (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
هكذا تحل مشكلتك صديقي
09-09-17, 03:33 AM (آخر تعديل لهذه المشاركة : 09-09-17, 03:51 AM {2} بواسطة Abdelazez.Ahmad.)
جزاك الله خيرا أخي الكريم ( [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 وبذلك لا يحدث خطا عند اضافة عنصر جديد
09-09-17, 04:26 AM (آخر تعديل لهذه المشاركة : 09-09-17, 04:29 AM {2} بواسطة سعود.)
لقد جربت فكرة طرات في بالي وهي اضافة عمود ليس ترقيم تلقائي وهذه الفكرة
كود :
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
10-09-17, 08:10 AM (آخر تعديل لهذه المشاركة : 10-09-17, 08:31 AM {2} بواسطة سعود.)
إقتباس :بس مش عارف طريقة احضار اكبر قيمة في الحقل بالكود كيف ؟
هل هذه فقط هي النقطة التي لم تعمل؟ استبدل 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