السلام عليكم ورحمة الله تعالى وبركاته
لدي جدولين
ومفتاحهما الحقل المسمى 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;
هل هناك خطأ في الكود
وعليك السلام و رحمة الله و بركاته
كملاحظة سريعة لم اجرب كود
احذف ما تحته خط
![[صورة: 513991527.png]](https://www14.0zz0.com/2020/03/31/12/513991527.png)
لقد حذفت كل ما تحته خط ولكن المشكلة لازالت قائمة
بارك الله فيكم
(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;
اخي العزيز ماذا تقصد بـ NouvelleValeur
(31-03-2020, 04:06 PM)medreg كتب : [ -> ]اخي العزيز ماذا تقصد بـ NouvelleValeur
القيمة التي ترغب في إدخالها أي القيمة التي يتم البحث عنها في Table2
اخي العزيز للتوضيح فقط
table2 يحتوي على حقل واحد فقط والمسمى Mle من نوع Float
استعملته عوض عن المكون edit لأن المكون edit لم استطع التحكم فيه
مع العلم ان القيمة التي يجب البحث عنها تكون مطابقة للقيمة الموجودة في الجدول
مثلا اذا ادخلت القيمة في المكون edit بهذا الشكل 0125340
والقيمة الموجودة سابقا بهذا الشكل 125340 لا يعتبرها نفس القيمة
لهذا السبب استعملت جدوا اخر لإدخال القيمة وجعلته من نوع float
في هذه الحالة لو كان هناك طريقة أخرى باستعمال المكون edit افدنا به جزاك الله عنا كل خير عالما ان القيمة تصل الى 12 رقم
(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
المقصود بما اريد هو كالتالي
لدي جدول table1 يحتوي على ثلاث حقول
Mle = مفتاح
Nom
prenom
المطلوب هو
في حالة اضافة بواسطة المكون edit1 يجب التنبيه بان السجل موجود مسبقا في table1 اذا كان فعلا موجود ولا يقبل نفس الرقم قيمة الحقل mle
واذا لم يكن موجود ينفذ الاضافة
هذا ما ارت قصده
اليك المرفق لتعدل عليه
كل ما في الامر
اذا تم ايجاد السجل مسبقا ينتقل مباشرة الى form4 لإظهار السجل بجميع معلوماته
واذا لم يتم ايجاده ينتقل الى form2 لإتمام المعلومات
هذا ما اقصده
جزاكم الله عنا كل خير
[attachment=4194]
ذكرت ان لديك جدول table1
على اى نوعية من قواعد البيانات انشأته ؟
لا تضع العربة امام الحصان
قم باعادة هيكلة هذا الجدول مع وضع خاصية unique على الحقل المطلوب
فهذا عمل محرك قاعده البيانات و ليس الدلفى
مجرد رأى
تحياتى