برنامج يحول ملفات الأكسس الى exe

برنامج رائع بحق
أروع مم كنت أتخيل
و أروع ما فيه أنك تستطيع ارفاق ملفاتك بداخله
هذا البرنامج يقوم بتحويل ملفات قواعد البيانات الى ملف exe حقيقى لا يحتاج الى تنصيب
و لا أعتقد أن هناك برامج مشابهة له
فكل البرامج الاخرى تحفظ ملفات الاكسس فى ملف exe و يتم اعادة ملف الاكسس الى حالته بعد التنصيب

البرنامج مجانى تماما و حجمه حوالى 200 كب فقط و لا يحتاج الى أى اضافات أو تنصيب
أتمنى أن يستفيد منه الجميع

تحميل البرنامج

معرفة ما اذا كان ملف معين مفتوح أم لا

هذه الدالة تعطيك اجابة لهذا السؤال

Function IsFileOpen(strFile) As Boolean
    Dim intFreeFile As Integer

    On Error Resume Next
    intFreeFile = FreeFile
    Open strFile For Input Lock Read As #intFreeFile
    Select Case Err.Number
        Case 70
                 IsFileOpen = True
        Case 0
            Close #intFreeFile
        Case Else
            '   Some other error
    End Select
End Function

و تكون نتيجة السؤال
نعم اذا كان الملف مفتوح أو لا اذا كان مغلق

 MSGBOX IsFileOpen("MYFILE.TXT")

تحويل ملف تكست الى ملف اكسيل

لتحويل ملف تكست الى ملف اكسيل سنستخدم هذه الدالة

Function ProcessTextFile(ByVal TextFileName As String, ByVal Delim As String, ByVal ExcelFileName As String)

    Dim appExcel As Excel.Application
    Dim intHandle As Integer
    Dim strLine As String
    Dim varElements As Variant
    Dim intCol As Integer
    Dim intRow As Integer
    
    Set appExcel = New Excel.Application
    With appExcel
        .Visible = True
        .Workbooks.Add
        intHandle = FreeFile
        Open TextFileName For Input As #intHandle
        Do Until EOF(intHandle)
            intRow = intRow + 1
            Line Input #intHandle, strLine
            varElements = Split(strLine, Delim)
            For intCol = 0 To UBound(varElements)
                .ActiveSheet.Range(Chr(65 + intCol) & CStr(intRow)).Select
                .Selection = varElements(intCol)
            Next intCol
        Loop
        Close #intHandle
        .ActiveWorkbook.SaveAs Filename:=ExcelFileName
        .Quit
    End With
    Set appExcel = Nothing
    
End Function

و لاستخدامها نستخدم كود كهذا
حيث يتم تحديد مسار ملف التكست و ملف الاكسيل (اذا لم يكن موجود سيتم انشاؤه ) و الفاصل بين الاعمدة
فى هذا المثال الفاصل بين الاعمدة هو التاب VBTAB حيث أن ملف التكست محفوظ من ملف اكسيل أخر بصيغة Text tab delimited

ProcessTextFile CurrentProject.Path & "\Worksheet2nn2.txt", "VBTAB",  CurrentProject.Path & "\Worksheet2.xlsx"

اغلاق ملف اكسيل محدد

لاغلاق ملف اكسيل محدد نستخدم هذا الاجراء

Sub CloseExcel(xlfile As String)
On Error Resume Next
    Dim ObjXL As Excel.Application
    Dim objWkb As Excel.Workbook

    If Not IsFileOpen(xlfile) Then
        MsgBox "file is not open"
        Exit Sub
    End If

        Set ObjXL = GetObject(, "Excel.Application")
        Set objWkb = ObjXL.Workbooks.Open(xlfile)
        ObjXL.Application.DisplayAlerts = False
        objWkb.Close
        If ObjXL.Workbooks.Count = 0 Then ObjXL.Quit
        Set ObjXL = Nothing
        Set objWkb = Nothing
        MsgBox "file was closed"
End Sub

و هنا ستحتاج الى دالة لتحديد هل الملف مفتوح أم لا

Function IsFileOpen(strFile) As Boolean
    Dim intFreeFile As Integer

    On Error Resume Next
    intFreeFile = FreeFile
    Open strFile For Input Lock Read As #intFreeFile
    Select Case Err.Number
        Case 70
                 IsFileOpen = True
        Case 0
            Close #intFreeFile
        Case Else
            '   Some other error
    End Select
End Function

و للتطبيق هذا مثال
أولا أضف الكودين السابقين ثم استخدم كود مثل هذا ( يتم اضافة مسار الملف كاملا )

CloseExcel "C:\Worksheet.xlsx"

أساسيات تصميم قواعد البيانات

أهمبة تصميم قواعد البيانات :-
تأتى أهمية التصميم الصحيح لقاعدة البيانات كونه أساسياً لتحقيق الأهداف في العمل مع قاعدة البيانات . و التصميم الجيد يسهل عملية استخدام و ادارة القاعدة أما التصميم السيىء فسيؤدى الى تكرار البيانات ( و يعنى وجود نفس البيانات فى أكثر من مكان ) مم يعنى حجم زائد بلا داعى و يؤدى أيضا الى صعوبة الحفاظ على توافقية البيانات مم يؤدى الى الحصول على بيانات غير دقيقة عند طلب تلك البيانات من قاعدة البيانات .و هذا بدوره سيؤدى الى اتخاذ قرارات خاطئة لاعتمادها على معلومات خاطئة .

لذلك يوفر هذا الموضوع إرشادات عامة لتخطيط قاعدة البيانات. و كيفية اختيار المعلومات التي تحتاجها، وكيفية تقسيم المعلومات في الجداول والأعمدة المناسبة، وكيفية ارتباط هذه الجداول بعضها ببعض .

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

لذلك فالتصميم الجيد لقاعدة البيانات هو التصميم الذى :-
1- يقسم المعلومات إلى جداول منفصلة مستندة إلى مواضيع لتقليل البيانات المكررة.
2- يوفر المعلومات التي يتطلبها Access لربط المعلومات في جداول مع بعضها عند الحاجة.
3- يساعد على دعم وضمان دقة وتكامل المعلومات.
4- يتواءم مع متطلبات معالجة البيانات وإعداد التقارير.

عملية التصميم:-
تتكون عملية تصميم قواعد البيانات من الخطوات التالية:
1- تحديد الغرض من قاعدة البيانات
2- العثور على المعلومات المطلوبة وتنظيمها
3- تقسيم المعلومات إلى جداول
4- تحويل عناصر المعلومات إلى أعمدة
5- تعيين مفاتيح أساسية
6- إعداد علاقات الجدول
7- تنقية التصميم
8-تطبيق قواعد التسوية

نصيحة :- استخدم الورقة و القلم (فقط) عند تصميم قاعدة بياناتك و بعد انتهاء عملية التصميم يمكنك الانتقال الى بناء قاعدة البيانات بنقل التصميم من الورق الى قاعدة البيانات .

 

 

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

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

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

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

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

تؤدي الحاجة لإرسال رسائل بريد إلكتروني للعملاء إلى تسجيل عنصر آخر. بمجرد معرفة رغبة العميل في تلقي رسائل بريد إلكتروني، يجب التعرف على عنوان البريد الإلكتروني لإرسالها. ولذلك تحتاج لتسجيل عنوان البريد الإلكتروني لكل عميل.

من المستحسن أن تقوم بإنشاء قالب (نموذج) أولي لكل تقرير أو قائمة إخراج وأن تضع في اعتبارك العناصر التي ستحتاجها لإنشاء التقرير. على سبيل المثال، عند اختبار رسالة نموذجية، يخطر على الذهن أشياء قليلة. إذا أردت تضمين تحية مناسبة — مثل “السيد” أو “السيدة” أو “الآنسة”. تؤدي السلسلة التي تبدأ بالتحية إلى إنشاء عنصر تحية. كما يجب بشكل عام بدء الرسالة بـ “عزيزي السيد عمرو”، أو “عزيزي السيد عمرو زكي”. مما يؤدي إلى تخزين اسم العائلة منفصلاً عن الاسم الأول بشكلٍ عام.

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

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

بعد تجميع هذه المعلومات، تكون مستعداً للخطوة التالية.

تقسيم المعلومات إلى جداول:-

لتقسيم المعلومات إلى جداول، اختر الوحدات أو المواضيع الرئيسية. على سبيل المثال، بعد العثور على معلومات لقاعدة بيانات مبيعات منتج وتنظيمها، يجب أن تظهر القائمة المبدئية كما يلي:

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

عند مراجعة قائمة العناصر المبدئية أولاً، قد تحاول وضع كافة العناصر في جدول واحد بدلاً من الأربعة المعروضة في الشكل السابق. ستتعرف هنا على سبب خطأ هذه الفكرة. فكر للحظة في الجدول المعروض هنا:

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

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

عند تصميم قاعدة بيانات، حاول دائماً تسجيل كل معلومة مرة واحدة. إذا تم تكرار نفس المعلومة في أكثر من مكان، عنوان عميل معين مثلاً، قم بوضع هذه المعلومة في جدول منفصل.

أخيراً، افترض أن هناك منتج واحد فقط يورده “المورد 1″، وأردت حذف المنتج والإبقاء على المعلومات الخاصة باسم المورد وعنوانه. كيف يمكنك حذف سجل المنتج بدون فقدان بيانات المورد؟ لا يمكنك ذلك نظراً لاحتواء كل سجل على بيانات عن المنتج والمورد أيضاًَ. لا يمكنك حذف واحد دون حذف الآخر. للإبقاء على هذه البيانات منفصلة، يجب تقسيم الجدول الواحد إلى جدولين: يضم الأول معلومات حول المنتج والثاني يضم معلومات حول المورد. وبذلك فإن حذف سجل المنتج يؤدي إلى حذف البيانات حول المنتج فقط، و تبقى بيانات  المورد.

بمجرد اختيار الموضوع الذي سيعرضه الجدول، يجب أن يتم تخزين بيانات حول هذا الموضوع فقط في أعمدة الجدول. على سبيل المثال، يجب تخزين بيانات حول المنتج فقط في جدول المنتجات. ونظراً لأن عنوان المورد هو بيان عن المورد وليس المنتج، فهو ينتمي إلى جدول الموردين.

تحويل عناصر المعلومات إلى أعمدة:-

لتحديد الأعمدة في جدول، يجب تحديد المعلومات التي تحتاج لتعقبها حول الموضوع المسجل في الجدول. على سبيل المثال، بالنسبة لجدول “العملاء” تعد الأعمدة “الاسم” و”العنوان” و”المدينة-الولاية-المنطقة” و”إرسال بريد إلكتروني” و”التحية” و”عنوان البريد الإلكتروني” قائمة أعمدة مبدئية جيدة. يحتوي كل سجل في الجدول على نفس مجموعة الأعمدة، لذلك يمكنك تخزين المعلومات “اسم” و”عنوان” و”مدينة-ولاية-منطقة” و”إرسال بريد إلكتروني” و”التحية” و”عنوان البريد الإلكتروني” لكل سجل. على سبيل المثال، يحتوي عمود العنوان على عناوين العملاء. يتضمن كل سجل بيانات حول العميل كما يحتوي حقل العنوان على عنوان هذا العميل.

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

كما يجب التفكير في ما إذا كانت قاعدة البيانات ستحتوي على معلومات من أصل محلي فقط أم دولي أيضاً. على سبيل المثال، إذا أردت تخزين عناوين دولية، من الأفضل وجود عمود “المنطقة” بدلاً من “البلد”، لأن مثل هذا العمود سيتسع لكل الحالات المحلية والمناطق/البلاد الأخرى. بالمثل، يكون الرمز البريدي الدولي أفضل بكثير من الرمز البريدي المحلي عند تخزين عناوين دولية.
عند تحديد الأعمدة يجب أن تراعى التالى :-
1- لا تقم بتضمين بيانات محسوبة
في كثير من الحالات، يجب ألا تخزن نتائج العمليات الحسابية في الجداول. بدلاً من ذلك، يمكنك أن تجعل Access يجري العمليات الحسابية عندما تريد مشاهدة النتائج.

على سبيل المثال، رصيد المنتج أو الكميات المتوفرة  لا يجب ان نحتفظ بها فى الجدول و لكن يتم حسابها عند الحاجة اليها .

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

بمجرد أن تتم تنقية أعمدة البيانات في كل جدول, اختر المفتاح الأساسي لكل جدول.

تعيين مفاتيح أساسية:-

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

إذا كان هناك بالفعل معرّف فريد للجدول، مثل رقم المنتج الذي يُعرف بشكل فريد كل منتج في الكتالوج الخاص بك، يمكنك استخدام المُعرف كمفتاح أساسي للجدول — ولكن فقط إذا اختلفت القيم الموجودة في هذا العمود لكل سجل بشكلٍ دائم. لا يمكن ظهور قيم متكررة في المفتاح الأساسي. على سبيل المثال، لا تستخدم أسماء الأشخاص كمفتاح أساسي لأنها غير فريدة، حيث يمكن أن يحمل شخصان نفس الاسم في نفس الجدول بسهولة.

يجب أن يكون للمفتاح الأساسي قيمة دائماً. إذا أمكن في بعض الأحيان أن تكون قيم الأعمدة غير معينة أو غير معروفة (قيم مفقودة)، لا يمكن أبداً استخدامها كمكونات في المفتاح الأساسي.

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

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

إذا لم يكن حاضراً في ذهنك اسم عموداً أو مجموعة أعمدة تصلح كمفاتيح أساسية جيدة, فكر في استخدام العمود الذي يستخدم نوع البيانات “ترقيم تلقائي”. عند استخدام نوع البيانات “ترقيم تلقائي”، يُعين Access قيمةً تلقائياً. هذا المعرِّف غير حقيقي؛ فهو يحتوي على معلومات غير حقيقية لوصف الصف الذي يمثله. ويفضل استخدام المعرّفات غير الحقيقية كمفتاح أساسي لأن قيمها لا تتغير. المفتاح الأساسي الذي يحتوي على معلومات حقيقة حول الصف ـــــ على سبيل المثال, رقم التليفون أو اسم العميل ــــــ من المحتمل أن يتغير, لأن المعلومات الحقيقية نفسها قد تتغير.

*** تصلح الأعمدة التي تم تعيينها إلى نوع البيانات “رقم تلقائي” كمفاتيح أساسية جيدة, لأنها تضمن عدم وجود معرّفات منتجات متشابهة.

قد تستخدم في بعض الحالات حقلين أو أكثر معاً لتوفير مفتاح أساسي للجدول. على سبيل المثال, قد يستخدم جدول “تفاصيل الطلبات”، الذي يخزن عناصر خطية للطلبات، عمودين لمفتاحه الأساسي: هما معرّف الطلب ومعرّف المنتج. عندما يستخدم المفتاح الأساسي أكثر من عمود واحد يسمى مفتاحا مركبا.

في قاعدة بيانات مبيعات المنتجات، يمكنك إنشاء عمود “ترقيم تلقائي” كمفتاح أساسي لكل من الجداول: العمود “معرّف-المنتج” لجدول “المنتجات”، والعمود “معرّف-الطلب” لجدول “الطلبات”، والعمود “معرّف-العميل” لجدول “العملاء”، والعمود “معرّف-المورد” لجدول “الموردون”.

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

** تأتي المعلومات في هذا النموذج من جدول “العملاء” و جدول “الموظفون” و جدول “الطلبات” و جدول “المنتجات و جدول”تفاصيل الطلبات”.

إن Access هو نظام لإدارة قواعد البيانات الارتباطية. في قاعدة البيانات الارتباطية, يتم تقسيم المعلومات إلى جداول منفصلة مستندة إلى مواضيع. ثم يتم استخدم العلاقات بين الجداول لإرجاع المعلومات مع بعضها مرة أخرى عند الحاجة.

إنشاء علاقة رأس بأطراف ( واحد الى متعدد ) :-
راجع هذا المثال: جداول “الموردون” و”المنتجات” في قاعدة بيانات طلبات المنتجات. يمكن لمورد واحد تقديم أي عدد من المنتجات. وتبعاً لذلك يمكن أن يقابل كل مورد موجود في جدول “الموردون” عدة منتجات في جدول “المنتجات”. وهكذا تكون العلاقة بين جدولي “الموردون” وجدول “المنتجات” هي علاقة رأس بأطراف.

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

يسمى العمود “معرّف المورد” في جدول “المنتجات” مفتاح خارجي. يعد المفتاح الخارجي هو مفتاحاً اساسياً آخر للجدول. ولذلك يعتبر العمود “معرّف المورد” مفتاحاً خارجياً في جدول “المنتجات” وأساسي أيضاً في جدول “الموردون”.

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

إنشاء علاقة أطراف بأطراف ( متعدد الى متعدد ) :-

فكر في العلاقة بين جدول “المنتجات” وجدول “الطلبات”.
قد يتضمن طلب واحد أكثر من منتج. على الجانب الآخر, يمكن أن يظهر منتج واحد في عدة طلبات. ولذلك، قد يكون لكل سجل في جدول “الطلبات” عدة سجلات في جدول “المنتجات”. وقد يكون أيضاً لكل سجل في جدول “المنتجات” عدة سجلات في جدول “الطلبات”. يسمى هذا النوع من العلاقات علاقة أطراف بأطراف، حيث يكون لأي منتج عدة طلبات؛ ويكون لأي طلب عدة منتجات. لاحظ أنه من المهم لاكتشاف علاقات أطراف بأطراف بين الجداول أن تضع جانبي العلاقة في الاعتبار.

تتضمن مواضيع الجدولين — الطلبات والمنتجات — علاقة أطراف بأطراف مما يؤدى إلى ظهور مشكلة. لإدراك هذه المشكلة تخيل أنك تحاول إنشاء علاقة بين الجدولين بإضافة الحقل “معرّف المنتج” إلى جدول “الطلبات”. تحتاج للحصول على عدة منتجات لكل أمر لأكثر من سجل واحد في جدول “الطلبات” لكل أمر. قد تتكرر معلومات الأمر في كل صف مرتبط بأمر واحد — مما يتسبب في إنشاء تصميم غير فعال يقودك إلى بيانات غير دقيقة. ستقع في نفس هذه المشكلة إذا تم وضع الحقل “معرّف الطلب” في جدول “المنتجات” — قد تجد أكثر من سجل لكل منتج في جدول “المنتجات”. كيف يمكنك حل هذه المشكلة؟

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

يمثل كل سجل في جدول “تفاصيل الطلبات” بند سطر واحد في الطلب. يتكون المفتاح الأساسي لجدول “تفاصيل الطلبات” من حقلين — المفاتيح الخارجية من جداول “الطلبات” و”المنتجات”. لا يعمل استخدام الحقل “معرّف الطلب” وحده مثل المفتاح الأساسي لهذا الجدول، لأنه يمكن أن يكون للطلب الواحد عناصر خطوط متعددة. يتم تكرار “معرّف الطلب” لكل بند سطر في الطلب، لا يتضمن الحقل قيم فريدة. وكذلك لا يعمل استخدام الحقل “معرّف المنتج” حيث يمكن ظهور منتج واحد في عدة طلبات مختلفة. ولكن دائماً ينتج الحقلان الاثنان معاً قيم فريدة لكل سجل.

في قاعدة بيانات مبيعات المنتج، لا يرتبط كل من جدول “الطلبات” وجدول “المنتجات” مباشرة. بدلاً من ذلك، يرتبطا بطريقة غير مباشرة من خلال جدول “تفاصيل الطلبات”. يتم تقديم علاقة أطراف بأطراف بين الطلبات والمنتجات في قاعدة البيانات باستخدام علاقتي رأس بأطراف:

تربط بين كل من جدول “الطلبات” وجدول “تفاصيل الطلبات” علاقة رأس بأطراف. قد يكون لكل طلب أكثر من بند سطر، ولكن كل بند سطر يرتبط بطلب واحد فقط.
تربط بين كل من جدول “المنتجات” وجدول “تفاصيل الطلبات” علاقة رأس بأطراف. قد يقترن بكل منتج أكثر من عنصر خط واحد، ولكن يشير كل بند سطر إلى منتج واحد.

من جدول “تفاصيل الطلبات”، يمكنك تحديد كافة المنتجات الموجودة ضمن طلب معين. يمكنك أيضاً تحديد كافة الطلبات الخاصة بمنتج معين.

بعد تضمين جدول “تفاصيل الطلبات”، يجب أن تظهر قائمة الجداول والحقول كما يلي:

إنشاء علاقة رأس برأس (واحد الى واحد ) :-

تعد علاقة رأس برأس هي نوع آخر من أنواع العلاقات. على سبيل المثال، افترض أنك تحتاج لتسجيل معلومات حول بعض المنتجات الإضافية التي قليلاً ما تحتاجها أو يتم تطبيقها على عدد قليل من المنتجات. يجب وضع هذه المعلومات في جدول منفصل وذلك بسبب عدم الحاجة إليها في كثير من الأحيان، ولأن تخزين هذه المعلومات في جدول “المنتجات” يؤدي لظهور مساحات فارغة لكل منتج  لا يتم تطبيقها عليه. يتم استخدام الحقل “معرّف المنتج” كمفتاح أساسي مثلما حدث في جدول “المنتجات”. تكون العلاقة بين الجدول الإضافي وجدول “المنتجات” هي علاقة رأس برأس. يوجد لكل سجل في جدول “المنتجات” سجل واحد مطابق له في الجدول الإضافي. يجب عند تعريف مثل هذه العلاقة أن يشترك كلا الجدولين في حقل مشترك.

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

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

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

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

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

بينما تقوم بتجربة قاعدة بياناتك الأولية، ستكتشف وجود مساحة للتحسينات. فيما يلي بعض الأشياء التي يجب التحقق منها:

هل تم نسيان أيه أعمدة؟ إذا حدث ذلك، هل تنتمي المعلومات للجدول الموجود؟ إذا كانت معلومات حول شيء آخر، قد تحتاج لإنشاء جدول آخر. قم بإنشاء عمود لكل عنصر معلومة تريد تعقبه. إذا لم تتمكن من حساب المعلومات من أعمدة أخرى، من الأفضل إنشاء أعمدة جديدة لها.
هل هناك أعمدة غير ضرورية لأنه يمكن حسابها من حقول موجودة؟ — حساب السعر المُخفض من سعر التجزئة على سبيل المثال — إنه من الأفضل القيام بذلك فقط، وتجنب إنشاء أعمدة جديدة.
هل قمت بإدخال معلومات متكررة أكثر من مرة في الجداول؟ إذا حدث ذلك، فيجب تقسيم الجدول إلى جدولين بينهما علاقة رأس بأطراف.
هل يوجد جداول فيها حقول متعددة وعدد محدود من السجلات والعديد من الحقول الفارغة في سجلات مفردة؟ إذا حدث ذلك، فكر في إعادة تصميم الجدول بحيث يكون فيه عدد قليل من الحقول وسجلات أكثر.
هل تم تقسيم كل عنصر معلومة إلى أجزاء صغيرة مفيدة؟ إذا أردت عمل تقرير أو فرز أو بحث أو حساب وفقاً لعنصر معلومات، يجب وضع هذا العنصر في الحقل الخاص به.
هل يحتوي كل عمود على معلومة حول موضوع الجدول؟ إذا لم يكن كذلك، فقد تنتمي إلى جدول آخر.
هل تم تقديم كل العلاقات بين الجداول، إما بواسطة حقول المشتركة أو جدول ثالث؟ تتطلب علاقتي رأس برأس ورأس بأطراف وجود أعمدة مشتركة. وتتطلب علاقة أطراف بأطراف وجود جدول ثالث.

تنقية جدول “المنتجات”

افترض أن كل منتج في قاعدة بيانات مبيعات المنتجات يقع أسفل فئة عامة، مثل فواتح الشهية والتوابل ومأكولات البحر. قد يتضمن جدول “المنتجات” حقل يظهر فئة كل منتج.

افترض أنه بعد اختبار وتنقية تصميم قاعدة البيانات, قررت تخزين وصف الفئة واسمها. إذا تم إضافة حقل “وصف الفئة” إلى جدول “المنتجات”، يجب تكرار وصف كل فئة لكل منتج يقع أسفل هذه الفئة — لا يكون ذلك حلاً صحيحاً.

الحل الأفضل هو أن تنشئ جدول “فئات” جديد في قاعدة البيانات لتعقبه وتعقب جدوله ومفتاحه الأساسي. يمكنك بعد ذلك إضافة مفتاح أساسي من الجدول “فئات” إلى جدول “المنتجات” كمفتاح خارجي.

يربط الجدولان “الفئات” و”المنتجات” علاقة رأس بأطراف: يمكن أن تتضمن الفئة أكثر من منتج واحد، بينما ينتمي كل منتج إلى فئة واحدة فقط.

عند مراجعة بنية الجدول، ابحث عن المجموعات المتكررة. على سبيل المثال، جرب جدول يحتوي على الأعمدة التالية:

معرّف المنتج
الاسم
معرّف المنتج 1
الاسم 1
معرّف المنتج 2
الاسم 2
معرّف المنتج 3
الاسم 3

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

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

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

كلما رأيت مجموعات متكررة راجع التصميم جيداً مع التأكد من تقسيم الجدول. في المثال السابق يكون من الأفضل استخدام جدولين أحدهما للموردين والآخر للمنتجات ويتم ربطهما بواسطة معرّف المورد.

تطبيق قواعد التسوية Normalization Rules :-
يمكنك تطبيق قواعد تسوية البيانات (التي تسمى أحياناً قواعد التسوية فقط) كخطوة ثانية في التصميم. يتم استخدام هذه القواعد للتأكد من بناء الجداول بشكل صحيح. تسمى عملية تطبيق القواعد على تصميم قاعدة البيانات بتسوية قاعدة البيانات أو التسوية فقط.

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

توجد ثلاثة قواعد تسوية  مطلوبة لمعظم تصميمات قواعد البيانات.

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

القاعدة  الثانية
و يتم تطبيق هذه القاعدة عندما يتكون المفتاح الأساسي من عدة أعمدة.
تنص القاعدة الثانية على أن كل عمود بالجدول ( بلا مفتاح)  يجب أن يعتمد اعتماداً كلياً على المفتاح الأساسي بأكمله وليس جزءاً منه فقط.
على سبيل المثال، افترض أن هناك جدول يحتوي على الأعمدة التالية حيث يُكون “معرّف الطلب” و”معرّف المنتج” هما المفتاح الأساسي:

معرّف الطلب (مفتاح أساسي)
معرّف المنتج (مفتاح أساسي)
اسم المنتج

يخالف هذا التصميم القاعدة الثانية ، لأن اسم المنتج يستند إلى معرّف المنتج وليس إلى معرّف الطلب وبذلك فهو لا يعتمد على المفتاح الأساسي بأكمله. يجب إزالة اسم المنتج من الجدول. يتم نقل هذا الحقل إلى جدول مختلف (جدول المنتجات).

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

معرّف المنتج (مفتاح أساسي)
الاسم
السعر
الخصم

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

عرض السجل الحالى من النموذج فى التقرير

لفتح التقرير على السجل الحالى فى النموذج
نستخدم كود لفتح التقرير كما يلى

DoCmd.OpenReport "myreport", acPreview, ,"[RID]=" & me!FID

حيث myreport هو اسم التقرير
و RID هو اسم حقل المفتاح الاساسى فى التقرير
و FID هو اسم حقل المفتاح الاساسى فى النموذج

منع حذف الجداول يدويا

فى بعض الاحيان قد تحذف جدول من الجداول عن طريق الخطأ
او قد تحتاج الى الحفاظ على الجداول من الحذف من قبل المستخدم
هذا الكود يمنع الحذف اليدوى للجداول و حتى تقوم بالغاء جدول يجب ايقاف الكود أولا ثم الالغاء أو الالغاء عن طريق كود
مثال لكود حذف الجدول

currentproject.connection.execute "DROP TABLE YourtableName"

ملحوظات :-
1- يجب ان تكون الجداول بها حقل ترقيم تلقائى ( ليس من الضرورى ان يكون مفتاح اساسى )
2- تقسيم القاعدة الى جزئين ( واجهة و بيانات ) يلغى عمل الكود ——- يمكنك اعادة تشغيل الكود فى القاعدة الخلفية من جديد بعد نقل الوحدة النمطية اليها
3- استيراد الجداول الى قاعدة بيانات جديدة ——- يحتاج اعادة تشغيل الكود فى القاعدة الجديدة من جديد بعد نقل الوحدة النمطية اليها

تطبيق الكود :-
1- انسخ الكود الى وحدة نمطية جديدة ثم احفظها
2- اضغط CTL + G لفتح immediate window
3- اكتب الكود التالى

?StopManualTableDelete("Yes")

4- اضغط enter
حاول الان حذف اى جدول

لايقاف عمل الكود:-
كرر الخطوات من 2 الى 4
2- اضغط CTL + G لفتح immediate window
3- اكتب الكود التالى

?StopManualTableDelete("No")

4- اضغط enter

حاول الان حذف اى جدول ‘

الان تبقى لنا الوحدة النمطية

Public Function StopManualTableDelete(YesOrNo As String)
Dim fld As DAO.Field
Dim db As DAO.Database
Dim tbl As DAO.TableDef
Dim SQL_CreateConstraint As String, SQL_DropConstraint As String
Dim strConstraint As String ' this variable holds the name of the constraint
Dim i As Integer
Dim tblNames As String, DeleteInfo As String
Set db = CurrentDb()

i = 0
For Each tbl In db.TableDefs
' Bypass system tables with autonumbers Also any hidden table that starts with "~"
If Mid(tbl.Name, 1, 4) <> "MSys" Then
If Left(tbl.Name, 1) <> "~" Then
For Each fld In db.TableDefs(tbl.Name).Fields
If dbAutoIncrField = (fld.Attributes And dbAutoIncrField) Then 'Find autonumber
DoCmd.Hourglass True
strConstraint = "con_" & fld.Name & "_" & tbl.Name 'Build constraint name
If YesOrNo = "YES" Then
i = i + 1
'Drop any existing autonumber field constraints if there is one.
If FindCheckConstraint(strConstraint) = True Then
SQL_DropConstraint = "ALTER TABLE " & tbl.Name & " DROP CONSTRAINT " & strConstraint
CurrentProject.Connection.Execute SQL_DropConstraint
End If

DoEvents ' await a while just in case

'create the new constraint to disallow the table from being deleted.
SQL_CreateConstraint = " ALTER TABLE " & tbl.Name & " ADD " & " CONSTRAINT " & strConstraint & " CHECK (" & fld.Name & " IS NOT NULL))"
'Debug.Print SQL_CreateConstraint
CurrentProject.Connection.Execute SQL_CreateConstraint
DeleteInfo = "CANNOT"

End If

If YesOrNo = "NO" Then
'Drop any existing autonumber field constraints.
If FindCheckConstraint(strConstraint) = True Then
i = i + 1
SQL_DropConstraint = "ALTER TABLE " & tbl.Name & " DROP CONSTRAINT " & strConstraint
CurrentProject.Connection.Execute SQL_DropConstraint
DeleteInfo = "CAN"
End If
End If

tblNames = tblNames & tbl.Name & vbNewLine
Exit For
End If
Next fld
End If
End If
Next tbl
db.Close
Set db = Nothing
DoCmd.Hourglass False

If i > 0 Then
MsgBox i & " tables have been set so they " & DeleteInfo & " be deleted manually. " & vbNewLine & "These tables are:" & vbNewLine & vbNewLine & tblNames
Else
MsgBox "There are no tables with Autonumber fields present in this database." & vbNewLine & "Therefore this code did not have any effect on this database."
End If

End Function
Public Function FindCheckConstraint(MyConstraint As String) As Boolean

'this function checks to see if a check constraint already exist on the autonumber field.
Dim fld As ADODB.Field
Dim rst As ADODB.Recordset
Set rst = CurrentProject.Connection.OpenSchema(adSchemaCheckConstraints)

Do Until rst.EOF
For Each fld In rst.Fields
If fld.Name = "CONSTRAINT_NAME" Then
If fld.Value = MyConstraint Then
'Debug.Print fld.Value
FindCheckConstraint = True
Exit For
End If
End If
Next fld
rst.MoveNext

Loop
End Function

كيف تعرف اذا كان ملف او مجلد موجود ام لا

فى كثير من الأحيان قد تحتاج الى تحديد ما اذا كان ملف او مجلد موجود ام لا
لذلك فالدالة التالية تجيب على ذلك

Function IsExist(stPath As String, Optional lngType As Long) As Boolean
    On Error Resume Next
    IsExist= Len(Dir(stPath, lngType)) > 0
End Function

للسؤال عن ملف

if IsExist("c:\winnt\win.ini") then

للسؤال عن مجلد

   if IsExist("c:\msoffice",vbdirectory) then 

إغلاق التقرير اذا لم تكن به بيانات

فى كثير من الاحيان عند عرض التقرير نجد انه خالى من البيانات ( لعدم وجود تلك البيانات )
و فى تلك الحالة فلن تكون هناك حاجة لعرض التقرير

الكود التالى يتم وضعه فى التقرير لتحقيق ذلك

Private Sub Report_NoData(Cancel As Integer)
  MsgBox "لا توجد بيانات سيتم اغلاق التقرير "
    Cancel = True
End Sub

و لكن لاحظ انه اذا تم فتح التقرير من خلال كود بالنموذج قد يحدث خطأ نتيجة الغاء فتح التقرير
لذلك
يفضل وضع العبارة

On Error Resume Next

قبل كود فتح التقرير لمنع ظهور هذا الخطأ

هل النموذج مفتوح

قد يحتاج المبرمج فى كثير من الاحيان الى تحديد ما اذا كان نموذج معين مفتوح أم لا
الدالة الاتية تجيب على ذلك

Function IsLoaded(ByVal strFormName As String) As Boolean
'Returns false if form is not open or true if Open
    If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> 0 Then
        If Forms(strFormName).CurrentView <> 0 Then
            IsLoaded = True
        End If
    End If
End Function

و يمكن استخدامها بهذه الطريقة

if not IsLoaded("myformname") then DoCmd.OpenForm  "myformname"