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

نسخة كاملة : الفلترة داخل ال DataSet
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم ورحمة الله وبركاته ،
إن باستعمال أوامر ال Sql  وباستعمال ااشرط LIKE ، نسنتطيع تحديد السجلات التي تخضع لهذا الشرط.
لكن هذا يعني أننا في كل مرة نقوم بالاتصال بالخادم لإجراء هذا الأمر ، وربما كان الخادم (Server)  ثقيل نوعا ما ، أو أن الطلبات عليه متزايدة .
وفي الحقيقة هذا المشكل أرقني خاصة إذا كان الإجراء ال Sql  معقد نوعا ما و يلزم الوقت لتطبيقه.
بحثت عن الفكرة لزمن طويل و طرحت المشكلة حتى في منتدنا هذا لكن لم أجد إجابة شافية.
كان الحل الأول هو استعمال CliuentDataSet أو أي مكون آخر InMemoryTable.
لكن بعد البحث الطويل Big Grin   وجدت أحدهم في أحد المنتديات الأجنبية طرح فكرة رائعة للبحث داخل ال DataSet  ، يمكن تطبيقها على أي نوع من الDataSet  سواء table , Query ....
للأمانة العلمية أنقل لكم الحل كما وجدته :

كود :
// this method returns true if matching record found, else it returns false function TForm1.Search(const AStr: string; ADataset: TDataset): Boolean; var  i: Integer; begin  Result := False;  if ADataset.IsEmpty then Exit;  ADataset.DisableControls;  try    ADataset.First;    while not ADataset.Eof do    begin      for i := 0 to ADataset.FieldCount-1 do        if not ADataset.Fields[i].IsBlob then        begin          Result := Pos(AStr, ADataset.Fields[i].AsString) > 0;          if Result then            Exit;        end;      ADataset.Next;    end;  finally    ADataset.EnableControls;  end; end;

**************************************


كود :
// this method returns true if matching record found, else it returns false function TForm1.Search(const AStr, AField: string;  ADataset: TDataset): Boolean; var  vField: TField; begin  Result := False;  if ADataset.IsEmpty then Exit;  vField := ADataset.FieldByName(AField);  if (vField=nil) or vField.IsBlob then Exit;  ADataset.DisableControls;  try    ADataset.First;    while not ADataset.Eof do    begin      Result := Pos(AStr, vField.AsString) > 0;      if Result then        Exit;      ADataset.Next;    end;  finally    ADataset.EnableControls;  end; end;

***********************************************

كود :
 TForm1 = class(TForm)    ...    ...    function Search(const AStr: string; ADataset: TDataset): Boolean; overload;    function Search(const AStr, AField: string; ADataset: TDataset): Boolean; overload;    ...    ...  end;

و هناك مثال كامل في المرفقات (طبعا هو لصاحب الفكرة.)
استفدت من هذا الحل فنقلته لكم هنا للاستفادة. Cool 
بالتوفيق.