تجاهل الفروق بین الهمزة و نظائرها فی بحث (Like)
#1
سلام علیکم یا اخونی

هذا کد للبحث فی Database :

كود :
ADOQuery1.close; ADOQuery1.sql.clear; ADOQuery1.sql.add ('select * from mytable where Book); ADOQuery1.sql.add ('Like ''%' + Edit1.text + '%'''); ADOQuery1.open;


لکن هذا الکد لیس ینتج هذه الکلمات : أعلم / إنشاء / سریعة

اذا اورد : اعلم / انشاء / سریعه

لان (ا) یفارق ( آ أ إ ) و (ه) یفارق ( ة)

کیف تجاهل الفروق بین الهمزه و نظائرها فی عمل البحث فی Database ؟
الرد
#2
وعليكم السلام.
هذا الكود لدالة تحول الحروف ä â ê ë ÿ û ü ô ö... الى الحروف A E Y U O ... وبنفس المبدأ حاول الاستفادة منه لتحويل آ ا ى ... إلى أ ي...
PHP كود :
function MajusculTou( const Texte: string ): string;
var 
x,y : integer;
begin
  Result
:= Texte;
  for 
x:= 1 to length(Texte) do begin
    y
:= Ord( Result[ x ]);
    case 
y of
      97..122    
: Result[ x ]:= Chr( y - 32 );
      
224..229    : Result[ x ]:= 'A';
      
231    : Result[ x ]:= 'C';
      
232..235    : Result[ x ]:= 'E';
      
236..239    : Result[ x ]:= 'I';
      
241    : Result[ x ]:= 'N';
      
242..246    : Result[ x ]:= 'O';
      
249..252    : Result[ x ]:= 'U';
      
253, 255    : Result[ x ]:= 'Y';
    
end;
  
end;
end; 
الرد
#3
هذا الکود یحول کل الف ای ( آ ) او ( أ )

ای یتحول اانزل الی آآنزل او أأنزل او إإنزل لکن کیف یتحول الی أآنزل ..؟
الرد
#4
عذرا أخي لم أفهم شيئا مما كتبت Smile
الرد
#5
مشكلة حقيقية فعلا
إذا تم البحث عن كلمة انزل و هي في قاعدة البيانات آنزل فلا يمكن إيجادها إلا إذا كانت موجودة في قاعدة البيانات بالشكل انزل
سننتظر دخول أحد الأخوة الخبراء علهم يفيدونا بشيئ
الرد
#6
السلام عليكم و رحمة الله إخوتي أنا الآن أعمل على برنامج لتسيير مكتبة و واجهتني مشكلة حول كيف أبحث في dbgrid مع تجاهل الهمزة و نضائرها
الرد
#7
هل هناك ما يمنع من إستخدام
StringReplace
الرد
#8
لدي فكرة لا اعلم اذا كانت ستفلح معك ما رأيك لو قمنا بالأتي :

PHP كود :
Var S : String;

S := Edit1.text ;
for 
I := 0 to 3 do Begin
If I = 0 Then S:= StringReplace(S, 'أ' , 'ا', [rfReplaceAll, rfIgnoreCase]);
If 
I = 1 Then S:= StringReplace(S, 'آ' , 'ا', [rfReplaceAll, rfIgnoreCase]);
If 
I = 2 Then S:= StringReplace(S, 'إ' , 'ا', [rfReplaceAll, rfIgnoreCase]);
If 
I = 3 Then S:= StringReplace(S, 'ا' , 'ا', [rfReplaceAll, rfIgnoreCase]);
// بأمكانك وضع الاحرف الذي تحتاج وبهذه العملية تكون قد بحثت عن كل الاحرف بشكل عام
if ADOQuery1.Active then  ADOQuery1.sql.clear ;
ADOQuery1.sql.add ('select * from mytable where Book);
ADOQuery1.sql.add ('
Like ''%' + S+ '%''');
if Not ADOQuery1.Active then ADOQuery1.open;
End; 

ان شاء الله تكون تجدي نفعاً معك

اللهمّ إنّي ظلمت نفسي ظلماً كثيراً ولا يغفر الذّنوب إلا أنت

فاغفر لي مغفرة من عندك وارحمني إنّك أنت الغفور الرّحيم
الرد
#9
يتوجب انشاء تابع في قاعدة البيانات يعيد نفس نتيجة التابع الموجود أعلاه كي يتحقق الشرط
فتقول
where databasefunc(book) like '%'''+ delphiFunc(edtbook.text) + '%'''
الرد
#10
السلام عليكم...

كلٌ من SQL Server و Access يدعمان استعمال المجموعات (Sets) و النطاقات (Ranges) مع العامل LIKE.

المجموعة (Set) هي مجموعة من الحروف أو الرموز ضمن قوسين مربعين، مثلاً [acegj] . أما النطاق (Range) فيتحد بتعيين بداية النطاق و نهاية النطاق و بينهما شرطة، أيضاً ضمن قوسين مربعين، مثلاً [A-M] للحروف من A إلى M.

يمكن تطبيق ذلك مع الهمزات و ذلك بتحويل أي ألف (بصرف النظر عن همزته) إلى مجموعة من الألفات. مثلاً كلمة أخرج تصبح [اأإآ]خرج، و كلمة جاء تصبح ج[اأإآ]ء، و كلمة أأنزل تصبح [اأإآ][اأإآ]نزل... إلخ.

الكود التالي يحتوي على دالة تقوم بذلك لتعيد string يمكن استعماله في جملة SELECT. مع افتراض أن نص البحث مكتوب في Edit1:

كود :
function ReplaceAlif(SrcStr: string): string; var Idx: Integer; begin if Trim(SrcStr) = '' then Result := SrcStr else begin Result := ''; Idx := 1; for Idx := 1 to Length(SrcStr) do begin if (SrcStr[Idx] = 'ا') or (SrcStr[Idx] = 'أ') or (SrcStr[Idx] = 'إ') or (SrcStr[Idx] = 'آ') then Result := Result + '[اأإآ]' //else if (SrcStr[Idx] = 'ه') or (SrcStr[Idx] = 'ة') then // Result := Result + '[هة]' else Result := Result + SrcStr[Idx]; end; end; end; ' ثم في زر البحث var SearchTxt, SqlStr: string; begin SearchTxt := Trim(Edit1.Text); if SearchTxt <> '' then begin SearchTxt := ReplaceAlif(SearchTxt); SqlStr := 'SELECT ... WHERE (field_name LIKE %' + SearchTxt + '%'; ebd; end;

نرجو الاستفادة و السلام.
الرد


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


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