PDA

View Full Version : مشکل جدی با اکسس و اعمال تغییرات



newdesign
سه شنبه 24 آبان 1384, 13:12 عصر
سلام
یه برنامه نوشتم با دیتابیس اکسس . کاربر می تونه یه اطلاعاتی رو تو dbgrid بینه و اگه خواست تغییر بده.
حالا من می خوام اگه کاربر button اعمال تغییرات رو فشار داد تغییرات اعمال بشند . در حالی که وقتی میاد یه چیزی رو عوض می کنه و میره رو رکورد بعدی تغییرات بدون نیاز به post کردن اعمال می شند .
چیکار کنم که اگه کاربر اعمال تغییرات رو نزد تغییرات اعمال نشن ؟

MNosouhi
سه شنبه 24 آبان 1384, 15:42 عصر
از رویداد BeforPost استفاده کن.

mzjahromi
سه شنبه 24 آبان 1384, 15:49 عصر
می تونی از CatchedUpdate استفاده کنی. اینجوری تا موقعی که ApplyUpdate نکنی رکوردها ثبت نمی شن

newdesign
سه شنبه 24 آبان 1384, 18:16 عصر
شرمنده ولی منظور هیچکدومتون رو متوجه نشدم . اگه ممکنه یه خورده بیشتر توضیح بدین که چیکار کنم .

mzjahromi
سه شنبه 24 آبان 1384, 18:21 عصر
از چه کامپوننتی استفاده می کنی؟ TTable?

mzjahromi
سه شنبه 24 آبان 1384, 18:25 عصر
ببین ttable یه خاصیت داره بنام Catchedupdate. اونو True کن
بعد تو onclick مربوط به button بنویس


Table1.ApplyUpdates;

اینطوری در واقع همه کارا تو حافظه انجام می شه و وقتی ApplyUpdate می کنی رو DB اعمال میشه

newdesign
سه شنبه 24 آبان 1384, 20:12 عصر
نه با AdoTable کار می کنم .

newdesign
چهارشنبه 25 آبان 1384, 00:01 صبح
راه حلی وجود نداره ؟

vcldeveloper
چهارشنبه 25 آبان 1384, 01:34 صبح
خاصیت LockType را روی ltBatchOptimistic تنظیم کنید و برای ذخیره تغییرات از متد UpdateBatch استفاده کنید.

newdesign
چهارشنبه 25 آبان 1384, 02:39 صبح
میشه یه سطر کد بنویسید که چه جوری ؟ یعنی نباید از post استفاده کنم ؟

MNosouhi
چهارشنبه 25 آبان 1384, 16:27 عصر
دوست عزیز این که دیگه تاپیک زدن نمی خواست .تمامی راههایی که دوستان گفتن درست ، اما حتی اگه در مورد اونها هم اطلاعاتی نداشتی خودت می تونستی این کار رو انجام بدی ، یه متغیر عمومی تعریف کن با نام Letpost :

var
Form1: TForm1;
LetPost:Boolean;
و به اون مقدار پیش فرض False بده :

procedure TForm1.FormCreate(Sender: TObject);
begin
LetPost:=false;
end;
حالا در رویداد BeforPost این کد رو بنویس:

If LetPost=False Then
AdoTable1.Cancel;
حالا فرضا یه دکمه داری که با کلیک بر اون میخای تغییرات ذخیره بشه:

procedure TForm1.Button1Click(Sender: TObject);
begin
LetPost:=true;
AdoTable1.post;
LetPost:=false;
end;

newdesign
چهارشنبه 25 آبان 1384, 17:38 عصر
أخه پسر خوب حالا چرا دعوا می کنید/از راهنمائیتون ممنونم .روشی رو که گفتید امتحان می کنم . شرمنده اگه ناراحتتون کردم . مطمئن باشین اگه خودم می تونستم این کار رو انجام بدم وقت شما را نمی گرفتم .

vcldeveloper
پنج شنبه 26 آبان 1384, 01:46 صبح
دوست عزیز این که دیگه تاپیک زدن نمی خواست .تمامی راههایی که دوستان گفتن درست ، اما حتی اگه در مورد اونها هم اطلاعاتی نداشتی خودت می تونستی این کار رو انجام بدی ، یه متغیر عمومی تعریف کن با نام Letpost :

var
Form1: TForm1;
LetPost:Boolean;
و به اون مقدار پیش فرض False بده :

procedure TForm1.FormCreate(Sender: TObject);
begin
LetPost:=false;
end;
حالا در رویداد BeforPost این کد رو بنویس:

If LetPost=False Then
AdoTable1.Cancel;

ایشون می خوان تمام تغییرات یکجا با استفاده از دکمه ایی که ایجاد کردند، بر روی بانک اعمال بشه، اما با روش شما بعد از تغییر رکورد جاری، درصورتی که LetPost := True نباشه، کل تغییرات کاربر بر روی آن رکورد از بین میره؛ به عبارت دیگه روش شما امکان تغییر رکوردها را از کاربر می گیره و مربوط به این بحث نمیشه.