(04-06-17, 01:34 AM)rabeh.ram كتب : [ -> ]رغم اني ساحتاج بعض الوقت لفهم الكود الحل كان في الصميم شكرا لمجهودك الرائع كما ارجو ان تضع لنا شرح مصور للاكواد الموجودة و هذا عندما تكون متفرغ
اخي الغالي رابح هذا الحل لم يعجبنى كثيرا ولاكن هو المتاح فى مخيلتي وهو مكون من 3 اجزاء
1- التعامل مع قاعدة البيانات من خلال دالة لجلب البيانات واجراء للعمليات على القاعدة وهو دائما اسلوب اتبعه عند تصميم طبقة (كلاس )للاتصال اسميه دائما data access lyear
2- لقد استفدت من خاصية group by التجميع حسب حقول معينة فى عمل تجميع للسطور حسب الحقول جميعها وذلك لان التكرار هنا شامل الصف كله فان التجميع حسب كل الحقول سوف ياتى لنا بسطر واحد من كل تكرار
3- قد وضعت هذا الاستعلام فى الوضع المنفصل داخل datatable جدول مؤقت (بمعني لدى فى الذاكرة جدول به المطلوب (صفوف غير مكررة) من خلال الادبتر
4- حذفت جميع البيانات من الجدول الاصلى من خلال الاجراء senddata وجملة الاستعلام delete * from -- اخى وهذه النقطة التى تجعلنى غير راضي عن الحل
فهى تعرض البيانات فى خطر اذا انقطع التيار (كنت اتمني ان اعمل تحديث للجدول من الداتا تيبل datatable ولكنه لم ينفع معي )
فلم يكن امامي غير ان احذف الجدول لتجهيزه للبيانات بعد المعالجة
5- عملت تكرار بعدد صفوف الداتا تيبل datatable ياخد سطر سطر منها ويضيفه فى الجدول وكل ده من خلال الاجراء senddata مع رقم الصف
اتمني ان اكون وضحت
وصح فطورك اخي الجزائري رابح

تعقيب صغير اخي بعد ان ظهر لي ان الاشكال قد حل في الاول تبين مشكل اخر وهو اني في الاول طبقت على المثال المرفق لقاعدة البيانات لكن عند التجريب على قاعدة البيانات الاصلية و التي يمكن ان تصل الى 000 300 سطر بعد الضغط على زر حذف المكرر لم يظهر اي شئ واعتقد ان البرنامج يكون قد بدا في المعالجة لكن لحجم قاعدة البيانات الكبير ياخذ وقد انتظرت حوالي 5 د ولم يحدث اي تغيير
(04-06-17, 06:14 PM)rabeh.ram كتب : [ -> ]تعقيب صغير اخي بعد ان ظهر لي ان الاشكال قد حل في الاول تبين مشكل اخر وهو اني في الاول طبقت على المثال المرفق لقاعدة البيانات لكن عند التجريب على قاعدة البيانات الاصلية و التي يمكن ان تصل الى 000 300 سطر بعد الضغط على زر حذف المكرر لم يظهر اي شئ واعتقد ان البرنامج يكون قد بدا في المعالجة لكن لحجم قاعدة البيانات الكبير ياخذ وقد انتظرت حوالي 5 د ولم يحدث اي تغيير
بالطبع الموضوع هنا يعتمد على امكانيات وسرعة الحاسوب 300 الف شيئ كبير ولاكن لا غني عن الاستعلام واسهل وابسط استعلام لتلافى المكرر هو عن طريق المجموعات كما فعلت فى المثال وذلك لا يعني الحل الوحيد نتمني الافادة من الزملاء وسوف ابحث معك عن حل ولاكن دائما اجعل لديك نسخة من قاعدة بياناتك محفوظة احتياطيا
قمت بتجربة طريقتي بالاعتماد على تكرار العمود [الموضع (text)] للعدد (60277)
فكانت المدة 00:57:01 (تقريبا ساعة كاملة) أعتقد مدة طويلة غير مناسبة
ولكنها حذفت المكرر في النهاية فأصبحت العدد (59661)
كود :
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Me.Cursor = Cursors.WaitCursor
''''''''''''''''''''هنا يكتب كود السلكت والحذف للمكرر ''''''''''''''''''''''''''
Dim c As Integer = 0
If con.State <> ConnectionState.Open Then con.Open()
Dim cmd As New OleDbCommand(String.Empty, con)
'------------------------------------------------------------------
'التأكد من وجود مكرر
'cmd.CommandText = "SELECT COUNT(c) FROM (SELECT COUNT([alpha]) AS c FROM [Table1] GROUP BY [alpha] HAVING COUNT([alpha]) > 1) "
cmd.CommandText = "SELECT COUNT(c) FROM (SELECT COUNT([الموضع (text)]) AS c FROM [Table1] GROUP BY [الموضع (text)] HAVING COUNT([الموضع (text)]) > 1) "
c = cmd.ExecuteScalar
If c > 0 Then
Dim msg As String =
"يوجد (" & c & ") بيانات لها أسطر مكررة" & vbNewLine & vbNewLine & _
"هل تود حذف الأسطر المكررة لهذه البيانات؟"
If MsgBox(msg, MsgBoxStyle.MsgBoxRight + MsgBoxStyle.MsgBoxRtlReading + MsgBoxStyle.YesNo + MsgBoxStyle.Exclamation, "حذف الأسطر المكررة للبيانات") = MsgBoxResult.Yes Then
'------------------------------------------------------------------
Try
'إضافة عمود ترقيم تلقائي
cmd.CommandText = "ALTER TABLE [Table1] ADD [id] INT IDENTITY(1,1)"
cmd.ExecuteNonQuery()
Catch ex As OleDbException
End Try
'------------------------------------------------------------------
'حذف المكرر
cmd.CommandText = "DELETE FROM [Table1] WHERE [ID] NOT IN (SELECT MIN(ID) FROM [Table1] GROUP BY [الموضع (text)]);"
cmd.ExecuteNonQuery()
'------------------------------------------------------------------
Try
'حذف عمود الترقيم التلقائي
cmd.CommandText = "ALTER TABLE [Table1] ADD [id] INT IDENTITY(1,1)"
cmd.ExecuteNonQuery()
Catch ex As OleDbException
End Try
'------------------------------------------------------------------
MsgBox("تم حذف (" & c & ") أسطر بنجاح")
Else
MsgBox("تم الغاء الحذف ")
End If
Else
MsgBox("لا توجد بيانات مكررة")
End If
con.Close()
Me.Cursor = Cursors.Default
End Sub
شكرا لمجهودك الرائع اخي
alma2
هل استغرق البرنامج هذه المدة رغم تخصيص التاريخ وهل تعتقد انه لاتوجد طريقة اخرى اسرع نظرا لحجم القاعدة
على العموم مجهودك يذكر ويشكر وانا انتظر افكار جديدة منك جعل المعالجة في وقت اقل