#ifdef INS /* * $Revision$ * $Id$ */ #include "ins\inssql.h" #include "alg\algsql.h" CREATE_TRIGGER(ins_t_ins_srtdiscipline_B_IU) BEFORE INSERT OR UPDATE ON ins_srtdiscipline FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(ins_srtdiscipline_key,ins_s_ins_srtdiscipline_key); END; / AUDIT_BEGIN(ins_tab_discipline) AUDIT_VALUE_K(ins_tab_discipline, ins_discipline_key, ins_discipline_omschrijving) AUDIT_VALUE_K(ins_tab_discipline, ins_discipline_key, ins_discipline_volgnr) AUDIT_VALUE_K(ins_tab_discipline, ins_discipline_key, prs_kostensoort_key) AUDIT_VALUE_K(ins_tab_discipline, ins_discipline_key, ins_discipline_kpnverplicht) AUDIT_VALUE_K(ins_tab_discipline, ins_discipline_key, ins_discipline_email) AUDIT_VALUE_K(ins_tab_discipline, ins_discipline_key, ins_discipline_ktopercentage) AUDIT_VALUE_K(ins_tab_discipline, ins_discipline_key, ins_discipline_ktodrempel) AUDIT_VALUE_K(ins_tab_discipline, ins_discipline_key, ins_discipline_verwijder) AUDIT_END() CREATE_TRIGGER(ins_t_ins_discipline_B_IU) BEFORE INSERT OR UPDATE ON ins_tab_discipline FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(ins_discipline_key,ins_s_ins_discipline_key); UPDATE_UPPER(ins_discipline_code,ins_discipline_code,ins_tab_discipline); IF ( :new.ins_discipline_verwijder IS NOT NULL AND:old.ins_discipline_verwijder IS NULL AND:new.ins_discipline_module = 'MLD') THEN DECLARE dummy CHAR; BEGIN SELECT 'x' INTO dummy FROM mld_melding m, mld_stdmelding stdm WHERE (stdm.mld_ins_discipline_key = :new.ins_discipline_key OR m.mld_ins_discipline_key = :new.ins_discipline_key) AND m.mld_stdmelding_key = stdm.mld_stdmelding_key AND m.mld_melding_status IN (0,2,3,4,7); raise_application_error(-20001, 'ins_m999 Vakgroep heeft nog open meldingen'); EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN TOO_MANY_ROWS THEN raise_application_error(-20001, 'ins_m999 Vakgroep heeft nog open meldingen'); END; END IF; IF ( :new.ins_discipline_verwijder IS NOT NULL AND:old.ins_discipline_verwijder IS NULL AND:new.ins_discipline_module = 'BES') THEN DECLARE dummy CHAR; BEGIN SELECT 'x' INTO dummy FROM bes_bestelopdr_item boi, bes_bestelling_item bbi, bes_srtdeel isd, bes_srtgroep isg, bes_bestelopdr bo WHERE boi.bes_bestelopdr_item_key = bbi.bes_bestelopdr_item_key AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key AND bbi.bes_srtdeel_key = isd.bes_srtdeel_key AND isd.bes_srtgroep_key = isg.bes_srtgroep_key AND isg.ins_discipline_key = :new.ins_discipline_key AND bo.bes_bestelopdr_status IN (2, 3, 4, 5); raise_application_error(-20001, 'ins_m999 Catalogus heeft nog open bestelopdrachten'); EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN TOO_MANY_ROWS THEN raise_application_error(-20001, 'ins_m999 Catalogus heeft nog open bestelopdrachten'); END; END IF; IF ( :new.ins_discipline_verwijder IS NOT NULL AND:old.ins_discipline_verwijder IS NULL AND:new.ins_discipline_module = 'CNT') THEN DECLARE dummy CHAR; BEGIN SELECT 'x' INTO dummy FROM cnt_contract c WHERE c.ins_discipline_key = :new.ins_discipline_key AND c.cnt_contract_status = 0 AND c.cnt_contract_verwijder IS NULL AND c.cnt_contract_looptijd_tot >= SYSDATE; raise_application_error(-20001, 'ins_m999 Contractsoort heeft nog actieve contracten'); EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN TOO_MANY_ROWS THEN raise_application_error(-20001, 'ins_m999 Contractsoort heeft nog actieve contracten'); END; END IF; IF ( :new.ins_discipline_verwijder IS NOT NULL AND :old.ins_discipline_verwijder IS NULL AND :new.ins_discipline_module = 'RES') THEN BEGIN UPDATE res_srtartikel_onrgoed SET res_srtartikel_og_verwijder = :new.ins_discipline_verwijder WHERE res_srtartikel_onrgoed.res_discipline_key = :new.ins_discipline_key AND res_srtartikel_og_verwijder IS NULL; DELETE FROM res_activiteitdiscipline WHERE res_activiteitdiscipline.res_discipline_key = :new.ins_discipline_key; END; END IF; SET_VERWIJDER_CHILDREN(ins_srtgroep, ins_discipline_key, ins_discipline_verwijder, ins_srtgroep_verwijder,ins_tab_discipline); SET_VERWIJDER_CHILDREN(bes_srtgroep, ins_discipline_key, ins_discipline_verwijder, bes_srtgroep_verwijder,ins_tab_discipline); IF (:new.ins_discipline_verwijder IS NOT NULL AND :old.ins_discipline_verwijder IS NULL) THEN DELETE_CHILDREN(fac_groeprechten,ins_discipline_key); END IF; UPDATE_AANMAAKDATUM(ins_tab_discipline, ins_discipline_aanmaak); END; / CREATE_TRIGGER(ins_t_ins_srtgroep_B_IU) BEFORE INSERT OR UPDATE ON ins_srtgroep FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(ins_srtgroep_key,ins_s_ins_srtgroep_key); UPDATE_UPPER(ins_srtgroep_omschrijving,ins_srtgroep_upper,ins_srtgroep); SET_VERWIJDER_CHILDREN(ins_srtdeel, ins_srtgroep_key, ins_srtgroep_verwijder, ins_srtdeel_verwijder,ins_srtgroep); UPDATE_AANMAAKDATUM(ins_srtgroep, ins_srtgroep_aanmaak); END; / CREATE_TRIGGER(ins_t_ins_srtdeel_B_IU) BEFORE INSERT OR UPDATE ON ins_srtdeel FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(ins_srtdeel_key,ins_s_ins_srtinst_keys); UPDATE_UPPER(ins_srtdeel_omschrijving,ins_srtdeel_upper,ins_srtdeel); UPDATE_UPPER(ins_srtdeel_code,ins_srtdeel_code_upper,ins_srtdeel); UPDATE_UPPER(ins_srtdeel_cadlayer, ins_srtdeel_cadlayer,ins_srtdeel); -- 16/04/1998 AH #1593, Speciale CHECK_NOG_REFERENCE, maakt geen gebruik van AANWEZIG-views. INS_CHECK_NOG_REFERENCES(ins_srtdeel,ins_srtdeel_verwijder,ins_deel, ins_deel_verwijder ,ins_srtdeel_key,'ins_m013'); // IF :new.ins_srtdeel_verwijder IS NOT NULL THEN DECLARE dummy CHAR; BEGIN SELECT 'x' INTO dummy FROM cnt_v_aanwezigcontract_object WHERE cnt_v_aanwezigcontract_object.cnt_ins_srtdeel_key = :old.ins_srtdeel_key; raise_application_error(-20000, 'cnt_m029'); EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN TOO_MANY_ROWS THEN raise_application_error(-20000, 'cnt_m029'); END; END IF; // UPDATE_AANMAAKDATUM(ins_srtdeel, ins_srtdeel_aanmaak); SET_VERWIJDER_CHILDREN(ins_srtdeel_compositie, ins_srtdeel_key, ins_srtdeel_verwijder ,ins_srtdeel_comp_verwijder,ins_srtdeel); END; / CREATE_TRIGGER(ins_t_ins_deel_B_I) BEFORE INSERT ON ins_deel FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(ins_deel_key,ins_s_ins_inst_keys); END; / CREATE_TRIGGER(ins_t_ins_deel_B_IU) BEFORE INSERT OR UPDATE ON ins_deel FOR EACH ROW DECLARE Dummy1 BOOLEAN; BEGIN UPDATE_UPPER(ins_deel_omschrijving,ins_deel_upper,ins_deel); IF :new.ins_deel_verwijder IS NOT NULL AND :old.ins_deel_verwijder IS NULL THEN DECLARE dummy CHAR; BEGIN SELECT 'x' INTO dummy FROM cnt_v_aanwezigcontract_object, cnt_v_aanwezigcontract WHERE cnt_v_aanwezigcontract_object.cnt_contract_key = cnt_v_aanwezigcontract.cnt_contract_key AND cnt_v_aanwezigcontract_object.cnt_ins_deel_key = :old.ins_deel_key AND cnt_v_aanwezigcontract.cnt_contract_looptijd_tot > SYSDATE AND cnt_v_aanwezigcontract.cnt_contract_status <> 1; raise_application_error(-20000, 'cnt_m030'); EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN TOO_MANY_ROWS THEN raise_application_error(-20000, 'cnt_m030'); END; IF :new.ins_deel_parent_key IS NULL THEN DECLARE Dummy BOOLEAN; BEGIN Dummy := fac.remember_SavePrimaryKeyAndDate('INS_DEEL_VERWIJDER', :new.ins_deel_key, :old.ins_deel_verwijder); END; END IF; DECLARE dummy CHAR; lCount NUMBER; BEGIN -- Een deel mag niet verwijderd worden als er nog openstaande meldingen zijn... SELECT COUNT(*) INTO lCount FROM mld_v_aanwezigmelding_object O, mld_melding M WHERE O.ins_deel_key = :old.ins_deel_key AND O.mld_melding_key = M.mld_melding_key AND M.mld_melding_status IN (0,2,3,4,7); IF lCount > 0 THEN raise_application_error(-20000, 'ins_m202'); ELSE Dummy1 := fac.remember_SavePrimaryKey('INS_DEEL_ONTKOPPEL', :new.ins_deel_key); END IF; UPDATE res_deel SET res_deel_verwijder = :new.ins_deel_verwijder WHERE res_ins_deel_key=:new.ins_deel_key AND res_deel_verwijder IS NULL; 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_SG.ins_discipline_key INTO :new.ins_discipline_key FROM ins_srtdeel INS_SD , ins_srtgroep INS_SG WHERE INS_SD.ins_srtdeel_key = :new.ins_srtdeel_key AND INS_SD.ins_srtgroep_key = INS_SG.ins_srtgroep_key; EXCEPTION WHEN NO_DATA_FOUND THEN :new.ins_discipline_key := NULL; END; END IF; -- Zoek de (redundante) alg_locatie_key erbij indien verplaatst. -- Echter NIET voor persoonsgebonden objecten !!! -- Soms kan de querie niet worden uitgevoerd omdat bovenliggende tabellen in bewerking zijn -- dan: ORA - 04091: table X is mutating, trigger/function may not see it -- dan blijft de locatie ongewijzigd (dikke kans) 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 IF :new.ins_alg_ruimte_type not IN ('A','C','P') THEN BEGIN SELECT alg_locatie_key INTO :new.ins_alg_locatie_key FROM ins_v_alg_overzicht WHERE alg_onroerendgoed_keys = :new.ins_alg_ruimte_key AND alg_onroerendgoed_type = :new.ins_alg_ruimte_type; EXCEPTION WHEN NO_DATA_FOUND THEN :new.ins_alg_locatie_key := NULL; WHEN OTHERS THEN NULL; END; ELSE -- Voor koppeling van een object aan een afdeling, contactpersoon of persoon de alg_locatie_key altijd op NULL zetten. :new.ins_alg_locatie_key := NULL; END IF; END IF; /* Bij INS_DEEL moet INS_ALG_RUIMTE_KEY ingevuld zijn * en wel met ruimte, werkplek of terreinsector, afdeling of persoon * Daarvoor moet ook het INS_ALG_RUIMTE_TYPE veld goed ingevuld zijn * (met 'W', 'R' of 'T' of 'A' of 'P'). * Dit geldt als INS_ALG_RUIMTE_KEY veranderd is of als er een * nieuw record geinsert wordt. */ IF :new.ins_deel_verwijder IS NULL AND (: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 CHECK_KEY_REFERENCE(prs_werkplek , prs_werkplek_key , :new.ins_alg_ruimte_key, 'ins_m174'); ELSIF :new.ins_alg_ruimte_type = 'R' THEN CHECK_KEY_REFERENCE(alg_v_aanwezigruimte , alg_ruimte_key , :new.ins_alg_ruimte_key, 'ins_m092'); ELSIF :new.ins_alg_ruimte_type = 'T' THEN CHECK_KEY_REFERENCE(alg_v_aanwezigterreinsector, alg_terreinsector_key, :new.ins_alg_ruimte_key, 'ins_m095'); ELSIF :new.ins_alg_ruimte_type = 'A' THEN CHECK_KEY_REFERENCE(prs_v_aanwezigafdeling , prs_afdeling_key , :new.ins_alg_ruimte_key, 'ins_m194'); ELSIF :new.ins_alg_ruimte_type = 'C' THEN CHECK_KEY_REFERENCE(prs_contactpersoon , prs_contactpersoon_key , :new.ins_alg_ruimte_key, 'ins_m195'); ELSIF :new.ins_alg_ruimte_type = 'P' THEN CHECK_KEY_REFERENCE(prs_v_aanwezigperslid , prs_perslid_key , :new.ins_alg_ruimte_key, 'ins_m195'); ELSIF :new.ins_alg_ruimte_type IS NULL THEN CHECK_KEY_REFERENCE(ins_v_aanwezigdeel , ins_deel_key , :new.ins_alg_ruimte_key, 'ins_m205'); ELSE raise_application_error(-20000, 'ins_m84'); END IF; DECLARE Dummy BOOLEAN; BEGIN -- Alleen bestaande delen hebben mogelijk te verplaatsen onderdelen. IF :old.ins_deel_aanmaak IS NOT NULL AND :new.ins_deel_parent_key IS NULL THEN Dummy := fac.remember_SavePrimaryKey('INS_DEEL_CASCADE', :new.ins_deel_key); END IF; END; END IF; UPDATE_AANMAAKDATUM(ins_deel, ins_deel_aanmaak); END; / -- vul de sensorwaarde datumtijd (alleen) als die met een mutatie van de waarde niet werd meegegeven CREATE_TRIGGER(ins_t_ins_deel_b_u) BEFORE UPDATE ON ins_deel FOR EACH ROW BEGIN IF UPDATING ('ins_deel_state') AND NOT UPDATING ('ins_deel_statedate') THEN :new.ins_deel_statedate := SYSDATE; END IF; END; / CREATE OR REPLACE TRIGGER ins_t_ins_deel_A_U AFTER UPDATE ON ins_deel FOR EACH ROW DECLARE lmelder_oslogin CONSTANT VARCHAR2 (10) := '_SYSTEEM'; new_date DATE; prev_state ins_deel_state_history.ins_deel_state%TYPE; lstate_history_key ins_deel_state_history.ins_deel_state_history_key%TYPE; ins_srtdeel_statethreshold ins_srtdeel.ins_srtdeel_statethreshold%TYPE; ldubbelcheck_key mld_melding.mld_melding_key%TYPE; lstdmelding_key ins_srtdeel.mld_stdmelding_key%TYPE; ldiscipline_key mld_stdmelding.mld_ins_discipline_key%TYPE; lstatethreshold ins_srtdeel.ins_srtdeel_statethreshold%TYPE; lmelding_key mld_melding.mld_melding_key%TYPE; lmelder_key mld_melding.prs_perslid_key%TYPE; BEGIN -- archiving chances in state_history IF (:old.ins_deel_state IS NULL AND :new.ins_deel_state IS NOT NULL) OR (:new.ins_deel_state <> :old.ins_deel_state) THEN BEGIN new_date := COALESCE (:new.ins_deel_statedate, SYSDATE); -- voorkom dat de update *net* een seconde later kan zijn INSERT INTO ins_deel_state_history (ins_deel_key, ins_deel_state, ins_deel_statedate) VALUES (:new.ins_deel_key, :new.ins_deel_state, COALESCE (:new.ins_deel_statedate, new_date)) RETURNING ins_deel_state_history_key INTO lstate_history_key; EXCEPTION WHEN DUP_VAL_ON_INDEX THEN BEGIN SELECT ins_deel_state INTO prev_state FROM ins_deel_state_history WHERE ins_deel_state_history_key = (SELECT MAX (ins_deel_state_history_key) FROM ins_deel_state_history WHERE ins_deel_key = :new.ins_deel_key AND ins_deel_statedate < new_date); EXCEPTION WHEN NO_DATA_FOUND THEN NULL; END; IF (prev_state = :new.ins_deel_state) THEN DELETE ins_deel_state_history WHERE ins_deel_key = :new.ins_deel_key AND ins_deel_statedate = new_date; ELSE -- kan alleen bij tri-stste statussen gebeuren UPDATE ins_deel_state_history SET ins_deel_state = :new.ins_deel_state WHERE ins_deel_key = :new.ins_deel_key AND ins_deel_statedate = new_date; END IF; END; END IF; -- potentially trigger dependent actions IF (:old.ins_deel_state IS NULL AND :new.ins_deel_state IS NOT NULL) OR (:new.ins_deel_state <> :old.ins_deel_state) THEN BEGIN SELECT ins_srtdeel_statethreshold, mld_stdmelding_key INTO lstatethreshold, lstdmelding_key FROM ins_srtdeel WHERE ins_srtdeel_key = :new.ins_srtdeel_key; IF lstatethreshold IS NOT NULL AND lstdmelding_key IS NOT NULL AND ins.state_compare (:new.ins_deel_state, lstatethreshold) > 0 AND ins.state_compare (:old.ins_deel_state, lstatethreshold) <= 0 THEN -- Eerst controleren of er niet al een "heel recente" melding bestaat -- waarmee deze zou kunnen gaan overlappen. We hebben geen behoefte aan veel meer -- meldingen over hetzelfde, wellicht zou het iets over de urgentie zeggen.. -- BEGIN SELECT prs_perslid_key INTO lmelder_key FROM prs_perslid WHERE prs_perslid_oslogin = lmelder_oslogin AND prs_perslid_verwijder IS NULL; EXCEPTION WHEN NO_DATA_FOUND THEN fac.putsystemnotification ('Invalid configuration: missing _SYSTEEM user', 1); END; IF lmelder_key IS NOT NULL THEN -- Ik denk dat het voorlopig voldoende is om te checken dat *wij* hier niet al eerder -- een automatische melding hebben gegenereerd. Handmatige parallelle meldingen -- beschouwen we niet. We willen primair voorkomen dat er in een paar minuten tientallen -- meldingen ontstaan omdat de waarde rond de limiet flippert. Een daalmarge zou -- een ander mechanisme hiertegen kunnen zijn, maar dit is intrinsieker. -- Ik zoek de goedkoopst mogelijk check, ik weet hier al zeker dat we (weer) -- de limiet overschrijden. We nemen de tijd niet in beschouwing, omdat voor de ene -- toepassing 1 minuut recent is, en voor een andere misschien een maand. BEGIN SELECT m.mld_melding_key INTO ldubbelcheck_key FROM mld_melding m, mld_melding_object mo WHERE m.mld_melding_key = mo.mld_melding_key AND mo.ins_deel_key = :new.ins_deel_key AND m.mld_stdmelding_key = lstdmelding_key AND m.prs_perslid_key = lmelder_key AND m.mld_melding_status IN (2, 0, 4, 7); -- lopend IF ldubbelcheck_key IS NOT NULL -- puur voor de leesbaarheid, als er geen is gaan we nl in de exception verder THEN -- track this. This seems like an appropriate place. UPDATE ins_deel_state_history SET ins_deel_state_history_opmerk = REPLACE ( REPLACE (lcl.l ('lcl_ins_sensorstate_already_mld'), '{0}', lmelding_key), '{1}', lstatethreshold) WHERE ins_deel_state_history_key = lstate_history_key; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN BEGIN -- dit zou de trigger van mld_melding wel mogen doen.. SELECT msm.mld_ins_discipline_key INTO ldiscipline_key FROM mld_stdmelding msm WHERE msm.mld_stdmelding_key = lstdmelding_key; INSERT INTO mld_melding (mld_melding_module, mld_meldbron_key, mld_alg_locatie_key, mld_alg_onroerendgoed_keys, mld_melding_datum, mld_melding_onderwerp, mld_melding_omschrijving, mld_stdmelding_key, mld_melding_status, mld_kosten_klant, prs_perslid_key, mld_melding_spoed, mld_ins_discipline_key) VALUES ( 'MLD', 11, -- sensor :new.ins_alg_locatie_key, :new.ins_alg_ruimte_key, SYSDATE, lcl.l ('lcl_mld_state_generated_onderwerp'), REPLACE ( REPLACE ( lcl.l ( 'lcl_mld_state_generated_omschrijving'), '{0}', :new.ins_deel_state), '{1}', lstatethreshold), lstdmelding_key, 2, -- of afh mld_directklaar NULL, lmelder_key, --TODO!!!!!!! prs_perslid_key, 3, ldiscipline_key) RETURNING mld_melding_key INTO lmelding_key; --en het sensorobject erbij registreren INSERT INTO mld_melding_object (ins_deel_key, mld_melding_key) VALUES (:new.ins_deel_key, lmelding_key); -- track this. This seems like an appropriate place. UPDATE ins_deel_state_history SET ins_deel_state_history_opmerk = REPLACE ( REPLACE (lcl.l ('lcl_ins_sensorstate_caused_mld'), '{0}', lmelding_key), '{1}', lstatethreshold) WHERE ins_deel_state_history_key = lstate_history_key; -- If defined kick off the workflow mld.mld_nextworkflowstep (lmelding_key, -1); END; END; END IF; END IF; END; END IF; -- Uitlenen object: Uitgifte object toevoegen aan de uitgifte tabel. IF (:old.ins_alg_ruimte_key_org IS NULL AND :new.ins_alg_ruimte_key_org IS NOT NULL) AND (:old.ins_alg_ruimte_type_org IS NULL AND :new.ins_alg_ruimte_type_org IS NOT NULL) AND (:new.ins_alg_ruimte_type = 'C' OR :new.ins_alg_ruimte_type = 'P') THEN BEGIN INSERT INTO ins_deel_uitgifte (ins_deel_key , ins_deel_uitgifte_begin , ins_deel_uitgifte_eind_plan , prs_perslid_key , prs_contactpersoon_key) VALUES (:new.ins_deel_key , SYSDATE , CASE WHEN :new.res_rsv_deel_key IS NOT NULL THEN (SELECT rrd.res_rsv_deel_tot FROM res_rsv_deel rrd WHERE res_rsv_deel_key = :new.res_rsv_deel_key) ELSE NULL END , CASE WHEN :new.ins_alg_ruimte_type = 'P' THEN :new.ins_alg_ruimte_key ELSE NULL END , CASE WHEN :new.ins_alg_ruimte_type = 'C' THEN :new.ins_alg_ruimte_key ELSE NULL END); END; END IF; -- Innemen object: Inname object aanpassen in de uitgifte tabel. IF (:old.ins_alg_ruimte_key_org IS NOT NULL AND :new.ins_alg_ruimte_key_org IS NULL) AND (:old.ins_alg_ruimte_type_org IS NOT NULL AND :new.ins_alg_ruimte_type_org IS NULL) AND (:old.ins_alg_ruimte_type = 'C' OR :old.ins_alg_ruimte_type = 'P') THEN BEGIN UPDATE ins_deel_uitgifte SET ins_deel_uitgifte_ingeleverd = SYSDATE WHERE ins_deel_key = :new.ins_deel_key AND ins_deel_uitgifte_ingeleverd IS NULL; END; END IF; END; / CREATE_TRIGGER(ins_t_ins_deel_S_A_IU) AFTER UPDATE ON ins_deel BEGIN DECLARE IndexNr NUMBER; PrimaryKey NUMBER(10); Dummy BOOLEAN; lNested NUMBER; lCount NUMBER; deletemode DATE; old_datum_of_deel DATE; BEGIN -- We controleren of we zijn aangeroepen vanuit onszelf. Ook al hebben we daarbij -- geen keys aan fac_selectie toegevoegd, die van het hoogste niveau staan er, en -- die moeten we niet weer vanaf nummer 1 gaan behandelen, anders zitten we echt -- in een oneindige loop. -- We krijgen hier geen mee, omdat we geen onderdelen van onderdelen kennen. lNested := fac.remember_GetPrimaryKey('INS_TRIGGER_BUSY', 1); IF lNested IS NULL THEN IndexNr := 1; PrimaryKey := fac.remember_GetPrimaryKey('INS_DEEL_VERWIJDER', IndexNr); old_datum_of_deel := fac.remember_GetDate('INS_DEEL_VERWIJDER', PrimaryKey); WHILE PrimaryKey IS NOT NULL LOOP Dummy := fac.remember_SavePrimaryKey('INS_TRIGGER_BUSY', 1); /* Jammer maar helaas, vanwege syntaxredenen moeten we weten of we met UNDO te maken hebben /* Als parent is verwijderd, dan is deletemode gevuld met zijn datum */ /* Als parent terug wordt gehaald, dan is delete-mode gevuld met NULL ( betekent FALSE) */ SELECT ins_deel_verwijder INTO deletemode FROM ins_deel WHERE ins_deel_key = PrimaryKey; IF deletemode IS NULL /* Het deel wordt terug gehaald (UNDO) */ THEN UPDATE ins_deel SET ins_deel_verwijder = NULL /* Bijbehorende onderdelen ook terughalen */ WHERE ins_deel.ins_deel_parent_key = PrimaryKey AND ins_deel.ins_deel_verwijder = old_datum_of_deel; ELSE /* Het deel wordt (of beter: is) verwijderd */ -- -- Als dit object als kenmerk in een ander object wordt gebruikt -- mag dit object niet worden verwijderd. -- DECLARE v_referentie VARCHAR2(100); BEGIN BEGIN SELECT D.ins_deel_omschrijving INTO v_referentie FROM ins_deel D , ins_kenmerkdeel KD , ins_kenmerk K , ins_srtkenmerk SK , fac_kenmerkdomein RS WHERE D.ins_deel_verwijder IS NULL AND RS.fac_kenmerkdomein_kolomnaam = 'INS_DEEL_KEY' AND RS.fac_kenmerkdomein_key = SK.fac_kenmerkdomein_key AND SK.ins_srtkenmerk_key = K.ins_srtkenmerk_key AND K.ins_kenmerk_key = KD.ins_kenmerk_key AND KD.ins_deel_key = D.ins_deel_key AND KD.ins_kenmerkdeel_verwijder IS NULL AND KD.ins_kenmerkdeel_waarde IN (SELECT to_char(PrimaryKey) FROM dual UNION SELECT to_char(ins_deel_key) FROM ins_deel WHERE ins_deel_parent_key = PrimaryKey); EXCEPTION WHEN NO_DATA_FOUND THEN v_referentie := null; WHEN TOO_MANY_ROWS THEN v_referentie := 'X'; END; -- IF v_referentie IS NOT NULL THEN -- Dit object of een van zijn onderdelen wordt dus als referentie in een ander object gebruikt. -- Draai het verwijderen terug. UPDATE ins_deel SET ins_deel_verwijder = null WHERE ins_deel_key = PrimaryKey; raise_application_error(-20000, 'ins_m202'); ELSE -- Dit object of een van zijn onderdelen wordt niet als referentie naar een ander object gebruikt. -- De onderdelen mogen nu ook verwijderd worden. UPDATE ins_deel SET ins_deel_verwijder = deletemode /* Alle AANWEZIGE onderdelen verwijderen */ WHERE ins_deel.ins_deel_parent_key = PrimaryKey AND ins_deel.ins_deel_verwijder IS NULL; END IF; END; END IF; Dummy := fac.remember_ResetSelectie('INS_TRIGGER_BUSY'); IndexNr := IndexNr + 1; PrimaryKey := fac.remember_GetPrimaryKey('INS_DEEL_VERWIJDER', IndexNr); old_datum_of_deel := fac.remember_GetDate('INS_DEEL_VERWIJDER', PrimaryKey); END LOOP; Dummy := fac.remember_ResetSelectie('INS_DEEL_VERWIJDER'); IndexNr := 1; PrimaryKey := fac.remember_GetPrimaryKey('INS_DEEL_CASCADE', IndexNr); WHILE PrimaryKey IS NOT NULL LOOP -- Om weer te voorkomen dat de BEFORE STATEMENT trigger onnodig vuurt, controleren -- we eerst of het statement wel nodig is, d.i. of er onderdelen zijn die nog -- verplaatst moeten worden. SELECT COUNT(*) INTO lCount FROM ins_deel WHERE ins_deel.ins_deel_parent_key = PrimaryKey AND ins_deel.ins_deel_verwijder IS NULL; IF lCount > 0 THEN Dummy := fac.remember_SavePrimaryKey('INS_TRIGGER_BUSY', 1); UPDATE ins_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 ins_deel WHERE ins_deel_key = PrimaryKey) WHERE ins_deel.ins_deel_parent_key = PrimaryKey AND ins_deel.ins_deel_verwijder IS NULL; Dummy := fac.remember_ResetSelectie('INS_TRIGGER_BUSY'); END IF; IndexNr := IndexNr + 1; PrimaryKey := fac.remember_GetPrimaryKey('INS_DEEL_CASCADE', IndexNr); END LOOP; Dummy := fac.remember_ResetSelectie('INS_DEEL_CASCADE'); ELSE NULL; END IF; -- lNested END; -- Add statements that need execution even when nested here: -- -- Attentie: Alle koppelingen met delen uit de selectie worden verwijderd. Doordat deze -- selectie tijdens deze transactie groter kan worden door de bijbehorende onderdelen, wordt -- mogelijkerwijs vaker ins.delete_deelkoppeling() aangeroepen dan strikt nodig is (de reeds -- aanwezige keys blijven oon staan). Dit is niet echt een probleem in de huidige context, maar -- kan dat worden als die functie veel tijd kost ook al is er niks te doen. DECLARE IndexNr NUMBER; PrimaryKey NUMBER(10); Dummy BOOLEAN; BEGIN IndexNr := 1; PrimaryKey := fac.remember_GetPrimaryKey('INS_DEEL_ONTKOPPEL', IndexNr); WHILE PrimaryKey IS NOT NULL LOOP Dummy := ins.delete_deelkoppeling(PrimaryKey); IndexNr := IndexNr + 1; PrimaryKey := fac.remember_GetPrimaryKey('INS_DEEL_ONTKOPPEL', IndexNr); END LOOP; Dummy := fac.remember_ResetSelectie('INS_DEEL_ONTKOPPEL'); END; END; / CREATE_TRIGGER(ins_t_ins_deel_state_hist_B_I) BEFORE INSERT ON ins_deel_state_history FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(ins_deel_state_history_key,ins_s_ins_deel_state_hist_key); END; / CREATE_TRIGGER(ins_t_ins_deel_st_histall_B_I) BEFORE INSERT ON ins_deel_state_history_all FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(ins_deel_state_history_all_key,ins_s_ins_deel_st_histall_key); END; / CREATE_TRIGGER(ins_t_ins_import_B_IU) BEFORE INSERT OR UPDATE ON ins_import FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(ins_import_key,ins_s_ins_import_key); UPDATE_AANMAAKDATUM(ins_import, ins_import_aanmaak); END; /* dummy commentaar omdat anders de volgende / wegvalt? */ / CREATE_TRIGGER(ins_t_ins_srtkenmerk_b_iu) BEFORE INSERT OR UPDATE ON ins_srtkenmerk FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(ins_srtkenmerk_key, ins_s_ins_srtkenmerk_key); UPDATE_UPPER(ins_srtkenmerk_omschrijving, ins_srtkenmerk_upper,ins_srtkenmerk); UPDATE_UPPER(ins_srtkenmerk_code, ins_srtkenmerk_code, ins_srtkenmerk); UPDATE_AANMAAKDATUM(ins_srtkenmerk, ins_srtkenmerk_aanmaak); IF (:new.ins_srtkenmerk_verwijder IS NOT NULL AND :old.ins_srtkenmerk_verwijder IS NULL AND :new.ins_srtkenmerk_systeem = 1) THEN raise_application_error(-20000, 'INS_M156'); END IF; IF :new.ins_srtkenmerk_kenmerktype IN ('C', 'N') AND :new.ins_srtkenmerk_lengte IS NULL THEN raise_application_error(-20000, 'INS_C_INS_SRTKENMERK_LENGTE'); END IF; -- Numeriek mag niet te lang zijn (numeric overflow) IF :new.ins_srtkenmerk_kenmerktype = 'N' AND :new.ins_srtkenmerk_lengte > 20 THEN :new.ins_srtkenmerk_lengte := 20; END IF; IF :new.ins_srtkenmerk_kenmerktype = 'N' AND :old.ins_srtkenmerk_key IS NOT NULL THEN IF :old.ins_srtkenmerk_nmin <> :new.ins_srtkenmerk_nmin OR (:old.ins_srtkenmerk_nmin IS NULL AND :new.ins_srtkenmerk_nmin IS NOT NULL) THEN DECLARE Dummy CHAR; BEGIN SELECT 'X' INTO Dummy FROM ins_kenmerkdeel WHERE FAC.SAFE_TO_NUMBER(ins_kenmerkdeel_waarde) < :new.ins_srtkenmerk_nmin AND ins_kenmerk_key IN (SELECT ins_kenmerk_key FROM ins_kenmerk WHERE ins_srtkenmerk_key = :old.ins_srtkenmerk_key); raise_application_error(-20000, 'INS_C_INS_SRTKENMERK_MIN'); EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN TOO_MANY_ROWS THEN raise_application_error(-20000, 'INS_C_INS_SRTKENMERK_MIN'); END; END IF; IF :old.ins_srtkenmerk_nmax <> :new.ins_srtkenmerk_nmax OR (:old.ins_srtkenmerk_nmax IS NULL AND :new.ins_srtkenmerk_nmax IS NOT NULL) THEN DECLARE Dummy CHAR; BEGIN SELECT 'X' INTO Dummy FROM ins_kenmerkdeel WHERE FAC.SAFE_TO_NUMBER(ins_kenmerkdeel_waarde) > :new.ins_srtkenmerk_nmax AND ins_kenmerk_key IN (SELECT ins_kenmerk_key FROM ins_kenmerk WHERE ins_srtkenmerk_key = :old.ins_srtkenmerk_key); raise_application_error(-20000, 'INS_C_INS_SRTKENMERK_MAX'); EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN TOO_MANY_ROWS THEN raise_application_error(-20000, 'INS_C_INS_SRTKENMERK_MAX'); END; END IF; END IF; END; / CREATE_TRIGGER(ins_t_ins_kenmerk_b_iu) BEFORE INSERT OR UPDATE ON ins_kenmerk FOR EACH ROW BEGIN -- FSN#13902: we tolereren het achteraf verplicht maken UPDATE_PRIMARY_KEY(ins_kenmerk_key, ins_s_ins_kenmerk_key); UPDATE_AANMAAKDATUM(ins_kenmerk, ins_kenmerk_aanmaak); UPDATE_UPPER(ins_kenmerk_code, ins_kenmerk_code, ins_kenmerk); END; / CREATE_TRIGGER(ins_t_ins_kenmerkdeel_b_iu) BEFORE INSERT OR UPDATE ON ins_kenmerkdeel FOR EACH ROW BEGIN /* Controleer eerst of de ingevulde waarde goed is. */ IF :new.ins_kenmerkdeel_waarde <> :old.ins_kenmerkdeel_waarde OR :old.ins_kenmerkdeel_waarde IS NULL OR :new.ins_kenmerkdeel_waarde IS NULL THEN DECLARE SrtKenmerkOmschr ins_srtkenmerk.ins_srtkenmerk_omschrijving%TYPE; SrtKenmerkType ins_srtkenmerk.ins_srtkenmerk_kenmerktype%TYPE; SrtKenmerkLengte ins_srtkenmerk.ins_srtkenmerk_lengte%TYPE; SrtKenmerkDec ins_srtkenmerk.ins_srtkenmerk_dec%TYPE; SrtKenmerkNMin ins_srtkenmerk.ins_srtkenmerk_nmin%TYPE; SrtKenmerkNMax ins_srtkenmerk.ins_srtkenmerk_nmax%TYPE; KenmerkVerplicht ins_kenmerk.ins_kenmerk_verplicht%TYPE; NumberWaarde NUMBER(25,5); FormatMask VARCHAR2(60); KenmerkDeelWaarde ins_kenmerkdeel.ins_kenmerkdeel_waarde%TYPE; BEGIN KenmerkDeelWaarde := :new.ins_kenmerkdeel_waarde; SELECT INS_SK.ins_srtkenmerk_omschrijving, INS_SK.ins_srtkenmerk_kenmerktype, INS_SK.ins_srtkenmerk_lengte, INS_SK.ins_srtkenmerk_dec, INS_SK.ins_srtkenmerk_nmin, INS_SK.ins_srtkenmerk_nmax, INS_K.ins_kenmerk_verplicht INTO SrtKenmerkOmschr, SrtKenmerkType, SrtKenmerkLengte, SrtKenmerkDec, SrtKenmerkNMin, SrtKenmerkNMax, KenmerkVerplicht FROM ins_srtkenmerk INS_SK, ins_kenmerk INS_K WHERE INS_SK.ins_srtkenmerk_key = INS_K.ins_srtkenmerk_key AND INS_K.ins_kenmerk_key = :new.ins_kenmerk_key; /* Controleer eerst of het verplichte veld ingevuld is */ IF KenmerkVerplicht IS NOT NULL AND KenmerkDeelWaarde IS NULL THEN APPLICATION_ERROR_GOTO(-20004, 'ins_m149,'||SrtKenmerkOmschr); /* Kijk welk KenmerkType gebruikt wordt. * Aan de hand daarvan moet een controle uitgevoerd worden. */ ELSIF SrtKenmerkType = 'C' /* Char */ THEN /* Controleer of de lengte te groot of goed is */ IF LENGTH(KenmerkDeelWaarde) > SrtKenmerkLengte THEN APPLICATION_ERROR_GOTO(-20004, 'ins_m143,'||SrtKenmerkOmschr||','||TO_CHAR(SrtKenmerkLengte)); END IF; ELSIF SrtKenmerkType = 'N' /* Number */ THEN /* Controleer of er een numerieke waarde ingevuld is */ IF SrtKenmerkDec IS NULL OR SrtKenmerkDec = 0 THEN FormatMask := RPAD('9', SrtKenmerkLengte, '9'); ELSE FormatMask := RPAD('9', SrtKenmerkLengte - SrtKenmerkDec, '9')|| 'D'||RPAD('9', SrtKenmerkDec, '9'); END IF; /* Controleer of er een numerieke waarde ingevuld is */ BEGIN NumberWaarde := TO_NUMBER(KenmerkDeelWaarde); EXCEPTION WHEN OTHERS THEN FormatMask := REPLACE(FormatMask, '9', '#'); FormatMask := REPLACE(FormatMask, '0', '#'); FormatMask := REPLACE(FormatMask, 'D', '.'); APPLICATION_ERROR_GOTO(-20004,'ins_m146,'||SrtKenmerkOmschr||','||FormatMask); END; /* Controleer of de waarde binnen NMin en NMax ligt */ IF (SrtKenmerkNMin IS NOT NULL AND NumberWaarde < SrtKenmerkNMin) OR (SrtKenmerkNMax IS NOT NULL AND NumberWaarde > SrtKenmerkNMax) THEN APPLICATION_ERROR_GOTO(-20004, 'ins_m145,'||SrtKenmerkOmschr||','|| TO_CHAR(SrtKenmerkNMin)||','|| TO_CHAR(SrtKenmerkNMax)); ELSE /* Controleer of de waarde aan het formaat voldoet */ KenmerkDeelWaarde := LTRIM(NUMBER_TO_CHAR(NumberWaarde, FormatMask)); IF INSTR2(KenmerkDeelWaarde, '#') <> 0 THEN FormatMask := REPLACE(FormatMask, '9', '#'); FormatMask := REPLACE(FormatMask, '0', '#'); FormatMask := REPLACE(FormatMask, 'D', '.'); APPLICATION_ERROR_GOTO(-20004,'ins_m146,'||SrtKenmerkOmschr||','||FormatMask); END IF; END IF; /* Zet de geconverteerde waarde terug */ :new.ins_kenmerkdeel_waarde := KenmerkDeelWaarde; ELSIF SrtKenmerkType = 'D' /* Datum */ THEN KenmerkDeelWaarde := DATE_TO_CHAR(_TO_DATE2(KenmerkDeelWaarde,'DD-MM-YY'), 'DD-MM-YYYY'); /* Zet de geconverteerde waarde terug */ :new.ins_kenmerkdeel_waarde := KenmerkDeelWaarde; END IF; END; UPDATE_PRIMARY_KEY(ins_kenmerkdeel_key, ins_s_ins_kenmerkdeel_key); END IF; END; / CREATE_TRIGGER(ins_t_ins_kmdeelsrtcontr_b_iu) BEFORE INSERT OR UPDATE ON ins_kmdeelsrtcontr FOR EACH ROW BEGIN /* Controleer eerst of de ingevulde waarde goed is. */ IF :new.ins_kmdeelsrtcontr_waarde <> :old.ins_kmdeelsrtcontr_waarde OR :old.ins_kmdeelsrtcontr_waarde IS NULL OR :new.ins_kmdeelsrtcontr_waarde IS NULL THEN DECLARE SrtKenmerkOmschr ins_srtkenmerk.ins_srtkenmerk_omschrijving%TYPE; SrtKenmerkType ins_srtkenmerk.ins_srtkenmerk_kenmerktype%TYPE; SrtKenmerkLengte ins_srtkenmerk.ins_srtkenmerk_lengte%TYPE; SrtKenmerkDec ins_srtkenmerk.ins_srtkenmerk_dec%TYPE; SrtKenmerkNMin ins_srtkenmerk.ins_srtkenmerk_nmin%TYPE; SrtKenmerkNMax ins_srtkenmerk.ins_srtkenmerk_nmax%TYPE; KenmerkVerplicht ins_kenmerk.ins_kenmerk_verplicht%TYPE; NumberWaarde NUMBER(25,5); FormatMask VARCHAR2(60); KenmerkControleWaarde ins_kmdeelsrtcontr.ins_kmdeelsrtcontr_waarde%TYPE; BEGIN KenmerkControleWaarde := :new.ins_kmdeelsrtcontr_waarde; SELECT INS_SK.ins_srtkenmerk_omschrijving, INS_SK.ins_srtkenmerk_kenmerktype, INS_SK.ins_srtkenmerk_lengte, INS_SK.ins_srtkenmerk_dec, INS_SK.ins_srtkenmerk_nmin, INS_SK.ins_srtkenmerk_nmax, INS_K.ins_kenmerk_verplicht INTO SrtKenmerkOmschr, SrtKenmerkType, SrtKenmerkLengte, SrtKenmerkDec, SrtKenmerkNMin, SrtKenmerkNMax, KenmerkVerplicht FROM ins_srtkenmerk INS_SK, ins_kenmerk INS_K WHERE INS_SK.ins_srtkenmerk_key = INS_K.ins_srtkenmerk_key AND INS_K.ins_kenmerk_key = :new.ins_kenmerk_key; /* Controleer eerst of het verplichte veld ingevuld is */ IF KenmerkVerplicht IS NOT NULL AND KenmerkControleWaarde IS NULL THEN APPLICATION_ERROR_GOTO(-20004, 'ins_m149,'||SrtKenmerkOmschr); /* Kijk welk KenmerkType gebruikt wordt. * Aan de hand daarvan moet een controle uitgevoerd worden. */ ELSIF SrtKenmerkType = 'C' /* Char */ THEN /* Controleer of de lengte te groot of goed is */ IF LENGTH(KenmerkControleWaarde) > SrtKenmerkLengte THEN APPLICATION_ERROR_GOTO(-20004, 'ins_m143,'||SrtKenmerkOmschr||','||TO_CHAR(SrtKenmerkLengte)); END IF; ELSIF SrtKenmerkType = 'N' /* Number */ THEN /* Controleer of er een numerieke waarde ingevuld is */ IF SrtKenmerkDec IS NULL OR SrtKenmerkDec = 0 THEN FormatMask := RPAD('9', SrtKenmerkLengte, '9'); ELSE FormatMask := RPAD('9', SrtKenmerkLengte - SrtKenmerkDec, '9')|| 'D'||RPAD('9', SrtKenmerkDec, '9'); END IF; /* Controleer of er een numerieke waarde ingevuld is */ BEGIN NumberWaarde := TO_NUMBER(KenmerkControleWaarde); EXCEPTION WHEN OTHERS THEN FormatMask := REPLACE(FormatMask, '9', '#'); FormatMask := REPLACE(FormatMask, '0', '#'); FormatMask := REPLACE(FormatMask, 'D', '.'); APPLICATION_ERROR_GOTO(-20004,'ins_m146,'||SrtKenmerkOmschr||','||FormatMask); END; /* Controleer of de waarde binnen NMin en NMax ligt */ IF (SrtKenmerkNMin IS NOT NULL AND NumberWaarde < SrtKenmerkNMin) OR (SrtKenmerkNMax IS NOT NULL AND NumberWaarde > SrtKenmerkNMax) THEN APPLICATION_ERROR_GOTO(-20004, 'ins_m145,'||SrtKenmerkOmschr||','|| TO_CHAR(SrtKenmerkNMin)||','|| TO_CHAR(SrtKenmerkNMax)); ELSE /* Controleer of de waarde aan het formaat voldoet */ KenmerkControleWaarde := LTRIM(NUMBER_TO_CHAR(NumberWaarde, FormatMask)); IF INSTR2(KenmerkControleWaarde, '#') <> 0 THEN FormatMask := REPLACE(FormatMask, '9', '#'); FormatMask := REPLACE(FormatMask, '0', '#'); FormatMask := REPLACE(FormatMask, 'D', '.'); APPLICATION_ERROR_GOTO(-20004,'ins_m146,'||SrtKenmerkOmschr||','||FormatMask); END IF; END IF; /* Zet de geconverteerde waarde terug */ :new.ins_kmdeelsrtcontr_waarde := KenmerkControleWaarde; ELSIF SrtKenmerkType = 'D' /* Datum */ THEN KenmerkControleWaarde := DATE_TO_CHAR(_TO_DATE2(KenmerkControleWaarde,'DD-MM-YY'), 'DD-MM-YYYY'); /* Zet de geconverteerde waarde terug */ :new.ins_kmdeelsrtcontr_waarde := KenmerkControleWaarde; END IF; END; UPDATE_PRIMARY_KEY(ins_kmdeelsrtcontr_key, ins_s_ins_kmdeelsrtcontr_key); END IF; END; / CREATE_TRIGGER(ins_t_ins_deelkoppeling_b_iu) BEFORE INSERT OR UPDATE ON ins_deelkoppeling FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(ins_deelkoppeling_key, ins_s_ins_deelkoppeling_key); UPDATE_AANMAAKDATUM(ins_deelkoppeling, ins_deelkoppeling_aanmaak); END; / CREATE_TRIGGER(ins_t_ins_compositie_b_iu) BEFORE INSERT OR UPDATE ON ins_compositie FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(ins_compositie_key, ins_s_ins_compositie_key); UPDATE_UPPER(ins_compositie_naam,ins_compositie_upper,ins_compositie); UPDATE_AANMAAKDATUM(ins_compositie, ins_compositie_aanmaak); SET_VERWIJDER_CHILDREN(ins_srtdeel_compositie, ins_compositie_key, ins_compositie_verwijder, ins_srtdeel_comp_verwijder,ins_compositie); END; / CREATE_TRIGGER(ins_t_ins_srtdeel_comp_b_iu) BEFORE INSERT OR UPDATE ON ins_srtdeel_compositie FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(ins_srtdeel_comp_key, ins_s_ins_srtdeel_comp_key); UPDATE_AANMAAKDATUM(ins_srtdeel_compositie, ins_srtdeel_comp_aanmaak); END; / CREATE_TRIGGER(ins_srtdeel_srtdeel_B_IU) BEFORE INSERT OR UPDATE ON ins_srtdeel_srtdeel FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(ins_srtdeel_srtdeel_key, ins_s_ins_srtdeel_srtdeel_key); END; / CREATE_TRIGGER(ins_t_scenario_B_IU) BEFORE INSERT OR UPDATE ON ins_scenario FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(ins_scenario_key, ins_s_ins_scenario_key); END; / CREATE_TRIGGER(ins_t_scenario_B_D) BEFORE DELETE ON ins_scenario FOR EACH ROW BEGIN IF :old.ins_scenario_key = 1 THEN raise_application_error(-20001, 'Cannot delete actual scenario'); END IF; END; / CREATE_TRIGGER(ins_t_srtcontrole_B_IU) BEFORE INSERT OR UPDATE ON ins_srtcontrole FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(ins_srtcontrole_key, ins_s_ins_srtcontrole_key); END; / CREATE_TRIGGER(ins_t_controlemode_B_IU) BEFORE INSERT OR UPDATE ON ins_controlemode FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(ins_controlemode_key, ins_s_ins_controlemode_key); END; / CREATE_TRIGGER(ins_t_srtcontroledl_xcp_B_IU) BEFORE INSERT OR UPDATE ON ins_srtcontroledl_xcp FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(ins_srtcontroledl_xcp_key, ins_s_srtcontroledl_xcp_key); END; / CREATE_TRIGGER(ins_t_deelsrtcontrole_B_IU) BEFORE INSERT OR UPDATE ON ins_deelsrtcontrole FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(ins_deelsrtcontrole_key, ins_s_ins_deelsrtcontrole_key); END; / AUDIT_BEGIN(ins_disc_params) AUDIT_VALUE(ins_disc_params, ins_disc_params_autonum) AUDIT_VALUE(ins_disc_params, ins_disc_params_cadlayers) AUDIT_VALUE(ins_disc_params, ins_disc_params_type) AUDIT_END() CREATE_TRIGGER(ins_t_ins_disc_params_b_iu) BEFORE INSERT OR UPDATE ON ins_disc_params FOR EACH ROW BEGIN IF :new.ins_disc_params_key IS NULL THEN SELECT ins_s_ins_disc_params_key.nextval INTO :new.ins_disc_params_key FROM DUAL; END IF; END; / CREATE_TRIGGER(ins_t_ins_deel_note_B_IU) BEFORE INSERT OR UPDATE ON ins_deel_note FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(ins_deel_note_key, ins_s_ins_deel_note_key); END; / CREATE_TRIGGER(ins_t_deel_uitgifte_B_I) BEFORE INSERT ON ins_deel_uitgifte FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(ins_deel_uitgifte_key, ins_s_ins_deel_uitgifte_key); END; / REGISTERRUN('$Id$') #endif