PDA

View Full Version : آموزش: آموزش Microsoft Data Access Objects) DAO)



saeed1234n
سه شنبه 14 خرداد 1392, 22:28 عصر
با سلام

بنده آموزش های DAO از سایت functionx.com را ترجمه کرده ام .

و این فکر به ذهنم رسید که :

اگر مدیر تالار ( جناب استاد امیری ) و دیگر اساتید تالار موافق باشند .

متن ترجمه شده این آموزش ها را با شرایط و قوانینی که شما خوبان در نظر می گیرید

در هر پست بخشی از آنرا در این تاپیک قرار بدهم .

Abbas Amiri
سه شنبه 14 خرداد 1392, 22:41 عصر
سلام

بسیار عالی است و مطمئنا دوستان از این مطالب استفاده خواهند کرد.

هرکدام از عزیزان هم که تبحر کافی دارند نسبت به توضیحات تکمیلی و یا درج مثال همکاری کنند.

saeed1234n
سه شنبه 14 خرداد 1392, 23:10 عصر
با سلام

ضمن تشکر از جناب آقای امیری که موافقت خود را اعلام داشتند .

قبل از شروع درج مطالب نکاتی را باید بعرض دوستان برسانم :

1- مطالب ارائه شده نظرات بنده نیست بلکه ترجمه از سایت مذکور میباشد
بنابراین از لحاظ محتوی مطالب ارائه شده بنده بی تقصیرم .

2- بنده مترجم نیستم ، پس شاید از لحاظ ترجمه نواقصی از لحاظ ویراستاری و گرامری مشهود باشد .

3- سبک ترجمه به شیوه کلمه به کلمه بوده بنابراین سعی بنده بر رساندن مفهوم کلی جملات و عبارات بوده است و مطالب را بصورت محاوره ای ترجمه کرده ام .

4- از گزافه گویی هایی که در بعضی قسمت های سایت دیده شده صرفنظر کردم .

5- هر گونه انتقادی را به دیده منت می پذیرم .

با امید به اینکه مطالب ارائه شده سودمند واقع شود .

Abbas Amiri
سه شنبه 14 خرداد 1392, 23:30 عصر
سلام

لازم به ذکر است یکی از آسان ترین روشها جهت دستیابی و دستکاری آبجکتها و دیتا در اکسس استفاده از متدها و خصوصیات شیء DAO و زیر مجموعه های آن است .

به همین دلیل دنبال کردن دقیق این تاپیک را به مشتاقان یادگیری سطح متوسط و پیشرفته اکسس ، توصیه می کنم .

saeed1234n
چهارشنبه 15 خرداد 1392, 00:17 صبح
با سلام

بخش اول :

آشنایی با DAO :
مرور کلی :
DAO کتابخانه ای است که توسط ماکروسافت منتشر شده است . این کتابخانه برای ایجاد و مدیریت
دیتابیس بکار می رود .
به هنگام شروع کار با اکسس ، DAO بطور پیش فرض آماده برای استفاده میباشد .
بنابراین شما مجبور به باز کردن یا افزودن آن به دیتا بیس نیستید .
DOA و دیتابیس : کلاس DATABASE
کتابخانه DAO برای پشتیبانی از دیتابیس کلاسی به نامه DATABASE ارائه کرده است .
برای استفاده از آن : در ابتدا متغیری از این نوع کلاس معرفی کنید .
مثال :

Private Sub cmdCreate_Click()
Dim db As DAO.Database
End Sub


بعد از معرفی متغیر شما می توانید از دیتابیس هر طور که مناسب می دانید استفاده کنید.

بستن یک دیتابیس DAO
بعد از بکارگیری دیتابیس ، شما باید آنرا ببندید تا منابع در مصرف را توسط دیتابیس آزاد شوند.
برای بستن دیتابیس ، متد Close() از شی Database را فراخوانی کنید .
مثال :

Private Sub cmdCreate_Click()
Dim db As DAO.Database

db.Close
End Sub


به هنگام کار بر روی دیتابیس ، منابع کامپیوتر در مصرف میباشد .
زمانی که به متغیرهای دیتابیس نیازی ندارید باید منابعی که در حال مصرف بود
را آزاد کنید تا در اختیار دیگر بخش های کامپیوتر قرار گیرد .
برای پاک کردن حافظه تخصیص یافته به متغیر . توسط عامل SET ، ثابت NOTHING را
به آن تخصیص دهید .
مثال :

Private Sub cmdCreate_Click()
Dim db As DAO.Database

db.Close

Set db = Nothing
End Sub


ایجاد یک دیتابیس در DAO
DAO یکی از قدیمی ترین و انعطاف پذیرترین کتابخانه های اکسس میباشد .
که توسط دیگر برنامه های منتشره توسط سایر شرکتها نیز مورد استفاده قرار میگیرد .
بر این اساس DAO پشتیبانی می کند از تمامی عملیاتی که می تواند دز یک دیتابیس صورت بگیرد .
یکی از این عملیات پایه ، ایجاد یک دیتابیس است .
برای پشتیبانی از ایجاد دیتابیس ، کلاس DBEngne از کتابخانه DAO به متدی بنام CreateDatabase مجهز شده است .

DBEngine.CreateDatabase(ByVal Name As String, _
ByVal locale As String, _
ByVal options As Variant) As Database


به دلیل اینکه شی DBEngine قبلا در دیتابیس جاری معرفی شده است . به هنگام فراخوانی
این متد می توانید آنرا حذف کنید .
هنگام اتمام متد CreateDatabase() ، آن ارجاع داده میشود به دیتابیسی که ایجاد شده .
شما باید این ارجاع را بدست بیاورید ( ارائه کنید ) .
برای دسترسی به آن در ابتدا متغیری از نوع Database معرفی کنید .
برای ارجاع به دیتابیس جدید ، از عملگر SET استفاده کنید و تخصیص دهید مقدار برگشت داده شده از متد را به متغیر دیتابیستان .
مثال : ایجاد یک دیتابیس جدید به نام Exercise.accdb در پوشه جاری :

Private Sub cmdCreate_Click()
Dim db As DAO.Database
Set db = CreateDatabase("Exercise.accdb", dbLangGeneral)
db.Close
Set db = Nothing
End Sub

باز کردن دیتابیس
برای بکار گیری دیتابیس باید آنرا باز کنید .
برای پشتیبانی از این عملیات ، کلاس DBEngine متد OpenDatabase() را ارائه کرده است .
مثال :

Private Sub cmdOpenDatabase_Click()
Dim db As DAO.Database
Set db = OpenDatabase("Example.accdb")
db.Close
Set db = Nothing
End Sub

saeed1234n
چهارشنبه 15 خرداد 1392, 02:23 صبح
با سلام

بخش دوم :

ارجاع به دیتابیس فعلی
باز کردن یک دیتابیس به شما اجازه میدهد به آن رجوع کنید و آنچه را که می خواهید انجام دهید .
بعضی اوقات شما می خواهید به جای اینکه یک دیتابیس دیگر را باز کنید در دیتابیس فعلی کار کنید .
برای اینکه بتوانید به دیتابیس فعلی دسترسی داشته باشید اکسس یک شی ثابتی به نام CurrentDb ارائه کرده است.
برای استفاده از آن ، توسط عامل SET آنرا به متغیر Database تخصیص دهید ( منتسب کنید ).
مثال :

Private Sub cmdCurrentDatabase_Click()
Dim curDatabase As DAO.Database
Set curDatabase = CurrentDb
. . . Use the curDatabase variable however you want
curDatabase.Close
Set curDatabase = Nothing
End SuB


آشنایی با جداول دیتابیس
در DAO جدول شیئی از نوع DAO.TableDef میباشد .
جداول دیتابیس DAO در یک کلکسیونی به نام TableDefs ذخیره می شوند .
برای دسترسی به این کلکسیون ، DAO دارای کلکسیونی به نام Tabledefs از نوع DAO.Tabledefs میباشد .

ایجاد جدول در DAO
قبل از ایجاد یک جدول شما باید در ابتدا متغیری از نوع DAO.TableDefمعرفی کنید .

مثال :

Private Sub cmdCreateTable_Click()
Dim dbExercise As DAO.Database
Dim tblEmployees As DAO.TableDef
' Open the database
Set dbExercise = DBEngine.OpenDatabase("C:\My Documents\Exercise.accdb")
' Create a new TableDef object.
Set tblEmployees = dbExercise.CreateTableDef("Employees")
. . .
End Sub


بعد از اتمام مقدار دهی . شما می توانید آنرا به دیتابیستان بیافزایید توسط پاس دادن آن به متد Append() از دیتابیسی که جدول را دریافت خواهد کرد .
مثال :

Private Sub cmdCreateTable_Click()
Dim dbExercise As DAO.Database
Dim tblEmployees As DAO.TableDef
' Open the database
Set dbExercise = DBEngine.OpenDatabase("C:\My Documents\Exercise.accdb")
' Create a new TableDef object.
Set tblEmployees = dbExercise.CreateTableDef("Employees")
. . .
' Add the new table to the database.
dbExercise.TableDefs.Append tblEmployees
dbExercise.Close
Set dbExercise = Nothing
End SuB


برای رجوع به جدول ، دسترسی پیدا کنید به جدول توسط شاخص ( ایندکس ) یا نام آن از طریق صفت TableDefs.
از ثابت SET استفاده کنید برای انتساب آن ارجاع به متغیری که از قبل معرفی شده از نوع DAO.TableDef .
مثال : ارجاع به اولین جدول در دیتابیس فعلی :

Private Sub cmdContrators_Click()
Dim curDatabase As DAO.Database
Dim tblContractors As DAO.TableDef
' Get a reference to the current database
Set curDatabase = CurrentDb
' Get a reference to a table named Contractors
Set tblContractors = curDatabase.TableDefs(0)
curDatabase.Close
Set curDatabase = Nothing
End Sub

saeed1234n
چهارشنبه 15 خرداد 1392, 03:19 صبح
با سلام

بخش سوم

حذف جدول در DAO
برای حذف جدول ، نام جدول را به متد Delete() از صفت DAO.TableDefs دیتابیس منتقل کنید .
مثال :


Private Sub cmdDeleteTable_Click()
Dim curDatabase As DAO.Database
Set curDatabase = CurrentDb
curDatabase.TableDefs.Delete "Books"
curDatabase.Close
Set curDatabase = Nothing
End Sub


مقدمه ای بر ( آشنایی با ) ستون های یک جدول
آشنایی با فیلدها
یک ستون جدول ، فیلد هم نامیده می شود . DAO برای پشتیبانی از ستونها کلاس DAO.Field را ارائه کرده است.
برای دسترسی به کلکسیون فیلدهای یک جدول در DAO ، شی TableDef به صفتی به نام Fields مجهز شده است. که هم نام اسمش در کلکسیون اس .
هر عضو از کلکسیون یک شیئی از DAO.Field است .
خواص یک فیلد
تعداد ستونهای یک جدول توسط صفتی به نام Count از کلکسیون Fields مشخص می شوند .
برای تشخیص هر ستون جدول ، کلکسیون Fields به صفتی به نام Item مجهز شده است.
این نوع صفت همچنین بعنوان ایندکس ( شاخص ) اشاره دارد (بکار میرود ). زیرا این صفت (Item) دارای آرگومانی است که توسط آن عضوی را که می خواهید در کلکسیون به آن دسترسی پیدا کنید را تعیین می کند.
برای دسترسی به ستون ، نام یا ایندکس ( شاخص – شماره – عدد ) ستون را به صفت Item انتقال دهید.
اگر نام ستون را بدانید می توانید آنرا بصورت یک رشته درون صفت انتقال دهید.
مثال :

Fields.Item("[Last Name]")

Item صفت پیش فرض کلکسیون Fields است .
اگر شما نام یک ستون را ندانید ، می توانید توسط شاخصش به آن ستون دسترسی داشته باشید .
شما ایندکس آن ستون را به صفت Item منتقل کنید.
بخاطر داشته باشید که ایندکس از صفر شروع می شود . بر این اساس برای دسترسی به ستون سوم یک جدول شما می توانید از یکی از ای دو راه استفاده کنید .
مثال :

Fields.Item(2)
Fields(2)

saeed1234n
چهارشنبه 15 خرداد 1392, 10:58 صبح
سلام

دوستان و اساتید گرامی اگر نقطه نظری دارید بفرمایید

در غیر اینصورت مطالب را به همین صورت ادامه دهم .

با تشکر از عنایت شما خوبان .

saeed1234n
پنج شنبه 16 خرداد 1392, 11:46 صبح
با سلام

امیدوارم که تا به اینجا خسته نشده باشید .

بخش چهارم

ساخت ستون در DAO
قبل از ایجاد یک ستون متغیری از نوع DAO.FIELD معرفی کنید .
مثال :

Private Sub cmdCreateTable_Click()
Dim fldEmployeeNumber As DAO.Field
Dim fldFirstName As DAO.Field
Dim fldLastName As DAO.Field
End Sub


و در ابتدا مقدار دهی کنید جدولی که مقادیر فیلدها در آن قرار خواهند گرفت .

Private Sub cmdCreateTable_Click()
Dim dbExercise As DAO.Database
Dim tblEmployees As DAO.TableDef

' Open the database
Set dbExercise = DBEngine.OpenDatabase("C:\My Documents\Exercise.accdb")

' Create a new TableDef object.
Set tblEmployees = dbExercise.CreateTableDef("Employees")

. . .

End Sub



بعد از مقدار دهی جدول ، ستونها را به جدول اضافه کنید .
برای ساخت یک ستون ، متد CreateField() از متغیر DAO.TableDef را فراخوانی کنید و به آن متغیر ستون را انتساب دهید .
گرامر آن به شکل زیر است :

Set fldEmployeeNumber = tblEmployees.CreateField(ByVal ColumnName As String, _
ByVal DataType As FieldType, _
ByVal FieldSize As Integer)



بعد از ایجاد ستون ، آنها را به ستون اضافه کنید .
برای انجام این کار ، آنرا به متد Append() از کلکسیون Fields کلاس DAO.TableDef منتقل کنید .
مثال :

Private Sub cmdCreateTable_Click()
Dim dbExercise As DAO.Database
Dim tblEmployees As DAO.TableDef
Dim fldEmployeeNumber As DAO.Field

' Specify the database to use
Set dbExercise = DBEngine.OpenDatabase("C:\My Documents\Exercise.accdb")

' Create a new TableDef object.
Set tblEmployees = dbExercise.CreateTableDef("Employees")

Set fldEmployeeNumber = tblEmployees.CreateField(ColumnName, DataType, FieldSize)
tblEmployees.Fields.Append fldEmployeeNumber


' Add the new table to the database.
dbExercise.TableDefs.Append tblEmployees

dbExercise.Close
Set dbExercise = Nothing

Application.RefreshDatabaseWindow
End Sub


برای تعیین نام ستون جدید ، هنگام فراخوانی متد DAO.Database.CreateTableDef() ، نامی را بصورت رشته به اولین آرگومان این متد منتقل کنید .
مثال :

Private Sub cmdCreateTable_Click()
Dim dbExercise As DAO.Database
Dim tblEmployees As DAO.TableDef
Dim fldEmployeeNumber As DAO.Field

' Specify the database to use
Set dbExercise = DBEngine.OpenDatabase("C:\My Documents\Exercise.accdb")

' Create a new TableDef object.
Set tblEmployees = dbExercise.CreateTableDef("Employees")

Set fldEmployeeNumber = tblEmployees.CreateField("EmployeeNumber", DataType, FieldSize)
tblEmployees.Fields.Append fldEmployeeNumber
.
.
.


End Sub


افزودن یک ستون جدید به جدول موجود .
متغیری از نوع DAO.Field. معرفی کنید .
سپس متد CreateField() را فراخوانی کنید و نام ستون را به آن منتقل کنید و متد Append() از کلکسیون Fields را فراخوانی کنید و آنرا به شی DAO.TableDef منتقل کنید .
مثال :

Private Sub cmdAddColumn_Click()
Dim curDatabase As Object
Dim tblStudents As Object
Dim colFullName As Object

' Get a reference to the current database
Set curDatabase = CurrentDb
' Get a reference to a table named Customers
Set tblStudents = curDatabase.TableDefs("Students")

Set colFullName = tblCustomers.CreateField("FullName", DataType)
tblCustomers.Fields.Append colFullName

curDatabase.Close
Set curDatabase = Nothing
End Sub


حذف ستون
قبل از انجام هر عملیاتی در ستون باید در ابتدا به جدول ارجاع دهید .
متد Delete() از متغیر DAO.TableDef را فراخوانی کنید و نام ستون را به ان منتقل کنید .
گرامر :


TableDef.Fields.Delete ColumnName



در این فرمول نام ستونی که می خواهید حذف کنید جایگزین ColumnName کنید .
مثال :

Private Sub cmdModifyPersons_Click()
Dim curDatabase As DAO.Database
Dim tblPersons As DAO.TableDef

' Get a reference to the current database
Set curDatabase = CurrentDb
' Get a reference to a table named Customers
Set tblPersons = curDatabase.TableDefs("Persons")

tblPersons.Fields.Delete "DateHired"

curDatabase.Close
Set curDatabase = Nothing
End Sub

saeed1234n
پنج شنبه 16 خرداد 1392, 12:09 عصر
با سلام

بخش پنجم

نوع داده یک فیلد
ما قبلاً با ساخت جدول توسط فراخوانی متد CreateField() که دارای سه آرگومان است آشنا شدیم .
گرامر :

Set fldEmployeeNumber = tblEmployees.CreateField("EmployeeNumber", DataType, FieldSize)



آرگومان دوم از متد CreateField() نوع داده ستون را مشخص می کند .

فیلدهای متنی
برای پشتیبانی از ستونهایی از نوع متنی ، کتابخانه DAO نوع داده DB_TEXT یا dbText را ارائه کرده است .
مثال :

Private Sub cmdCreateTable_Click()
Dim dbExercise As DAO.Database
Dim tblEmployees As DAO.TableDef
Dim fldEmployeeNumber As DAO.Field

' Specify the database to use
Set dbExercise = DBEngine.OpenDatabase("Exercise.accdb")

' Create a new TableDef object.
Set tblEmployees = dbExercise.CreateTableDef("Employees")

Set fldEmployeeNumber = tblEmployees.CreateField("EmployeeNumber", DB_TEXT)
tblEmployees.Fields.Append fldEmployeeNumber

' Add the new table to the database.
dbExercise.TableDefs.Append tblEmployees

dbExercise.Close
Set dbExercise = Nothing

Application.RefreshDatabaseWindow
End Sub



فیلدهای عددی بدون اعشار :
هنگام ایجاد یک فیلد که اعداد کوچک را در خود نگه میدارد نوع داده آنرا به DB_BYTE یا dbByte تنظیم کنید .

اگر فیلدی که ایجاد کردید حاوی اعداد طبیعی معمولی است نوع داده آنرا به DB_INTEGER یا dbInteger تنظیم کنید .
اگر فیلدی که ایجاد کردید حاوی اعداد خیلی بزرگ است نوع داده آنرا به DB_LONG یا dbLong تنظیم کنید .
مثال: اساخت جدولی با سه فیلد عددی

Private Sub cmdCreateTable_Click()
Dim dbCurrent As DAO.Database
Dim tblCustomers As DAO.TableDef
Dim fldCustomerName As DAO.Field
Dim fldCategory As DAO.Field
Dim fldContractStatus As DAO.Field
Dim fldContractLength As DAO.Field

' Specify the database to use
Set dbCurrent = CurrentDb

' Create a new TableDef object.
Set tblCustomers = dbCurrent.CreateTableDef("Customers")

Set fldCustomerName = tblCustomers.CreateField("CustomerName", DB_TEXT)
tblCustomers.Fields.Append fldCustomerName

Set fldCategory = tblCustomers.CreateField("Category", DB_INTEGER)
tblCustomers.Fields.Append fldCategory

Set fldContractStatus = tblCustomers.CreateField("Contract Status", DB_BYTE)
tblCustomers.Fields.Append fldContractStatus

Set fldContractLength = tblCustomers.CreateField("Contract Length", DB_LONG)
tblCustomers.Fields.Append fldContractLength

' Add the new table to the database.
dbCurrent.TableDefs.Append tblCustomers

dbCurrent.Close
Set dbCurrent = Nothing

Application.RefreshDatabaseWindow
End Sub


فیلدهای بولی BOOLEAN ) ) :
اگر ایجاد کنید یک ستون که حاوی مقادیر بولی خواهد بود نوع داده آنرا به DB_BOOLEAN تنظیم کنید .
مثال :

Private Sub cmdTableCreation_Click()
Dim curDatabase As DAO.Database
Dim tblStudents As DAO.TableDef
Dim colFullName As DAO.Field
Dim colWasTransfered As DAO.Field

Set curDatabase = CurrentDb

Set tblStudents = curDatabase.CreateTableDef("Students")

Set colFullName = tblStudents.CreateField("FullName", dbText)
tblStudents.Fields.Append colFullName

Set colWasTransfered = tblStudents.CreateField("WasTransfered", DB_BOOLEAN)
tblStudents.Fields.Append colWasTransfered

curDatabase.TableDefs.Append tblStudents

curDatabase.Close
Set curDatabase = Nothing

Application.RefreshDatabaseWindow
End Sub



فیلدهای عددی اعشاری :
برای ساخت یک فیلدی که اعداد اعشاری را در خود نگه میدارد نوع داده آنها را به dbSingle یا DB_SINGLE تنظیم کنید .
مثال :

Private Sub cmdCreateTable_Click()
Dim curDatabase As DAO.Database
Dim tblEmployees As DAO.TableDef
Dim fldEmployeeNumber As DAO.Field
Dim fldFullName As DAO.Field
Dim fldWeeklyHours As DAO.Field

' Specify the database to use
Set curDatabase = CurrentDb

' Create a new TableDef object.
Set tblEmployees = dbExercise.CreateTableDef("Employees")

Set fldEmployeeNumber = tblEmployees.CreateField("EmployeeNumber", dbLong)
tblEmployees.Fields.Append fldEmployeeNumber

Set fldFullName = tblEmployees.CreateField("FullName", dbText)
tblEmployees.Fields.Append fldFullName

Set fldWeeklyHours = tblEmployees.CreateField("WeeklyHours", dbSingle)
tblEmployees.Fields.Append fldWeeklyHours

' Add the new table to the database.
curDatabase.TableDefs.Append tblEmployees

curDatabase.Close
Set curDatabase = Nothing

Application.RefreshDatabaseWindow
End Sub


فیلدهای مالی :
اگر فیلدی ایجاد کرده اید که مقادیر مالی را در خود نگه میدارد ، نوع داده انرا به dbCurrency یا DB_CURRENCY تنظیم کنید .

فیلدهای تاریخ / زمان :
اگر شما ایجاد کرده اید ستونی برای حفظ مقادیر تاریخ یا زمان ، نوع داده را به DB_DATE یا dbDate تنظیم کنید .
مثال :

Private Sub cmdTable_Click()
Dim curDatabase As DAO.Database
Dim tblContractors As DAO.TableDef
Dim fldName As DAO.Field
Dim fldStartDate As DAO.Field
Dim fldEndDate As DAO.Field

Set curDatabase = CurrentDb
Set tblContractors = curDatabase.CreateTableDef("Contractors")

Set fldName = tblContractors.CreateField("Contractor Name", DB_TEXT, 100)
tblContractors.Fields.Append fldName
Set fldStartDate = tblContractors.CreateField("Start Date", dbDate)
tblContractors.Fields.Append fldStartDate
Set fldEndDate = tblContractors.CreateField("End Date", dbDate)
tblContractors.Fields.Append fldEndDate

curDatabase.TableDefs.Append tblContractors

MsgBox "A table named Contractors has been created."

curDatabase.Close
Set curDatabase = Nothing

Application.RefreshDatabaseWindow
End Sub




فیلدهای باینری :
نوع داده فیلدهای باینری را به شکل dbBinary بنویسید .

ایجاد فیلد MEMO در DAO
اگر بخواهید مقدار متنی طولانی را در یک ستون قرار دهید نوع داده آنرا باید از نوع dbMemo مشخص کنید .
مثال :

Private Sub cmdTableCreation_Click()
Dim curDatabase As DAO.Database
Dim tblStudents As DAO.TableDef
Dim colFullName As DAO.Field
Dim colAnnualReview As DAO.Field

' Get a reference to the current database
Set curDatabase = CurrentDb
' Create a new table named Students
Set tblStudents = curDatabase.CreateTableDef("Students")

Set colFullName = tblStudents.CreateField("FullName", dbText)
tblStudents.Fields.Append colFullName

Set colAnnualReview = tblStudents.CreateField("AnnualReview", dbMemo)
tblStudents.Fields.Append colAnnualReview

' Add the Students table to the current database
curDatabase.TableDefs.Append tblStudents

DoCmd.SelectObject acTable, "Students", True

curDatabase.Close
Set curDatabase = Nothing

Application.RefreshDatabaseWindow
End Sub

saeed1234n
پنج شنبه 16 خرداد 1392, 13:30 عصر
با سلام

بخش ششم آموزش :

آشنایی با رکوردستها ( مجموعه رکورد ) در DAO
همانطور که از قبل می دانید ، یک جدول یا رکورد دارای یک سری رکوردهاست .
برای انجام بعضی از عملیات در مجموعه رکوردها ، رکوردها بصورت گروهی رفتار می کنند .
به چنین گروه رکوردها یا مجموعه رکوردها ، رکوردست می گویند .

انواع رکوردستها :
همانطور که می دانید و بعدا خواهید دید ، یکی از رایجترین عملیاتی که در یک رکوردست انجام می شود ، جابجایی میان رکوردهاست .
در این هنگام نتیجه ای که بدست می آورید بستگی به نوع رکوردست شما دارد .
بر اساس نوع رفتارشان ، دو دسته بندی اصلی وجود دارد :
table-type :
رکوردست هایی که مستقیما از یک جدول گرفته شده اند.
Dynaset :
رکوردستی که از کوئری ساخته شده است. در واقع بعد از ساخت رکورد ست ، اگر هر مقداری در مجموعه تغییر پیدا کند ، رکوردها بصورت پویا (اتوماتیک وار) آپدیت می شود .به این معنی که نتیجه ای که شما در رکوردست می بینید داده های واقعی است .
Snapshot :
لیستی از رکوردها بر اساس شیوه ای که رکوردها ساخته یا تولید می شوند . اگر در رکوردها تغییراتی اعمال شود ( از قبیل اینکه شخصی مقدار فیلدی را تغییر دهد یا مقدار یک فیلد را حذف کند ) بعد از ایجاد رکوردست ، رکوردست تغییرات اعمال شده را نشان نخواهد داد . اگر بخواهید تغییرات را مشاهده کنید باید رکورد ست را رفرش کنید (-REFRESH-) بعبارتی دوباره سازی رکوردست .

ساخت رکوردست
DAO برای پشتیبانی از رکوردستها ، کلاس DAO.Recordset را ارائه کرده است .
بنابراین گام اصلی برای ساخت رکورد ست معرفی متغیری از نوع DAO.Recordset است .
شیوه ساخت رکوردست به تکنیکی که شما بکار می برید ، بستگی دارد .
برای ساخت یک رکوردستی که از رکوردهای یک جدول استفاده می کند متغیری از نوع DAO.Recordset معرفی کنید و نام جدول را به آن منتقل کنید .
برای پشتیبانی از این تکنیک کلاس DAO.Database به متدی به نام OpenRecordset مجهز شده است.
گرامر :

expression.OpenRecordset(Name, Type, Options, LockEdit)


تنها اولین آرگومان ضروری ( اجباری ) است .
بنابراین برای ساخت یک رکوردست از یک جدول ، نام آن جدول را به متد DAO.Database.OpenRecordset() منتقل کنید و عملگر SET را برای بدست آوردن مقدار برگشتی به آن بکار گیرید.
مثال :

Private Sub cmdGetRecordSet_Click()
Dim dbExercise As DAO.Database
Dim rsEmployees As DAO.Recordset

Set dbExercise = CurrentDb
Set rsEmployees = dbExercise.OpenRecordset("Employees")

dbExercise.Close
Set dbExercise = Nothing
End Sub

در DAO کلاس TableDef به متدی به نام OpenRecordset مجهز شده است .
برای ایجاد رکوردست از جدول ، در ابتدا مراجعه کنید ( ارجاع دهید ) به آن جدول . سپس عملگر SETرا بکار گیرید برای انتساب به متغیر مربوطه با فراخوانی متد TableDef.OpenRecordset().
مثال :

Private Sub cmdCreateRecordSet_Click()
Dim dbExercise As DAO.Database
Dim rsCustomers As DAO.Recordset
Dim tblCustomers As DAO.TableDef

' Get a reference to the current database
Set dbExercise = CurrentDb
' Get a reference to a table named Customers
Set tblCustomers = dbExercise.TableDefs("Customers")
' Create a Recordset object from the specified table
Set rsCustomers = tblCustomers.OpenRecordset

dbExercise.Close
Set dbExercise = Nothing
End Sub

برخی از کنترل ها مثل کمبو باکس ، لیست باکس ، فرم یا گزارش لیستی از رکوردها را در خود نگه میدارند به این معنی که این کنترل ها دارای رکورد ست خودشان هستند .
چنین کنترلهایی صفتی به نام Recordset دارند . برای ارجاع به آن رکوردستها ، متغیری از نوع DAO.Recordset معرفی کنید و مقدار Recordset کنترل را به آن تخصیص دهید .
مثال :

Private Sub cmdGetRecordSet_Click()
Dim dbExercise As DAO.Database
Dim rsEmployees As DAO.Recordset

Set dbExercise = CurrentDb

Set rsEmployees = Me.Recordset

dbExercise.Close
Set dbExercise = Nothing
End Sub

یک فرم یا گزارش صفتی به نام RecordSource دارد که فرم یا گزارش را از یک جدول تغذیه می کند.
برای بدست آوردن مجموعه رکوردهایی که صفت RecordSource در خود نگه می دارد از صفت RecordsetClone فرم یا گزارش استفاده کنید .

بستن رکوردست :
بعد از بکارگیری شی DAO.Recordset شما باید آنرا ببندید .
برای بستن رکوردست متد Close() آنرا فراخوانی کنید .
مثال :

Private Sub cmdCreateRecordSet_Click()
Dim dbExercise As DAO.Database
Dim rsCustomers As DAO.Recordset
Dim tblCustomers As DAO.TableDef

Set dbExercise = CurrentDb
Set tblCustomers = dbExercise.TableDefs("Customers")
Set rsCustomers = tblCustomers.OpenRecordset

rsCustomers.Close
dbExercise.Close
Set dbExercise = Nothing
End Sub

بعد از بستن رکوردست باید منابع مصرفی را آزاد کنید تا قابل استفاده برای سایر برنامه هایی که به آن نیاز دارند باشد .
برای این کار مقدار Nothing را به شی DAO.Recordset تخصیص دهید .
مثال :

Private Sub cmdCreateRecordSet_Click()
Dim dbExercise As DAO.Database
Dim rsCustomers As DAO.Recordset
Dim tblCustomers As DAO.TableDef

Set dbExercise = CurrentDb
Set tblCustomers = dbExercise.TableDefs("Customers")
Set rsCustomers = tblCustomers.OpenRecordset

rsCustomers.Close
Set rsCustomers = Nothing

dbExercise.Close
Set dbExercise = Nothing
End Sub

saeed1234n
جمعه 17 خرداد 1392, 02:28 صبح
با سلام

بخش هفتم :

مقدمه ای بر ورود داده ها
قبل از اجرای عملیات در یک جدول ، در ابتدا نیاز دارید که به آن جدول رجوع کنید که مشابه بازکردن رکوردست است .
ما قبلا راه های مختلفی را برای انجام آنها مشاهده کرده ایم ، مثل فراخوانی متد OpenRecordset() از کلاس Database .
بیاد دارید که شیوه های دیگری برای ایجاد یا بازکردن رکورد ست وجود دارد ..
زمانی که رکوردست در دسترس است می توانید داده ها را در آن وارد کنید . برای شروع متد AddNew() از کلاس Recordset را فراخوانی کنید .
مثال :

Private Sub cmdCreateEmployee_Click()
Dim dbExercise As DAO.Database
Dim rsEmployees As DAO.Recordset

Set dbExercise = CurrentDb
Set rsEmployees = dbExercise.OpenRecordset("Employees")

rsEmployees.AddNew

dbExercise.Close
Set dbExercise = Nothing
End Sub

برای تعیین مقدار یک فیلد در ابتدا به آن فیلد توسط ایندکس ( شماره ) یا نامش که اعمال شده به متغیر Recordset دسترسی پیدا کنید .
از صفت Value فیلد برای انتساب مقدار مناسب به آن استفاده کنید .
این عمل را می توانید بکار برید برای فیلدهای مختلفی که می خواهید مقادیرشان را وارد کنید .
برای شروع متد Update از کلاس Recordset را فراخوانی کنید .

ورود داده با توجه به نوع آن
شیوه ای که شما بکار میبرید برای مقدار دهی به یک فیلد به نوع آن مقدار بستگی دارد .
بطور مثال : مقدار یک ستون از نوع متن باید در بین علامت نقل قول (" ")قرار گیرد .
مثال :

Private Sub cmdCreateEmployee_Click()
Dim dbExercise As DAO.Database
Dim rsEmployees As DAO.Recordset

Set dbExercise = CurrentDb
Set rsEmployees = dbExercise.OpenRecordset("Employees")

rsEmployees.AddNew
rsEmployees("EmployeeName").Value = "John Schwartz"
rsEmployees.Update

dbExercise.Close
Set dbExercise = Nothing
End Sub

برای تعیین مقدار یک فیلد بولی ، اختصاص دهید True یا False به صفت Value آن .
مثال :

Private Sub cmdCreateEmployee_Click()
Dim dbExercise As DAO.Database
Dim rsEmployees As DAO.Recordset

Set dbExercise = CurrentDb
Set rsEmployees = dbExercise.OpenRecordset("Employees")

rsEmployees.AddNew
rsEmployees("EmployeeName").Value = "John Schwartz"
rsEmployees("IsFullTime").Value = True
rsEmployees.Update

dbExercise.Close
Set dbExercise = Nothing
End Sub

برای تعیین مقدار یک فیلد عددی ، مقدار مناسب را به صفت Value آن اختصاص دهید.
برای ورود داده از نوع تاریخ یا زمان در DOA مقدار آن را بین دو علامت # # قرار دهید. سپس آن مقدار را به صفت Value از شی DAO.Field اختصاص دهید .
مثال :

Private Sub cmdCreateEmployee_Click()

rsEmployees.AddNew
rsEmployees("EmployeeNumber").Value = 92073
rsEmployees("DateHired").Value = #4/12/2010#
rsEmployees("EmployeeName").Value = "John Schwartz"
rsEmployees("IsFullTime").Value = True
rsEmployees.Update

End Sub

حتی می توانید مقدار تاریخ یا زمان را بین دو علامت نقل قول وارد کنید .
rsEmployees("DateHired").Value = "10/05/2008"

طول یک فیلد :
در هنگام ایجاد یک ستونی متنی حداکثر تعداد حروف آنرا تعیین کنید .
یک مقدار عددی را به آرگومان سوم از متد DAO.TableDef.CreateField() انتقال دهید.
مثال :

Set fldEmploymentStatus = _
tblEmployees.CreateField("EmploymentStatus", DB_TEXT, 80)
tblEmployees.Fields.Append fldEmploymentStatus

افزایش اتوماتیک وار (بطور خودکار )مقدار یک فیلد :
شما می توانید یک فیلد عددی ایجاد کنید که مقدار آن در هر رکورد جدید بطور خودکار افزایش پیدا می کند .
برای این کار از صفت Attributes کلاس DAO.Field استفاده کنید و ثابت را به آن dbAutoIncrField اعمال کنید .

Set colEmployeeID = tblEmployees.CreateField("EmployeeID", dbLong)
colEmployeeID.Attributes = dbAutoIncrField
tblEmployees.Fields.Append colEmployeeID

بعد از ایجاد یک فیلد ، بیاد داشته باشید که برای فیلد افزایشی خودکار ، شما مقداری را وارد نمی کنید .
تنظیم مقدار پیش فرض به یک فیلد :
در کتابخانه DAO ، کلاس DAO.Field به صفتی به نام DefaultValue مجهز شده است .
مثال :

Set fldEmploymentStatus = _
tblEmployees.CreateField("EmploymentStatus", DB_TEXT, 20)
fldEmploymentStatus.DefaultValue = "Full Time"
tblEmployees.Fields.Append fldEmploymentStatus

زمانیکه یک فیلد دارای مقدار پیش فرض است
در زمان ورود داده مقدار پیش فرض حذف میشود و در اینصورت مقدار پیش فرض برای استفاده بعدی (فیلد جدید)بکار خواهد رفت .

saeed1234n
جمعه 17 خرداد 1392, 02:40 صبح
با سلام
بخش هشتم :

ویژگی تهی بودن فیلد :
در کتابخانه DAO کلاس Field دارای صفتی به نام Required است .
با بکار گیری این صفت شما می توانید از ورود مقدار برای آن فیلد صرفنظر کنید .
همچنین شما می توانید از این صفت استفاده کنید تا قبل از تکمیل رکورد از ورود داده برای آن فیلد مطمئن شوید .
مقدار پیش فرض این صفت False است .
اگر شما آنرا به TRUE تنظیم کنید همیشه در آن فیلد باید مقدار وارد شود .
مثال :

' Create a new TableDef object.
Set tblEmployees = dbExercise.CreateTableDef("Employees")

Set fldEmployeeNumber = tblEmployees.CreateField("EmployeeNumber", DB_TEXT)
fldEmployeeNumber.Required = True
tblEmployees.Fields.Append fldEmployeeNumber

اگر شما از فیلدی که صفت Required آن به TRUE تنظیم شده صرفنظر کنید ، دیتابیس به شما اخطار خواهد داد .
ویژگی های یک رکوردست :
مقدمه :
ما دیدیم که برای ایجاد رکوردست باید متد OpenRecordset() از متغیر DAO.Database را فراخوانی کنید .
گرامر :

expression.OpenRecordset(Name, Type, Options, LockEdit)

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

نوع رکوردست :
یک رکوردست باید شیوه ای که رکوردهای آن در دسترس قرار می گیرند با بکار گرفته می شوند را تعیین کنید . این اطلاعات توسط آرگومان سوم از متد OpenRecordset() ارائه می شود .
مقدار این آرگومان یک عضوی از مجموعه RecordsetTypeEnum میباشد .
این مقادیر عبارتند از :
105238
گزینه هایی ( انتخاب هایی )از یک رکوردست :
گزینه های بعدی بکار گرفته میشوند برای کنترل عملیاتی که میتواند در شی Recordsetانجام شود .
این گزینه ها از طریق آرگومان سوم متد OpenRecordset()مشخص می شوند .
این گزینه ها عضوی از مجموعه RecordsetOptionEnumهستند و می توانند بصور یک ترکیب OR بکار روند.این مقادیر عبارتند از :
105239
بیاد داشته باشید که مقادیری که برای این آرگومان مشخص کرده اید بستگی به آرگومان دوم و آرگومان چهارم دارد .

saeed1234n
یک شنبه 19 خرداد 1392, 19:48 عصر
با سلام

بخش آخر :

قفل کردن رکوردست :
آخرین آرگومان چگونگی رفتار با ارتباطات همزمان در آن دیتابیس را کنترل می کند .
مقدار این ارگومان عضوی از مجموعه LockTypeEnum میباشد .
مقادیر مناسب عبارتند از :
105321
پیمایش (حرکت )در رکوردست :
علاوه بر ایجاد یک رکوردست ، رایجترین عملیاتی که شما میتوانید در یک رکوردست انجام دهید ، حرکت بین رکوردهاست .
کلاس DAO.Recordset پشتیبانی میکند از این عملیات از طریق متدهای گوناگون :
متد MoveFirst(): پیمایش به اولین رکورد .
متد MoveLast(): پیمایش به آخرین رکورد .
متد MovePrevious(): پیمایش به رکورد قبلی .
متد MoveNext(): پیمایش به رکورد بعدی .
متد Move(): پیمایش به رکود مشخص ، شما باید ایندکس آن رکورد را به متند منتقل کنید .
مثال :

Private Sub cmdMovePosition_Click()
Dim dbVideoCollection As DAO.Database
Dim rstVideos As DAO.Recordset

Set dbVideoCollection = CurrentDb
Set rstVideos = dbVideoCollection.OpenRecordset("Videos")

rstVideos.Move 6
End Sub

هنگام پیمایش میان رکوردها ، باید اجتناب کنید از رفتن ( حرکت ) به رکورد قبل از اولین رکورد یا بعد از آخرین رکورد .
برای کمک به شما ، کلاس DAO.Recordset به متدهای BOF() و EOF() تجهیز شده است .
متد BOF() بکار گرفته میشود برای بررسی اینکه آیا به رکورد قبل از اولین رکورد رسیده اید .
متد EOF() بکار گرفته میشود برای بررسی اینکه آیا به رکورد بعد از آخرین رکورد رسیده اید .
هر دو متد یک مقدار بولی را بر می گردانند .
انتخاب فیلد :
مقدمه :
تاکنون هنگام ایجاد یک رکوردست از نام جداول استفاده می کرده ایم این معادل است با انتخاب همه رکوردها از جدول .
بعنوان یک پیشنهاد دیگر میتوانید تنها بعضی از فیلدها یا رکوردها را که می خواهید بکار برید .
برای انجام این کار :بهنگام فراخوانی متد OpenRecordset() از کلاس DAO.Recordset، گزاره SQL را بعنوان اولین آرگومان به آن متد منتقل کنید .
برای ساخت گزاره SQL ، از SELECT استفاده کنید .
. شما می توانید تنها یک فیلد از یک جدول را مشخص کنید .
مثالی: انتخاب یک ستون از یک جدول بنام Employees .

Dim dbExercise As DAO.Database
Dim rsEmployees As DAO.Recordset

Set dbExercise = CurrentDb
Set rsEmployees = dbExercise.OpenRecordset("SELECT EmployeeNumber FROM Employees")

dbExercise.Close
Set dbExercise = Nothing

. برای انتخاب ستون های بیشتر ، آنها را با کاما ( , ) جدا کنید .
گرامر :

SELECT Column1, Column2, Column_n FROM WhatObject;

. برای انتخاب کلیه ستونهای یک جدول ، از * یا * ALL استفاده کنید در جانگهدار فیلدها .
مثال :

Set dbExercise = CurrentDb
Set rsEmployees = dbExercise.OpenRecordset("SELECT ALL * FROM Employees")

برای اعمال محدودیت ، از شرط ها در گزاره SQL استفاده کنید .

ساخت یک کوئری :
آرگومان اول نامی است که شما به کوئری جدید خواهید داد .
آرگومان دوم یک گزاره SQL است که محتویات کوئری را مشخص میسازد .
مثال :

Dim dbExercise As DAO.Database
Dim qryEmployees As DAO.QueryDef

Set dbExercise = CurrentDb
Set qryEmployees = _
dbExercise.CreateQueryDef("StaffMembers", _
"SELECT EmployeeNumber, EmployeeeName " & _
"FROM Employees")

Rasool-GH
جمعه 25 مهر 1393, 00:21 صبح
خیلی عالی و کاربردی بود . ممنون
لطفا بفرمایید چطور باید شماره یک رکورد رو به دست اورد ؟

m.elmi
جمعه 25 مهر 1393, 22:03 عصر
هر رکوردست یه Property داره تحت عنوان AbsolutePosition که شمارۀ رکورد رو نشون میده. البته با صفر شروع می شه یعنی وقتی بطور مثال عدد 10 رو بر می گردونه در واقع شماره ردیف 11 رو نشون میده.

sattar22
سه شنبه 29 اردیبهشت 1394, 13:31 عصر
سلام
چطور باید فیلدها رو برای رکورد بعدی اماده کنم یعنی موقعی که سیو شدند خالی بشن در فرم برای ثبت رکورد مجدد

saeed1234n
سه شنبه 29 اردیبهشت 1394, 15:51 عصر
با سلام
كافي است به ركورد بعدي برويد

next record

sattar22
چهارشنبه 30 اردیبهشت 1394, 11:35 صبح
سلام سعید خان
اینکارو کردم اما نتونستم جواب بگیرم
اگر امکان داره برنامه رو واستون امیل میکنم لطفا یه نگاهی بندازین متشکر
بد جور گیر کردم تو این قسمت

saeed1234n
چهارشنبه 30 اردیبهشت 1394, 20:59 عصر
دوست عزیز جای این سوالتون اینجا نبود

با این حالDATA ENTRY فرم را NO قرار دهید .

amp_1356
دوشنبه 04 خرداد 1394, 06:41 صبح
با سلام و ممنون از آموزش بسیار خوبتون.
من می خوام مقادیر فیلد های یک جدول داخل یه Database دیگه رو از طریق کتابخانه DAO داخل یه ListBox در Database خودم نمایش بدم.
ممنون می شم اگر راهنمایی کنید.
با تشکر

saeed1234n
سه شنبه 05 خرداد 1394, 20:27 عصر
سلام

نمونه ؟

amp_1356
سه شنبه 05 خرداد 1394, 21:53 عصر
سلام و ممنون از توجهتون
یه جدول داخل فایل test1 و یه لیست باکس داخل فایل Test2
ممنون از راهنمایی تون

131684

tarazi
پنج شنبه 22 مهر 1395, 06:22 صبح
Microsoft Access 2010 VBA Macro Programming: Richard Shepherd:

سلام دوستان کسی ترجمه این کتاب رو داره؟

bhd2013
جمعه 22 بهمن 1395, 14:37 عصر
سلام
رکوردست را چطوری چک کنیم که باز هست یا نه ؟

چون رکوردست باز نباشه در رویداد unload فرم کد rst.close خطا میده .