PDA

View Full Version : راهی برای خواندن اطلاعات از DB ،تغییر آنها،ولی تغییرات اعمال نشه ؟



Modifier
سه شنبه 21 دی 1389, 14:13 عصر
سلام

میخوام اطلاعاتم رو از DB از درون یک Table بخونم(رکورد به رکورد) ...و اونها رو به کاربر نمایش بدم و بتونه کاربر تغییرشون بده و اطلاعات رو چاپ کنه...

از چه روشی بایداستفاده کنم؟

ابتدا به ذهن خودم رسید که از یک فرم استفاده کنم و Objectها رو بسازم(برای هر رکورد)...ولی احساس کردم راه ساده تری هم باشه مثلا استفاده از DBGRID بصورت خاص ...و...و...و...

لطفا راهنمایم کنید.

ممنون.
یاعلی.

vcldeveloper
سه شنبه 21 دی 1389, 16:07 عصر
راهی برای خواندن اطلاعات از DB ،تغییر آنها،ولی تغییرات اعمال نشه ؟
میتونید از ClientDataset یا کامپوننت های ADO در حالت Batch Update استفاده کنید. در اون صورت، تغییراتی که در داده ها اعمال می کنید، در برنامه خودتان وجود خواهند داشت، ولی تا زمانی که متد ApplyUpdates (یا BatchUpdate) فراخوانی نشه، این تغییرات به بانک ارسال نمیشه. درباره اش قبلا در سایت توضیح داده شده، همین عبارت ApplyUpdate رو می تونید جستجو کنید.

Modifier
سه شنبه 21 دی 1389, 16:28 عصر
میتونید از ClientDataset یا کامپوننت های ADO در حالت Batch Update استفاده کنید. در اون صورت، تغییراتی که در داده ها اعمال می کنید، در برنامه خودتان وجود خواهند داشت، ولی تا زمانی که متد ApplyUpdates (یا BatchUpdate) فراخوانی نشه، این تغییرات به بانک ارسال نمیشه. درباره اش قبلا در سایت توضیح داده شده، همین عبارت ApplyUpdate رو می تونید جستجو کنید.




من روندی رو استفاده کردم که فکر میکنم استفاده از ClientDataSet برام سخت باشه چون من .. Connection و اجرای دستورات مربوط به DataBase همش در هنگام اجرا مقدار دهی یا فراخوانی میشه .. در زمان طراحی چیزی ندارم...

میشه در مورد Batch Update توضیح بدین. ممنون.
فکر کنم بهتر باشه...

ممنون.
یاعلی.

Modifier
سه شنبه 21 دی 1389, 18:44 عصر
چند تا توضیح :
من از ADO استفاده میکنم..
داده هامو میخوام از طریق DBGRID تغییر بدم...
از ClientDataSet استفاده کردم ولی هنگام تغییر همون کار طبیعی حودش رو میکرد یعنی تغییرات اعمال میشد..
از AdoDataSetاستفاده کردم بازم مثل مورد قبلی نشد...یه خصوصیتی داشت به نام LockType که اون رو به ltBatchOptimistic تغییر دادم...

لطفاً کمکم کنید تا مشکلم حل بشه..

ممنون.
یاعلی.

vcldeveloper
سه شنبه 21 دی 1389, 21:51 عصر
من روندی رو استفاده کردم که فکر میکنم استفاده از ClientDataSet برام سخت باشه چون من .. Connection و اجرای دستورات مربوط به DataBase همش در هنگام اجرا مقدار دهی یا فراخوانی میشه .. در زمان طراحی چیزی ندارم...
ارتباطی به مقداردهی Connection در زمان runtime یا design-time نداره. ClientDataset هم مثل هر دیتاست دیگه ایی در دلفی کار میکنه.


داده هامو میخوام از طریق DBGRID تغییر بدم...
از ClientDataSet استفاده کردم ولی هنگام تغییر همون کار طبیعی حودش رو میکرد یعنی تغییرات اعمال میشد..
از AdoDataSetاستفاده کردم بازم مثل مورد قبلی نشد...یه خصوصیتی داشت به نام LockType که اون رو به ltBatchOptimistic تغییر دادم...
منظورتون از اعمال تغییرات دقیقا چی هست؟ ClientDataset تا زمانی که متد ApplyUpdate اش فراخوانی نشه، چیزی به بانک ارسال نمیکنه. البته تغییرات در حافظه برنامه شما اعمال میشه، یعنی شما تغییرات رو می بینید، در کنترل های متصل به اون ClientDataset هم تغییرات دیده میشند، اما چیزی در بانک ثبت نمیشه. اگر شما ClientDataset رو ببندید، یا از برنامه خارج بشید، می بینید که تغییرات شما هم از بین رفته و چیزی در بانک ثبت نشده.
در ADO هم اگر از ltBatchOptimistic استفاده کنید، همین شرایط بوجود میاد.

Modifier
شنبه 23 بهمن 1389, 17:44 عصر
سلام

ADODataSet1.Connection := MainConnection;
ADODataSet1.LockType := ltBatchOptimistic;
ADODataSet1.CommandText := 'Select * from View_Name';
ADODataSet1.Active := True;
DataSource1.DataSet := ADODataSet1;


من با کد بالا این کار رو انجام دادم و جواب داد ولی یه مشکل دارم :
یکی از فیلدهای داخل View محاسباتی است یعنی از ضرب بین 2 فیلد دیگه بدست اومده و در داخل DbGrid اجازه تغییر نمیده!
چطور این مشکل رو حل کنم ؟

ممنون.
یاعلی.

vcldeveloper
چهارشنبه 27 بهمن 1389, 19:43 عصر
یکی از فیلدهای داخل View محاسباتی است یعنی از ضرب بین 2 فیلد دیگه بدست اومده و در داخل DbGrid اجازه تغییر نمیده!
فیلد محاسباتی Read-only هست، و نیازی به تغییر نداره، چون قرار هست مقدارش از محاسبه مقادیر سایر فیلدها به دست بیاد.

Modifier
شنبه 30 بهمن 1389, 11:33 صبح
فیلد محاسباتی Read-only هست، و نیازی به تغییر نداره، چون قرار هست مقدارش از محاسبه مقادیر سایر فیلدها به دست بیاد.
بله آقای کشاورز در حالت عادی این چنین هست ولی اگه بخواهیم مقدار را تغییر دهیم چه کنیم ؟
یه قسمتی از صورت مسئله :
یه فاکتور توی سیستم ثبت شده، حالا به درخواست مشتری میخواهیم یک پرینت متفاوت با اطلاعاتن ثبت شده بگیریم ..
در نتیجه ما اطلاعات را تغییر میدیم ولی ثبت نمیکنیم...

البته من با استفاده از همون روشی که توی DB بکار بده بودم توی دلفی هم چنین کاری کردم ولی اگه بشه خود مقدار رو هم تغییر داد.. بهتر میشه ...

vcldeveloper
شنبه 30 بهمن 1389, 13:19 عصر
یه فاکتور توی سیستم ثبت شده، حالا به درخواست مشتری میخواهیم یک پرینت متفاوت با اطلاعاتن ثبت شده بگیریم ..
در نتیجه ما اطلاعات را تغییر میدیم ولی ثبت نمیکنیم...
پس دیگه یا نباید از فیلد محاسباتی استفاده کنید، یا اینکه در کنار اون از یه فیلد دیگه استفاده کنید.