FMHN#90557: Reserveringsfout ondanks correcte invoer.

svn path=/Database/trunk/; revision=70492
This commit is contained in:
Maykel Geerdink
2025-10-01 14:31:25 +00:00
parent 89cf1645f2
commit 0834147f77

View File

@@ -209,6 +209,7 @@ AS
new_ruimte_van DATE;
new_ruimte_tot DATE;
bez_parkingdiscipline_key NUMBER;
min_res_rsv_artikel_key res_rsv_artikel.res_rsv_artikel_key%TYPE;
BEGIN
SELECT *
INTO rsv_from
@@ -434,55 +435,86 @@ AS
-- Artikel is al toegevoegd indien catering is aangevinkt.
-- De kenmerken van de oude en nieuwe reserveringen zijn exact hetzelfde met dezelfde kenmerk keys enz.
-- De kenmerken van de oude en nieuwe reservering in dezelfde volgorde zetten en dan de waarden overnemen.
INSERT INTO res_kenmerkartikel (res_rsv_artikel_key,
res_kenmerk_key,
res_kenmerkartikel_waarde)
SELECT newkenmerk.res_rsv_artikel_key,
newkenmerk.res_kenmerk_key,
oldkenmerk.res_kenmerkartikel_waarde
FROM (SELECT ka.res_rsv_artikel_key,
ka.res_kenmerk_key,
ka.res_kenmerkartikel_waarde,
ra.res_artikel_key,
k.res_srtkenmerk_key
FROM res_kenmerkartikel ka,
res_kenmerk k,
res_srtkenmerk sk,
res_rsv_ruimte rr,
res_rsv_artikel rra,
res_artikel ra
WHERE ka.res_kenmerk_key = k.res_kenmerk_key
AND k.res_srtkenmerk_key = sk.res_srtkenmerk_key
AND (k.res_artikel_key = rra.res_artikel_key
OR k.res_discipline_key = ra.res_discipline_key)
AND ra.res_artikel_key = rra.res_artikel_key
AND ka.res_rsv_artikel_key = rra.res_rsv_artikel_key
AND rra.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
--AND k.res_activiteit_key IS NULL -- Niet nodig: Als res_activiteit_key gevuld is dan is res_kenmerk_niveau 'A'.
AND k.res_kenmerk_niveau IN ('C', 'D')
AND BITAND(k.res_kenmerk_rolcode, 7) <> 4 -- Backofficekenmerken niet (100)
AND k.res_kenmerk_verwijder IS NULL
AND ka.res_kenmerkartikel_verwijder IS NULL
AND sk.res_srtkenmerk_kenmerktype NOT IN ('F', 'M', 'E')
AND rr.res_rsv_ruimte_key = prsv_ruimte_key_from) oldkenmerk,
(SELECT rra.res_rsv_artikel_key,
k.res_kenmerk_key,
ra.res_artikel_key,
k.res_srtkenmerk_key
FROM res_rsv_ruimte rr,
res_rsv_artikel rra,
res_artikel ra,
res_kenmerk k
WHERE rra.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
AND (k.res_artikel_key = rra.res_artikel_key
OR k.res_discipline_key = ra.res_discipline_key)
AND ra.res_artikel_key = rra.res_artikel_key
AND rr.res_rsv_ruimte_key = prsv_ruimte_key_to) newkenmerk
WHERE oldkenmerk.res_kenmerk_key = newkenmerk.res_kenmerk_key
AND oldkenmerk.res_srtkenmerk_key = newkenmerk.res_srtkenmerk_key
AND oldkenmerk.res_artikel_key = newkenmerk.res_artikel_key
ORDER BY newkenmerk.res_rsv_artikel_key,
newkenmerk.res_kenmerk_key;
-- Een artikel kan vaker voorkomen met een andere waarde van zijn kenmerk.
-- In dat geval kunnen de kenmerken niet rechtstreeks gematched worden. Een "oud" res_rsv_artikel_key kan dan gematched worden aan meerdere "nieuwe" res_rsv_artikel_key's.
-- We doorlopen dan elk "oud" res_rsv_artikel_key met zijn kenmerk afzonderlijk en kiezen dan <20><>n van de vrije "nieuwe" res_rsv_artikel_key's (MIN).
-- Aan het eind zijn dan alle "oud" res_rsv_artikel_key's gebonden aan een nieuw res_rsv_artikel_key. Met een query kan het niet in <20><>n keer opgelost worden.
FOR kenmerkartikelrec
IN
(SELECT oldkenmerk.res_rsv_artikel_key,
newkenmerk.res_kenmerk_key,
oldkenmerk.res_kenmerkartikel_waarde,
oldkenmerk.res_artikel_key
FROM (SELECT ka.res_rsv_artikel_key,
ka.res_kenmerk_key,
ka.res_kenmerkartikel_waarde,
ra.res_artikel_key,
k.res_srtkenmerk_key
FROM res_kenmerkartikel ka,
res_kenmerk k,
res_srtkenmerk sk,
res_rsv_ruimte rr,
res_rsv_artikel rra,
res_artikel ra
WHERE ka.res_kenmerk_key = k.res_kenmerk_key
AND k.res_srtkenmerk_key = sk.res_srtkenmerk_key
AND (k.res_artikel_key = rra.res_artikel_key
OR k.res_discipline_key = ra.res_discipline_key)
AND ra.res_artikel_key = rra.res_artikel_key
AND ka.res_rsv_artikel_key = rra.res_rsv_artikel_key
AND rra.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
--AND k.res_activiteit_key IS NULL -- Niet nodig: Als res_activiteit_key gevuld is dan is res_kenmerk_niveau 'A'.
AND k.res_kenmerk_niveau IN ('C', 'D')
AND BITAND(k.res_kenmerk_rolcode, 7) <> 4 -- Backofficekenmerken niet (100)
AND k.res_kenmerk_verwijder IS NULL
AND ka.res_kenmerkartikel_verwijder IS NULL
AND sk.res_srtkenmerk_kenmerktype NOT IN ('F', 'M', 'E')
AND rr.res_rsv_ruimte_key = prsv_ruimte_key_from) oldkenmerk,
(SELECT rra.res_rsv_artikel_key,
k.res_kenmerk_key,
ra.res_artikel_key,
k.res_srtkenmerk_key
FROM res_rsv_ruimte rr,
res_rsv_artikel rra,
res_artikel ra,
res_kenmerk k
WHERE rra.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
AND (k.res_artikel_key = rra.res_artikel_key
OR k.res_discipline_key = ra.res_discipline_key)
AND ra.res_artikel_key = rra.res_artikel_key
AND rr.res_rsv_ruimte_key = prsv_ruimte_key_to) newkenmerk
WHERE oldkenmerk.res_kenmerk_key = newkenmerk.res_kenmerk_key
AND oldkenmerk.res_srtkenmerk_key = newkenmerk.res_srtkenmerk_key
AND oldkenmerk.res_artikel_key = newkenmerk.res_artikel_key
GROUP BY oldkenmerk.res_rsv_artikel_key,
newkenmerk.res_kenmerk_key,
oldkenmerk.res_kenmerkartikel_waarde,
oldkenmerk.res_artikel_key
ORDER BY oldkenmerk.res_rsv_artikel_key,
newkenmerk.res_kenmerk_key)
LOOP
SELECT MIN(rra.res_rsv_artikel_key)
INTO min_res_rsv_artikel_key
FROM res_rsv_artikel rra,
res_rsv_ruimte rr
WHERE rra.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
AND rr.res_rsv_ruimte_key = prsv_ruimte_key_to
AND res_artikel_key = kenmerkartikelrec.res_artikel_key
-- De res_rsv_artikel_key's die bezet zijn uitsluiten. Welke res_kenmerkartikel_waarde is ingevuld maakt niets uit.
AND NOT EXISTS
(SELECT res_kenmerkartikel_key
FROM res_kenmerkartikel
WHERE res_rsv_artikel_key = rra.res_rsv_artikel_key
AND res_kenmerk_key = kenmerkartikelrec.res_kenmerk_key);
INSERT INTO res_kenmerkartikel (res_rsv_artikel_key,
res_kenmerk_key,
res_kenmerkartikel_waarde)
VALUES (min_res_rsv_artikel_key,
kenmerkartikelrec.res_kenmerk_key,
kenmerkartikelrec.res_kenmerkartikel_waarde);
END LOOP;
END IF;
END IF;
-- 512 Bezoekers