ورود

View Full Version : حذف و اضافه و ویرایش در DBGrid



hp1361
یک شنبه 07 بهمن 1386, 09:19 صبح
سلام
دوستان کد های مربوط به DBGrid رو براتون میزارم اگه میشه راهنمایی بفرمایین .
جستجو هم کردم و اون موارد رو هم بکار بردم اما افاقه نکرد .

با شروع برنام رکورد های مربوط به تاریخ روز جاری که ممکنه چند ساعت قبلش ذخیره شده باشه از جدول Main به جدول TempMain انتقال پیدا میکنه


procedure TFormNew2.FormCreate(Sender: TObject);
begin
DataModule1.ADOQueryMainToTemp.SQL.Clear;
DataModule1.ADOQueryMainToTemp.SQL.Add('Delete * From TableTempMainData');
DataModule1.ADOQueryMainToTemp.ExecSQL;


DataModule1.ADOQueryMainToTemp.SQL.Clear;
DataModule1.ADOQueryMainToTemp.SQL.Add('Insert Into TableTempMainData');
DataModule1.ADOQueryMainToTemp.SQL.Add('Select *');
DataModule1.ADOQueryMainToTemp.SQL.Add('From TableMainData');
DataModule1.ADOQueryMainToTemp.SQL.Add('Where RegDate='''+FormMain.ClassShamsi1.Shamsi+''' ORDER BY ServiceCode');
DataModule1.ADOQueryMainToTemp.ExecSQL;
end;





procedure TFormNew2.FormActivate(Sender: TObject);
begin
DataModule1.ADOTableTempMainData.Active:=True;
DataModule1.ADOTableTempMainData.Properties['Update Criteria'].Value :=adCriteriaKey;
DataModule1.ADOTableTempMainData.Open;
DataModule1.ADOTableServicesData.Active:=True;
DataModule1.ADOTableServicesData.Open;
end;





procedure TFormNew2.FormDeactivate(Sender: TObject);
begin
DataModule1.ADOTableMainData.Active:=False;
DataModule1.ADOTableMainData.Close;
DataModule1.ADOTableServicesData.Active:=False;
DataModule1.ADOTableServicesData.Close;
end;

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


procedure TFormNew2.cxButtonSaveClick(Sender: TObject);
begin
DataModule1.ADOQueryMainToTemp.SQL.Clear;
DataModule1.ADOQueryMainToTemp.SQL.Add('Update TableTempMainData Set RegDate='''+MaskEditDate.Text+'''');
DataModule1.ADOQueryMainToTemp.ExecSQL;

DataModule1.ADOQueryMainToTemp.SQL.Clear;
DataModule1.ADOQueryMainToTemp.SQL.Add('Delete * From TableMainData Where RegDate='''+MaskEditDate.Text+'''');
DataModule1.ADOQueryMainToTemp.ExecSQL;

DataModule1.ADOQueryMainToTemp.SQL.Clear;
DataModule1.ADOQueryMainToTemp.SQL.Add('Insert Into TableMainData Select * From TableTempMainData Order By ServiceCode');
DataModule1.ADOQueryMainToTemp.ExecSQL;

end;


فکر کنم توی جدول پارادکس بود که اگر جدولم خالی بود و من دکمه حذف رو میطدم اروری نمیداد . اما اینجا این ارور خیلی اذیتم میکنه برای همین تو بلاک گذاشتمش


procedure TFormNew2.cxButtonDeleteClick(Sender: TObject);
begin
Try
DataModule1.ADOTableTempMainData.Edit;
DataModule1.ADOTableTempMainData.Delete;
Except
FormMessages.ShowSmartMessage('äÏÇÑÏ æÌæÏ ˜ÑÏä ÍÐÝ ÈÑÇí јæÑÏí <hr><br>ÏåíÏ ÝÔÇÑ Esc Ϙãå ÇäÕÑÇÝ ÕæÑÊ ÏÑ *','','ÇØáÇÚÇÊ æÑæÏ ÏÑ ÎØÇ');
end;
end;


در این قسمت جدول سرویس های پیش فرض با سرویس های موجود در جدول TempMain مقایسه میشه و اون سرویس هایی که در جدول TempMain نیست بهش اضافه میشه


procedure TFormNew2.cxButton2Click(Sender: TObject);
begin
//æÇÑÏ ßÑÏä ÓÑæíÓ åÇí íÔ ÝÑÖ ÇÒ ÌÏæá ÓÑæíÓ åÇ
DataModule1.ADOQueryMainToTemp.Close;
DataModule1.ADOQueryMainToTemp.SQL.Clear;
DataModule1.ADOQueryMainToTemp.SQL.Add('Insert Into TableTempMainData(ServiceCode,ServiceName) Select ServiceCode,ServiceName From TableServicesData Where ServiceCode Not In (Select ServiceCode From TableTempMainData)');
DataModule1.ADOQueryMainToTemp.ExecSQL;

چون بعد از اضافه شدن اطلاعات در DBGrid نمایش داده نمیشد دستور Requery رو میدم
DataModule1.ADOTabletEMPMainData.Requery();

DataModule1.ADOQueryMainToTemp.SQL.Clear;
DataModule1.ADOQueryMainToTemp.SQL.Add('Update TableTempMainData Set RegDate='''+MaskEditDate.Text+'''');
DataModule1.ADOQueryMainToTemp.ExecSQL;

end;


چون من به جمع تمام سطر ها و ستون ها نیاز دارم بایستی اطلاعات وارد شده در جدول ذخیره بشن تا بتونم با یک Query جمعشون رو بدست بیارم و تا زمانی که اطلاعات وارد شده ذخیره نشن Query چیزی رو بر نمیگردونه برای همین دستور زیر رو نوشتم


procedure TFormNew2.DBGridEh1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
begin
DataModule1.ADOTableTempMainData.Edit;
DataModule1.ADOTableTempMainData.Post;
end;
end;


دوستان من هر کاری میکنم یه جای کار میلنگه .

ذخیره رو درست میکنم حذف کردن ارور میده ، حذف رو درست میکنم رکورد اضافه کردن ارور میده ، اونو درست میکنم مقدار مبلغ رو با توجه به تعداد بدست نمیاره

لطفا راهنمایی کنید خیلی وقته دارم باهاش کلنجار میرم (شاید دو ما) دیگه داره ازش بدم میاد


اگه میشه یکی یه نمونه DBGRid که بشه توش ویرایش و حذف و اضافه رو کرد بزاره ممنون میشم

حمیدرضاصادقیان
یک شنبه 07 بهمن 1386, 13:02 عصر
فعلا یک موردی که من دیدم در اخرین کد شماست.شما در یک لحظه هم داری Edit میکنی هم داری post میکن.بهتره یک دکمه داشته باشی برای اصلاح که وقتی میزنی به حالت edit بره و وقتی که دکمه تایید یا اینتر رو زدی عملیات post رو انجام بده.همچنین برای حذف یک رکورد نیازی نیست که اول edit رو بزنی بعد حذف کنی.مستقیما Del رو اجرا کن بعد هم یکبار query رو refresh کن.در قسمت اول هم دستورات active و close یک کار رو انجام میدن.نیازی نیست هر دو رو بکار ببرید.

vcldeveloper
دوشنبه 08 بهمن 1386, 01:30 صبح
حذف و اضافه و ویرایش در DBGrid
حذف و اضافه و ویرایش چی؟ اول باید مشخص کنید دقیقا چه کاری می خواید انجام بدید، بعد کد مورد استفاده را اینجا قرار بدید که بشه فهمید مشکل از کجا ست.
فعلا که کد شما تا حدود زیادی بی معنی هست (مثلا همون موردی که حمیدرضاصادقیان مطرح کردند: Post بالافاصله بعد از Edit، یا استفاده از Active := False و Close با هم).

hp1361
دوشنبه 08 بهمن 1386, 07:01 صبح
سلام

مگه بغیر از اطلاعات رکورد ها میشه چیزه دیگری رو هم توی DBGrid حذف و اضافه یا ویرایش کرد؟!

در مورد اون کد :با شروع به کار برنامه بانکم رو Active میکنم و وقتی کاربر در رکوردها ویرایش و تغییرات رو انجام داد دکمه Save رو برای ذخیره اطلاعات میزنه . اگه فقط دستور Post رو بدم ارور میده که برنامه در حالت Edit یا Insert نیست . برای همین قبل از Post دستور Edit رو میدم تا ارور نده .

خیلی ساده بگم : شما لطفی کنید و یه برنامه ساده بنویسید که شامل یک فرم و یک DBGrid متصل به بانک Access باشه .حالا پشت یرهم 4 تا رکورد اضافه کنید و بعدش به یکی از فیلدهای دوتا رکورد بالاتر حرکت کنید و اونو تغییر بدید و بعدش دستور Save رو بدید .آیا برنامه ارور میده یا نه .

ممنون میشم فقط همین نمونه رو برام بزارین .

منتظرم

vcldeveloper
دوشنبه 08 بهمن 1386, 07:14 صبح
خیلی ساده بگم : شما لطفی کنید و یه برنامه ساده بنویسید که شامل یک فرم و یک DBGrid متصل به بانک Access باشه .حالا پشت یرهم 4 تا رکورد اضافه کنید و بعدش به یکی از فیلدهای دوتا رکورد بالاتر حرکت کنید و اونو تغییر بدید و بعدش دستور Save رو بدید .آیا برنامه ارور میده یا نه .
نه! DbGrid خودش بصورت اتوماتیک Edit و Insert رو هندل میکنه و نیازی نیست که خودتون براش کد بنویسید. به فرض هم اگر قرار بود خودتون براش کد بنویسید، کد بالا بی معنی بود. Edit زمانی فراخوانی میشه که باید رکورد تغییر کنه، وقتی که تغییرات تمام شد، Post فراخونی میشه، یعنی تغییرات بین فراخوانی Edit و Post انجام میشند، نه اینکه تغییرات را انجام بدید، بعد Edit و Post را پشت سر هم اجرا کنید.

در هر حال، اگر مسئله صرفا اعمال تغییرات و ذخیره آنها هست، شما لازم نیست هیچ کدی بنویسید. DBGrid خودش متوجه اعمال تغییر میشه و DataSet را به حالت Edit میبره. با تغییر رکورد جاری هم خودش Post را فراخوانی میکنه. این عملیات بصورت خودکار توسط دلفی به ADO (یا هر رسانه دیگه ایی که برای ارتباط با موتور بانک اطلاعاتی استفاده می کنید) ارسال میشه و در آنجا به دستورات SQL مناسب بانک شما تبدیل میشه.

hp1361
دوشنبه 08 بهمن 1386, 07:47 صبح
سلام

برای تست حرف شما یک DBGrid رو فرم گذاشتم و اونو به ADOTable کانکت کردم . Active هم کردم .

برنامه رو اجرا کردم و 4 تا رکورد (توی خود DBGrid نه DBEdit ) بهش اضافه کردم و به یکی از فیلدای رکورد 2 تا بالاتر رفتم و تا عددی رو وارد کردم ارور زیر رو داد که داره منو کچل میکنه .



Project Project1.exe raised exception class EOleException with message 'Row cannot be located for
updating. Some values may have been changed since it was last read'. Process stopped. Use Step or Run
to continue.
Project Project1.exe raised exception class EOleException with message 'Row cannot be located for
updating. Some values may have been changed since it was last read'. Process stopped. Use Step or Run
to continue.


حالا چیکار کنم؟

جدولم هم43تا ستون داره 1- ServiceCode (کد سرویس) 2-RegDate تاریخ ثبت 3-Count تعداد 4-Amount مبلغ

دوتای اولی کلید هستند

حالا به نظر شما مشکل کجاست؟

vcldeveloper
دوشنبه 08 بهمن 1386, 08:03 صبح
"Row cannot be located" را در بخش دلفی جستجو کنید. قبلا جواب داده شده.

hp1361
دوشنبه 08 بهمن 1386, 09:57 صبح
مثل اینکه من نمیتونم منظورم رو خوب بیان کنم .

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

حتی توی کد FormActivate میتونید ببینید که از دستور زیر که در همه تاپیک های این سایت برای ارور مورد نظر معرفی کردن استفاده کردم .


DataModule1.ADOTableTempMainData.Properties['Update Criteria'].Value :=adCriteriaKey;


دیگه چیکار بایستی بکنم که بعد از 2 ماه سرگردانی نکردم؟

بازمم ممنون که به هر حال جوابم رو میدین چه بکارم بیاد چه نیاد.!

vcldeveloper
سه شنبه 09 بهمن 1386, 03:18 صبح
حتی توی کد FormActivate میتونید ببینید که از دستور زیر که در همه تاپیک های این سایت برای ارور مورد نظر معرفی کردن استفاده کردم .
این مال زمانی هست که چند کاربر به طور همزمان رکورد مربوطه را ویرایش کرده باشند و برای مثال شما صدق نمیکنه.

این مشکل ربطی به دلفی نداره، احتمالا مشکل در طراحی بانک شما ست. می تونید برای مثل به جای اون دو تا فیلدی که به عنوان کلید انتخاب کردید، یک فیلد جدید از نوع AutoNumber درست کنید و آن را کلید کنید، و چک کنید که آیا مشکل برطرف میشه یا نه.

sql_qassem
سه شنبه 23 مهر 1387, 22:01 عصر
بله من هم با آقاي كشاورز در مورد مشكل بانك موافقم . از وقتي كه با اين بانك كوفتي access شروع به كار كردم اين مشكلات مسخره برام شروع شد.
من هم هنوز كما كان دنبال حل مشكل خودم مي گردم اگه كسي مي تونه كمكم كنه . تمام ليست مربوط به خطاي زير رو خوندم ولي به نتيجه نرسيدم .
وقتي پيغام زير رو ديدم كمي اميدوار شدم :

دیگه چیکار بایستی بکنم که بعد از 2 ماه سرگردانی نکردم؟

ولي يكي محض رضاي خدا براي اين مشكل كاري كنند .
آقايان مديران : از شما بيشتر توقع مي ره !!! اساتيد محترم !!!

SYNDROME
چهارشنبه 24 مهر 1387, 06:35 صبح
به پست شماره 6 لینک زیر یک نگاه بندازید.
http://barnamenevis.org/forum/showthread.php?p=614404&posted=1#post614404
موفق باشید