PDA

View Full Version : نمایش پیغامی در مورد اینکه این رکورد تکراری میباشد



eilia_43
سه شنبه 15 آذر 1384, 07:30 صبح
با عرض سلام
اگر در بانک اطلاعاتی رکوردی را به عنوان primary key تعریف کنیم در هنگام اجرای برنامه اگر به این فیلد مقداری تکراری بدهیم اجرای برنامه از حالت run به stop میرود و محتوی این پیغام اینه که نمی تونه محتوی این فیلد از رکورد تکراری باشد.
من می خوام کدی رو بدین که برنامه به حالت stop نرفته واین دستور رو ما از طریق کدی که نوشتیم به کاربر نشان دهد.
مانند دستور messadedlg که با قراردادن متنی در داخل آن اطلاعاتی رو به کاربر می دهد.
مرسی

mzjahromi
سه شنبه 15 آذر 1384, 08:10 صبح
1-از منوی Tools>DebugerOptions>Language Exceptions>Stop On Delphi Exception رو False کن بعد هم با استفاده از Try Except کنترلش کن
2- قبل از اینکه رکورد رو Insert کنی با یه Query چک کن ببین وجود داره یا نه.

ali_abbasi22145
سه شنبه 15 آذر 1384, 09:39 صبح
سلام
من که SQL Server کار می کنم آن فیلد را UNIQUE می کنم و خود SQL Server تکراری را به من اعلام می کند و گیر هم نمی کند.

mzjahromi
سه شنبه 15 آذر 1384, 10:18 صبح
سلام
من که SQL Server کار می کنم آن فیلد را UNIQUE می کنم و خود SQL Server تکراری را به من اعلام می کند و گیر هم نمی کند.
اگه کلید اصلی باشه خودش اعلام می کنه ایشون می خواهند که خودشون اعلام کنند

saeed_d
جمعه 18 آذر 1384, 15:24 عصر
سلام
در رویداد OnPostError مربوط به Table متن مربوط به e.Message رو برای حالتی که رکورد تکراری وارد می شود به دست بیار. می تونی یه Memo روی فرمت بذاری و در OnPostError بنویسی:

memo1.lines.add(e.message);
بعد برنامه رو اجرا کن و یه رکورد تکراری وارد کن تا این متن تولید شده و در memo قرار گیرد.حالا این متن رو از داخل memo یه جائی کپی کن که اونو داشته باشی بعد می تونی memo رو از روی فرمت برداری.
در رویداد OnPostError هر چی نوشتی پاک کن و کد زیر رو بنویس:

if e.Message:=متنی که قبلا بدست آوردی then
messagedlg('مقدار تکراری است',mtError,[mbok],0);

vcldeveloper
شنبه 19 آذر 1384, 02:49 صبح
اگر در بانک اطلاعاتی رکوردی را به عنوان primary key تعریف کنیم در هنگام اجرای برنامه اگر به این فیلد مقداری تکراری بدهیم اجرای برنامه از حالت run به stop میرود و محتوی این پیغام اینه که نمی تونه محتوی این فیلد از رکورد تکراری باشد.
این نوع از فیلدها را یا خود برنامه به بانک اطلاعاتی ارسال میکنه؛ یا از بانک اطلاعاتی می خواد که خودش یک مقدار اتوماتیک و غیر تکراری برای این فیلدها ایجاد کنه، نه اینکه کاربر خودش بصورت دستی این فیلدها را مقداردهی کنه!

من می خوام کدی رو بدین که برنامه به حالت stop نرفته واین دستور رو ما از طریق کدی که نوشتیم به کاربر نشان دهد.
وقتی برنامه را در داخل دلفی اجرا میکنی، Debuger دلفی در صورت بروز خطا برنامه را متوقف میکنه و خطی که خطا در آن رخ داده را نشان میده تا خطا را برطرف کنید. در زمانی که برنامه در خارج از محیط دلفی اجرا میشه، فقط پیغام خطا نمایش داده میشه و خبری از Debuger دلفی نیست. برای کنترل نمایش خطا هم می تونید کد را در بلوک try ...except قرار بدید.

m-hamidi
شنبه 19 آذر 1384, 16:04 عصر
ضمناً دستور abort تمامی اتفاقات رخ داده را حذف میکند و به حالت قبل میرود

eilia_43
یک شنبه 20 آذر 1384, 05:56 صبح
فرض کنید فیلدی که از به عنوان primary key انتخاب کردم اسمش book_no می باشد.چطوری از try except استفاده کنم.در ضمن می خواهم یه پیغامی هم روی صفحه نشان داده شود که محتوی این فیلد از رکورد تکراری است.

mzjahromi
یک شنبه 20 آذر 1384, 08:28 صبح
try
Code marboot be darje record ro inja benevis
except
on e:Exception do
showmessage(e.message)
end


حالا بجای E.Message می تونی هر چی که خودت می خواهی بگذاری

eilia_43
یک شنبه 20 آذر 1384, 15:08 عصر
از همه آقایون تشکر می کنم که جواب دادند
راه حلی که آقای سعید ده یادگاری ارائه دادند یه مشکلی داره
اول اینکه بعد از if نوشتند e.message := که این اشتباست باید : را حذف کنه ودر ضمن با توجه به کارهایی که ایشون گفتند من اون کارها رو انجام دادم پیغامی که در memo ایجاد شد این بود
Violation of PRIMARY KEY constraint 'PK_book1'. Cannot insert duplicate key in object 'book1'
البته تک کوتیشن قبل از volation بعد از book1 قرار دارد.
من این پیغام رو بعداز = کپی کردم اما خطا گرفت.
دو طر فش رو تک کوتیشن قرار دادم بازم خطا گرفت.
اما وقتی که کوتیشنهای book1,pk_book1 رو برداشتم و دو طرف جمله بالا یه تک کوتیشن گذاشتم برنامه بدون error اجرا شد اما برنامه مثل دفعات قبل اجرا شد.
آقای سعید ده یادگاری مشکل از کجاست؟
متشکرم

eilia_43
یک شنبه 20 آذر 1384, 15:51 عصر
installshield express
نرم افزار بالا رو از کجا می تونم پیدا کنم.
توی cd دلفی من نیست .
تو سایتها هم گشتم.

eilia_43
یک شنبه 20 آذر 1384, 16:52 عصر
از روش آقای ذوالقدر هم استفاده کردم بدین صورت که:
دو دکمه insert و save روی فرمم قرار دادم و روی insert کلیک کردم و دستور زیر رو تایپ کردم
adotable1.insert;
و روی save کلیک کرده و دستور زیر رو تایپ کردم
try
; adotable1.Post
except
on e:Exception do
('این رکورد تکراری می باشد')showmessage
End;
برنامه هما نطوری که می خواستم اجرا می شود یعنی اگر فیلدی از رکورد رو تکراری وارد کنم پیغام ظاهر می شود.اما اگردوباره کلید insert رو فشار بدم باز همان پیغام اولیه که مر بوط به خود برنامه دلفی است ظاهر میشود.
حالا مشکل اینجاست که می خواهم بعد از زدن دکمه ok برنامه به حالت قبل از زدن کلید insert برگردد یعنی حالتی که ما رو جدول کاری انجام نداده ایم.
از همه دوستان متشکرم.

saeed_d
یک شنبه 20 آذر 1384, 17:22 عصر
اول اینکه بعد از if نوشتند e.message := که این اشتباست باید : را حذف کنه
درسته این یه اشتباه تایپی بود.

Violation of PRIMARY KEY constraint 'PK_book1'. Cannot insert duplicate key in object 'book1'
البته تک کوتیشن قبل از volation بعد از book1 قرار دارد.
اما وقتی که کوتیشنهای book1,pk_book1 رو برداشتم و دو طرف جمله بالا یه تک کوتیشن گذاشتم ب
آقای سعید ده یادگاری مشکل از کجاست؟
متشکرم
بیبینید دوست عزیز. در دلفی اگر داخل یه رشته علامت کوتیشن داشته باشی باید علامت کوتیشن رو دومرتبه بزاری. پس کوتیشنهای مربوط به book1,pk_book1 رو دوبار بنویس یعنی در هر طرف اونها دو تا علامت کوتیشن بزار بعد ابتدا و انتهای جمله نیز یه علامت کوتیشن بزار.
کد دوم رو نیز به این صورت تصحیح می کنم:

if e.message=جمله ای که در بالا داری then
messagedlg('کد تکراری است',mtError,[mbok],0);
action:=daAbort;

در ضمن هنگامی که فایل exe رو اجرا کنی این روش جواب میده. در هنگامی که برنامه رو از داخل دلفی run می کنی پیغام خطای دلفی نیز ظاهر می شود.
پس برای امتحان کردن کدت فایل exe برنامه ات رو اجرا کن.
من با همین روش بالا جواب گرفته ام.
خداحافظ

eilia_43
دوشنبه 21 آذر 1384, 10:48 صبح
ممنونم آقای سعید ده یادگاری
روشی که شما ارائه دادین کاملا درسته
اصلا اون پیغام قبلی ظاهر نمیشه
چه از فایل exe برنامه رو اجرا کنم چه از توی دلفی.
بازم ممنون

javidtaheri
دوشنبه 21 آذر 1384, 14:39 عصر
میشه پیغام خطا رکورد تکراری را فارسی کرد
keyviolotion

مرتضی کاردرست
سه شنبه 22 آذر 1384, 22:05 عصر
بهتر است کلید اصلی identity باشد.

eilia_43
چهارشنبه 23 آذر 1384, 13:49 عصر
بله با اجرا کردن دستوراتی که در بالا ذکر شد پیغام خطا بصورت فارسی به کاربر ابلاغ می گردد.

mzjahromi
شنبه 26 آذر 1384, 10:04 صبح
برنامه هما نطوری که می خواستم اجرا می شود یعنی اگر فیلدی از رکورد رو تکراری وارد کنم پیغام ظاهر می شود.اما اگردوباره کلید insert رو فشار بدم باز همان پیغام اولیه که مر بوط به خود برنامه دلفی است ظاهر میشود.
حالا مشکل اینجاست که می خواهم بعد از زدن دکمه ok برنامه به حالت قبل از زدن کلید insert برگردد یعنی حالتی که ما رو جدول کاری انجام نداده ایم.
از همه دوستان متشکرم.


try
; adotable1.Post
except
on e:Exception do
('این رکورد تکراری می باشد')showmessage
adotable1.cancel;

End;
ضمن اینکه تو این کدی که شما نوشتید هر خطائی رخ بده همین پیغام رو نشون میده
می تونید از Resource Dll wizard برای تغییر پیغامها استفاده کنید