الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفية البحث تلقائيا في Edit

بدأه salma miladi في 26 يوليو 2008 · 22 رد · 3,940 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

:D هده رسالة الأولي في هدا المنتدى

أرجوكم مساعدتي في حل مشكلتي وهي

قمت بعمل منظومة فواتير بيع وشراء وأواجه بعض المشاكل و من هده المشاكل هي : إنني استخدم في عملية الإدخال رقم المنتج باستخدام جهاز ليزري لقراءة رقم الشفرة الموجود على المنتج حيث أقوم بإدخال الرقم في edite ويتم البحث تلقائيا حيث أني قمت بكتابة كود البحث على الحدث onkeypress لكن هده الطريقة بطيئا جدا حيث يقوم بعملية البحث كلما تم إدخال رقم من جهاز الليزري و الرقم قد يتكون من 8 ارقام أو أكثر وخاصة انني استخدم قواعد البانات أكسس و الكوري في عمليات البرمجة ,فكيف ادخل الرقم من الجهاز الليزي بحيث تتم عملية البحث تلقائيا بعد اكمال عملية الادخال و من غير ما اضغط على زر البحث

اشكركم على المساعدة

#2
اقتباس
أني قمت بكتابة كود البحث على الحدث onkeypress لكن هده الطريقة بطيئا جدا

استخدم onkeychange بدل من :wink: onkeypress.

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#3

أشكرك على الرد السريع لموضوعي و لكني جربة استخدام كل الاحداث تقريبا و يبقي عندي مشكلة البطء التي تسبب مشكلة في سرعة عملية البحث

#4

أنت قلت:

اقتباس
فكيف ادخل الرقم من الجهاز الليزي بحيث تتم عملية البحث تلقائيا بعد اكمال عملية الادخال و من غير ما اضغط على زر البحث

فالحدث onkeychange يحدث مرة واحدة فقط بعد انتهاء ادخال المحارف من قارئ الباركود.

بالنسبة للبطء, هل من الممكن ان تضع لنا الكود الذي استخدمته لعملية البحث؟

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#5

أشكركم على التواصل مع موضوعي

وهدا الكود :

with Query1 do

begin

if edit1.text = '' then

exit

else

begin

sql.clear;

close;

sql.Add ('select * from product where number='+(edit1.text)+''); //

open;

if Not isempty then

begin

edit2.text:=fieldbyname('proname').asstring ;

ComboBox1.text:= fieldbyname('proname').asstring;

end

else

begin

edit2.text:='';

ComboBox1.text:='';

end;

end;

#6

السلام عليكم

:angry:

أين انتم يااعضاء المنتدي ,توقعت ان تكون المشاركات أكثير من كدا ,لم أجد حل لمشكلتي بعد

#7

قاعدة البيانات أكسس تصبح بطيئة بشكل مطرد كلما زاد حجمها في البداية تأكدي من أن الحقل number عليه مفتاح أساسي و حاولي في تصميم قاعدة البيانات أن تستخدمي أعلى مستوى Normalization ممكن مع كتابة القيود المناسبة.

#8

لاداعي للصراخ أخي الكريم

المشكلة أنك تملأ الكويري في كل مرة يتغير محتوى الإيديت وهذا ما يجعل البحث ياخذ وقتا طويلا

الأفضل أن تفتح الكويري مع فتح النافذة وتستخدم Filter بعد تمرير ماتريد البحث عنه تحياتي

#9

بالتفصيل

عند فتح الفورم

procedure Tform1.FormCreate(Sender: TObject);
begin
	 Query1.sql.Text('select * from product ');
end;

وفي حدث التغيير للإيديت

procedure Tform1.(ُEdit1(Sender: TObject);
 var
 i:integer;
 str:string;
 begin
	  if (ُEdit1.Text<>'') then
	  begin
		   str:='';
		   if (Query1.FieldCount)>1 then
		   begin
				for i:=0 to Query1.FieldCount-2 do
					Str:= Str+Query1.Fields.FieldName + ' like ''*' + ُEdit1.Text+'*'' or ';
		   End;
		   Str:=Str+ Query1.Fields[Query1.FieldCount-1].FieldName + ' like ''*' + Edit1.Text+'*''';
		   Query1.Filter:=Str;
		  Query1.Filtered:=true;
	  End;
 end;

الكود السابق يقوم بالبحث في كافة الحقول بالجدول والفلترة علي السجلات التي بها القيمة بأي حقل من الحقول.

تحياتي

تم تعديل هذه المشاركة بواسطة TopSec في 27 يوليو 2008 في 12:39

#10

جميل TopSec, هذه هي المشكلة الرئيسية:

اقتباس
المشكلة أنك تملأ الكويري في كل مرة يتغير محتوى الإيديت وهذا ما يجعل البحث ياخذ وقتا طويلا

الأفضل أن تفتح الكويري مع فتح النافذة وتستخدم Filter بعد تمرير ماتريد البحث عنه تحياتي

اقتباس
الكود السابق يقوم بالبحث في كافة الحقول بالجدول والفلترة علي السجلات التي بها القيمة بأي حقل من الحقول.

لا تنسى تعديل الكود للبحث في الحقل الذي تريد البحث فيه, وليس كافة الحقول.

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#11

تحياتي للجميع

:lol:

أشكركم على تواصلكم مع موضوعي ,بارك الله فيكم و جزاكم الله عني كل خير, سوف أقوم بعمل التغير و أخبركم بالنتيجة

#12
TopSec كتب:
المشكلة أنك تملأ الكويري في كل مرة يتغير محتوى الإيديت وهذا ما يجعل البحث ياخذ وقتا طويلا

الأفضل أن تفتح الكويري مع فتح النافذة وتستخدم Filter بعد تمرير ماتريد البحث عنه تحياتي

كون المستخدم يستخدم قارئ باركود فلا أظن أن هذه هي المشكلة إذ أن القارئ يدخل الشريط المحرفي دفعة واحدة بما يكافئ:

EditCode.Text := 'C10236';
#13

بشكل عام أخي الكريم أسلوب البحث بإعادة تفريغ وملأ الكويري أسلوب عقيم وبطئ جدا ... أنظر للكود الذي أرسله الأخ ....

كم الإجرائات التي تحدث على الكويري من تفريغ وإعادة ملأ مرة أخرى وغلق وفتح وخلافه في كل مرة يسحب الباركود ....

لايوجد مجال للشك في أن الفلترة أسرع طرق البحث ... ;)

تحياتي

#14

أسعد الله يومكم ياعضاء المنتدي ,

مشكلتي مازلت موجودة , قمت بكتابة الكود على onchange لكن تظهري رسالة خطا , وارجو من الاخ TopSecا ان يشرح لى الامر filter فانا لم استخدم هدا الامر من قبل في البرمجة

لا إله إلا الله ألا بذكر الله تطمئن القلوب

#15

ماهو الكود الذي كتبته يا أخي الكريم ... ؟

هل قمت بالتعديل فيه ليناسب إحتياجك؟

ماهي رسالة الخطا التي تظهر لك؟

Filter هو خاصية في الكويري تماثل كلمة where في جملة SQl ... وخاصية filter يتم تمرير String لها يعادل ما بعد كلمة Where وفي حالتك هنا ستكون

Query1.Filter := 'number='+(edit1.text)+'''

وبعد تعيين قيمة الفلتر تقوم بتفعيله بواسطة الخاصية الأخرى Filterd

Query1.Filtered:=true;

تحياتي

تم تعديل هذه المشاركة بواسطة TopSec في 28 يوليو 2008 في 12:48

#16

جزاك الله خيرا TopSec , اشكرك على التواصل مع موضوعي

قمت بنسخ الكود من المنتدي و لكن بدون عمل اي تغيير عليه لاني لم افهم الكود , و عند التنفيد تظهر رسالة خطا و الامر filter ان تبين لى الصيغة العامة اكثر مع ملاحظة وضع comma

#17

السلام عليكم اردت التعقيب على هذا الموضوع اريد البحث بجزء الكلمة من خلال كويري وفلتر كتبت الكود الآتي ولم يفد ADOQuery1.filter := 'classname like '+QuotedStr(edit1.text+'%');

ADOQuery1.Filtered:=true;

كتبته في adotable تم التنفيذ ولكن المشكلة لما امسح الصنف تظهر رسالة خطأ .. استخدمت جمل sql وحدها ولكن مشكلة لما في الحدث onchange كل لحظة تفتح وتغلق الكويري ويظهر الbdgrid بالتقطيع .. وبالنسبة للاخ tppsec الجملة التي كتبها لم افهمها ولم تنفذ Query1.Filter := 'number='+(edit1.text)+'''

.. ارجو المساعدة مع الشكر كيف يتم استخدام الكويري مع الفلتر ...انتظر اجوبة من الاعضاء والسلام

#18

السلام عليكم : ارفقت المثال الذي انزلته أنت ... ارجو ان تخبرني هل يمكن عمل هذا مع adoquery خاصة لما يكون من النوع details .. اتمنى لو توضح لي في المرفق ولك جزيل الشكر

fil.rar

#19

السلام عليكم

اخي الفترة تصلح مع ادو بالطريقة التالية

في المثال السابق غير السطر التالي ب

 

      table1[color= #339933;].Filter[color= #339933;]:=[color= #0000ff;]'NAME='[color= #0000ff;]''[color= #339933;]+edit1[color= #339933;].text[color= #339933;]+[color= #0000ff;]'*'[color= #0000ff;]''[color= #339933;];

      ADOQuery1[color= #339933;].Filter[color= #339933;]:=[color= #0000ff;]'( NAME LIKE '[color= #0000ff;]'' [color= #339933;]+ edit1[color= #339933;].text [color= #339933;]+ [color= #0000ff;]'%'[color= #0000ff;]')'[color= #339933;];

ارجوا انه ما تريده

تم تعديل هذه المشاركة بواسطة زكيري عبد العالي في 15 أغسطس 2008 في 23:28

#20

السلام عليكم :

بارك الله فيك يا اخ زكيري وتسلم ... نجحت مع ال ado مية بالمية ولكن المشكلة لما استخدم النجمة تظهر رسالة خطأ كيف يمكن أنني استخدم النجمة قبل وبعد ال edit وجزالك الله الف خير وشكراً

طبعاً النجمة أو النسبة المئوية لا تنجح وشكراً

post-85619-1218838364_thumb.jpg

#21

السلام عليكم: نجحت العملية في adoquery ولكن لما يكون ماستر ديتيلز يعني المكان اللي اريد ابحث بي يكون details لا تنجح العملية تقول

adoquery filter proprties cannot be used for details tables

ارجو مساعدتي لان الموضوع بدا يكبر

#22
salma miladi كتب:

أشكركم على التواصل مع موضوعي

وهدا الكود :

with Query1 do

begin

if edit1.text = '' then

exit

else

begin

sql.clear;

close;

sql.Add ('select * from product where number='+(edit1.text)+''); //

open;

if Not isempty then

begin

edit2.text:=fieldbyname('proname').asstring ;

ComboBox1.text:= fieldbyname('proname').asstring;

end

else

begin

edit2.text:='';

ComboBox1.text:='';

end;

end;

لا داعي لهذه الغلبه كلها إستخدم البحث في الكوري او الملف الرئيسي بإستخدام في onchange

if not (product.locate('number',edit1.text,[loCaseInsensitive])) then

begin

edit2.text:='';

ComboBox1.text:='';

edit1.setfocus;

end

else

begin

edit2.text:=product.fieldbyname('proname').asstring

ComboBox1.text:=edit2.text;

end

نسأل الله الجنه لنا ولوالدينا ولمن لهم حق علينا

#23
salma miladi كتب:

السلام عليكم

:angry:

أين انتم يااعضاء المنتدي ,توقعت ان تكون المشاركات أكثير من كدا ,لم أجد حل لمشكلتي بعد

موجودين ياأختي ولكن إنتي وين هنا أربعة ردود من الأخوة المشاركين وإنت ولا شيء

إذا كنت ترغبين حل مشكلتك فالنأخذها خطوه خطوه وتجربين ثم إشعارنا

بما آلت اليه التجربه وسنواصل حتى ترضين عن كافة الأعضاء

تحياتي

نسأل الله الجنه لنا ولوالدينا ولمن لهم حق علينا

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…