PDA

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



nabeel
سه شنبه 13 بهمن 1388, 15:39 عصر
ضمن سلام

چندين باره هستش كه سئوالي مبني بر اجازه ذخيره سازي يك ركورد تنها پس از تاييد ، پرسيده ميشه كه راه حلهاي ارائه شده اگر نگيم اشتباه وليكن يا دشوار ( در جايي كه نيازي نيست ) و يا ناقص هستند به طور مثال به دو نمونه از توصيه ها اشاره ميكنم :

توصيه يك :


فرم به صورت Unbound طراحي بشه و احتمالاً از طريق ADO و يا DAO اين كار به انجام برسه .
نيازي به اعمال اين روش پر دردسر نيست ، زمانتون رو صرف انجام اينكار نكنيد .
توصيه دو :

در رویداد on exit آخرین شی روی فرم نیز میشه .....
اين روش ناقصه ، الزامي نداره كه كاربر رويداد On Exit رو اون هم در داخل آخرين كنترل صادر كرده باشه
كاربر ممكنه تنها يك فيلد رو ويرايش كرده باشه و حالا بخواد به ركورد بعدي بره ، در اين حالت اين روش جوابگو نيست .

راه حل موثر ساده هستش :
هر ركورد ( به عنوان حامل كليه فيلدها ) رويدادي رو پشتيباني ميكنه با عنوان Befor Update كه رويداد مناسبي جهت به دام انداختن و رسيدن به هدف مورد نظره
اين رويداد با ايجاد و يا تغيير هر ركورد صادر ميشه و قبل از خروج به ركورد بعدي صادر شده و در همينجاست كه شما ميتونيد كد خودتون رو جاري كنيد ، به طور مثال اين كد رو مورد استفاده قرار بديد .

Private Sub Form_BeforeUpdate(Cancel As Integer)
If MsgBox("Do you want to save this record ?", vbQuestion + vbYesNo) = vbNo Then
Cancel = True
SendKeys "{ESC}"
End If
End Sub

بر اساس اين رويداد در صورت عدم تاييد رويداد ذخيره سازي از سوي كاربر توسط دستور Cancel = True عمليات ذخيره سازي ( ويا در اينجا همان Update ) لغو شده و توسط دستور تكميلي SendKeys اطلاعات به قبل از ايجاد و يا تغيير ، برگردانده ميشود .

دستور فوق ساده ترين ساختار اجرايي جهت انجام اين عمليات رو در برميگيره و فاقد پيچيدگي غير الزام آور دو فرآيند قبليه .

dadsara
چهارشنبه 14 بهمن 1388, 10:57 صبح
سلام
دوست عزیز چگونه می توان همین عمل را برای وقتی که فرم مستقیما به جدول متصل نیست اجرا نمود

nabeel
چهارشنبه 14 بهمن 1388, 11:15 صبح
سلام

بسته به اینکه از DAO و یا ADO ( ویا دیگر تکنیکهای ارتباطی) استفاده کرده باشید نوع کد هم متفاوته که قبلاً در خصوص نحوه ذخیره سازی با این تکنیکها مطالبی درج شده ولیکن ساختار شرط مشابه همون کد بالایی هستش
یعنی شما دستورات ذخیره سازی رو در داخل یک شرط قرار میدید , در صورت تایید , کدهای مربوط به ذخیره سازی اجرا میشه و در غیر اینصورت هم ...

به نظر میاد که نیازی به توضیح بیشتر نباشه .

موفق باشید

abas1388
چهارشنبه 14 بهمن 1388, 12:44 عصر
سلام

بسته به اینکه از DAO و یا ADO ( ویا دیگر تکنیکهای ارتباطی) استفاده کرده باشید نوع کد هم متفاوته که قبلاً در خصوص نحوه ذخیره سازی با این تکنیکها مطالبی درج شده ولیکن ساختار شرط مشابه همون کد بالایی هستش
یعنی شما دستورات ذخیره سازی رو در داخل یک شرط قرار میدید , در صورت تایید , کدهای مربوط به ذخیره سازی اجرا میشه و در غیر اینصورت هم ...

به نظر میاد که نیازی به توضیح بیشتر نباشه .

موفق باشید


سلام
در هر حال چه با استفاده از تكنيك DAO و یا ADO ، براي اينكه تائيد ذخيره سازي از كاربر اخذ شود بايد فرم در حالت unbound باشد . چرا كه وقتي فرم در حالت bound باشد و ديتاسورس فرم يك جدول يا كوئري باشد و كنترل سورس فيلد هاي فرم هم مساوي فيلد هاي ديتابيس مربوطه باشد ، ركوردها بصورت اتوماتيك ذخيره ميشوند .
موفق باشيد

nabeel
چهارشنبه 14 بهمن 1388, 14:02 عصر
سلام


در هر حال چه با استفاده از تکنیک DAO و یا ADO ، برای اینکه تائید ذخیره سازی از کاربر اخذ شود باید فرم در حالت unbound باشد .

تصور میکنم سو تفاهم شده , پاسخ ارائه شده در پست شماره 3 , در جواب دوستمون Dadsara بود که :



دوست عزیز چگونه می توان همین عمل را برای وقتی که فرم مستقیما به جدول متصل نیست اجرا نمود


ولیکن


چرا که وقتی فرم در حالت bound باشد و دیتاسورس فرم یک جدول یا کوئری باشد و کنترل سورس فیلد های فرم هم مساوی فیلد های دیتابیس مربوطه باشد ، رکوردها بصورت اتوماتیک ذخیره میشوند

نظر شما رو به پست شماره 1 جلب میکنم , اون کد مربوط به حالتیه که فرم به صورت Bound هستش و جوابگوی مشکله .

اگر نکته ابهامی وجود داره بفرمایید تا توضیح لازم داده بشه .

kamrankam
چهارشنبه 14 بهمن 1388, 22:05 عصر
سلام

از Me.Undo هم می شود استفاده کرد .



If MsgBox("Do you want to save this record ? ", vbQuestion + vbYesNo) = vbNo Then
Me.Undo
End If