التعليمة setkey و gotokey هل لها بديل على ADOTABLE
#1
Question 
السلام عليكم إخوتي
لدي كود لم أفهمه خاصة أني مبتدئ
PHP كود :
Table4.open ;
Table4.setkey ;
Table4.fieldbyname(‘reference’).asinteger := Table3.fieldbyname(‘ref_prod’).asinteger ;
If 
table4.gotokey then
Begin
Table3
.fieldbyname(‘designation’).asstring:= Table4.fieldbyname(‘designation’).asstring;
Table3.fieldbyname(‘prix_vente’).ascurrency:= Table4.fieldbyname(‘prix_vente’).ascurrency ;   
هذا هو الكود خاصة التعليمة setkey و gotokey وهل لها بديل على ADOTABLE
شكرا لكم على المجهودات التي تقدمونها لنا
الرد
#2
استعمل Locate أفضل وأئمن
الرد
#3
(27-03-2018, 08:42 PM)ferrero كتب : استعمل Locate أفضل وأئمن
بارك الله فيك أخي
مشكلتي لم أفهم التعليمة setkey و gotokey
الرد
#4
(27-03-2018, 09:28 PM)Amennay كتب :
(27-03-2018, 08:42 PM)ferrero كتب : استعمل Locate أفضل وأئمن
بارك الله فيك أخي
مشكلتي لم أفهم التعليمة setkey و gotokey

طرق البحث المفهرسة:
EditKey - FindKey - FindNearest - GotoKey - GotoNearest - SetKey
SetKey : تقوم بمسح محتويات المخزن المؤقت لمفتاح البحث وتمكين حالة dsSetKey للجدول بالسماح للتطبيق بتحديد معايير جديدة قبل إجراء البحث.
GotoKey : البحث عن أول سجل لمجموعة بيانات تطابق تمامًا معايير البحث ويضع المؤشر عليها إذا عثر عليها.

بالنسبة لمثالك مثلا:
var ref: Integer;
...

ref := Table3.FieldByName('ref_prod').AsInteger;
With Table4 do
Begin
  SetKey;
  FieldByName('reference').AsInteger := ref;

// GotoKey البحث بواسطة

  If GotoKey then
    ...
   else
     ...

// FindKey البحث بواسطة

  If FindKey([ref]) then
       ...
   else
     ...

// GotoNearest/FindNearest  البحث بواسطة

  FindNearest([ref]);
  GotoNearest;
end;
الرد
#5
السلام عليكم بارك الله فيك اريد مثال على قاعدة البيانات ل Locate
الرد
#6
وعليك السلام

شرح الدالة Locate

صيغة الدالة :

كود :
function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; virtual;

[صورة: 873529215.png]

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
[صورة: 105865879.png]

الخيارات :
]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

[صورة: 113332633.png]

مثال


كود :
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';

لان لاخذ المؤشر اول حقل للبحث

كود :
FDQuery1.FindFirst

أخذ المؤشر الى السجل الثاني المبحوث عنه

كود :
FDQuery1.FindNext

او بواسطة شرط

كود :
if FDQuery1.FindFirst then ShowMessage('Found !'); أو if FDQuery1.FindNext then ShowMessage('Found !');

نفس الشيء بالنسبة FindPrior و FindLast

وإذا قمنا بإظهار ما نبحث عنه فقط نطبق التصفية

كود :
FDQuery1.Filtered := True;

بالتوفيق
[-] كل من 2 users say قال شكرا ل larbiparadox على المشاركة المفيدة
  • لؤي, أبو معاذ
الرد
#7
# للاضافة البحث بواسطة Filter يعمل ايضا مع ADO

وشكرا
الرد


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


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