#ifdef PRJ /* PRJ_PAC.SRC * $Revision$ * $Id$ */ /* CODE COMMENTS, CONSIDERATIONS Voor een verdiepinging kan in 1 klap een scenario-omgeving worden aangemaakt: prj_initiate_scenario. Dit scenario kan worden geannuleerd met prj_cancel_scenario. In een scenario bevat elk item een link naar zijn bron in the real world. Omdat dingen ook toegevoegd kunnen zijn, kan deze link ook leeg zijn. In dat geval moet de relatie met de buitenwereld bekend zijn, om het nieuwe item later op de juiste plek in te kunnen vullen. Dat is: prj_ruimte: alg_ruimte_key of alg_verdieping_key (alg_srtruimte_key verplicht) prj_werkplek: prs_werkplek_key of prj_ruimte_key prj_perslidwerkplek: prs_perslidwerkplek_key of prj_werkplek x prs_perslid/prs_afdeling. prj_deel: ins_deel_key of prj_alg_ruimte_key/prj_alg_ruimte_type Een scenarioruimte kan afwijkende soort en oppervlakte hebben. Voor bron wordt zoveel mogelijk (altijd?) de originele keys gebruikt(alg_ruimte etc) en voor bestemming de prj keys (prj_ruimte etc) */ CREATE OR REPLACE PACKAGE prj AS PROCEDURE prj_initiate_scenario (pscenariokey IN NUMBER, pverdiepingkey IN NUMBER); PROCEDURE prj_copy_scenario (pscenariokey_from IN NUMBER, pscenariokey_to IN NUMBER); PROCEDURE prj_reinitiate_scenario (pscenariokey IN NUMBER, pverdiepingkey IN NUMBER); PROCEDURE prj_cancel_scenario (pscenariokey IN NUMBER, pverdiepingkey IN NUMBER); PROCEDURE prj_commit_scenario (pscenariokey IN NUMBER); PROCEDURE prj_move_werkplek (pwerkplekkey IN NUMBER, pruimtekey IN NUMBER); PROCEDURE prj_move_perslidwerkplek (pperslidwerkplekkey IN NUMBER, pruimtekey IN NUMBER, pwerkplekkey IN NUMBER); PROCEDURE prj_move_perslid (pperslidkey IN NUMBER, pruimtekey IN NUMBER, pwerkplekkey IN NUMBER); PROCEDURE prj_move_perslid2 (pperslidkey IN NUMBER, pruimtekey IN NUMBER); FUNCTION forceuniqueness (element_type IN VARCHAR2 , parent_key IN NUMBER, element_omschrijving IN VARCHAR2, srtdeelkey IN NUMBER ) RETURN VARCHAR2 ; FUNCTION find_or_create_free_werkplek (pruimtekey IN NUMBER,bezetting IN NUMBER ) RETURN NUMBER ; PROCEDURE remove(p_scenario_key IN NUMBER); END prj; / CREATE OR REPLACE PACKAGE BODY prj AS ---------------------------------------------- -- UTILITY PROCEDURES AND FUNCTIONS ---------------------------------------------- PROCEDURE checkscenario (pscenariokey IN NUMBER) AS dummy VARCHAR2 (1); BEGIN SELECT 'x' INTO dummy FROM prj_scenario s WHERE s.prj_scenario_key = pscenariokey; EXCEPTION WHEN NO_DATA_FOUND THEN raise_application_error (-20001, 'prj package: invalid parameter _VAR(pscenariokey)' ); RETURN; END checkscenario; FUNCTION forceuniqueness ( element_type IN VARCHAR2, parent_key IN NUMBER, element_omschrijving IN VARCHAR2, srtdeelkey IN NUMBER ) RETURN VARCHAR2 IS omschrijving VARCHAR2 (30); prefix VARCHAR2 (30); BEGIN IF element_type = 'ALG_RUIMTE' THEN -- Zoek op de geselecteerde verdieping of het huidige ruimtenummer al voor komt. BEGIN SELECT g.alg_gebouw_code || '-' || TO_CHAR (v.alg_verdieping_code) || '-' INTO prefix FROM alg_gebouw g, alg_verdieping v, alg_ruimte r WHERE g.alg_gebouw_key = v.alg_gebouw_key AND v.alg_verdieping_key = r.alg_verdieping_key AND r.alg_verdieping_key = parent_key AND r.alg_ruimte_nr = element_omschrijving AND r.alg_ruimte_verwijder IS NULL; -- Gevonden, dus niet uniek. Probeer het met een sterretje ervoor, passen ze dat later maar zelf aan omschrijving := forceuniqueness (element_type, parent_key, SUBSTR ('*' || element_omschrijving, 1, 10), NULL ); EXCEPTION WHEN NO_DATA_FOUND THEN omschrijving := element_omschrijving; END; END IF; -- objecten IF element_type = 'INS_DEEL' THEN -- Zoek op de locatie of het huidige objectnummer al voor komt. BEGIN SELECT ins_deel_omschrijving INTO prefix FROM ins_deel WHERE ins_alg_locatie_key = parent_key AND ins_deel_upper = upper(element_omschrijving) AND ins_srtdeel_key = srtdeelkey AND ins_deel_verwijder IS NULL; -- Gevonden, dus niet uniek. Probeer het met een sterretje ervoor, passen ze dat later maar zelf aan SELECT ins.nextdescription(ins_srtdeel_code, parent_key) INTO omschrijving FROM ins_srtdeel WHERE ins_srtdeel_key = srtdeelkey; EXCEPTION WHEN NO_DATA_FOUND THEN omschrijving := element_omschrijving; END; END IF; -- Voor werkplekken, die een unieke numerieke ID hebben wordt gecheckt of de huidige waarde ok is, -- en zoniet, dan wordt er doorgeteld tot de eersthogere wel unieke IF element_type = 'PRS_WERKPLEK' THEN -- Zoek in de geselecteerde ruimte of het huidige werkpleknummer al voor komt. BEGIN SELECT g.alg_gebouw_code || '-' || TO_CHAR (v.alg_verdieping_code) || '-' || TO_CHAR (r.alg_ruimte_nr) INTO prefix FROM alg_gebouw g, alg_verdieping v, alg_ruimte r, prs_werkplek w WHERE g.alg_gebouw_key = v.alg_gebouw_key AND v.alg_verdieping_key = r.alg_verdieping_key AND w.prs_alg_ruimte_key = r.alg_ruimte_key AND w.prs_alg_ruimte_key = parent_key AND w.prs_werkplek_volgnr = TO_NUMBER (element_omschrijving); -- Gevonden, dus niet uniek. Probeer het met een sterretje ervoor, passen ze dat later maar zelf aan IF TO_NUMBER (element_omschrijving) = 99999999 THEN -- Ik kan met 8 cijfers niet hoger, begin opnieuw onderaan (to prevent infinite recursion) omschrijving := forceuniqueness (element_type, parent_key, '00000000', NULL); ELSE omschrijving := forceuniqueness (element_type, parent_key, TO_CHAR ( TO_NUMBER (element_omschrijving) + 1 ), NULL ); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN omschrijving := element_omschrijving; END; END IF; IF element_type = 'PRJ_WERKPLEK' THEN -- Zoek in de geselecteerde ruimte of het huidige werkpleknummer al voor komt. BEGIN SELECT 'x' INTO prefix FROM prj_werkplek w WHERE w.prj_ruimte_key = parent_key AND w.prj_werkplek_volgnr = element_omschrijving AND w.prj_werkplek_verwijder IS NULL; -- Gevonden, dus niet uniek. Probeer het met een sterretje ervoor, passen ze dat later maar zelf aan IF TO_NUMBER (element_omschrijving) = 99999999 THEN -- Ik kan met 8 cijfers niet hoger, begin opnieuw onderaan (to prevent infinite recursion) omschrijving := forceuniqueness (element_type, parent_key, '00000000', NULL); ELSE omschrijving := forceuniqueness (element_type, parent_key, TO_CHAR ( TO_NUMBER (element_omschrijving) + 1 ), NULL ); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN omschrijving := element_omschrijving; END; END IF; RETURN omschrijving; END; FUNCTION defaultwpomschrijving (pruimtekey IN NUMBER, pwerkpleknr IN NUMBER) RETURN VARCHAR2 IS omschrijving VARCHAR2 (30); BEGIN SELECT SUBSTR ( prj_ruimte_nr || '/' || LPAD (TO_CHAR (pwerkpleknr), 3, '0'), 1, 30 ) INTO omschrijving FROM prj_ruimte WHERE prj_ruimte_key = pruimtekey; RETURN omschrijving; END; ---------------------------------------------- -- SCENARIO MANAGEMENT PROCEDURES ---------------------------------------------- PROCEDURE prj_initiate_scenario ( pscenariokey IN NUMBER, pverdiepingkey IN NUMBER ) AS dummy VARCHAR2 (1); BEGIN checkscenario (pscenariokey); BEGIN SELECT 'x' INTO dummy FROM alg_verdieping v WHERE v.alg_verdieping_key = pverdiepingkey AND v.alg_verdieping_verwijder IS NULL; EXCEPTION WHEN NO_DATA_FOUND THEN raise_application_error (-20001, 'prj_initiate_scenario: invalid parameter _VAR(pverdiepingkey)' ); RETURN; END; BEGIN SELECT 'x' INTO dummy FROM prj_ruimte rx WHERE rx.alg_verdieping_key = pverdiepingkey AND rx.prj_scenario_key = pscenariokey; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN OTHERS THEN -- Bestaat al; niks doen en gewoon terugkeren NULL; RETURN; END; -- ** Parameters are proven valid -- ?? Check of er al een kopie bestaat nodig ?? -- Kopieer de ruimtes INSERT INTO prj_ruimte (prj_ruimte_key, prj_scenario_key, alg_ruimte_key, alg_verdieping_key, alg_srtruimte_key, prj_ruimte_nr, prj_ruimte_omschrijving, prj_ruimte_bruto_vloeropp, prj_ruimte_omtrek, prj_ruimte_inhoud) SELECT NULL, pscenariokey, alg_ruimte_key, alg_verdieping_key, alg_srtruimte_key, alg_ruimte_nr, alg_ruimte_omschrijving, alg_ruimte_bruto_vloeropp, alg_ruimte_omtrek, alg_ruimte_inhoud FROM alg_ruimte r WHERE r.alg_ruimte_verwijder IS NULL AND alg_verdieping_key = pverdiepingkey; -- Kopieer de werkplekken INSERT INTO prj_werkplek (prj_werkplek_key, prs_werkplek_key, prj_werkplek_volgnr, prj_werkplek_omschrijving, prj_werkplek_vastopp, prj_werkplek_opp, prj_ruimte_key, prj_werkplek_dwgx, prj_werkplek_dwgy, prj_werkplek_dwgrotatie, prj_werkplek_dwgschaal) SELECT NULL, prs_werkplek_key, prs_werkplek_volgnr, prs_werkplek_omschrijving, prs_werkplek_vastopp, prs_werkplek_opp, prj_ruimte_key, prs_werkplek_dwgx, prs_werkplek_dwgy, prs_werkplek_dwgrotatie, prs_werkplek_dwgschaal FROM prs_werkplek w, prj_ruimte rx WHERE w.prs_alg_ruimte_key = rx.alg_ruimte_key AND w.prs_werkplek_virtueel = 0 AND rx.prj_scenario_key = pscenariokey AND rx.alg_verdieping_key = pverdiepingkey; -- Kopieer de werkplekbezettingen INSERT INTO prj_perslidwerkplek (prj_perslidwerkplek_key, prs_perslidwerkplek_key, prs_perslid_key, prj_werkplek_key, prj_perslidwerkplek_bezetting) SELECT NULL, pw.prs_perslidwerkplek_key, pw.prs_perslid_key, wx.prj_werkplek_key, pw.prs_perslidwerkplek_bezetting FROM prs_perslidwerkplek pw, prj_werkplek wx, prj_ruimte rx WHERE pw.prs_werkplek_key = wx.prs_werkplek_key AND rx.prj_scenario_key = pscenariokey AND pw.prs_perslid_key IS NOT NULL AND wx.prj_ruimte_key = rx.prj_ruimte_key AND rx.alg_verdieping_key = pverdiepingkey; -- Kopieer de ruimteafdelingen INSERT INTO prj_ruimteafdeling (prj_ruimteafdeling_key, prs_ruimteafdeling_key, prs_afdeling_key, prj_ruimte_key, prj_ruimteafdeling_bezetting ) SELECT NULL, ra.prs_ruimteafdeling_key, ra.prs_afdeling_key, rx.prj_ruimte_key, ra.prs_ruimteafdeling_bezetting FROM prs_ruimteafdeling ra, prj_ruimte rx WHERE ra.alg_ruimte_key = rx.alg_ruimte_key AND ra.prs_ruimteafdeling_verwijder IS NULL AND rx.prj_scenario_key = pscenariokey AND rx.alg_verdieping_key = pverdiepingkey; -- Kopieer de objecten INSERT INTO prj_deel (prj_deel_key, ins_deel_key, prj_ruimte_key, prj_deel_omschrijving, ins_srtdeel_key, prj_deel_dwgx, prj_deel_dwgy, prj_deel_dwgrotatie, prj_deel_dwgschaal) SELECT NULL, ins_deel_key, rx.prj_ruimte_key, ins_deel_omschrijving, d.ins_srtdeel_key, ins_deel_dwgx, ins_deel_dwgy, ins_deel_dwgrotatie, ins_deel_dwgschaal FROM ins_deel d, alg_v_aanwezigruimte r, prj_ruimte rx WHERE d.ins_alg_ruimte_type = 'R' AND d.ins_alg_ruimte_key = r.alg_ruimte_key AND d.ins_deel_parent_key IS NULL AND d.ins_deel_verwijder IS NULL AND rx.prj_scenario_key = pscenariokey AND rx.alg_ruimte_key = r.alg_ruimte_key AND r.alg_verdieping_key = pverdiepingkey; INSERT INTO prj_deel (prj_deel_key, ins_deel_key, prj_ruimte_key, prj_werkplek_key, prj_deel_omschrijving, ins_srtdeel_key, prj_deel_dwgx, prj_deel_dwgy, prj_deel_dwgrotatie, prj_deel_dwgschaal) SELECT NULL, ins_deel_key, rx.prj_ruimte_key, wx.prj_werkplek_key, ins_deel_omschrijving, d.ins_srtdeel_key, ins_deel_dwgx, ins_deel_dwgy, ins_deel_dwgrotatie, ins_deel_dwgschaal FROM ins_deel d, alg_v_aanwezigruimte r, prs_werkplek w, prj_ruimte rx, prj_werkplek wx WHERE d.ins_alg_ruimte_type = 'W' AND d.ins_alg_ruimte_key = w.prs_werkplek_key AND w.prs_alg_ruimte_key = r.alg_ruimte_key AND d.ins_deel_parent_key IS NULL AND d.ins_deel_verwijder IS NULL AND rx.prj_scenario_key = pscenariokey AND rx.alg_ruimte_key = r.alg_ruimte_key AND wx.prj_ruimte_key = rx.prj_ruimte_key AND r.alg_verdieping_key = pverdiepingkey AND wx.prs_werkplek_key = w.prs_werkplek_key; COMMIT; END prj_initiate_scenario; PROCEDURE prj_copy_scenario ( pscenariokey_from IN NUMBER, pscenariokey_to IN NUMBER ) AS dummy VARCHAR2 (1); BEGIN checkscenario (pscenariokey_from); checkscenario (pscenariokey_to); BEGIN SELECT 'x' INTO dummy FROM prj_ruimte rx WHERE rx.prj_scenario_key = pscenariokey_to; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN OTHERS THEN -- Bestaat al; niks doen en gewoon terugkeren NULL; RETURN; END; raise_application_error(-20001, 'prj package: copy not yet supported'); RETURN; -- ** Parameters are proven valid -- Kopieer de ruimtes INSERT INTO prj_ruimte (prj_ruimte_key, prj_scenario_key, alg_ruimte_key, alg_verdieping_key, alg_srtruimte_key, prj_ruimte_nr, prj_ruimte_omschrijving, prj_ruimte_bruto_vloeropp, prj_ruimte_omtrek, prj_ruimte_inhoud) SELECT NULL, pscenariokey_to, alg_ruimte_key, alg_verdieping_key, alg_srtruimte_key, prj_ruimte_nr, prj_ruimte_omschrijving, prj_ruimte_bruto_vloeropp, prj_ruimte_omtrek, prj_ruimte_inhoud FROM prj_ruimte rx WHERE prj_scenario_key = pscenariokey_from; -- TODO: vergt nog wat uitwerking: de parent key van de zojuist aangemaakte ruimte etc gebruiken -- Kopieer de werkplekken INSERT INTO prj_werkplek (prj_werkplek_key, prs_werkplek_key, prj_werkplek_volgnr, prj_werkplek_omschrijving, prj_werkplek_vastopp, prj_ruimte_key) SELECT NULL, wx.prs_werkplek_key, wx.prj_werkplek_volgnr, wx.prj_werkplek_omschrijving, wx.prj_werkplek_vastopp, wx.prj_ruimte_key FROM prj_werkplek wx, prj_ruimte rx, prj_ruimte rxx WHERE wx.prj_ruimte_key = rx.prj_ruimte_key AND rx.prj_ruimte_nr = rxx.prj_ruimte_nr AND rx.alg_verdieping_key = rxx.alg_verdieping_key AND rx.prj_scenario_key = pscenariokey_from; -- Kopieer de werkplekbezettingen INSERT INTO prj_perslidwerkplek (prj_perslidwerkplek_key, prs_perslidwerkplek_key, prs_perslid_key, prj_werkplek_key, prj_perslidwerkplek_bezetting) SELECT NULL, pwx.prs_perslidwerkplek_key, pwx.prs_perslid_key, pwx.prj_werkplek_key, pwx.prj_perslidwerkplek_bezetting FROM prj_perslidwerkplek pwx, prj_werkplek wx, prj_ruimte rx WHERE pwx.prj_werkplek_key = wx.prj_werkplek_key AND rx.prj_scenario_key = pscenariokey_from AND wx.prj_ruimte_key = rx.prj_ruimte_key; -- Kopieer de objecten INSERT INTO prj_deel (prj_deel_key, ins_deel_key, prj_ruimte_key, prj_werkplek_key, prj_deel_omschrijving, ins_srtdeel_key, prj_deel_dwgx, prj_deel_dwgy, prj_deel_dwgrotatie, prj_deel_dwgschaal) SELECT NULL, dx.ins_deel_key, dx.prj_ruimte_key, prj_werkplek_key, dx.prj_deel_omschrijving, dx.ins_srtdeel_key, prj_deel_dwgx, prj_deel_dwgy, prj_deel_dwgrotatie, prj_deel_dwgschaal FROM prj_deel dx, prj_ruimte rx WHERE dx.prj_ruimte_key = rx.prj_ruimte_key AND rx.prj_scenario_key = pscenariokey_from; COMMIT; END prj_copy_scenario; PROCEDURE prj_reinitiate_scenario ( pscenariokey IN NUMBER, pverdiepingkey IN NUMBER ) AS BEGIN checkscenario (pscenariokey); -- Oogmerk van deze routine kan het opfrissen van het snapshot van dit scenario zijn met behoud van reeds gedane wijzigingen -- FUTURE EXTENSION END prj_reinitiate_scenario; -- Annuleer een scenario of een verdieping van een scenario -- Als pverdiepingkey NULL is, wordt ook het scenario verwijderd. PROCEDURE prj_cancel_scenario ( pscenariokey IN NUMBER, pverdiepingkey IN NUMBER ) AS dummy VARCHAR2 (1); BEGIN checkscenario (pscenariokey); IF TRUE OR pverdiepingkey IS NULL THEN DELETE FROM prj_ruimte rx WHERE rx.prj_scenario_key = pscenariokey; -- Deze cascadeert door naar de onderliggende items DELETE FROM prj_scenario WHERE prj_scenario_key = pscenariokey; ELSE -- Zet nu alle werkplekken die van een andere verdieping naar deze -- te verwijderen verdieping gezet zijn terug naar waar ze vandaan kwamen UPDATE prj_werkplek wx SET wx.prj_ruimte_key = (SELECT prj_ruimte_key FROM prj_ruimte rx, alg_ruimte r, prs_werkplek w WHERE wx.prs_werkplek_key = w.prs_werkplek_key AND w.prs_alg_ruimte_key = r.alg_ruimte_key AND rx.alg_ruimte_key = r.alg_ruimte_key AND rx.prj_scenario_key = pscenariokey) WHERE wx.prj_ruimte_key IN ( SELECT prj_ruimte_key FROM prj_ruimte WHERE alg_verdieping_key = pverdiepingkey AND prj_scenario_key = pscenariokey); -- De personen die van een andere verdieping op een werkplke zijn gezet die nu -- gaat vervallen, komen tussen de thuislozen terecht. Terugzetten op hun oude plek -- is nl. ook niet altijd triviaal. Het zou mooi zijn als ze nu vanuit dat reservoir -- een nieuwe plek kunnen gaat krijgen. -- Suggestie: dergelijke personen in de buffer gooien? -- Vervolgens worden nu de ruimtekopien van de gevraagde verdieping weer verwijderd. DELETE FROM prj_ruimte rx WHERE rx.prj_scenario_key = pscenariokey AND rx.alg_verdieping_key = pverdiepingkey; END IF; END prj_cancel_scenario; ---------------------------------------------- -- SCENARIO TRANSACTION PROCEDURES ---------------------------------------------- --------------------------------------- -- Moves a werkplek to another ruimte --------------------------------------- PROCEDURE prj_move_werkplek (pwerkplekkey IN NUMBER, pruimtekey IN NUMBER) AS currentnr prj_werkplek.prj_werkplek_volgnr%TYPE; currentomschrijving prj_werkplek.prj_werkplek_omschrijving%TYPE; currentruimtenr prj_ruimte.prj_ruimte_nr%TYPE; werkpleknr prj_werkplek.prj_werkplek_volgnr%TYPE; werkplekomschrijving prj_werkplek.prj_werkplek_omschrijving%TYPE; scenariokey prj_ruimte.prj_scenario_key%TYPE; BEGIN SELECT w.prj_werkplek_volgnr, w.prj_werkplek_omschrijving, r.prj_ruimte_nr INTO currentnr, currentomschrijving, currentruimtenr FROM prj_werkplek w, prj_ruimte r WHERE w.prj_ruimte_key = r.prj_ruimte_key AND prj_werkplek_key = pwerkplekkey; werkpleknr := TO_NUMBER (forceuniqueness ('PRJ_WERKPLEK', pruimtekey, TO_CHAR (currentnr), NULL)); -- verzin een nieuwe naam als de oude begon met het nummer van de oorspronkelijke ruimte IF INSTR (currentomschrijving, currentruimtenr || '/') = 1 THEN werkplekomschrijving := defaultwpomschrijving (pruimtekey, werkpleknr); ELSE werkplekomschrijving := currentomschrijving; END IF; UPDATE prj_werkplek SET prj_ruimte_key = pruimtekey, prj_werkplek_volgnr = werkpleknr, prj_werkplek_omschrijving = werkplekomschrijving WHERE prj_werkplek_key = pwerkplekkey AND prj_ruimte_key <> pruimtekey; -- niet onnodig moven SELECT prj_scenario_key INTO scenariokey FROM prj_ruimte WHERE prj_ruimte_key = pruimtekey; END; ------------------------------------- -- Find a sufficiently free werkplek in ruimte pruimtekey -- If necessary create a new one ------------------------------------- FUNCTION find_or_create_free_werkplek ( pruimtekey IN NUMBER, bezetting IN NUMBER ) RETURN NUMBER IS omschrijving VARCHAR2 (30); prefix VARCHAR2 (30); werkplekkey prj_werkplek.prj_werkplek_key%TYPE; werkpleknr prj_werkplek.prj_werkplek_volgnr%TYPE; werkplekomschrijving prj_werkplek.prj_werkplek_omschrijving%TYPE; BEGIN BEGIN -- Wat is de eerste werkplek in de nieuwe ruimte waarin deze bezetting zou passen? SELECT prj_werkplek_key INTO werkplekkey FROM (SELECT wx.prj_werkplek_key FROM (SELECT * FROM prj_werkplek WHERE prj_werkplek_verwijder IS NULL) wx, (SELECT * FROM prj_perslidwerkplek WHERE prj_perslidwerkplek_verwijder IS NULL) pwx WHERE wx.prj_ruimte_key = pruimtekey AND wx.prj_werkplek_key = pwx.prj_werkplek_key(+) GROUP BY wx.prj_werkplek_key HAVING NVL (SUM (pwx.prj_perslidwerkplek_bezetting), 0) + bezetting <= 100) WHERE ROWNUM = 1; EXCEPTION WHEN NO_DATA_FOUND THEN -- Zo nee: verzin er eentje (begin bij 1 te tellen) werkpleknr := TO_NUMBER (forceuniqueness ('PRJ_WERKPLEK', pruimtekey, TO_CHAR (1), NULL ) ); werkplekomschrijving := defaultwpomschrijving (pruimtekey, werkpleknr); INSERT INTO prj_werkplek (prj_werkplek_key, prs_werkplek_key, prj_werkplek_volgnr, prj_werkplek_omschrijving, prj_werkplek_vastopp, prj_ruimte_key ) VALUES (NULL, NULL, werkpleknr, werkplekomschrijving, NULL, pruimtekey ); SELECT prj_werkplek_key INTO werkplekkey FROM prj_werkplek WHERE prj_ruimte_key = pruimtekey AND prj_werkplek_volgnr = werkpleknr AND prj_werkplek_verwijder IS NULL; --DBMS_OUTPUT.put_line ('inserted _VAR(werkplekkey):' || TO_CHAR (werkplekkey)); END; RETURN werkplekkey; END; -- Function find_or_create_free_werkplek ------------------------------------- -- Moves a perslidwerkplek (bezetting) to another ruimte/werkplek. The old werkplek remains -- pwerkplekkey is optional and acts like a preferred werkplek and will be used -- even if it does not fit ------------------------------------- PROCEDURE prj_move_perslidwerkplek ( pperslidwerkplekkey IN NUMBER, pruimtekey IN NUMBER, pwerkplekkey IN NUMBER ) AS oldruimtekey prj_werkplek.prj_ruimte_key%TYPE; oldwerkplekkey prj_werkplek.prj_werkplek_key%TYPE; currentbezetting prj_perslidwerkplek.prj_perslidwerkplek_bezetting%TYPE; reedsbezet prj_perslidwerkplek.prj_perslidwerkplek_bezetting%TYPE; scenariokey prj_ruimte.prj_scenario_key%TYPE; werkplekkey prj_werkplek.prj_werkplek_key%TYPE; BEGIN -- Wat is eigenlijk de ruimte/werkplek van herkomst en de actuele bezetting van de te verplaatsen werkplek? SELECT wx.prj_ruimte_key, pwx.prj_perslidwerkplek_bezetting, wx.prj_werkplek_key INTO oldruimtekey, currentbezetting, oldwerkplekkey FROM prj_werkplek wx, prj_perslidwerkplek pwx WHERE wx.prj_werkplek_key = pwx.prj_werkplek_key AND pwx.prj_perslidwerkplek_key = pperslidwerkplekkey; --DBMS_OUTPUT.put_line ('_VAR(oldruimtekey):' || TO_CHAR (oldruimtekey)); --DBMS_OUTPUT.put_line ('_VAR(currentbezetting):' || TO_CHAR (currentbezetting)); IF pwerkplekkey IS NOT NULL AND pwerkplekkey = oldwerkplekkey THEN RETURN; END IF; IF pwerkplekkey IS NOT NULL THEN werkplekkey := pwerkplekkey; ELSE -- Is de bestemmingsruimte een andere dan de huidige? IF pruimtekey = oldruimtekey THEN RETURN; END IF; werkplekkey := find_or_create_free_werkplek (pruimtekey, currentbezetting); END IF; -- Er is nu een werkplekkey bepaald. UPDATE prj_perslidwerkplek SET prj_werkplek_key = werkplekkey WHERE prj_perslidwerkplek_key = pperslidwerkplekkey AND prj_werkplek_key <> werkplekkey; -- niet onnodig moven (dubbelcheck) COMMIT; END; ------------------------------------- -- Moves a perslid to a ruimte -- Gebruikt als prs_werkplek_implicit==1 -- We negeren bezetting en maken altijd een nieuwe werkplek aan ------------------------------------- PROCEDURE prj_move_perslid2 ( pperslidkey IN NUMBER, pruimtekey IN NUMBER ) AS werkplekkey prj_werkplek.prj_werkplek_key%TYPE; oudepwpkey prj_perslidwerkplek.prj_perslidwerkplek_key%TYPE; BEGIN werkplekkey := find_or_create_free_werkplek (pruimtekey, 101); -- Door 101 krijgen we altijd een nieuwe -- Is er nog een tijdens *dit* scenario vervallen werkplekbezettingsrecord? -- Zo ja, dan willen we deze gebruiken om de binding tussen Van en Naar -- zo goed mogelijk te behouden. Alleen relevant als het om een oorspronkelijk -- bezettingsrecord gaat (met verwijzing naar de werkelijkheid) BEGIN SELECT prj_perslidwerkplek_key INTO oudepwpkey FROM prj_perslidwerkplek pwx, prj_werkplek wx, prj_ruimte rx, prj_ruimte rx2 WHERE rx.prj_ruimte_key = wx.prj_ruimte_key AND rx.prj_scenario_key = rx2.prj_scenario_key AND rx2.prj_ruimte_key = pruimtekey AND wx.prj_werkplek_key = pwx.prj_werkplek_key AND pwx.prs_perslid_key = pperslidkey AND pwx.prs_perslidwerkplek_key IS NOT NULL AND pwx.prj_perslidwerkplek_verwijder IS NOT NULL; UPDATE prj_perslidwerkplek SET prj_perslidwerkplek_verwijder = NULL, prj_werkplek_key = werkplekkey WHERE prj_perslidwerkplek_key = oudepwpkey; EXCEPTION WHEN NO_DATA_FOUND THEN --DBMS_OUTPUT.put_line ('_VAR(werkplekkey):' || TO_CHAR (werkplekkey)); -- Er is nu een werkplekkey bepaald. INSERT INTO prj_perslidwerkplek (prj_werkplek_key, prs_perslid_key) VALUES (werkplekkey, pperslidkey); END; COMMIT; END; ------------------------------------- -- Moves a perslidwerkplek (bezetting) to another ruimte/werkplek. The old werkplek remains -- pwerkplekkey is optional and acts like a preferred werkplek and will be used -- even if it does not fit -- Zie ook variant prj_move_perslid2 ------------------------------------- PROCEDURE prj_move_perslid ( pperslidkey IN NUMBER, pruimtekey IN NUMBER, pwerkplekkey IN NUMBER ) AS reedsbezet prj_perslidwerkplek.prj_perslidwerkplek_bezetting%TYPE; doelbezetting prj_perslidwerkplek.prj_perslidwerkplek_bezetting%TYPE; werkplekkey prj_werkplek.prj_werkplek_key%TYPE; werkpleknr prj_werkplek.prj_werkplek_volgnr%TYPE; werkplekomschrijving prj_werkplek.prj_werkplek_omschrijving%TYPE; scenariokey prj_ruimte.prj_scenario_key%TYPE; oudepwpkey prj_perslidwerkplek.prj_perslidwerkplek_key%TYPE; BEGIN -- Wat is de te gebruiken bezetting van deze persoon (100 minus reeds op andere plekken aanwezig)? -- TODO: dienstverband verwerken -- TODO: persoon kan ook nog bezetting hebben op verdiepingen die niet bij het project betrokken zijn!! SELECT 100 - NVL (SUM (pwx.prj_perslidwerkplek_bezetting), 0) INTO doelbezetting FROM prj_perslidwerkplek pwx, prj_werkplek pw WHERE pwx.prs_perslid_key = pperslidkey --AND pw.prj_ruimte_key = pruimtekey AND pwx.prj_werkplek_key = pw.prj_werkplek_key AND prj_perslidwerkplek_verwijder IS NULL; IF pwerkplekkey IS NOT NULL THEN werkplekkey := pwerkplekkey; ELSE werkplekkey := find_or_create_free_werkplek (pruimtekey, doelbezetting); END IF; -- Is er nog een tijdens *dit* scenario vervallen werkplekbezettingsrecord? -- Zo ja, dan willen we deze gebruiken om de binding tussen Van en Naar -- zo goed mogelijk te behouden. Alleen relevant als het om een oorspronkelijk -- bezettingsrecord gaat (met verwijzing naar de werkelijkheid) BEGIN SELECT prj_perslidwerkplek_key INTO oudepwpkey FROM prj_perslidwerkplek pwx, prj_werkplek wx, prj_ruimte rx, prj_ruimte rx2 WHERE rx.prj_ruimte_key = wx.prj_ruimte_key AND rx.prj_scenario_key = rx2.prj_scenario_key AND rx2.prj_ruimte_key = pruimtekey AND wx.prj_werkplek_key = pwx.prj_werkplek_key AND pwx.prs_perslid_key = pperslidkey AND pwx.prs_perslidwerkplek_key IS NOT NULL AND pwx.prj_perslidwerkplek_verwijder IS NOT NULL; UPDATE prj_perslidwerkplek SET prj_perslidwerkplek_verwijder = NULL, prj_perslidwerkplek_bezetting = doelbezetting, prj_werkplek_key = werkplekkey WHERE prj_perslidwerkplek_key = oudepwpkey; EXCEPTION WHEN NO_DATA_FOUND THEN --DBMS_OUTPUT.put_line ('_VAR(werkplekkey):' || TO_CHAR (werkplekkey)); -- Er is nu een werkplekkey bepaald. INSERT INTO prj_perslidwerkplek (prj_werkplek_key, prs_perslid_key, prj_perslidwerkplek_bezetting ) VALUES (werkplekkey, pperslidkey, doelbezetting ); END; COMMIT; END; ---------------------------------------------- -- SCENARIO COMMIT PROCEDURES ---------------------------------------------- PROCEDURE prj_commit_additions (pscenariokey IN NUMBER) AS CURSOR new_ruimte (sk IN NUMBER) IS SELECT alg_verdieping_key, prj_ruimte_nr, prj_ruimte_omschrijving, prj_ruimte_bruto_vloeropp, alg_srtruimte_key, prj_ruimte_omtrek, prj_ruimte_inhoud, prj_ruimte_opmerking, prj_ruimte_key FROM prj_ruimte rx WHERE rx.prj_ruimte_verwijder IS NULL AND rx.alg_ruimte_key IS NULL AND rx.prj_scenario_key = sk; CURSOR new_werkplek (sk IN NUMBER) IS SELECT prj_werkplek_volgnr, prj_werkplek_omschrijving, prj_werkplek_vastopp, prj_werkplek_opp, rx.alg_ruimte_key, prj_werkplek_key, prj_werkplek_dwgx,prj_werkplek_dwgy, prj_werkplek_dwgrotatie,prj_werkplek_dwgschaal FROM prj_werkplek wx, prj_ruimte rx WHERE wx.prj_werkplek_verwijder IS NULL AND wx.prs_werkplek_key IS NULL AND rx.prj_ruimte_key = wx.prj_ruimte_key AND rx.prj_scenario_key = sk; CURSOR new_perslidwerkplek (sk IN NUMBER) IS SELECT prs_perslid_key, prs_werkplek_key, prj_perslidwerkplek_bezetting, pwx.prj_perslidwerkplek_key FROM prj_perslidwerkplek pwx, prj_werkplek wx, prj_ruimte rx WHERE pwx.prj_perslidwerkplek_verwijder IS NULL AND pwx.prs_perslidwerkplek_key IS NULL AND wx.prj_werkplek_key = pwx.prj_werkplek_key AND rx.prj_ruimte_key = wx.prj_ruimte_key AND rx.prj_scenario_key = sk; CURSOR new_ruimteafdeling (sk IN NUMBER) IS SELECT rax.prs_afdeling_key, rx.alg_ruimte_key, prj_ruimteafdeling_bezetting, rax.prj_ruimteafdeling_key FROM prj_ruimteafdeling rax, prj_ruimte rx WHERE rx.prj_ruimte_key = rax.prj_ruimte_key AND rax.prj_ruimteafdeling_verwijder IS NULL AND rax.prs_ruimteafdeling_key IS NULL AND rx.prj_scenario_key = sk; CURSOR new_deel (sk IN NUMBER) IS SELECT dx.prj_deel_key, alg_locatie_key, prj_deel_omschrijving, ins_discipline_key, dx.ins_srtdeel_key, 'R' ins_alg_ruimte_type, alg_ruimte_key ins_alg_ruimte_key, prj_deel_dwgx, prj_deel_dwgy, prj_deel_dwgschaal, prj_deel_dwgrotatie FROM prj_deel dx, prj_ruimte rx, alg_verdieping v, alg_gebouw g, ins_srtdeel isd, ins_srtgroep isg WHERE dx.prj_deel_verwijder IS NULL AND dx.ins_deel_key IS NULL AND dx.prj_werkplek_key IS NULL AND dx.prj_ruimte_key = rx.prj_ruimte_key AND rx.alg_verdieping_key = v.alg_verdieping_key AND v.alg_gebouw_key = g.alg_gebouw_key AND dx.ins_srtdeel_key = isd.ins_srtdeel_key AND isd.ins_srtgroep_key = isg.ins_srtgroep_key AND rx.prj_scenario_key = sk UNION ALL SELECT dx.prj_deel_key, alg_locatie_key, prj_deel_omschrijving, ins_discipline_key, dx.ins_srtdeel_key, 'W' ins_alg_ruimte_type, prs_werkplek_key ins_alg_ruimte_key, prj_deel_dwgx, prj_deel_dwgy, prj_deel_dwgschaal, prj_deel_dwgrotatie FROM prj_deel dx, prj_werkplek wx, prj_ruimte rx, alg_verdieping v, alg_gebouw g, ins_srtdeel isd, ins_srtgroep isg WHERE dx.prj_deel_verwijder IS NULL AND dx.ins_deel_key IS NULL AND wx.prj_werkplek_key = dx.prj_werkplek_key AND dx.prj_werkplek_key IS NOT NULL AND rx.prj_ruimte_key = wx.prj_ruimte_key AND rx.alg_verdieping_key = v.alg_verdieping_key AND v.alg_gebouw_key = g.alg_gebouw_key AND dx.ins_srtdeel_key = isd.ins_srtdeel_key AND isd.ins_srtgroep_key = isg.ins_srtgroep_key AND rx.prj_scenario_key = sk; aantal_r_toegevoegd NUMBER; aantal_w_toegevoegd NUMBER; aantal_pw_toegevoegd NUMBER; aantal_ra_toegevoegd NUMBER; aantal_d_toegevoegd NUMBER; ruimte_nr alg_ruimte.alg_ruimte_nr%TYPE; werkplek_nr prs_werkplek.prs_werkplek_volgnr%TYPE; deel_nr ins_deel.ins_deel_omschrijving%TYPE; BEGIN -- Nieuwe ruimtes toevoegen aantal_r_toegevoegd := 0; -- -- RUIMTES -- FOR v_ruimte IN new_ruimte (pscenariokey) LOOP ruimte_nr := forceuniqueness ('ALG_RUIMTE', v_ruimte.alg_verdieping_key, v_ruimte.prj_ruimte_nr, NULL ); INSERT INTO alg_ruimte r (alg_verdieping_key, alg_ruimte_nr, alg_ruimte_omschrijving, alg_ruimte_bruto_vloeropp, alg_srtruimte_key, alg_ruimte_omtrek, alg_ruimte_inhoud, alg_ruimte_opmerking ) VALUES (v_ruimte.alg_verdieping_key, ruimte_nr, v_ruimte.prj_ruimte_omschrijving, v_ruimte.prj_ruimte_bruto_vloeropp, v_ruimte.alg_srtruimte_key, v_ruimte.prj_ruimte_omtrek, v_ruimte.prj_ruimte_inhoud, v_ruimte.prj_ruimte_opmerking ); aantal_r_toegevoegd := aantal_r_toegevoegd + 1; -- Registreer de zojuist verworven key; deze is nodig voor de volgende stappen UPDATE prj_ruimte rx SET alg_ruimte_key = (SELECT alg_ruimte_key FROM alg_v_aanwezigruimte r WHERE r.alg_verdieping_key = v_ruimte.alg_verdieping_key AND r.alg_ruimte_nr = ruimte_nr) WHERE prj_ruimte_key = v_ruimte.prj_ruimte_key; END LOOP; -- -- WERKPLEKKEN -- aantal_w_toegevoegd := 0; FOR v_werkplek IN new_werkplek (pscenariokey) LOOP werkplek_nr := forceuniqueness ('PRS_WERKPLEK', v_werkplek.alg_ruimte_key, TO_CHAR (v_werkplek.prj_werkplek_volgnr), NULL ); -- Note: de omschrijving is meestal ruimtenr+volgnr. Bij nieuwe of verplaatsing is het wenselijk deze aan te passen? INSERT INTO prs_werkplek w (prs_werkplek_volgnr, prs_werkplek_omschrijving, prs_werkplek_vastopp, prs_werkplek_opp, prs_alg_ruimte_key, prs_werkplek_dwgx, prs_werkplek_dwgy, prs_werkplek_dwgrotatie, prs_werkplek_dwgschaal ) VALUES (werkplek_nr, v_werkplek.prj_werkplek_omschrijving, v_werkplek.prj_werkplek_vastopp, v_werkplek.prj_werkplek_opp, v_werkplek.alg_ruimte_key, v_werkplek.prj_werkplek_dwgx, v_werkplek.prj_werkplek_dwgy, v_werkplek.prj_werkplek_dwgrotatie, v_werkplek.prj_werkplek_dwgschaal ); aantal_w_toegevoegd := aantal_w_toegevoegd + 1; -- Registreer de zojuist verworven keys; deze zijn nodig voor de volgende stappen UPDATE prj_werkplek wx SET prs_werkplek_key = (SELECT prs_werkplek_key FROM prs_werkplek w WHERE w.prs_werkplek_volgnr = werkplek_nr AND w.prs_alg_ruimte_key = v_werkplek.alg_ruimte_key) WHERE prj_werkplek_key = v_werkplek.prj_werkplek_key; END LOOP; -- -- WERKPLEKBEZETTINGEN (anoniem) -- aantal_pw_toegevoegd := 0; FOR v_perslidwerkplek IN new_perslidwerkplek (pscenariokey) LOOP INSERT INTO prs_perslidwerkplek pw (prs_perslid_key, prs_werkplek_key, prs_perslidwerkplek_bezetting ) VALUES (v_perslidwerkplek.prs_perslid_key, v_perslidwerkplek.prs_werkplek_key, v_perslidwerkplek.prj_perslidwerkplek_bezetting ); -- Bijwerken van de nieuwe keys is niet nodig.. aantal_pw_toegevoegd := aantal_pw_toegevoegd + 1; END LOOP; -- -- RUIMTEAFDELINGBEZETTINGEN (anoniem) -- aantal_ra_toegevoegd := 0; FOR v_ruimteafdeling IN new_ruimteafdeling (pscenariokey) LOOP INSERT INTO prs_ruimteafdeling pw (prs_afdeling_key, alg_ruimte_key, prs_ruimteafdeling_bezetting ) VALUES (v_ruimteafdeling.prs_afdeling_key, v_ruimteafdeling.alg_ruimte_key, v_ruimteafdeling.prj_ruimteafdeling_bezetting ); -- Bijwerken van de nieuwe keys is niet nodig.. aantal_ra_toegevoegd := aantal_ra_toegevoegd + 1; END LOOP; -- -- OBJECTEN -- aantal_d_toegevoegd := 0; FOR v_deel IN new_deel (pscenariokey) LOOP deel_nr := forceuniqueness ('INS_DEEL', v_deel.alg_locatie_key, v_deel.prj_deel_omschrijving, v_deel.ins_srtdeel_key); INSERT INTO ins_deel (ins_srtdeel_key, ins_alg_ruimte_key, ins_alg_ruimte_type, ins_alg_locatie_key, ins_discipline_key, ins_deel_omschrijving, ins_deel_dwgx, ins_deel_dwgy, ins_deel_dwgschaal, ins_deel_dwgrotatie ) VALUES (v_deel.ins_srtdeel_key, v_deel.ins_alg_ruimte_key, v_deel.ins_alg_ruimte_type, v_deel.alg_locatie_key, v_deel.ins_discipline_key, deel_nr, v_deel.prj_deel_dwgx, v_deel.prj_deel_dwgy, v_deel.prj_deel_dwgschaal, v_deel.prj_deel_dwgrotatie ); -- Bijwerken van de nieuwe keys is niet nodig.. aantal_d_toegevoegd := aantal_d_toegevoegd + 1; end loop; END prj_commit_additions; PROCEDURE prj_commit_changes (pscenariokey IN NUMBER) AS CURSOR ruimte_updates (sk IN NUMBER) IS SELECT prj_ruimte_nr, prj_ruimte_omschrijving, prj_ruimte_bruto_vloeropp, alg_srtruimte_key, prj_ruimte_omtrek, prj_ruimte_inhoud, prj_ruimte_opmerking, alg_ruimte_key FROM prj_ruimte rx WHERE rx.prj_ruimte_verwijder IS NULL AND rx.alg_ruimte_key IS NOT NULL AND rx.prj_scenario_key = sk; CURSOR werkplek_updates (sk IN NUMBER) IS SELECT prj_werkplek_volgnr, prj_werkplek_omschrijving, prj_werkplek_vastopp, prj_werkplek_opp, prs_werkplek_key, alg_ruimte_key,prj_werkplek_dwgx, prj_werkplek_dwgy, prj_werkplek_dwgrotatie, prj_werkplek_dwgschaal FROM prj_werkplek wp, prj_ruimte rx WHERE wp.prj_ruimte_key = rx.prj_ruimte_key AND wp.prj_werkplek_verwijder IS NULL AND wp.prs_werkplek_key IS NOT NULL AND rx.prj_scenario_key = sk; -- Ruimte gebonden prj_deel CURSOR RMdeel_updates (sk IN NUMBER) IS SELECT ins_deel_key, alg_ruimte_key,prj_deel_dwgx, prj_deel_dwgy, prj_deel_dwgrotatie, prj_deel_dwgschaal, prj_deel_verwijder FROM prj_deel wp, prj_ruimte rx WHERE wp.prj_ruimte_key = rx.prj_ruimte_key AND wp.prj_werkplek_key is null --AND wp.prj_deel_verwijder IS NULL AND wp.ins_deel_key IS NOT NULL AND rx.prj_scenario_key = sk; -- Werkplek gebonden prj_deel CURSOR WPdeel_updates (sk IN NUMBER) IS SELECT ins_deel_key, prs_werkplek_key,prj_deel_dwgx, prj_deel_dwgy, prj_deel_dwgrotatie, prj_deel_dwgschaal, prj_deel_verwijder FROM prj_deel pd, prj_werkplek pw, prj_ruimte pr WHERE pd.prj_werkplek_key = pw.prj_werkplek_key AND pw.prj_ruimte_key = pr.prj_ruimte_key --AND pd.prj_deel_verwijder IS NOT NULL AND pd.ins_deel_key IS NOT NULL AND pr.prj_scenario_key = sk; CURSOR perslidwerkplek_updates (sk IN NUMBER) IS SELECT prs_perslid_key, prj_perslidwerkplek_bezetting, prs_perslidwerkplek_key, prs_werkplek_key FROM prj_perslidwerkplek pwp, prj_werkplek wp, prj_ruimte rx WHERE pwp.prj_werkplek_key = wp.prj_werkplek_key AND wp.prj_ruimte_key = rx.prj_ruimte_key AND wp.prj_werkplek_verwijder IS NULL AND wp.prs_werkplek_key IS NOT NULL AND rx.prj_scenario_key = sk; CURSOR ruimteafdeling_updates (sk IN NUMBER) IS SELECT rax.prs_afdeling_key, rx.alg_ruimte_key, prj_ruimteafdeling_bezetting, rax.prs_ruimteafdeling_key FROM prj_ruimteafdeling rax, prj_ruimte rx WHERE rx.prj_ruimte_key = rax.prj_ruimte_key AND rax.prj_ruimteafdeling_verwijder IS NULL AND rax.prj_ruimteafdeling_key IS NOT NULL AND rx.prj_scenario_key = sk; werkplek_nr PRJ_WERKPLEK.prj_werkplek_volgnr%TYPE; BEGIN BEGIN -- Bestaande ruimtes aanpassen FOR cr IN ruimte_updates (pscenariokey) LOOP UPDATE alg_ruimte r SET alg_ruimte_nr = cr.prj_ruimte_nr, alg_ruimte_omschrijving = cr.prj_ruimte_omschrijving, alg_ruimte_bruto_vloeropp = cr.prj_ruimte_bruto_vloeropp, alg_srtruimte_key = cr.alg_srtruimte_key, alg_ruimte_omtrek = cr.prj_ruimte_omtrek, alg_ruimte_inhoud = cr.prj_ruimte_inhoud, alg_ruimte_opmerking = cr.prj_ruimte_opmerking WHERE r.alg_ruimte_verwijder IS NULL AND r.alg_ruimte_key = cr.alg_ruimte_key; END LOOP; -- Bestaande ruimte delen aanpassen FOR cr IN RMdeel_updates (pscenariokey) LOOP UPDATE ins_deel r SET ins_alg_ruimte_key = cr.alg_ruimte_key, ins_deel_dwgx = cr.prj_deel_dwgx, ins_deel_dwgy = cr.prj_deel_dwgy, ins_deel_dwgrotatie = cr.prj_deel_dwgrotatie, ins_deel_dwgschaal = cr.prj_deel_dwgschaal, ins_deel_verwijder = cr.prj_deel_verwijder WHERE r.ins_deel_verwijder IS NULL AND r.ins_deel_key = cr.ins_deel_key; END LOOP; -- Bestaande werkplek delen aanpassen FOR cr IN WPdeel_updates (pscenariokey) LOOP UPDATE ins_deel r SET ins_alg_ruimte_key = cr.prs_werkplek_key, ins_deel_dwgx = cr.prj_deel_dwgx, ins_deel_dwgy = cr.prj_deel_dwgy, ins_deel_dwgrotatie = cr.prj_deel_dwgrotatie, ins_deel_dwgschaal = cr.prj_deel_dwgschaal, ins_deel_verwijder = cr.prj_deel_verwijder WHERE r.ins_deel_verwijder IS NULL AND r.ins_deel_key = cr.ins_deel_key; END LOOP; -- Bestaande werkplekken aanpassen FOR cr IN werkplek_updates (pscenariokey) LOOP werkplek_nr := forceuniqueness ('PRS_WERKPLEK', cr.alg_ruimte_key, TO_CHAR (cr.prj_werkplek_volgnr), NULL ); UPDATE prs_werkplek r SET prs_alg_ruimte_key = cr.alg_ruimte_key, prs_werkplek_volgnr = werkplek_nr, prs_werkplek_omschrijving = cr.prj_werkplek_omschrijving, prs_werkplek_vastopp = cr.prj_werkplek_vastopp, prs_werkplek_opp = cr.prj_werkplek_opp, prs_werkplek_dwgx = cr.prj_werkplek_dwgx, prs_werkplek_dwgy = cr.prj_werkplek_dwgy, prs_werkplek_dwgrotatie = cr.prj_werkplek_dwgrotatie, prs_werkplek_dwgschaal = cr.prj_werkplek_dwgschaal WHERE r.prs_werkplek_key = cr.prs_werkplek_key; END LOOP; -- Bestaande perslidwerkplekken aanpassen FOR cr IN perslidwerkplek_updates (pscenariokey) LOOP UPDATE prs_perslidwerkplek r SET prs_werkplek_key = cr.prs_werkplek_key, prs_perslid_key = cr.prs_perslid_key, prs_perslidwerkplek_bezetting = cr.prj_perslidwerkplek_bezetting WHERE r.prs_perslidwerkplek_key = cr.prs_perslidwerkplek_key; END LOOP; -- Bestaande ruimteafdelingen aanpassen FOR cr IN ruimteafdeling_updates (pscenariokey) LOOP UPDATE prs_ruimteafdeling r SET prs_afdeling_key = cr.prs_afdeling_key, alg_ruimte_key = cr.alg_ruimte_key, prs_ruimteafdeling_bezetting = cr.prj_ruimteafdeling_bezetting WHERE r.prs_ruimteafdeling_verwijder IS NULL AND r.prs_ruimteafdeling_key = cr.prs_ruimteafdeling_key; END LOOP; END; END prj_commit_changes; PROCEDURE prj_commit_deletions (pscenariokey IN NUMBER) AS BEGIN -- PF: NIEMAND HEEFT HET ER OVER, MAAR ALS IK DIT ZO LEES DAN -- GAAT DIR VERSCHRIKKELIJK ANDERS DAN DAT ER BEOOGD WORDT. -- VOLGENS MIJ WORDT HIER ALLES-OF-NIKS WEGGEGOOID!! -- De Deletes hieronder lijkt me meer de richting -- Vervallen ruimtes laten vervallen UPDATE alg_ruimte r SET alg_ruimte_verwijder = (SELECT SYSDATE FROM prj_ruimte rx WHERE rx.alg_ruimte_key = r.alg_ruimte_key AND rx.prj_ruimte_verwijder IS NOT NULL AND rx.alg_ruimte_key IS NOT NULL AND rx.prj_scenario_key = pscenariokey) WHERE r.alg_ruimte_verwijder IS NULL; -- Vervallen werkplekken laten vervallen DELETE FROM prs_werkplek p WHERE p.prs_werkplek_key IN (SELECT pw.prs_werkplek_key FROM prj_werkplek pw, prj_ruimte rx WHERE pw.prj_ruimte_key = rx.prj_ruimte_key AND pw.prj_werkplek_verwijder IS NOT NULL AND pw.prs_werkplek_key IS NOT NULL AND rx.prj_scenario_key = pscenariokey); -- Vervallen perslidwerkplekken verwijderen DELETE FROM prs_perslidwerkplek p WHERE p.prs_perslidwerkplek_key IN (SELECT ppw.prs_perslidwerkplek_key FROM prj_perslidwerkplek ppw, prj_werkplek pw, prj_ruimte rx WHERE ppw.prj_werkplek_key = pw.prj_werkplek_key AND pw.prj_ruimte_key = rx.prj_ruimte_key AND ppw.prj_perslidwerkplek_verwijder IS NOT NULL AND ppw.prs_perslidwerkplek_key IS NOT NULL AND rx.prj_scenario_key = pscenariokey); -- Vervallen ruimteafdelingen laten vervallen UPDATE prs_ruimteafdeling p SET prs_ruimteafdeling_verwijder = (SELECT SYSDATE FROM prj_ruimteafdeling pra, prj_ruimte rx WHERE pra.prj_ruimte_key = rx.prj_ruimte_key AND pra.prs_ruimteafdeling_key = p.prs_ruimteafdeling_key AND pra.prj_ruimteafdeling_verwijder IS NOT NULL AND pra.prs_ruimteafdeling_key IS NOT NULL AND rx.prj_scenario_key = pscenariokey) WHERE p.prs_ruimteafdeling_verwijder IS NULL; END prj_commit_deletions; PROCEDURE prj_commit_cleanup (pscenariokey IN NUMBER) AS requestkey prj_scenario.mld_melding_key%TYPE; BEGIN -- Voor welke aanvraag was dit scenario een oplossing? SELECT mld_melding_key INTO requestkey FROM prj_scenario WHERE prj_scenario_key = pscenariokey; IF requestkey IS NOT NULL THEN DELETE FROM prj_scenario WHERE mld_melding_key = requestkey; ELSE DELETE FROM prj_scenario WHERE prj_scenario_key = pscenariokey; END IF; END prj_commit_cleanup; PROCEDURE prj_commit_scenario (pscenariokey IN NUMBER) AS dummy VARCHAR2 (1); BEGIN checkscenario (pscenariokey); prj_commit_deletions (pscenariokey); prj_commit_changes (pscenariokey); prj_commit_additions (pscenariokey); -- Als laatste om tijdelijke dubbelen te voorkomen prj_commit_cleanup (pscenariokey); END prj_commit_scenario; PROCEDURE remove(p_scenario_key IN NUMBER) AS BEGIN DELETE FROM prj_scenario WHERE prj_scenario_key = p_scenario_key; -- Van de volgende tabellen worden de records die naar deze p_scenario_key -- verwijzen met ON DELETE CASCADE ook verwijderd: -- prj_scenario_note -- prj_ruimte -- Hierdoor worden de afhankelijkheden in de volgende tabellen ook verwijderd: -- prj_deel -- prj_ruimteafdeling -- prj_werkplek -- prj_perslidwerkplek -- prj_selectie fac.remove_tracking('scenario', p_scenario_key); END; END prj; / REGISTERRUN('$Id$') #endif // PRJ