ورود

View Full Version : جلوگيري از ذخيره شدن مقادير تكراري در بانك



hentjanson
پنج شنبه 27 تیر 1387, 19:11 عصر
سلام به همه دوستان من از اين طريق در بانكم اطلاعات رو ثبت مي كنم . مي خوام بدونم چطور ميشه كاري كرد كه اگه نام كتاب موجود بود در بانك ديگه ذخيره نكنه اون نام تكراري رو .
نام فيلد نام كتاب namketab


procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if maskedit2.text='' then showmessage('ÔãÇÑå ÔÇÈß ßÊÇÈ ÑÇ æÇÑÏ ßäíÏ')else
if maskedit3.text='' then Showmessage('äÇã ßÊÇÈ ÑÇ æÇÑÏ ßäíÏ') else
if maskedit4.text='' then Showmessage('äÇã ÎÑíÏÇÑ ÑÇ æÇÑÏ äãÇííÏ') else
With DataModule2 Do
Begin
ADOTable1.Insert;
ADOTable1.Edit;
ADOTable1number.AsString := maskEdit1.Text;
ADOTable1isbn.AsString := maskEdit2.Text;
ADOTable1namketab.AsString := maskEdit3.Text;
ADOTable1name.AsString := maskEdit4.Text;
ADOTable1tedad.AsString := maskEdit6.Text;
ADOTable1fe.AsString := maskEdit7.Text;
ADOTable1gheymat.AsString := maskedit8.Text;
ADOTable1Date.AsString := PrintNormal;
ADOTable1.Post;
BitBtn1.Enabled:=false;
Button1.Enabled:=true;
end;
end;

m-khorsandi
پنج شنبه 27 تیر 1387, 19:21 عصر
اگه از SQL Server استفاده می‌كنی Unique Constraint كمكت می‌كنه.

Hsimple11
پنج شنبه 27 تیر 1387, 19:25 عصر
راههای مختلفی وجود دارد. یکی از راه ها این است که در زمان طراحی جدول خود، برای فیلد مورد نظر (مثل nameketab) یک Primary Key تعریف کنید. Key های Primary خودبخود مانع از ایجاد رکورد تکراری میشوند. بعبارتی فیلدی که ایندکسی از نوع Primary دارد تمامی رکوردهایش بایستی Unique و بی همتا باشند.
راه دیگر گذاشتن یک حلقه به تعداد رکوردهاست که برای هر Insert جدید تمام رکوردها را چک کند که اگر چنین رکوردی وجود داشت مانع اضافه شدن آن شود. که اگر تعداد رکوردهایتان زیاد باشد راه حل معقولانه ای نیست.
راه دیگر این است که در هنگام وارد کردن هر رکورد جدید یک جستجو مثلا با Locate انجام دهید و اگر رکوردی به این نام وجود داشت رکورد را ثبت نکنید.
در ضمن اگر از SQL استفاده میکنید میتوانید بعد از ثبت رکوردهایتان با Distinct داده های غیر مشترک را جدا کنید.

Hsimple11
پنج شنبه 27 تیر 1387, 19:32 عصر
در مورد مطلب جناب آقای خرسندی اضافه کنم که Unique Constraint را میتوانید برای هر چند تعداد فیلدی که میخواهید در یک جدول اعمال کنید در حالی که Primary Key Constraint در هر جدول فقط یک فیلد می تواند باشد.

موفق باشید.

hentjanson
پنج شنبه 27 تیر 1387, 20:06 عصر
در رابطه با عمل جستجو قبل از ثبت ميشه يك مثالي بزنيد براي من locate

hentjanson
پنج شنبه 27 تیر 1387, 21:24 عصر
سلام به همه اساتيد
اين كد رو چطور تصحيح كنم خوبه ؟ كه ركورد تكراري ذخيره نكنه ؟


IF (DataModule2.ADOTable1.Locate('namketab',maskedit1 .Text,[])) Then
Begin
MessageDlg('Çíä ˜ÊÇÈ ÏÑ ÏÓÊ ÇÚÖÇÁ ãí ÈÇÔÏ',mtInformation,[mbok],0);
Exit;
End;

Hsimple11
پنج شنبه 27 تیر 1387, 21:37 عصر
اين كد رو چطور تصحيح كنم خوبه ؟ كه ركورد تكراري ذخيره نكنه ؟

مشکل کجاست؟

خب اگر locate=True بود :


then
Showmessage ('The Same Record Already Exists')
ٍElse Begin
ADOTable1.Insert;
.
.
.

ٍEnd;

hentjanson
پنج شنبه 27 تیر 1387, 21:43 عصر
يعني اينطوري بنويسم دوست من ؟


IF (DataModule2.ADOTable1.Locate('namketab',maskedit1 .Text,[])) Then
Showmessage ('The Same Record Already Exists')
ٍElse Begin
ADOTable1.Insert;
ADOTable1number.AsString := maskEdit1.Text;
ADOTable1isbn.AsString := maskEdit2.Text;
ADOTable1namketab.AsString := maskEdit3.Text;
ADOTable1.Post;
ٍEnd;

m-khorsandi
پنج شنبه 27 تیر 1387, 22:21 عصر
مطالعه‌ی كتاب رو بهت پيشنهاد ميكنم يا سايت delphi.about.com

Hsimple11
پنج شنبه 27 تیر 1387, 23:56 عصر
باز هم مشکلی وجود دارد؟؟

hentjanson
جمعه 28 تیر 1387, 09:03 صبح
سلا من كد رو اينطوري نوشتم نميدونم كجايه كار اشتباه كردم در جواب دوست عزيزم بايد بگم كتاب دلفي در دسترس ندارم مسلما كتاب همراه بود اينجا مطرح نميكردم تايپيك ايجاد ميشه كه سوال پرسيده شه محتواي سوال ملاك نيست ملاك اينه مشكلات حل شده و اينكه هر سوالي فقط يك بار پرسيده ميشه و نه من بعدها ديگران وقتي اين تايپيك رو ببينند قابل استفاده خواهد بود . با تشكر
كد :


IF (DataModule2.ADOTable1.Locate('namketab',maskedit1 .Text,[])) Then
Showmessage ('The Same Record Already Exists')
ٍElse Begin
ADOTable1.Insert;
ADOTable1number.AsString := maskEdit1.Text;
ADOTable1isbn.AsString := maskEdit2.Text;
ADOTable1namketab.AsString := maskEdit3.Text;
ADOTable1.Post;
ٍEnd;

SYNDROME
جمعه 28 تیر 1387, 09:34 صبح
استفاده از Locate کار چندان جالبی نیست.
چون عمل Locate بر روی DataSet شما عمل جستجو را انجام می دهد در صورتی که ممکن است چند لحظه قبل رکورد دیگری به بانک اضافه شود که داخل DataSet شما وجود ندارد.
می توانی با استفاده از یک Select در برنامه و استفاده از روشی که دوستان گفتند در دو مرحله مقادیر چک شود.
یک بار در برنامه و بار دیگر در بانک.
موفق باشید

hentjanson
جمعه 28 تیر 1387, 10:03 صبح
سلام دوست من در اين رابطه ميشه مثالي بزنيد


چون عمل Locate بر روی DataSet شما عمل جستجو را انجام می دهد در صورتی که ممکن است چند لحظه قبل رکورد دیگری به بانک اضافه شود که داخل DataSet شما وجود ندارد.
می توانی با استفاده از یک Select در برنامه و استفاده از روشی که دوستان گفتند در دو مرحله مقادیر چک شود.
یک بار در برنامه و بار دیگر در بانک.

Hsimple11
جمعه 28 تیر 1387, 11:35 صبح
چون عمل Locate بر روی DataSet شما عمل جستجو را انجام می دهد در صورتی که ممکن است چند لحظه قبل رکورد دیگری به بانک اضافه شود که داخل DataSet شما وجود ندارد.

می توانید با یک Requery یا باز و بسته کردن Dataset این مشکل را حل کنید. ولی من هم با نظر جناب Syndrome موافقم.


IF (DataModule2.ADOTable1.Locate('namketab',maskedit1 .Text,[loPartialKey]))=True Then

شما جاهای MaskEdit3 و MaskEdit1 را اشتباه ننوشتید؟!

در مورد دستورها از Help دلفی کمک بگیرید.

موفق باشید...

hentjanson
جمعه 28 تیر 1387, 12:36 عصر
دوست من مشكلم حل شد . در نهايت طبق كمك هاي شما اينطوري مشكلم حل شد


procedure TForm1.BitBtn1Click(Sender: TObject);
begin
IF (DataModule2.ADOTable1.Locate('namketab',maskedit3 .Text,[loPartialKey]))=True then
Showmessage (' ! كتاب فوق قبلا ثبت گرديده است ')
Else Begin
DataModule2.ADOTable1.Insert;
if maskedit2.text='' then showmessage('شماره شابك كتاب را وارد كنيد')else
if maskedit3.text='' then Showmessage('نام كتاب را وارد كنيد') else
if maskedit4.text='' then Showmessage('نام خريدار را وارد نماييد') else
With DataModule2 Do
Begin
ADOTable1.Insert;
ADOTable1.Edit;
ADOTable1number.AsString := maskEdit1.Text;
ADOTable1isbn.AsString := maskEdit2.Text;
ADOTable1namketab.AsString := maskEdit3.Text;
ADOTable1name.AsString := maskEdit4.Text;
ADOTable1tedad.AsString := maskEdit6.Text;
ADOTable1fe.AsString := maskEdit7.Text;
ADOTable1gheymat.AsString := maskedit8.Text;
ADOTable1Date.AsString := PrintNormal;
ADOTable1.Post;
BitBtn1.Enabled:=false;
Button1.Enabled:=true;
end;
end;
end;

يك سوال ديگه هم دارم ببين اگه بخوام با اين روند عددي رو ثبت كنم مثلا شماره با اسم فيلد number مي خوام طوري عمل بشه كه اگه بانك خالي بود فيلد number h,k شماره اون عدد 1 بشه و اگه بانك عدد داشت اخرين عدد رو +1 كنه ميشه در اين رابطه هم توضيحاتي بديد

SYNDROME
جمعه 28 تیر 1387, 14:53 عصر
ADOTable1.Insert;
ADOTable1.Edit;


دستور بالا را چرا اینطور نوشته اید؟
یا باید عمل Inert و یا Edit را انجام دهید.


يك سوال ديگه هم دارم ببين اگه بخوام با اين روند عددي رو ثبت كنم مثلا شماره با اسم فيلد number مي خوام طوري عمل بشه كه اگه بانك خالي بود فيلد number h,k شماره اون عدد 1 بشه و اگه بانك عدد داشت اخرين عدد رو +1 كنه ميشه در اين رابطه هم توضيحاتي بديد

در چنین مواقعی می توانید از چنین کدی استفاده کنید.


ADO.SQL.Clear;
ADO.SQL.Add(' Select MAx(Number) Number');
ADO.SQL.Add(' From Tbl_Test');
ADO.SQL.Open;
ADO.FieldByName('Number').Asinteger+1

موفق باشید

hentjanson
جمعه 28 تیر 1387, 16:27 عصر
سلام دوست من در اينجا ما نياز به نوشتم دستور if داريم براي اعمال شرط بدين صورت اگه بانك يا همان فيلد number خال بود ؟ در اين مورد توضيح ميشه بديد ؟