FCLT#77314 Unieke index op het externnr en dat in EXC_PAC goed afhandelen

svn path=/Database/branches/DB44/; revision=59726
This commit is contained in:
2023-03-23 12:13:40 +00:00
parent 84e478222a
commit 74f4c3af9f
5 changed files with 186 additions and 85 deletions

View File

@@ -304,8 +304,7 @@ AS
(SELECT 1
FROM res_rsv_ruimte
WHERE res_rsv_ruimte_verwijder IS NOT NULL
AND INSTR (res_rsv_ruimte_externnr,
appt_id || '|' || recur_id) = 1));
AND res_rsv_ruimte_externnr = appt_id || '|' || recur_id));
-- We gaan uit van een geldig bestand, mogelijk verandert dat onderweg
header_is_valid := 0;
@@ -609,9 +608,7 @@ AS
WHERE modifier = 'D'
AND gelukt IS NULL) i,
res_rsv_ruimte rr
WHERE rr.res_rsv_ruimte_externnr IS NOT NULL
AND INSTR(rr.res_rsv_ruimte_externnr,
i.appt_id || '|' || i.recur_id || '|') = 1
WHERE rr.res_rsv_ruimte_externnr = i.appt_id || '|' || i.recur_id
AND rr.res_rsv_ruimte_verwijder IS NULL
UNION ALL
SELECT 'Unknown room' reden, i.*, rr.*
@@ -628,8 +625,7 @@ AS
AND starttime > SYSDATE
AND gelukt IS NULL) i,
res_rsv_ruimte rr
WHERE INSTR(rr.res_rsv_ruimte_externnr,
i.appt_id || '|' || i.recur_id || '|') = 1
WHERE rr.res_rsv_ruimte_externnr = i.appt_id || '|' || i.recur_id
AND rr.res_rsv_ruimte_verwijder IS NULL
AND NOT EXISTS
(SELECT 1
@@ -656,7 +652,7 @@ AS
AND recur_id IS NOT NULL
AND gelukt IS NULL) i,
res_rsv_ruimte rr
WHERE INSTR(rr.res_rsv_ruimte_externnr, i.appt_id || '||') = 1
WHERE rr.res_rsv_ruimte_externnr = i.appt_id || '|'
AND rr.res_rsv_ruimte_verwijder IS NULL;
-- TODO: Voor later: res_cat_t1 en res_t1 gebruiken ipv TRUNC
@@ -789,8 +785,7 @@ AS
modifier) i,
res_rsv_ruimte rr,
res_ruimte rnew
WHERE INSTR(rr.res_rsv_ruimte_externnr,
i.appt_id || '|' || i.recur_id || '|') = 1
WHERE rr.res_rsv_ruimte_externnr = i.appt_id || '|' || i.recur_id
AND rr.res_rsv_ruimte_verwijder IS NULL
AND rnew.res_ruimte_extern_id = i.room_id
AND rnew.res_ruimte_verwijder IS NULL;
@@ -874,9 +869,7 @@ AS
FROM res_rsv_ruimte rr,
res_ruimte_opstelling ro,
res_ruimte r
WHERE rr.res_rsv_ruimte_externnr IS NOT NULL
AND INSTR(rr.res_rsv_ruimte_externnr,
i.appt_id || '|' || i.recur_id || '|') = 1
WHERE rr.res_rsv_ruimte_externnr = i.appt_id || '|' || i.recur_id
AND rr.res_rsv_ruimte_verwijder IS NULL
AND ro.res_ruimte_opstel_key =
rr.res_ruimte_opstel_key
@@ -1078,8 +1071,7 @@ AS
AND NOT EXISTS
(SELECT 1
FROM res_rsv_ruimte
WHERE INSTR(res_rsv_ruimte_externnr,
i.appt_id || '|' || i.recur_id || '|') = 1);
WHERE res_rsv_ruimte_externnr = i.appt_id || '|' || i.recur_id);
-- Dan bestaande bijwerken, anders kan het gebeuren dat we op basis van een UPDATE
-- eerst een rsv_ruimte aanmaken en 'm daarna meteen proberen bij te werken.
@@ -1126,8 +1118,7 @@ AS
SELECT COUNT (*)
INTO v_count_all_booked
FROM res_rsv_ruimte rr
WHERE INSTR(rr.res_rsv_ruimte_externnr,
rec.appt_id || '|' || rec.recur_id || '|') = 1
WHERE rr.res_rsv_ruimte_externnr = rec.appt_id || '|' || rec.recur_id
AND rr.res_rsv_ruimte_verwijder IS NULL;
v_errorhint := 'Totaal aantal benodigde zalen bepalen';
@@ -1150,8 +1141,7 @@ AS
FROM res_rsv_ruimte rr,
res_ruimte_opstelling rops,
res_ruimte r
WHERE INSTR(rr.res_rsv_ruimte_externnr,
rec.appt_id || '|' || rec.recur_id || '|') = 1
WHERE rr.res_rsv_ruimte_externnr = rec.appt_id || '|' || rec.recur_id
AND rr.res_rsv_ruimte_verwijder IS NULL
AND rops.res_ruimte_opstel_key = rr.res_ruimte_opstel_key
AND r.res_ruimte_key = rops.res_ruimte_key
@@ -1470,24 +1460,6 @@ AS
CONTINUE;
END IF;
v_errorhint := 'Last-minute duplicaat check';
SELECT COUNT (*)
INTO v_count
FROM res_rsv_ruimte
WHERE res_rsv_ruimte_externnr IS NOT NULL
AND INSTR(res_rsv_ruimte_externnr, rec.appt_id || '|' || rec.recur_id || '|') = 1
AND res_rsv_ruimte_verwijder IS NULL;
IF (v_count > 0)
THEN
fac.imp_writelog (p_import_key,
'E',
v_aanduiding,
'Deze exacte reservering is al bekend in Facilitor. Geen boeking.');
CONTINUE;
END IF;
-- Is dit een op zichzelf staande appointment, of onderdeel van een reeks (recurrence)?
-- (obv recur_id, die samen met appt_id in res_rsv_ruimte_externnr staat)
v_errorhint := 'Check recurrence';
@@ -1510,8 +1482,7 @@ AS
MAX (res_rsv_ruimte_volgnr) + 1
INTO v_reservering_key, v_rsv_ruimte_volgnr
FROM res_rsv_ruimte
WHERE res_rsv_ruimte_externnr IS NOT NULL
AND INSTR(res_rsv_ruimte_externnr,
WHERE INSTR(res_rsv_ruimte_externnr,
rec.appt_id || '|') = 1
-- AND res_rsv_ruimte_externnr NOT LIKE '%|'||rec.recur_id||'|%'
AND res_rsv_ruimte_verwijder IS NULL
@@ -1548,48 +1519,70 @@ AS
v_errorhint := 'Deelreservering aanmaken';
-- res_rsv_ruimte aanmaken voor deze appointment+resource
INSERT INTO res_rsv_ruimte (res_rsv_ruimte_omschrijving,
res_rsv_ruimte_opmerking,
res_rsv_ruimte_externnr,
res_ruimte_opstel_key,
res_rsv_ruimte_van,
res_rsv_ruimte_tot,
prs_kostenplaats_key,
res_rsv_ruimte_host_key,
res_activiteit_key,
res_status_fo_key,
res_rsv_ruimte_ordernr,
res_rsv_ruimte_kosten_klant,
res_rsv_ruimte_contact_key,
res_rsv_ruimte_bezoekers,
res_reservering_key,
res_rsv_ruimte_volgnr,
res_status_bo_key)
VALUES (
SUBSTR (rec.subject, 1, 60),
NULL,
rec.appt_id
|| '|'
|| rec.recur_id
|| '|'
|| rec.seq_nr,
v_ruimte_opstel_key,
rec.starttime,
rec.endtime,
v_kostenplaats_key,
v_perslid_key,
c_activiteit_key,
2,
NULL,
1,
v_perslid_key,
rec.num_bez,
v_reservering_key,
v_rsv_ruimte_volgnr,
2)
RETURNING res_rsv_ruimte_key
INTO v_rsv_ruimte_key;
BEGIN
-- res_rsv_ruimte aanmaken voor deze appointment+resource
INSERT INTO res_rsv_ruimte (res_rsv_ruimte_omschrijving,
res_rsv_ruimte_opmerking,
res_rsv_ruimte_externnr,
res_ruimte_opstel_key,
res_rsv_ruimte_van,
res_rsv_ruimte_tot,
prs_kostenplaats_key,
res_rsv_ruimte_host_key,
res_activiteit_key,
res_status_fo_key,
res_rsv_ruimte_ordernr,
res_rsv_ruimte_kosten_klant,
res_rsv_ruimte_contact_key,
res_rsv_ruimte_bezoekers,
res_reservering_key,
res_rsv_ruimte_volgnr,
res_status_bo_key)
VALUES (
SUBSTR (rec.subject, 1, 60),
NULL,
rec.appt_id
|| '|'
|| rec.recur_id,
v_ruimte_opstel_key,
rec.starttime,
rec.endtime,
v_kostenplaats_key,
v_perslid_key,
c_activiteit_key,
2,
NULL,
1,
v_perslid_key,
rec.num_bez,
v_reservering_key,
v_rsv_ruimte_volgnr,
2)
RETURNING res_rsv_ruimte_key
INTO v_rsv_ruimte_key;
EXCEPTION
WHEN DUP_VAL_ON_INDEX
THEN -- Er bestaat al een reservering met dit externnr
IF NOT (v_count > 0) -- Verwijder dan ook het zojuist aangemaakte res_reservering-record weer
THEN
DELETE FROM res_reservering WHERE res_reservering_key = v_reservering_key;
END IF;
-- Pas het 'gelukt' bitje aan zodat we hem later niet weer opnieuwe proberen
UPDATE exc_import
SET gelukt = 2
WHERE appt_id || '|' || recur_id =
rec.appt_id || '|' || rec.recur_id
AND gelukt IS NULL;
fac.imp_writelog (p_import_key,
'E',
v_aanduiding,
'Deze exacte reservering is al bekend in Facilitor -> Geen boeking.');
CONTINUE;
WHEN OTHERS
THEN
RAISE;
END;
IF (v_debug)
THEN
@@ -1751,7 +1744,7 @@ AS
AND NOT EXISTS
(SELECT 1
FROM this_import i
WHERE INSTR(rr.res_rsv_ruimte_externnr, i.appt_id || '|' || i.recur_id || '|') = 1
WHERE rr.res_rsv_ruimte_externnr = i.appt_id || '|' || i.recur_id
AND r.res_ruimte_extern_id = i.room_id))
LOOP
v_errorhint :=

View File

@@ -60,9 +60,9 @@ PROJEXE=z:\Project\FACILITOR\BUILD
##
## New style using schemanumbers
##
CURRENTVERSION=42
NEXTVERSION=43
FILEVERSION=b
CURRENTVERSION=43
NEXTVERSION=44
FILEVERSION=d
NEXTCAREVERSION=37
NEXTROOT=DB$(NEXTVERSION)$(FILEVERSION)
CURRENTUPDATE=DB$(CURRENTVERSION)to$(NEXTVERSION)

View File

@@ -32,6 +32,14 @@ create index res_i_res_rsv_ruimte14 on res_rsv_ruimte (res_rsv_ruimte_kto_verstu
create index res_i_res_rsv_ruimte15 on res_rsv_ruimte (res_rsv_ruimte_externnr);
create index res_i_res_rsv_ruimte16 on res_rsv_ruimte (mld_opdr_key);
create index res_i_res_rsv_ruimte17 on res_rsv_ruimte (res_rsv_ruimte_parent_key);
CREATE UNIQUE INDEX res_i_res_rsv_ruimte18
ON res_rsv_ruimte (CASE
WHEN res_rsv_ruimte_verwijder IS NULL
THEN
res_rsv_ruimte_externnr
ELSE
NULL
END);
create index res_i_res_rsv_deel2 on res_rsv_deel(res_deel_key);
create index res_i_res_rsv_deel3 on res_rsv_deel(bez_bezoekers_key);

View File

@@ -439,6 +439,38 @@ DELETE FROM fac_groeprechten
AND f.fac_functie_code = 'WEB_ORDOAP'
);
/////////////////////////////////////////////////////////////////////////////////////////// FCLT#73722
// Strip de timestamp (ook maar voor verwijderde records)
UPDATE res_rsv_ruimte
SET res_rsv_ruimte_externnr =
SUBSTR (res_rsv_ruimte_externnr, 1, LENGTH (res_rsv_ruimte_externnr) - 14)
WHERE res_rsv_ruimte_externnr IS NOT NULL
AND res_rsv_ruimte_externnr NOT LIKE '##iCalUId##%'
AND REGEXP_LIKE (res_rsv_ruimte_externnr, '\|\d{13}$');
// Verwijder de dubbelen op een nette manier die niet de Outlook koppeling aftrapt
UPDATE res_rsv_ruimte
SET res_rsv_ruimte_externnr = NULL
, res_rsv_ruimte_verwijder = SYSDATE
WHERE res_rsv_ruimte_externnr IS NOT NULL
AND res_rsv_ruimte_verwijder IS NULL
AND res_rsv_ruimte_key NOT IN ( SELECT MIN (res_rsv_ruimte_key)
FROM res_rsv_ruimte
WHERE res_rsv_ruimte_externnr IS NOT NULL
AND res_rsv_ruimte_verwijder IS NULL
GROUP BY res_rsv_ruimte_externnr);
// Voeg de nieuwe unieke index toe
CREATE UNIQUE INDEX res_i_res_rsv_ruimte18
ON res_rsv_ruimte (CASE
WHEN res_rsv_ruimte_verwijder IS NULL
THEN
res_rsv_ruimte_externnr
ELSE
NULL
END);
/////////////////////////////////////////////////////////////////////////////////////////// FCLT#00000
REGISTERONCE('$Id$')

68
_UP/DB44cto44d.sql Normal file
View File

@@ -0,0 +1,68 @@
--
-- $Id$
--
-- Aanpassingen om DB44c (prod) naar de DB44d te brengen
-- Merk op dat de recreate er nog bij komt die de DB-version bijwerkt
--
-- MOET OOK ZIJN/WORDEN OPGENOMEN IN DB43TO44d.src !!!
DEFINE thisfile = 'DB44cto44d.sql'
DEFINE dbuser = '*'
SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
COLUMN fcltcusterr NEW_VALUE fcltcusterr NOPRINT;
WHENEVER SQLERROR CONTINUE;
SELECT adm.getscriptspoolfile('&thisfile') AS fcltlogfile FROM DUAL;
SPOOL &fcltlogfile
WHENEVER SQLERROR EXIT;
SELECT adm.checkscriptcust('&dbuser') AS fcltcusterr FROM DUAL;
WHENEVER SQLERROR CONTINUE;
PROMPT &fcltcusterr
SET DEFINE OFF
------ payload begin ------
-- /////////////////////////////////////////////////////////////////////////////////////////// FCLT#73722
-- Strip de timestamp (ook maar voor verwijderde records)
UPDATE res_rsv_ruimte
SET res_rsv_ruimte_externnr =
SUBSTR (res_rsv_ruimte_externnr, 1, LENGTH (res_rsv_ruimte_externnr) - 14)
WHERE res_rsv_ruimte_externnr IS NOT NULL
AND res_rsv_ruimte_externnr NOT LIKE '##iCalUId##%'
AND REGEXP_LIKE (res_rsv_ruimte_externnr, '\|\d{13}$');
-- Verwijder de dubbelen op een nette manier die niet de Outlook koppeling aftrapt
UPDATE res_rsv_ruimte
SET res_rsv_ruimte_externnr = NULL
, res_rsv_ruimte_verwijder = SYSDATE
WHERE res_rsv_ruimte_externnr IS NOT NULL
AND res_rsv_ruimte_verwijder IS NULL
AND res_rsv_ruimte_key NOT IN ( SELECT MIN (res_rsv_ruimte_key)
FROM res_rsv_ruimte
WHERE res_rsv_ruimte_externnr IS NOT NULL
AND res_rsv_ruimte_verwijder IS NULL
GROUP BY res_rsv_ruimte_externnr);
-- Voeg de nieuwe unieke index toe
CREATE UNIQUE INDEX res_i_res_rsv_ruimte18
ON res_rsv_ruimte (CASE
WHEN res_rsv_ruimte_verwijder IS NULL
THEN
res_rsv_ruimte_externnr
ELSE
NULL
END);
------ payload end ------
SET DEFINE OFF
BEGIN adm.systrackscriptId ('$Id$', 1); END;
/
COMMIT;
SET ECHO OFF
SPOOL OFF
SET DEFINE ON
PROMPT Logfile of this upgrade is: &fcltlogfile