التاريخ الهجري المدخل h_date CHAR
التاريخ الميلادي الناتج gdate CHAR
يتم ادخال التاريخ الهجري باي شكل
لفصل السنة عن بقية التاريخ
PROCEDURE HDATE_YEAR (H_YEAR OUT NUMBER) IS
BEGIN
SELECT TO_NUMBER(DECODE(LENGTH(DECODE(LENGTH(SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0,
INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),
INSTR(:H_DATE, '/'))+1),
INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1))+1,
4)),1, '0'||SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),
INSTR(:H_DATE, '/'))+1),
0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),
INSTR(:H_DATE, '/'))+1),
INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),
INSTR(:H_DATE, '/'))+1))+1, 4),
SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0,
INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0,
INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0,
INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1))+1, 4))),
4, DECODE(LENGTH(SUBSTR(:H_DATE,
DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
0,INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1))+1, 4)),
1, '0'||SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),
INSTR(:H_DATE, '/'))+1),
0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),
INSTR(:H_DATE, '/'))+1),
INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),
INSTR(:H_DATE, '/'))+1))+1, 4),
SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0,
INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0,
INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0,
INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1))+1, 4)),
2, DECODE(LENGTH(SUBSTR(:H_DATE, 1,
DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1)), 1,
'0'||SUBSTR(:H_DATE, 1,
DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1),
2, SUBSTR(:H_DATE, 1,
DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1),
SUBSTR(:H_DATE, 1,
DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1)),
DECODE(LENGTH(SUBSTR(:H_DATE,
DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
0,INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1))+1, 4)),
1, '0'||SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),
INSTR(:H_DATE, '/'))+1),
0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),
INSTR(:H_DATE, '/'))+1),
INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),
INSTR(:H_DATE, '/'))+1))+1, 4),
SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'),0,
INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'),0,
INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'),0,
INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1))+1,
4)))) INTO H_YEAR FROM DUAL;
END;
لفصل الشهر عن التاريخ
PROCEDURE HDATE_MONTH (H_MONTH OUT NUMBER) IS
MONTH_NAME VARCHAR2(20);
BEGIN
SELECT DECODE(LENGTH(SUBSTR(:H_DATE,
DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1,
(DECODE(INSTR(:H_DATE, '/',
DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
0, INSTR(:H_DATE, '-',
DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
INSTR(:H_DATE, '/',
DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1))-DECODE(INSTR(:H_DATE, '/'), 0,
INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/')))-1)),
1, '0'||SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/'), 0,
INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1,
(DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0,
INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0,
INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0,
INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1))-DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),
INSTR(:H_DATE, '/')))-1),
2, SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),
INSTR(:H_DATE, '/'))+1,
(DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),
INSTR(:H_DATE, '/'))+1),
0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),
INSTR(:H_DATE, '/'))+1),
INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),
INSTR(:H_DATE, '/'))+1))-DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/')))-1),
SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1,
(DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
0,INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),INSTR(:H_DATE, '/'))+1))-
DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/')))-1)) INTO MONTH_NAME FROM DUAL;
IF LENGTH(MONTH_NAME)>2 THEN
SELECT TO_NUMBER(DECODE(MONTH_NAME
,'محرم',1
,'صفر',2
,'ربيع الأول',3
,'ربيع الثاني',4
,'جمادى الأولى',5
,'جمادى الثانية',6
,'رجب',7
,'شعبان',8
,'رمضان',9
,'شوال',10
,'ذو القعدة',11
,'ذو الحجة',11,0))INTO H_MONTH FROM DUAL;
ELSE
H_MONTH:=TO_NUMBER(MONTH_NAME);
END IF;
END;
لفصل اليوم عن التاريخ
PROCEDURE HDATE_DAY (H_DAY OUT NUMBER)IS
BEGIN
SELECT
DECODE(LENGTH(DECODE(LENGTH(SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'), 0,INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1)),
1,'0'||SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'),0,INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1),
2,SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1),
SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1))),
2,DECODE(LENGTH(SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),
INSTR(:H_DATE, '/'))-1)), 1,
'0'||SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'),0,INSTR(:H_DATE, '-'),
INSTR(:H_DATE, '/'))-1),
2, SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'),0,INSTR(:H_DATE, '-'),
INSTR(:H_DATE, '/'))-1),
SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),
INSTR(:H_DATE, '/'))-1)),
4, DECODE(LENGTH(SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0,
INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0,
INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'),
INSTR(:H_DATE, '/'))+1))+1, 4)),
1, '0'||SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'),0,
INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
0, INSTR(:H_DATE, '-', DECODE(INSTR(:H_DATE, '/'), 0,
INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
INSTR(:H_DATE, '/', DECODE(INSTR(:H_DATE, '/'), 0,
INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1))+1, 4),
SUBSTR(:H_DATE, DECODE(INSTR(:H_DATE, '/',
DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
0, INSTR(:H_DATE, '-',
DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1),
INSTR(:H_DATE, '/',
DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))+1))+1, 4)),
DECODE(LENGTH(SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1)), 1,
'0'||SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1),
2,SUBSTR(:H_DATE, 1, DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1),
SUBSTR(:H_DATE,1,
DECODE(INSTR(:H_DATE, '/'), 0, INSTR(:H_DATE, '-'), INSTR(:H_DATE, '/'))-1))) INTO H_DAY FROM DUAL;
END;
PROCEDURE HDATE_TO_GDATE IS
H_DAY NUMBER(2);
H_MONTH NUMBER(2);
H_YEAR NUMBER(4);
I_LOOP NUMBER:=0;
HY NUMBER;
FGDATE DATE;
begin
FGDATE:=TO_DATE('14-JUL-0622','DD-MON-YYYY');
HDATE_DAY(H_DAY);
HDATE_MONTH(H_MONTH);
HDATE_YEAR(H_YEAR);
H_YEAR:=H_YEAR-1;
H_MONTH:=H_MONTH-1;
FOR I IN 1..H_YEAR LOOP
HY:=TRUNC(I/30)*30;
IF (I-HY) IN (2,5,7,10,13,16,18,21,24,26,29) THEN
I_LOOP:=I_LOOP+355;
ELSE
I_LOOP:=I_LOOP+354;
END IF;
END LOOP;
FOR J IN 1..H_MONTH LOOP
IF J IN (1,3,5,7,9,11) THEN
I_LOOP:=I_LOOP+30;
END IF;
IF J IN(2,4,6,8,10) THEN
I_LOOP:=I_LOOP+29;
END IF;
HY:=TRUNC(H_YEAR/30)*30;
IF J=12 AND (H_YEAR-HY) IN (2,5,7,10,13,16,18,21,24,26,29) THEN
I_LOOP:=I_LOOP+30;
ELSIF J=12 AND (H_YEAR-HY) NOT IN (2,5,7,10,13,16,18,21,24,26,29) THEN
I_LOOP:=I_LOOP+29;
END IF;
END LOOP;
I_LOOP:=I_LOOP+H_DAY;
FGDATE:=FGDATE+I_LOOP;
:GDATE:=TO_CHAR(FGDATE,'DD-MON-YYYY');
END;
وتتم المناداة عن طريق كتابة اسم البروسيدجر HDATE_TO_GDATE في WHEN_BUTTON_PRESSED