هذا السؤال مقدم من الاستاذ عماد حمدي
ويطلب فيه وضع كود لحذف كائن ( نموذج - جدول - تقرير - استعلام - ماكرو - وحدة نمطية ) من قاعدة بيانات خارجية لا علاقة لها بالقاعدة الاساسية فنقول بسم الله وعلى بركة الله
اولا : كيف يقوم برنامج الاكسيس بتعريف الكائنات بداخله
كما تعلم اخي الكريم ان لبرنامج الاكسيس صفات معينه مبرمجة بداخله يستطيع التعامل معها داخليا من خلال الكود الخاص بـالـ 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
اختكم
زهره


