GDZW#30880: Ook 5e dag van de maand mogelijk maken bij herhalen reserveren.
svn path=/Database/trunk/; revision=23347
This commit is contained in:
119
FAC/FAC_PAC.SRC
119
FAC/FAC_PAC.SRC
@@ -3991,17 +3991,21 @@ CREATE OR REPLACE PACKAGE BODY fac AS
|
||||
p_bits IN NUMBER)
|
||||
RETURN DATE
|
||||
IS
|
||||
fromdate DATE;
|
||||
fromdow NUMBER;
|
||||
fromdom NUMBER;
|
||||
todaydow NUMBER;
|
||||
inspdate DATE;
|
||||
nextday NUMBER;
|
||||
lastday DATE;
|
||||
w_bits NUMBER;
|
||||
m_bits NUMBER;
|
||||
w_day_n NUMBER;
|
||||
w_day_v VARCHAR2(10);
|
||||
fromdate DATE;
|
||||
fromdateplusperiode DATE;
|
||||
fromdow NUMBER;
|
||||
fromdom NUMBER;
|
||||
todaydow NUMBER;
|
||||
inspdate DATE;
|
||||
nextday NUMBER;
|
||||
lastday DATE;
|
||||
w_bits NUMBER;
|
||||
m_bits NUMBER;
|
||||
w_day_n NUMBER;
|
||||
w_day_v VARCHAR2(10);
|
||||
gevonden BOOLEAN;
|
||||
month1 NUMBER;
|
||||
month2 NUMBER;
|
||||
BEGIN
|
||||
IF p_periode = 0
|
||||
THEN
|
||||
@@ -4122,7 +4126,7 @@ CREATE OR REPLACE PACKAGE BODY fac AS
|
||||
-- 2 = tweede xxxdag van de maand (2^10 = 512)
|
||||
-- 3 = derde xxxdag van de maand (2^9 + 2^10 = 256 + 512 = 768)
|
||||
-- 4 = vierde xxxdag van de maand (2^11 = 1024)
|
||||
-- 5 = NOT IN USE
|
||||
-- 5 = vijfde xxxdag van de maand (2^9 + 2^11 = 256 + 1024 = 1280)
|
||||
-- 6 = <20><>n na laatste xxxdag van de maand (2^10 + 2^11 = 512 + 1024 = 1536)
|
||||
-- 7 = laatste dag van de maand (2^9 + 2^10 + 2^11 = 256 + 512 + 1024 = 1792)
|
||||
|
||||
@@ -4161,7 +4165,7 @@ CREATE OR REPLACE PACKAGE BODY fac AS
|
||||
THEN
|
||||
-- Exact eenheid maanden verder.
|
||||
inspdate := ADD_MONTHS (fromdate, p_periode);
|
||||
ELSIF m_bits > 4
|
||||
ELSIF m_bits > 5
|
||||
THEN
|
||||
CASE
|
||||
WHEN m_bits = 6 OR m_bits = 7
|
||||
@@ -4184,29 +4188,52 @@ CREATE OR REPLACE PACKAGE BODY fac AS
|
||||
-- Exact eenheid maanden verder.
|
||||
inspdate := ADD_MONTHS (fromdate, p_periode);
|
||||
END CASE;
|
||||
ELSE -- 0 < m_bits <= 4
|
||||
-- Eerste bits dag.
|
||||
-- Bepaal de eerste bits dag deze maand de y-ste xxxdag van de maand.
|
||||
inspdate := NEXT_DAY (TRUNC(fromdate, 'MONTH') - 1 + ((m_bits - 1) * 7), w_day_v);
|
||||
|
||||
-- Als de inspdate later is dan de meegegeven datum dan zijn we klaar.
|
||||
-- Als de inspdate vandaag of in het verleden ligt dan
|
||||
-- kijken we niet of er nog andere inspectiedatums in dezelfde week zijn die wel in de toekomst liggen (BEPERKING / VERSIMPELING in eerste instantie)
|
||||
-- Daarom zorgen dat er in de invoer maar 1 dag in de week gekozen kan worden.
|
||||
|
||||
-- Als inspectie datum niet in de toekomst ligt dan de eerste inspectie datum bepalen in de volgende periode maanden verder.
|
||||
IF (inspdate <= fromdate)
|
||||
ELSE -- 0 < m_bits <= 5
|
||||
gevonden := FALSE;
|
||||
IF (p_periode = 1)
|
||||
THEN
|
||||
inspdate := NEXT_DAY (TRUNC(ADD_MONTHS (inspdate, p_periode), 'MONTH') - 1 + ((m_bits - 1) * 7), w_day_v);
|
||||
ELSIF p_periode > 1 -- (inspdate > fromdate) geldt automatisch.
|
||||
THEN
|
||||
inspdate := NEXT_DAY (TRUNC(ADD_MONTHS (inspdate, p_periode - 1), 'MONTH') - 1 + ((m_bits - 1) * 7), w_day_v);
|
||||
-- Eerste bits dag.
|
||||
-- Bepaal de eerste bits dag deze maand de y-ste xxxdag van de maand. Misschien is er deze maand nog een dag te vinden.
|
||||
inspdate := NEXT_DAY (TRUNC(fromdate, 'MONTH') - 1 + ((m_bits - 1) * 7), w_day_v);
|
||||
|
||||
-- Als de nieuwe dag in de toekomst is en in dezelfde maand (i.v.m. 5de dag) dan heb je de volgende datum gevonden.
|
||||
-- Maar dan mag de datum niet een feestdag zijn als de checkbox "Niet op feestdagen" is aangevinkt.
|
||||
month1 := TO_NUMBER(TO_CHAR (fromdate, 'MM'));
|
||||
month2 := TO_NUMBER(TO_CHAR (inspdate, 'MM'));
|
||||
IF (inspdate > fromdate AND month1 = month2) AND NOT ((BITAND(p_bits, 128) = 128) AND isdatefeestdag(inspdate))
|
||||
THEN
|
||||
gevonden := TRUE;
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
IF NOT gevonden
|
||||
THEN
|
||||
-- Voor (p_periode = 1) niets gevonden of (p_periode > 1).
|
||||
inspdate := NEXT_DAY (TRUNC(ADD_MONTHS (fromdate, p_periode), 'MONTH') - 1 + ((m_bits - 1) * 7), w_day_v);
|
||||
|
||||
IF (m_bits = 5)
|
||||
THEN
|
||||
-- Is er wel een vijfde dag in de maand. Is de fromdate + periode in dezelfde maand als de nieuw berekende inspdate?
|
||||
fromdateplusperiode := ADD_MONTHS (fromdate, p_periode);
|
||||
month1 := TO_NUMBER(TO_CHAR (fromdateplusperiode, 'MM'));
|
||||
month2 := TO_NUMBER(TO_CHAR (inspdate, 'MM'));
|
||||
IF (month1 <> month2)
|
||||
THEN
|
||||
-- Er is geen vijfde dag in de maand. De volgende bepalen.
|
||||
inspdate := calcnextcyclusdate (fromdateplusperiode, p_mode, p_eenheid, p_periode, p_bits);
|
||||
ELSIF (BITAND(p_bits, 128) = 128) AND isdatefeestdag(inspdate)
|
||||
THEN
|
||||
-- De datum is een feestdag en de checkbox "Niet op feestdagen" is aangevinkt. De datum overslaan en bepaal de volgende inspectiedatum.
|
||||
inspdate := calcnextcyclusdate (inspdate, p_mode, p_eenheid, p_periode, p_bits);
|
||||
END IF;
|
||||
ELSE
|
||||
IF (BITAND(p_bits, 128) = 128) AND isdatefeestdag(inspdate)
|
||||
THEN
|
||||
-- De datum is een feestdag en de checkbox "Niet op feestdagen" is aangevinkt. De datum overslaan en bepaal de volgende inspectiedatum.
|
||||
inspdate := calcnextcyclusdate (inspdate, p_mode, p_eenheid, p_periode, p_bits);
|
||||
END IF;
|
||||
END IF;
|
||||
END IF;
|
||||
END IF;
|
||||
IF (BITAND(p_bits, 128) = 128) AND isdatefeestdag(inspdate)
|
||||
THEN
|
||||
-- Checkbox "Niet op feestdagen" is aangevinkt en de datum is een feestdag. De datum overslaan en bepaal de volgende inspectiedatum.
|
||||
inspdate := calcnextcyclusdate (inspdate, p_mode, p_eenheid, p_periode, p_bits);
|
||||
END IF;
|
||||
END;
|
||||
WHEN 4
|
||||
@@ -4214,18 +4241,18 @@ CREATE OR REPLACE PACKAGE BODY fac AS
|
||||
BEGIN
|
||||
-- jaarlijks
|
||||
inspdate := ADD_MONTHS (fromdate, p_periode * 12);
|
||||
IF p_bits > 0
|
||||
THEN
|
||||
lastday := LAST_DAY(ADD_MONTHS (TRUNC(inspdate, 'YEAR'), 11));
|
||||
inspdate := ADD_MONTHS (TRUNC(inspdate, 'YEAR'), p_bits - 1);
|
||||
IF inspdate > lastday -- was p_bits groter dan het aantal maanden in het jaar? Dan de laatste dag van de laatste maand van het jaar nemen.
|
||||
THEN
|
||||
inspdate := lastday;
|
||||
ELSE
|
||||
fromdom := fromdate - TRUNC(fromdate, 'MONTH');
|
||||
inspdate := inspdate + fromdom;
|
||||
END IF;
|
||||
END IF;
|
||||
IF p_bits > 0
|
||||
THEN
|
||||
lastday := LAST_DAY(ADD_MONTHS (TRUNC(inspdate, 'YEAR'), 11));
|
||||
inspdate := ADD_MONTHS (TRUNC(inspdate, 'YEAR'), p_bits - 1);
|
||||
IF inspdate > lastday -- was p_bits groter dan het aantal maanden in het jaar? Dan de laatste dag van de laatste maand van het jaar nemen.
|
||||
THEN
|
||||
inspdate := lastday;
|
||||
ELSE
|
||||
fromdom := fromdate - TRUNC(fromdate, 'MONTH');
|
||||
inspdate := inspdate + fromdom;
|
||||
END IF;
|
||||
END IF;
|
||||
-- werking van cyclus_bits tbd
|
||||
END;
|
||||
END CASE;
|
||||
|
||||
Reference in New Issue
Block a user