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

نسخة كاملة : حذف الاسطرالمكررة في جدول
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2
(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 مع رقم الصف 
اتمني ان اكون وضحت 
وصح فطورك اخي الجزائري رابح   Smile
تعقيب صغير اخي بعد ان  ظهر لي ان الاشكال قد حل في الاول تبين مشكل اخر وهو اني في الاول طبقت على المثال المرفق لقاعدة البيانات لكن عند التجريب على قاعدة البيانات الاصلية و التي يمكن ان تصل الى 000 300 سطر بعد الضغط على زر حذف المكرر لم يظهر اي شئ واعتقد ان البرنامج يكون قد بدا في المعالجة لكن لحجم قاعدة البيانات الكبير ياخذ وقد انتظرت حوالي 5 د ولم يحدث اي تغيير
(04-06-17, 06:14 PM)rabeh.ram كتب : [ -> ]تعقيب صغير اخي بعد ان  ظهر لي ان الاشكال قد حل في الاول تبين مشكل اخر وهو اني في الاول طبقت على المثال المرفق لقاعدة البيانات لكن عند التجريب على قاعدة البيانات الاصلية و التي يمكن ان تصل الى 000 300 سطر بعد الضغط على زر حذف المكرر لم يظهر اي شئ واعتقد ان البرنامج يكون قد بدا في المعالجة لكن لحجم قاعدة البيانات الكبير ياخذ وقد انتظرت حوالي 5 د ولم يحدث اي تغيير
بالطبع الموضوع هنا يعتمد على امكانيات وسرعة الحاسوب  300 الف شيئ كبير ولاكن لا غني عن الاستعلام واسهل وابسط استعلام لتلافى المكرر هو عن طريق المجموعات كما فعلت فى المثال  وذلك لا يعني الحل الوحيد نتمني الافادة من الزملاء وسوف ابحث معك عن حل ولاكن دائما اجعل لديك نسخة من قاعدة بياناتك محفوظة احتياطيا
شكرا لك اخي محمود انت و الاخ alma2 على اهتمامكما الدائم بحل مشاكل اعضاء المنتدى

فعلا لايمكن لكما او لاي عضو اراد ان يساعد في حل الاشكال اعطاء الحل الدقيق للمشكل دزن ان يطلع على قاعدة البيانات الاصلية 

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



البرنامج مع قاعدة البيانات الاصلية مرفق واعذروني لم افع القاعدة في الاول لكوني فكرت ان مجرد مثال عنها يكفي


 
اما بخصوص حلك اخي alma2  والذي يعتمد على ادراج مفتاح للجدول و من ثم حذفه فلا اشكال في ذالك اخي المهم ان ترجع قاعدة البيانات بعد حذف المكرر الى شكلها الاول بنهاية عملية الحذف و بامتدادها  Access2003 .mdb 

ملاحظة نظرا لحجم البرنامج مع قاعدة البيانات 48Mo و الذي لم يقبل الرفع على المنتدى رفعته على الرابط من هنا
قمت بتجربة طريقتي بالاعتماد على تكرار العمود [الموضع (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
هل استغرق البرنامج هذه المدة رغم تخصيص التاريخ وهل تعتقد انه لاتوجد طريقة اخرى اسرع نظرا لحجم القاعدة
على العموم مجهودك يذكر ويشكر وانا انتظر افكار جديدة  منك جعل المعالجة في وقت اقل
الصفحات : 1 2