Hawiii قام بنشر أبريل 10, 2020 قام بنشر أبريل 10, 2020 بمجرد أن يكون اليوم أكبر من أو يساوي 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). قد يستثقلها المبرمج ويرى فيها تعقيدا ولكن كاحتراز فهي مطلوبة بشدة وخصوصا إذا كانت البرامج لها علاقة بحسابات وأمور يترتب علي أخطائها أضرارا. هذا اجتهادي وقد أكون صائبا وقد أكون مخطئا. 6
jjafferr قام بنشر أبريل 10, 2020 قام بنشر أبريل 10, 2020 وعليكم السلام 🙂 شكرا جزيلا على هذا الشرح ، بس لو تكرمت واكملت الشرح بأمثله ، علشان يكون الموضوع واضح ومكتمل 🙂 جعفر 2
Hawiii قام بنشر أبريل 10, 2020 الكاتب قام بنشر أبريل 10, 2020 (معدل) لم أتعود على كتابة الأمثلة وهذه مقدرتي ، من يمتلك هذه الملكة فليقوم بالاختبارات وعمل أمثلة أكثر وضوحا. من أهم ما أشدد على الالتزام به هو أن تستخدم دالة تحويل التاريخ إلى رقم لجهتي المقارنة أي حقل الجدول و قيمة البحث. 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 تم تعديل أبريل 10, 2020 بواسطه Hawiii 5
jjafferr قام بنشر أبريل 11, 2020 قام بنشر أبريل 11, 2020 21 ساعات مضت, Hawiii said: لم أتعود على كتابة الأمثلة وهذه مقدرتي رحم الله والديك ، كفيت ووفيت 🙂 في الواقع في منها امثلة جديدة علي 🙂 جعفر 1
kha9009lid قام بنشر أبريل 11, 2020 قام بنشر أبريل 11, 2020 23 ساعات مضت, Hawiii said: إذا كان التاريخ بدون وقت يمكن استخدام دالة CLng 21 ساعات مضت, Hawiii said: من أهم ما أشدد على الالتزام به هو أن تستخدم دالة تحويل التاريخ إلى رقم لجهتي المقارنة أي حقل الجدول و قيمة البحث لفتت نظري هذه الطريقة واردت التأكد من فاعليتها قمت بعمل حلقة تكرارية لتوليد 50000 سجل تاريخ لعدد اربعة حقول كل منها بتنسيق مختلف ومن ثم عملت مقارنة في قيمة الحقول الاربعة بعد تحويل التاريخ الى رقم وكانت النتيجة ممتازة مع ذلك النتيجة هنا قد لا تكون حاسمة لكون التاريخ يتأثر بصيغة التاريخ في نظام التشغيل لذك قمت بنقل المثال على الشبكة وقمت بتغيير صيغة التاريخ في الاجهزة المتصلة وكانت النتيجة ايضا ممتازة في المقارنة وفي البحث وفي معايير دوال التجميع مع ذلك الطريقة التي استخدمها Format([da_te];"\#mm\/dd\/yyyy\#") تعطي نفس النتيجة وكذلك الوحدة الخاصة بالاستاذ @jjafferr تعطي نفس النتيجة وتمتاز من وجهه نظري بالسهولة DateFormat([d_date]) في الحقيقة من اجمل المواضيع التي شدت انتباهي 3
Hawiii قام بنشر أبريل 11, 2020 الكاتب قام بنشر أبريل 11, 2020 (معدل) 1 ساعه مضت, kha9009lid said: مع ذلك الطريقة التي استخدمها Format([da_te];"\#mm\/dd\/yyyy\#") تعطي نفس النتيجة وكذلك الوحدة الخاصة بالاستاذ @jjafferr تعطي نفس النتيجة وتمتاز من وجهه نظري بالسهولة DateFormat([d_date]) في الحقيقة من اجمل المواضيع التي شدت انتباهي شكرا لجهودك وبارك الله فيك ، لو تشرح لنا طريقة التنسيق في الطريقة التي تستخدمها. ولو تضعون لنا كود دالة DateFormat أكون لكم من الشاكرين. حمستني وسأقوم باختباراتي أنا أيضا. تم تعديل أبريل 11, 2020 بواسطه Hawiii
Hawiii قام بنشر أبريل 11, 2020 الكاتب قام بنشر أبريل 11, 2020 (معدل) 2 ساعات مضت, jjafferr said: رحم الله والديك ، كفيت ووفيت 🙂 ووالديك أستاذنا جعفر تم تعديل أبريل 11, 2020 بواسطه Hawiii تصحيح خطأ املائي
أبوبسمله قام بنشر أبريل 11, 2020 قام بنشر أبريل 11, 2020 2 دقائق مضت, Hawiii said: ووالدين أستاذنا جعفر اللهم آمين 2 ساعات مضت, jjafferr said: رحم الله والديك ، كفيت ووفيت 🙂 في الواقع في منها امثلة جديدة علي 🙂 جعفر اللهم امين جزاكم الله خيرا اخوانى واساتذتى اتفضل اخى هاوى الرابط اللذى اشار اليه اخى واستاذى خالد @kha9009lid جزاكم الله خيرا 1
Hawiii قام بنشر أبريل 12, 2020 الكاتب قام بنشر أبريل 12, 2020 (معدل) أعتذر لتمريري معلومة خاطئة لكم وهي تأثير تنسيق تاريخ البحث المحصور بين علامتي # بالاعدادات الإقليمية لنظام التشغيل والصحيح أنه لا يتأثر وتنسيقه ثابتا دائما ولكن على خلاف ما اعتدنا عليه في كتابة التاريخ فكتابته لابد أن تكون mm/dd/yyyy أي نبدأ بالشهر ثم اليوم ثم السنة ابتداء من اليسار. ومع ذلك حتى لو اعتدنا على استخدامه بالشكل الصحيح فأنا لازلت على نصيحتي فهي أكثر اطمئنانا. اقرأوا أكثر: Excel VBA Dates & Time, Format Function, User Defined Date, Number & String Formats تم تعديل أبريل 12, 2020 بواسطه Hawiii
أبوبسمله قام بنشر أبريل 12, 2020 قام بنشر أبريل 12, 2020 7 ساعات مضت, Hawiii said: أعتذر لتمريري معلومة خاطئة لكم وهي تأثير تنسيق تاريخ البحث المحصور بين علامتي # بالاعدادات الإقليمية لنظام التشغيل والصحيح أنه لا يتأثر وتنسيقه ثابتا دائما ولكن على خلاف ما اعتدنا عليه في كتابة التاريخ فكتابته لابد أن تكون mm/dd/yyyy أي نبدأ بالشهر ثم اليوم ثم السنة ابتداء من اليسار. ومع ذلك حتى لو اعتدنا على استخدامه بالشكل الصحيح فأنا لازلت على نصيحتي فهي أكثر اطمئنانا. اقرأوا أكثر: Excel VBA Dates & Time, Format Function, User Defined Date, Number & String Formats ولا يهمك اخى هاوى وجزاك الله خيرا على مثابرتك فى توصيل المعلومه الصحيحه وافاده اخوانك بارك الله فيك وجزاك الله كل خير سوف احاول قدر المستطاع ترجمته وفهمه وان استطاع احد اخواننا واساتذتنا ان يبسطه لنا بشرح عربى فجزاه الله عنا كل خير
jjafferr قام بنشر أبريل 12, 2020 قام بنشر أبريل 12, 2020 8 ساعات مضت, Hawiii said: والصحيح أنه لا يتأثر وتنسيقه ثابتا دائما ولكن على خلاف ما اعتدنا عليه في كتابة التاريخ فكتابته لابد أن تكون mm/dd/yyyy وهذا يأخذنا الى السؤال الازلي: ايهم جاء قبل ، البيضة او الدجاجة 🙂 فبما ان نظام الكمبيوتر سمح لنا نستعمل تنسيق محلي بصيغة dd/mm/yyyy ، والكود كذلك ، فبديهي ان يستعمل المبرمج هذه الصيغة في برمجته (وخصوصا ان الكود يسمح له) ، وهنا تأتي مشكلة عدم تطابق البيانات مع الكود ، بين كمبيوتر المبرمج وكمبيوتر المستخدم ، والامثلة في المنتدى كثيرة !! وللتخلص من جميع هذه الاشكالات ، لا يكفي ان تستعمل امر مثل CDate ، فسيحوله حسب تاريخ النظام ، لهذا السبب ، وكما ذكرت في هذا الموضوع ، فيجب استخدام اوامر التاريخ التي لها علاقة مباشرة باليوم والشهر والسنه مثل DateAdd او DateDiiff او DatePart او DateSerial : . وشكرا اخوي خالد انك اقتصرت قائمة الاوامر في مشاركتك اعلاه 🙂 جعفر 1
kha9009lid قام بنشر أبريل 12, 2020 قام بنشر أبريل 12, 2020 يا هلا باساتذتنا الفضلاء @jjafferr و @أحمد الفلاحجى و @Hawiii 2 ساعات مضت, jjafferr said: وهذا يأخذنا الى السؤال الازلي: ايهم جاء قبل ، البيضة او الدجاجة لما قريت الجملة السابقة حسيت بالجوع ضغط العمل اضاع علينا الغداء والاجر عند الله سبحانه ما قصدته في ردي ان كل الطرق تؤدي الى روما ولكني لا احب الامثلة الاجنبية لذا اقول كما قال الشاعر علي بن سودون اليشبغاوي كأنّنا والماءُ مِن حَولِنا -- قَومٌ جُلوسٌ حَولهم ماءُ الأرضُ أرضٌ والسَّماءُ سماءٌ -- والماءُ ماءٌ و الهَواءُ هواءُ كُلُّ الرجالِ على العُمومِ مُذَكَّرٌ -- أما النِساءُ فُكُلّهن نِساءُ الميمُ غَيرُ الجيمِ جاءَ مُصَحَفّا -- وإذا كَتَبتَ الحاءَ فهي الحاءُ تحياتي وتقديري لكم اساتذتنا الاكارم 1 1
أبوبسمله قام بنشر أبريل 12, 2020 قام بنشر أبريل 12, 2020 منذ ساعه, kha9009lid said: يا هلا باساتذتنا الفضلاء @jjafferr و @أحمد الفلاحجى و @Hawiii لما قريت الجملة السابقة حسيت بالجوع ضغط العمل اضاع علينا الغداء والاجر عند الله سبحانه ما قصدته في ردي ان كل الطرق تؤدي الى روما ولكني لا احب الامثلة الاجنبية لذا اقول كما قال الشاعر علي بن سودون اليشبغاوي كأنّنا والماءُ مِن حَولِنا -- قَومٌ جُلوسٌ حَولهم ماءُ الأرضُ أرضٌ والسَّماءُ سماءٌ -- والماءُ ماءٌ و الهَواءُ هواءُ كُلُّ الرجالِ على العُمومِ مُذَكَّرٌ -- أما النِساءُ فُكُلّهن نِساءُ الميمُ غَيرُ الجيمِ جاءَ مُصَحَفّا -- وإذا كَتَبتَ الحاءَ فهي الحاءُ تحياتي وتقديري لكم اساتذتنا الاكارم تعالى اتفضل وهتدبحلك عدس ههههههههههههههه حبيبى ربنا يوفقكم ويجازيكم كل خير 1
kha9009lid قام بنشر أبريل 12, 2020 قام بنشر أبريل 12, 2020 47 دقائق مضت, أحمد الفلاحجى said: تعالى اتفضل وهتدبحلك عدس ههههههههههههههه ياهلا @أحمد الفلاحجى عندكم مثل جميل " بصلة المحب خروف " نعود للموضوع كافة الحلول جميلة وجميعا تعطي النتيجة ذاتها وكل مخير لاستخدام الطريقة التي يجدها انسب له مثلا يبعد منزلي عن مقر عملي 23 كم اذا استخدمت الطريق الاقرب مع ذلك احب ان استخدم طريق اخر يزيد المسافة الى 29.3 كم لكوني اعتدت على استخدامه تحويل التاريخ الى رقم فكره جميله وتستحق الاشادة هل ساستخدمها الاجابة انا افضل ان اقطع مسافة 29.3 كم للوصول للعمل تحياتي وتقديري 1
Hawiii قام بنشر أبريل 12, 2020 الكاتب قام بنشر أبريل 12, 2020 حتى لا يتوه القارئ - المشكلة لم تنتهي بعد تأكدنا عدم تأثير الاعدادات الإقليمية على تنسيق "التاريخ" المكتوب على شكل نص والمحصور بين علامتي الرقم # مثل #4/6/2020#. - المشكلة محصورة في الأحد عشر يوما الأولى من كل شهر. - المشكلة يقع فيها كل من المبرمج والمستخدم. - دالة DateFormat لا تحل المشكلة هي فقط تنسيق قيمة "التاريخ" سواء كانت صحيحة أو خاطئة بالشكل الصحيح لكتابته لاستخدامه في البحث والمقارنة فـ garbage in garbage out. - حل المشكلة عند المبرمج أن يكون فاهم "تنسيق التاريخ" المكتوب أو يحترز باستخدام دالة DateSerial فهذه ستحميه من أخطاء الكتابة. - حل المشكلة عند المستخدم بتثقيفه بالتنسيق المطلوب إدخاله أو بإجباره من قبل المبرمج إما بكتابة شكل التنسيق أعلى الصندوق أو بتقسيم خانة التاريخ إلى خانات يوم وشهر وسنة. - تبقى دالة Format مهمة في مخرجات نصية للتاريخ حسب الرغبة. - وتبقى الإعدادات الإقليمية مهمة في مخرجات نصية بتنسيق موحد للتاريخ حسب الضبط المسبق. - على القارئ أن لا يخلط بين تنسيق التاريخ والتنسيق النصي كالتالي: #4/6/2020# هذا تنسيق تاريخ أي نوعه تاريخ وليس نص ولا يحتاج إلى تحويل من نص إلى تاريخ وهذا يمثل 6 أبريل 2020م. "06/04/2020" هذا تنسيق نصي أي نوعه نص ولو أردنا قيمته كتاريخ يحتاج إلى تحويل وسوف يتأثر بالإعدادات الإقليمية عند تحويله وقد يمثل 6 أبريل أو 4 يونيو 2020م.
jjafferr قام بنشر أبريل 13, 2020 قام بنشر أبريل 13, 2020 السلام عليكم 🙂 مسألة Garbage in, garbage out (اذا تم ادخال بيانات خطأ، فالنتائج تكون خطأ) تنطبق على كل جزئية من بيانات قاعدة البيانات ، وليس التاريخ فحسب ، رجاء انظر في الرابط اللي وضعته انا في مشاركتي اعلاه : وستلاحظ فيه ان المستخدم اخطأ في ادخال تاريخ اليوم ، فسنة 2001 سنة كبيسة ولا يوجد فيها 29 يوم : في ٣١/٣/٢٠٢٠ at 16:19, jjafferr said: هذه نتائج الجدول : نلاحظ ان التواريخ جميعها صحيحه ، ولكن المستخدم اخطأ في ادخال التاريخ 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_اليوم ) جعفر 1
Hawiii قام بنشر أبريل 13, 2020 الكاتب قام بنشر أبريل 13, 2020 سأرجع لكم الليلة إن شاء الله لأقرأ الموضوع على راحة ، على الطاير .. الأكسس لا يقبل تاريخ خاطئ ، ربما المبرمج لم يضع تنسيق للتاريخ وإلا مع التنسيق سوق يعطي المستخدم رسالة خطأ ، لم أجرب ، جربوا أنتم الآن والليلة كذلك سأقوم بالتجربة. 1
Hawiii قام بنشر أبريل 13, 2020 الكاتب قام بنشر أبريل 13, 2020 لو احترزنا بـ : - عمل تنسيق لصندوق النص. - عمل ماسك عند الرغبة في منع المستخدم باختصار السنة بأني يكتب 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 فلنجرب ولنحكم قبضتنا على المستخدم وإذا ما نجحنا فنشناه وبدلناه بموظف مخه في راسه. 1
Hawiii قام بنشر أبريل 14, 2020 الكاتب قام بنشر أبريل 14, 2020 مثال صغير بأفكار متعددة لفحص وتنظيم إدخالات التاريخ آخر مشاركة لي في هذا الموضوع DateValidation.rar 1
Hawiii قام بنشر أبريل 15, 2020 الكاتب قام بنشر أبريل 15, 2020 من الغريب لا يوجد من يرجع لنا بنتائج فحص المثال ، بالإيجاب أم بالسلب. تصميم أمثلة يتطلب وقتا أكبر من وقت الفحص أو التجربة ، فمراجعتكم مطلوبة لتطوير حلول مرجعية متينة.
jjafferr قام بنشر أبريل 15, 2020 قام بنشر أبريل 15, 2020 معظم الاعضاء يلجؤون للمنتديات لما تواجههم مشكلة في مكان ما ، والبعض الآخر يساعد الباقين ، فلا هذا عنده وقت ، ولا ذاك ، إلا اللي محتاج وعنده مشكلة في المثال اللي تقدمه ، فعلى اساسه تلقاه مستعد يجرب 🙂 جعفر 1 1
jjafferr قام بنشر فبراير 1, 2023 قام بنشر فبراير 1, 2023 السلام عليكم 🙂 الله يذكرك بالخير ان شاء الله اخوي هاوي ، سواء كنت معانا في المنتدى بإسم آخر (ان شاء الله ) ، او انك تتابعنا من بعيد 🙂 في 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: فلا هذا عنده وقت ، ولا ذاك ، إلا اللي محتاج وعنده مشكلة في المثال اللي تقدمه ، فعلى اساسه تلقاه مستعد يجرب 🙂 جعفر
الردود الموصى بها
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.