PDA

View Full Version : سوال: عدم ثبت رکورد تکراري



alavi1451
یک شنبه 03 شهریور 1387, 20:01 عصر
با سلام
چگونه در ويژوال بيسيک از ثبت رکورد تکراري در بانک اطلاعاتي که در اکسس ايجاد شده است جلوگيري کنيم.

اوبالیت به بو
یک شنبه 03 شهریور 1387, 20:20 عصر
دو راه وجود داره:

استفاده از كليد
جستجو
كليد رو كه در بانكتون مشخص كردين، در برنامه خودتون يكبار ركورد تكراري وارد كنيد تا برنامه پيغام خطا صادر بكنه و با دستور On Error كد خطا رو نگه داريد و دوباره دفعه بعد با دستور On Error تعيين كنيد كه اگر خطاي برنامه برابر كد خطايي بود كه قبلاً نگه داشتين بود پيغام عدم ورود ركورد تكراري صادر بكنه.
جستجو هم اين هستش كه 1 بار از ابتدا تا انتها جدول رو برنامه جستجو بكنه اگر چيزي شبيه اون پيدا نكرد ركورد جديد رو ثبت بكنه.

alavi1451
یک شنبه 03 شهریور 1387, 23:10 عصر
با تشکر اگر ممکن است روش جستجو را کامل توضيح دهيد

maryamb
دوشنبه 04 شهریور 1387, 11:20 صبح
جستجو هم اين هستش كه 1 بار از ابتدا تا انتها جدول رو برنامه جستجو بكنه اگر چيزي شبيه اون پيدا نكرد ركورد جديد رو ثبت بكنه.
من هم از همین روش در برنامم استفاده می کنم .
حالا یه سوال داشتم و اون اینکه آیا سرعت برنامه در این روش پایین نمیاد ؟
این هم روش جستجو :

Adodc1.Recordset.Filter = "darscd = '" & txtcode.Text & "'"
If Adodc1.Recordset.RecordCount > 0 Then
MsgBox " این رکورد قبلا وارد شده است.", vbExclamation
txtcode.Text = ""
txtname.Text = ""
txtquantity.Text = ""
txtcode.SetFocus
GoTo m
End If
'********

Mohya_z332
شنبه 16 شهریور 1387, 15:52 عصر
با این کد بنویس اگه نوع داده اون integer هست
text3 عددی هست که میخوایم ببینیم تکرارش هست یا نه
Data1.Recordset.FindFirst "eshteraknum like""" & (Text4.Text) & """"
Do While Data1.Recordset.NoMatch = False
Data1.Recordset.FindNext "eshteraknum Like""" & (Text4.Text) & """"
Loop
If Text4.Text = Text3.Text Then
intmsg = MsgBox("عدد تکراری است", vbOKOnly + vbExclamation, "ÔãÇÑå ÇÔÊÑǘ")

Mohya_z332
شنبه 16 شهریور 1387, 15:53 عصر
البته کد بالا شاید روی داده های غیر integer هم کار کنه

Mohya_z332
شنبه 16 شهریور 1387, 15:56 عصر
این هم واسه داده ها یا فیلدهایی که integer تعریف نشدند
Data1.Recordset.FindFirst "eshteraknum = '" & (Text4.Text) & "'"
Do While Data1.Recordset.NoMatch = False
Data1.Recordset.FindNext "eshteraknum = '" & (Text4.Text) & "'"
Loop
If Text4.Text = Text3.Text Then
intmsg = MsgBox("ÔãÇÑå ÇÔÊÑǘ ʘÑÇÑí ÇÓÊ", vbOKOnly + vbExclamation, "ÔãÇÑå ÇÔÊÑǘ")

mehdi.mousavi
شنبه 16 شهریور 1387, 16:00 عصر
با تشکر اگر ممکن است روش جستجو را کامل توضيح دهيد

سلام.
این روش رو نادیده بگیرید، چون هیچ تضمینی در این روش وجود نداره که شما رکورد تکراری در بانک نداشته باشید. مگر اینه برنامه Single User باشه که خوب، میتونید این راه رو پی بگیرید و ... (که من در کل توصیه نمیکنم).

اما اگر برنامه ممکنه توسط بیش از یک کاربر بطور همزمان استفاده بشه، دیگه تضمینی در کار نیست. فرض کنید که

1. کاربر اول رکورد XX رو میخواد وارد کنه.
2. پس کاربر اول میره میبینه XX در بانک نیست و تصمیم میگیره که به بانک اضافه کنتش.
3. در همین فاصله، کاربر دوم هم رکورد XX رو میخواد اضافه کنه.
4. کاربر دوم هم وقتی میبینه رکورد در بانک نیست، تصمیم میگیره اونو Insert کنه.
5. رکورد XX توسط کاربر دوم به بانک اضافه میشه.
6. کاربر اول هم میره که رکورد رو اضافه کنه، چون چک کرده بود، دید نیست. اما قبلا اضافه کردن، کاربر دوم پیش دستی کرده و رکورد رو اضافه کرده.

نتیجه: شما در بانک دو رکورد XX خواهید داشت.

راه صحیح استفاده از Index ها و Constraint ها در بانک بمنظور کنترل این مساله در سطح بانک هستش. البته روش پیشنهاد شده در صورتیکه Pessimistic کار کنید، جواب میده، اما اینم بدیهایی داره که از حئصله این متن خارجه.