PDA

View Full Version : راهنمايي در مورد نمايش دادن احراي دستورات sql در جدول dbgird در برنامه دلفي



ehsanbn
سه شنبه 16 تیر 1388, 16:16 عصر
با سلام

من در موضوعات ديتابيس (بخصوص sql) تازه كار هستم. يك مشكلي دارم آن اين است كه يك جدولي را كه در sql درست كردم را در يك جدول (dbgird) در دلفي نمايش دادم حالا مي‌خوام با هر دستوري كه در sql وجود دارد (يعني select-update-delete-...) و اجرا شد بلافاصله تغييرات صورت گرفته در جدول (dbgrid) هم اعمال شود و نمايش داده شود ولي نمي دانم چطوري اينكار را انجام دهم فقط پس از هر دستوري كه مي نويسيم متد execute را مي گذارم سپس پس از زدن دكمه مربوط مي بايست بروم در خود برنامه sql و روي گزينه execute sql بزنم تا دستورات اجرا شوند سپس پس از يك بار اجرا كردن برنامه تغييرات صورت گرفته در جدول (dbgrid) مشخص مي‌شود. لطفاً راهنمايي كنند

vcldeveloper
سه شنبه 16 تیر 1388, 16:54 عصر
DBGrid برای دریافت اطلاعات به یک DataSource وصل میشه که این DataSource به یک Dataset متصل هست. این Dataset میتونه حاوی کل رکوردهای یک جدول در بانک باشه، یا نتیجه برگشت داده شده از یک کوئری. بطور عادی وقتی داده ایی از بانک درخواست می کنید، یک نسخه از رکوردهای مربوطه در Dataset لود میشند. اگر در سمت سرور تغییری بر روی داده ها اعمال بشه، بطور عادی Dataset راهی برای فهمیدن تغییر نداره.

برای تغییر داده های برگشت داده شده از بانک توسط Dataset، شما دو راه دارید: راه اول این هست که برای انجام تغییرات (حذف/اضافه/ویرایش) از متدهای Dataset استفاده کنید، مثل متد Delete, Insert, یا Edit. در این صورت، Dataset خودش دستورات SQL مورد نیاز را بطور خودکار تولید میکنه و به سرور ارسال میکنه، و داده های خودش را هم آپدیت میکنه. اما در راه دوم، شما از Dataset برای اعمال تغییرات استفاده نمی کنید، بلکه دستورات SQL را مستقیما به بانک ارسال می کنید. در این صورت، دستور مربوطه بر روی داده های بانک اعمال میشه، ولی چون از طریق Dataset صورت نگرفته، Dataset متوجه انجام آن نمیشه، و داده های خودش را هم آپدیت نمیکنه. در این حالت، داده سمت سرور تغییر کرده، ولی داده سمت کلاینت که در Dataset هست، تغییر نکرده. برای نمایش تغییر باید Dataset یک بار باز و بسته بشه.

در شرایط عادی شما باید از روش اول استفاده کنید، غیر از اینکه دلیل خوبی برای استفاده کردن از روش دوم داشته باشید. در روش اول شما مستقیما با هیچ دستور SQLایی درگیر نمیشید، و همه دستورات SQL بنا بر درخواست های شما از Dataset، توسط آن بطور خودکار تولید میشند.

ehsanbn
سه شنبه 16 تیر 1388, 17:06 عصر
دوست گرامي ممنون از راهنمايي شما. من تاحدودي فهميدم كه چكار بايد بكنم يك مثالي مي زنم شما توجه كنيد ببينيد درست متوجه شدم يا نه : مثلاً وقتي مي گويم اين ركورد را اضافه كن اضافه، اضافه مي كند و سپس بايد در متد after insert بايد كد مربوط به select بنويسيم تا تمام ركوردهاي آن جدول را نشان بدهد. درسته يا نه.

vcldeveloper
سه شنبه 16 تیر 1388, 17:13 عصر
نه، لازم به انجام این کار نیست. شما فقط رکورد جدید را اضافه می کنید، و دیگه لازم نیست کاری انجام بدید. مثلا اگر بخواید یک رکورد جدید به انتهای لیست رکوردها اضافه کنید، و فرضا رکوردهای شما هم دو فیلد FirstName و LastName داشته باشند، کل کدی که شما می نویسید این هست:


AdoTable1.Append;
AdoTable1.FieldByName('FirstName').AsString := 'John';
AdoTable1.FieldByName('LastName').AsString := 'Smith';
AdoTable1.Post;

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

ehsanbn
سه شنبه 16 تیر 1388, 19:51 عصر
اگر بخواهم با استفاده از دستورات اس كيو ال دستورات زيربنويسيم دراينصورت چگونه خواهد بود:
adoquery1.sql.clear;
adoquery1.sql.add('insert into student (name,Lname) values('ali';'mohammadi')');
adoqyery1.execsql;

vcldeveloper
چهارشنبه 17 تیر 1388, 09:35 صبح
اگر بخواهم با استفاده از دستورات اس كيو ال دستورات زيربنويسيم دراينصورت چگونه خواهد بود
دیتاست رکورد جدید را نمایش نمیده، و برای نمایش رکورد جدید باید دیتاست را یک بار باز و بسته کنید.

ehsanbn
پنج شنبه 18 تیر 1388, 00:39 صبح
دوست گرامي پس بايد چكار كنم آخه حتماً بايد از دستورات اس كيو ال استفاده در برنامه اي كه مي سازم.

vcldeveloper
پنج شنبه 18 تیر 1388, 03:02 صبح
حتماً بايد از دستورات اس كيو ال استفاده در برنامه اي كه مي سازم.
بایدش بابت چی هست؟ اگر بخواید حتما همچین کاری انجام بدید، یا باید خودتان مکانیزمی برای آپدیت دیتاست ها بعد از اعمال هر تغییر طراحی کنید، یا باید بانک تان قابلیت این را داشته باشد که با هر تغییری که روی یک سری داده های خاص اعمال می شود، کلاینت های مورد نظر را با خبر کند.

ehsanbn
پنج شنبه 18 تیر 1388, 17:31 عصر
منظور اين است كه در نوشتن سورس برنامه حتماً بايد از دستورات اس كيو ال استفاده كنم يعني دستورات select - update - insert to- delete و ... را بايد حتماً داشته باشد.

mehdimdp
پنج شنبه 18 تیر 1388, 17:46 عصر
شما ميتوني يك ديتاست بسازي وانو به جدولت ربط بدي و dbgrid رو به اون متصل كني.
براي استفاده از دستورات sql ميتوني از يك adocommand استفاده كني.
بعداز هربار كه دستورات رو exec كردي يه بار بايد active جدول رو false و true كني كه اطلاعات dbgrid به روز بشه.
البته خود دلفي دستورات insert , delete و ... رو دارد.

ehsanbn
پنج شنبه 18 تیر 1388, 18:28 عصر
دوست گرامي ميشه بيشتر توضيح بدهيد كه دقيقاً بايد چكار كنم. منظورم اين است كه مي خواهم دقيقاً بعد از هر دستور كه اجرا ميشه به طور اتوماتيك جدولي كه درست كردم تغييرات اعمال شده را نشان بده.

ehsanbn
جمعه 19 تیر 1388, 00:27 صبح
به ياري خداوند و كمك شما دوستان مشكلم حل شد. ممنون

mehdimdp
جمعه 19 تیر 1388, 00:29 صبح
بعداز اجراي دستورات مرتبط با هر جدول مي بايست active اون تيبلي رو كه به اون جدول اختصاص دادي به صورت زير false و true كني:


tabel.active:=false;
tabel.actvie:=true;