قاعدة البيانات المستخدمة للتوضيح وفى إعداد الأمثلة التالية (Microsoft Access 2003):
فى هذا الموضوع سيتم شرح وتوضيح طريقة عمل:
1) طرق ترقيم تلقائى مسلسل واحد عبر عدة جداول
2) تطبيق ترقيم تلقائى مسلسل واحد عبر عدة جداول فى نفس قاعدة البيانات
3) تطبيق ترقيم تلقائى مسلسل واحد عبر عدة جداول فى قواعد بيانات مختلفة (قد تكون على شبكة)
4) كيفية تطبيق هذا الـ(Template) على قاعدة بيانات أخرى (Microsoft Access)
الهدف: تطبيق ذلك بطريقة سهلة، وبأقل مجهود من المبرمج.
1) طرق ترقيم تلقائى مسلسل واحد عبر عدة جداول
يمكن إنجاز ذلك بعدة طرق مختلفة، سأوضح أثنين من هذه الطرق:
1) وهى الطريقة الأكثر انتشارا، وذلك باستخدام الدالة (DMax)، أو إنشاء استعلام أو جملة (SQL) للحصول على أكبر قيمة فى الحقل باستخدام (MAX)
2) وهى مثل التى يستخدمها محرك قاعدة البيانات فى توليد الترقيم التلقائى، وتعتمد على تخزين أخر قيمة تم استخدامها، وعن الاحتياج لتوليد رقم جديد، يتم قراءة هذه القيمة أولاً ثم إضافة واحد مثلاً لتوليد الرقم الجديد
2) تطبيق ترقيم تلقائى مسلسل واحد عبر عدة جداول فى نفس قاعدة البيانات
تم عمل ذلك باستخدام الطريقة (1) وذلك بكتابة كود كـ (Template) حتى يسهل نسخه بسهولة إلى تطبيقات أخرى – راجع (Example 1) فى المرفق - وذلك بالتالى:
أولاً: الـ (modMain Module)، ولا يتم تغير أى شيئ فيه:
1) إنشاء (Class) كوحدة نحتفظ فيها بأسماء الجداول (والحقل) المراد أخذه بالاعتبار فى الترقيم المتسلسل – أسمها (Tables)
2) دالة بالاسم (AttachUniqueAutoNumbering) لإضافة أسماء الجداول والحقول. فى حالة وجود الجدول مضاف من قبل فلا يتم إضافته مرة أخرى، وهى تستخدم الـ (Linked list) فى تنظيم أسماء الجداول والحقول، لمزيد من التوضيح حول استخدام الـ (Linked list): فى /index.php?showtopic=118580
3) دالة بالاسم (GetNextUniqueNumber) للحصول على الترقيم الجديد – من اكبر قيمة فى حقل الجداول - وتأخذ المتغير (Step) والذى من خلاله يتم تحديد الزيادة ، أى فى حالة الرغبة فى ترقيم يزيد بمقدار أعلى من (1) كما فى نموذج (fTable4) يتم تحديد ذلك من خلال القيمة المرسلة إلى الدالة
4) دالة (GetSqlString) لبناء جملة (SQL) المستخدمة فى إرجاع اعلى قيمة
5) دالة (GetField) لإرجاع قيمة (رقم) نتيجة جملة (SQL) المرسلة لها
6) الدالة (GetNextNumber) وهى (Public) وتستدعى الدالة (GetNextUniqueNumber)
7) الدالة (AttachTableField) وهى (Public) وتستدعى الدالة (AttachUniqueAutoNumbering)
ثانياًً: الـ (modTables Module)، ويتم التغير فية بإضافة الجداول والحقول للدالة (StartingTables):
1) يحتوى الدالة (StartingTables) والتى تحتوى على استدعاء الدالة (AttachTableField) بأسم الجدول يليه أسم الحقل بالشكل التالى:
Public Sub StartingTables() AttachTableField "Table1", "ID" AttachTableField "Table2", "Num" … End Sub
ثالثاًً: الـنماذج (Forms)، المراد استخدام الترقيم التلقائى فيها، ويتم تعديل معامل الدالة GetNextNumber حسب الاحتياج:
1) يحتوى على الحدثين (Form_Load الذى يستدعى StartingTables) و (Form_BeforeInsert الذى يستدعى يخصص القيمة الجديدة للحقل من خلال استدعاء الدالة GetNextNumber) بالشكل التالى:
Private Sub Form_Load() StartingTables End Sub Private Sub Form_BeforeInsert(Cancel As Integer) ID.Value = GetNextNumber(1) ' مقدار الزيادة = 1 End Sub
3) تطبيق ترقيم تلقائى مسلسل واحد عبر عدة جداول فى قواعد بيانات مختلفة (قد تكون على شبكة)
تم عمل ذلك باستخدام الطريقة (2) وذلك بكتابة كود كـ (Template) حتى يسهل نسخه بسهولة إلى تطبيقات أخرى – راجع (Example 2) فى المرفق - وذلك بالتالى:
أولاً: قاعدة البيانات (Master.mdb) وتحتوى على الجدول (Options) والذى يتم فيه حفظ أخر تسلسل ، والزيادة الافتراضية كل مرة:
ثانياً: قاعدة البيانات المراد تطبيق الترقيم عليها (Database2.mdb و Database1.mdb) ولا يحتويا على الجدول (Options):
أولاً: الـ (modMain Module)، ولا يتم تغير أى شيئ فيه:
1) دالة بالاسم (GetNextUniqueNumber) للحصول على الترقيم الجديد – من أخر قيمة تم تخزينها - وتأخذ المتغير (Step) والذى من خلاله يتم تحديد الزيادة ، أى فى حالة الرغبة فى ترقيم يزيد بمقدار أعلى من (1) كما فى نموذج (fTable4)
2) دالة (GetField) لإرجاع قيمة (رقم) نتيجة جملة (SQL) المرسله لها
3) الدالة (SetOption) لحفظ اخر ترقيم تم توليده فى الجدول (Options)
4) الدالة (GetNextNumber) وهى (Public) وتستدعى الدالة (GetNextUniqueNumber)
5) للبدء من ترقيم محدد: وذلك يمكن من خلال الجدول (Options)، فللبدء من ترقيم 400 يتم تخصيص القيمة (399) لـ (LastNumber) فى الجدول (Options)، حيث سيبدأ من بعد هذه القيمة باعتبار أنها أخر قيمة تم استخدامها.
6) للزيادة بقيمة معينة: وذلك يمكن من خلال الجدول (Options)، فللزيادة 3 يتم تخصيص القيمة (3) لـ (Stepping) فى الجدول (Options)، حيث ستتم استخدامها كقيمة افتراضية إذا لم تحدد فى الدالة (GetNextNumber).
ثانياًً: الـ (modTables Module)، ويحتوى الدالة (GetOptionsTable):
1) يحتوى الدالة (GetOptionsTable) ويتم التعديل فيها لضبط المتغير (ExternalDB) بحيث يحتوى المسار الكامل لقاعدة البيانات التى تحتوى على جدول (Options) المشترك – (بالطبع من الممكن إدراج الجدول "Options" كـ "Link Table" واستخدامه، ولكن قد يسبب ذلك مشاكل والغحتياج لإعادة ضبط إذا تم نقل قواعد البيانات إلى فهرس أخر – لذا فضلت استخدام ذلك من خلال دالة) - وهى بالشكل التالى:
Public Function GetOptionsTable() As String Dim ExternalDB As String ExternalDB = CurrentProject.Path & "\Master.mdb" ' المسار الكامل لقاعدة البيانات If Len(ExternalDB) <> 0 Then ExternalDB = "[" & ExternalDB & "]." End If GetOptionsTable = ExternalDB & "Options" End Function
ثالثاًً: الـنماذج (Forms)، المراد استخدام الترقيم التلقائى فيها، ويتم تعديل معامل الدالة GetNextNumber حسب الاحتياج:
1) يحتوى على الحدث (Form_BeforeInsert الذى يستدعى يخصص القيمة الجديدة للحقل من خلال استدعاء الدالة GetNextNumber) بالشكل التالى:
Private Sub Form_BeforeInsert(Cancel As Integer) ID.Value = GetNextNumber(3) ' مقدار الزيادة = 3 End Sub
4) كيفية تطبيق هذا الـ(Template) على قاعدة بيانات أخرى (Microsoft Access)
تم عمل ذلك باستخدام الطريقة (2) وذلك بكتابة كود كـ (Template) حتى يسهل نسخه بسهولة إلى تطبيقات أخرى – راجع (Example 2) فى المرفق - وذلك بالتالى:
1) بنسخ (Export and Import) الـ(Modules) التالية إلى قاعدة البيانات لديك (modTables - modMain) والـ(Class Tables)
2) بنسخ الجدول (Options) إلى قاعدة البيانات الجديدة
3) صمم الجدول والنموذج الذى يعمل من خلاله كما فى الأمثلة المرفقة
4) التعديل فى (Module modTables) الدالة (StartingTables) وإدرج أسماء الجداول والحقل المراد عمل ترقيم متسلسل له
5) التعديل فى (Module modTables) الدالة (GetOptionsTable) لتحديد قاعدة البيانات المستخدمة كمرجع فى التسلسل
6) أضف الحدثين (Form_Load - Form_BeforeInsert) فى النماذج المشمولة فى التسلسل التلقائى كما موضع فى الأمثلة
(Example 3) يحتوى على دمج للطريقتين، حيث قاعدة البيانات (MultiNumbering.mdb) تحتوى الجدول (Options) ، وقاعدة البيانات (SubMultiNumbering.mdb) تعتمد على الجدول الموجود فى القاعدة الأولى، كذلك تم إضافة الخيار "NumMethod" فى الجدول (Options) لسهولة التبديل بين استخدم الطريقتين (0= الطريقة الأولى 1= الطريقة الثانية).
وبوجه عام يمكن استخدام الجدول (Options) لحفظ قيم افتراضية للمستخدم أو المبرمج، يوجد مثال لاستخدام هذا الجدول لحماية قاعدة البيانات من التلاعب فى التاريخ (بفرض حظر إدخال بيانات بتاريخ سابق):
Tip: يمكن عمل صورة (BMP) بنفس أسم قاعدة البيانات (كما فى مثال 3)، لعضها بدلاً من صورة (Access Startup)
ملحوظة: لمزيد من الشرح والتوضيح حول استخدام الـ (Linked list):
مثال: /index.php?showtopic=118582
وشكراً






