diff --git a/EXC/EXC_PAC.SRC b/EXC/EXC_PAC.SRC index 12bd8057..f616513c 100644 --- a/EXC/EXC_PAC.SRC +++ b/EXC/EXC_PAC.SRC @@ -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 := diff --git a/FCLT.NMK b/FCLT.NMK index 3066422e..aa3ed926 100644 --- a/FCLT.NMK +++ b/FCLT.NMK @@ -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) diff --git a/RES/RES_IND.SRC b/RES/RES_IND.SRC index 512aaec6..7a5857b6 100644 --- a/RES/RES_IND.SRC +++ b/RES/RES_IND.SRC @@ -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); diff --git a/_UP/DB43to44.src b/_UP/DB43to44.src index 4d45d46f..8110fa96 100644 --- a/_UP/DB43to44.src +++ b/_UP/DB43to44.src @@ -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$') diff --git a/_UP/DB44cto44d.sql b/_UP/DB44cto44d.sql new file mode 100644 index 00000000..265dd021 --- /dev/null +++ b/_UP/DB44cto44d.sql @@ -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 \ No newline at end of file