بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
تحية طيبة لجميع الإخوة في هذا المنتدى المبارك .
حيث وجدت أن الأرشيف يخلو من موضوع تقويم أم القرى في حين أنه شديد الأهمية للمبرمجين والمستخدمين في السعودية ، كما أني وجدت أنه تم تناول بعض الحلول في مواضع مختلفة ، إضافة إلى ما حصل في بعض المواضع من المناقشات والردود الخارجة عن صلب الموضوع .
لذا وجدت أنه من المناسب طرح الموضوع من جديد بشكل يتم فيه اختصار الحلول المختلفة ، ثم تصحيح ما يستدعي التصحيح بواسطة الإخوة في هذا المنتدى ، تهيئة لوضعه في الأرشيف .
وأستعين بالله في ذلك فيما يلي :
لتحميل هذا الموضوع على ملف وورد مع أمثلته حمل الوصلة التالية:
http://mypage.ayna.com/harith77/UmAlQura.zip
المشكلة :
تعتمد المملكة العربية السعودية على تقويم أم القرى ، وهو تقويم مختلف عن التقويم الهجري للويندوز، مما ينتج عنه أن الويندوز لا يقبل إدخال ولا عرض تاريخ 30 من بعض الأشهر التامة حسب تقويم أم القرى .
وفي المقابل يقبل الويندوز إدخال وعرض يوم 30 من بعض الأشهر غير التامة حسب تقويم أم القرى .
كما أن التاريخ يعطي فارقا بمعدل يوم واحد في بعض الأشهر .
ويمكن تصور مدى الإشكال إذا علم أنك إذا أدخلت تاريخ 30/12/1422 هـ فإنه لن يقبل وسيتم تحويله مباشرة إلى تاريخ 1/1/1423 هـ . ، وأن يوم 1 / 9 / 1423 يوافق في تقويم الويندوز الثلاثاء وفي أم القرى الأربعاء.
الحلول :
يمكن تقسيم الحلول المختلفة إلى حلين رئيسين :
الحل الأول : حفظ التاريخ كتاريخ ميلادي لا هجري ، بأن يتم التحويل من الهجري إلى الميلادي قبل الحفظ ، ومن الميلادي إلى الهجري قبل العرض .
الحل الثاني : عدم حفظ التاريخ كتاريخ ، وإنما كنص أو رقم ، في حقل واحد أو عدة حقول.
الحل الأول : حفظ التاريخ الميلادي .
يتميز هذا الحل بأنه يعتمد حفظ التاريخ كتاريخ ، ومن ثم يمكن الاستفادة من كافة المزايا والاستخدامات التي يمكن التعامل بها مع التاريخ ، ومنها مثلا :
أ- معرفة تاريخ اليوم وإدخاله وعرضه .
ب- يمكن معرفة مواعيد اليوم مثلا أو الغد أو الأسبوع القادم أو الأسبوع الماضي ، ونحو ذلك .
ج- زيادة عدد محدد من الأيام أو الأشهر أو السنوات أو طرحه باستخدام الدوال التي تضيف أو تطرح من التاريخ ( DateAdd مثلا )
د- معرفة التاريخ الميلادي الموافق .
هـ معرفة اليوم الموافق للتاريخ المدخل (السبت ، الأحد ، ... الخ)
و- يمكن تخيير المستخدم بين استخدام التاريخ الهجري أو الميلادي .
قد يعيب البعض هذا الحل بأمرين :
أ- البطء الحاصل من جراء عملية تحويل البيانات المحفوظة بالتاريخ الميلادي إلى التاريخ الهجري ، حيث يستغرق هذا التحويل وقتا يجعل عرض البيانات يتسم بشيء من البطء .
ب- في حالة حصول خطأ في الآلية المستخدمة للتحويل من الهجري إلى الميلادي فإن التاريخ الميلادي المدخل سيكون خاطئا ، وقد يصعب تلافيه فيما بعد .
وأرى أن هذا غير صحيح ، فبتجربة مدى سرعة عملية التحويل وجدت أنها سريعة جدا ، وعلى فرض أنها اتسمت بشيء من البطء فإن هذا أمر محتمل مقارنة بالمميزات التي نجنيها باتباع هذه الطريقة . أما الخطأ فيمكن تلافيه بالمراجعة الدقيقة قبل اعتماد آلية التحويل .
* ويندرج تحت هذا الحل عدد من الطرق :
أولا : الدالة الحسابية : بمعنى اعتماد دالة حسابية تحول التاريخ الهجري المدخل إلى تاريخ ميلادي ليتم حفظه ، وتحول التاريخ الميلادي المحفوظ إلى تاريخ هجري ليتم عرضه .
وهذه الطريقة ربما هي من أفضل الطرق لولا أن تقويم أم القرى مر بمراحل ثلاث :
المرحلة الأولى : عام 1419هـ وما قبله .
المرحلة الثانية : من عام 1420 إلى عام 1422هـ .
المرحلة الثالثة : من عام 1423 وما بعده .
ولكل مرحلة طريقة حسابية مختلفة .
علما بأن الأخ خالد الصالح قد وضع دالة حسابية(مكتبة) تحول التاريخ الهجري إلى ميلادي بدءا من عام 1420هـ ، أما قبل هذا العام فإنها تعطي نتائج غير موافقة لتقويم أم القرى بمرحلته الأولى .
وهي موجودة في الوصلة التالية :
http://mypage.ayna.com/harith77/KhaidUmalqura.zip
وأود إفادتكم بأنه بمراسلة الأخ خالد الصالح أفادني بأن لديه نسخة جديدة من نفس المكتبة يعدها حاليا وتتميز بصغر حجمها وسرعتها في التحويل ، ومطابقة تماما لتقويم أم القرى من عام 1300 حتى عام 1500 هجري .
ثانيا : استخدام جدول يضمن تقويم أم القرى . ويتم تحويل التاريخ الهجري إلى ميلادي والعكس بناء على البيانات المضمنة في هذا الجدول .
وطبعا يتم التحويل من الميلادي إلى الهجري أو العكس بواسطة أكواد .
والجدول والأكواد يمكن أن تصمم بطرق مختلفة ، إلا أن أفضل ما اطلعت عليه منها – من وجهة نظري- سواء من حيث حجم البيانات أوسرعة الوصول إليها : طريقة أستاذنا أبي هادي ، خاصة في مرحلتها الأخيرة والموجودة في الوصلة التالية :
http://mypage.ayna.com/harith77/AbuHadiUmalqura.zip
وتتميز هذه الطريقة بأنه يتم فيها تحميل الجدول بأكمله في الذاكرة دفعة واحدة إما مع بداية البرنامج أو وقت ما يشاء مصمم البرنامج بوضع أمر تحميل (Call LoadUmAlQura) . وقد جربت على معلومات تصل إلى 1000 سجل تقريبا وكانت النتيجة مذهلة ورائعة مقارنة بطريقة البحث في الملف عن كل سنة جديدة ثم تحميلها بالذاكرة والقيام بالتحويل .
وهنا نفس طريقة أبو هادي لكن مع محاولة تبسيطها تسهيلا لفهمها ومع بعض الإضافات اليسيرة جدا
http://mypage.ayna.com/harith77/SimpleUmalqura.zip
الحل الثاني : حفظ التاريخ الهجري كنص أو كرقم في حقل واحد أو حقول متعددة .يتميز هذا الحل بسهولته وسرعته، لعدم احتياجه إلى ما يحتاج إليه الحل الأول من دوال أو أكواد .
ويتميز أيضا بأن ما يدخله المستخدم من بيانات هو ذات ما يتم حفظه وما يتم عرضه لاحقا .
ولكن يعاب على هذا الحل بشكل عام أنه يفتقد المميزات الموجودة في الحل الأول .
كما يعاب عليه أنه لا يمنع المستخدم من إدخال تاريخ 30 في شهر غير تام حسب تقويم أم القرى ، الأمر الذي قد يترتب عليه سلبيات عديدة (في المواعيد مثلا) .
ولهذا الحل عدد من الطرق منها :
أولا : وضع ثلاثة حقول : حقل لليوم وحقل للشهر وحقل للعام .وتتتميز هذه الطريقة بسهولة إدخال التاريخ ، حيث يدخل المستخدم اليوم في حقل اليوم ، والشهر في حقل الشهر، والعام في حقل العام ، وكل ما يحتاج إليه الأمر هو وضع معايير للتأكد من صحة اليوم أو الشهر أو العام المدخل.
وتحتاج هذه الطريقة إلى وضع حقل محسوب بواسطة كود أو تعبير ، ليتم تصفية التقارير والنماذج بواسطته . إذ لا يمكن مثلا عرض البيانات من تاريخ كذا إلى تاريخ كذا إلا بواسطة هذا الحقل .
وقد تعاب هذه الطريقة بأنها تجعل التاريخ في ثلاثة حقول ، بينما يمكن جعله في حقل واحد .
وفيما يلي مثال لهذه الطريقة :
http://mypage.ayna.com/harith77/ThreeField.zip
ثانيا : حفظ التاريخ في حقل واحد نصي أو رقمي .ويجب عند اتباع هذه الطريقة أن يخزن التاريخ بالشكل التالي : yyyy/mm/dd وبناء عليه يكتب يوم الخامس من شهر صفر بالشكل التالي : 05/02/1423 .
وحيث إن هذا يترتب عليه أن يتم إدخال العام ثم الشهر ثم اليوم ، الأمر غير المحبب وغير المألوف لدى المستخدمين ، لذا ينبغي أن يكون إدخال التاريخ بواسطة حقل غير منضم ، أو حقول ثلاثة غير منضمة ، يتم فيها إدخال التاريخ بالشكل المألوف : اليوم ثم الشهر ثم السنة ، وبعد التأكد من صحة التاريخ المدخل يتم بواسطة كود قلبه إلى الشكل المطلوب : yyyy/mm/dd
وتتميز هذه الطريقة أنه يمكن فرز وتصفية التاريخ مباشرة بواسطة التاريخ المحفوظ دون حاجة إلى حقل محسوب ، وأن التاريخ يحفظ في حقل واحد .
وفيما يلي مثال لهذه الطريقة :
http://mypage.ayna.com/harith77/OneField.zip
الجمع بين الحلين الأول والثاني :
الجدير بالإشارة أنه قد يمكن استخدام الحل الثاني مع جزء من الحل الأول ، وذلك باستخدام حقل نصي أو رقمي لحفظ التاريخ، مع استخدام دالة حسابية أو جدول أم القرى لتحويل البيانات النصية أو الرقمية إلى تاريخ عند الحاجة ، وأظن أن هذا الحل قد يكون مناسبا حين يرى المبرمج أنه لا يحتاج غالبا للتعامل مع التاريخ الهجري كتاريخ ، ومن ثم يقوم بحفظ التاريخ كنص أو كرقم ليكون حفظ وعرض التاريخ بدون أكواد ولا دوال حسابية ، ولا يلجأ إلى الأكواد إلا في الحالات التي يحتاج فيها إلى التعامل مع التاريخ الهجري كتاريخ، كما إذا احتاج إلى إضافة أيام أو حذفها ، أو احتاج لمعرفة التاريخ الحالي ، ونحو ذلك .
وسأحاول قريبا إن شاء الله طرح مثال لهذا
ولا يفوتني أن أشير إلى أنه ليست هذه كل الحلول والطرق ، فهناك حلول أخرى في ذهني الآن بعض منها، وهي عبارة عن إضافات على بعض ما سبق أو جمع بين أكثر من طريقة أو حل ، لكن المقصود هنا إرشاد المبتدئ ليختار ما يراه أنسب له ثم ينطلق في تطوير ما اختاره وتحسينه ، كما أن المتقدمين في هذا المجال قد يستفيدون من هذا الموضوع بعض الأفكار أو الحيل أو يجمعون بين عدد من الطرق للوصول إلى نتائج أفضل .
وختاما فإني وإن كنت أميل إلى اتباع الحل الأول (وخاصة طريقة الأخ أبي هادي) فيما أصممه من قواعد البيانات ، إلا أن مصمم البرنامج قد لا يحتاج إلى الرجوع إلى التاريخ الحالي ، ولا إلى الإضافة على التاريخ أو الحذف منه ، مما يجعل الحل الثاني أسهل وأنسب له .
هذا ما تمكنت من كتابته حول هذا الموضوع .
وأتمنى في حالة وجود بعض الملاحظات أو الأخطاء فيما ذكرته التصحيح .
كما أتمنى من الإخوان جميعا مراجعة الأمثلة وإبداء ملاحظاتهم لنقوم معا بتدارك ما فيها من نقص أو خطأ .
أخيرا : أرجو أن تكون جميع المشاركات في هذا الموضوع مركزة وخاصة بصلب الموضوع ، الذي هو تقويم أم القرى، وليس التقويم الهجري بشكل عام
لتحميل هذا الموضوع على ملف وورد مع أمثلته حمل الوصلة التالية:
