الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة في التعامل مع التاريخ في قواعد البيانات

مغلق
بدأه عنيزة في 3 يوليو 2002 · 6 رد · 2,946 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

توجد عندي قاعدة بيانات محلية فيها العديد من الحقول ومن ضمنها حقول من نوع تاريخ/وقت فعند اضافة / تعديل سجل تظهر رسالة خطأ انه هناك مشكلة في سعة التاريخ والوقت مع ملاحظة انني قمت بتحويل نوع البيانات الى asdate

ملاحظة : قاعدة البيانات من نوع اكسس

ارجو المساعدة

#2

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

استخدم حقل لليوم وحقل للشهر وحقل السنة

وبعدها تجري عليها عملياتك و بهذا تتجنب كثير من المشاكل

#3

السلام عليكم

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

ارجو المساعدة

#4

هدا من منتدي اخر ارجوا الافادة

3-كيف يمكن تخزين التاريخ الهجري في قواعد البيانات ؟

البعض يقول ..

- يمكن تخزين التاريخ على هيئة نص (String) :

ولكن هذه العملية غير مجدية في عمليات الإستعلامات المحصورة بين تواريخ معينة أو حساب المدة الزمنية بين تاريخين .

- البعض الآخر يقول بأنه يمكن تحويل التاريخ الهجري إلى تاريخ ميلادي وتخزين التاريخ الميلادي على تنسيق (DateTime) :

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

- إذاً ألا يوجد حل سهل ومباشر ؟

- نعم يوجد أكثر من حل وسهلة للغاية ومجربة و لا توجد بها أي سلبيات .

الحل الأول :

-----------

1- في قاعدة البيانات حدد نوع الحقل المطلوب تخزين التاريخ فيه من نوع LongInteger .

2- سيتم إدخال التاريخ بالشكل التالي مثلاً 14220230 وهو يمثل التاريخ التالي (30/02/1422) بمعنى أنه سيكون التاريخ عبارة عن رقم صحيح بدون فواصل التاريخ

3- ولكن هل سيظهر التاريخ للمستخدم بهذا الشكل ؟ ، طبعاً لا

إذاً كيف استطيع إظهاره على أنه تاريخ بالشكل (yyyy/mm/dd) ؟

لنفترض أنك تستخدم الـ Dataset من نوع TTable ، قم بإضافة الحقول إليها ثم قم بتحديد الحقل الذي سيتم تخزين التاريخ فيه ثم غير الخاصية DisplayFormat إلى (00/00/0000) وبذلك سيظهر التاريخ على أساس (yyyy/mm/dd) في كل الأدوات والتقارير التي تظهر التاريخ

4- ماذا عن إدخال البيانات ؟

يمكن إدخالها بنفس الطريقة بدون فواصل وسيقوم البرنامج بوضع الفواصل تلقائياً أو يمكن إستخدام Popup Calendar يقوم بإظهار التاريخ الهجري مثل الموجود في أدوات KDTools ثم يقوم المستخدم من خلاله بإختيار التاريخ وتخزينه في أدات قواعد البيانات سواء كانت DBEdit أو DBGrid .

5- ولكن أدوات مثل هذه تقوم بإختيار التاريخ مع الفواصل بمعنى انها ترجع التاريخ بالفواصل والحقل يقوم بتخزين البيانات بدون فواصل ؟

هذا الكلام صحيح ولكن يمكن معالجة هذه المشكلة والتي تظهر أيضاً عند تمرير Parameters لهذا الحقل في الإستعلامات والتي لا تقبل القيمة بفواصل بعمل إجراء بسيط يكون وسيط بحيث يقوم بإزالة وإضافة الفواصل حسب المطلوب وهذه الإجراءات موجودة في المجموعة KDTools في الوحدة KDSysUtils والتي تقوم بذلك بمجرد تمرير التاريخ كقيمة نصية بالفواصل ويقوم بإرجاعها كقيمة رقمية بدون فواصل وبالتالي تمريرها للحقل مباشرة أو للإ ستعلام كـ Parameter .

6- كما يمكن بواسطة الإجراءات الموجودة في الوحدة KDSysUtils حساب المدة بين تاريخين هجريين أو ميلاديين ويرجع المدة كيوم وشهر وسنة في ثلاثة متغيرات يتم تمريرها في إجراء حساب المدة بين التاريخين

هذا كان أحد الحلول لمعالجة تخزين التاريخ الهجري ، ماذا عن الحل الثاني ؟

الحل الثاني :

-------------

1- في قاعدة البيانات حدد نوع الحقل المطلوب تخزين التاريخ فيه من نوع LongInteger .

2- سيتم معالجة التاريخ على أساس تحويل التاريخ إلى مجموع الأيام حتى التاريخ المطلوب وذلك بضرب السنوات في 360 والشهور في 12 وجمع الناتج منهما مع الأيام .

3- ولكن هل يقوم المبرمج بعمل كل ذلك ؟

لقد تم تطوير ثلاثة أدوات لمعالجة هذه العملية في دلفي وتوجد هذه الأدوات ضمن المجموعة KDTools وهي :

KDDBHijriDateEdit وهي أداة بديلة للأداة DBEdit حيث يقوم المستخدم بكتابة التاريخ بالطريقة العادية تماماً وتقوم الأداة داخلياً بتحويل التاريخ إلى مجموع عدد الأيام وتخزينها في قاعدة البيانات وعند قراءة البيانات من قاعدة البيانات تقوم بالعملية العكسية وهو تحويل مجموع الأيام إلى شكل تاريخ يظهر في نفس الأداة .

KDDBHijriDate وهي أداة وسيط تقوم بتحويل التاريخ إلى مجموع الأيام أو تحويل مجموع الأيام إلى تاريخ ويستفاد من هذه الأداة في إظهار التاريخ في أدوات أخرى مثل DBGrid .

ولكن كيف يتم ذلك ؟ يمكن عمل حقل من نوع Calculated Field من نوع String قيمته تساوي قيمة التاريخ التي ترجعها هذه الأداة بعد تمرير قيمة مجموع الأيام الموجودة في الحقل الحقيقي للتاريخ .

ولكن أنت تريد المستخدم أن يقوم بإدخال البيانات من خلال الـ DBGrid مباشرة بدون إستخدام الأداة KDDBHijriDateEdit فهل هذا ممكن ؟

نعم ممكن بإستخدام الطريقة السابقة (Calculate Field) واستخدام إزرار يظهر للمستخدم Popup Calendar مثل الموجود في أدوات KDTools ويتم تمرير التاريخ الذي أختاره المستخدم للأداة KDDBHijriDate وأخذ مجموع الأيام واسناده للحقل الحقيقي وسيظهر التاريخ المختار في الحقل الـ Calculated هذه العملية بسيطة جدا ولا يهولك كثرة الكلام حولها .

ولكن ماذا عن التقارير ؟ كيف ستظهر البيانات في التقرير هل هي مجموع أيام أم التاريخ الهجري مباشرة ؟

هنالك عدة حلول أحدها إستخدام الأداة KDQRDBHijriText إذا كنت تستخدم مصمم التقارير QuickReport أو قراءة قيمة الحقل الـ Calculated واسناده لأي أداة تقارير سواء QuickReport أو ReportBuilder أو غيره من مصممي التقارير .

إذا لماذا نجعل لمشكلة تخزين التاريخ الهجري في قواعد البيانات هذا الهاجس الكبير وتوجد لدينا العديد من الحلول لذلك

ملاحظة : كلا الحلين تم تجربتها في برامج حقيقية موجودة لدى العديد من العملاء .

طلب تقييم

بسم الله الرحمن الرحيم

الاخوة الكرام السلام عليكم ورحمة الله وبركاته.

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

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

على العلموم انا اريد من جميع الأخوة الكرام المشاركة في تقيم المثال اولاً بعد تجربة البرنامج ، ثم اقوم بارسال الكود الخاصة بذلك بعد رؤية الملاحظات والمقترحات .

لتنزيل البرنامج:

http://mypage.ayna.com/tk999/Delphi/exdata.zip

ملاحظة لتشغيل البرنامج قم بانشاء الاليس التالي: ByData:وتعريفه بموقع البرنامج

#5

السلام عليكم

هناك function

CompareDate(strtodate(Date1),strtodate(Date2));

توضيح

{

if date1

the result -1

if date1>date2 then

the result 1

else

the result 0

}

جربتها على Edit1,Edit2

طبعا نوعها نص واستخدمت نفس التحويل واعطاني نتائج صحيحه ولكن عندما استخدمتها في filter لم تعطي نتائج صحيحة

ارجو التعليق

هناك سؤال بسيط

كيف اقوم بعملية البحث في جزء من الكلمة مثلا عنيزة وعند ادخال عن في نص البحث يعطيني اي شي فيه عن ومن ضمنه عنيزة

#6

السلام عليكم

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

نقطة اخرى

ما رأيك في الطريقة التي وضحتها سابقا...

تحيات

عنيزة

#7

السلام عليكم

اخيرا حلت المشكلة بنفس الطريقة باستخدام string واستخدام نفس function التي ذكرتها سابقا وبخطوات وجهد اقل .

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

تحيات

عنيزة

هذا الموضوع مغلق.

مواضيع مشابهة