سؤال

أحاول تشغيل استعلام يأخذ القيم (أحيانًا الجزء الأول فقط من السلسلة) من عنصر تحكم النموذج.المشكلة التي أواجهها هي أنها تُرجع السجلات فقط عند كتابة السلسلة الكاملة.

أي.في مربع اللقب، يجب أن أكون قادرًا على كتابة gr، وسيظهر

رمادي أخضر غراهام

لكنها في الوقت الحاضر لا تعرض أي شيء ما لم يتم استخدام سلسلة البحث الكاملة.

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

الاستعلام هو :

SELECT TabCustomers.*,
       TabCustomers.CustomerForname AS NameSearch,
       TabCustomers.CustomerSurname AS SurnameSearch,
       TabCustomers.CustomerDOB AS DOBSearch,
       TabCustomers.CustomerID AS MemberSearch
FROM TabCustomers
WHERE IIf([Forms]![FrmSearchCustomer]![SearchMember] Is Null
          ,True
          ,[Forms]![FrmSearchCustomer]![SearchMember]=[customerid])=True
      AND IIf([Forms]![FrmSearchCustomer].[SearchFore] Is Null
              ,True
              ,[Forms]![FrmSearchCustomer]![SearchFore] Like [customerforname] & "*")=True
      AND IIf([Forms]![FrmSearchCustomer]![SearchLast] Is Null
              ,True
              ,[Forms]![FrmSearchCustomer]![SearchLast] Like [customersurname] & "*")=True
      AND IIf([Forms]![FrmSearchCustomer]![Searchdate] Is Null
              ,True
              ,[Forms]![FrmSearchCustomer]![Searchdate] Like [customerDOB] & "*")=True;
هل كانت مفيدة؟

المحلول

هناك طريقة الوصول لذلك!

إذا كان لديك عناصر تحكم "عامل التصفية" في النموذج، فلماذا لا تستخدم أسلوب Application.buildCriteria، الذي سيسمح لك بإضافة معايير التصفية الخاصة بك إلى سلسلة، ثم قم بإجراء مرشح من هذه السلسلة، وقم ببناء WHERE الخاص بك شرط على الطاير؟

selectClause = "SELECT TabCustomers.* FROM TabCustomers"
if not isnull(Forms!FrmSearchCustomer!SearchMember) then
    whereClause = whereClause & application.buildCriteria(your field name, your field type, your control value) &  " AND "
endif
if not isnull(Forms!FrmSearchCustomer!SearchFore) then
    whereClause = whereClause & application.buildCriteria(...) &  " AND "
endif
if not isnull(Forms!FrmSearchCustomer!SearchLast) then
    whereClause = whereClause & application.buildCriteria(...) &  " AND "
endif
if not isnull(Forms!FrmSearchCustomer!SearchDate) then
    whereClause = whereClause & application.buildCriteria(...) & " AND "
endif
--get rid of the last "AND"
if len(whereClause) > 0 then
     whereClause = left(whereClause,len(whereClause)-5)
     selectClause = selectClause & " WHERE " & whereClause
endif
-- your SELECT instruction is ready ...

يحرر:ستعود معايير البناء (على سبيل المثال):

  • 'field1 = "GR"' عند كتابة "GR" في عنصر التحكم
  • 'field1 LIKE "GR*"' عندما تكتب "GR*" في السيطرة
  • 'field1 LIKE "GR*" or field1 like "BR*"' إذا كتبت 'LIKE "GR*" OR LIKE "BR*"' في السيطرة

ملاحظة:إذا كانت عناصر التحكم "عامل التصفية" في النموذج الخاص بك تحتوي دائمًا على نفس بناء الجملة (دعنا نقول "search_fieldName"، حيث يتوافق "fieldName" مع الحقل الموجود في مجموعة السجلات الأساسية) وتقع دائمًا في نفس المنطقة (على سبيل المثال، formHeader)، فهي كذلك من الممكن بعد ذلك كتابة دالة تقوم تلقائيًا بإنشاء مرشح للنموذج الحالي.يمكن بعد ذلك تعيين هذا الفلتر كفلتر للنموذج، أو استخدامه لشيء آخر:

For each ctl in myForm.section(acHeader).controls
    if ctl.name like "search_"
        fld = myForm.recordset.fields(mid(ctl.name,8))
        if not isnull(ctl.value) then
           whereClause = whereClause & buildCriteria(fld.name ,fld.type, ctl.value) & " AND "
        endif
    endif
next ctl
if len(whereClause)> 0 then ...

نصائح أخرى

لديك التعبير مثل الخاص بك الى الوراء. لقد إعادة كتابة الاستعلام لإزالة الأوامر معهد التمويل الدولي لا لزوم لها ولإصلاح طلبك من المعاملات للالتشغيل LIKE:

SELECT TabCustomers.*
FROM TabCustomers
WHERE (Forms!FrmSearchCustomer!SearchMember Is Null Or Forms!FrmSearchCustomer!SearchMember=[customerid]) 
And (Forms!FrmSearchCustomer.SearchFore Is Null Or [customerforname] Like Forms!FrmSearchCustomer!SearchFore & "*") 
And (Forms!FrmSearchCustomer!SearchLast Is Null Or [customersurname] Like Forms!FrmSearchCustomer!SearchLast & "*") 
And (Forms!FrmSearchCustomer!Searchdate Is Null Or [customerDOB] Like Forms!FrmSearchCustomer!Searchdate & "*");

ولقد بنيت هذا الاستعلام عن طريق تكرار الظروف الأكثر احتمالا: I إنشاء جدول وهمية مع المجالات المذكورة وشكل مع الحقول ونموذج فرعي مع الاستعلام المذكورة أعلاه يجري تحديثها عندما تم الضغط على زر البحث. أنا يمكن أن توفر وصلة التحميل إلى المثال أنا خلقت إذا كنت ترغب. يعمل المثال كما هو متوقع. J يختار فقط ما يصل كل من جيم وجون، بينما جون أو جو تسحب فقط سجل جون.

واثنين الأمور تسير على - يجب عكس comparisions وأنت لا نقلا عن سلاسل بشكل صحيح

وينبغي أن يكون [حقل قاعدة البيانات] مثل "سلسلة + بطاقة البرية جزئية"

ووتحتاج أن يكون محاطا نقلت كافة السلاسل - لا يدري لماذا الاستعلام الخاص بك لا رمي الأخطاء

وهكذا يجب أن تعمل ما يلي:

,[customerforname] Like  """" & [Forms]![FrmSearchCustomer]![SearchFore] & "*""" )=True

لاحظ "" "" هذا هو السبيل الوحيد لإلحاق احد الاقتباس إلى سلسلة.

وبلدي thoguht الوحيدة هي أن ربما () وهناك حاجة لتجميع مثل

وعلى سبيل المثال قصاصة على الجزء الأول

,[Forms]![FrmSearchCustomer]![SearchFore] Like ([customerforname] & "*"))=True

تم منذ بعض الوقت لقد استعملت الوصول، ولكن هذا هو أول ما يتبادر إلى الذهن

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

SELECT TabCustomers.CustomerForname AS NameSearch, TabCustomers.CustomerSurname AS SurnameSearch, TabCustomers.CustomerDOB AS DOBSearch, TabCustomers.customerid AS MemberSearch
FROM TabCustomers
WHERE TabCustomers.customerid Like IIf([Forms]![FrmSearchCustomer].[Searchmember] Is Null,"*",[Forms]![FrmSearchCustomer]![Searchmember])
AND Trim(TabCustomers.CustomerForname & "") Like IIf([Forms]![FrmSearchCustomer].[SearchFore] Is Null,"*",[Forms]![FrmSearchCustomer]![SearchFore] & "*")
AND Trim(TabCustomers.CustomerSurname & "") like IIf([Forms]![FrmSearchCustomer].[Searchlast] Is Null,"*",[Forms]![FrmSearchCustomer]![SearchLast] & "*")
AND (TabCustomers.CustomerDOB Like IIf([Forms]![FrmSearchCustomer].[SearchDate] Is Null,"*",[Forms]![FrmSearchCustomer]![SearchDate] ) Or TabCustomers.CustomerDOB Is Null)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top