وعليك السلام
شرح الدالة Locate
صيغة الدالة :
كود :
function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; virtual;
1 - الدالة Locate : هذه الدالة تقوم بالبحث في حالة وجود ما تبحث تأخذ قيمة منطقية True و اذا لم تجد تأخذ False و تنقل المؤشر إلى السطر الذي تم ايجاد فيه القيمة ، إذا كانت القيمة مكررة في سطور تأخذك في السطر الاول فقط
2 - KeyFields : إسم الحقل في قاعدة البيانات
3 - KeyValues : القيمة المراد البحث عنها
4 - Options : و هي إختيارية يمكن إستغناء عنها تحتوي على شرطين هما loPartialKey إذا وضعنا هذا الشرط يقوم بالبحث بالتطابق سواء حرف من كلمة أو كلمة من جملة بإختسار بتقريب ، أما الشرط الثاني خاص بالحروف اللاتنية loCaseInsensitive يقوم هذا شرط بالبحث على الحروف سواء كانت كبيرة أوصغيرة
5 - Boolean : في حالة إجاد ما تبحث تأخذ قيمة منطقية True و اذا لم تجد تأخذ False و هذا نظرينا
أمثلة :
كود :
Table1.Locate('Name',Edit1.Text,[])
البحث بكلمة أو جزء من كلمة
كود :
Table1.Locate('Name',Edit1.Text,[loPartialKey])
سوى كانت الحروف كبيرة أوصغيرة
كود :
Table1.Locate('Name',Edit1.Text,[loCaseInsensitive])
البحث برقم واسم
كود :
Table1.Locate('id;Name', VarArrayOf([StrToInt(Edit1.Text), Edit2.Text]),[loCaseInsensitive,loPartialKey])
في حالة حقلين أو أكثر هنا إستعملنا VarArrayOf هي عبارة عن مصفوفة تأخذ مجموعة من القيم ، اي الحقل الاول يأخذ القيمة في المصفوفة الاول نفس شيء للثاني الخ ....
إستعمل شرط
كود :
if Table1.Locate('Name',Edit1.Text,[loPartialKey]) = true then
ShowMessage('موجود') else ShowMessage('غير موجود');
end;
أما بالنسبة لـ
FireDAC فالدالة
Locate تطورت كثيرا وأصبحت تسمى
LocateEx وتحتوي على أكثر من خيارين و ميزة المهمة إستعمال
Expression
الخيارات :
]lxoCaseInsensitive : يتجاهل تطابق حالة الاحرف
]lxoPartialKey: التطابق الجزئي
الجديد
]lxoFromCurrent : البحث على السجل الموالي كلما نفذنا الدالة
]lxoBackward : العودة الى السجل الخلفي
كما يوجد خياران اخران ]lxoCheckOnly و ]lxoNoFetchAll
مثال
كود :
if not CustTable.LocateEx('COMPANY', 'AMCO', [lxoCaseInsensitive, lxoFromCurrent]) then
ShowMessage('The customer from AMCO company is not found');
الدالة LocateEx لكن بإستعمال Expression
مثال
كود :
if FDQuery1.LocateEx('Price >= 1000 and Price <= 2000', [lxoFromCurrent]) then
ShowMessage('Order is found')
else
ShowMessage('Order is not found');
لكن بالنسبة لي أفضل Filter التي نستعملها كثيرا ، لكن مع FireDAC يمكن بالبحث بواسطها دون تطبيق شرط التصفية
كمثال سأضع شرط التصفية
كود :
FDQuery1.Filter := 'Price >= 1000 and Price <= 2000';
لان لاخذ المؤشر اول حقل للبحث
أخذ المؤشر الى السجل الثاني المبحوث عنه
او بواسطة شرط
كود :
if FDQuery1.FindFirst then
ShowMessage('Found !');
أو
if FDQuery1.FindNext then
ShowMessage('Found !');
نفس الشيء بالنسبة FindPrior و FindLast
وإذا قمنا بإظهار ما نبحث عنه فقط نطبق التصفية
كود :
FDQuery1.Filtered := True;
بالتوفيق