قمنا في درس سابق بانشاء جدول في قاعدة بيانات ميكروسوفت اكسس واسميناه "الطالب". في هذا الدرس سوف نقوم باضافة جدول الفصول. وبما ان الطالب قد يحضر عدة فصول فسوف نقوم بعمل علاقة بين هذا الجدول و جدول الطالب. ولان العلاقة هي علاقة "many to many" حيث ان الفصل الواحد قد يحضره عدة طلبة فلا بد من انشاء جدول آخر لتحديد فصول كل طالب و طلبة كل فصل.
الخطوات
اذا لتحقيق ذلك نقوم بانشاء جدولين :
الاول : جدول الفصل: و يحتوي هذا الجدول على البيانات التالية:
رقم الفصل : و هو من نوع رقم اتوماتيكي.
رقم الغرفة : و هو من نوع نص
اسم المادة : نص من 50 حرفا.
وقت الحضور: و هو من نوع وقت تاريخ.
الجدول الثاني : هو جدول العلاقة و سوف نسميه "فصل_طالب":
و سوف يحتوي على حقلين:
رقم الطالب: و هو من نوع رقم ولكنه في الواقع مفتاح اجنبي "foriegn Key" لجدول الطالب.
رقم الفصل: و هو من نوع رقم ولكنه في الواقع مفتاح اجنبي "foriegn Key" لجدول الفصل.
سوف نهدف من هذا الدرس ان تظهر لنا العلاقة كما في الشكل التالي
http://pentasys.homestead.com/files/asrar/relation2.jpg
بما اننا سوف نستعمل DAO فسوف نكمل من حيث انتهينا في الدرس الاول
و سوف نستعمل الاكواد التي قمنا بعملها اذا امكن من مبدأ عدم التكرار .
منطق الخطوات سبكون كالتالي:
اضف زرا جديدا للفورم
افتح الملف الذي تم انشاؤه مسبقا.
تأكد من عدم وجود جداول بنفس الاسم.
اضف الجداول الجديدة
اضف علاقة بين الجداول.
افتح الملف باستخدام ميكروسوفت للتأكد من وجود العلاقات.
1 اضافة زر جديد
اضف الى الفورم زرا و لنسمه" اضف الجداول" و اسمه btnNewTables كما في الصورة:
http://pentasys.homestead.com/files/...dNewTables.JPG
نبدأ الان بوضع الوظائف المساعدة .
2 افتح الملف الذي تم انشاؤه مسبقا.
بما اننا نريد فتح قاعدة بيانات قمنا بعملها مسبقا وليس عمل ملف جديد لذلك فقد قمت باضافة وظيفة جديدة باسم fnGetDBName وهي في الواقع نفس وظيفة fnGetNewDBName ولكن باستخدام showOpen بدلا من ShowSave كالتالي
Function fnGetDBName() As String
dbName = ""
CommonDialog1.CancelError = True
On Error GoTo ErrHandler2
With CommonDialog1 ' hmmmm I must have misunderstood how this works
' change title
On Error GoTo ErrHandler2
.DialogTitle = "Please Select the data************"
' make sure we ask before we overwrite
' file extenssions .Filter = "G. W Alfadhly Files (*.GWF)|*.GWF" .Flags = .Flags
' show the open dialog
.ShowOpen
' get the file name
If Err.Number <> cdlCancel
Then dbName = .FileName
End If
' make sure it is not empty
If Trim(dbName) <> "" Then
fnGetDBName = Trim(dbName)
Else fnGetDBName = ""
End If
End With
Exit Function
ErrHandler2:
fnGetDBName = ""
End Function
ملاحظة مهمة: قمت بخطأ في نقل الدرس الاول بان استخدمت امتداد FWF بدلا من GWF فالرجاء التأكد من انك قد صححت الخطأ اذا كنت قد عملت الدرس الاول قبل ان يقوم الاخوة المحررين في الموسوعة بتدارك الخطأ . حيث ان الخطأ قد يؤدي الى عدم ظهور الملف الذي قمت بعمله في الدرس الاول في قائمة الملفات حسب الفلتر الجديد.
التاكد من عدم وجود الجدول
حيث انني قمت بعمل هذا المشروع مرارا اردت ان اتأكد انني لم اقم باضافة الجداول مسبقا لذلك فقد اضفت الوظيفة التالية للتأكد من عدم وجود الجدول المزمع اضافته كالتالي:
'************************************************* ************
' Copy Rights
'Copyright © Ghazi H. Wadi. 2002-2003, All Rights Reserved '************************************************* ************ '************************************************* ************
' Find out if the table name exist in the data************ or not 'True = table with the same name was found '************************************************* ************
Function fnIsTableNameExist(dbsSrc As Data************, strTableName As String) As Boolean
Dim tdf As DAO.TableDef
'loop through all available tables and see if the name is the same as the one we are looking for
For Each tdf In dbs.TableDefs
'name found
If tdf.Name = strTableName Then GoTo FoundTableName
Next tdf
' the name was found then set the value of the function to the result
' Name not found
fnIsTableNameExist = False
Exit Function
FoundTableName:
fnIsTableNameExist = True
End Function
تستعمل الوظيفة كائنين هما كائن قاعدة البيانات التي سبق فتحها. والعنصر الاخر هو اسم الجدول المضاف. سوف يكون مردود الوظيفة بالموجب اذا كان الاسم موجودا وبالنفي اذا كان الاسم غير موجودا.
3 اضافة الجدولين الجديدين:
وظيفة عمل جدول الفصل و هي كالتالي مع الاهتمام بوضع رقم الفصل كمفتاح للجدول.
Function fnAddClassTable()
Set tdf = dbs.CreateTableDef("الفصل")
Dim idx As DAO.Index
Dim fldIndex As DAO.Field
With tdf
' Create fields and append them to the new TableDef
' object. This must be done before appending the
' TableDef object to the TableDefs collection of the
' new data************
.Fields.Append .CreateField("رقم الفصل", dbLong)
.Fields("رقم الفصل").Attributes = .Fields("رقم الفصل").Attributes + dbAutoIncrField
' المادة
.Fields.Append .CreateField("المادة", dbText, 255)
'وقت الحضور
.Fields.Append .CreateField("وقت الحضور", dbDate)
End With
' Create the index field
Set fldIndex = idx.CreateField("رقم الفصل", dbLong)
' this index has to be primary unique
idx.Primary = True
idx.Unique = True
' add it to the table default
idx.Fields.Append fldIndex
tdf.Indexes.Append idx
' Append TableDef object.
dbs.TableDefs.Append tdf
'Updates the objects in a collection to reflect the current data************'s schema.
dbs.TableDefs.*********************
End Function
وظيفة اضافة جدول الفصل_الطالب.
Function fnAddStudentClass()
Set tdf = dbs.CreateTableDef("الفصل_الطالب")
Dim idx As DAO.Index
Dim fldIndex As DAO.Field
With tdf
' Create fields and append them to the new TableDef
' object. This must be done before appending the
' TableDef object to the TableDefs collection of the
' new data************
.Fields.Append .CreateField("رقم الطالب", dbLong)
.Fields.Append .CreateField("رقم الفصل", dbLong)
End With
End Function
وظيفة اضافة العلاقة بين جدولين
وسوف تستقبل هذه الوظيفة االبرامترات التالية:
TableName اسم الجدول الذي نريد ربطه مع جدول الفصل_الطالب
ForeignKey وهو مفتاح الجدول الذي يراد ربطه مع جدول الفصل_الطالب
RelationName اسم العلاقة كنص
indexName الاسم المحلي للحقل في جدول الفصل_الطالب
Function NewRelation(TableName, ForeignKey, RelationName, indexName)
Dim MyDB As Data************
Dim MyField As Field
Dim MyRelation As Relation
Set MyDB = dbs
Set MyRelation = MyDB.CreateRelation(RelationName, TableName, _
"الفصل_الطالب", dbRelationDeleteCascade + _ dbRelationUpdateCascade)
'Create field in Fields collection of Relation object.
Set MyField = MyRelation.CreateField(indexName)
'Provide name of foreign key field.
MyField.ForeignName = ForeignKey
'Append field to Relation object and Relation object to data************.
MyRelation.Fields.Append MyField
'Append relation to relationship's collection
MyDB.Relations.Append MyRelation
' Set MyDB = Nothing
End Function
تعرضنا عزيز القارئ في هذا الدرس الى كيفية عمل علاقات بين الجداول في ميكروسوفت اكسس
اخوكم احمــــــــــــــ الملاح ــــــــــــــد
|
 |