إنتقال للمحتوى

  • تسجيل الدخول عبر الفيس بوك تسجيل الدخول عبر تويتر Log In with LinkedIn Log In with Google      تسجيل دخول    
  • إنشاء حساب

صورة
- - - - -

فكرة جديدة لحل مشكلة التاريخ الهجري


36 رد (ردود) على هذا الموضوع

#1 Amateur

Amateur

    مشترك

  • الأعضــاء
  • 132 مشاركة

تاريخ المشاركة 26 December 2006 - 09:54 AM

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

راح اضع لكم اليوم function لتحويل التاريخ الميلادي للتاريخ الهجري.. وفكرة هذه function أتت بعد ما استخدمت الـ function و الـ procedure الموجوده في المنتدى ووجدت بعض اختلافات التواريخ فيها ومشكلة دخول هلال رمضان والحج فكما الجميع يعلم ان التاريخ الهجري خصوصا في بعض اشهره يعتمد على روية الهلال وقد يتغير التاريخ في التقويم عن التاريخ الفعلي بعد رؤية الهلال.. من هنا جلست مع نفسي وحاولت أن أجد حلا لهذه المشكلة..

مبدأ عمل الـ function
بشكل عام تعتمد على جدول يقوم من خلاله المستخدم بتحديد بداية التاريخ الميلادي بمايقابله بالتاريخ الهجري ويحدد عدد أيام التاريخ الهجري ومن خلال هذا الجدول تتم المقارنات..

مثال:

G_MONTH                               1
G_YEAR 2007
G_DATE 01-01-2007
H_DAY 11
H_MONT 12
H_YEAR 1427
H_DATE 11-12-1427
N_DAY 29



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

والسبب وضع التواريخ بهذا الشكل انه في حال ارسال تاريخ ميلادي للـ function وليكن مثلا 2007-01-01 سيتم ارجاع التاريخ الهجري المقابل له فورا من دون عمل أي عملية للتاريخ عدا ذلك ستجدون مبدأ العمل داخل الكود.. ولمن أراد شرح للكود أنا مستعد..

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

أتمنى من الجميع الاستفاده منها.. والدعاء لي بالتوفيق في الدنيا والآخرة

ومن يصعب عليه تطبيقها أنا سأكون متواجد للاجابة على أي استفسار.. من اليوم 2007-12-26 حتى 2007-12-28 وسأنقطع فترة الاجازة ثم سأعود من جديد بتاريخ 2008-01-06

(ستجدون بالأسفل تتابعا الكود الخاص بالـ function يليه السكربت لانشاء الجدول الخاص بها)

CREATE OR REPLACE FUNCTION DATE_CONVERTER (GREG_DATE DATE)RETURN DATE IS
GDATE DATE;
H_D NUMBER;
H_M NUMBER;
H_Y NUMBER;
HDATE DATE;
N_D NUMBER;
BEGIN /********************** CREATED BY AMATURE ORACLE **************************/
SELECT GREG, HIJRA
INTO GDATE, HDATE
FROM GDATE_TO_HDATE WHERE G_YEAR = TO_CHAR(GREG_DATE,'YYYY') AND G_MONTH = TO_CHAR(GREG_DATE,'MM');


IF GREG_DATE = GDATE THEN
RETURN HDATE;

ELSE IF GREG_DATE > GDATE THEN

BEGIN SELECT H_DAY, H_MONTH, H_YEAR, HIJRA, N_DAY
INTO H_D, H_M, H_Y, HDATE, N_D
FROM GDATE_TO_HDATE WHERE G_YEAR = TO_CHAR(GREG_DATE,'YYYY') AND G_MONTH = TO_CHAR(GREG_DATE,'MM');

IF N_D = 29 THEN
BEGIN IF TO_NUMBER(TO_CHAR(GREG_DATE,'DD')) + H_D > N_D AND TO_NUMBER(TO_CHAR(GREG_DATE,'DD')) + H_D > 30 THEN
RETURN ((TO_NUMBER(TO_CHAR(GREG_DATE,'DD') + H_D) - N_D)-1|| '-' || (H_M+1) || '-' || H_Y);

IF TO_NUMBER(TO_CHAR(GREG_DATE,'DD')) + H_D > N_D AND TO_NUMBER(TO_CHAR(GREG_DATE,'DD')) + H_D = 30 THEN
RETURN ((TO_NUMBER(TO_CHAR(GREG_DATE,'DD')) + H_D)-1|| '-' || (H_M) || '-' || H_Y);

ELSE IF TO_NUMBER(TO_CHAR(GREG_DATE,'DD')) + H_D < N_D THEN
RETURN (TO_NUMBER(TO_CHAR(GREG_DATE,'DD') + H_D) - 1 || '-' || (H_M) || '-' || H_Y);

ELSE IF TO_NUMBER(TO_CHAR(GREG_DATE,'DD')) + H_D = N_D THEN
RETURN (((TO_NUMBER(TO_CHAR(GREG_DATE,'DD')) + H_D)-1) || '-' || H_M || '-' || H_Y);
END IF;
END IF;
END IF;
END IF;
END;
ELSE IF N_D = 30 THEN
BEGIN IF TO_NUMBER(TO_CHAR(GREG_DATE,'DD')) + H_D < N_D THEN
RETURN (TO_NUMBER(TO_CHAR(GREG_DATE,'DD') + H_D) - 1 || '-' || H_M || '-' || H_Y);

ELSE IF TO_NUMBER(TO_CHAR(GREG_DATE,'DD')) + H_D > N_D AND (TO_NUMBER(TO_CHAR(GREG_DATE,'DD')) + H_D) - N_D != 1 THEN
RETURN ((TO_NUMBER(TO_CHAR(GREG_DATE,'DD') + H_D) - N_D)-1 || '-' || (H_M + 1) || '-' || H_Y);

ELSE IF TO_NUMBER(TO_CHAR(GREG_DATE,'DD')) + H_D > N_D AND (TO_NUMBER(TO_CHAR(GREG_DATE,'DD')) + H_D) - N_D = 1 THEN
RETURN ((TO_NUMBER(TO_CHAR(GREG_DATE,'DD') + H_D) - 1) || '-' || (H_M) || '-' || H_Y);


ELSE IF TO_NUMBER(TO_CHAR(GREG_DATE,'DD')) + H_D = N_D THEN
RETURN ( ((TO_NUMBER(TO_CHAR(GREG_DATE,'DD')) + H_D) -1) || '-' || (H_M) || '-' || H_Y);

END IF;
END IF;
END IF;
END IF;
END;
END IF;
END IF;
END;
END IF;
END IF;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END;


TABLE GDATE_TO_HDATE
(G_MONTH NUMBER(2),
G_YEAR NUMBER(4),
GREG DATE,
H_DAY NUMBER(2),
H_MONTH NUMBER(2),
H_YEAR NUMBER(4),
HIJRA DATE,
N_DAY NUMBER(2));


تمت إضافة الملف بالمرفقات
إدارة المنتدي

ملفات مرفقة


  • ضياءهزاع معجب بهذا
سبحان الله والحمد لله ولا إله إلا الله والله أكبر ولا حول ولا قوة إلا بالله العلي العظيم

أستغفر الله.. أستغفر الله.. أستغفر الله

سبحان الله وبحمده.. سبحان الله العظيم


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

#2 محمد سعيد

محمد سعيد

    عضو مميز

  • الأعضــاء
  • 534 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 26 December 2006 - 12:43 PM

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

#3 sky information

sky information

    عضو نشط

  • الأعضــاء
  • 337 مشاركة

تاريخ المشاركة 27 December 2006 - 04:27 PM

جزاك الله خير ....................................

مشكــــــــــــــــــــــــــــــــــــــور على هذا المثال والفكرة جدا رائعة

#4 Amgad

Amgad

    مشرف عام ومشرف قسم تحليل النظم

  • الفريق الإداري
  • 4,558 مشاركة
  • الاسم الأول:امجد
  • اسم العائلة:حلمي
  • البـلـد: Country Flag
  • المنصب الحالي:Business Systems Analyst at al Fanar Co. Riyadh KSA

تاريخ المشاركة 27 December 2006 - 08:27 PM

شكرا لك على هذا المجهود وهذه الفكرة الجديدة ..

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

اذا كان لدى تاريخ التعيين مثلا من ضمن حقول جدول الموظفين سيكون النوع date
هل سيتم تخزين التاريخ فى قاعدة البيانات على اساس انه ميلادى أو هجري ؟؟

- هل سيتم التحويل الى التاريخ الهجري قبل الحفظ مباشرة .

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

- فى حالة الفرز على التاريخ مثلا .. هل سيكون قبل التحويل ام بعد التحويل ؟؟

ايهما افضل ان يخزن التاريخ بالميلادى ثم تستخدم هذه الطريقه للتحويل
ام ان يحفظ التاريخ بالشكل الهجري مباشرة ؟؟

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

شكرا لك مرة اخرى

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


....


#5 محمد علي الحيلان

محمد علي الحيلان

    مشترك

  • الأعضــاء
  • 82 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 27 December 2006 - 10:56 PM

شكرا اخي على هذا المجهود الطيب وفكرة فعلا تستحق التقدير وجزاك الله خير
والذي اعرفه بخصوص مشكلة التاريخ العربي له ثلاثة حلول
1- يوجد جدول جاهز به التاريخ العربي لمدة عشر سنوات ويستعملة كثير من المبرمجين
2- ان تأخذ التاريخ العربي من المستخدم عند الدخول للبرنامج وتخزنه بحقل وبجواره حقل اخر للتاريخ الميلادي
والمقارنة تكون بالميلادي
3- ان تأخذ التاريخ من الجهاز وفي حالة النقصان تزيد في نظام الوندز وعند المقارنة تحول التاريخ العربي الى رقم
مضروب اليوم بواحد والشهر بثلاثين والسنة ب 354
هذه للفائده --- اما فكرتك فهي حل جذري ان شاء الله
بالتوفيق
لااله الا الله محمد رسول الله

#6 Amateur

Amateur

    مشترك

  • الأعضــاء
  • 132 مشاركة

تاريخ المشاركة 28 December 2006 - 09:12 AM

شكرا للردود والتجاوب...

الاخ/ sky_information شكرا لك..

الأخ/ Amged
بحصولك على التاريخ الهجري بعد مقارنته بالتاريخ الميلادي من الممكن ان تعمل كل شيء لنفرض مثل..

ليكن عندك شاشة تحتوي على عدة أعمدة منها عمود للتاريخ الميلادي وعمود آخر للهجري بامكانك ان تضع أي تريجر تراه مناسب إما post أو key_next على عمود الميلادي وسيتم عرض التاريخ الهجري أو تعمل تريجر على مستوى الفورم pre_commit أو on_commit يتم من خلاله فقط إرسال التاريخ الميلادي للـ function ليتم عرض التاريخ الهجري غرار الكود التالي وللعلم ان استخدم الـ function فقط في طباعة التقارير أنا أقوم بحفظ التاريخ ميلادي وعند طباعة التقارير يتم اظهار التاريخ الهجري.. وللعلم بامكانك تستخدم التاريخ الهجري حتى في الحفظ وتعمل معاك 100% ان شاء الله وفي ارسال التاريخ للتقرير..

begin select date_converter(:g_date) into :h_date from dual; end;


المثال السابق يوضح كيفية إستخدم الـ function في الفورم..

الأخ/ محمد علي
شكرا جزيلا على ردك الجميل..

تم التعديل بواسطة Amateur, 28 December 2006 - 01:08 PM.

سبحان الله والحمد لله ولا إله إلا الله والله أكبر ولا حول ولا قوة إلا بالله العلي العظيم

أستغفر الله.. أستغفر الله.. أستغفر الله

سبحان الله وبحمده.. سبحان الله العظيم


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

#7 Amgad

Amgad

    مشرف عام ومشرف قسم تحليل النظم

  • الفريق الإداري
  • 4,558 مشاركة
  • الاسم الأول:امجد
  • اسم العائلة:حلمي
  • البـلـد: Country Flag
  • المنصب الحالي:Business Systems Analyst at al Fanar Co. Riyadh KSA

تاريخ المشاركة 28 December 2006 - 01:41 PM

الأخ / Amateur

شكرا لك على الايضاح

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

واعتقد اننا سننتظر منك المزيد .. من الحلول الجذرية ..

شكرا لك مرة اخرى

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


....


#8 Amateur

Amateur

    مشترك

  • الأعضــاء
  • 132 مشاركة

تاريخ المشاركة 06 January 2007 - 10:30 AM

شكرا لكم وكل عام وانتم بخير
سبحان الله والحمد لله ولا إله إلا الله والله أكبر ولا حول ولا قوة إلا بالله العلي العظيم

أستغفر الله.. أستغفر الله.. أستغفر الله

سبحان الله وبحمده.. سبحان الله العظيم


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

#9 محمد علي الحيلان

محمد علي الحيلان

    مشترك

  • الأعضــاء
  • 82 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 06 January 2007 - 11:05 AM

اخي Amateur
السلام عليكم ورحمة الله وبركاتة:-
كل عام وانت بخير ياخي

احب استوضح عن الاتي :
اولا – انا طبقت الكود واشتغل لكن المشكلة في الاتي
1- انا ادخلت البيانا كالتي:
2- الشهر الميلاد 1
3- السنه الميلادية 2007
4- التاريخ الميلادي 2007/01/01
5- اليوم الهجري 11
6- الشهر الهجري 12
7- السنة الهجرية 1427
8- التاريخ الهجري 1427/12/11
9- عدد ايام الشهر الهجري 29
--
سوالي :
حينما اطلب التاريخ 2007/01/02
لايعطيني التاريخ الهجري الذي يوافقة بل يعطي استثناء غير معالج والمفروض ان يعطين هذا التاريخ بالهجري
1427/12/12
هل يتم ادخال بيانات كل يوم بالصفة السابقة ام يكفي ان ادخل بيانات بداية كل شهر يعني السنة 12 سجل فقط
واذا كان بيانات كل يوم يتم ادخاليها حيكون 360 سجل في السنة فهذه طريقة متعبة0

ارجو الايضاح عزيزي ولك شكري وتقديري ،،،
لااله الا الله محمد رسول الله

#10 Amateur

Amateur

    مشترك

  • الأعضــاء
  • 132 مشاركة

تاريخ المشاركة 06 January 2007 - 11:47 AM

أخي محمد

لايتم ادخال 360 سجل ولو كان كذلك لفسدت البرمجة...!!

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

ولايوجد اي استثناء فقط قم بانشاء الـ function واعمل لها compile وادخل فيها بيانات الاشهر واستخدم الكود التالي في sql وستظهر النتيجة صحيحة كماهي موجوده عندي

select date_converter('02-01-2007') 
from dual result is
12-12-1427


انتظر ردك

تم التعديل بواسطة Amateur, 06 January 2007 - 11:49 AM.

سبحان الله والحمد لله ولا إله إلا الله والله أكبر ولا حول ولا قوة إلا بالله العلي العظيم

أستغفر الله.. أستغفر الله.. أستغفر الله

سبحان الله وبحمده.. سبحان الله العظيم


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

#11 محمد علي الحيلان

محمد علي الحيلان

    مشترك

  • الأعضــاء
  • 82 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 06 January 2007 - 08:11 PM

شكرا اخي Amateur
علي سرعة اجبتك 0 وهذا يدل على كرم اخلاقك جعل الله ماتقدمه في موازين حسناتك وكثر الله من امثالك
ولكن العملية لم تضبط معي 00 واكيد الخطاء عندي لايخرج عن احتمالين
1- اما ان تنسيق التاريخ في قاعدة البيانات يختلف عن مافي FUNCTION
2- او يجب ادخال عدد 12 سجل للسنة حتى تتم المقارنة بين جميع الاشهر 29 - 30
ورقم الخطاء هو
45735
سوف احاول واخبرك بالنتيجة ان شاء الله
لك شكري وتقدير واحترامي ،،،،،
لااله الا الله محمد رسول الله

#12 omar-alreyati

omar-alreyati

    عضو مميز

  • الأعضــاء
  • 596 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 07 January 2007 - 09:15 AM

يا ريت لو تشرح النا اشويه من هالكود.......

وشكراً

بالله عليكم لا تنسوني من دعاءكم الصالح
لا تنسوا أهل غزة والعراق والمجاهدين من دعاءكم

#13 Amateur

Amateur

    مشترك

  • الأعضــاء
  • 132 مشاركة

تاريخ المشاركة 07 January 2007 - 09:22 AM

أخي محمد:

للعلم انا لم أقم الا بادخال 5 أشهلا فقط من 2007 ولم اجد اي عثرة وبالنسبة لتنسيق التاريخ لايعمل مشكلة وتنسيق التاريخ في قاعدة البيانات هو DD-MM-YYYY

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

بامكانك تقوم بتعديل بسيط على كود الـ FUNCTION وتكتب في معالجة الخطأ


exception
when others then
message(sqlerrm)


ليخبرك ماهو الخطأ

تم التعديل بواسطة Amateur, 07 January 2007 - 09:26 AM.

سبحان الله والحمد لله ولا إله إلا الله والله أكبر ولا حول ولا قوة إلا بالله العلي العظيم

أستغفر الله.. أستغفر الله.. أستغفر الله

سبحان الله وبحمده.. سبحان الله العظيم


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

#14 محمد علي الحيلان

محمد علي الحيلان

    مشترك

  • الأعضــاء
  • 82 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 07 January 2007 - 11:48 AM

اخي Amateur شكرا لاهتمامك
لقد حاولت وكان الخطاء ب SQL كالتالي:-


SQL> select date_converter('02-01-2007')
2 from dual
3 /
select date_converter('02-01-2007')
*
يوجد خطاء عن السطر 1
ORA-06503: PL/SQL: الوظيفة عادة بدون قيمة
ORA-06512: "HGVPLK.DATE_CONVERTER", line 101
لااله الا الله محمد رسول الله

#15 Amateur

Amateur

    مشترك

  • الأعضــاء
  • 132 مشاركة

تاريخ المشاركة 07 January 2007 - 12:14 PM

اخي محمد بصراحة أنا أستغرب ان الـ function تقوم بارجاع error لان اذا كان التاريخ غير المرسل لايمكن مقارنته اي غير مسجل له شيء بالجدول الاساسي يتم ارجاع قيمه فارغة من الممكن احتمالية date_format لقاعدة البيانات اهو سبب المشكلة لديك.. استعمل الكود التالي..

select date_converter(to_date('02-01-2007','dd-mm-yyyy')) from dual;

بانتظار ردك..
سبحان الله والحمد لله ولا إله إلا الله والله أكبر ولا حول ولا قوة إلا بالله العلي العظيم

أستغفر الله.. أستغفر الله.. أستغفر الله

سبحان الله وبحمده.. سبحان الله العظيم


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