کوئریهای ذخیرهشده و Viewها در SQL اکسس
در بسیاری از سیستمهای مدیریت پایگاه داده، «View» یا نمای دید، یک جدول مجازی است که بر اساس نتایج یک دستور SQL شکل میگیرد. در نرمافزار مایکروسافت اکسس، معادل دقیق View همان کوئری ذخیرهشده (Saved Query) است که در کدنویسی با نام شیء QueryDef شناخته میشود. در این آموزش به نحوه مدیریت و کار با این کوئریهای ذخیرهشده میپردازیم.
کوئری ذخیرهشده یا View چیست؟
کوئری ذخیرهشده، در واقع همان منطق متنی SQL است که بهطور فیزیکی در ساختار فایل پایگاه داده ذخیره شده است. این موجودیت دقیقاً مانند View در SQL Server عمل میکند. هرگاه این کوئری را اجرا کنید، در لحظه دادههای بهروزشده را از جداول پایه استخراج میکند. شما میتوانید فرمها و گزارشهای خود را مستقیماً به این کوئریها متصل کنید.
چرا استفاده از آنها ضروری است؟
استفاده از کوئریهای ذخیرهشده پایههای معماری اصولی دیتابیس هستند:
- استفاده مجدد از کد: یکبار منطق پیچیده اتصال جداول (JOIN) را مینویسید و همهجا از آن استفاده میکنید.
- امنیت: دسترسی کاربران را محدود میکنید تا بهجای دیدن جداول اصلی خام، فقط نمایی فیلترشده را مشاهده کنند.
- سرعت و بهینهسازی: اکسس کوئریهای ذخیرهشده را از قبل کامپایل (پیشپردازش) میکند؛ بنابراین سریعتر از رشتههای متنی SQL درون کدهای VBA اجرا میشوند.
ساختار و نحوه استفاده
هرچند اکسس از طریق پروتکلهای ADO از دستور CREATE VIEW پشتیبانی میکند، اما راه استاندارد و قدرتمند در محیط بومی اکسس، استفاده از رابط کاربری Query Designer یا کدنویسی اشیاء DAO QueryDef است.
متن یک کوئری ساده میتواند به این شکل باشد:
SELECT Employees.LastName, Departments.DepartmentName
FROM Employees
INNER JOIN Departments ON Employees.DeptID = Departments.DeptID;
مثالهای کاربردی VBA
در این قطعه کد، از طریق برنامه نویسی VBA یک کوئری دائمی (معادل View) در فایل دیتابیس میسازیم:
Option Explicit
Sub CreateSavedQuery()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strSQL As String
Dim queryName As String
Set db = CurrentDb()
queryName = "vw_EmployeeDepartments"
strSQL = "SELECT E.LastName, D.DepartmentName " & _
"FROM Employees AS E INNER JOIN Departments AS D " & _
"ON E.DeptID = D.DeptID;"
' برای جلوگیری از خطا، در صورت وجود نسخه قبلی آن را حذف میکنیم
On Error Resume Next
db.QueryDefs.Delete queryName
On Error GoTo 0
' ساخت شیء QueryDef جدید (ذخیره در دیتابیس)
Set qdf = db.CreateQueryDef(queryName, strSQL)
MsgBox "کوئری / View با موفقیت ساخته و ذخیره شد!", vbInformation
Set qdf = Nothing
Set db = Nothing
End Sub
توضیح کد
ابتدا اشیاء اصلی پایگاه داده و QueryDef تعریف میشوند. دستور SQL برای اتصال (JOIN) دو جدول آماده میگردد. از آنجایی که اکسس اجازه ساخت نام تکراری را نمیدهد، با کمک On Error Resume Next تلاش میکنیم کوئری قبلی را حذف کنیم. در نهایت CreateQueryDef دستور متنی را به یک شیء فیزیکی و قابل مشاهده در منوی کناری اکسس تبدیل میکند.
خطاهای رایج
- تلاش برای ذخیره کوئری با نامی که در حال حاضر به عنوان یک جدول یا فرم در سیستم وجود دارد (خطای ۳۰۱۲).
- صدا زدن کوئری از طریق VBA در حالی که کاربر مستقیماً نام آن را در رابط کاربری تغییر داده یا آن را حذف کرده است.
بهترین روشها (Best Practices)
- یک قانون نامگذاری سختگیرانه وضع کنید. کوئریهای ذخیرهشده را با پیشوند
qry_یاvw_نامگذاری کنید تا در بین جداول اصلی گم نشوند. - بهجای پراکنده کردن دهها رشته متنی SQL داخل کدهای VBA، منطق واکشی داده را در قالب QueryDefs ذخیره کنید. مدیریت یک کوئری متمرکز بسیار راحتتر است.
موضوعات مرتبط
- ارسال پارامتر به کوئریها از طریق VBA
- انواع اتصالات JOIN در SQL
سؤالات متداول درباره کوئریهای ذخیرهشده اکسس
آیا اکسس مفهومی به نام View دارد؟
بله، اگرچه در رابط کاربری اکسس به آن Saved Query گفته میشود، اما این کوئریها دقیقاً عملکرد و نقش یک View در سیستمهایی مانند SQL Server را ایفا میکنند.
آیا میتوانم از دستور CREATE VIEW استفاده کنم؟
اگر با اتصالات ADO یا OLE DB کدنویسی میکنید بله، اما استانداردترین راه در خود برنامه اکسس، استفاده از متد CreateQueryDef در کتابخانه DAO است.
سرعت کوئریهای ذخیرهشده بیشتر است یا کدهای داخل VBA؟
کوئریهای ذخیرهشده سریعترند. اکسس پیشاپیش مسیر اجرای آنها را محاسبه و کامپایل میکند، اما کدهای متنی داخل ماژولها باید در لحظه ارزیابی و پردازش شوند.
آیا میتوان از طریق Viewها اطلاعات جداول را آپدیت کرد؟
در صورتیکه কোئری شما ساختاری قابل بروزرسانی (Updatable) داشته باشد (مانند یک Join ساده)، میتوانید. اما کوئریهای حاوی توابع جمعبندی فقط-خواندنی هستند.
چگونه کوئری را در کد VBA فراخوانی کنم؟
دقیقاً مانند جداول فیزیکی؛ کافیست نام کوئری را در متد OpenRecordset قرار دهید، به عنوان مثال: db.OpenRecordset("vw_Report").
جمعبندی
تبدیل جستجوهای تکراری و پیچیده به کوئریهای ذخیرهشده یکی از نمادهای برنامهنویسی حرفهای در اکسس است. این کار کدنویسی VBA شما را خلوتتر، امنیت سیستم را بیشتر و سرعت بارگذاری گزارشها را بهینه میکند.