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

لعلها نهاية مشكلة التاريخ الهجري

مغلق
بدأه faried في 15 أغسطس 2001 · 7 رد · 5,020 مشاهدة · في قواعد بيانات Oracle
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

إخواني زوار المنتدى ، طرحت من يومين سؤال عن كيفية التحكم في

الـcalander أثناء تشغيل أي form ولكن اتضح لي أن المشكلة في قاعدة بياناتي في المنزل ولكن الحمد لله نفذت العملية على أكثر من قاعدة بيانات وإليكم النتيجة ++++++++++++

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

بهذه الدالة يمكن مباشرة التحويل من ميلادي إلى هجري دون مشاكل بإذن الله

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

FUNCTION MELADY_TO_HIJRAH(MELADY_DATE VARCHAR2) RETURN VARCHAR2 IS

TEMP_DATE DATE;

HIJRAH_DATE VARCHAR2(30);

BEGIN

DBMS_SESSION.SET_NLS('NLS_CALENDAR','''GREGORIAN''');

TEMP_DATE:=TO_DATE(MELADY_DATE,'DD/MM/YYYY');

DBMS_SESSION.SET_NLS('NLS_CALENDAR','''ARABIC HIJRAH''');

SELECT TO_CHAR(TEMP_DATE,'DD/MM/YYYY') INTO HIJRAH_DATE FROM DUAL;

RETURN(HIJRAH_DATE);

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

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

أخيكم // فريد

#2

السلام عليكم

الاخ فريد

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

ماهي القيمة التى ترسلها عندما تستدعي الدالة ، واذ امكن تشرح لنا شوي عن اوامر الدالة .

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

http://arabteam.nicmatic.com/vb/showthread...63&pagenumber=1

وهي ما يحتاجه كل من يتعامل مع التاريخ الهجري على انه الاساس وهل يمكن تفيير NLS_CALENDAR في ال SQL الى ARABIC HIJRAH ليتم التعامل مع التاريخ الهجري على انه هجري وليس ميلادي

امل من الجميع التعاون لحل هذه المشكلة واحتساب الاجر من الله

#3

التعامل مع الدالة بسيط وهو كالتالي :

** نفرض ان هناك item في فورم له الاسم ITEM1 والـDATA TYPE له CHAR وMAXLENGTH له 10 وهناك BUTTON وكتبنا في حدث WHEN- BUTTON-PRESSED ما يلي :-----------

:ITEM1:=MELADY_TO_HIJRAH('15/08/2001');

+++++++++++++++++

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

+++++++++++++++++++++++

أما بخصوص المشكلة التي أثارها "الفقير إلى الله" فهذه ليست مشكلة ولكن كل من أوراكل وميكروسوفت عندهم نفس الموضوع ، أي أن كلا الشركتين التاريخ الهجري تم ضبطه مقدماً على قيم معينة بفرضيات معينة فمثلاً لوأنه حسب هذه الفرضيات أن شركة أوراكل عندها شهر محرم 29 يوم وأنت أدخلت 30 محرم سيتم تحويله مباشرة إلى 1 صفر =========هذا هو الموضوع ===============

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

أخيكم / فريد

#4

الأخ العزيز

جزاكم الله خير الجزاء

فلقد جربت هذه الطريقة ونجحت ولله الحمد

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

ـــــــــــــــــــــــــــ

وآخر دعونا أن الحمد لله رب العالمين

محمد المتولي

#5

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

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

في ال SQL الى ARABIC HIJRAH والعكس ايضا ليتم التعامل مع التاريخ الهجري على انه هجري وليس ميلادي

والعكس ايضا .

فالحل هو :

لتحويل التاريخ من ميلادي الى هجري :

;'SQL>ALTER SESSION SET NLS_CALENDAR = 'ARABIC HIJRAH

اذا تم تنفيذ هذا الامر بنجاح فسوف تظهر لك هذه الرساله

.Session altered

ولتحويل التاريخ من هجري الى ميلادي :

;'SQL>ALTER SESSION SET NLS_CALENDAR = 'GREGORIAN

اذا تم تنفيذ هذا الامر بنجاح فسوف تظهر لك هذه الرساله

.Session altered

وللتاكد من صحه ذلك الرجاء تنفيذ جمله select التاليه قبل وبعد تحويل التاريخ .

;SQL>SELECT TO_CHAR(SYSDATE,'DD/MM/YYYY') FROM DUAL

ولقد قمت بعمل نموذج ( Form ) صغير جدا يقوم بإظهار تاريخ الجهاز بالهجري وبالميلادي

عن طريق ال 6.0 DELVELOPER ويعمل على اي إصدار من إصدارات قواعد بيانات اوراكل (7 ،8 ، 8i ، 9i) .

ومن يريد نسخه منه فليرسل لى ايميل وسوف ارسله له .

عمر باعقيل

المدينه المنوره

BAAQEEL@ONEBOX.COM

#6

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

الاخ الفاضل فريد

الاخوه الافاضل

أولا احب اشكر الاخ فريد على الداله الخاصه

بتحويل التاريخ من هجري الى ميلادي والتى عملت لدي ولكن احب ان اذكر

بعض الملاحظات التى قد تفيد الاخوان هنا .

1- الداله عملت وبكل نجاح تام والحمد لله ولكنها لم تعمل معي في قاعدة بيانات 7

(أرجوا من الاخوان أن يخبروني إذا عملت لديهم في قاعدة بيانات 7 )

حيث عملت لدي على قاعدة بيانات 8i وانا استخدم الاثنان في جهازي ( 7 و 8i ) .

( لقد وصلني ايميل من أحد الاخوان يريد تحويل الداله من تحويل تاريخ ميلادي إلى هجري

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

2- يمكن تحويل الداله لكى تقوم بتحويل التاريخ من هجري الى ميلادي

وذلك كالتالى سوف تصبح الداله :

FUNCTION HIJRAH_TO_MELADY(HIJRAH_DATE VARCHAR2) RETURN VARCHAR2 IS

TEMP_DATE DATE;

MELADY_DATE VARCHAR2(30);

BEGIN

DBMS_SESSION.SET_NLS('NLS_CALENDAR','''ARABIC HIJRAH''');

TEMP_DATE:=TO_DATE(HIJRAH_DATE,'DD/MM/YYYY');

DBMS_SESSION.SET_NLS('NLS_CALENDAR','''GREGORIAN''');

SELECT TO_CHAR(TEMP_DATE,'DD/MM/YYYY') INTO MELADY_DATE FROM DUAL;

RETURN(MELADY_DATE);

END;

وذلك بتغيير النوع من GREGORIAN إلى ARABIC HIJRAH في السطر الخامس

وبتغير النوع من ARABIC HIJRAH الى GREGORIAN في السطر السابع من نفس داله الاخ فريد

( لقد قمت بتغيير إسم الداله من MELADY_TO_HIJRAH الى HIJRAH_TO_MELADY للتوضيح فقط ) .

ولكن يجب أن يكون التاريخ الهجري هو التاريخ الافتراضي لل DEVELOPER و لقاعدة البيانات لكي يتم التحويل

من هجري الى ميلادي بنجاح .

ولجعل التاريخ الهجري هو التاريخ الافتراضي للDEVELOPER نقوم بعمل String Value جديده

( قيمه تسلسليه جديده ) في ال HOME الخاص بال DEVELOPER وتكون بالاسم التالى :

NLS_CALENDAR

وتكون قيمتها

ARABIC HIJRAH

وبنفس الطريقه نقوم بجعل التاريخ الهجري هو الافتراضي لقاعدة البيانات ولكن ننشئ نفس ال String Value في

الHOME الخاصه بقاعدة البيانات .

( في قاعدة بيانات 7 مع ال DEVELOPER 6 يكون الHOME للاثنان واحدا و بإسم ORACLE ).

3- يجب أن يكون نوع الحقل في الديفلوبر ( ITEM DATE TYPE ) الذي سوف يظهر عليه التاريخ

بعد التحويل من نوع CHAR أو LONG .

ولن يظهر التاريخ المحول إذا كان نوع الحقل ( ITEM DATA TYPE ) الذي سوف يظهر عليه

التاريخ بعد التحويل من نوع DATE أو NUMBER .

وإذا اردنا ان نخزن التاريخ بعد التحويل في قاعدة البيانات يجب أن يكون نوع الحقل أيضا CHAR أو LONG أو VARCHAR2 .

اكرر شكري للاخ فريد على الداله الممتازه .

عمر باعقيل

المدينه المنوره

#7

بارك الله فيك وجزاك الله خيراً على ما أضفت ...

بالنسبة لدالة التحويل من ميلادي لهجري فهي تعمل على قاعدة البيانات 7 ولكن في حالة عدم عملها فالمشكلة في هذه الحالة من قاعدة البيانات نفسها .. لأني قمت بتجربة هذه الدالة على جهاز به قاعدة البيانات 7 فلم تعمل الدالة وأعطتني رسالة خطأ لا أذكرها الآن فقمت بتجربتها على جهاز آخر به نفس القاعدة فنفذت الدالة بنجاح دو مشاكل ...

***وهناك موضوع آخر آخي عمر وهو كيفية تعويض الفارق بين التاريخ الهجري لأوراكل والتاريخ الهجري الفعلي وذلك بالزيادة او بالنقص ، إن شاء سأبدأ محاولاتي في هذا الموضوع قريباً وسأخبركم بما أريده وما توصلت إليه ..

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

فريد

#8

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

عودة لتكملة ما بدأناه في هذا الموضوع وما كنت ختمت به هذا الموضوع من قبل ألا وهو الانحراف (الاختلاف) بين تقويم أوراكل الهجري وبين دورة القمر الفعلية والتي نستخدمها لتحديد عدد أيام الشهر الهجري ولكن هذا الاختلاف لا يوجد عند أوراكل فقط ولكن حتى عندنا نحن المسلمين في تقويمنا الهجري وكذلك عند شركة مايكروسوفت ، وأقصد بالاختلاف أن اليوم مثلاً 13/12/2001م الموافق 28/9/1422هـ هذا هو التاريخ الفعلي الهجري المقابل لهذا التاريخ الميلادي ، أما لو رجعت للدالة الخاصة بأوراكل ستجد أن اليوم هو 27/9/1422هـ وهذا يعني وجود يوم فارق بين التقويم الهجري الفعلي وبين تقويم أوراكل (أعتقد لو أن الأخوة رجعوا لتقويم مايكروسوفت سيجدوا وجود هذا الاختلاف في بعض الأشهر لذلك مايكروسوفت أعطي إمكانية ضبط هذا الاختلاف في التاريخ حتى 7 أيام ) ....

لتصحح أوراكل هذا الاختلاف يتم استخدام ما يسمى بـnls calendar utility lxegen وذلك بإتباع الخطوات التالية (تم تجربة ذلك على جهاز خادم يحتوي على oracle enterprise 8i ، وبحثت في إمكانية تطبيقها على قاعدة البيانات الشخصية ولم أتمكن من ذلك ) ...

(1) إغلاق قاعدة البيانات .

(2) بواسطة الـ MS DOS PROPMT يتم تغيير مسار العمل كما يلي :

>CD ..$ORACLE_HOMEOCOMMONNLS

ثم

..$ORACLE_HOMEOCOMMONNLS > EDIT LXECAL.NLT

ثم داخل هذا الملف نكتب ما يلي :

define calendar

calendar_name = "arabic hijrah"

define calendar_deviation

deviation_data = {

<"dec-16-2001 ad">:1

}

enddefine calendar_deviation

enddefine calendar

*** ملاحظات مهمة جداً :-

تعويض الانحراف بالزيادة دائماً يكون في الأيام الميلادية المقابلة للأيام الهجرية التالية(29 و30 و 31 من الشهر ) مع العلم أن ذلك فيه شيء من عدم الصحة ولكن أعتقد الأكثر استخداماً في هذه الأيام هو اليوم 30 لأننا قد نرغب في جعل شهر 29 يوماً فقط بدلاً من 30 يوم فنضيف يوم لليوم الميلادي المقابل لليوم 30 هجري فيصبح اليوم الهجري 1 من الشهر التالي .

أما تعويض الانحراف بالنقص فيتم في اليوم الميلادي المقابل لليوم 1 من الشهر الهجري وذلك لتحويل شهر هجري من 29 يوم لـ 30 يوم وذلك بإضافة 11 لطرح يوم أو 12 لطرح يومين وهكذا .

هذه العمليات لا بد من إجرائها في وقتها المناسب مع ملاحظة أن كل عمليات تعويض الانحراف بالزيادة والنقص لا بد من وضعها في ملف واحد وذلك بتكرار سطر الـ DEVIATION DATA حسب الحاجة .

(3) ننفذ هذا الأمر ونحن في نفس المكان

…..$ORACLE_HOMEOCOMMONNLS > LXEGEN

يتم بعد تنفيذ هذا الأمر بدون أخطاء عمل إنشاء لملف له الاسم LXECALAH.NLB ولو نظرت عليه الآن تحت مسارنا ستجده بالفعل موجود .

(4) الآن قم بتشغيل قاعدة البيانات وجرب استخدام الدالة التي كنا نستخدمها في تحويل التاريخ ستجد أن شهر رمضان أصبح 29 يوماً .

(5) سيلاحظ الأخوة أن هذا الموضوع لم يضبط كاملاً من أوراكل حتى الآن لذلك ستلاحظوا وجود أخطاء في منتهى الغرابة ، أرجو منكم أن تجربوا هذا الأمر في حالات مختلقة وستلاحظوا ما أقول .

(6) يفضل نسخ هذا الموضوع ونقله على MS WORD حتى تتمكن من قراءته بالطريقة السليمة .

مع تمنياتي لكم بالتوفيق وأرجو أن يوافونا الإخوان بالنتائج للفائدة .

وكل عام وأنتم بخير .

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

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