عدم تكرار سجل في قاعدة بيانات ؟
#1
السلام عليكم
بحثت في المنتدى قبل طرح سؤالي لكن لم اجد ما ابحث عنه ربما الكلمات الدلالية غير متوافقة
المهم ما هي احسن طريقة لمنع تكرار ادخال سجلات معلومات الى قاعدة بيانات اكسس استخدام دالفي7 في هدا المشروع ؟؟
للتوضيح اكثر لدي fiche1 تحتوي على زر اظافة شخص جديد بعد الضغط على الزر ننتقل الى fiche2 التي تحتوي بدورها على حقول لادخال البيانات من رقم واسم ولقب و ... الرقم هو مفتاح رئيسي طبعا لن يتكرر لانه يزداد تلقائيا لكن ماهي طريقة جعل الاسم واللقب وتاريخ الازدياد لنفس الشخص لا تتكرر كي لا نحصل على شخص واحد في قاعدة بياناتنا برقمين مختلفين - اظن الفكرة وصلت -
انتظر ارآكم واقتراحاتكم وشكرا
و من طلب العلوم بغير كد _________ سيدركها إذا شاب الغراب
الرد
#2
bassem_43 كتب :ماهي طريقة جعل الاسم واللقب وتاريخ الازدياد لنفس الشخص لا تتكرر كي لا نحصل على شخص واحد في قاعدة بياناتنا برقمين مختلفين

السلام عليكم

عرف الحقول التي لا تريد أن تتكرر سجلاتها بالخاصية UNIQUE

كود :
CREATE TABLE Persons ( P_Id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName) )
أدبني الدهر فأراني نقص عقلي وإذا ما ازددت علما زادني علما بجهلي
الرد
#3
لؤي كتب :السلام عليكم

عرف الحقول التي لا تريد أن تتكرر سجلاتها بالخاصية UNIQUE

كود :
CREATE TABLE Persons ( P_Id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName) )
اخي لؤي بارك الله فيك على الرد
لكن انا انشات الجداول باكسس وليس برمجيا
اظن انه يمكن اظافة السطر الاخير لوحده اقصد
CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
لكن في اي حدث؟؟ هل هو وان كرييتد وما معنى uc_PersonID ؟ وشكرا
و من طلب العلوم بغير كد _________ سيدركها إذا شاب الغراب
الرد
#4
bassem_43 كتب :لكن في اي حدث؟؟ هل هو وان كرييتد وما معنى uc_PersonID ؟ وشكرا
السلام عليكم
راجع هذا الرابط:[URL="http://office.microsoft.com/en-us/access-help/prevent-duplicate-values-in-a-field-HA010283317.aspx"]
http://office.microsoft.com/en-us/access...83317.aspx[/URL]
أو الصورة في المرفقات:
أما معنى uc_PersonID فهو مثال فقط ذكرته ويكون ذلك برمجيا

[صورة: attachment.php?attachmentid=4360&d=1398496122]


الملفات المرفقة
.jpg   C_E.jpg (الحجم : 54.74 ك ب / التحميلات : 64)
أدبني الدهر فأراني نقص عقلي وإذا ما ازددت علما زادني علما بجهلي
الرد
#5
السلام عليكم
يمكنك استخدام استعلام count من ado query للحصول على عدد السجلات
ملاحظة غير قابل للتنفيد لتوضيح الفكرة فقط
PHP كود :
select count from tableau_clients where id = id and nom = "nom" and 
date = "date" 
if count = 1 then exit; 
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
الرد
#6
بارك الله فيكم اخي فاتح ولؤي على الرد والمتابعة
لقد وجدت طريقة اخرى ليست احترافية لكنها تفي بالغرض

PHP كود :
procedure TForm2.validerClick(Sender: TObject);
begin
form1
.tbl1.Open;
form1.tbl1.Edit;
form1.tbl1.Append;
IF ( 
Form2.Edt1.text = '' )or (Form2.Edit2.text = '' ) or (Form2.medtedt2.text = '' )or (Form2.Edt4.text = '')  Then
      Begin
             Showmessage 
( ' S.V.P Complétez tous les champs ' ) ;
             
Abort ;

         
End ;

If(
Form1.tbl1.State In[DsInsert,DsEdit])And(Edit2.text <> '' )And(Edt1.text <> '' )And(medtedt2.text <> '' ) Then
     Begin
          Form1
.tbl1.Open ;
          If  (
Form1.tbl1.Locate ('nom' , Edit2.Text , [Locaseinsensitive] ) )and(Form1.tbl1.Locate ('prenom' , Edt1.Text , [Locaseinsensitive] ) )and (Form1.tbl1.Locate ('naissence' , medtedt2.Text , [Locaseinsensitive] ) ) Then
                Begin
                Form1
.tbl1.Filtered:= False ;
                               
Showmessage ( ' Ce patient existe déjà, SVP introduire un autre patient ' ) ;
                               
Edit2.Setfocus ;
                               
Form1.tbl1.Filter:= 'Nom='''+Edit2.Text+'''';
                               
Form1. tbl1.Filtered:= True;
                               
DBGrid1.Visible:=True;
                               
Abort;
                               
End


     
else

begin
 Form1
.tbl1.Filtered:= False ;

If ( 
Messagedlg ( ' Voulez vous vraiment enregistrer cet enregistrement ? ', Mtconfirmation , [MbYes,MbNo], 0 ) = MrNo )Then Abort ;
form1.tbl1.Edit;
form1.tbl1.Append;
form1.tbl1.FieldValues['nom']:=Edit2.text;
form1.tbl1.FieldValues['prenom']:=edt1.text;
form1.tbl1.FieldValues['naissence']:=medtedt2.text;
form1.tbl1.FieldValues['adress']:=edt4.text;
form1.tbl1.FieldValues['num tel']:=edt3.text;
form1.tbl1.Post;
DBGrid1.Visible:=True;
end;
end; 
ان كانت هناك ملاحظات على الكود افيدوني بارك الله فيكم
و من طلب العلوم بغير كد _________ سيدركها إذا شاب الغراب
الرد
#7
السلام عليكم...

الطريقة الأفضل هي استعمال الفهارس الفريدة (Unique Indexes) في قاعدة البيانات نفسها عند تصميمها بـ Access أو غيره:
1. في Access - و في وضعية تصميم الجدول - افتح نافذة الفهارس.
2. قم بتعريف فهرس فريد (Unique) يتكون من الحقول الثلاثة (الاسم و اللقب و التاريخ). في هذه الحالة سيمنع Access التكرار و يعيد رسالة خطأ إلى البرنامج.
3. في دلفي ضع كود الإضافة أو التعديل ضمن كتلة try ... except لاقتناص الأخطاء حيث يمكنك عرض رسائلك الخاصة.

كود :
try // ... // كود حفظ البيانات // ... except on E: Exception do begin ShowMessage('Error on saving data.' + #13#10 + 'Error message:' + #13#10 + E.Message); if (table.State = dsInsert) or (table.State = dsEdit) then table.Cancel; end; end;

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


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


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