نرم‌افزار مایکروسافت اکسس (Microsoft Access) یکی از قدرتمندترین ابزارها برای مدیریت پایگاه داده، به خصوص در محیط‌های اداری و شرکتی است. همانطور که در مقالات قبلی بررسی کردیم، اکسس به شما امکان ذخیره‌سازی و مدیریت داده‌ها را می‌دهد. اما وقتی حجم داده‌ها زیاد می‌شود، پیدا کردن یک رکورد خاص چالش‌برانگیز می‌شود.

ابزارهای جستجوی پیش‌فرض اکسس کارآمد هستند، اما معمولاً فقط به شما اجازه جستجو بر اساس یک فیلد را می‌دهند. اما اگر بخواهید همزمان بر اساس «نام خانوادگی»، «شهر» و «وضعیت فعال بودن» یک کارمند را جستجو کنید چه؟

در این مقاله، می‌خواهیم به صورت گام به گام یاد بگیریم که چگونه یک فرم جستجوی پیشرفته در اکسس بسازیم که به کاربر اجازه دهد بر اساس چندین فیلد به صورت همزمان، داده‌ها را فیلتر کند.

پیش‌نیازها: برای شروع چه چیزهایی لازم است؟

قبل از شروع، ما به سه جزء اساسی نیاز داریم:

  1. یک جدول داده (Table): این جدول حاوی اطلاعات ما است. ما در این آموزش از جدولی به نام tbl_Employees استفاده می‌کنیم.
  2. یک فرم نمایش نتایج (Results Form): فرمی که نتایج جستجو را در آن نمایش می‌دهیم. معمولاً یک فرم از نوع "Datasheet" یا "Continuous Forms" مناسب است. ما فرمی به نام frm_Results بر اساس جدول tbl_Employees می‌سازیم.
  3. یک فرم جستجوی اصلی (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)

  1. یک فرم خالی (Blank Form) در حالت Design View ایجاد کنید و آن را با نام frm_SearchDashboard ذخیره کنید.
  2. مطمئن شوید که خاصیت RecordSource این فرم خالی است (Unbound).
  3. از تب Design، سه عدد TextBox اضافه کنید و نام آن‌ها را به ترتیب txt_FirstNametxt_LastName و txt_City بگذارید. (برای خوانایی بهتر، برای هر کدام یک Label هم در کنارش قرار دهید).
  4. یک دکمه (Button) اضافه کنید و نام آن را btn_Search و متن (Caption) آن را "جستجو" بگذارید.
  5. یک دکمه دیگر به نام btn_Reset و با متن "پاک کردن فیلتر" اضافه کنید.
  6. و در نهایت، فرم frm_Results را که در گام قبل ساختید، بکشید و داخل فرم frm_SearchDashboard رها کنید تا به عنوان یک Subform به آن اضافه شود. نام کنترل Subform را (نه خود فرم را) به sub_Results تغییر دهید.

حالا فرم شما باید شبیه یک داشبورد مدیریتی باشد. بخش بالایی برای ورود اطلاعات جستجو و بخش پایینی (Subform) برای نمایش نتایج.

گام سوم: نوشتن کد VBA (جادوی اصلی)

اینجا جایی است که منطق جستجوی پیشرفته پیاده‌سازی می‌شود. ما می‌خواهیم وقتی کاربر روی دکمه btn_Search کلیک می‌کند، اکسس یک عبارت SQL داینامیک بسازد و آن را به عنوان فیلتر (Filter) به Subform ما اعمال کند.

  1. روی دکمه btn_Search کلیک راست کرده و Build Event... را انتخاب کنید.
  2. Code Builder را انتخاب کنید.
  3. در محیط 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 باز کنید.

  1. هیچ متنی وارد نکنید و "جستجو" را بزنید. باید تمام رکوردها (4 رکورد) نمایش داده شوند (چون فیلتر نهایی 1=1 بوده است).
  2. در فیلد FirstName عبارت "رضا" را تایپ کنید و "جستجو" را بزنید. باید رکوردهای "علیرضا" و "رضا" (2 رکورد) نمایش داده شوند.
  3. حالا علاوه بر "رضا" در FirstName، در فیلد City عبارت "تهران" را وارد کنید. "جستجو" را بزنید. فقط رکورد "علیرضا فاضلی" (1 رکورد) باید باقی بماند.
  4. دکمه "پاک کردن فیلتر" را بزنید. باید دوباره تمام رکوردها نمایش داده شوند و TextBox ها خالی شوند.

نتیجه‌ گیری

شما با موفقیت یک فرم جستجوی پیشرفته و داینامیک در اکسس ساختید. این تکنیک، که بر اساس ساخت داینامیک یک عبارت WHERE در VBA و اعمال آن به خاصیت Filter فرم است، ستون فقرات بسیاری از نرم‌افزارهای حرفه‌ای مبتنی بر اکسس می‌باشد.به شما اطمینان می‌دهم که تسلط بر این مهارت، سطح کاربری شما را از یک کاربر عادی به یک توسعه‌دهنده اکسس ارتقا می‌دهد.

شما می‌توانید این کد را گسترش دهید تا فیلدهای بیشتری، مانند جستجو بر اساس تاریخ (Date) یا مقادیر عددی (Number) و یا چک‌باکس‌ها (Yes/No) را نیز پشتیبانی کند.