اذهب الي المحتوي
أوفيسنا

الردود الموصى بها

قام بنشر

السلام عليكم

انا استخدم هذا السطر لاستخراج كلمة الصباح ... ومثله للمساء من التاريخ الكامل

مراعيا تنسيقات المستخدم للتاريخ ان كان عربي او غيره

IIf(Mid([chekin];20;1)="م" Or Mid([chekin];20;2)="PM";"المساء";IIf(Mid([chekin];20;1)="ص" Or Mid([chekin];20;2)="AM";"الصباح";""))

ولكن احيانا يختلف عدد حروف التاريخ  بناء على الساعات اليومية

هل من طريقة احكم واضبط  استخدمها في الاستعلام ؟

اعني هل هناك دالة تتعرف على الوقت هل هو صباح ام مساء  بمجرد تمرير التاريخ اليها ؟

  • تمت الإجابة
قام بنشر

وعليكم السلام

طبعا ممكن من خلال الكود التالى 

 

Public Function GetTimePeriod(ByVal varDateTime As Variant) As String
    On Error GoTo ErrHandler

    If IsNull(varDateTime) Or varDateTime = "" Then
        GetTimePeriod = ""
        Exit Function
    End If

    Dim dtmTime As Date
    dtmTime = CDate(varDateTime)

    Dim lngHour As Long
    lngHour = Hour(dtmTime)

    If lngHour < 12 Then
        GetTimePeriod = "الصباح"
    Else
        GetTimePeriod = "المساء"
    End If

    Exit Function
ErrHandler:
    GetTimePeriod = ""
End Function

وللاستدعاء

GetTimePeriod([CheckIn])

 

  • Thanks 1
قام بنشر

لا نحن فى المساء :biggrin:

والكود يعمل عندى بنجاح
 

الدالة التي تعتمد على Hour() ترجع عددا صحيحا من 0 إلى 23

لذلك Hour(11:59) = 11   >>-->  الصباح
و Hour(12:00) = 12        >>-->  المساء

 

وللتجربة

Public Sub Test_GetTimePeriod()
    Dim arrTimes As Variant
    Dim i As Long
    Dim dtmSample As Date
    Dim strResult As String
    
    arrTimes = Array( _
        "00:00", _
        "05:30", _
        "11:59", _
        "12:00", _
        "12:05 AM", _
        "12:05 PM", _
        "12:01", _
        "13:45", _
        "17:00", _
        "23:59" _
    )
    
    Debug.Print "-----------------------------"
    Debug.Print "الوقت" & vbTab & ">>->" & vbTab & "الفترة"
    Debug.Print "-----------------------------"
    
    For i = LBound(arrTimes) To UBound(arrTimes)
        dtmSample = TimeValue(arrTimes(i))
        strResult = GetTimePeriod(dtmSample)
        Debug.Print Format(dtmSample, "hh:nn AM/PM") & vbTab & " >>-> " & vbTab & strResult
    Next i
End Sub

 

قام بنشر
21 دقائق مضت, ابوخليل said:

انا استخدم هذا السطر لاستخراج كلمة الصباح ... ومثله للمساء من التاريخ الكامل

جرب هذه الدالة

IIf(Hour([chekin]) < 12, "الصباح", "المساء")

لم اجربها ...

  • Like 1
  • Thanks 1
قام بنشر

تمام  باشمهندس .. جربتها الآن تعمل 100%

الف شكر .. على الخدمات السريعة

ما بين نشري للسؤال وحصولي على الاجابة 5 دقائق فقط :gift2:

دمت ذخرا لإخوانك ولمرتادي هذا المنتدى .. وكتب لك الأجر

  • Thanks 1
قام بنشر
4 دقائق مضت, ناقل said:

جرب هذه الدالة

IIf(Hour([chekin]) < 12, "الصباح", "المساء")

لم اجربها ...

كلام حضرتك صح جدا جدا
انا فقط افضل الكود فى وحدة نمطية لاستخدامه فى اى مكان :wink2:

وتوفيرا للعناء 

  • Like 1
قام بنشر
2 دقائق مضت, ابو جودي said:

كلام حضرتك صح جدا جدا
انا فقط افضل الكود فى وحدة نمطية لاستخدامه فى اى مكان :wink2:

وتوفيرا للعناء

ممكن كده

Public Function GetPeriod(dt As Date) As String
    If Hour(dt) < 12 Then
        GetPeriod = "الصباح"
    Else
        GetPeriod = "المساء"
    End If
End Function

 

  • Like 1
قام بنشر
5 دقائق مضت, ناقل said:

جرب هذه الدالة

IIf(Hour([chekin]) < 12, "الصباح", "المساء")

لم اجربها ...

جزيت خيرا اخي ناقل .. السطر يتحدث عن نفسه .. سوف اجربه

انا حريص على عدم وجود ثغرات .. خاصة وان التاريخ عرضة للتغير بسبب تنسيقات وندوز ... عربي /انجليزي /ونظام 12 و 24

لذا اعتقد ان كلمة السر في كود ابي جودي هي هذا السطر :

dtmTime = CDate(varDateTime)

 

  • Like 2
قام بنشر

طيب ايه الفرق بين

Public Function GetTimePeriod(ByVal varDateTime As Variant) As String

Public Function GetPeriod(dt As Date) As String

GetTimePeriod أكثر أمانا ومرونة لان

  • الوسيط Variant بعكس الوسيط Date صارم
  • التحقق من Null أو ""
  • التحويل إلى تاريخ باستخدام CDate
  • يدعم Null / نصوص صالحة للتحويل
  • مناسب للاستخدام من النماذج / الحقول مباشرة
قام بنشر
18 دقائق مضت, ابوخليل said:

انا حريص على عدم وجود ثغرات .. خاصة وان التاريخ عرضة للتغير بسبب تنسيقات وندوز ... عربي /انجليزي /ونظام 12 و 24

 

بالنسبة للدالة Hour بهذا الشكل

IIf(Hour([chekin]) < 12, "الصباح", "المساء")

هذا السطر لا يتأثر بالتنسيق الإقليمي للنظام طالما أن الحقل [chekin] يحتوي فعليا على قيمة من النوع Date/Time
 

لماذا لا يتأثر؟

  • الدالة Hour(...) تعتمد على القيمة الداخلية للوقت المخزن في Access وليس على الشكل المعروض
  • Access يخزن التاريخ/الوقت كقيمة رقمية مزدوجة (Double) الجزء الصحيح للتاريخ والجزء الكسري للوقت
  • نظام العرض (12/24 ساعة – AM/PM) يخص شكل العرض فقط بينما الدالة Hour() دائما ترجع رقم بين 0 و23 بغض النظر عن التنسيق

ولكن ماذا لو كان نوع البيانات للحقل نص وليس تاريخ
لابد من الاستخدام بالشكل التالى 

IIf(IsDate([chekin]) And Hour(CDate([chekin])) < 12, "الصباح", "المساء")
قام بنشر

بارك الله فيكم

نعم الحقل نصي تاريخ ام القرى كامل 

لذا ذهبت الى عد الحروف .. ولظهور بعض الأخطاء طرحت سؤالي هنا .

وتحويل النص الى تاريخ فكرة جيدة . وكنت اتحاشاها لوجود تعارض بين الهجري  والميلادي في يوم او يومين من كل سنة

ولهذا اشرت الى  CDate(varDateTime)

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information