19-11-15, 01:11 PM
(آخر تعديل لهذه المشاركة : 19-11-15, 05:46 PM {2} بواسطة مهموم.
تعديل السبب: تم تعديل المرفقات وإضافة لغة #C مع بعض التحسينات في الكود
)
السلام عليكم ورحمة الله
مشروع للتعامل مع قاعدة بيانات بها ثلاث جداول بينهم علاقات، مع إمكانية:
الإضافة
التعديل
الحذف
البحث
الخطوة الأولى: عمل قاعدة بيانات Microsoft Access بإسم Database1.accdb ونحفظه في مجلد المستندات وبه الجداول والأعمدة التالية:
جدول الموظفين Employees والأعمده هي:
رقم الموظف Emp_ID نوع ترقيم تلقائي ومفتاح أساسي
إسم الموظف Emp_Name نوع نص
رقم الفرع Brn_ID نوع رقم
رقم القسم Dpt_ID نوع رقم
جدول الفروع Branches والأعمده هي:
رقم الفرع Brn_ID نوع ترقيم تلقائي ومفتاح أساسي
إسم الفرع Brn_Name نوع نص
جدول الأقسام Departments والأعمده هي:
رقم القسم Dpt_ID نوع ترقيم تلقائي ومفتاح أساسي
إسم القسم Dpt_Name نوع نص
إنشاء علاقات بين الجداول الثلاث كالتالي:
Employees.Brn_ID = Branches.Brn_ID
Employees.Dpt_ID = Departments.Dpt_ID
ونحن داخل Microsoft Access نقوم بإضافة بعض البيانات في جدول الفروع Branches وجدول الأقسام Departments
الخطوة الثانية: عمل مشروع Visual Basic جديد
إضافة قاعدة البيانات Database1.accdb للمشروع:
من القائمة Project نختار Add Existing Item ستفتح نافذة تحديد الملفات
ولنستطيع مشاهدة ملفات قاعدة البيانات لابد من تغيير نوع عرض الملفات إلى Data Files، ثم نبحث عن الملف ونحدده ونضغط Add،
وبما أن الملف الذي اخترناه هو قاعدة بيانات فستفتح لنا نافذة معالج إعداد مصدر البيانات Data Source Configuration Wizard،
نحدد من النماذج المعروضة (وفي الغالب هو نموذج واحد Dataset مع ال Access) النموذج Dataset ونضغط التالي Next،
سننتقل للصفحة التالة للمعالج وهي تحديد كائنات من قاعدة البيانات وغالباً سنؤشر على الجداول فقط Tables والتي
تشمل الثلاث جداول Branches وDepartments وEmployees، وسنترك الإسم الإفتراضي Database1DataSet كما هو ثم نضغط إنهاء Finish.
سنجد أنه تم إضافة الملفات التالية للمشروع:
app.config ويحتوى على معلومات عن الإتصال قاعدة البيانات.
Database1.accdb وهو ملف قاعدة البيانات.
Database1DataSet.xsd وهو يحتوى على مخطط للجداول مع العلاقات التي بينهم (بإمكانك فتحه بالنقر مرتين عليه لمشاهدت ما فيه من باب العلم)
نأتي للنموذج Form1:
نقوم بإضافة الأداة DataGridView1 ونقوم بربطها بالجداول كالتالي:
نحدد الأداة DataGridView1 ثم نضغط على السهم الصغير الموجود في ركن الأداة DataGridView1
وستفتح لنا Choose Data Source
ونقوم بفتح الشجرة Other Data Sources حتى نشاهد الثلاث جدوال السابقة
ونختار الجدول Employees
وسوف نشاهد أن أعمدة الجدول ظهرت في أداة DataGridView1،
وسنجد أن العمودين Brn_ID وDpt_ID ظهرا على أساس نوع TextBox
وسنقوم بتغييرهم إلى نوع ComboBox في الخطوة التالية.
لتغيير نوع عمود الفرع Brn_ID من نوع TextBox إلى نوع ComboBox بحيث يحتوي على أسماء الفروع من الجدول Branches نقوم بالتالي:
نحدد الأداة DataGridView1 ثم نضغط على السهم الصغير الموجود في ركن الأداة DataGridView1 ونضغط على تعديل الأعمدة Edit Columns،
من نافذة تعديل الأعمدة نحدد العمود Brn_ID فتظهر خصائصه،
نذهب للخاصية Column Type ونغيره من DataGridViewTextBoxColumn إلى DataGridViewComboBoxColumn
فتظهر لنا بعض الخصائص الإضافية التي لم تكن موجودة قبل هذا التغيير،
نذهب للخاصية DataSource ونفتح بالترتيب Other Data Sources ثم Project Data Sources ثم Database1DataSet
وستظهر فيها الثلاث جداول ونختار جدول الفروع Branches،
نذهب للخاصية DisplayMember ونختار منها Brn_Name،
نذهب للخاصية ValueMember ونختار منها Brn_ID،
نذهب للخاصية HeaderText ونغيره إلى Branch.
لتغيير نوع عمود القسم Dpt_ID من نوع TextBox إلى نوع ComboBox بحيث يحتوي على أسماء الأقسام من الجدول Departments نقوم بالتالي:
نحدد الأداة DataGridView1 ثم نضغط على السهم الصغير الموجود في ركن الأداة DataGridView1 ونضغط على تعديل الأعمدة Edit Columns،
من نافذة تعديل الأعمدة نحدد العمود Dpt_ID فتظهر خصائصه،
نذهب للخاصية Column Type ونغيره من DataGridViewTextBoxColumn إلى DataGridViewComboBoxColumn
فتظهر لنا بعض الخصائص الإضافية التي لم تكن موجودة قبل هذا التغيير،
نذهب للخاصية DataSource ونفتح بالترتيب Other Data Sources ثم Project Data Sources ثم Database1DataSet
وستظهر فيها الثلاث جداول ونختار جدول الأقسام Departments،
نذهب للخاصية DisplayMember ونختار منها Dpt_Name،
نذهب للخاصية ValueMember ونختار منها Dpt_ID،
نذهب للخاصية HeaderText ونغيره إلى Department.
ويمكنك تغيير اسماء الأعمدة التي تظهر في الأداة DataGridView1 عن طريق الخاصية HeaderText لكل عمود.
الأن لو فتحنا نافذة الكود الخاص بالنموذج Form1 فسنجد أن المعالج أضاف ثلاث أسطر في حدث تحميل النموذج Form1_Load وهي أسطر قراءة الجداول الثلاث
دعونا نقوم الآن بتجربة نجاح الربط فقط، وذلك بتشغيل المشروع ومشاهدة الأعمدة Branches وDepartments وهي تحتوي على اسماء كل منهم،
وذلك للإطمئنان على سير العمل بشكل صحيح،
ولكن حتى الآن لن يتم حفظ أي بيانات يتم إضافتها في الأداة DataGridView1،
ونقوم بعمل كود الحفظ (وهو سطر واحد فقط) في الخطوة التالية.
تحديث قاعدة البيانات:
إن اعتماء كل العمليات التي يتم إجراءها على الأداة DataGridView1 من إضافة وتعديل وحذف
تتم بهذا السطر فقط (مع ملاحظة إسم الجدول Employees والأمر Update)
ولك الخيار بين أن تضعه في زر Button بإسم [تحديث] أو أن تضعه في حدث إغلاق النموذج Form1_FormClosing
وسأفترض أنك اخترت حدث إغلاق النموذج Form1_FormClosing
نأتي للخطوة الأخير وهي طريقة البحث:
نضيف أداة TextBox1 لكتابة الإسم المراد البحث عنه وButton1 لتنفيذ أمر البحث وعرض النتائج وButton2 لإعادة الوضع كما كان قبل البحث أو ما يسمى Reset.
الأسلوب الحديث في البحث بشكل عام هو استخدام تقنية Linq الخاصة من Microsoft.
هناك عدة رغبات في مسألة البحث عن نصوص وهي أربع حالات،
وكانت في السابق تستخدم % مع الأمر Like في جمل Sql كالتالي:
إذا كان الجزء المراد البحث عنه في بداية المعلومات كانت توضع العلامة % قبل مع الأمر LIKE.
إذا كانت الجزء المراد البحث عنه في وسط المعلومات كانت توضع العلامة % قبل وبعد مع الأمر LIKE.
إذا كانت الجزء المراد البحث عنه في آخر المعلومات كانت توضع العلامة % بعد مع الأمر LIKE.
إذا كانت المراد البحث عنه تطابق تام مع المعلومات كانت تستخدم العلامة = بدلا من الأمر LIKE وبدون العلامة %.
ولكن طريقة البحث مع تقنية Linq مختلفة وسهلة جداً وكأنك تبحث في مغير نصي كالتالي:
إذا كان الجزء المراد البحث عنه في بداية المعلومات نستخدم الأمر StartsWith.
إذا كانت الجزء المراد البحث عنه في وسط المعلومات نستخدم Contains.
إذا كانت الجزء المراد البحث عنه في آخر المعلومات نستخدم الأمر EndsWith.
إذا كانت المراد البحث عنه تطابق تام مع المعلومات نستخدم الأمر Equals.
ويمكن استخدام العلامة = في حالة المراد التطابق التام.
نأتي للمشروع، سنفترض أن الرغبة في أسلوب البحث عن المطلوب يكون البحث عن الأسماء التي تحتوي نصاً معيناً،
فسنكتب هذا الكود في الزر Button1
وبالنسبة لإعادة إظهاء جميع الأسماء كما كانت قبل البحث نكتب هذا الكود في الزر Button2
ويمكن إجراء بحث آخر دون الحاجة لإعادة إظهار جميع الأسماء الناتجة من بحث سابق.
ملاحظة:
إن التعديل في البيانات الظاهرة نتيجة البحث سوف تتم بشكل طبيعي دون التأثير على بقية بيانات قاعدة البيانات الغير ظاهرة.
وهذا كامل كود النموذج Form1
إختفاء البيانات:
قد يلاحظ البعض أن أي تعديل في المشروع ينتج عنه اختفاء ما تم إضافته من بيانات في قاعدة البيانات قبل التعديل في المشروع،
ولتعطيل هذا الإختفاء نقوم بالتالي:
نحدد من ملفات المشروع ملف قاعدة البيانات Database1.accdb فتظهر لنا خصائص خاصة بالملف،
نذهب للخاصية Copy to Ouput Directory ونختار Copy if newer.
يمكن تطبيق هذا المشروع مع قاعدة بيانات SqlServer والنتيجة واحدة،
ما عدا فيما يخص ملف قاعدة البينات في ملفات المشروع،
لأنه لن يكون هناك ملف قاعدة بيانات ضمن ملفات المشروع.
في المرفقات مشروع تم التطبيق عليه كل الخطوات السابقة أثناء الكتابة للتأكد من عدم نسيان أي خطوة.
إن كانت الإدارة ترى أن هذه المشاركة فيها من الفائدة ما تستحق أن توضع في موضوع مستقل مع التعديل بما تراه مناسباً فلها ذلك مع شكري وتقديري.
مشروع للتعامل مع قاعدة بيانات بها ثلاث جداول بينهم علاقات، مع إمكانية:
الإضافة
التعديل
الحذف
البحث
الخطوة الأولى: عمل قاعدة بيانات Microsoft Access بإسم Database1.accdb ونحفظه في مجلد المستندات وبه الجداول والأعمدة التالية:
جدول الموظفين Employees والأعمده هي:
رقم الموظف Emp_ID نوع ترقيم تلقائي ومفتاح أساسي
إسم الموظف Emp_Name نوع نص
رقم الفرع Brn_ID نوع رقم
رقم القسم Dpt_ID نوع رقم
جدول الفروع Branches والأعمده هي:
رقم الفرع Brn_ID نوع ترقيم تلقائي ومفتاح أساسي
إسم الفرع Brn_Name نوع نص
جدول الأقسام Departments والأعمده هي:
رقم القسم Dpt_ID نوع ترقيم تلقائي ومفتاح أساسي
إسم القسم Dpt_Name نوع نص
إنشاء علاقات بين الجداول الثلاث كالتالي:
Employees.Brn_ID = Branches.Brn_ID
Employees.Dpt_ID = Departments.Dpt_ID
ونحن داخل Microsoft Access نقوم بإضافة بعض البيانات في جدول الفروع Branches وجدول الأقسام Departments
الخطوة الثانية: عمل مشروع Visual Basic جديد
إضافة قاعدة البيانات Database1.accdb للمشروع:
من القائمة Project نختار Add Existing Item ستفتح نافذة تحديد الملفات
ولنستطيع مشاهدة ملفات قاعدة البيانات لابد من تغيير نوع عرض الملفات إلى Data Files، ثم نبحث عن الملف ونحدده ونضغط Add،
وبما أن الملف الذي اخترناه هو قاعدة بيانات فستفتح لنا نافذة معالج إعداد مصدر البيانات Data Source Configuration Wizard،
نحدد من النماذج المعروضة (وفي الغالب هو نموذج واحد Dataset مع ال Access) النموذج Dataset ونضغط التالي Next،
سننتقل للصفحة التالة للمعالج وهي تحديد كائنات من قاعدة البيانات وغالباً سنؤشر على الجداول فقط Tables والتي
تشمل الثلاث جداول Branches وDepartments وEmployees، وسنترك الإسم الإفتراضي Database1DataSet كما هو ثم نضغط إنهاء Finish.
سنجد أنه تم إضافة الملفات التالية للمشروع:
app.config ويحتوى على معلومات عن الإتصال قاعدة البيانات.
Database1.accdb وهو ملف قاعدة البيانات.
Database1DataSet.xsd وهو يحتوى على مخطط للجداول مع العلاقات التي بينهم (بإمكانك فتحه بالنقر مرتين عليه لمشاهدت ما فيه من باب العلم)
نأتي للنموذج Form1:
نقوم بإضافة الأداة DataGridView1 ونقوم بربطها بالجداول كالتالي:
نحدد الأداة DataGridView1 ثم نضغط على السهم الصغير الموجود في ركن الأداة DataGridView1
وستفتح لنا Choose Data Source
ونقوم بفتح الشجرة Other Data Sources حتى نشاهد الثلاث جدوال السابقة
ونختار الجدول Employees
وسوف نشاهد أن أعمدة الجدول ظهرت في أداة DataGridView1،
وسنجد أن العمودين Brn_ID وDpt_ID ظهرا على أساس نوع TextBox
وسنقوم بتغييرهم إلى نوع ComboBox في الخطوة التالية.
لتغيير نوع عمود الفرع Brn_ID من نوع TextBox إلى نوع ComboBox بحيث يحتوي على أسماء الفروع من الجدول Branches نقوم بالتالي:
نحدد الأداة DataGridView1 ثم نضغط على السهم الصغير الموجود في ركن الأداة DataGridView1 ونضغط على تعديل الأعمدة Edit Columns،
من نافذة تعديل الأعمدة نحدد العمود Brn_ID فتظهر خصائصه،
نذهب للخاصية Column Type ونغيره من DataGridViewTextBoxColumn إلى DataGridViewComboBoxColumn
فتظهر لنا بعض الخصائص الإضافية التي لم تكن موجودة قبل هذا التغيير،
نذهب للخاصية DataSource ونفتح بالترتيب Other Data Sources ثم Project Data Sources ثم Database1DataSet
وستظهر فيها الثلاث جداول ونختار جدول الفروع Branches،
نذهب للخاصية DisplayMember ونختار منها Brn_Name،
نذهب للخاصية ValueMember ونختار منها Brn_ID،
نذهب للخاصية HeaderText ونغيره إلى Branch.
لتغيير نوع عمود القسم Dpt_ID من نوع TextBox إلى نوع ComboBox بحيث يحتوي على أسماء الأقسام من الجدول Departments نقوم بالتالي:
نحدد الأداة DataGridView1 ثم نضغط على السهم الصغير الموجود في ركن الأداة DataGridView1 ونضغط على تعديل الأعمدة Edit Columns،
من نافذة تعديل الأعمدة نحدد العمود Dpt_ID فتظهر خصائصه،
نذهب للخاصية Column Type ونغيره من DataGridViewTextBoxColumn إلى DataGridViewComboBoxColumn
فتظهر لنا بعض الخصائص الإضافية التي لم تكن موجودة قبل هذا التغيير،
نذهب للخاصية DataSource ونفتح بالترتيب Other Data Sources ثم Project Data Sources ثم Database1DataSet
وستظهر فيها الثلاث جداول ونختار جدول الأقسام Departments،
نذهب للخاصية DisplayMember ونختار منها Dpt_Name،
نذهب للخاصية ValueMember ونختار منها Dpt_ID،
نذهب للخاصية HeaderText ونغيره إلى Department.
ويمكنك تغيير اسماء الأعمدة التي تظهر في الأداة DataGridView1 عن طريق الخاصية HeaderText لكل عمود.
الأن لو فتحنا نافذة الكود الخاص بالنموذج Form1 فسنجد أن المعالج أضاف ثلاث أسطر في حدث تحميل النموذج Form1_Load وهي أسطر قراءة الجداول الثلاث
VB
PHP كود :
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.DepartmentsTableAdapter.Fill(Me.Database1DataSet.Departments)
Me.BranchesTableAdapter.Fill(Me.Database1DataSet.Branches)
Me.EmployeesTableAdapter.Fill(Me.Database1DataSet.Employees)
End Sub
#C
PHP كود :
private void Form1_Load(object sender, EventArgs e) {
this.departmentsTableAdapter.Fill(this.database1DataSet.Departments);
this.branchesTableAdapter.Fill(this.database1DataSet.Branches);
this.employeesTableAdapter.Fill(this.database1DataSet.Employees);
}
دعونا نقوم الآن بتجربة نجاح الربط فقط، وذلك بتشغيل المشروع ومشاهدة الأعمدة Branches وDepartments وهي تحتوي على اسماء كل منهم،
وذلك للإطمئنان على سير العمل بشكل صحيح،
ولكن حتى الآن لن يتم حفظ أي بيانات يتم إضافتها في الأداة DataGridView1،
ونقوم بعمل كود الحفظ (وهو سطر واحد فقط) في الخطوة التالية.
تحديث قاعدة البيانات:
إن اعتماء كل العمليات التي يتم إجراءها على الأداة DataGridView1 من إضافة وتعديل وحذف
تتم بهذا السطر فقط (مع ملاحظة إسم الجدول Employees والأمر Update)
VB
PHP كود :
Me.EmployeesTableAdapter.Update(Me.Database1DataSet.Employees)
#C
PHP كود :
this.employeesTableAdapter.Update(this.database1DataSet.Employees);
ولك الخيار بين أن تضعه في زر Button بإسم [تحديث] أو أن تضعه في حدث إغلاق النموذج Form1_FormClosing
وسأفترض أنك اخترت حدث إغلاق النموذج Form1_FormClosing
نأتي للخطوة الأخير وهي طريقة البحث:
نضيف أداة TextBox1 لكتابة الإسم المراد البحث عنه وButton1 لتنفيذ أمر البحث وعرض النتائج وButton2 لإعادة الوضع كما كان قبل البحث أو ما يسمى Reset.
الأسلوب الحديث في البحث بشكل عام هو استخدام تقنية Linq الخاصة من Microsoft.
هناك عدة رغبات في مسألة البحث عن نصوص وهي أربع حالات،
وكانت في السابق تستخدم % مع الأمر Like في جمل Sql كالتالي:
إذا كان الجزء المراد البحث عنه في بداية المعلومات كانت توضع العلامة % قبل مع الأمر LIKE.
إذا كانت الجزء المراد البحث عنه في وسط المعلومات كانت توضع العلامة % قبل وبعد مع الأمر LIKE.
إذا كانت الجزء المراد البحث عنه في آخر المعلومات كانت توضع العلامة % بعد مع الأمر LIKE.
إذا كانت المراد البحث عنه تطابق تام مع المعلومات كانت تستخدم العلامة = بدلا من الأمر LIKE وبدون العلامة %.
ولكن طريقة البحث مع تقنية Linq مختلفة وسهلة جداً وكأنك تبحث في مغير نصي كالتالي:
إذا كان الجزء المراد البحث عنه في بداية المعلومات نستخدم الأمر StartsWith.
إذا كانت الجزء المراد البحث عنه في وسط المعلومات نستخدم Contains.
إذا كانت الجزء المراد البحث عنه في آخر المعلومات نستخدم الأمر EndsWith.
إذا كانت المراد البحث عنه تطابق تام مع المعلومات نستخدم الأمر Equals.
ويمكن استخدام العلامة = في حالة المراد التطابق التام.
نأتي للمشروع، سنفترض أن الرغبة في أسلوب البحث عن المطلوب يكون البحث عن الأسماء التي تحتوي نصاً معيناً،
فسنكتب هذا الكود في الزر Button1
VB
PHP كود :
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
DataGridView1.DataSource = Me.Database1DataSet.Employees.Where(Function(x) x.Emp_Name.Contains(TextBox1.Text)).ToList
End Sub
#C
PHP كود :
private void button1_Click(object sender, EventArgs e) {
dataGridView1.DataSource = this.database1DataSet.Employees.Where(x => x.Emp_Name.Contains(textBox1.Text)).ToList();
}
وبالنسبة لإعادة إظهاء جميع الأسماء كما كانت قبل البحث نكتب هذا الكود في الزر Button2
VB
PHP كود :
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Me.DataGridView1.DataSource = Me.Database1DataSet.Employees
End Sub
#C
PHP كود :
private void button2_Click(object sender, EventArgs e) {
this.dataGridView1.DataSource = this.database1DataSet.Employees;
}
ويمكن إجراء بحث آخر دون الحاجة لإعادة إظهار جميع الأسماء الناتجة من بحث سابق.
ملاحظة:
إن التعديل في البيانات الظاهرة نتيجة البحث سوف تتم بشكل طبيعي دون التأثير على بقية بيانات قاعدة البيانات الغير ظاهرة.
وهذا كامل كود النموذج Form1
VB
PHP كود :
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.DepartmentsTableAdapter.Fill(Me.Database1DataSet.Departments)
Me.BranchesTableAdapter.Fill(Me.Database1DataSet.Branches)
Me.EmployeesTableAdapter.Fill(Me.Database1DataSet.Employees)
End Sub
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
Me.EmployeesTableAdapter.Update(Me.Database1DataSet.Employees)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
DataGridView1.DataSource = Me.Database1DataSet.Employees.Where(Function(x) x.Emp_Name.Contains(TextBox1.Text)).ToList
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Me.DataGridView1.DataSource = Me.Database1DataSet.Employees
End Sub
End Class
#C
PHP كود :
public partial class Form1 : Form
{
public Form1() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
this.departmentsTableAdapter.Fill(this.database1DataSet.Departments);
this.branchesTableAdapter.Fill(this.database1DataSet.Branches);
this.employeesTableAdapter.Fill(this.database1DataSet.Employees);
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e) {
this.employeesTableAdapter.Update(this.database1DataSet.Employees);
}
private void button1_Click(object sender, EventArgs e) {
dataGridView1.DataSource = this.database1DataSet.Employees.Where(x => x.Emp_Name.Contains(textBox1.Text)).ToList();
}
private void button2_Click(object sender, EventArgs e) {
this.dataGridView1.DataSource = this.database1DataSet.Employees;
}
}
إختفاء البيانات:
قد يلاحظ البعض أن أي تعديل في المشروع ينتج عنه اختفاء ما تم إضافته من بيانات في قاعدة البيانات قبل التعديل في المشروع،
ولتعطيل هذا الإختفاء نقوم بالتالي:
نحدد من ملفات المشروع ملف قاعدة البيانات Database1.accdb فتظهر لنا خصائص خاصة بالملف،
نذهب للخاصية Copy to Ouput Directory ونختار Copy if newer.
يمكن تطبيق هذا المشروع مع قاعدة بيانات SqlServer والنتيجة واحدة،
ما عدا فيما يخص ملف قاعدة البينات في ملفات المشروع،
لأنه لن يكون هناك ملف قاعدة بيانات ضمن ملفات المشروع.
في المرفقات مشروع تم التطبيق عليه كل الخطوات السابقة أثناء الكتابة للتأكد من عدم نسيان أي خطوة.
إن كانت الإدارة ترى أن هذه المشاركة فيها من الفائدة ما تستحق أن توضع في موضوع مستقل مع التعديل بما تراه مناسباً فلها ذلك مع شكري وتقديري.