Files
Database/PRJ/PRJ_PAC.SRC
Peter Feij 9949fdf9bc FSN#26947 perslidwerkplek_verwijder en werkplek_verwijder vervallen
svn path=/Database/trunk/; revision=19016
2013-09-06 16:03:27 +00:00

1244 lines
54 KiB
Plaintext

#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 ;
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.get_description('LPN_INS_DEEL',parent_key , ins_srtdeel_code_upper, srtdeelkey)
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) = 999
THEN
-- Ik kan met 3 cijfers niet hoger, begin opnieuw onderaan (to prevent infinite recursion)
omschrijving :=
forceuniqueness (element_type, parent_key, '000', 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) = 999
THEN
-- Ik kan met 3 cijfers niet hoger, begin opnieuw onderaan (to prevent infinite recursion)
omschrijving :=
forceuniqueness (element_type, parent_key, '000', 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 (-20002, '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;
END prj;
/
REGISTERRUN('$Workfile: Prj_pac.src $','$Revision$')
#endif // PRJ