كيف يمكنني جعل MS Access الاستعلام عن المعلمات اختياري؟

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

0
وأضاف تحرير
الآراء: 3

6 إجابة

لست متأكدًا من أن هذا يساعد ، لأنني أظن أنك تريد القيام بذلك باستخدام استعلام محفوظ بدلاً من VBA؛ ومع ذلك ، فإن أسهل شيء يمكنك القيام به هو إنشاء سطر الاستعلام حسب السطر في VBA ، ثم إنشاء مجموعة سجلات منه.

قد تكون الطريقة المحتومة تمامًا هي إعادة كتابة الاستعلام المحفوظ على الطاير ثم الوصول إليه ؛ ومع ذلك ، إذا كان لديك عدة أشخاص يستخدمون نفس قاعدة البيانات التي قد تصادفك في تعارضات ، فسوف تربك المطور التالي أسفل الخط.

يمكنك أيضًا برمجة القيمة الافتراضية للاستعلام (كما تمت مناقشته في السؤال السابق)

0
وأضاف

العودة إلى بلدي exampe السابقة في سؤالك السابق. طلب البحث ذو المعلمة عبارة عن سلسلة تبدو كالتالي:

qr = "Select Tbl_Country.* From Tbl_Country WHERE id_Country = [fid_country]"

اعتمادًا على طبيعة fid_Country (العدد ، النص ، الدليل ، التاريخ ، إلخ) ، سيكون عليك استبدالها بقيمة مهرجية وأحرف تعيينات محددة:

qr = replace(qr,"[fid_country]","""*""")

للسماح للبطاقات البرية بشكل كامل ، يمكن أن يكون الاستعلام الأصلي أيضًا:

qr = "Select Tbl_Country.* From Tbl_Country _
      WHERE id_Country LIKE [fid_country]"

يمكنك بعد ذلك الحصول على قيم البطاقات البرية لـ fid_Country مثل

qr = replace(qr,"[fid_country]","G*")

بمجرد الانتهاء من ذلك ، يمكنك استخدام السلسلة لفتح مجموعة سجلات

set rs = currentDb.openRecordset(qr)
0
وأضاف

إذا قمت بإنشاء استعلامك مثل:

PARAMETERS ParamA Text ( 255 );
SELECT t.id, t.topic_id
FROM SomeTable t
WHERE t.id Like IIf(IsNull([ParamA]),"*",[ParamA])

سيتم تحديد جميع السجلات إذا لم يتم ملء المعلمة.

0
وأضاف
هل سيتم العمل نفسه لمجموعة اختيارية؟
وأضاف المؤلف Chad, مصدر
Chad لست متأكدًا مما تعنيه ، ربما PARAMETERS ParamA Text (255)؛ SELECT IIf (IsNull ([ParamA])، "*"، [ParamA]) AS Expr1، t.id FROM table1 AS t GROUP BY IIf (IsNull ([ParamA])، "*"، [ParamA])، t. id HAVING (((t.id) Like IIf (IsNull ([ParamA])، "*"، [ParamA])))؛
وأضاف المؤلف Fionnuala, مصدر

أنا لا أعتقد أنك تستطيع. كيف تقوم بتشغيل الاستعلام؟

أود أن أقول إذا كنت بحاجة إلى استعلام يحتوي على العديد من المتغيرات المفتوحة ، أو وضعها في وحدة نمطية أو فئة vba ، ثم يطلق عليها ، مما يسمح لها ببناء السلسلة في كل مرة.

0
وأضاف

حسنًا ، يمكنك إرجاع القيم غير الفارغة من خلال تمرير * كمعلمة للحقول التي لا ترغب في استخدامها في الفلتر الحالي. في Access 2003 (وربما الإصدارات السابقة والإصدارات الأحدث) ، إذا كنت تستخدم مثل [paramName] كمعيار لك في حقل رقمي أو نص أو تاريخ أو منطقي ، فستعرض علامة النجمة جميع السجلات ( تطابق المعايير الأخرى التي تحددها). إذا كنت ترغب في إرجاع القيم الخالية أيضًا ، فيمكنك استخدام مثل [paramName] أو Is Null كمعيار بحيث تقوم بإرجاع كافة السجلات. (يعمل هذا بشكل أفضل إذا كنت تقوم ببناء الاستعلام في التعليمات البرمجية. إذا كنت تستخدم استعلامًا موجودًا ، ولا تريد إرجاع قيم فارغة عندما يكون لديك قيمة للتصفية ، فلن يعمل ذلك.)

إذا كنت تقوم بتصفية حقل "مذكرة" ، فسيتعين عليك تجربة طريقة أخرى.

0
وأضاف

ملاحظة * أحرف البدل مع الكلمة الأساسية LIKE لن يكون لها سوى التأثير المطلوب في وضع استعلام ANSI-89.

يفترض العديد من الأشخاص عن طريق الخطأ أن حرف البدل في Access/Jet دائمًا *. ليس كذلك. يحتوي Jet جهازي حرف بدل:٪ في وضع الاستعلام ANSI-92 و * في وضع استعلام ANSI-89.

يكون ADO دائماً ANSI-92 و DAO هو دائماً ANSI-89 ولكن يمكن أن تكون واجهة Access إما.

عند استخدام الكلمة LIKE في كائن قاعدة بيانات (أي شيء سوف يستمر في ملف mdb) ، يجب عليك التفكير في نفسك: ماذا سيحدث إذا استخدم شخص ما قاعدة البيانات هذه باستخدام "وضع الاستعلام" غير الذي أستخدمه عادةً؟ لنفترض أنك تريد تقييد حقل نصي إلى أحرف رقمية فقط وأنك قد كتبت قاعدة التحقق من الصحة كما يلي:

NOT LIKE "*[!0-9]*"

إذا قام شخص ما عن غير قصد (أو بخلاف ذلك) بالاتصال بـ .mdb عبر ADO ، فإن قاعدة التحقق أعلاه تسمح له بإضافة بيانات بأحرف غير رقمية وسيتم تصوير سلامة البيانات الخاصة بك. غير جيد.

أفضل IMO لتدوين دوماً من أجل كلا أنماط الاستعلام ANSI. ربما يتم تحقيق هذا أفضل من خلال ترميز واضح لكل من الأنماط على سبيل المثال.

NOT LIKE "*[!0-9]*" AND NOT LIKE "%[!0-9]%"

ولكن مع المزيد من المشاركة في Jet SQL DML/DDL ، قد يصبح من الصعب جدًا تحقيق ذلك بإيجاز. هذا هو السبب في أنني أوصي باستخدام الكلمة الرئيسية ALIKE ، التي تستخدم حرف البدل ANSI-92 Query Mode بغض النظر عن وضع Query Mode ، على سبيل المثال.

NOT ALIKE "%[!0-9]%"

ملاحظة: ALIKE غير موثقة (وأفترض أن هذا هو السبب في أن رسالتي الأصلية قد تم وضع علامة عليها لأسفل). لقد قمت باختبار هذا في Jet 3.51 (Access97) ، Jet 4.0 (Access2000 إلى 2003) و ACE (Access2007) وهو يعمل بشكل جيد. لقد قمت مسبقاً بنشر هذا في مجموعات الأخبار وتمت الموافقة من Access MVPs. عادة ما أتحرك من السمات غير الموثقة بنفسي ، لكن استثني في هذه الحالة لأن Jet قد تم إهمالها منذ ما يقرب من عقد من الزمان ، ولا يبدو أن فريق Access الذي يبقيه على قيد الحياة مهتمًا بإجراء تغييرات عميقة على المحركات (أو إصلاح الأخطاء)! ) ، مما يجعل تأثير المحرك النفاث منتجًا مستقرًا جدًا.

لمزيد من التفاصيل حول أوضاع استعلام ANSI لـ Jet ، راجع حول وضع استعلام SQL ANSI .

0
وأضاف
في الواقع ، سيعتمد حرف البدل أيضًا على واجهة البيانات التي تستخدمها. في SQL تنفيذ عبر ADO مقابل SQL Server ، يمكنك استخدام "٪" بدلاً من Jet SQL "*" ، على سبيل المثال.
وأضاف المؤلف David-W-Fenton, مصدر
في الواقع ، Jet لهما wildcards: "٪" في وضع الاستعلام ANSI-92 و "*" في وضع استعلام ANSI-89. يكون ADO دائماً ANSI-92 ، DAO هو دائماً ANSI-89 ويمكن أن تكون واجهة Access إما. قد لا تكون على علم بهذا لأنك دائمًا تستخدم DAO.
وأضاف المؤلف onedaywhen, مصدر
رابطAir الآن ثابت.
وأضاف المؤلف onedaywhen, مصدر
شكر. كنت أحصل على وقت darndest للعثور على عنوان URL حالي يبدو أنه يحتوي على المحتوى الموضح - ولكن ربما لا يوجد واحد. لا يمكن العثور على معلومات كثيرة حول مدى هذه المشكلة في 2010 والإصدارات الأحدث من Access أيضًا.
وأضاف المؤلف Air, مصدر