با سلام
چگونه در ويژوال بيسيک از ثبت رکورد تکراري در بانک اطلاعاتي که در اکسس ايجاد شده است جلوگيري کنيم.
با سلام
چگونه در ويژوال بيسيک از ثبت رکورد تکراري در بانک اطلاعاتي که در اکسس ايجاد شده است جلوگيري کنيم.
دو راه وجود داره:
كليد رو كه در بانكتون مشخص كردين، در برنامه خودتون يكبار ركورد تكراري وارد كنيد تا برنامه پيغام خطا صادر بكنه و با دستور On Error كد خطا رو نگه داريد و دوباره دفعه بعد با دستور On Error تعيين كنيد كه اگر خطاي برنامه برابر كد خطايي بود كه قبلاً نگه داشتين بود پيغام عدم ورود ركورد تكراري صادر بكنه.
- استفاده از كليد
- جستجو
جستجو هم اين هستش كه 1 بار از ابتدا تا انتها جدول رو برنامه جستجو بكنه اگر چيزي شبيه اون پيدا نكرد ركورد جديد رو ثبت بكنه.
با تشکر اگر ممکن است روش جستجو را کامل توضيح دهيد
من هم از همین روش در برنامم استفاده می کنم .جستجو هم اين هستش كه 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
'********
با این کد بنویس اگه نوع داده اون 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, "ÔãÇÑå ÇÔÊÑǘ")
البته کد بالا شاید روی داده های غیر integer هم کار کنه
این هم واسه داده ها یا فیلدهایی که 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, "ÔãÇÑå ÇÔÊÑǘ")
سلام.
این روش رو نادیده بگیرید، چون هیچ تضمینی در این روش وجود نداره که شما رکورد تکراری در بانک نداشته باشید. مگر اینه برنامه Single User باشه که خوب، میتونید این راه رو پی بگیرید و ... (که من در کل توصیه نمیکنم).
اما اگر برنامه ممکنه توسط بیش از یک کاربر بطور همزمان استفاده بشه، دیگه تضمینی در کار نیست. فرض کنید که
1. کاربر اول رکورد XX رو میخواد وارد کنه.
2. پس کاربر اول میره میبینه XX در بانک نیست و تصمیم میگیره که به بانک اضافه کنتش.
3. در همین فاصله، کاربر دوم هم رکورد XX رو میخواد اضافه کنه.
4. کاربر دوم هم وقتی میبینه رکورد در بانک نیست، تصمیم میگیره اونو Insert کنه.
5. رکورد XX توسط کاربر دوم به بانک اضافه میشه.
6. کاربر اول هم میره که رکورد رو اضافه کنه، چون چک کرده بود، دید نیست. اما قبلا اضافه کردن، کاربر دوم پیش دستی کرده و رکورد رو اضافه کرده.
نتیجه: شما در بانک دو رکورد XX خواهید داشت.
راه صحیح استفاده از Index ها و Constraint ها در بانک بمنظور کنترل این مساله در سطح بانک هستش. البته روش پیشنهاد شده در صورتیکه Pessimistic کار کنید، جواب میده، اما اینم بدیهایی داره که از حئصله این متن خارجه.