Files
Database/PRJ/PRJ_TRI.SRC
Erik Groener b2b8bf8bf1 #ifdef INS en #ifdef PRS verwijderd
svn path=/Database/trunk/; revision=6984
1999-07-23 10:28:22 +00:00

322 lines
10 KiB
Plaintext

#ifdef PRJ
#include "comsql.h"
/* Revisie:
**
** 22-07-1999 EGR prj_t_prj_ruimte_B_IU, prj_t_prj_deel_b_iu, prj_t_prj_deel_s_b_iu,
** prj_t_prj_deel_s_a_iu, prj_t_prj_werkplek_b_iu aangemaakt.
** 20-04-1999 ABO Aangemaakt
*/
CREATE_TRIGGER(prj_t_prj_project_b_iu)
BEFORE INSERT OR UPDATE ON prj_project
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prj_project_key
,prj_s_prj_project_key);
END;
/
CREATE_TRIGGER(cad_t_cad_tekening_B_IU)
BEFORE INSERT OR UPDATE ON cad_tekening
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(cad_tekening_key
,cad_s_cad_tekening_key);
UPDATE_AANMAAKDATUM(cad_tekening
,cad_tekening_aanmaak);
IF :new.prj_project_key IS NOT NULL
THEN
:new.cad_tekening_filenaam := :new.cad_tekening_key ||'.DWG';
END IF;
END;
/
CREATE_TRIGGER(prj_t_prj_ruimte_B_IU)
BEFORE INSERT OR UPDATE ON prj_ruimte
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(alg_ruimte_key
,alg_s_alg_onroerendgoed_keys);
CHECK_CADMUTATIE(alg_ruimte_verwijder
,alg_ruimte_getekend
,'alg_m245');
/*
** Als er een INV-deel bestaat in de te verwijderen ruimte
** dan mag de ruimte niet verwijderd worden.
*/
IF :new.alg_ruimte_verwijder IS NOT NULL
THEN
DECLARE
dummy CHAR;
BEGIN
SELECT 'x'
INTO dummy
FROM prj_deel
WHERE ins_alg_ruimte_key = :new.alg_ruimte_key
AND prj_project_key = :new.prj_project_key
AND ins_alg_ruimte_type = 'R'
AND ins_deel_verwijder IS NULL;
APPLICATION_ERROR(-20000, 'prs_m055');
EXCEPTION
WHEN NO_DATA_FOUND
THEN NULL;
WHEN TOO_MANY_ROWS
THEN APPLICATION_ERROR(-20000, 'prs_m055');
END;
END IF;
/*
** Als de ruimte verwijderd wordt, dan moeten ook de bijbehorende
** werkplekken verwijderd worden.
*/
BEGIN
IF :new.alg_ruimte_verwijder IS NOT NULL
OR (:new.alg_ruimte_verwijder IS NULL AND :old.alg_ruimte_verwijder IS NOT NULL)
THEN
UPDATE prj_werkplek
SET prs_werkplek_verwijder = :new.alg_ruimte_verwijder
WHERE prj_werkplek.prs_alg_ruimte_key = :new.alg_ruimte_key
AND prj_werkplek.prj_project_key = :new.prj_project_key;
END IF;
END;
/*
** Als de ruimte verwijderd wordt, dan moeten ook de bijbehorende
** objecten verwijderd wordne.
*/
BEGIN
IF :new.alg_ruimte_verwijder IS NOT NULL
OR (:new.alg_ruimte_verwijder IS NULL AND :old.alg_ruimte_verwijder IS NOT NULL)
THEN
UPDATE prj_deel
SET ins_deel_verwijder = :new.alg_ruimte_verwijder
, ins_deel_getekend = :new.alg_ruimte_getekend
WHERE prj_deel.ins_alg_ruimte_key = :new.alg_ruimte_key
AND prj_deel.prj_project_key = :new.prj_project_key
AND ins_alg_ruimte_type <> 'W';
END IF;
END;
END;
/
CREATE_TRIGGER(prj_t_prj_deel_S_B_IU)
BEFORE INSERT OR UPDATE ON prj_deel
DECLARE
Dummy BOOLEAN;
BEGIN
Dummy := fac_p_fac_save_restore.ResetSelectie('PRJ_DEEL');
Dummy := fac_p_fac_save_restore.ResetSelectie('PRJ_DEEL_VERWIJDER');
Dummy := fac_p_fac_save_restore.ResetSelectie('PRJ_DEEL_CASCADE');
Dummy := fac_p_fac_save_restore.ResetSelectie('PRJ_DEEL_PROJECT');
END;
/
CREATE_TRIGGER(prj_t_prj_deel_B_IU)
BEFORE INSERT OR UPDATE ON prj_deel
FOR EACH ROW
BEGIN
LOG('Begin PRJ_T_PRJ_DEEL_B_IU');
UPDATE_PRIMARY_KEY(ins_deel_key
,ins_s_ins_inst_keys);
CHECK_CADMUTATIE2(ins_deel_verwijder
,ins_deel_getekend
,ins_alg_ruimte_key
,'ins_m187');
/*
** Het zetten van de verwijderingsdatum gebeurt via FAC_P_FAC_SAVE_RESTORE-package. De key
** voor het verwijderen wordt vastgelegd als tabelnaam PRJ_DEEL_VERWIJDER.
** Verwijderen van INS_DEELKOPPELING-records gebeurt via FAC_P_FAC_SAVE_RESTORE-package.
** Hier hoeft alleen de PRJ_DEEL_KEY onthouden te worden.
** anders krijg je ORA-4094: Mutating-trigger-bla.
*/
IF :new.ins_deel_verwijder IS NOT NULL
THEN
DECLARE
Dummy BOOLEAN;
BEGIN
Dummy := fac_p_fac_save_restore.SavePrimaryKey('PRJ_DEEL' , :new.ins_deel_key);
Dummy := fac_p_fac_save_restore.SavePrimaryKey('PRJ_DEEL_VERWIJDER', :new.ins_deel_key);
Dummy := fac_p_fac_save_restore.SavePrimaryKey('PRJ_DEEL_PROJECT' , :new.prj_project_key);
END;
END IF;
/*
** Vul het veld INS_DISCIPLINE van het huidige deel.
*/
IF :old.ins_srtdeel_key IS NULL
OR :old.ins_srtdeel_key <> :new.ins_srtdeel_key
OR :old.ins_discipline_key IS NULL
THEN
BEGIN
SELECT INS_D.ins_discipline_key
INTO :new.ins_discipline_key
FROM ins_srtdeel INS_SD
, ins_srtgroep INS_SG
, ins_tab_discipline INS_D
WHERE INS_SD.ins_srtdeel_key = :new.ins_srtdeel_key
AND INS_SD.ins_srtgroep_key = INS_SG.ins_srtgroep_key
AND INS_SG.ins_discipline_key = INS_D.ins_discipline_key;
EXCEPTION
WHEN NO_DATA_FOUND
THEN :new.ins_discipline_key := NULL;
END;
END IF;
/*
** Vul het veld INS_ALG_LOCATIE_KEY van het huidige deel
*/
IF :old.ins_alg_ruimte_key IS NULL
OR :old.ins_alg_ruimte_key <> :new.ins_alg_ruimte_key
OR :new.ins_alg_locatie_key IS NULL
THEN
BEGIN
SELECT prj_project_locatie_key
INTO :new.ins_alg_locatie_key
FROM prj_project
WHERE prj_project_key = :new.prj_project_key;
EXCEPTION
WHEN NO_DATA_FOUND
THEN :new.ins_alg_locatie_key := NULL;
END;
END IF;
/*
** Bij INS_DEEL moet INS_ALG_RUIMTE_KEY ingevuld zijn
** en wel met ruimte, werkplek of terreinsector.
** Daarvoor moet ook het INS_ALG_RUIMTE_TYPE veld goed ingevuld zijn
** (met 'R' of 'W' of 'T').
** Dit geldt als INS_ALG_RUIMTE_KEY veranderd is of als er een
** nieuw record geinsert wordt.
*/
IF (:old.ins_alg_ruimte_key <> :new.ins_alg_ruimte_key
OR :old.ins_alg_ruimte_key IS NULL)
THEN
IF :new.ins_alg_ruimte_type = 'W'
THEN
DECLARE
dummy NUMBER(10);
BEGIN
SELECT prs_werkplek_key
INTO dummy
FROM prj_v_aanwezigwerkplek
WHERE prs_werkplek_key = :new.ins_alg_ruimte_key
AND prj_project_key = :new.prj_project_key;
EXCEPTION
WHEN NO_DATA_FOUND
THEN APPLICATION_ERROR(-20000,'ins_m174');
END;
ELSIF :new.ins_alg_ruimte_type = 'R'
THEN
DECLARE
dummy NUMBER(10);
BEGIN
SELECT alg_ruimte_key
INTO dummy
FROM prj_v_aanwezigruimte
WHERE alg_ruimte_key = :new.ins_alg_ruimte_key
AND prj_project_key = :new.prj_project_key;
EXCEPTION
WHEN NO_DATA_FOUND
THEN APPLICATION_ERROR(-20000,'ins_m092');
END;
ELSIF :new.ins_alg_ruimte_type = 'T'
THEN
null;
/* terreinsector wordt nog niet gebuikt in project.
DECLARE
dummy NUMBER(10);
BEGIN
SELECT alg_terreinsector_key
INTO dummy
FROM prj_v_aanwezigterreinsector
WHERE alg_terreinsector_key = :new.ins_alg_ruimte_key
AND prj_project_key = :new.prj_project_key;
EXCEPTION
WHEN NO_DATA_FOUND
THEN APPLICATION_ERROR(-20000,'ins_m095');
END;
*/
ELSE
APPLICATION_ERROR(-20000, 'ins_m84');
END IF;
DECLARE
Dummy BOOLEAN;
BEGIN
Dummy := fac_p_fac_save_restore.SavePrimaryKey('PRJ_DEEL_CASCADE', :new.ins_deel_key);
END;
END IF;
LOG('Eind PRJ_T_PRJ_DEEL_B_IU');
END;
/
CREATE_TRIGGER(prj_t_prj_deel_S_A_IU)
AFTER INSERT OR UPDATE ON prj_deel
BEGIN
DECLARE
IndexNr NUMBER;
PrimaryKey NUMBER(10);
ProjectKey NUMBER(10);
Dummy BOOLEAN;
BEGIN
/* Zet de verwijderdatum voor PRJ_DEEL. */
IndexNr := 1;
PrimaryKey := fac_p_fac_save_restore.GetPrimaryKey('PRJ_DEEL', IndexNr);
ProjectKey := fac_p_fac_save_restore.GetPrimaryKey('PRJ_DEEL_PROJECT',1);
WHILE PrimaryKey IS NOT NULL
LOOP
UPDATE prj_deel
SET ins_deel_verwijder = SYSDATE
WHERE ins_deel.ins_deel_parent_key = PrimaryKey
AND prj_project_key = ProjectKey
AND ins_deel_verwijder IS NULL;
IndexNr := IndexNr + 1;
PrimaryKey := fac_p_fac_save_restore.GetPrimaryKey('PRJ_DEEL_VERWIJDER', IndexNr);
END LOOP;
Dummy := fac_p_fac_save_restore.ResetSelectie('PRJ_DEEL_VERWIJDER');
/*
** (onder)deel is verplaatst; dus ook de children naar die plaats.
*/
IndexNr := 1;
PrimaryKey := fac_p_fac_save_restore.GetPrimaryKey('PRJ_DEEL_CASCADE', IndexNr);
WHILE PrimaryKey IS NOT NULL
LOOP
UPDATE prj_deel
SET (ins_alg_ruimte_key
, ins_alg_ruimte_type
, ins_alg_locatie_key) = (SELECT ins_alg_ruimte_key
, ins_alg_ruimte_type
, ins_alg_locatie_key
FROM prj_deel
WHERE ins_deel_key = PrimaryKey
AND prj_project_key = ProjectKey)
WHERE ins_deel.ins_deel_parent_key = PrimaryKey
AND prj_project_key = ProjectKey;
IndexNr := IndexNr + 1;
PrimaryKey := fac_p_fac_save_restore.GetPrimaryKey('PRJ_DEEL_CASCADE', IndexNr);
END LOOP;
Dummy := fac_p_fac_save_restore.ResetSelectie('PRJ_DEEL_CASCADE');
Dummy := fac_p_fac_save_restore.ResetSelectie('PRJ_DEEL_PROJECT');
END;
END;
/
CREATE_TRIGGER(prj_t_prj_werkplek_B_IU)
BEFORE INSERT OR UPDATE ON prj_werkplek
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_werkplek_key
,prs_s_prs_werkplek_key);
CHECK_CADMUTATIE2(prs_werkplek_verwijder
,prs_werkplek_getekend
,prs_alg_ruimte_key
,'prs_m161');
BEGIN
IF :new.prs_werkplek_verwijder IS NOT NULL
OR (:new.prs_werkplek_verwijder IS NULL AND :old.prs_werkplek_verwijder IS NOT NULL)
THEN
UPDATE prj_deel
SET ins_deel_verwijder = :new.prs_werkplek_verwijder
, ins_deel_getekend = :new.prs_werkplek_getekend
WHERE prj_deel.ins_alg_ruimte_key = :new.prs_werkplek_key
AND prj_deel.prj_project_key = :new.prj_project_key
AND ins_alg_ruimte_type = 'W';
END IF;
END;
END;
/
#endif // PRJ