الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

حذف كائن من قاعدة بيانات خارجية

مغلق
بدأه zahrah في 20 مارس 2006 · 2 رد · 2,119 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هذا السؤال مقدم من الاستاذ عماد حمدي

ويطلب فيه وضع كود لحذف كائن ( نموذج - جدول - تقرير - استعلام - ماكرو - وحدة نمطية ) من قاعدة بيانات خارجية لا علاقة لها بالقاعدة الاساسية فنقول بسم الله وعلى بركة الله

اولا : كيف يقوم برنامج الاكسيس بتعريف الكائنات بداخله

كما تعلم اخي الكريم ان لبرنامج الاكسيس صفات معينه مبرمجة بداخله يستطيع التعامل معها داخليا من خلال الكود الخاص بـالـ VBA

لهذا نجد ان برنامج الاكسيس يسمي الكائنات على التحو التالي :

acTable جدول

acForm نموذج

acMacro ماكرو

acModule وحدة نمطية

acQuery استعلام

acReport تقرير

كما يوجد به عدة اوامر لتنفيذ عمليات محدده ومنها على سبيل المثال الدالة DeleteObject

هذه الدالة تسمح لك بحذف اي كائن سواء داخل القاعدة نفسها او قاعدة بيانات خارجية ويحتاج الى هذا الامر او الدالة الى معرفات وهي التي ذكرناها في الاعلى ( الكائنات ) .

سنقوم الان بتطبيق مثال بالكود على هذه الدالة بحيث يوضع هذا الكود تحت زر امر عند النقر عليه

Dim objAcc As Access.Application
Set objAcc = GetObject("C:\myOldDB.mdb")
objAcc..DoCmd.DeleteObject acForm, "frmBad"
objAcc.Application.Quit
Set objAcc = Nothing

في بداية الكود قمنا بالتصريح Dim ان الكائن هو كائن برنامج الاكسيس

والسطر الذي يليه نقوم بتعريف الكائن على انه قاعدة بيانات موجوده في موقع ما من جهاز الكمبيوتر وهي هنا قاعدة البيانات C:\myOldDB.mdb

السطر الثالث نحاول التعمق في قاعدة البيانات بتعريف الكائن المطلوب الذي سوف يقع عليه حدث الحذف وهو هنا النموذج frmBad

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

مثال اخر

Dim myDB as Datbase
Set myDB = OpenDatabase("c:\MySecondDB.mdb")
myDB.TableDefs("tblDeleteMe").Delete

هذا الكود يقوم مقام الكود الاول ويؤدي نفس الغرض منه وهو حذف كائن ( جدول ) ويوضع هذا الكود تحت زر امر في حدث عند النقر

السطر الاول من الكود نقوم بالتصريح Dim لقاعدة بيانات وتكون myDB

السطر الثاني نجعل الاسم المختار او المصرح عنه myDB يساوي حدث فتح قاعدة البيانات المطلوبه C:\MySecondDB.mdb

السطر الثالث نعطي امر الحذف للجدول المختار في القاعدة الخارجية وهو tblDeleteMe

حسنا هذه اكواد سهلة وبسيطه ويستطيع اي مبتدىء تنفيذها وهو مغمض العينين بمعنى انها ( أ ب ت ) برنامج الاكسيس

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

Public Function ExtObjsDelAll(ByVal vstrMdbPath As String)
    Dim app As New Access.Application
    Dim con As Container
    Dim doc As Document
    Dim qdf As QueryDef
    Dim lngObjType As Long
    
    app.OpenCurrentDatabase vstrMdbPath
    
    For Each con In app.CurrentDb.Containers
      Select Case con.Name
      Case "Tables", "Forms", "Reports", "Scripts", "Modules":
        For Each doc In con.Documents
         If Left(doc.Name, 4) <> "Msys" And _
            Left(doc.Name, 4) <> "Usys" And _
            Left(doc.Name, 1) <> "~" Then
              
              Select Case doc.Container
              Case "Tables":
                   On Error Resume Next
                   Set qdf = app.CurrentDb.QueryDefs(doc.Name)
                   If Err <> 0 Then
                      lngObjType = acTable
                   Else
                      lngObjType = acQuery
                   End If
                   On Error GoTo 0
              Case "Forms":   lngObjType = acForm
              Case "Reports": lngObjType = acReport
              Case "Scripts": lngObjType = acMacro
              Case "Modules": lngObjType = acModule
              Case Else:      lngObjType = -1
              End Select
              
              If lngObjType <> -1 Then
                 app.DoCmd.DeleteObject lngObjType, doc.Name
                 Debug.Print doc.Name & " - deleted."
              End If
         End If
        Next
      Case Else
      End Select
    Next
    
    app.Quit
    
    Set doc = Nothing
    Set con = Nothing
    Set qdf = Nothing
    Set app = Nothing
End Function

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

Call ExtObjsDelAll

لا تعطيني سمكا ولكن علمني كيف اصطاد

اختكم

زهره

تم تعديل هذه المشاركة بواسطة zahrah في 20 مارس 2006 في 18:04

#2

ما شاء الله عليك أخت زهرة

دائما متألقة بمواضيعك المفيدة

جزاك الله خير الجزاء وجعل ذلك في ميزان حسناتك

:)

ومع اني لست متعمقا في الاكسس الا انني احسست بالفائدة من الموضوع ولو أني لم افهم كل ماجاء فيه

لك كل الشكر اختي زهرة على هذه الجهود :rolleyes:

تم تعديل هذه المشاركة بواسطة ماذربورد في 20 مارس 2006 في 18:21

#3

السلام عليكم ورحمة الله وبركاته

أختى الكريمة واستاذتنا العبقرية دائما زهــــــرة

بارك الله فيكى أستاذتى على سرعة استجابتك , وان كان المفروض ان اقوم انا بفتح الموضوع الجديد , لكن طبعا لان حضرتك اهل للكرم وحسن الخلق قمتى بفتح موضوع جديد للاجابة عن سؤالى والذى اعتذر عن وضعه فى المكان الخطأ ( ولكنه خطأ غير مقصود ) .

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

ونأتى الان الى سؤالى وبشكل اعم والسبب فى طرح هذا السؤال

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

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

وطبعا للقيام بعمل مثل هذا الزر ووظيفته , هناك اكثر من طريقة لانجاز المهمه ( هذا طبعا على قدر معلوماتى وقدر ما توصلت اليه ) مثل

1) عمل زر يقوم بصنع نسخة احتياطية من القاعدة وعمل الحذف او التعديل على النسخة الحالية المفتوحه (وهذا حل اشعر بأن دمه تقييييل , المفروض الزر يصنع نسخة احتياطية بالمواصفات المطلوبه مع الابقاء على النسخة المفتوحه كما هى بدون تغيير)

2) عمل زر يقوم بانشاء قاعدة بيانات فارغة , ثم عمل تصدير للكائنات المختارة من النسخة الحالية المفتوحة الى النسخة الجديدة التى تم انشاءها. (برده حل دمه تقيل بسبب مشاكل العلاقات بين الجداول اثناء التصدير بالكود)

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

والحل الاخير بالنسبة لى هو الامثل (من وجهة نظرى) لانه هيحقق ما اريد عمله بالضبط , وطبعا هذا الحل يتطلب هذا السؤال

كيف يمكن حذف بعض الكائنات من قاعدة خارجية وذلك باستخدام كود داخل القاعدة الحالية؟

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

واخيرا اتمنى لو فى حلول اخرى للقيام بعمل هذه النسخة المصغرة من قاعدة البيانات المفتوحة.

عارف انى قد اطلت عليكم ولكن اعذرونى .

هذا وبالله التوفيق,,,

تم تعديل هذه المشاركة بواسطة عماد حمدي احمد في 21 مارس 2006 في 03:11

أشهد أن لا إله إلا الله وأشهد أن محمدا رسول الله

bnr025.gif

مـــوقـــعـــى

هذا الموضوع مغلق.

مواضيع مشابهة