PDA

View Full Version : سوال: ایجاد حلقه تکرار جهت چک کردن کلید اصلی قبل از ذخیره شدن



Hermidas
سه شنبه 08 خرداد 1397, 01:30 صبح
سلام
دوستان یک فایل اکسس دارم که کلید ذخیره رو کد نویسی کردم و کمبو باکس ها و تکست باکس ها رو بصورت آنباند توی فرم گذاشتم . می خواستم قبل از ذخیره شدن کلید اصلی رو چک کنم که تکراری نباشه ولی حلقه تکرار چک کردن کلید اصلی رو بلد نیستم . فایل مورد نظر رو ضمیمه می کنم لطفا برام انجام بدین تا یاد بگیرم ممنونم.

Mehr@ban
سه شنبه 08 خرداد 1397, 16:19 عصر
سلام

استفاده از حلقه هم روشی هست
ولی استفاده از دستور dlookup هم میتونه در موضوع شما بکارگیری بشه

Hermidas
چهارشنبه 09 خرداد 1397, 00:36 صبح
ببخشید میشه بگید چطوری از dlookup استفاده کنم اگر ممکنه برام می نویسید

Mehr@ban
چهارشنبه 09 خرداد 1397, 11:13 صبح
If Not Me.mali_id_man = "0" Then
Dim var
var = DLookup("mali_id_man", "tbl_mali", "mali_id_man = '" & [mali_id_man] & "'")
If Not IsNull(var) Or var <> "" Then
MsgBox "Tekrari"
Cancel = True
End If
Exit Sub
End If

این یک نمونه هست که در برنامه خودم دارم ازش استفاده میکنم که تقدیم شما

mazoolagh
چهارشنبه 09 خرداد 1397, 11:27 صبح
شما در طراحی جدول تقریبا درست عمل کردین، یعنی Primary key رو هر سه فیلد مورد نظر تعریف کردین.
اینکه میگم تقریبا بخاطر این هست که فراموش کردین جلوی وارد شدن مقدار null برای این فیلدها رو بگیرین - یعنی باید allow zero length هر سه فیلد رو no بگذارین.

خب شما که این نکته رو میدونستین پس باید این رو هم به یاد میداشتین که اکسس در کلیه عملیات insert و update خودش یکتا بودن PK رو بررسی میکنه و در صورت تکراری بودن (و موارد دیگه) خطا صادر میکنه. اینکه عملیات insert/update از طریق فرم bound یا unbound یا query یا هر روش دیگه انجام بشه تفاوتی نمیکنه.

کافی هست یک روتین بررسی خطا به کدتون اضافه کنین - همین!

mazoolagh
چهارشنبه 09 خرداد 1397, 11:36 صبح
Private Sub Command15_Click()
On Error GoTo ERROR_HANDLER
Dim V As Variant
...
...
str_location_flt.Value = Empty
str_code_process_source_flt.SetFocus
Exit Sub
ERROR_HANDLER:
Select Case Err.Number
Case 3022
Err.Clear
source_docs_query_subform.Form.Undo
str_code_process_source_flt.SetFocus
V = MsgBox("DUPLICATE RECORD")
Case Else
source_docs_query_subform.Form.Undo
str_code_process_source_flt.SetFocus
V = MsgBox(Err.Description, , Err.Number)
Err.Clear
End Select
End Sub

Hermidas
شنبه 12 خرداد 1397, 01:04 صبح
جناب آقای Mehr@banخیلی واضح و خوبه ولی cancel = true نفهمیدم برای چی بکار بردین شاید توی برنامه ی خودتون کاربرد داره ولی ممنونم از شما دوست عزیز. بکارش می گیرم اگه به مشکل برخوردم دوباره مزاحمتون می شم

Hermidas
شنبه 12 خرداد 1397, 01:24 صبح
شما در طراحی جدول تقریبا درست عمل کردین، یعنی Primary key رو هر سه فیلد مورد نظر تعریف کردین.
اینکه میگم تقریبا بخاطر این هست که فراموش کردین جلوی وارد شدن مقدار null برای این فیلدها رو بگیرین - یعنی باید allow zero length هر سه فیلد رو no بگذارین.

خب شما که این نکته رو میدونستین پس باید این رو هم به یاد میداشتین که اکسس در کلیه عملیات insert و update خودش یکتا بودن PK رو بررسی میکنه و در صورت تکراری بودن (و موارد دیگه) خطا صادر میکنه. اینکه عملیات insert/update از طریق فرم bound یا unbound یا query یا هر روش دیگه انجام بشه تفاوتی نمیکنه.

کافی هست یک روتین بررسی خطا به کدتون اضافه کنین - همین!
حقیقت امر اینکه من برنامه رو کامل نذاشتم و فقط بخشی رو که مشکل داشتم دوباره ساختم و گذاشتم خوب توی طراحی جدول من اگه خصوصیت allow zero length رو no نذاشتم بخاطر اینکه کاربر فقط میتونه از طریق فرم اطلاعات رو وارد کنه و اونجا اگر مقدار این فیلد هار رو null بذاره برنامه کار ذخیره کردن رو انجام نمیده با توجه به کدی که توی رویداد ذخیره نوشتم .
خوب من به اون نکته که اشاره کردین اکسس پریمری کی (pk) رو برسی می کنه واقفم فقط موضوع اینه که وقتی با کد کار ذخیره فیلد ها رو می کنم می خوام از پیغام خطای pk جلوگیری کنم و به کاربر تکراری بودن رو اعلام کنم و exit sub رو اجرا کنم و خطای مورد نظر از دید کاربر دیده نشه

Hermidas
شنبه 12 خرداد 1397, 01:49 صبح
Private Sub Command15_Click()
On Error GoTo ERROR_HANDLER
Dim V As Variant
...
...
str_location_flt.Value = Empty
str_code_process_source_flt.SetFocus
Exit Sub
ERROR_HANDLER:
Select Case Err.Number
Case 3022
Err.Clear
source_docs_query_subform.Form.Undo
str_code_process_source_flt.SetFocus
V = MsgBox("DUPLICATE RECORD")
Case Else
source_docs_query_subform.Form.Undo
str_code_process_source_flt.SetFocus
V = MsgBox(Err.Description, , Err.Number)
Err.Clear
End Select
End Sub

کدی که برام گذاشتین خیلی تحلییلش برام سخته چون من زیاد حرفه ای نیستم و نمیدونم چکار میکنه اون چند تا نقطه منظورتون اینه که کدهای خودم باید اونجا باشن !!! ولی خیلی برام جالبه :
روی هر اروری(on error) میره به خطی که نامش error_HANDLER اونجا از حلقه ی case استفاده کردین و ارور 3022 رو که مربوط به pk هست اگر باشه از subform اندو می کنه و متغییر رشته ای رو با مسیج خطا در تکراری بودن پر میکنه و در غیر اینصورت چرا در case else دوباره کار اندو کردن در سابفرم رو انجام میده و متغییر رشته ای v رو با چه مسیجی پر میکنه مابقیش رو نفهمیدم
در ضمن من مشکلات دیگه ای هم با err.description توی برنامم دارم اگر برنامه رو آپلود کنم کمکم می کنید بهبوش بدم .
خیلی ممنونم که وقت میذارید

Hermidas
یک شنبه 13 خرداد 1397, 00:44 صبح
Private Sub Command15_Click()
On Error GoTo ERROR_HANDLER
Dim V As Variant
...
...
str_location_flt.Value = Empty
str_code_process_source_flt.SetFocus
Exit Sub
ERROR_HANDLER:
Select Case Err.Number
Case 3022
Err.Clear
source_docs_query_subform.Form.Undo
str_code_process_source_flt.SetFocus
V = MsgBox("DUPLICATE RECORD")
Case Else
source_docs_query_subform.Form.Undo
str_code_process_source_flt.SetFocus
V = MsgBox(Err.Description, , Err.Number)
Err.Clear
End Select
End Sub

از این کد بخاطرcase else کامپایلر خطا میده عکس ضمیمه رو لطفا نگاه کنید
148308

AbbasSediqi
یک شنبه 13 خرداد 1397, 02:30 صبح
با سلام خدمت همه دوستان

دوست گرامی بهترین روش استفاده از DataMacro هستش

آموزشش رو قبلا قراردادم

البته با توضیحات دوست گرامی جناب mazoolagh تکمیل تر شد

از این لینک میتونید آموزش رو مطالعه کنید

http://barnamenevis.org/showthread.php?545694-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-DataMacro



یا حق

Hermidas
دوشنبه 14 خرداد 1397, 17:21 عصر
با سلام خدمت همه دوستان

دوست گرامی بهترین روش استفاده از DataMacro هستش

آموزشش رو قبلا قراردادم

البته با توضیحات دوست گرامی جناب mazoolagh تکمیل تر شد

از این لینک میتونید آموزش رو مطالعه کنید

http://barnamenevis.org/showthread.php?545694-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-DataMacro



یا حق
ممنونم از شما ولی باید بگم که کارم رو بسیار سخت تر کرد استفاده از دیتا ماکرو در ضمن باز هم جواب نگرفتم یعنی هر سه نفر از دوستانی که راهنمایی کردن هر سه راه رو رفتم ولی نتیجه نگرفتم امیدوارم کسی پیدا بشه و با نوشتن یک حلقه تکرار که از اول رکوردها رو بررسی کنه و اگر کلید اصلی تکراری نباشه کار ذخیره رو انجام بده ممنون میشم. از مدیر بخش می خوام که کمکم کنه چون واقعا زمانم رو از دست میدم ولی هیچ نتیجه ای نمی گیرم .اگر خواستین کل فایل رو هم در اختیارتون میگذارم تا ببینین مشکل من از کجاست . یا طراحی بلد نیستم یا کدنویسی نمیدونم و شایدم خیلی خیلی مبتدی هستم که با این راهنمایی ها نمی تونم جواب بگیرم.

Mehr@ban
دوشنبه 14 خرداد 1397, 18:13 عصر
جناب آقای Mehr@ban

خیلی واضح و خوبه ولی cancel = true نفهمیدم برای چی بکار بردین شاید توی برنامه ی خودتون کاربرد داره ولی ممنونم از شما دوست عزیز. بکارش می گیرم اگه به مشکل برخوردم دوباره مزاحمتون می شم


سلام از تاخیر در پاسخگویی عذرخواهی میکنم
این کد مربوط به باقی کدهای استفاده در صفحه من هست و شما میتونید اونو حذف کنید و عملکرد مناسب خودتون رو بنویسید که خللی در کارتون پیش نیاد

Hermidas
چهارشنبه 16 خرداد 1397, 04:07 صبح
سلام از تاخیر در پاسخگویی عذرخواهی میکنم
این کد مربوط به باقی کدهای استفاده در صفحه من هست و شما میتونید اونو حذف کنید و عملکرد مناسب خودتون رو بنویسید که خللی در کارتون پیش نیاد
آقا واقعا دمت گرم بالاخره جواب گرفتم از کد شما که ساده ترین شکل ممکن بود. با تشکر فراوان از شما و تمامی دوستانی که راهنمایی کردن .

Mehr@ban
چهارشنبه 16 خرداد 1397, 12:45 عصر
آقا واقعا دمت گرم بالاخره جواب گرفتم از کد شما که ساده ترین شکل ممکن بود. با تشکر فراوان از شما و تمامی دوستانی که راهنمایی کردن .

خواهش میکنم دوست عزیز
ولی به شخصه راهکار دوست عزیز جناب آقای mazoolagh رو میپسندم هرچند که راهکار جناب آقای صدیقی هم اساسی هست و در صورت پیاده سازی هرچندتا فرمی هم که ایجاد بکنید، چون نهایتا باید اطلاعات در جدول بشینه، نیازی به کدنویسی مجدد نیست!
و اما پیشنهاد mazoolagh عزیز هم اصولی هست.
شما یک فیلد از جدول رو به حالت کلید قرار دادین ولی الزامی نکردین!
اگر الزامی بشه و کاربر از اون چشم پوشی کنه و اطلاعاتی رو واردش نکنه، قطعا با نمایش خطایی، روند تکمیل فرم و اطلاعات انجام نمیشه و در نهایتا طبق طراحیی که شما در فرمتون انجام دادین هیچ رکوردی ثبت نمیشه.
حالا نوبت به مدیریت اون خطا بود که برای کاربر بهینه سازی بشه که کد ارائه شده توسط mazoolagh دقیقا همین کار رو میکرد.

بازم خوشحالم که به نتیجه رسیدین

Hermidas
پنج شنبه 24 خرداد 1397, 01:49 صبح
خواهش میکنم دوست عزیز
ولی به شخصه راهکار دوست عزیز جناب آقای mazoolagh رو میپسندم هرچند که راهکار جناب آقای صدیقی هم اساسی هست و در صورت پیاده سازی هرچندتا فرمی هم که ایجاد بکنید، چون نهایتا باید اطلاعات در جدول بشینه، نیازی به کدنویسی مجدد نیست!
و اما پیشنهاد mazoolagh عزیز هم اصولی هست.
شما یک فیلد از جدول رو به حالت کلید قرار دادین ولی الزامی نکردین!
اگر الزامی بشه و کاربر از اون چشم پوشی کنه و اطلاعاتی رو واردش نکنه، قطعا با نمایش خطایی، روند تکمیل فرم و اطلاعات انجام نمیشه و در نهایتا طبق طراحیی که شما در فرمتون انجام دادین هیچ رکوردی ثبت نمیشه.
حالا نوبت به مدیریت اون خطا بود که برای کاربر بهینه سازی بشه که کد ارائه شده توسط mazoolagh دقیقا همین کار رو میکرد.

بازم خوشحالم که به نتیجه رسیدین

منم از پیشنهاد دوست عزیزمون جناب آقای mazoolagh خیلی خوشم اومد و خیلی راضی کننده بود ولی متاسفانه در اجرا نمیدونم چرا به مشکل برخوردم . چون توی این پروژه چند مشکل کوچک دیگه هم دارم که فکر میکردم با کد ایشون همشون رو بشه رفع رجوع کرد ولی متاسفانه با خطای کامپایلر مواجه شدم و نتونستم کد ایشون رو بکار بگیرم . البته راه کار جناب صدیقی رو چون برای اولین بار دیدم یک کمی برام مشکل بود ولی فکر می کنم راهکار ایشون خیلی اصولی و کلی تر بود و میشه در مورد هر پروژه ای با دست باز عمل کرد ولی متاسفانه من در اون مورد هم به خطا بر خوردم ولی فکر کنم مشکل از اجرای خودم باشه و باید روی هر دو مورد بیشتر کار کنم تا به نتیجه برسم.

در هر صورت خیلی چیز ها یاد گرفتم ممنوم از هر سه بزرگوار
:تشویق::تشویق::تشویق: