سؤال

أنا أركيز الوصول إلى 2003. أنا أستخدم التبديل لتحديد تاريخ الحقول بناء على معيار منطقي:

Switch(<criterion>, Date1, 1, Date2)

IE، إذا كان "المعيار" صحيحا، ثم إرجاع date1، وإلا عاد Date2.

Date1 و Date2 هي أعمدة من نوع التاريخ / الوقت في جدول.

المشكلة هي، تبديل إرجاعهم كنص - وليس التاريخ / الوقت!

هل هناك طريقة لإجبارهم على التاريخ؟ حاولت

Switch(<criterion>, #Date1#, 1, #Date2#)

و

Switch(<criterion>, Val(Date1), 1, Val(Date2))

كلاهما يفشل مع رسالة خطأ واحدة أو آخر.

أيه أفكار؟

هل كانت مفيدة؟

المحلول

أعتقد أن وظيفة [IIF ()] هي مباراة أفضل لما تحاول القيام به:

IIf(<criterion>, Date1, Date2)

ولكن لا ينبغي أن تكسر وظيفة التبديل () لأنواع البيانات، ولا تتعارض مع أنواع بيانات التاريخ / الوقت. النظر في هذه الوظيفة:

Public Function trySwitch(ByVal pWhichDay As String) As Variant
    Dim varOut As Variant
    varOut = Switch(pWhichDay = "yesterday", Date - 1, _
        pWhichDay = "today", Date, _
        pWhichDay = "tomorrow", Date + 1)
    trySwitch = varOut
End Function

Tryswitch ("اليوم") عائدات 10/6/2009 و TypeName (Tristwitch ("اليوم")) عائدات تاريخ

نصائح أخرى

هناك شيء غريب مع مثالك.

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

يبدو أنك تعالج 1 كصحيح، لأنه لأنه ليس يتأمر، لكن كنت أفضل حالا مع:

  Switch(<criterion>, Date1, True, Date2)

ولكن هذا مجرد نسخ متماثل لوظيفة الفورية إذا كانت الوظيفة، IIF ()، و IIF () حجج أقل.

ولكن لديها نفس المشكلة، في ذلك بإرجاع البديل. ولكن يجب أن تكون قادرا على إكراه أنه لنوع البيانات الذي يمكن تنسيقه كتاريخ.

ولكن ما إذا كان هذا البديل سيكون بالإكراه ضمنيا أم لا تحتاج إلى القيام بذلك بشكل صريح، يعتمد على المكان الذي تستخدمه فيه. في نتيجة استعلام، يمكنك فرز الإخراج من IIF ([المعيار]، Date1، Date2) كأحدث، لأن العمود يحصل على إكراه حتى الآن.

إذا كان عليك القيام بالإكراه صراحة، فستكون CDATE () وظيفة الاستخدام - كنت قد تفتت الوظيفة الخارجية التي تنتج إخراج متغير مع وظيفة CDATE () من أجل أن تكون متأكدا من إكراه الناتج بشكل صريح حتى الآن يكتب:

  CDate(IIf(<criterion>, Date1, Date2))

ولكن قد أكون في عداد المفقودين في شيء مهم هنا، كما يبدو أنني أطفأ على مسار مختلف تماما ...

يمكنك نشر بعض الكود والبيانات لإعادة إنتاج المشكلة، من فضلك؟ لأن هذا هو SWITCH() في رمز SQL، أعتقد أن SQL DDL (CREATE TABLE إلخ) و DML (INSERT INTO لإضافة بيانات) سيكون الأنسب :)

Purny Point: قاعدة بيانات Access SQL لا تحتوي على نوع بيانات "Boolean". لديها أ YESNO نوع البيانات الذي يمكن أن يكون NULL القيمة؛ منطق ثلاثي القيمة ليس منطما.

إليك بعض SQL DML (وضع الاستعلام ANSI-92 بناء جملة) لإظهار كيف يعمل كما هو متوقع بالنسبة لي:

SELECT TYPENAME
       (
          SWITCH
          (
             NULL, #2009-01-01 00:00:00#, 
             FALSE, #2009-06-15 12:00:00#, 
             TRUE, #2009-12-31 23:59:59#
          )
       );

تغيير أي من قيم "المعيار" والقيمة دائما عاد ك "تاريخ" أي من النوع DATETIME.


تحديث:

الذي - التي TYPENAME وظيفة هي أداة رائعة ... يبدو أن الوصول لتفسير "العمود" بأكمله من النتائج بشكل مختلف

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

SELECT #2009-01-01 00:00:00# AS row_value, 
       TYPENAME(#2009-01-01 00:00:00#) AS row_type
  FROM Customers
UNION ALL
SELECT 0.5, 
       TYPENAME(0.5) AS row_type
  FROM Customers

إرجاع "التاريخ" و "العشرية" على التوالي ولكن ماذا سيكون العمود؟ على ما يبدو، الجواب هو:

SELECT DT1.row_value, TYPENAME(DT1.row_value) AS column_type
  FROM (
        SELECT DISTINCT #2009-01-01 00:00:00# AS row_value 
          FROM Customers
        UNION ALL
        SELECT DISTINCT 0.5
          FROM Customers
       ) AS DT1;

'سلسلة'؟!

... أي بالطبع ليس حتى نوع بيانات محرك قاعدة بيانات الوصول إلى قاعدة بيانات الوصول. لذا TYPENAME(), ، منزعج، يستخدم اسم نوع VBA الأفضل. علي سبيل المثال:

SELECT TYPENAME(CBOOL(0));

إرجاع "المنطقي" على الرغم من ذلك، كما تمت مناقشته أعلاه، لا يوجد نوع بيانات منطقية في محرك قاعدة بيانات Access SQL. و

SELECT TYPENAME(my_binary_col)

إرجاع "سلسلة". ملاحظة ينطبق حديثة رسم خرائط VBA على CAST وظائف (إزعاج آخر) على سبيل المثال لا يوجد " BINARY"وظيفة و CDEC() وظيفة لا تزال مكسورة منذ Jet 4.0 :(

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top