اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

مشاكل التاريخ مع البحث والمقارنات


Hawiii

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

بمجرد أن يكون اليوم أكبر من أو يساوي 12 غالبا تنتهي مشاكل التاريخ بسبب الخلط بين اليوم والشهر متأثرا بتنسيق نظام التشغيل.
ولكن إذا قل اليوم عن 12 وهو القيمة الكبرى للشهور تبدأ أحيانا مشاكل الخلط وبالتالي اختلاف قيمة التاريخ وخصوصا إذا كتب التاريخ على شكل نص وحصره بعلامتي الرقم #.

طريقتي في الاحتراز:
تحويل التاريخ إلى رقم باستخدام أربع دوال كالتالي:
- إذا كان التاريخ بدون وقت يمكن استخدام دالة CLng.
- إذا كان التاريخ يحتوي على وقت ينصح باستخدام دالة CDbl.
- إذا كان التاريخ على شكل نص مثل #10/04/2020# وهذا أخطرها ينصح باستخدام دالة DateSerial ليصبح DateSerial(2020, 4, 10).
- وإذا كان على شكل نص ويحتوي على وقت مثل #10/4/2020 11:43:30 PM# ينصح بإضافة دالة TimeSerial ليصبح DateSerial(2020, 4, 10) + TimeSerial(23, 43, 30).

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

هذا اجتهادي وقد أكون صائبا وقد أكون مخطئا.

  • Like 6
رابط هذا التعليق
شارك

لم أتعود على كتابة الأمثلة وهذه مقدرتي ، من يمتلك هذه الملكة فليقوم بالاختبارات وعمل أمثلة أكثر وضوحا.

من أهم ما أشدد على الالتزام به هو أن تستخدم دالة تحويل التاريخ إلى رقم لجهتي المقارنة أي حقل الجدول و قيمة البحث.

Sub Test4()
    Dim TestDate As Date
    Dim SearchText As String
  
    '-----------------------------------------------------------
    'المعتاد
    SearchText = "Birthdate=" & #10/4/2020#
  
    'الاحترازي
    TestDate = DateSerial(2020, 4, 10)
    SearchText = "CLng(Birthdate)=" & CLng(TestDate)
    '--------------------------------------------------------
    'المعتاد
    SearchText = "Birthdate=" & #10/4/2020 11:43:30 PM#
  
    'الاحترازي
    TestDate = DateSerial(2020, 4, 10) + TimeSerial(23, 43, 30)
    SearchText = "CDbl(Birthdate)=" & CDbl(TestDate)
End Sub





Sub Test5()
    Dim SearchText As String
  
    SearchText = #10/4/2020#
    Debug.Print CDate(SearchText)        'الناتج 04/10/2020
    Debug.Print DateSerial(2020, 4, 10)  'الناتج 10/04/2020
    '--------------------------------------------------------
  
    SearchText = #4/13/2020#             'كتبتها 13/4/2020 وحولها المحرر 4/13/2020
    Debug.Print CDate(SearchText)        'الناتج 13/04/2020
    Debug.Print DateSerial(2020, 4, 13)  'الناتج 13/04/2020
End Sub

 

تم تعديل بواسطه Hawiii
  • Like 5
رابط هذا التعليق
شارك

23 ساعات مضت, Hawiii said:

إذا كان التاريخ بدون وقت يمكن استخدام دالة CLng

 

21 ساعات مضت, Hawiii said:

من أهم ما أشدد على الالتزام به هو أن تستخدم دالة تحويل التاريخ إلى رقم لجهتي المقارنة أي حقل الجدول و قيمة البحث

لفتت نظري هذه الطريقة واردت التأكد من فاعليتها

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

وكانت النتيجة ممتازة

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

لذك قمت بنقل المثال على الشبكة وقمت بتغيير صيغة التاريخ في الاجهزة المتصلة

وكانت النتيجة ايضا ممتازة في المقارنة وفي البحث وفي معايير دوال التجميع

مع ذلك الطريقة التي استخدمها

Format([da_te];"\#mm\/dd\/yyyy\#")

تعطي نفس النتيجة

وكذلك الوحدة الخاصة بالاستاذ @jjafferr

تعطي نفس النتيجة وتمتاز من وجهه نظري بالسهولة

DateFormat([d_date])

في الحقيقة من اجمل المواضيع التي شدت انتباهي

 

  • Like 3
رابط هذا التعليق
شارك

1 ساعه مضت, kha9009lid said:

مع ذلك الطريقة التي استخدمها


Format([da_te];"\#mm\/dd\/yyyy\#")

تعطي نفس النتيجة

وكذلك الوحدة الخاصة بالاستاذ @jjafferr

تعطي نفس النتيجة وتمتاز من وجهه نظري بالسهولة


DateFormat([d_date])

في الحقيقة من اجمل المواضيع التي شدت انتباهي

شكرا لجهودك وبارك الله فيك ، لو تشرح لنا طريقة التنسيق في الطريقة التي تستخدمها.
ولو تضعون لنا كود دالة DateFormat أكون لكم من الشاكرين.
حمستني وسأقوم باختباراتي أنا أيضا.

تم تعديل بواسطه Hawiii
رابط هذا التعليق
شارك

2 دقائق مضت, Hawiii said:

ووالدين أستاذنا جعفر

اللهم آمين

2 ساعات مضت, jjafferr said:

رحم الله والديك ، كفيت ووفيت 🙂

في الواقع في منها امثلة جديدة علي 🙂

جعفر

اللهم امين

جزاكم الله خيرا اخوانى واساتذتى

اتفضل اخى هاوى الرابط اللذى اشار اليه اخى واستاذى خالد @kha9009lid

جزاكم الله خيرا :fff:

  • Like 1
رابط هذا التعليق
شارك

أعتذر لتمريري معلومة خاطئة لكم وهي تأثير تنسيق تاريخ البحث المحصور بين علامتي # بالاعدادات الإقليمية لنظام التشغيل
والصحيح أنه لا يتأثر وتنسيقه ثابتا دائما ولكن على خلاف ما اعتدنا عليه في كتابة التاريخ فكتابته لابد أن تكون mm/dd/yyyy أي نبدأ بالشهر ثم اليوم ثم السنة ابتداء من اليسار.
ومع ذلك حتى لو اعتدنا على استخدامه بالشكل الصحيح فأنا لازلت على نصيحتي فهي أكثر اطمئنانا.

اقرأوا أكثر:
Excel VBA Dates & Time, Format Function, User Defined Date, Number & String Formats

تم تعديل بواسطه Hawiii
رابط هذا التعليق
شارك

7 ساعات مضت, Hawiii said:

أعتذر لتمريري معلومة خاطئة لكم وهي تأثير تنسيق تاريخ البحث المحصور بين علامتي # بالاعدادات الإقليمية لنظام التشغيل
والصحيح أنه لا يتأثر وتنسيقه ثابتا دائما ولكن على خلاف ما اعتدنا عليه في كتابة التاريخ فكتابته لابد أن تكون mm/dd/yyyy أي نبدأ بالشهر ثم اليوم ثم السنة ابتداء من اليسار.
ومع ذلك حتى لو اعتدنا على استخدامه بالشكل الصحيح فأنا لازلت على نصيحتي فهي أكثر اطمئنانا.

اقرأوا أكثر:
Excel VBA Dates & Time, Format Function, User Defined Date, Number & String Formats

ولا يهمك اخى هاوى وجزاك الله خيرا على مثابرتك فى توصيل المعلومه الصحيحه وافاده اخوانك بارك الله فيك وجزاك الله كل خير

سوف احاول قدر المستطاع ترجمته وفهمه :wallbash:

وان استطاع احد اخواننا واساتذتنا ان يبسطه لنا بشرح عربى فجزاه الله عنا كل خير

:fff::signthankspin:

رابط هذا التعليق
شارك

8 ساعات مضت, Hawiii said:

والصحيح أنه لا يتأثر وتنسيقه ثابتا دائما ولكن على خلاف ما اعتدنا عليه في كتابة التاريخ فكتابته لابد أن تكون mm/dd/yyyy

وهذا يأخذنا الى السؤال الازلي:

ايهم جاء قبل ، البيضة او الدجاجة 🙂

 

فبما ان نظام الكمبيوتر سمح لنا نستعمل تنسيق محلي بصيغة dd/mm/yyyy  ، والكود كذلك ،

فبديهي ان يستعمل المبرمج هذه الصيغة في برمجته (وخصوصا ان الكود يسمح له) ، وهنا تأتي مشكلة عدم تطابق البيانات مع الكود ، بين كمبيوتر المبرمج وكمبيوتر المستخدم ، والامثلة في المنتدى كثيرة !!

 

وللتخلص من جميع هذه الاشكالات ، لا يكفي ان تستعمل امر مثل CDate ، فسيحوله حسب تاريخ النظام ،

لهذا السبب ، وكما ذكرت في هذا الموضوع ، فيجب استخدام اوامر التاريخ التي لها علاقة مباشرة باليوم والشهر والسنه مثل DateAdd او DateDiiff او DatePart او DateSerial :

.

وشكرا اخوي خالد انك اقتصرت قائمة الاوامر في مشاركتك اعلاه 🙂

 

جعفر

  • Like 1
رابط هذا التعليق
شارك

يا هلا باساتذتنا الفضلاء @jjafferr و @أحمد الفلاحجى و @Hawiii

2 ساعات مضت, jjafferr said:

وهذا يأخذنا الى السؤال الازلي:

ايهم جاء قبل ، البيضة او الدجاجة

لما قريت الجملة السابقة حسيت بالجوع ضغط العمل اضاع علينا الغداء والاجر عند الله سبحانه

ما قصدته في ردي ان كل الطرق تؤدي الى روما ولكني لا احب الامثلة الاجنبية

لذا اقول كما قال الشاعر علي بن سودون اليشبغاوي

كأنّنا والماءُ مِن حَولِنا -- قَومٌ جُلوسٌ حَولهم ماءُ
الأرضُ أرضٌ والسَّماءُ سماءٌ -- والماءُ ماءٌ و الهَواءُ هواءُ
كُلُّ الرجالِ على العُمومِ مُذَكَّرٌ -- أما النِساءُ فُكُلّهن نِساءُ
الميمُ غَيرُ الجيمِ جاءَ مُصَحَفّا -- وإذا كَتَبتَ الحاءَ فهي الحاءُ

تحياتي وتقديري لكم اساتذتنا الاكارم :fff:

  • Like 1
  • Haha 1
رابط هذا التعليق
شارك

منذ ساعه, kha9009lid said:

يا هلا باساتذتنا الفضلاء @jjafferr و @أحمد الفلاحجى و @Hawiii

لما قريت الجملة السابقة حسيت بالجوع ضغط العمل اضاع علينا الغداء والاجر عند الله سبحانه

ما قصدته في ردي ان كل الطرق تؤدي الى روما ولكني لا احب الامثلة الاجنبية

لذا اقول كما قال الشاعر علي بن سودون اليشبغاوي

كأنّنا والماءُ مِن حَولِنا -- قَومٌ جُلوسٌ حَولهم ماءُ
الأرضُ أرضٌ والسَّماءُ سماءٌ -- والماءُ ماءٌ و الهَواءُ هواءُ
كُلُّ الرجالِ على العُمومِ مُذَكَّرٌ -- أما النِساءُ فُكُلّهن نِساءُ
الميمُ غَيرُ الجيمِ جاءَ مُصَحَفّا -- وإذا كَتَبتَ الحاءَ فهي الحاءُ

تحياتي وتقديري لكم اساتذتنا الاكارم :fff:

تعالى اتفضل وهتدبحلك عدس ههههههههههههههه حبيبى ربنا يوفقكم ويجازيكم كل خير

  • Haha 1
رابط هذا التعليق
شارك

47 دقائق مضت, أحمد الفلاحجى said:

تعالى اتفضل وهتدبحلك عدس ههههههههههههههه

ياهلا @أحمد الفلاحجى

عندكم مثل جميل " بصلة المحب خروف "

نعود للموضوع

كافة الحلول جميلة وجميعا تعطي النتيجة ذاتها

وكل مخير لاستخدام الطريقة التي يجدها انسب له

مثلا يبعد منزلي عن مقر عملي 23 كم اذا استخدمت الطريق الاقرب

مع ذلك احب ان استخدم طريق اخر يزيد المسافة الى 29.3 كم لكوني اعتدت على استخدامه

تحويل التاريخ الى رقم فكره جميله وتستحق الاشادة

هل ساستخدمها

الاجابة انا افضل ان اقطع مسافة 29.3 كم للوصول للعمل

تحياتي وتقديري

  • Haha 1
رابط هذا التعليق
شارك

حتى لا يتوه القارئ

-        المشكلة لم تنتهي بعد تأكدنا عدم تأثير الاعدادات الإقليمية على تنسيق  "التاريخ" المكتوب على شكل نص والمحصور بين علامتي الرقم # مثل #4/6/2020#.

-        المشكلة محصورة في الأحد عشر يوما الأولى من كل شهر.

-        المشكلة يقع فيها كل من المبرمج والمستخدم.

-        دالة DateFormat لا تحل المشكلة هي فقط تنسيق قيمة "التاريخ" سواء كانت صحيحة أو خاطئة بالشكل الصحيح لكتابته لاستخدامه في البحث والمقارنة فـ garbage in garbage out.

-        حل المشكلة عند المبرمج أن يكون فاهم "تنسيق التاريخ" المكتوب أو يحترز باستخدام دالة DateSerial فهذه ستحميه من أخطاء الكتابة.

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

-        تبقى دالة  Format مهمة في مخرجات نصية للتاريخ حسب الرغبة.

-        وتبقى الإعدادات الإقليمية مهمة في مخرجات نصية بتنسيق موحد للتاريخ حسب الضبط المسبق.

-        على القارئ أن لا يخلط بين تنسيق التاريخ والتنسيق النصي كالتالي:

#4/6/2020# هذا تنسيق تاريخ أي نوعه تاريخ وليس نص ولا يحتاج إلى تحويل من نص إلى تاريخ وهذا يمثل 6 أبريل 2020م.

"06/04/2020" هذا تنسيق نصي أي نوعه نص ولو أردنا قيمته كتاريخ يحتاج إلى تحويل وسوف يتأثر بالإعدادات الإقليمية عند تحويله وقد يمثل 6 أبريل أو 4 يونيو 2020م.

رابط هذا التعليق
شارك

السلام عليكم 🙂

 

مسألة Garbage in, garbage out (اذا تم ادخال بيانات خطأ، فالنتائج تكون خطأ) تنطبق على كل جزئية من بيانات قاعدة البيانات ، وليس التاريخ فحسب ،

رجاء انظر في الرابط اللي وضعته انا في مشاركتي اعلاه :

 

وستلاحظ فيه ان المستخدم اخطأ في ادخال تاريخ اليوم ، فسنة 2001 سنة كبيسة ولا يوجد فيها 29 يوم :

في ٣١‏/٣‏/٢٠٢٠ at 16:19, jjafferr said:

هذه نتائج الجدول :

image.png.abe99726ba25ff361181176956f70bb3.png

نلاحظ ان التواريخ جميعها صحيحه ، ولكن المستخدم اخطأ في ادخال التاريخ 29/2/01 ، لأن سنة 2001 ليست سنة كبيسة ، فقام الاكسس بتصحيح التاريخ لهذا اليوم ظنا منه انك اخطأت في المعادلة :


[d] & "/" & [m] & "/" & [y]

 

لماذا قام الاكسس بهذا التغيير ، لأن البيانات لم تكن صحيحة ، ولأن استعلام التحديث لم يُلزم الاكسس بالتأكد من التاريخ !!

وللتغلب على هذه الاشكالية ، يجب علينا ان نخبر الاكسس اسم حقل اليوم والشهر والسنة ، عن طريق الاوامر الخاصة بالتاريخ

 

12 ساعات مضت, Hawiii said:

حل المشكلة:

1. عند المستخدم بتثقيفه بالتنسيق المطلوب إدخاله

2. أو بإجباره من قبل المبرمج إما بكتابة شكل التنسيق أعلى الصندوق

3. أو بتقسيم خانة التاريخ إلى خانات يوم وشهر وسنة.

1. هذا مستحيل ، والتجارب اثبتت هذا ، فأنت تتعامل مع أناس من مختلف الطبقات ، وانا بنفسي شفت المهمل اللي يرمي مسؤوليه اخطاءه على البرنامج ،

 3. وحتى هذه الطريقة لا يمكن الاعتماد عليها ، فالمثال من الموضوع الآخر يثبت هذا الشيء. ستقول يجب ان نتأكد من الادخال ، والذي معناه الرجوع للمادة رقم 2 مرة اخرى 🙂 

2. وهذه هي الطريقة الصحيحة ، وهي محور كلام هذا الموضوع ، وهي استعمال الاوامر الصحيحة لقراءة التاريخ بالطريقة الصحيحة ، وهي وكما شرحتها انا بمثال في المشاركة التي وضعت رابطها ، وهي ان الاكسس يتعامل مع التواريخ بالتنسيق الامريكي شهر/يوم/سنه ، فيا نتعامل معها بهذه الطريقة ، وهي كما شرحها اخوي خالد :

في ١٢‏/٤‏/٢٠٢٠ at 00:41, kha9009lid said:

الطريقة التي استخدمها


Format([da_te];"\#mm\/dd\/yyyy\#")

تعطي نفس النتيجة

وكذلك الوحدة الخاصة بالاستاذ @jjafferr ، تعطي نفس النتيجة وتمتاز من وجهه نظري بالسهولة


DateFormat([d_date])

 

.

او اوامر التاريخ التي تنص على مكان اليوم و الشهر والسنه ، مثل DateSerial :

DateSerial(Year_السنة , Month_الشهر , Date_اليوم )

 

جعفر

 

  • Like 1
رابط هذا التعليق
شارك

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

  • Like 1
رابط هذا التعليق
شارك

لو احترزنا بـ :

- عمل تنسيق لصندوق النص.

- عمل ماسك عند الرغبة في منع المستخدم باختصار السنة بأني يكتب 1 بدلا من 2001 مثلا.

- عمل نطاق للتاريخ في التحقق من صحة التاريخ Validation.

وإن استطاع الإفلات من كل هذه الاحترازات نضع هذا الكود في حدث قبل التحديث لصندوق النص:

Private Sub txtTestDate_BeforeUpdate(Cancel As Integer)
    Dim DateText As String, Char As String
    Dim DateLen As Byte, Pos As Byte
    Dim yy As Integer, mm As Integer, dd As Integer
  
    On Error Resume Next
    
    DateText = Me.txtTestDate.Text
    If Trim(DateText) = "" Then Exit Sub
    
    DateLen = Len(DateText)
  
    For Pos = 1 To DateLen
        Char = Mid(DateText, Pos, 1)
        If Not Char Like "[0-9]" Then
            DateText = Replace(DateText, Char, "/")
        End If
    Next Pos
  
    Do While InStr(1, DateText, "//") > 0
        DateText = Replace(DateText, "//", "/")
    Loop

    Pos = InStr(1, DateText, "/")
    dd = Left(DateText, Pos - 1)
    DateText = Mid(DateText, Pos + 1)
    Pos = InStr(1, DateText, "/")
    mm = Left(DateText, Pos - 1)
    yy = Mid(DateText, Pos + 1)
   
    'يمكنكم تبديل النطاق
    If yy < 1900 Or yy > 9999 Then
        MsgBox "السنة خارج النطاق"
        Cancel = True
        Exit Sub
    End If

    If mm < 1 Or mm > 12 Then
        MsgBox "الشهر خاطئ"
        Cancel = True
        Exit Sub
    End If

    If dd < 1 Or dd > Day(DateSerial(yy, mm + 1, 0)) Then
        MsgBox "اليوم خاطئ"
        Cancel = True
        Exit Sub
    End If
End Sub

فلنجرب ولنحكم قبضتنا على المستخدم وإذا ما نجحنا فنشناه وبدلناه بموظف مخه في راسه.

  • Like 1
رابط هذا التعليق
شارك

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

رابط هذا التعليق
شارك

معظم الاعضاء يلجؤون للمنتديات لما تواجههم مشكلة في مكان ما ، والبعض الآخر يساعد الباقين ،

فلا هذا عنده وقت ، ولا ذاك ،

إلا اللي محتاج وعنده مشكلة في المثال اللي تقدمه ، فعلى اساسه تلقاه مستعد يجرب 🙂

 

جعفر

  • Like 1
  • Haha 1
رابط هذا التعليق
شارك

  • 2 years later...

السلام عليكم 🙂

 

الله يذكرك بالخير ان شاء الله اخوي هاوي ، سواء كنت معانا في المنتدى بإسم آخر (ان شاء الله :wink2:) ، او انك تتابعنا من بعيد 🙂

 

في 11‏/4‏/2020 at 01:00, Hawiii said:

وإذا كان على شكل نص ويحتوي على وقت مثل #10/4/2020 11:43:30 PM# ينصح بإضافة دالة TimeSerial ليصبح DateSerial(2020, 4, 10) + TimeSerial(23, 43, 30).

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

رجعت لهذا الموضوع لأهميته وعلشان انشط ذاكرتي (دواء الزكام يدوخ 😁) ، وحبيت ان اشكرك عليه ، وكما قلت لك :

في 16‏/4‏/2020 at 00:05, jjafferr said:

فلا هذا عنده وقت ، ولا ذاك ،

إلا اللي محتاج وعنده مشكلة في المثال اللي تقدمه ، فعلى اساسه تلقاه مستعد يجرب 🙂

 

جعفر

رابط هذا التعليق
شارك

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



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

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

Important Information