07-07-22, 04:29 AM
السلام عليكم ورحمة الله وبركاته
بعد حمد الله والثناء عليه والصلاة والسلام على خير الخلق والأنام سيدنا محمد صلى الله عليه وسلم ..
اليوم نبتدأ بالعمل على المشروع الجديد ..
كما هي العادة بكل مشروع جديد - نفتح برنامج VB.6.0 ويخيرنا بفتح مشروع (نختار تنفيذي قياسي - Standard exe )
فيفتح بنافذة رقم واحد :
بما أن مشروعنا يتعلق ببرنامج حسابات نطلب إضافة (Mdi Form) (تجدها في القوائم الرئيسية قائمة Project)
نجعل الفورم الاول تابع لهذا الفورم من خلال الخاصية (mdiChild) نجعلها True (تجدها في نافذة خصائص الفورم الأول)
نذهب لخصائص المشروع الرئيسي (Project Properties) (تجدها في القوائم الرئيسية قائمة Project)
وتستطيع الوصول إليها أيضاً من (نافذة المشاريع اللي هي : Project Project1)
نختار من نافذة بدء المشروع(Startup Object) نختار الفورم الأب الجديد والذي هو (MDIForm1) ثم نضغط (Ok)
وذلك ليصبح إقلاع المشروع من نافذة الفورم الأب .. الأم .. الحاوي (اللي بدك ياه..سميه كما تشاء)
نختار الـ from1 اسم جديد وليكن frmMain1 يعني الفورم الرئيسي ..
---------------------------------------------------------------------------------
توضيح : سنجعل هكذا نهجنا في كل التسميات ستكون تعبيرية عن كل شيء سيحمل اسماً :
بداية التسمية frm ثم اسم يعبر عن وظيفة النافذة . (تسميات النوافذ)
cmd بداية لتسميات الأزرار (الأوامر) .
txt بداية لتسميات مربعات الادخال(التكسات).
الاسم : نعني به الاسم البرمجي (Name)
التسمية : نعني بها الاسم الظاهري (Caption)
------------------------------------------------------
نختار تسمية جديدة لمشروعنا وليكن مثلاً (TA_Accountant V:XXX)
نقم أيضاً بإضافة (مودل جديد لتخزين الأكواد العامة فيه والتي لا تخص النوافذ بل مرجع لكل المشروع متى احتجنا إليها)
سنقوم بإضافة أكثر من (مودل) لذا سنعمد لتسمية كل مودل بحسب وظيفته .
الان نضيف مودل جديد يتعلق بقواعد البيانات والعمليات عليها وليكن اسمه (ModuleDataBase1) (تجدها في القوائم الرئيسية في قائمة Project)
-----------------------------------------------------
نقم الان بتعريف عدة مكتبات سنحتاجها في عملنا على قواعدج البيانات :
وذلك من الخاصية (References .. ) (تجدها في القوائم الرئيسية في قائمة Project)
نحدد المكتبات التالية ونضغ OK :
Microsoft DAO 3.6 Object Library ' للعمل على قواعد البيانات
Microsoft Scripting Runtime ' للعمل على الملفات
-----------------------------------------------------
نفتح المودل ونفم بكتابة فيه بعض التعريفات :
- تعريف كائن مكتبة السكربتات.
- تعريف تعريف متغير نصي لحفظ مسار قاعدة البيانات فيه.
- متغير يعبر عن محرك العمل على قواعد البيانات مع بعض المتغيرات لصناعة جداول جديدة.
وذلك من خلال الكود التالي :
فما سنتخدمه في أ يمكان بالمشروع عرفناه كـ متغير عام بـ (Public)
وما سنستخدمه كـ متغير خاص وضمن نافذة المودل فقط عرفناه كـ متغير خاص ولا يمكن رؤيته خارج المودل بـ (Dim).
----------------------
توضيح : بإمكاننا أن نكتب في كل كتلة (Procedure) من الكود كامل الكود الذي نحتاجه وبالتفصيل
ولكن لن نفعل ذلك وسنحاول قدر الامكان أن نجعل برنامجنا من حيث الكود أكثر احترافية وسنختصر قدر المستطاع
لأننا سنحاول على عمل كتل أكواد عامة سنستدعيها لتنفذ أمر ما كلما أحتجنا إليها بدون الحاجة لكتابة كامل الكود الذي بداخلها كل مرة.
وسيتضح أسلوبنا وبساطته أثناء عملنا على المشروع ..
----------------------
نجعل برنامجنا يبني مجلد جديد لنضع فيه قاعدة البيانات وليكن اسمه (Data) من خلال الكائن (Fs) وكوده :
فعند عمل البرنامج على الكتلة الموجود فيها هذا الكود : سيتحقق من وجود المجلد فإن لم يكن موجود سيصنعه.
-----------------------
ولنفترض بأننا سنسمي قاعدة البيانات التي سنعمل عليها هي (MyDataBase.mdb) ولنخزنها مع مسارها في المتغير الذي عرفناه في المودل والخاص بمسار قاعدة البيانات وهو (MyDataPath) ،، ولنخزن هذا المسار في المتغير في حدث الاقلاع أو التحميل (Load) للفورم الأب من خلال الكود :
أصبح لدينا الان مسار مخزن في المتغير (لقاعدة بيانات غير موجودة حتى الان)..
---------------------------
أصبح بإمكاننا الان جعل البرنامج يخلق قاعدة البيانات من خلال الكود :
ننشئ فضاء عمل - وبه ننشئ قاعدة البيانات .. في المسار المحدد .. ونختار لها كلمة مرور ولتكن (123)، بتشفيرها الافتراضي (dbEncrypt).
--------------------------
لكن في البداية أن نتحقق من وجود هذه القاعدة في مسارها أم لاا .. فإن لا صنعها :
من خلال الكود :
وبعد صنعها نقوم بإغلاقها .. ثم تفريغ الكائن (محرك DAO)..
------------------------------------------------------------------
توضيح : هكذا سيكون نهجنا في كامل المشروع ،، سنقوم بإغلاق الكائن بعد الانتهاء منه
فلن نفتح قاعدة البيانات في بداية المشروع ونغلقها عند اغلاق المشروع .. بل سنفتحها عند الحاجة ونغلقها عند الانتهاء من الأمر نفسه ولن ننتظر حتى يبدي المستخدم رأيه بأمر حتى نغلقها بل تغلق وعند ابداء رأيه أو طلب أمر جديد تفتح لتنفذ ذلك الأمر ثم يغلقها بعد انتها الامر ..
فلن نسمح للكائن أن ينفذ أمرين متعارضين ولا حتى متكاملين ونبقى أيام نبحث عن الخطأ ولماذا حدث ونضيع وقتنا على تصحيح الأخطاء.
فالكائن لن ينفذ إلا الأمر في هذه الكتلة فقط وإن خرج لكتلة كودية ثانية سنجد هناك كائن آخر يقوم بنفس الوظيفة (للوظيفة الجديدة) ولا علاقة له بكود الكتلة الأولى.
------------------------------------------------------------------
بعد صنعنا لقاعدة بيانات فارغة أصبح بإمكاننا البدء بصنع الجداول
------------------------------------------------------------------
كود صنع جدول جديد اسمه مخزن في الكائن (qTableName) هو :
أي : إنشاء جدول ثم يربط هذا الجدول بالقاعدة الموجودة.
لكن أي جدول بدون حقول هو لا شيء لذا نريد انشاء حقول داخب هذا الجدول
وإنشائ الحقول يحتاج الكود التالي :
FieldName : اسم الحقل
FieldType : نوع الحقل
من أجل التبسيط وعدم كتابة هذا الامر مكررا مع كل حقل جديد نختصر الأمر في بلوك(كتلة كودية ولتكن) :
فكلما أردنا اضافة حقل في الجدول نستدعي الحدث ثم نحدد اسم الحقل من خلال المتغير FieldName
وسيعطينا نوعه افتراضياً (FieldType) كـ حقل افتراضي (Optional) وإن شئنا غيرنا لغير نوع
لو أردنا صناعة حقل جديد اسمه (Name) حقل نصي يكن من خلال الكود :
ولو أردنا صناعة حقل يخزن قيمة نقدية سيبح الكود :
أي بإمكاننا إختيار نوع البيانات التي نريد تخزين البيانات فيها بإضافة
وهكذا في كل الحقول ..
-------------------------
توضيح :
على الأغلب في هذا البرنامج سأختار حقول نصية لكل ما سأستخدمه حتى الحقول التي سأخزن في أرقام وتواريخ ..
وذلك لتنميط طريقة البحث(البحث بنفس الطريقة دون تعديل -- وللتحكم بالحقول وترتيب البيانات فيها بالشكل الذي نريد -- ).
------------------------
تقريباً أصبحنا جاهزين لبناء جداول البيانات ..
سنبدأ بها قريباً بإذن الله
وسنبدأ بأهم جدولين فيها :
- جدول اليوزرات : لأنه سيدخل معنا في كل ما سنمر به من عمليات في النوافذ.
- جدول دليل الحسابات : لأنه الأساس في معرفة طريقة معالجة البيانات محاسبياً وبرمجياً.
-------------------------
وإلى لقاء آخر .. والله خير معين .. والحمد لله رب العالمين..
بعد حمد الله والثناء عليه والصلاة والسلام على خير الخلق والأنام سيدنا محمد صلى الله عليه وسلم ..
اليوم نبتدأ بالعمل على المشروع الجديد ..
كما هي العادة بكل مشروع جديد - نفتح برنامج VB.6.0 ويخيرنا بفتح مشروع (نختار تنفيذي قياسي - Standard exe )
فيفتح بنافذة رقم واحد :
بما أن مشروعنا يتعلق ببرنامج حسابات نطلب إضافة (Mdi Form) (تجدها في القوائم الرئيسية قائمة Project)
نجعل الفورم الاول تابع لهذا الفورم من خلال الخاصية (mdiChild) نجعلها True (تجدها في نافذة خصائص الفورم الأول)
نذهب لخصائص المشروع الرئيسي (Project Properties) (تجدها في القوائم الرئيسية قائمة Project)
وتستطيع الوصول إليها أيضاً من (نافذة المشاريع اللي هي : Project Project1)
نختار من نافذة بدء المشروع(Startup Object) نختار الفورم الأب الجديد والذي هو (MDIForm1) ثم نضغط (Ok)
وذلك ليصبح إقلاع المشروع من نافذة الفورم الأب .. الأم .. الحاوي (اللي بدك ياه..سميه كما تشاء)
نختار الـ from1 اسم جديد وليكن frmMain1 يعني الفورم الرئيسي ..
---------------------------------------------------------------------------------
توضيح : سنجعل هكذا نهجنا في كل التسميات ستكون تعبيرية عن كل شيء سيحمل اسماً :
بداية التسمية frm ثم اسم يعبر عن وظيفة النافذة . (تسميات النوافذ)
cmd بداية لتسميات الأزرار (الأوامر) .
txt بداية لتسميات مربعات الادخال(التكسات).
الاسم : نعني به الاسم البرمجي (Name)
التسمية : نعني بها الاسم الظاهري (Caption)
------------------------------------------------------
نختار تسمية جديدة لمشروعنا وليكن مثلاً (TA_Accountant V:XXX)
نقم أيضاً بإضافة (مودل جديد لتخزين الأكواد العامة فيه والتي لا تخص النوافذ بل مرجع لكل المشروع متى احتجنا إليها)
سنقوم بإضافة أكثر من (مودل) لذا سنعمد لتسمية كل مودل بحسب وظيفته .
الان نضيف مودل جديد يتعلق بقواعد البيانات والعمليات عليها وليكن اسمه (ModuleDataBase1) (تجدها في القوائم الرئيسية في قائمة Project)
-----------------------------------------------------
نقم الان بتعريف عدة مكتبات سنحتاجها في عملنا على قواعدج البيانات :
وذلك من الخاصية (References .. ) (تجدها في القوائم الرئيسية في قائمة Project)
نحدد المكتبات التالية ونضغ OK :
Microsoft DAO 3.6 Object Library ' للعمل على قواعد البيانات
Microsoft Scripting Runtime ' للعمل على الملفات
-----------------------------------------------------
نفتح المودل ونفم بكتابة فيه بعض التعريفات :
- تعريف كائن مكتبة السكربتات.
- تعريف تعريف متغير نصي لحفظ مسار قاعدة البيانات فيه.
- متغير يعبر عن محرك العمل على قواعد البيانات مع بعض المتغيرات لصناعة جداول جديدة.
وذلك من خلال الكود التالي :
PHP كود :
'===============================
' تعريف كائن مكتبة السكربتات
Public Fs As New FileSystemObject
'===============================
' تعرف متغير كـ مسار لقاعدة بيانات المشروع الحالية
Public MyDataPath As String
'==============================
' تعاريف خاصة بكائنات التحكم بقاعدة البيانات
Public db As DAO.Database ' تعريف محرك التحكم بقاعدة البيانات
Dim Ws As DAO.Workspace ' تعريف ورقة عمل لانشاء قاعدة جديدة
Dim TBL1 As DAO.TableDef ' تعريف كائن كـ جدول في قاعدة البيانات
Dim F1 As DAO.Field ' تعريف كائن كـ حقل في جدول من قاعدة البيانات
'=============================
فما سنتخدمه في أ يمكان بالمشروع عرفناه كـ متغير عام بـ (Public)
وما سنستخدمه كـ متغير خاص وضمن نافذة المودل فقط عرفناه كـ متغير خاص ولا يمكن رؤيته خارج المودل بـ (Dim).
----------------------
توضيح : بإمكاننا أن نكتب في كل كتلة (Procedure) من الكود كامل الكود الذي نحتاجه وبالتفصيل
ولكن لن نفعل ذلك وسنحاول قدر الامكان أن نجعل برنامجنا من حيث الكود أكثر احترافية وسنختصر قدر المستطاع
لأننا سنحاول على عمل كتل أكواد عامة سنستدعيها لتنفذ أمر ما كلما أحتجنا إليها بدون الحاجة لكتابة كامل الكود الذي بداخلها كل مرة.
وسيتضح أسلوبنا وبساطته أثناء عملنا على المشروع ..
----------------------
نجعل برنامجنا يبني مجلد جديد لنضع فيه قاعدة البيانات وليكن اسمه (Data) من خلال الكائن (Fs) وكوده :
PHP كود :
' للتحقق من وجود مجلد لحفظ قاعدة البيانات فيها بجانب التطبيق وإلا صنعه
If Fs.FolderExists(App.Path & "\Data") = False Then
Fs.CreateFolder App.Path & "\Data"
End If
-----------------------
ولنفترض بأننا سنسمي قاعدة البيانات التي سنعمل عليها هي (MyDataBase.mdb) ولنخزنها مع مسارها في المتغير الذي عرفناه في المودل والخاص بمسار قاعدة البيانات وهو (MyDataPath) ،، ولنخزن هذا المسار في المتغير في حدث الاقلاع أو التحميل (Load) للفورم الأب من خلال الكود :
PHP كود :
Private Sub MDIForm_Load()
MyDataPath = App.Path & "\Data\MyDataBase.mdb"
End Sub
أصبح لدينا الان مسار مخزن في المتغير (لقاعدة بيانات غير موجودة حتى الان)..
---------------------------
أصبح بإمكاننا الان جعل البرنامج يخلق قاعدة البيانات من خلال الكود :
PHP كود :
Set Ws = DBEngine.Workspaces(0)
Set db = Ws.CreateDatabase(MyDataPath, dbLangGeneral & ";pwd=123", dbEncrypt)
--------------------------
لكن في البداية أن نتحقق من وجود هذه القاعدة في مسارها أم لاا .. فإن لا صنعها :
من خلال الكود :
PHP كود :
If Fs.FileExists(MyDataPath) = False Then
Set Ws = DBEngine.Workspaces(0)
Set db = Ws.CreateDatabase(MyDataPath, dbLangGeneral & ";pwd=123", dbEncrypt)
db.Close
Set db = Nothing
End If
وبعد صنعها نقوم بإغلاقها .. ثم تفريغ الكائن (محرك DAO)..
------------------------------------------------------------------
توضيح : هكذا سيكون نهجنا في كامل المشروع ،، سنقوم بإغلاق الكائن بعد الانتهاء منه
فلن نفتح قاعدة البيانات في بداية المشروع ونغلقها عند اغلاق المشروع .. بل سنفتحها عند الحاجة ونغلقها عند الانتهاء من الأمر نفسه ولن ننتظر حتى يبدي المستخدم رأيه بأمر حتى نغلقها بل تغلق وعند ابداء رأيه أو طلب أمر جديد تفتح لتنفذ ذلك الأمر ثم يغلقها بعد انتها الامر ..
فلن نسمح للكائن أن ينفذ أمرين متعارضين ولا حتى متكاملين ونبقى أيام نبحث عن الخطأ ولماذا حدث ونضيع وقتنا على تصحيح الأخطاء.
فالكائن لن ينفذ إلا الأمر في هذه الكتلة فقط وإن خرج لكتلة كودية ثانية سنجد هناك كائن آخر يقوم بنفس الوظيفة (للوظيفة الجديدة) ولا علاقة له بكود الكتلة الأولى.
------------------------------------------------------------------
بعد صنعنا لقاعدة بيانات فارغة أصبح بإمكاننا البدء بصنع الجداول
------------------------------------------------------------------
كود صنع جدول جديد اسمه مخزن في الكائن (qTableName) هو :
PHP كود :
Set TBL1 = db.CreateTableDef(qTableName) ' انشاء
db.TableDefs.Append TBL1 ' ربط
لكن أي جدول بدون حقول هو لا شيء لذا نريد انشاء حقول داخب هذا الجدول
وإنشائ الحقول يحتاج الكود التالي :
PHP كود :
Set F1 = TBL1.CreateField(FieldName, FieldType) ' انشاء
TBL1.Fields.Append F1 ' ربط
FieldName : اسم الحقل
FieldType : نوع الحقل
من أجل التبسيط وعدم كتابة هذا الامر مكررا مع كل حقل جديد نختصر الأمر في بلوك(كتلة كودية ولتكن) :
PHP كود :
' انشاء حقل في جدول
Private Sub SetField(FieldName As String, Optional ByVal FieldType As DAO.DataTypeEnum = dbText)
Set F1 = TBL1.CreateField(FieldName, FieldType) ' انشاء
TBL1.Fields.Append F1 ' ربط
End Sub
فكلما أردنا اضافة حقل في الجدول نستدعي الحدث ثم نحدد اسم الحقل من خلال المتغير FieldName
وسيعطينا نوعه افتراضياً (FieldType) كـ حقل افتراضي (Optional) وإن شئنا غيرنا لغير نوع
لو أردنا صناعة حقل جديد اسمه (Name) حقل نصي يكن من خلال الكود :
PHP كود :
SetField "Name"
ولو أردنا صناعة حقل يخزن قيمة نقدية سيبح الكود :
PHP كود :
SetField "Amount" ,dbCurrency
وهكذا في كل الحقول ..
-------------------------
توضيح :
على الأغلب في هذا البرنامج سأختار حقول نصية لكل ما سأستخدمه حتى الحقول التي سأخزن في أرقام وتواريخ ..
وذلك لتنميط طريقة البحث(البحث بنفس الطريقة دون تعديل -- وللتحكم بالحقول وترتيب البيانات فيها بالشكل الذي نريد -- ).
------------------------
تقريباً أصبحنا جاهزين لبناء جداول البيانات ..
سنبدأ بها قريباً بإذن الله
وسنبدأ بأهم جدولين فيها :
- جدول اليوزرات : لأنه سيدخل معنا في كل ما سنمر به من عمليات في النوافذ.
- جدول دليل الحسابات : لأنه الأساس في معرفة طريقة معالجة البيانات محاسبياً وبرمجياً.
-------------------------
وإلى لقاء آخر .. والله خير معين .. والحمد لله رب العالمين..
قال صلى الله عليه وسلم:
«كلمتان خفيفتان على اللسان
ثقيلتان في الميزان،حبيبتان إلى الرحمن:
سبحان الله وبحمده، سبحان الله العظيم».
