PDA

View Full Version : مقاله: مفاهیم پایه ای : DataSet، جستجو و فیلتر کردن



Hsimple11
شنبه 05 مرداد 1387, 00:29 صبح
با سلام.

از اونجا که بعضی از دوستان بخش دلفی (+ خود من) برنامه نویسی رو بصورت حرفه ای و پایه ای شروع نکردند و شاید (بازم مثل من!) رشته اصلیشون این نباشه؛ ممکنه با وجود نوشتن برنامه های زیاد برخی نکات پایه ای و اصلی رو ندونن یا فراموش کرده باشند.
برای همین خواستم در چند پست در مورد اینکه اصلا DataSet چی هست و طرز استفاده اصولی از انواع اون و بعدم جستجو و فیلتر کردن رو بنویسم. هرچند ممکنه برای خیلی از دوستان ابتدایی باشه. البته باید بگم که این مطالب عینا نوشته خودم نیستند.

برای اولین پست هم از خود DataSet شروع میکنیم :

در دلفی پایه و اساس دسترسی به داده ها DataSet است و یک شئی DataSet اغلب یک جدول، یک کوئری (Query) و یا یک Stored Procedure است.

TDataSet
TDataSet جد تمام اشیا DataSet ای می باشد (مثل Table، کوئری، Stored Procedure) که شما در برنامه تان ایجاد میکنید.

TDataSet یک مجموعه داده مجازی است بدین معنی که بسیاری از متدها و خواص آن مجازی (Virtual) و یا Abstract هستند. در مورد متدهای Vritual و Abstract : هم توی پرانتز داشته باشید که :

متدهای Virtual : متدی است که میتوان پیاده سازی آن را در اشیاء فرزند Override کرد.
متدهای Abstract : متدی است بدون پیاده سازی واقعی. که مانمیتونیم مستقیما از اون توی برنامه هامون استفاده کنیم.

TDataSet هم شامل متدهای Abstract است برای همین مستقیما نمیشه ازش در برنامه ها استفاده کرد و بجاش از فرزندهای اون مثل TQuery، TClientDataSet, TStoredProc و TTable استفاده میکنیم که همتون تا حالا باهاشون کار کردین.


در پست بعد با خواص DataSet ها و نحوه کار باهاشون بیشتر آشنا میشیم.


موفق باشید...

Hsimple11
شنبه 05 مرداد 1387, 18:34 عصر
با سلام...

در این پست در ادامه مبحث قبلی به نحوه استفاده از DataSet می پردازیم :

باز و بسته کردن DataSet ها

جهت خواندن یا نوشتن داده ها در یک جدول یا از طریق یک کوئری، بایستی ابتدا DataSet را باز کنیم. به 2 طریق میتوان یک DataSet را باز کرد :

1- خاصیت Active آنرا True کنیم. یا در زمان طراحی از طریق Object Inspector یا در زمان اجرا :

MyTable.Active := True;

2- استفاده از متد Open:

MyTable.Open;

به همین ترتیب به 2 طریق هم میتوان یک DataSet را بست یا با خاصیت Active و متد Active و یا استفاده از متد Close :

MyTable.Close;

ممکنه یک DataSet را در زمان تغییر خواصش و یا بدلیلی خاص در برنامه ببندیم و در زمان لازم اون رو باز کنیم.

حالتهای DataSet:

حالت و وضعیت یک DataSet مشخص میکند که چه عملیاتی میتواند بر روی داده ها صورت گیرد. مثلا وقتی DataSet ما بسته است حالت آن dsInActive است یعنی هیچ عملیاتی بر روی داده ها امکان پذیر نیست.
پس حالت (State) یک DataSet ممکن است :
dsInactive, dsBrowse, dsEdit, dsInsert, sdSetKey, dsCalcFields, dsFilter و ... باشد که با خیلی از اونا تا حالا کار کردیم :

در حالت پیش فرض، هنگام باز کردن DataSet در حالت dsBrowse قرار دارد. جهت تغییر آن باید از متدهای منطبق بر آن حالت استفاده کنیم. مثلا برای رفتن به حالت dsInsert از متد Insert استفاده میکنیم :

MyTable.Insert;

بدین ترتیب یک رکورد جدید در جدول MyTable ایجاد می شود. جهت ثبت داده ها از متد Post استفاده می کنیم. بدین ترتیب در صورت موفقیت Post، جدول مجددا به حالت dsBrowse می رود.

***هر زمان که حالت DataSet تغییر کند ، رویداد OnStateChange مربوط به DataSource ما فراخوانی می شود.


غیرفعال کردن یک DataSet :

همانطور که گفتم در زمانی که یک DataSet غیرفعال است که بسته باشد که در این حالت دسترسی به رکوردها نداریم. در زمان طراحی یک DataSet بصورت پیش فرض بسته است تا خاصیت Active آنرا True کنیم و در زمان اجرا هم یک DataSet بصورت Default بسته است مگر آنکه از متد Open یا خاصیت Active استفاده کنیم.

رویدادهای BeforeClose و AfterClose جهت کنترل بیشتر در پاسخ به متد Close قابل کد نویسی اند. برای مثال اگر یک DataSet در حالت dsInsert و یا dsEdit باشد و متد Close فراخوانی شود، شما ممکن است بخواهید پیغامی به کاربر بدهید که ابتدا تغییرات انجام شده را به ثبت رسانده یا انصراف دهد و سپس Close فراخوانده شود. در این حالت از BeforeClose استفاده میکنیم :


Procedure MyTable.VerifyBeforeClose(DataSet : TDataSet);
Begin
If (MyTable.State = dsEdit) or (MyTable.State = dsInsert) Then
Begin
If MessageDlg('Post Changes Before Closing?',
mtConfirmation,mbYesNo,0) = mrYes Then
MyTable.Post
Else
MyTable.Cancel;
End;
End;


در پست بعد به نمایش، ویرایش و جستجو در DataSet خواهیم پرداخت...

موفق باشید...

famarini
دوشنبه 13 دی 1389, 20:28 عصر
سلام به همگی
کاش می شد یه نفر پیدا می شد این مبحث رو ادامه می داد واقعا حیفه !!!

با تشکر از اساتید و دوستان