Applies ToAccess لـ Microsoft 365 Access 2021 Access 2019

قد ينطبق المحتوى هنا على Northwind 2.0 Developer Edition وStarter Edition. 

VBA (Visual Basic for Applications) هي لغة البرمجة المستخدمة في جميع منتجات Office. يتيح لك Learning VBA العمل مع جميع منتجات Office (وليس فقط Access).عند البحث عن "كيفية"، تأكد من البحث عن أمثلة محددة ل Access وتضمين Microsoft Access في البحث. غالبا ما تعمل حلول منتجات Office الأخرى - ولكن لا يوجد ضمان. Microsoft Access هو منتج ناضج؛ وهذا يعني أن هناك الكثير من الأمثلة هناك؛ وهو أمر رائع بالنسبة لك! 

وهذا يعني أيضا أن الكتب القديمة حول برمجة Access لا تزال قابلة للتطبيق بالنسبة لك لإلقاء نظرة عليها. العديد من الكتب القديمة لا تزال متاحة على مواقع الكتب المستخدمة بجزء صغير من تكلفتها الأصلية. تحقق من موقع Microsoft على الويب لتحديد إصدارات Access التي لا تزال مدعومة وانتقل إلى تلك الإصدارات.

نهاية موارد الدعم ل Office - توزيع Office | Microsoft Learn  

فيما يلي بعض الارتباطات إلى وثائق Access في Microsoft.

ملفات Microsoft Access هي ملفات Office. يجب أن تكون ملفات Office في "موقع موثوق به" أو أن يكون "المحتوى الخاص بها ممكنا". تعتبر هذه العناصر "آمنة" لأنك قمت بإنشائها، أو أنها تأتي من مصدر موثوق به. التحقق من وجود مواقع موثوق بها يحدث في كل مرة تفتح فيها أي ملف office. سنشير إلى هذا باسم Trusted/Enabled من هنا فصاعدا. ملاحظة: إذا تم إصدار إصدار جديد من التطبيق وفتحه من موقع غير موثوق به، فستتكرر عملية تمكين المحتوى.

تعرف على المزيد حول المواقع الموثوق بها.: 

وحدات الماكرو والوظائف والأقسام الفرعية هي كيفية تنفيذ منطق العمل في قاعدة بيانات Access. من المهم بالنسبة لك فهم النطاق والرؤية قبل البدء.

تؤدي الأحداث (مثل النقر فوق عنصر تحكم) على عناصر التحكم في نموذج (على سبيل المثال، الأزرار ومربعات النص والتسميات وما إلى ذلك) إلى تشغيل عمليات أخرى، مثل إضافة السجلات أو حذفها أو فتح النماذج. يمكن تنفيذ هذه العمليات باستخدام وحدات الماكرو أو VBA. يستخدم Northwind Starter Edition في الغالب وحدات الماكرو، وبعض VBA حيث لا تتمكن وحدات الماكرو من أداء الوظائف المطلوبة. يستخدم إصدار مطور Northwind VBA بشكل أساسي. 

تحتوي بعض أنواع عناصر التحكم على معالجات مضمنة لإنشاء ماكرو تلقائيا. على سبيل المثال، تؤدي إضافة زر أمر إلى نموذج إلى فتح معالج يوفر العديد من خيارات الوظائف للزر. تؤدي إضافة مربع تحرير وسرد إلى فتح معالج يمكن تكوينه للعثور على سجل معين في النموذج. 

جزء التنقل هو الطريقة الرئيسية لعرض جميع كائنات قاعدة البيانات والوصول إليها ويعرض على الجانب الأيسر من نافذة Access بشكل افتراضي. تم تخصيص جزء التنقل Northwind. أنشأنا فئة مخصصة تسمى Northwind Starter 2.0. يسمح لنا هذا بتنظيم العناصر حسب المنطقة الوظيفية.

في بعض الأحيان تحتاج إلى متغير للوجود بعد الكائن الذي أنشأه يخرج عن النطاق. راجع النطاق والرؤية أعلاه. هناك ثلاث طرق أساسية للقيام بذلك: المتغيرات العامة و TempVars وتخزين القيم في جدول محلي. يستخدم العديد من المطورين مزيجا من هذه. كل له إيجابيات وسلبيات.  مزيد من المعلومات حول كل منها هنا: 

المتغير العام لوحدة VBA: 

TempVars: 

تخزين القيم في الجدول المحلي

  • توجد المتغيرات العامة و TempVars لجلسة العمل الحالية وتخرج عن النطاق عند إغلاق التطبيق. ولكن ماذا لو كنت تريد الاحتفاظ بالمتغيرات المحددة للمستخدم عبر الجلسات؟ يمكنك تخزين هذه الأنواع من القيم في جدول محلي. في Northwind 2.0، يتم حفظ أحد هذه المتغيرات في جدول يسمى SystemSettings. القيمة في الجدول هي ShowWelcome. تخبر هذه القيمة Access إذا كنت تريد رؤية شاشة الترحيب في كل مرة تقوم فيها بتسجيل الدخول أم لا.

غالبا ما يحتاج المطورون إلى تمرير المعلمات من نموذج إلى آخر، أو من نموذج إلى تقرير. تنقل هذه المعلمات معلومات مهمة، والتي ستستخدمها الدالة المسماة لتكوين نفسها. هناك عدة طرق للنموذج أو التقرير الثاني للحصول على معلومات من النموذج الأول. فيما يلي بعض الطرق التالية: 

  1. يمكن للنموذج الثاني "النظر إلى الخلف" إلى النموذج الأول لالتقاط بعض القيم، ربما في عنصر تحكم مرئي أو غير مرئي.  على سبيل المثال: lngCustomerID = Forms!FirstForm!cboCustomerID 

  2. يمكن للنموذج الأول حفظ القيم إلى المتغيرات العمومية أو إلى TempVars. على سبيل المثال: g_lngUserID = Me.cboUserID  TempVars.Add "UserID", Me.cboUserID 

الطريقة التي غالبا ما تستخدم في إصدار مطور Northwind وكذلك في حياتنا المهنية هي استخدام الوسيطة OpenArgs ل DoCmd.OpenForm أو OpenReport. على سبيل المثال: DoCmd.OpenForm "frmCompanyDetail", OpenArgs:=StringFormat("CompanyID={0} &CompanyTypeID={1}", Me.VendorID, ctVendor)

نحن نجمع بين تقنيتين هنا: (1) استخدام OpenArgs لتمرير VendorID و VendorType، و(2) استخدام الدالة StringFormat() لإنشاء، على سبيل المثال، هذه السلسلة: 

CompanyID=5&CompanyTypeID=2 

تبدو هذه السلسلة تشبه إلى حد كبير سلسلة استعلام كما هو مستخدم في المستعرض. يحتوي على واحد أو أكثر من "أزواج الاسم/القيمة" مفصولة بحرف العطف: 

name1=value1&name2=value2

ميزة مثل هذه السلسلة هي أن كل قيمة لها اسم. قارن هذا بنهج أبسط حيث يمكنك تعيين OpenArgs فقط إلى "5,2".  في مثل هذه الحالة، سيستغرق الأمر جهدا لمعرفة ما تشير إليه كل قيمة. تسمية كل قيمة يجعل سلسلة الاستعلام "ذاتي الوصف" وهي ممارسة برمجة جيدة.

في النهاية المتلقية ل DoCmd.OpenForm ، عادة ما نكون في الحدث Form_Open أو Form_Load ونريد تحليل سلسلة OpenArgs في مكوناتها.

في Northwind يمكنك القيام بذلك باستخدام الدالة StringToDictionary . يأخذ دالة تشبه سلسلة الاستعلام ويوزعها في مكوناتها. ثم يتم تخزين هذه المكونات في كائن Scripting.Dictionary . لاحظ أن القيام بذلك يتطلب منك استخدام أدوات > المراجع وتعيين مرجع إلى Microsoft Scripting Runtime (scrrun.dll).

تتضمن ميزات وفوائد عنصر القاموس ما يلي:  

  • ترتيب العناصر ليس مهما

  • دالات بسيطة لإضافة عناصر المجموعة وإزالتها

  • دالات للتكرار الحلقي عبر المجموعة، حتى تتمكن من معرفة ما هو موجود فيها

  • دالة Exists حتى تتمكن من اختبار ما إذا كان عنصر معين متوفرا

يظهر استخدام كائن القاموس في جميع أنحاء Northwind. على سبيل المثال، حدث Form_Load في frmGenericDialog.

نادرا ما تتضمن وحدات الماكرو التي تم إنشاؤها باستخدام معالجات التحكم في Access معالجة الأخطاء على الإطلاق؛ قد يقتصر VBA الذي تم إنشاؤه باستخدام معالجات التحكم على MsgBox Err.Description عام.

في Northwind 2.0، نعرض لك كيفية القيام بذلك بشكل أفضل عند استخدام التعليمات البرمجية ل VBA. لقد قمنا بتنفيذ ما يسمى معالج الأخطاء العمومي. تستدعي الأخطاء التي تحدث في أي إجراء دالة على المستوى العمومي لإظهار الخطأ. الميزة الكبيرة هنا هي أن معالجة الأخطاء متسقة. وإذا كانت الرسالة بحاجة إلى التغيير (على سبيل المثال، لإظهار رقم الخطأ أو لتسجيل الخطأ في ملف)، فيجب أن يتم ذلك في مكان واحد فقط. 

clsErrorHandler هي الوحدة النمطية للفئة التي تنفذ التعليمات البرمجية لمعالجة الأخطاء. تحافظ الوحدة النمطية للفئة على جميع وظائفها الرئيسية والمساعدة معا في وحدة واحدة، وبالتالي تغلف التعليمات البرمجية.

يستدعي الماكرو AutoExec دالة بدء التشغيل في modStartup. في Starter Edition، تنشئ الدالة مثيل clsErrorHandler وتحفظه كمتغير عمومي متاح للاستخدام في جميع أنحاء التطبيق. في إصدار Dev، يتم استخدام فئة ثابتة - راجع التعليقات في أعلى الوحدة النمطية للفئة.

في الواقع، التعليمات البرمجية لمعالجة الأخطاء في الإجراءات متسقة لدرجة أننا تمكنا من إنشاء كل ذلك في أقل من خمس دقائق باستخدام تعليمات VBA البرمجية المحددة التي جهزت كل إجراء بمعالج الخطأ المناسب. (التعليمات البرمجية غير مضمنة في القالب). تم تجهيز إصداري قالب Northwind 2.0 Starter و Developer في البداية بنهج معالجة الأخطاء هذا.  '

معالجة الأخطاء المحسنة

بدءا من الإصدار 2.2 من Northwind Developer Edition، تم تحسين معالج الأخطاء، وذلك بفضل الملاحظات الواردة من مجتمع Access. لم يتغير إصدار Starter. 

في الأساس، معالج الأخطاء في الإصدار السابق (2.0 - تم إصداره في أبريل 2023) هو:

Public Sub HandleError(…)     MsgBox Err.DescriptionEnd Sub

في الإصدار 2.2 تتم ترقيته إلى:

Public Sub HandleError (…, Optional ByVal IsEventProcedure As Boolean = False)     If Not IsEventProcedure Then         Err.Raise lngError, strErrSource     End If     MsgBox Err.DescriptionEnd Sub

لفهم سبب إجراء هذا التغيير، دعونا أولا نفهم ما الذي يجعل التعليمات البرمجية تعمل:

  • يستدعي الماكرو AutoExec إجراء بدء التشغيل، الذي ينفذ بعض التهيئة قبل فتح النموذج الأول.

  • يتفاعل المستخدم مع التطبيق، مثل فتح نموذج أو النقر فوق زر، مما يتسبب في إطلاق إجراءات الحدث مثل Form_LoadcmdPrintInvoice_Click. '

بالإضافة إلى إجراءات الحدث، تحتوي التطبيقات على مسارات فرعية ووظائف - معظمها في الوحدات النمطية - ويتم استدعاء هذه التعليمة البرمجية من إجراءات الحدث. وتسمى هذه الإجراءات "القياسية".

في الإصدار 2.0 من Northwind، ستتعامل الإجراءات القياسية مع الأخطاء الخاصة بها مع الرسائل، ولكنها لن تقوم بطريقة ما بإعلام إجراء حدث الاستدعاء بحدوث خطأ. قد يكون هذا سيئا إذا كان إجراء الحدث يحتوي على تعليمات برمجية لاحقة يجب تشغيلها بغض النظر عن الخطأ السابق الذي تمت معالجته بواسطة الإجراء الذي تم استدعاؤه. بالتأكيد، يمكننا استبدال subroutine بدالة ترجع النجاح أو الفشل، ورمز إجراء الحدث وفقا لذلك، ولكن هذا ليس دائما خيارا.

في الإصدار 2.2 من Northwind، لا تتعامل الإجراءات القياسية مع رسائل الخطأ، ولكن بدلا من ذلك، باستخدام Err.Raise، قم بالإبلاغ عنها مرة أخرى إلى إجراء حدث الاستدعاء. ثم يعرض إجراء حدث الاستدعاء الخطأ الذي تم رفعه ويستأنف في Exit_Handler. هذا أفضل، لأنه يسمح لإجراء الاستدعاء بالاختتام بأمان.

لاستخدام التعليمات البرمجية لإصدار Northwind 2.2، يجب أن تمر إجراءات الحدث إلى HandleError وسيطة ثالثة تشير إلى أن المتصل هو إجراء حدث. تم تحديث Northwind Dev Edition للقيام بذلك.

سيكون لوحدة معالج الأخطاء الأكثر قوة الدعم لإجراءات "الدفع والتفرقع" على "مكدس" (صفيف). سيكون العنصر الأول دائما إجراء الحدث، لذلك ليست هناك حاجة إلى الوسيطة الإضافية. هذا التنفيذ يتجاوز أهداف Northwind Dev Edition.

MRU، أو الأحدث استخداما هو قائمة بالطلبات وأوامر الشراء المستخدمة مؤخرا. قد تحتاج إلى العودة إلى هذه بشكل متكرر لوضعها في الحالة التالية. غالبا ما ينظر إلى قوائم MRU في منتجات Office كقوائم بالملفات المستخدمة مؤخرا والتي قد ترغب في إعادة فتحها مرة أخرى.

في إصدار Northwind Dev، لتنفيذ ميزة MRU (غير الموجودة في إصدار Starter)، يجب أولا إنشاء العناصر التالية: 

  1. جدول لتخزين معلومات MRU.

  2. التعليمات البرمجية لتحديث الجدول عند فتح أمر أو أمر شراء (PO).

  3. التعليمات البرمجية لتحديث القائمة المنسدلة MRU في الشريط.

  4. التعليمات البرمجية لتحميل العنصر عند تحديد عنصر MRU من الشريط.

دعونا ننظر إلى كل من هذه بمزيد من التفصيل. 

1. جدول لتخزين معلومات MRU.

تصميم الجدول MRU يستحق المراجعة، وخاصة فهارسه. لاحظ أن هناك فهرسا مكرر SortIdx للمساعدة في الفرز السريع لعناصر MRU في القائمة المنسدلة للشريط، بالإضافة إلى فهرس فريد لفرض قاعدة العمل التي لكل مستخدم يمكن أن يحدث عنصر مرة واحدة فقط. على سبيل المثال، لا يؤدي فتح نفس الترتيب مرتين إلى إنشاء سجلين في جدول MRU.

يستفيد الجدول من حقيقة أن جميع حقول PK (المفتاح الأساسي) المتعلقة ب MRU في قاعدة البيانات هي ترقيم تلقائي، لذلك يمكن استخدام نوع بيانات عدد صحيح طويل ل PKValue.

2. التعليمات البرمجية لتحديث الجدول عند فتح طلب أو تسجيل الدخول.

في NW2 اخترنا الإضافة إلى قائمة MRU فقط عند إنشاء سجل جديد، وليس عند تحديث سجل موجود مرة أخرى. يمكننا بالتأكيد نقل استدعاء AddToMRU من Form_AfterInsert إلى Form_AfterUpdate لدعم ذلك.

يتم تنفيذ إجراءات AddToMRUوDeleteFromMRU في modGlobal، وهي وحدة نمطية قياسية تكون إجراءاتها العامة مرئية من أي شكل.

يضيف AddToMRU (كما يوحي الاسم) العنصر الجديد إلى جدول MRU، ثم يقوم اختياريا باقتطاعه مرة أخرى، وحذف السجل الأقدم، إذا كان قد نما إلى ما بعد الحد الأقصى للحجم (MAX_MRU_COUNT). ربما تكون الخطوة الأخيرة هي الأقل شهرة لمطوري Access: يجب تحديث القائمة المنسدلة للشريط ويتم إنجاز ذلك عن طريق استدعاء InvalidateControl. هذه إشارة إلى الشريط لإعادة تشغيل عملية التهيئة الخاصة به. 

3. التعليمات البرمجية لتحديث القائمة المنسدلة MRU في الشريط. 

في وقت بدء التشغيل، وبعد استدعاء InvalidateControl ، يتم تنفيذ مجموعة معقدة من الوظائف لملء الشريط.  يتم استدعاء هذه الإجراءات بواسطة الشريط XML في الجدول uSysRibbons الذي يقول جزئيا:

<group id="gCurrentStatus" label="MRU">
    <box id="bxMRU" boxStyle="vertical">
        <dropDown id="ddMRU"
                  getItemCount="ddMRU_GetItemCount"
                  getItemLabel="ddMRU_GetItemLabel"
                  getSelectedItemIndex="ddMRU_GetSelectedItemIndex"
                  getItemID="ddMRU_GetItemID"
                  onAction="ddMRU_OnAction"
                  screentip="Most Recently Used Objects">
        </dropDown>
    </box>
</group>

تملأ دالات رد الاتصال الأربعة هذه القائمة المنسدلة. لاحظ أن هذه هي الفكرة نفسها إلى حد كبير كما هو موضح هنا ل comboboxes القياسية.

إذا قمت بإلغاء التعليق على خطوط Debug.Print في modRibbonCallback وأعدت تشغيل التطبيق، فستقدم النافذة الفورية تسلسلا مثل هذا: 

ddMRU_GetItemCount    ddMRU    6 
ddMRU_GetItemLabel    ddMRU    0      Order 60, Proseware, Inc.
ddMRU_GetItemID       ddMRU    0       2 
ddMRU_GetItemLabel    ddMRU    1      Order 62, Best For You Organics Company
ddMRU_GetItemID       ddMRU    1       4 
ddMRU_GetItemLabel    ddMRU    2      Order 63, Wide World Importers
ddMRU_GetItemID       ddMRU    2       5 
ddMRU_GetItemLabel    ddMRU    3      Order 66, Proseware, Inc.
ddMRU_GetItemID       ddMRU    3       8 
ddMRU_GetItemLabel    ddMRU    4      Order 67, Best For You Organics Company
ddMRU_GetItemID       ddMRU    4       9 
ddMRU_GetItemLabel    ddMRU    5      Order 68, Adatum Corporation
ddMRU_GetItemID       ddMRU    5       10 
ddMRU_GetSelectedItemIndex  ddMRU    0

يمكننا أن نرى هنا أن Access يستدعي أولا إجراء يقوم بإرجاع عدد العناصر المراد تحميلها في الوسيطة ByRef ddMRU_GetItemCount. هذا هو أيضا الوقت الذي نفتح فيه الاستعلام على جدول MRU ونخزنه مؤقتا لأنه على وشك استخدامه عدة مرات. 

ثم يستدعي الشريط بشكل متكرر إجراءين للحصول على قيم المعرف والتسمية للمنزلة المنسدلة المكونة من عمودين. 

وأخيرا، فإنه يستدعي إجراء لفصل العنصر الذي يجب تحديده. (في حالتنا، هو الأول.) 

4. رمز لتحميل عنصر عند تحديد عنصر MRU من الشريط.

كما هو الحال مع أي عنصر شريط آخر، تحدد الخاصية OnAction في الشريط XML دالة رد الاتصال لاستخدامها لتنفيذ الإجراء:

onAction="ddMRU_OnAction"

يتم تنفيذ هذا الإجراء في modRibbonCallback. يعيد استخدام مجموعة السجلات المفتوحة بالفعل للعثور على السجل مع العنصر المحدد، ثم، اعتمادا على TableName المطلوب، يفتح النموذج المقابل، ويمرر قيمة PK المراد تحميلها.

هل تحتاج إلى مزيد من المساعدة؟

الخروج من الخيارات إضافية؟

استكشف مزايا الاشتراك، واستعرض الدورات التدريبية، وتعرف على كيفية تأمين جهازك، والمزيد.