تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[VB.NET] فلترة الداتاجريد فيو بشرط
#1
السلام عليكم ورحمة الله وبركاتة 


لدي DataGridView مكونة من 4 أعمدة فقط.
العمود الأول هو اسم المنتج
العمود الثاني الخصم 
العمود الثالث هو السعر
العمود الرابع هو اسم الشركة.

تأتي هذه البيانات من تجميع أكثر من ملف Excel. وقمت بهذه الخطوة
مطلوب:
- استخراج أكبر 3 خصومات لكل منتج حيث يتشابه اسم المنتج والسعر مع نفس المنتج والسعر لشركة أخرى.
-إذا كان هناك خصمان فقط ، فسيتم تحديدهما تلقائيًا . إذا كانت هناك خصم واحدة ، يتم اختيارها مباشرة.
وحذف جميع البيانات التي لا تنطبق على الشروط 1-2 بحيث يتبقي فقط بالداتاجريد فيو المطلوب فقط

صورة للبيانات قبل المطلوب

   

صورة للبيانات بعد المطلوب


   
ملف العمل بالمرفقات


الملفات المرفقة
.rar   WindowsApplication3.rar (الحجم : 75.96 ك ب / التحميلات : 11)
الرد }}}
تم الشكر بواسطة:
#2
عن طريق LINQ :
كود :
       DataGridView1.Columns.Clear()

       DataGridView1.DataSource = dt.
           AsEnumerable.
           GroupBy(Function(x) x(0)).
           SelectMany(Function(x) x.OrderBy(Function(y) y(1)).Take(3)).
           Skip(1).
           CopyToDataTable



الكود يعمل تماما 100% ولكن هناك شيء غامض بالنسبة لي ، احتجت لمسح كل الاعمدة من الجريد فيو لكي يعمل الكود ، والا يظهر لي خلايا فارغة 
لا اعلم السبب بصراحة يمكنك البدأ من هنا بطريقتك
الرد }}}
تم الشكر بواسطة: محمد اسماعيل , محمد اسماعيل
#3
(04-09-20, 02:26 AM)Anas Mahmoud كتب : عن طريق LINQ :
كود :
       DataGridView1.Columns.Clear()

       DataGridView1.DataSource = dt.
           AsEnumerable.
           GroupBy(Function(x) x(0)).
           SelectMany(Function(x) x.OrderBy(Function(y) y(1)).Take(3)).
           Skip(1).
           CopyToDataTable



الكود يعمل تماما 100% ولكن هناك شيء غامض بالنسبة لي ، احتجت لمسح كل الاعمدة من الجريد فيو لكي يعمل الكود ، والا يظهر لي خلايا فارغة 
لا اعلم السبب بصراحة يمكنك البدأ من هنا بطريقتك

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


النتيجة المطلوبة 



النتيجة بعد كود حضرتك

   
الرد }}}
تم الشكر بواسطة:
#4
اعتذر اخي الكريم منك ، كل ما مطلوب تغييره هو الدالة OrderByDescending بدلا من OrderBy للترتيب تنازلي بلا من تصاعدي

كود :
       DataGridView1.Columns.Clear()

       DataGridView1.DataSource = dt.
           AsEnumerable.
           Skip(1).
           GroupBy(Function(x) x(0)).
           SelectMany(Function(x) x.OrderByDescending(Function(y) y(1)).Take(3)).
           CopyToDataTable

جربتها وعملت كما تريد 

وشرحها بسيط :

AsEnumerable : لتحويل الداتا تابل الى قابل للعد ( List مثلا ) لنتمكن من استخدام Linq عليها

Skip(1) : تخطي اول عنصر ، فيه اسماء الاعمدة من اكسيل

GroupBy(Function(x) x(0)) : تجميع العناصر الى مجموعات حسب اول عمود ( اسم الصنف ) ، يستخدم اجراء لمدا لاعادة عناصر العمود الاول

SelectMany : نخبر Linq ان يفعل ما نريد بكل مجموعة ومن ثم يقوم بتجميع الناتج في List واحدة ، وما نقوم بفعله هو :
    OrderByDescending(Function(y) y(1)) : ترتيب عناصر كل مجموعة تنازليا حسب عناصر العمود الثاني 
    Take(3) اخذ اول 3 عناصر او اقل من كل مجموعة

CopyToDataTable : يحفظ الناتج الى داتا تيبل جديد 

   

انصحك بالتعمق في LINQ فهيا الحل في معظم الامور اذا كنت تتعامل مع البيانات كثيرا ، مايتطلب الكثير من الاسطر لعمله يكفي سطر واحد من هذه التقنيه لفعل نفس الشيء
الرد }}}
تم الشكر بواسطة: محمد اسماعيل
#5
(04-09-20, 10:41 PM)Anas Mahmoud كتب : اعتذر اخي الكريم منك ، كل ما مطلوب تغييره هو الدالة OrderByDescending بدلا من OrderBy للترتيب تنازلي بلا من تصاعدي

كود :
       DataGridView1.Columns.Clear()

       DataGridView1.DataSource = dt.
           AsEnumerable.
           Skip(1).
           GroupBy(Function(x) x(0)).
           SelectMany(Function(x) x.OrderByDescending(Function(y) y(1)).Take(3)).
           CopyToDataTable

جربتها وعملت كما تريد 

وشرحها بسيط :

AsEnumerable : لتحويل الداتا تابل الى قابل للعد ( List مثلا ) لنتمكن من استخدام Linq عليها

Skip(1) : تخطي اول عنصر ، فيه اسماء الاعمدة من اكسيل

GroupBy(Function(x) x(0)) : تجميع العناصر الى مجموعات حسب اول عمود ( اسم الصنف ) ، يستخدم اجراء لمدا لاعادة عناصر العمود الاول

SelectMany : نخبر Linq ان يفعل ما نريد بكل مجموعة ومن ثم يقوم بتجميع الناتج في List واحدة ، وما نقوم بفعله هو :
    OrderByDescending(Function(y) y(1)) : ترتيب عناصر كل مجموعة تنازليا حسب عناصر العمود الثاني 
    Take(3) اخذ اول 3 عناصر او اقل من كل مجموعة

CopyToDataTable : يحفظ الناتج الى داتا تيبل جديد 



انصحك بالتعمق في LINQ فهيا الحل في معظم الامور اذا كنت تتعامل مع البيانات كثيرا ، مايتطلب الكثير من الاسطر لعمله يكفي سطر واحد من هذه التقنيه لفعل نفس الشيء

الف شكر علي سرعة الرد استاذ انس والشرح 

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

     
الرد }}}
تم الشكر بواسطة:
#6
الشروط غير واضحة

بالمنطق الأخير أن السطر قبل الأخير يجب عدم ظهوره PRODC 20

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

هل عدم تكرار F1+F2 هو المطلوب أم ماذا؟
الرد }}}
تم الشكر بواسطة: محمد اسماعيل
#7
كود :
       DataGridView1.DataSource = dt.
           AsEnumerable.
           Skip(1).
           GroupBy(Function(x) x(0)).
           SelectMany(Function(x) x.
           OrderByDescending(Function(y) CDbl(y(2))).
           ThenByDescending(Function(z) CDbl(z(1))).
           Take(3)).
           CopyToDataTable
الرد }}}
تم الشكر بواسطة: محمد اسماعيل
#8
(05-09-20, 11:03 AM)Anas Mahmoud كتب :
كود :
       DataGridView1.DataSource = dt.
           AsEnumerable.
           Skip(1).
           GroupBy(Function(x) x(0)).
           SelectMany(Function(x) x.
           OrderByDescending(Function(y) CDbl(y(2))).
           ThenByDescending(Function(z) CDbl(z(1))).
           Take(3)).
           CopyToDataTable

جزاك الله خيرا عما قدمت

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


كود :
      DataGridView1.Rows.Clear()
       DataGridView1.Columns.Clear()
       DataGridView1.DataSource = dt.
         AsEnumerable.
         Skip(1).
         GroupBy(Function(x) x(0)).
         SelectMany(Function(x) x.
         OrderByDescending(Function(y) CDbl(y(2))).
         ThenByDescending(Function(z) CDbl(z(1))).
         Take(3)).
         CopyToDataTable
       DataGridView1.Columns(0).Width = 70
       DataGridView1.Columns(1).Width = 120
       DataGridView1.Columns(2).Width = 220
       DataGridView1.Columns(3).Width = 160


       DataGridView1.Columns(0).HeaderText = "الصنف"
       DataGridView1.Columns(1).HeaderText = "الخصم"
       DataGridView1.Columns(2).HeaderText = "السعر"
       DataGridView1.Columns(3).HeaderText = "اسم الشركة"
الرد }}}
تم الشكر بواسطة: Anas Mahmoud


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  فلترة datagridview بدون قاعدة بيانات صالح عبدالله 3 295 02-02-24, 04:07 PM
آخر رد: صالح عبدالله
  طريقة جلب صف من قاعدة البيانات بشرط العمود ٤ لا يساوي فارغ Adel27213 2 423 07-11-23, 05:02 AM
آخر رد: Adel27213
  حذف هذه العلامة " " من الداتاجريد mohameed2015 3 546 03-04-23, 06:01 AM
آخر رد: سعود
  رسالة Out Of Range مع الداتاجريد ADAM12 1 413 11-02-23, 03:53 AM
آخر رد: Taha Okla
  الرجاء الدخول والمساعدة في كود فرز بشرط alijtb82 0 275 05-12-22, 01:29 AM
آخر رد: alijtb82
  نشر أيام الشهر داخل الداتاجريد فيو محمد خيري 9 1,247 06-11-22, 03:38 AM
آخر رد: محمد خيري
  فلترة بيانات AdvancedDataGridView مصمم هاوي 5 909 31-10-22, 05:14 PM
آخر رد: عبدالله الدوسري
  [سؤال] جمع عمود في داتا غريد فيو بشرط موجود في عمود اخر عمار جديع الصوفي 0 572 23-10-22, 05:10 AM
آخر رد: عمار جديع الصوفي
  ضرب أعمدة معينة في صف فى الداتاجريد فيو مع أعمدة في الصف اللى قبلها alessam4pro 3 909 19-06-22, 12:05 PM
آخر رد: alessam4pro
  [VB.NET] مشكلة فى فلترة الداتا جريد فيو ارجو المساعدة فى حلها نبيل فتحى 3 1,330 10-02-22, 10:14 AM
آخر رد: نبيل فتحى

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


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