delphi4arab منتديات دلفي للعرب
فيما يخص البحث والمقارنة - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : فيما يخص البحث والمقارنة (/showthread.php?tid=10728)

الصفحات: 1 2


فيما يخص البحث والمقارنة - medreg - 30-03-2020

السلام عليكم ورحمة الله تعالى وبركاته
لدي جدولين
ومفتاحهما الحقل المسمى Mle
عندما اضيف سجل يجب ان يبحث في الجدول table1 اذا تم ايجاد نفس الرقم يتم التنبيه على ان رقم هذا السجل موجود مسبقا ولا يمكن اضافة سجل اخر بنفس الرقم
والذي يحصل معي هو كالتالي
اذا اضفت سجل رقم 1 مثلا واعدت اضافة سجل بنفس الرقم يتم تنبيهي بان رقم السجل موجود مسبقا ثم اضيف سجل يحمل رقم 2 الى هنا العملية تمام لكن اذا اضفت سجل ثالث برقم 1 يقبله رغم ان الرقم موجود مسبقا
الكود الذي استعمله هو كالتالي :
كود :
procedure TFrmAjoute.Button3Click(Sender: TObject); var fch: TFrmFichier; fAfc: TFrmAffiche; begin   fch:=TFrmFichier.create(self);   fAfc:=TFrmAffiche.create(self);   with DM do   begin     DM.Table2.Open;     DM.Table2.First;     While not DM.Table2.Eof do     begin       if DM.Table1.fieldvalues['Mle']=DM.Table2.fieldvalues['Mle']then       begin       ArabShowMessage('هذا الرقم موجود من قبل ');       fAfc.showModal;       fAfc.free;       end else       begin         DM.Table1.Insert;         DM.Table1.fieldvalues['Mle']:=DM.Table2.fieldvalues['Mle'];         DM.Table1.Post;       fch.ShowModal;       fch.Free;       end;     DM.Table2.Next;     close;     end;       DM.Table1.refresh;   end; end; هل هناك خطأ في الكود



RE: فيما يخص البحث والمقارنة - larbiparadox - 31-03-2020

وعليك السلام و رحمة الله و بركاته

كملاحظة سريعة لم اجرب كود
احذف ما تحته خط

[صورة: 513991527.png]


RE: فيما يخص البحث والمقارنة - medreg - 31-03-2020

لقد حذفت كل ما تحته خط ولكن المشكلة لازالت قائمة
بارك الله فيكم


RE: فيما يخص البحث والمقارنة - ghostdz - 31-03-2020

(31-03-2020, 01:32 PM)medreg كتب : لقد حذفت كل ما تحته خط ولكن المشكلة لازالت قائمة
بارك الله فيكم

وعليكم السلام ورحمة الله تعالى وبركاته
1- حذف DM هو من ناحية المقروئية وعدم التكرار لأنك استخدمت with DM do
2- الكود الذي وضعته الخوارزمية خاطئة حيث عوض أن تتفحص كل سجل وتقارنه كان بإمكانك إستخدام Table2.Locate
والخطأ الثاني أنك تقوم بملأ الحقل في Table1 بقيمة موجودة في Table2 وهذا بعد القيام بمقارنة واحدة أي أنك لم تقم بمقارنة كل السجلات في Table2
Table1.fieldvalues['Mle']:= DM.Table2.fieldvalues['Mle'];
ملاحظة:
-إذا كانت Table1 و Table2 يقومان بقراءة نفس الجدول فمن الأفضل أن تجعل الحقل Mle مفتاح حيث قاعدة البيانات (SGBDR) هي التي تقوم بالمراقبة ولا تسمح بإضافة نفس الرقم وتحدث exception وكل ما عليك هو إعتراضها وإظهار التنبيه
-كتابة الكود بتنسيقه وكتابة المتغيرات بأسماء مفهومة تساعد على مقروئية الكود وفهمه عليك بقراءة كتاب Clean code
إليك الكود التالي جربه

كود :
procedure TFrmAjoute.Button3Click(Sender: TObject); var   fch: TFrmFichier;   fAfc: TFrmAffiche; begin   fch:=TFrmFichier.create(self);   fAfc:=TFrmAffiche.create(self);   with DM do   begin     Table2.Open;     if Table2.Locate('Mle', Table1.fieldvalues['Mle'], []) then     begin       ArabShowMessage('هذا الرقم موجود من قبل ');       fAfc.showModal;       fAfc.free;     end     else     begin       Table1.Insert;       Table1.fieldvalues['Mle']:=  NouvelleValeur; //DM.Table2.fieldvalues['Mle'];       Table1.Post;       fch.ShowModal;       fch.Free;     end;     Table2.Close;     Table1.Refresh;   end; end;



RE: فيما يخص البحث والمقارنة - medreg - 31-03-2020

اخي العزيز ماذا تقصد بـ NouvelleValeur


RE: فيما يخص البحث والمقارنة - ghostdz - 31-03-2020

(31-03-2020, 04:06 PM)medreg كتب : اخي العزيز ماذا تقصد بـ NouvelleValeur

القيمة التي ترغب في إدخالها أي القيمة التي يتم البحث عنها في Table2


RE: فيما يخص البحث والمقارنة - medreg - 31-03-2020

اخي العزيز للتوضيح فقط
table2 يحتوي على حقل واحد فقط والمسمى Mle من نوع Float
استعملته عوض عن المكون edit لأن المكون edit لم استطع التحكم فيه
مع العلم ان القيمة التي يجب البحث عنها تكون مطابقة للقيمة الموجودة في الجدول
مثلا اذا ادخلت القيمة في المكون edit بهذا الشكل 0125340
والقيمة الموجودة سابقا بهذا الشكل 125340 لا يعتبرها نفس القيمة
لهذا السبب استعملت جدوا اخر لإدخال القيمة وجعلته من نوع float
في هذه الحالة لو كان هناك طريقة أخرى باستعمال المكون edit افدنا به جزاك الله عنا كل خير عالما ان القيمة تصل الى 12 رقم


RE: فيما يخص البحث والمقارنة - ghostdz - 31-03-2020

(31-03-2020, 04:37 PM)medreg كتب : اخي العزيز للتوضيح فقط
table2 يحتوي على حقل واحد فقط والمسمى Mle من نوع Float
استعملته عوض عن المكون edit لأن المكون edit لم استطع التحكم فيه
مع العلم ان القيمة التي يجب البحث عنها تكون مطابقة للقيمة الموجودة في الجدول
مثلا اذا ادخلت القيمة في المكون edit بهذا الشكل 0125340
والقيمة الموجودة سابقا بهذا الشكل 125340 لا يعتبرها نفس القيمة
لهذا السبب استعملت جدوا اخر لإدخال القيمة وجعلته من نوع float
في هذه الحالة لو كان هناك طريقة أخرى باستعمال المكون edit افدنا به جزاك الله عنا كل خير عالما ان القيمة تصل الى 12 رقم

لم أستطع فهم ما تريد من خلال هذه الجداول لكن يبدو أنه يوجد خلل في التصميم
على العموم يمكنك إستخدام longint  عوضا عن float فهو يقبل أكثر من 12 رقم
في المكون edit يمكنك التحكم بالحد الأقصى للأرقام التي يقبلها بتغيير MaxLength:= 12 وجعل NumbersOnly:= true

عذرا إستخدم int64 عوضا عن longint وعند القيام بالتغيير إستخدم StrToInt64 عوضا عن StrToInt


RE: فيما يخص البحث والمقارنة - medreg - 31-03-2020

المقصود بما اريد هو كالتالي
لدي جدول table1 يحتوي على ثلاث حقول
Mle = مفتاح
Nom
prenom
المطلوب هو
في حالة اضافة بواسطة المكون edit1 يجب التنبيه بان السجل موجود مسبقا في table1 اذا كان فعلا موجود ولا يقبل نفس الرقم قيمة الحقل mle
واذا لم يكن موجود ينفذ الاضافة
هذا ما ارت قصده

اليك المرفق لتعدل عليه
كل ما في الامر
اذا تم ايجاد السجل مسبقا ينتقل مباشرة الى form4 لإظهار السجل بجميع معلوماته
واذا لم يتم ايجاده ينتقل الى form2 لإتمام المعلومات
هذا ما اقصده
جزاكم الله عنا كل خير

[attachment=4194]


RE: فيما يخص البحث والمقارنة - حسن لطفى - 31-03-2020

ذكرت ان لديك جدول table1
على اى نوعية من قواعد البيانات انشأته ؟
لا تضع العربة امام الحصان
قم باعادة هيكلة هذا الجدول مع وضع خاصية unique على الحقل المطلوب
فهذا عمل محرك قاعده البيانات و ليس الدلفى
مجرد رأى
تحياتى