delphi4arab منتديات دلفي للعرب

نسخة كاملة : فلترة المعطيات في Dbgrid باستعمال الحدث OnChange لل Edit
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم ورحمة  الله وبركاته ،
في قاعدة بيانات من نوع 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 ...
هل من فكرة أخرى؟
جزاكم الله خيرا.
الفهرسة تساعد في زيادة السرعة اظن

انا استعمل هذا في 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
جزاك الله خيرا ،
لكن على ما أظن أن استعمال ال فلتر أثقل من ال Sql.
لم اقل انه اسرع قلت اظن اني سؤواجه مشاكل لاحقا

هل رأيت الرابط اللذي وضعته ؟
هذا الكود استعمله في قاعدة بيانات من نوع
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;

***********
السلام عليكم
انا عندى ملاحظة ربما لا تساوى شئ
لكن حبيت لو تجربها
وهى كيفية اضافة الاستعلام الى المكون
لماذا تستخدم Add ولا تستخدم
كود :
SQL.Text := '';
استخدم الاستعلام كله فى سطر واحد فان عملية اضافة الاستعلام تاخذ وقت حتى ولو كان قليل جدا فهى تاخذ وقت
هذا مبدئيا
ناهيك عن عدم استخدام select top 100
كالاتى مثلا
كود :
select top 100 * from items

--
هذه مجرد تساؤلات ارجوا ان يتسع صدرك للاجابة عنها وشكرا