#ifdef PRJ #include "comsql.h" /* Revisie: ** ** 28-09-1999 EGR prj_t_prj_ruimte_b_iu moet gebruik maken van alg_srtruimte_key bij controle van werkplekken. ** 27-08-1999 EGR prj_t_prj_ruimte_b_iu werkend gemaakt voor gecascadeerd verwijderen van ruimte, werkplek, object. ** 25-08-1999 RD Trigger toegevoegd. ** 23-07-1999 EGR LOG verwijderd en ins_deel. gewijzigd in prj_deel. . ** 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 -- Deze trigger is ook gedefinieerd in CAD !! UPDATE_PRIMARY_KEY(cad_tekening_key ,cad_s_cad_tekening_key); UPDATE_AANMAAKDATUM(cad_tekening ,cad_tekening_aanmaak); IF :new.cad_tekening_type IN ('P', 'C') AND :new.ins_discipline_key IS NOT NULL THEN RAISE_APPLICATION_ERROR(-20000, 'CAD_M010'); END IF; 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'); IF :old.alg_ruimte_key IS NOT NULL AND :new.alg_ruimte_verwijder IS NULL AND :old.alg_srtruimte_key <> :new.alg_srtruimte_key THEN DECLARE dummy CHAR; BEGIN SELECT 'x' INTO dummy FROM prj_werkplek PRS_W , alg_srtruimte SR_1 , alg_srtruimte SR_2 WHERE SR_1.alg_srtruimte_key = :old.alg_srtruimte_key AND SR_2.alg_srtruimte_key = :new.alg_srtruimte_key AND SR_1.prs_bevat_werkplek = 1 AND SR_2.prs_bevat_werkplek IS NULL AND prs_werkplek_verwijder IS NULL AND prs_alg_ruimte_key = :new.alg_ruimte_key AND prj_project_key = :new.prj_project_key; APPLICATION_ERROR(-20000, 'prs_m034'); EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN TOO_MANY_ROWS THEN APPLICATION_ERROR(-20000, 'prs_m034'); 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 , prs_werkplek_getekend = :new.alg_ruimte_getekend 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 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; 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 prj_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 prj_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; / CREATE_TRIGGER(prj_t_prj_verwerk_log_B_IU) BEFORE INSERT OR UPDATE ON prj_verwerk_log FOR EACH ROW BEGIN IF :new.prj_verwerk_log_key IS NULL THEN SELECT prj_s_prj_verwerk_log_key.nextval INTO :new.prj_verwerk_log_key FROM DUAL; END IF; END; / #endif // PRJ