PDA

View Full Version : جلوگیری از درج اطلاعات تکراری با کلید و بدون کلید



davoodmz
دوشنبه 12 تیر 1385, 12:51 عصر
با سلام به دوستان
جلوگیری از وارد کردن فیلد تکراری قبل از ذخیره رکورد به روشهای ذیل
1- فیلد کلید اصلی نیست؟
2- با دستور LOCATE در رویداد BEFORPOST با خطا مواجه می شود و امکان آن نیست که جستجو کند چون در مد iNSERT می‌باشد.
3- اگر هم کلید اصلی باشد روش هندل کردن خطا در کدام رویداد نوشته شود
4- کد بکار برده شده با LOCATE به شرح ذیل می باشد:
[LEFT]var
InputString: string;
opts : TLocateOptions;
begin
opts := [loCaseInsensitive];
if Q_andicator.Locate('NAMEFILDE','DBEDIT1.TEXT' , opts)
then begin
END;
لطفاً راهنمایی کنید . ضمناً من دیتابیسم با ACCESSS می باشد.
با تشکر داود

Mahyaa
دوشنبه 12 تیر 1385, 13:12 عصر
با دستور LOCATE در رویداد BEFORPOST با خطا مواجه می شود و امکان آن نیست که جستجو کند چون در مد iNSERT می‌باشد.


شما میتونید عمل جستجو رو با DataSet دیگه ای انجام بدید . یا مثلا با یک Query .

ali_divsalar
دوشنبه 12 تیر 1385, 13:51 عصر
شما یه adoquery تو فرمتون بزارید و اونو بصورت یه کپی از table مورد نظرتون در نظربگیرید.
بطوری که در هر لحظه حاوی آخرین اطلاعات ثبت شده باشه. قبل از post می تونید locate رو روی اون اجرا کنید.من برای تکراری نبودن کدها(که دستی وارد شده اند) بعد از رویداد exit مربوط به editbox مربوط این query رو چک می کنم و راحت جواب می گیرم

B_YAGHOBI
سه شنبه 13 تیر 1385, 08:11 صبح
سوال بانک اطلاعاتی در قسمت بانک اطلاعات

قابل توجه مدیران عزیز

davoodmz
پنج شنبه 15 تیر 1385, 11:57 صبح
آقای یعقوبی
شما خودتونا ناراحت نکنید ببخشید البته
اگر میدانید لطفاً جواب بدهید.
باتشکر
داود

با سلام
شما دوست عزیز گفتید در Onexit شاید کاربرد بعد از وارد کردن دکمه ذخیره را زد
این به نظرم منطقی نیست باید در beforpost باشد
لطفاً راهنمایی کنید.
ضمناً راه حل mahyaa درست است ولی تعداد دیتا ست ها زیاد میشود

Mahyaa
پنج شنبه 15 تیر 1385, 17:01 عصر
ولی تعداد دیتا ست ها زیاد میشود

من معمولا یک Query را فقط برای این قبیل کارها در نظرمیگیرم .

مثلا یک TAdoQuery به Datamodule اضافه میکنیم و مقدار ، Sql Text اون رو Runtime میدیم و همه جا ازش استفاده میکنیم .

ghabil
پنج شنبه 15 تیر 1385, 17:32 عصر
من اینوقبلا با کد براتون گفته بودم که راحش همون کنترل خطاهاست کافیه دستور Post رو در یک Try,Except بزارید .بهترین و سریعترین روش هست.

saeed_d
جمعه 16 تیر 1385, 15:50 عصر
شما دوست عزیز گفتید در Onexit شاید کاربرد بعد از وارد کردن دکمه ذخیره را زد
این به نظرم منطقی نیست باید در beforpost باشد
لطفاً راهنمایی کنید.

اگه کاربر این کار رو بکنه رویداد Onexit اجرا میشه و اون اتفاقی که دنبالش هستین میافته. امتحان کنید...

ghabil
جمعه 16 تیر 1385, 22:56 عصر
اگه کاربر این کار رو بکنه رویداد Onexit اجرا میشه و اون اتفاقی که دنبالش هستین میافته. امتحان کنید...

این روش یک روش اصولی نیست ، مثلا اگر صفحه دکمه دیفالت داشته باه با زدن اینتر اطلاعات پست میشند بدون اینکه رخداد شما تریگر بشه ، محل اصولی برای این کار در نظر گرفته شده که همون OnValidate فیلد هست اما همانطور که گفتم بهینه ترین جا برای این کار هندل کردن خطای ایجاد شده توسط بانک اطلاعات است . جای این کار هم در رویداد OnPostError هست .

اگر هم این کار رو نمیکنید باید از LookUp استفاده کنید این رو هم قبلا گفته بودم ، برای اینکه مطمئن هم بشید که باید از Lookup استفاده کنید کافیه Help دلفی رو در موردش بخونید

ali_divsalar
شنبه 17 تیر 1385, 06:50 صبح
آقای یعقوبی
شما دوست عزیز گفتید در Onexit شاید کاربرد بعد از وارد کردن دکمه ذخیره را زد
این به نظرم منطقی نیست باید در beforpost باشد
لطفاً راهنمایی کنید.

ثبت فیلدهای تکراری موقع ایجاد رکورد جدید بیشتر اتفاق می افته بنابراین ناچارید فیلدهای دیگر را پر کنید در نتیجه رخداد onexit عمدتا رخ می ده.
دوم اینکه روشی که گفتم در همان لحظه ورود فیلد تکراری جواب می ده و نیازی نیست شما مجموعه ای از اطلاعات را وارد کنید و در پایان موقع ثبت منتظر دریافت پیغام باشید!
ضمنا قبل از چک کردن تکراری بودن فیلدها پر بودن آنها رو هم چک می کنید.

با اینحال اشکالی نداره تو beforPost و یا تو رویداد دکمه ثبت تان می تونید این query رو برای فیلدهای تکراری چک کنید تا موارد استثنا رو هم پوشش بده