29-07-2016, 10:27 AM
السلام عليكم ورحمة الله وبركاته ،
إن باستعمال أوامر ال Sql وباستعمال ااشرط LIKE ، نسنتطيع تحديد السجلات التي تخضع لهذا الشرط.
لكن هذا يعني أننا في كل مرة نقوم بالاتصال بالخادم لإجراء هذا الأمر ، وربما كان الخادم (Server) ثقيل نوعا ما ، أو أن الطلبات عليه متزايدة .
وفي الحقيقة هذا المشكل أرقني خاصة إذا كان الإجراء ال Sql معقد نوعا ما و يلزم الوقت لتطبيقه.
بحثت عن الفكرة لزمن طويل و طرحت المشكلة حتى في منتدنا هذا لكن لم أجد إجابة شافية.
كان الحل الأول هو استعمال CliuentDataSet أو أي مكون آخر InMemoryTable.
لكن بعد البحث الطويل
وجدت أحدهم في أحد المنتديات الأجنبية طرح فكرة رائعة للبحث داخل ال DataSet ، يمكن تطبيقها على أي نوع من الDataSet سواء table , Query ....
للأمانة العلمية أنقل لكم الحل كما وجدته :
**************************************
***********************************************
و هناك مثال كامل في المرفقات (طبعا هو لصاحب الفكرة.)
استفدت من هذا الحل فنقلته لكم هنا للاستفادة.
بالتوفيق.
إن باستعمال أوامر ال Sql وباستعمال ااشرط LIKE ، نسنتطيع تحديد السجلات التي تخضع لهذا الشرط.
لكن هذا يعني أننا في كل مرة نقوم بالاتصال بالخادم لإجراء هذا الأمر ، وربما كان الخادم (Server) ثقيل نوعا ما ، أو أن الطلبات عليه متزايدة .
وفي الحقيقة هذا المشكل أرقني خاصة إذا كان الإجراء ال Sql معقد نوعا ما و يلزم الوقت لتطبيقه.
بحثت عن الفكرة لزمن طويل و طرحت المشكلة حتى في منتدنا هذا لكن لم أجد إجابة شافية.
كان الحل الأول هو استعمال CliuentDataSet أو أي مكون آخر InMemoryTable.
لكن بعد البحث الطويل
وجدت أحدهم في أحد المنتديات الأجنبية طرح فكرة رائعة للبحث داخل ال 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;و هناك مثال كامل في المرفقات (طبعا هو لصاحب الفكرة.)
استفدت من هذا الحل فنقلته لكم هنا للاستفادة.
بالتوفيق.