نرمافزار مایکروسافت اکسس (Microsoft Access) یکی از قدرتمندترین ابزارها برای مدیریت پایگاه داده، به خصوص در محیطهای اداری و شرکتی است. همانطور که در مقالات قبلی بررسی کردیم، اکسس به شما امکان ذخیرهسازی و مدیریت دادهها را میدهد. اما وقتی حجم دادهها زیاد میشود، پیدا کردن یک رکورد خاص چالشبرانگیز میشود.
ابزارهای جستجوی پیشفرض اکسس کارآمد هستند، اما معمولاً فقط به شما اجازه جستجو بر اساس یک فیلد را میدهند. اما اگر بخواهید همزمان بر اساس «نام خانوادگی»، «شهر» و «وضعیت فعال بودن» یک کارمند را جستجو کنید چه؟
در این مقاله، میخواهیم به صورت گام به گام یاد بگیریم که چگونه یک فرم جستجوی پیشرفته در اکسس بسازیم که به کاربر اجازه دهد بر اساس چندین فیلد به صورت همزمان، دادهها را فیلتر کند.
پیشنیازها: برای شروع چه چیزهایی لازم است؟
قبل از شروع، ما به سه جزء اساسی نیاز داریم:
- یک جدول داده (Table): این جدول حاوی اطلاعات ما است. ما در این آموزش از جدولی به نام
tbl_Employeesاستفاده میکنیم. - یک فرم نمایش نتایج (Results Form): فرمی که نتایج جستجو را در آن نمایش میدهیم. معمولاً یک فرم از نوع "Datasheet" یا "Continuous Forms" مناسب است. ما فرمی به نام
frm_Resultsبر اساس جدولtbl_Employeesمیسازیم. - یک فرم جستجوی اصلی (Search Form): این یک فرم خالی و Unbound خواهد بود که فیلدهای جستجو (TextBox ها) و دکمه جستجو در آن قرار میگیرد. نام آن را
frm_SearchDashboardمیگذاریم.
نکته تخصصی: فرم "Unbound" (بدون اتصال) به فرمی گفته میشود که مستقیماً به هیچ جدول یا کوئری متصل نیست (
RecordSourceآن خالی است). ما از این فرم فقط به عنوان یک پنل کنترل برای فیلتر کردن فرم دیگر استفاده میکنیم.
گام اول: آمادهسازی جدول و فرم نتایج
ابتدا، جدول tbl_Employees را با فیلدهای زیر ایجاد کنید:
EmployeeID(AutoNumber, Primary Key)FirstName(Short Text)LastName(Short Text)City(Short Text)Department(Short Text)
چند رکورد داده نمونه (ترجیحاً فارسی) در آن وارد کنید. برای مثال:
| EmployeeID | FirstName | LastName | City | Department |
|---|---|---|---|---|
| 1 | علیرضا | فاضلی | تهران | فنی |
| 2 | حسین | احمدی | اصفهان | فروش |
| 3 | سارا | محمدی | تهران | مالی |
| 4 | رضا | کاظمی | شیراز | فروش |
سپس، با استفاده از ویزارد اکسس (Form Wizard)، یک فرم ساده بر اساس این جدول بسازید و نام آن را frm_Results بگذارید و در حالت Datasheet View ذخیره کنید.
گام دوم: طراحی فرم جستجوی اصلی (frm_SearchDashboard)
- یک فرم خالی (Blank Form) در حالت Design View ایجاد کنید و آن را با نام
frm_SearchDashboardذخیره کنید. - مطمئن شوید که خاصیت
RecordSourceاین فرم خالی است (Unbound). - از تب Design، سه عدد TextBox اضافه کنید و نام آنها را به ترتیب
txt_FirstName,txt_LastNameوtxt_Cityبگذارید. (برای خوانایی بهتر، برای هر کدام یک Label هم در کنارش قرار دهید). - یک دکمه (Button) اضافه کنید و نام آن را
btn_Searchو متن (Caption) آن را "جستجو" بگذارید. - یک دکمه دیگر به نام
btn_Resetو با متن "پاک کردن فیلتر" اضافه کنید. - و در نهایت، فرم
frm_Resultsرا که در گام قبل ساختید، بکشید و داخل فرمfrm_SearchDashboardرها کنید تا به عنوان یک Subform به آن اضافه شود. نام کنترل Subform را (نه خود فرم را) بهsub_Resultsتغییر دهید.
حالا فرم شما باید شبیه یک داشبورد مدیریتی باشد. بخش بالایی برای ورود اطلاعات جستجو و بخش پایینی (Subform) برای نمایش نتایج.
گام سوم: نوشتن کد VBA (جادوی اصلی)
اینجا جایی است که منطق جستجوی پیشرفته پیادهسازی میشود. ما میخواهیم وقتی کاربر روی دکمه btn_Search کلیک میکند، اکسس یک عبارت SQL داینامیک بسازد و آن را به عنوان فیلتر (Filter) به Subform ما اعمال کند.
- روی دکمه
btn_Searchکلیک راست کرده وBuild Event...را انتخاب کنید. Code Builderرا انتخاب کنید.- در محیط VBA، کد زیر را در رویداد
btn_Search_Clickوارد کنید:
Private Sub btn_Search_Click()
[cite_start]' Author: Alireza Fazeli (Tosinso.com) [cite: 1]
' Purpose: Build a dynamic filter string based on multiple text fields
Dim strWhereClause As String
Dim strBaseSQL As String
' Start with a base condition that is always true
' This makes appending "AND" clauses much easier
strBaseSQL = "1=1"
' --- Build Where Clause ---
' Check FirstName
' We use the Nz function to handle empty/null textboxes
If Nz(Me.txt_FirstName, "") <> "" Then
strBaseSQL = strBaseSQL & " AND [FirstName] Like '*" & Me.txt_FirstName & "*'"
End If
' Check LastName
If Nz(Me.txt_LastName, "") <> "" Then
strBaseSQL = strBaseSQL & " AND [LastName] Like '*" & Me.txt_LastName & "*'"
End If
' Check City
If Nz(Me.txt_City, "") <> "" Then
strBaseSQL = strBaseSQL & " AND [City] Like '*" & Me.txt_City & "*'"
End If
' --- Apply the Filter ---
' Debugging: Check the generated SQL string
' Debug.Print strBaseSQL
' Apply the generated string to the subform's Filter property
' 'sub_Results' is the NAME of the subform CONTROL
Me.sub_Results.Form.Filter = strBaseSQL
Me.sub_Results.Form.FilterOn = True
End Sub
تحلیل کد نوشته شده
strBaseSQL = "1=1": این یک ترفند رایج است. ما عبارت فیلتر را با "1=1" (که همیشه درست است) شروع میکنیم. به این ترتیب، برای اضافه کردن هر شرط جدید، میتوانیم به سادگی یکANDبه آن اضافه کنیم و نگران این نباشیم که کدام شرط اولین است.Nz(Me.txt_FirstName, "") <> "": تابعNz(Null to Zero) چک میکند که آیا فیلدtxt_FirstNameخالی (Null) است یا خیر. اگر خالی بود، آن را به یک رشته خالی ("") تبدیل میکند. ما چک میکنیم اگر فیلد خالی نبود، آنگاه شرطANDرا اضافه کن.Like '*" & Me.txt_FirstName & "*'": ما از عملگرLikeبه جای=استفاده میکنیم. ستارهها (*) به معنای "هر کاراکتری" هستند. این یعنی اگر کاربر "رضا" را جستجو کند، "علیرضا" هم پیدا میشود (جستجوی بخشی از متن).Me.sub_Results.Form.Filter: این خط کد، عبارت SQL ساخته شده را به خاصیتFilterفرمی که داخل کنترل Subform قرار دارد، اعمال میکند.Me.sub_Results.Form.FilterOn = True: فیلتر را فعال میکند.
گام چهارم: تکمیل دکمه "پاک کردن فیلتر"
برای دکمه btn_Reset (پاک کردن فیلتر) نیز کد زیر را در رویداد Click آن بنویسید:
Private Sub btn_Reset_Click()
' Clear the textboxes
Me.txt_FirstName = Null
Me.txt_LastName = Null
Me.txt_City = Null
' Turn off the filter on the subform
Me.sub_Results.Form.FilterOn = False
' Optional: Requery the form
' Me.sub_Results.Form.Requery
End Sub
گام پنجم: تست نهایی فرم جستجو
فرم frm_SearchDashboard را در حالت Form View باز کنید.
- هیچ متنی وارد نکنید و "جستجو" را بزنید. باید تمام رکوردها (4 رکورد) نمایش داده شوند (چون فیلتر نهایی
1=1بوده است). - در فیلد
FirstNameعبارت "رضا" را تایپ کنید و "جستجو" را بزنید. باید رکوردهای "علیرضا" و "رضا" (2 رکورد) نمایش داده شوند. - حالا علاوه بر "رضا" در
FirstName، در فیلدCityعبارت "تهران" را وارد کنید. "جستجو" را بزنید. فقط رکورد "علیرضا فاضلی" (1 رکورد) باید باقی بماند. - دکمه "پاک کردن فیلتر" را بزنید. باید دوباره تمام رکوردها نمایش داده شوند و TextBox ها خالی شوند.
نتیجه گیری
شما با موفقیت یک فرم جستجوی پیشرفته و داینامیک در اکسس ساختید. این تکنیک، که بر اساس ساخت داینامیک یک عبارت WHERE در VBA و اعمال آن به خاصیت Filter فرم است، ستون فقرات بسیاری از نرمافزارهای حرفهای مبتنی بر اکسس میباشد.به شما اطمینان میدهم که تسلط بر این مهارت، سطح کاربری شما را از یک کاربر عادی به یک توسعهدهنده اکسس ارتقا میدهد.
شما میتوانید این کد را گسترش دهید تا فیلدهای بیشتری، مانند جستجو بر اساس تاریخ (Date) یا مقادیر عددی (Number) و یا چکباکسها (Yes/No) را نیز پشتیبانی کند.
نظرات کاربران (0)