View Full Version : بررسی منحصر بفرد بودن کد واردشده در DBGrid
Developer Programmer
چهارشنبه 11 شهریور 1383, 18:13 عصر
تمامی اطلاعات رو از طریق dbGrid میگیرم و سپس پردازشهای لازم رو روی انها انجام میدم
یکی از این پردازشها بررسی اینه که آیا کد واردشده منحصر بفرد است یا تکراری
من کد زیر رو نوشتم که در اون توسط Count تعداد درج کد موردنظر رو بررسی میکنه
اگه تعداد تکرار کد 2 باشد یعنی تکراری است
procedure TfrmItems.ADOQuery1BeforePost(DataSet: TDataSet);
begin
If DataSet.FieldByName('CodeOfItem').AsString ='' Then
begin
Application.MessageBox('','Error',MB_IconInformati on+MB_OK) ;
Abort;
end;
ADOQuery2.Active:=False;
ADOQuery2.SQL.Text:='Select Count(CodeOfItem) as total from tbl_items i Group by CodeOfItem having CodeOfItem=' + DataSet.FieldByName('CodeOfItem').AsString ;
ADOQuery2.Active:=True;
If ADOQuery2.FieldValues['Total']<>'1' Then
begin
Application.MessageBox('Code is not indivisual','Error',MB_IconInformation+MB_OK);
Abort;
end;
end;
اما از اون جاییکه هنوز داده در جدول ذخیره نشده عدد 1 برمیگردد لذا نمیشه!!
شما چی پیشنهاد میکنین؟
Mohammad S
چهارشنبه 11 شهریور 1383, 21:39 عصر
بهترین پیشنهاد این است که DBGrid را REadOnly کنید و هر چه که لازم دارید از طریق بقیه اشیا مثل Edit از کاربر دریافت کنید که هم پردازش روی آن ها راحت تر است هم مشکلات کمتری دارند. :wink:
حمیدرضاصادقیان
چهارشنبه 11 شهریور 1383, 22:21 عصر
خوب فکر کنم بهتر باشه برای اون فیلد یک کلید تعریفف کنید در اس کیو ال.
البته بازم دوستان استاد تر هستند. :oops:
Developer Programmer
چهارشنبه 11 شهریور 1383, 22:24 عصر
بهترین پیشنهاد این است که DBGrid را REadOnly کنید و هر چه که لازم دارید از طریق بقیه اشیا مثل Edit از کاربر دریافت کنید
عزیزان برنامه طوری است که در کمتر از نیم ساعت ممکن است صد رکورد درج شود پس dbGrid بهتر است
در ضمن کد رو خود کاربر باید تایپ کنه (برنامه کدی تولید نمیکنه) پس من باید یه طوری تشخیص بدم که کد تکراریه یا نه
حمیدرضاصادقیان
چهارشنبه 11 شهریور 1383, 22:42 عصر
دوست عزیز وقتی که شما یک فیلد رو در اس کیو ال کلید دار کنید یعنی دارای primary key باشد وقتی که شما ثبت اطلاعات میکنید هنگام ذخیره خود اس کیو ال منحصر به فرد بودن انرا تشخیص میده.
و فکر میکنم اینجوری خیلی راحت شما بتونی متوجه بشی که کد تکراری هست یا نه.
moradi_am
پنج شنبه 12 شهریور 1383, 07:52 صبح
اگه تعداد تکرار کد 2 باشد یعنی تکراری است
خوب قبل از ذخیره باید با عدد 1 مقایسه کنید نه 2
Developer Programmer
پنج شنبه 12 شهریور 1383, 10:04 صبح
خوب قبل از ذخیره باید با عدد 1 مقایسه کنید نه 2
در هنگام ویرایش کد ... تشخیص اشتباه میده :!:
هنگام ذخیره خود اس کیو ال منحصر به فرد بودن انرا تشخیص میده.
دقیقا میخوام با این روش کار کنم منتها نمیتونم خطا رو بدام بندازم! :roll:
حمیدرضاصادقیان
پنج شنبه 12 شهریور 1383, 15:28 عصر
منم همینکارو کردم.ولی کدی که برای ذخیره اطلاعات نوشتم رو در یک try -except گذاشتم و در try سعی میکنه داده رو ذخیره کنه اگه تکراری بود در قسمت except پیغام میده که کدت تکراریه.
:oops:
v_shalchian
پنج شنبه 12 شهریور 1383, 16:18 عصر
اگه تعداد تکرار کد 2 باشد یعنی تکراری است
به جای این کار بهتر نیست وقتی کاربر کد را وارد کرد فقط یک Search ساده انجام بدی نه اینکه (Count(CodeOfItem را بدست بیاوری.
مثلا از این کد استفاده کنی :
ADOQuery2.Active:=False;
ADOQuery2.SQL.Text:='SELECT * FROM tbl_items WHERE CodeOfItem=' + DataSet.FieldByName('CodeOfItem').AsString ;
ADOQuery2.Active:=True;
If ADOQuery2.RecordCuont>=1 Then
begin
Application.MessageBox('Code is not indivisual','Error',MB_IconInformation+MB_OK);
Abort;
end;[/quote]
Developer Programmer
پنج شنبه 12 شهریور 1383, 19:34 عصر
به جای این کار بهتر نیست وقتی کاربر کد را وارد کرد فقط یک Search ساده انجام بدی نه اینکه (Count(CodeOfItem را بدست بیاوری
فرمایش شما کاملا متین .... ولی کد شما و کد من زمانی اشتباه میکنن که کاربر بخواد مقدار یکی از فیلدها (الزاما کد کالا نیست!) را ویرایش کند چون کد کالا قبلا وجود داشته برنامه تصور میکند که کاربر قصد ایجاد کد تکراری رو داشته :roll:
حمیدرضاصادقیان
پنج شنبه 12 شهریور 1383, 20:38 عصر
دوست عزیز شما با روشی که من گفتم امتحان کردین.؟؟؟
من دقیقا تمام کارهایی که شما میخواهید انجام بدید چه اضافه کردن چه اصلاح کردن وقتی اون کلید رو در اس کیوال بذارین خودش همه این کارهارو براتون انجام میده و البته پیغام الکی هم نمیده در ثانی نیازی به کد نویسی هم ندارید.
بازم نمیدونم شاید من دارم اشتباه میکنم. :oops:
Developer Programmer
پنج شنبه 12 شهریور 1383, 22:21 عصر
ممنون از همه دوستان بالاخره مشکل درست شد منتها به روشی دیگر
دوست عزیز شما با روشی که من گفتم امتحان کردین.؟؟؟
به حساب خنگی من نذارین ولی هیچوقت برنامه به except جواب نمیده حتی با BreakPoint هم میبینم که خط execept رو میپره
واسه همین کد رو تو OnPostError تست کردم منتها اول کنترل رو SQL-Server میگیرفت بعد به من پاس میداد!
:roll:
حمیدرضاصادقیان
پنج شنبه 12 شهریور 1383, 22:47 عصر
خدارو شکر.خوب افشین جان اگه امکانش هست روشت رو بگو ماهم استفاده ببریم. 8-)
Mohammad S
جمعه 13 شهریور 1383, 00:47 صبح
دستورات Try Except تا جایی که من دیدم، در زمان اجرای برنامه از محیط دلفی جواب نمیدن ولی وقتی فایل Exe برنامه رو اجرا کنی، جواب میده.
در هنگام ویرایش هم روشش اینه: قبل از اینکه کاربر ویرایش انجام بده، شما مقدار کلید را نگهداری کنید و این بار دستور SQL را به این صورت ادامه دهید:
'and CodeOfItem<>'+QuotedStr(Old_CodeOfItem)
موفق باشید
MiRHaDi
جمعه 13 شهریور 1383, 02:54 صبح
سلام
SQL جواب نمیده ! چون قسمت پردازشش توی برنامه شما نیست !
شما باید توی Table برای اون چیزی که میخوای Primary Key تعریف کنی !مثلا از DBD32 ! بعد توی BeforInsert میتونی Error Handelling کنی !
قربانت
Developer Programmer
جمعه 13 شهریور 1383, 09:38 صبح
ممنونم از همه دوستان که وقت با ارزششان رو بخاطر یادگیری من تلف میکنن
خدارو شکر.خوب افشین جان اگه امکانش هست روشت رو بگو ماهم استفاده ببریم
راستش همونطور که گفتم کد من و کد شما در هنگام ویرایش رکورد قاط میزد واسه همین در رویدارد BeforEdit رکورد جاری و کدکالا رو نگه میدارم و در رویداد BeforePost بررسی میکنم که آیا الان تو همون رکوردیم و آیا فیلد کدکالا مقداری متفاپت از هنگام شروع ویرایش دارد؟ پس کد کالا هم ویرایش شده و بررسی مجاز بودن کد شروع میشه (همون کد که پست کردم) والا ردمیشه :roll:
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.