PDA

View Full Version : جلوگیری از ورود چند فیلد تکراری در یک table توسط پیغام خطا



jafarjoon
یک شنبه 12 دی 1389, 13:35 عصر
با سلام خدمت دوستان و اساتید محترم
مشکل من در اکسس جلوگیری از ورود چند فیلد تکراری است
من یه دیتا بیس ساختم که توش یه جدول با 81000 رکورد ثبت شده وجود دارد البته باید بگم که از foxpro به اکسس انتقال دادم اما حالا برای ورود اطلاعات در فرم اولیه می خوام 4 فیلد( ایستگاه،روز،ماه و سال )با هم پس از ثبت اگه با رکوردهای دیگر در جدول یکسان بود پیغام خطا بدهد و اگر تا الان هم ثبت شده سرچ و بعد پاک کند
با تشکر
خواهشمند است راهنمایی کنید

mohamad goodarzi
یک شنبه 12 دی 1389, 17:02 عصر
باسلام
براي جلوگيري ازورودفيلد تكراري مي بايست خاصيت Indexed رابرابر ( Yes (No Duplicates قرار دهيد چنانچه اطلاعات تكراري در جدول وجود داشته باشد تغيير نمي كند كه باكوئري اطلاعات تكراري را مشخص و پاك كنيد و خاصيت را تغيير دهيدولي اگرميخواهيد باهمان اطلاعات جدول ازورود اطلاعات تكراري جلوگيري و تكرار مشخص گردد من خودم از دستور پيوست در BeforeUpdate فيلد استفاده مي كنم (فقط جاي فيلد ها عوض كنيد).
مطمنا" اساتيد راهاي بهتري ازاين مي دانند

jafarjoon
سه شنبه 14 دی 1389, 13:27 عصر
باتشکر از جوابتان فقط خواستم بدونم این کد برای چند فیلد هم جواب می دهد که با هم با رکوردهای دیگر برابر باشند در حین ورود اطلاعات خطا بدهد خیلی ممنونم

mohamad goodarzi
سه شنبه 14 دی 1389, 13:59 عصر
اگراطلاعات چندفيلد به يكباره باهم واردجدول نمي شوند (پيس اطلاعات)شما مي توانيد كد رادر فيلد آخرقراردهيدو هرتعداد فيلد كه ميخواهيد انتخاب و كنترل كنيد .

jafarjoon
چهارشنبه 06 بهمن 1389, 03:12 صبح
آقای گودرزی عزیز متشکرم از توجه شما
بنده منظور شما رو از جمله آخر نگرفتم یا شاید من خوب نتونستم مشکلم را بیان کنم البته این مشکل فکر کنم مشکل خیلی از دوستان باشه ببینید من در جدول حدود 10 فیلد دارم و می خواهم هنگام ورود اطلاعات اگر 4 فیلد مورد نظر مثل نام و نام خانوادگی و کد ملی و تاریخ تولد در یک رکورد با همین 4 فیلد در رکوردهای قبلی باهم برابر بود خطا بگیره نه یک فیلد در رکورد جدید با یک فیلد در رکورد قبلی و در ضمن پیغام خطا را در هنگام exit از فیلد چهارم بده خیلی ممنون میشم از همکاریتون در حل این مشکل

amirzazadeh
چهارشنبه 06 بهمن 1389, 08:24 صبح
سلام
براي اينكار شما ميتونيد فيلدهاي مورد نظر رو در نماي طراحي جدولتون انتخاب و هر چهار تا رو باهم به عنوان كليد اصلي(primary key) انتخاب كنيد.
.............................
موفق باشيد

RESMAILY
چهارشنبه 06 بهمن 1389, 11:27 صبح
به نام خدا
با سلام. مشاهده شده كه تعداد زياد indexمشكلاتي را در جدول ايجاد مي كند. توصيه مي شود از روشي مشابه روش ذيل استفاده گردد

strFilter = "Name='" & strName & "' and family='" & atrFamil & "' And ..."
strRecord = DLookup("Id", "MyTable", strFilter)
If IsNull(strReord) Then 'ركورد تكراري نيست

shayegh2010
دوشنبه 07 مهر 1393, 17:22 عصر
به نام خدا
با سلام. مشاهده شده كه تعداد زياد indexمشكلاتي را در جدول ايجاد مي كند. توصيه مي شود از روشي مشابه روش ذيل استفاده گردد

strFilter = "Name='" & strName & "' and family='" & atrFamil & "' And ..."
strRecord = DLookup("Id", "MyTable", strFilter)
If IsNull(strReord) Then 'ركورد تكراري نيست
این کد را کجا باید وارد کرد ؟
ببخشید این سوال را میپرسم

mohamad goodarzi
دوشنبه 07 مهر 1393, 18:18 عصر
با سلام
نمونه

m.elmi
دوشنبه 07 مهر 1393, 19:02 عصر
سلام
براي اينكار شما ميتونيد فيلدهاي مورد نظر رو در نماي طراحي جدولتون انتخاب و هر چهار تا رو باهم به عنوان كليد اصلي(primary key) انتخاب كنيد.

فكر نمي كنم روش بهتر وجود داشته باشه. بخصوص وقتي ركوردها خيلي زياد باشه- فيلد كليدي براي همين منظوره.

Ali_Fallah
دوشنبه 07 مهر 1393, 21:03 عصر
با سلام
یک ایده ، هر چند ممکنه به جهت افزایش حجم فایل معقول به نظر نرسه ...
124038

m.elmi
سه شنبه 08 مهر 1393, 07:03 صبح
علی ترکیب فیلدها و گذاشتن شون توی یه فیلد ایندکس شده (و یونیک) برای کنترل عدم تکرار، ایدۀ خوبیه منتها بجای انجام ترکیب با Lost Focus اینکار رو باید با AfterUpdate اون کنترل انجام بدی:

Private Sub id_AfterUpdate()
tekrar = id & nam & fam
End Sub

alireza1382
یک شنبه 28 تیر 1394, 15:25 عصر
سلام یک جایی دیدم این کد را گذاشته بود برای رویداد afterupdate تکس باکس کلید اصلی و وقتی که شما ابتدا کلید اصلی را تکراری وارد کنید پیغام خطا را میده ولی یه ایراد داره که اگر توی فرم تکس باکس دیگری وجود داشته باشه که خاصیت requst فیلد مربوط به آن yes باشد ایراد میگیره

Private Sub id_AfterUpdate()
'idهمان کليد اصلي است
On Error GoTo 10
DoCmd.RunCommand acCmdSaveRecord
Exit Sub
10:
'شماره خطاي ورود اطلاعات تکراري 3022 است
If err.Number = 3022 Then
MsgBox "ورود شماره پرسنلي تکراري" & vbNewLine & "لطفا اطلاعات وارده را اصلاح کنيد.", vbExclamation + vbMsgBoxRtlReading + vbMsgBoxRight
'براي اينکه پيغام خطاي سيستم برداشته شود
DoCmd.RunCommand acCmdUndo
End If
End Sub

alireza1382
یک شنبه 28 تیر 1394, 19:50 عصر
سلام من یک جدول به نام listkol1 داشتم که یک فیلد کلید به نام id از نوع متنی داشت یک فرم داشتم که یک تکس باکس به نام id داشت با کد زیر هر وقت در تکس باکس id شماره تکراری وارد می کردم همان اول چک می کرد و پیغام می داد امیدوارم مفید باشه ضمنا سینتکس تابع dolookup برای مقادیری عددی یه کم با متن تفاوت داره اگر id از نوع عدد بود مثل این میشه که تو پرانتزه([id] =" & Me.id ")


Private Sub id_AfterUpdate()
result = DLookup("[id]", "listkol1", "[id] ='" & Me.id & "'")
If Not IsNull(result) Then
MsgBox "ورود شماره پرسنلي تکراري" & vbNewLine & "لطفا اطلاعات وارده را اصلاح کنيد.", vbExclamation + vbMsgBoxRtlReading + vbMsgBoxRight
DoCmd.RunCommand acCmdUndo
id.SetFocus
End If
End Sub