1248 lines
55 KiB
Plaintext
1248 lines
55 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)
|
|
AND w.prs_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;
|
|
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_verwijder IS NULL
|
|
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 pw.prs_perslidwerkplek_verwijder IS NULL
|
|
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_v_aanwezigwerkplek 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_v_aanwezigwerkplek 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_verwijder IS NULL
|
|
AND 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_verwijder IS NULL
|
|
AND 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
|
|
-- 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
|
|
UPDATE prs_werkplek p
|
|
SET prs_werkplek_verwijder =
|
|
(SELECT SYSDATE
|
|
FROM prj_werkplek pw, prj_ruimte rx
|
|
WHERE pw.prj_ruimte_key = rx.prj_ruimte_key
|
|
AND pw.prs_werkplek_key = p.prs_werkplek_key
|
|
AND pw.prj_werkplek_verwijder IS NOT NULL
|
|
AND pw.prs_werkplek_key IS NOT NULL
|
|
AND rx.prj_scenario_key = pscenariokey)
|
|
WHERE p.prs_werkplek_verwijder IS NULL;
|
|
-- Vervallen perslidwerkplekken laten vervallen
|
|
UPDATE prs_perslidwerkplek p
|
|
SET prs_perslidwerkplek_verwijder =
|
|
(SELECT SYSDATE
|
|
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.prs_perslidwerkplek_key =
|
|
p.prs_perslidwerkplek_key
|
|
AND ppw.prj_perslidwerkplek_verwijder IS NOT NULL
|
|
AND ppw.prs_perslidwerkplek_key IS NOT NULL
|
|
AND rx.prj_scenario_key = pscenariokey)
|
|
WHERE p.prs_perslidwerkplek_verwijder IS NULL;
|
|
-- 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
|