فلترة المعطيات في Dbgrid باستعمال الحدث OnChange لل Edit
#1
السلام عليكم ورحمة  الله وبركاته ،
في قاعدة بيانات من نوع Interbase ن لدي جدول به قائمة المنتجات تفوق 10000 (عشرة آلاف منتج) مرشحة للزيادة.
ولإعطاء الزبون  إمكانية البحث عن المنتج  إنطلاقا من اسم المنتج .
قمت بعرض قائمة المنتجات في Dbgrid  موصولة ب Ibquery .
الزبون يقوم بإدخال اسم المنتج المراد البحث عنه في مكون  Edit ، و الحدث OnChange لهذا الأخير أقوم بتصفية الأسماء للحصول على اسم المنتج المراد.
وهذا هو الإجراء  الذي أقوم به:

كود :
procedure TFMaForm.Edit1Change(Sender: TObject); begin       IF (edit1.text <> '')  then       begin             MaQuery.close;             MaQuery.SQL.Clear;             MaQuery.SQL.Add('SELECT    CodeArt, Designation,QteStk');             MaQuery.SQL.Add('FROM  MesArticles');             MaQuery.SQL.Add('WHERE UPPER(Designation) LIKE  ''%' + UpperCase(edit1.Text) + '%''');             MaQuery.SQL.Add('ORDER BY CodeArt');             MaQuery.Active := true;       else       begin             MaQuery.close;             MaQuery.SQL.Clear;             MaQuery.SQL.Add('SELECT    CodeArt, Designation,QteStk');             MaQuery.SQL.Add('FROM  MesArticles');             MaQuery.SQL.Add('ORDER BY CodeArt');             MaQuery.Active := true;         end ;   end;






لكن يبقى هذا الإجراء ثقيل نوعا ما ، وخاصة أن عدد المنتجات في تزايد. Sad 
تخيل لو أن الزبون قام بإدخال عشرين حرفا ، فعند كل حرف نقوم بهذا الإجراء.
ربما يقول القائل و لماذا لا تقوم بالبحث حتى يوم الزبون بإدخال اسم المنتج كاملا ؟
فأقول من خلال التجربة ،  فعلا قد ينسى الزبون الاسم الكامل للمنتج .
فكرت في استعمال ClientDataSet  و أي مكون آخر من نوع InMemory ...
هل من فكرة أخرى؟
جزاكم الله خيرا.
اللهم اجعلني من أهل القرآن ، الذين هم أهلك و خاصتك.
تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.
الرد
#2
الفهرسة تساعد في زيادة السرعة اظن

انا استعمل هذا في c++ builder و فاير بيرد لااعلم ان كنت سؤواجه نفس المشكلة 
كود :
if (Edit1->Text != "") {   if (ComboBox1->Text == "Désignation") { MachADOTbl->Filtered = True; MachADOTbl->Filter = "MACHDESIG LIKE "+ QuotedStr(Trim(Edit1->Text)+"%") ; } else if (ComboBox1->Text == "ID") { MachADOTbl->Filtered = True; MachADOTbl->Filter = "IDMACH LIKE "+ QuotedStr(Trim(Edit1->Text)+"%") ; } } else MachADOTbl->Filtered = False;

http://stackoverflow.com/questions/23468...ing-delphi
[-] كل من 1 user says قال شكرا ل Imad Ch على المشاركة المفيدة
  • أبو معاذ
الرد
#3
جزاك الله خيرا ،
لكن على ما أظن أن استعمال ال فلتر أثقل من ال Sql.
اللهم اجعلني من أهل القرآن ، الذين هم أهلك و خاصتك.
تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.
الرد
#4
لم اقل انه اسرع قلت اظن اني سؤواجه مشاكل لاحقا

هل رأيت الرابط اللذي وضعته ؟
الرد
#5
هذا الكود استعمله في قاعدة بيانات من نوع
abs
ربما يفيدك
*********
كود :
procedure TForm1.Edit44Change(Sender: TObject); begin Edit44.Text:=TrimLeft(Edit44.Text) ; if Edit44.Text<>'' then begin ABSTable1.IndexFieldNames:='Code_Produits'   ; ABSTable1.MasterFields:=''; ABSTable1.close; ABSTable1.Filtered:=true ; ABSTable1.Filter:='[Designation]='+#39+Edit44.Text+'*'+#39 ; ABSTable1.Active:=true; BladGrid7.Height:=400; end else begin ABSTable1.close; ABSTable1.Filtered:=false ; ABSTable1.Active:=true; BladGrid7.Height:=40; end; end;
***********

(29-05-2016, 06:25 PM)ramiparadox كتب : هذا الكود استعمله في قاعدة بيانات من نوع
abs
ربما يفيدك
*********

كود :
procedure TForm1.Edit1Change(Sender: TObject); begin Edit1.Text:=TrimLeft(Edit1.Text) ; if Edit1.Text<>'' then begin ABSTable1.close; ABSTable1.Filtered:=true ; ABSTable1.Filter:='[Designation]='+#39+Edit1.Text+'*'+#39 ; ABSTable1.Active:=true; end else begin ABSTable1.close; ABSTable1.Filtered:=false ; ABSTable1.Active:=true; end; end;

***********
[-] كل من 2 users say قال شكرا ل ramiparadox على المشاركة المفيدة
  • أبو معاذ, Ramzi2
الرد
#6
السلام عليكم
انا عندى ملاحظة ربما لا تساوى شئ
لكن حبيت لو تجربها
وهى كيفية اضافة الاستعلام الى المكون
لماذا تستخدم Add ولا تستخدم
كود :
SQL.Text := '';
استخدم الاستعلام كله فى سطر واحد فان عملية اضافة الاستعلام تاخذ وقت حتى ولو كان قليل جدا فهى تاخذ وقت
هذا مبدئيا
ناهيك عن عدم استخدام select top 100
كالاتى مثلا
كود :
select top 100 * from items

--
هذه مجرد تساؤلات ارجوا ان يتسع صدرك للاجابة عنها وشكرا
[-] كل من 1 user says قال شكرا ل justnick على المشاركة المفيدة
  • أبو معاذ
الرد


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


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