Files
Database/PRS/PRS_TRI.SRC
Maykel Geerdink ad46327612 AAIT#36710: Berekende waarde van velden in Facilitor.
svn path=/Database/trunk/; revision=31619
2016-11-22 15:08:14 +00:00

806 lines
28 KiB
Plaintext

#ifdef PRS
/* PRS_TRI.SRC
* $Revision$
* $Id$
*/
#include "alg\algsql.h"
CREATE_TRIGGER(prs_t_prs_srtperslid_B_IU)
BEFORE INSERT OR UPDATE ON prs_srtperslid
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_srtperslid_key, prs_s_prs_alluitvoerende_keys);
UPDATE_UPPER(prs_srtperslid_omschrijving, prs_srtperslid_upper,prs_srtperslid);
CHECK_NOG_REFERENCES(prs_perslid, prs_srtperslid_verwijder,
prs_v_aanwezigperslid, prs_srtperslid_key, 'prs_m014');
UPDATE_AANMAAKDATUM(prs_srtperslid, prs_srtperslid_aanmaak);
// Niet verwijderen als nog MLD_OPDRs zijn met status 'Uitgegeven' en
// uitvoerende deze SRTPERSLID.
IF :new.prs_srtperslid_verwijder IS NOT NULLDATUM
THEN
DECLARE
dummy CHAR;
BEGIN
SELECT 'X'
INTO dummy
FROM mld_opdr MLD_O
WHERE MLD_O.mld_statusopdr_key IN (5, 8)
AND MLD_O.mld_uitvoerende_keys = :new.prs_srtperslid_key;
APPLICATION_ERROR(-20000, 'prs_m084');
EXCEPTION
WHEN NO_DATA_FOUND
THEN NULL;
WHEN TOO_MANY_ROWS
THEN APPLICATION_ERROR(-20000, 'prs_m084');
END;
END IF;
//</MLD>
END;
/
CREATE_TRIGGER(prs_t_prs_afdeling_B_IU)
BEFORE INSERT OR UPDATE ON prs_afdeling
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_afdeling_key, prs_s_prs_afdeling_key);
UPDATE_UPPER(prs_afdeling_naam, prs_afdeling_upper,prs_afdeling);
CHECK_NOG_REFERENCES(prs_perslid, prs_afdeling_verwijder,
prs_v_aanwezigperslid, prs_afdeling_key, 'prs_m015');
UPDATE_AANMAAKDATUM(prs_afdeling, prs_afdeling_aanmaak);
CHECK_NOG_REFERENCES(prs_perslid, prs_afdeling_verwijder,
prs_v_aanwezigruimteafdeling, prs_afdeling_key, 'SYSTEM ERROR: In Afdeling, er zijn nog PRS_RUIMTEAFDELING-records');
IF :new.prs_afdeling_verwijder IS NOT NULL AND :old.prs_afdeling_verwijder IS NULL THEN
DECLARE
dummy CHAR;
BEGIN
SELECT 'X'
INTO dummy
FROM cnt_v_aanwezigcontract
WHERE (cnt_v_aanwezigcontract.cnt_prs_afdeling_key = :old.prs_afdeling_key
OR cnt_v_aanwezigcontract.prs_afdeling_key_eig = :old.prs_afdeling_key)
AND cnt_v_aanwezigcontract.cnt_contract_looptijd_tot > SYSDATE;
APPLICATION_ERROR_GOTO(-20000,'cnt_m022');
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL;
WHEN TOO_MANY_ROWS THEN APPLICATION_ERROR_GOTO(-20000,'cnt_m022');
END;
END IF;
--
-- Afdeling mag alleen verwijderd worden als deze geen objecten meer in het bezit heeft.
--
IF :new.prs_afdeling_verwijder IS NOT NULL AND :old.prs_afdeling_verwijder IS NULL
THEN
DECLARE
dummy VARCHAR2(1);
BEGIN
SELECT 'x'
INTO dummy
FROM ins_deel
WHERE ins_deel_verwijder IS NULL
AND ins_alg_ruimte_type = 'A'
AND ins_alg_ruimte_key = :old.prs_afdeling_key;
APPLICATION_ERROR_GOTO(-20000,'prs_m173');
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL;
WHEN TOO_MANY_ROWS THEN APPLICATION_ERROR_GOTO(-20000,'prs_m173');
END;
END IF;
END;
/
CREATE_TRIGGER(prs_t_prs_afdeling_B_D)
BEFORE DELETE ON prs_afdeling
FOR EACH ROW
BEGIN
DELETE FROM prs_kenmerklink KL WHERE KL.prs_link_key=:old.prs_afdeling_key AND KL.prs_kenmerklink_niveau='A';
END;
/
CREATE_TRIGGER(prs_t_prs_perslid_B_I)
BEFORE INSERT ON prs_perslid
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_perslid_key, prs_s_prs_alluitvoerende_keys);
-- If this perslid belongs to the primary company of an xd-environment
-- it gets a default apikey to get synced across the domains
IF :new.prs_perslid_apikey IS NULL AND fac.getsetting ('xd_primary_bedrijfkey') > 0
THEN
DECLARE
dummy prs_afdeling.prs_bedrijf_key%TYPE;
BEGIN
SELECT prs_bedrijf_key
INTO dummy
FROM prs_v_afdeling
WHERE prs_afdeling_key = :new.prs_afdeling_key
AND prs_v_afdeling.prs_bedrijf_key = fac.getsetting ('xd_primary_bedrijfkey');
-- 52 lower en uppercase letters*32 is 182 bits equivalent
SELECT DBMS_RANDOM.string ('a', 32) INTO :new.prs_perslid_apikey FROM DUAL;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL; -- persoon hoort niet bij de serviceorganisatie
END;
END IF;
END;
/
CREATE_TRIGGER(prs_t_prs_perslid_B_IU)
BEFORE INSERT OR UPDATE ON prs_perslid
FOR EACH ROW
BEGIN
UPDATE_UPPER(prs_perslid_naam, prs_perslid_upper,prs_perslid);
UPDATE_UPPER(prs_perslid_initialen, prs_perslid_init_upper,prs_perslid);
UPDATE_UPPER(prs_perslid_oslogin, prs_perslid_oslogin,prs_perslid);
UPDATE_UPPER(prs_perslid_oslogin2, prs_perslid_oslogin2,prs_perslid);
UPDATE_AANMAAKDATUM(prs_perslid, prs_perslid_aanmaak);
IF :new.prs_perslid_verwijder IS NOT NULLDATUM AND :old.prs_perslid_verwijder IS NULLDATUM
THEN
DECLARE
dummy VARCHAR2(1);
BEGIN
-- Niet verwijderen als nog MLD_OPDR's zijn met status 'Uitgegeven' en
-- uitvoerende deze PERSLID.
SELECT 'X'
INTO dummy
FROM mld_opdr MLD_O
WHERE MLD_O.mld_statusopdr_key IN (5, 8)
AND MLD_O.mld_uitvoerende_keys = :new.prs_perslid_key;
APPLICATION_ERROR_GOTO(-20000, 'prs_m085');
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL;
WHEN TOO_MANY_ROWS THEN APPLICATION_ERROR_GOTO(-20000, 'prs_m085');
END;
DECLARE
dummy VARCHAR2(1);
BEGIN
-- Persoon mag alleen verwijderd worden als deze geen objecten meer in het bezit heeft.
-- Dit geldt alleen voor objecten die 'van de organisatie' zijn, d.i.
-- ins_discipline_min_level <> 3. Deze mocht de gebruiker zelf bijhouden
SELECT 'x'
INTO dummy
FROM ins_v_aanwezigdeel D, ins_tab_discipline DI
WHERE ins_alg_ruimte_type = 'P'
AND ins_alg_ruimte_key = :old.prs_perslid_key
AND DI.ins_discipline_key = D.ins_discipline_key
AND DI.ins_discipline_min_level <> 3;
APPLICATION_ERROR_GOTO(-20000,'prs_m175');
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL;
WHEN TOO_MANY_ROWS THEN APPLICATION_ERROR_GOTO(-20000,'prs_m175');
END;
-- Hierna kan het verwijderen niet meer falen
BEGIN
-- Ja, je zou zeggen dat dit een zaak is van prs_perslidwerkplek, maar
-- dat is toch niet zo. Bovendien krijg je dan nare mutating trigger errors.
-- Alleen vaste werkplekken, geen flexplekken
IF fac.getsetting ('prs_werkplek_implicit') = 1
THEN
DELETE FROM prs_werkplek
WHERE prs_werkplek_key IN (SELECT prs_werkplek_key
FROM prs_perslidwerkplek
WHERE prs_perslid_key = :old.prs_perslid_key)
AND prs_werkplek_type = 0;
-- Deze delete cascadeert naar de werkplekbezetting door, gooit die dus ook weg
-- Let wel: de werkplekken blijven helaas wel bestaan
ELSE
-- Bij expliciet gooien wij de bezetting weg en blijft de werkplek leeg achter
DELETE FROM prs_perslidwerkplek
WHERE prs_perslid_key = :old.prs_perslid_key;
END IF;
END;
-- Verwijder mandateringen
DELETE FROM prs_perslidkostenplaats
WHERE prs_perslid_key = :old.prs_perslid_key;
-- Verwijder contactpersoon-link
UPDATE prs_contactpersoon
SET prs_perslid_key = NULL
WHERE prs_perslid_key = :old.prs_perslid_key;
BEGIN
-- Pak mijn autorisaties af
DELETE FROM FAC_GEBRUIKERSGROEP WHERE PRS_PERSLID_KEY = :old.prs_perslid_key;
-- Ook een stukje veiligheid
DELETE FROM fac_session WHERE prs_perslid_key = :old.prs_perslid_key;
END;
-- Tenslotte: ruim de objecten die ik zelf mocht beheren op
-- Aandacht: zou nog steeds kunnen dat dit faalt, niet mekkeren, jammer dan
BEGIN
DELETE FROM INS_DEEL WHERE ins_deel_key IN
(SELECT D.ins_deel_key
FROM ins_deel D, ins_tab_discipline DI
WHERE ins_alg_ruimte_type = 'P'
AND ins_alg_ruimte_key = :old.prs_perslid_key
AND DI.ins_discipline_key = D.ins_discipline_key
AND DI.ins_discipline_min_level = 3);
EXCEPTION
WHEN OTHERS THEN NULL;
END;
-- Wis alle authenticatiemogelijkheden
:new.prs_perslid_oslogin := '';
:new.prs_perslid_oslogin2 := '';
:new.prs_perslid_apikey := NULL;
-- And do what prs.setpassword(:new.prs_perslid_key, NULL) would do:
:new.prs_perslid_salt := NULL;
:new.prs_perslid_wachtwoord_hash := NULL;
:new.prs_perslid_wachtwoord_exp := NULL;
:new.prs_perslid_otpsecret := NULL;
END IF;
IF :new.prs_perslid_oslogin IS NULL AND :old.prs_perslid_oslogin IS NOT NULL
OR :new.prs_perslid_oslogin2 IS NULL AND :old.prs_perslid_oslogin2 IS NOT NULL
OR NVL(:new.prs_perslid_wachtwoord_hash, 'X') <> NVL(:old.prs_perslid_wachtwoord_hash, 'X')
THEN -- Merk op: anno 5.3.2 wordt een persoon die *nu* is ingelogd hier niet
-- automatisch door uitgelogd
:new.prs_perslid_credentials_datum := SYSDATE;
DELETE FROM fac_session
WHERE prs_perslid_key = :new.prs_perslid_key;
END IF;
END;
/
CREATE_TRIGGER(prs_t_prs_perslid_A_IU)
AFTER INSERT OR UPDATE ON prs_perslid
FOR EACH ROW
BEGIN
/*
* Als echte persoon een login krijgt, dan ook in de default autorisatiegroep als die nog geen rechten had
*/
IF :new.prs_perslid_verwijder IS NULLDATUM AND
:new.prs_perslid_oslogin IS NOT NULL AND :old.prs_perslid_oslogin IS NULL AND
SUBSTR(:new.prs_perslid_oslogin, 1, 1) <> '_'
THEN
BEGIN
INSERT INTO fac_gebruikersgroep
(fac_groep_key, prs_perslid_key)
SELECT fac_groep_key, :NEW.prs_perslid_key
FROM fac_groep
WHERE fac_groep_upper = '_DEFAULT'
AND NOT EXISTS (SELECT 'x'
FROM fac_gebruikersgroep
WHERE prs_perslid_key = :NEW.prs_perslid_key);
EXCEPTION
WHEN OTHERS
THEN
NULL;
END;
END IF;
END;
/
CREATE_TRIGGER(prs_t_prs_perslid_B_D)
BEFORE DELETE ON prs_perslid
FOR EACH ROW
BEGIN
DELETE FROM prs_kenmerklink KL WHERE KL.prs_link_key=:old.prs_perslid_key AND KL.prs_kenmerklink_niveau='P';
END;
/
CREATE_TRIGGER(prs_t_prs_werkplek_B_IU)
BEFORE INSERT OR UPDATE ON prs_werkplek
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_werkplek_key, prs_s_prs_werkplek_key);
/* werkplek weg = bezetting weg gebeurt via de cascade */
UPDATE_AANMAAKDATUM(prs_werkplek, prs_werkplek_aanmaak);
END;
/
CREATE_TRIGGER(prs_t_prs_werkplek_B_D)
BEFORE DELETE ON prs_werkplek
FOR EACH ROW
BEGIN
UPDATE ins_deel
SET ins_alg_ruimte_type = 'R',
ins_alg_ruimte_key = :old.prs_alg_ruimte_key
WHERE ins_deel.ins_alg_ruimte_key = :old.prs_werkplek_key
AND ins_deel.ins_alg_ruimte_type = 'W';
END;
/
CREATE_TRIGGER(prs_t_prs_ruimteafdeling_B_IU)
BEFORE INSERT OR UPDATE ON prs_ruimteafdeling
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_ruimteafdeling_key, prs_s_prs_ruimteafdeling_key);
END;
/
CREATE_TRIGGER(prs_t_prs_perslidwerkplek_B_IU)
BEFORE INSERT OR UPDATE ON prs_perslidwerkplek
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_perslidwerkplek_key, prs_s_prs_perslidwerkplek_key);
UPDATE_AANMAAKDATUM(prs_perslidwerkplek, prs_perslidwerkplek_aanmaak);
END;
/
CREATE_TRIGGER(prs_t_prs_bedrijf_B_I)
BEFORE INSERT ON prs_bedrijf
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_bedrijf_key,prs_s_prs_alluitvoerende_keys);
UPDATE_AANMAAKDATUM(prs_bedrijf, prs_bedrijf_aanmaak);
END;
/
CREATE_TRIGGER(prs_t_prs_bedrijf_B_IU)
BEFORE INSERT OR UPDATE ON prs_bedrijf
FOR EACH ROW
BEGIN
UPDATE_UPPER(prs_bedrijf_naam,prs_bedrijf_naam_upper,prs_bedrijf);
SET_VERWIJDER_CHILDREN(prs_srtperslid, prs_bedrijf_key,
prs_bedrijf_verwijder, prs_srtperslid_verwijder,prs_bedrijf);
// Niet verwijderen als nog MLD_OPDRs zijn met status 'Uitgegeven' en
// uitvoerende dit bedrijf
IF :new.prs_bedrijf_verwijder IS NOT NULL AND :old.prs_bedrijf_verwijder IS NULL
THEN
DECLARE
dummy CHAR;
BEGIN
SELECT 'X'
INTO dummy
FROM mld_opdr MLD_O
WHERE MLD_O.mld_statusopdr_key IN (5, 8)
AND MLD_O.mld_uitvoerende_keys = :new.prs_bedrijf_key;
APPLICATION_ERROR_GOTO(-20000, 'prs_m086');
EXCEPTION
WHEN NO_DATA_FOUND
THEN NULL;
WHEN TOO_MANY_ROWS
THEN APPLICATION_ERROR_GOTO(-20000, 'prs_m086');
END;
END IF;
IF :new.prs_bedrijf_verwijder IS NOT NULL AND :old.prs_bedrijf_verwijder IS NULL THEN
DECLARE
dummy CHAR;
BEGIN
SELECT 'x'
INTO dummy
FROM cnt_v_aanwezigcontract
WHERE cnt_v_aanwezigcontract.cnt_prs_bedrijf_key = :old.prs_bedrijf_key
AND cnt_v_aanwezigcontract.cnt_contract_looptijd_tot > sysdate;
APPLICATION_ERROR_GOTO(-20000,'cnt_m023');
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL;
WHEN TOO_MANY_ROWS THEN APPLICATION_ERROR_GOTO(-20000,'cnt_m023');
END;
END IF;
-- Ruim de afhankelijheden op:
IF :new.prs_bedrijf_verwijder IS NOT NULL AND :old.prs_bedrijf_verwijder IS NULL
THEN
UPDATE prs_afdeling
SET prs_afdeling_verwijder = :new.prs_bedrijf_verwijder
WHERE prs_afdeling_verwijder IS NULL AND prs_bedrijf_key = :old.prs_bedrijf_key;
UPDATE prs_contactpersoon
SET prs_contactpersoon_verwijder = :new.prs_bedrijf_verwijder
WHERE prs_contactpersoon_verwijder IS NULL
AND prs_bedrijf_key = :old.prs_bedrijf_key;
END IF;
END;
/
CREATE_TRIGGER(prs_t_prs_bedrijf_B_D)
BEFORE DELETE ON prs_bedrijf
FOR EACH ROW
BEGIN
DELETE FROM prs_kenmerklink KL WHERE KL.prs_link_key=:old.prs_bedrijf_key AND KL.prs_kenmerklink_niveau='B';
END;
/
CREATE_TRIGGER(prs_t_prs_bedrijfadres_B_I)
BEFORE INSERT ON prs_bedrijfadres
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_bedrijfadres_key, prs_s_prs_bedrijfadres_key);
END;
/
CREATE_TRIGGER(prs_t_prs_kenmerk_b_iu)
BEFORE INSERT OR UPDATE ON prs_kenmerk
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_kenmerk_key, prs_s_prs_kenmerk_key);
UPDATE_UPPER(prs_kenmerk_omschrijving, prs_kenmerk_upper,prs_kenmerk);
IF (:new.prs_kenmerk_verwijder IS NOT NULL AND :old.prs_kenmerk_verwijder IS NULL AND
:new.prs_kenmerk_systeem = 1)
THEN
APPLICATION_ERROR(-20003, 'ALG_M238');
END IF;
IF :new.prs_kenmerk_kenmerktype IN ('C', 'N', 'B') AND :new.prs_kenmerk_lengte IS NULL
THEN
APPLICATION_ERROR(-20000, 'ALG_C_ALG_KENMERK_LENGTE');
END IF;
IF :new.prs_kenmerk_kenmerktype IN ('N', 'B') AND :new.prs_kenmerk_lengte > 20
THEN
:new.prs_kenmerk_lengte := 20;
END IF;
IF :new.prs_kenmerk_kenmerktype IN ('N', 'B') AND :old.prs_kenmerk_key IS NOT NULL
THEN
-- An existing property of type N
IF :old.prs_kenmerk_nmin <> :new.prs_kenmerk_nmin OR
(:old.prs_kenmerk_nmin IS NULL AND :new.prs_kenmerk_nmin IS NOT NULL)
THEN
DECLARE
Dummy CHAR;
BEGIN
SELECT 'X'
INTO Dummy
FROM prs_kenmerkLink
WHERE FAC.SAFE_TO_NUMBER(prs_kenmerkLink_waarde) < :new.prs_kenmerk_nmin
AND prs_kenmerk_key = :old.prs_kenmerk_key;
IF :new.prs_kenmerk_niveau = 'G' THEN
raise_application_error(-20000, 'ALG_C_ALG_KENMERK_MIN_G');
ELSE
raise_application_error(-20000, 'ALG_C_ALG_KENMERK_MIN_R');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND
THEN NULL;
WHEN TOO_MANY_ROWS THEN
BEGIN
IF :new.prs_kenmerk_niveau = 'G' THEN
raise_application_error(-20000, 'ALG_C_ALG_KENMERK_MIN_G');
ELSE
raise_application_error(-20000, 'ALG_C_ALG_KENMERK_MIN_R');
END IF;
END;
END;
END IF;
IF :old.prs_kenmerk_nmax <> :new.prs_kenmerk_nmax OR
(:old.prs_kenmerk_nmax IS NULL AND :new.prs_kenmerk_nmax IS NOT NULL)
THEN
DECLARE
Dummy CHAR;
BEGIN
SELECT 'X'
INTO Dummy
FROM prs_kenmerkLink
WHERE FAC.SAFE_TO_NUMBER(prs_kenmerkLink_waarde) > :new.prs_kenmerk_nmax
AND prs_kenmerk_key = :old.prs_kenmerk_key;
IF :new.prs_kenmerk_niveau = 'G' THEN
raise_application_error(-20000, 'ALG_C_ALG_KENMERK_MAX_G');
ELSE
raise_application_error(-20000, 'ALG_C_ALG_KENMERK_MAX_R');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND
THEN NULL;
WHEN TOO_MANY_ROWS THEN
BEGIN
IF :new.prs_kenmerk_niveau = 'G' THEN
raise_application_error(-20000, 'ALG_C_ALG_KENMERK_MAX_G');
ELSE
raise_application_error(-20000, 'ALG_C_ALG_KENMERK_MAX_R');
END IF;
END;
END;
END IF;
END IF;
UPDATE_AANMAAKDATUM(prs_kenmerk, prs_kenmerk_aanmaak);
END;
/
CREATE_TRIGGER(prs_t_prs_kenmerkLink_b_iu)
BEFORE INSERT OR UPDATE ON prs_kenmerkLink
FOR EACH ROW
BEGIN
UPDATE_AANMAAKDATUM(prs_kenmerklink, prs_kenmerkLink_aanmaak);
/*
** Controleer eerst of de ingevulde waarde goed is.
*/
IF (:new.prs_kenmerkLink_waarde <> :old.prs_kenmerkLink_waarde
OR :old.prs_kenmerkLink_waarde IS NULL
OR :new.prs_kenmerkLink_waarde IS NULL)
AND :new.prs_link_key IS NOT NULL
THEN
DECLARE
KenmerkOmschr prs_kenmerk.prs_kenmerk_omschrijving%TYPE;
KenmerkType prs_kenmerk.prs_kenmerk_kenmerktype%TYPE;
KenmerkLengte prs_kenmerk.prs_kenmerk_lengte%TYPE;
KenmerkDec prs_kenmerk.prs_kenmerk_dec%TYPE;
KenmerkNMin prs_kenmerk.prs_kenmerk_nmin%TYPE;
KenmerkNMax prs_kenmerk.prs_kenmerk_nmax%TYPE;
NumberWaarde NUMBER(25,5);
FormatMask VARCHAR2(60);
KenmerkWaarde prs_kenmerklink.prs_kenmerklink_waarde%TYPE;
BEGIN
KenmerkWaarde := :new.prs_kenmerkLink_waarde;
BEGIN
DECLARE
dummy VARCHAR2(1);
BEGIN
IF :new.prs_kenmerkLink_niveau = 'P'
THEN
SELECT 'X'
INTO dummy
FROM prs_perslid
WHERE prs_perslid_key = :new.prs_link_key;
ELSIF :new.prs_kenmerkLink_niveau = 'A'
THEN
SELECT 'X'
INTO dummy
FROM prs_afdeling
WHERE prs_afdeling_key = :new.prs_link_key;
ELSIF :new.prs_kenmerkLink_niveau = 'B'
THEN
SELECT 'X'
INTO dummy
FROM prs_bedrijf
WHERE prs_bedrijf_key = :new.prs_link_key;
ELSIF :new.prs_kenmerkLink_niveau = 'C'
THEN
SELECT 'X'
INTO dummy
FROM prs_contactpersoon
WHERE prs_contactpersoon_key = :new.prs_link_key;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND
THEN APPLICATION_ERROR_GOTO(-20000, 'ALG_M015');
END;
SELECT prs_kenmerk_omschrijving
, prs_kenmerk_kenmerktype
, prs_kenmerk_lengte
, prs_kenmerk_dec
, prs_kenmerk_nmin
, prs_kenmerk_nmax
INTO KenmerkOmschr
, KenmerkType
, KenmerkLengte
, KenmerkDec
, KenmerkNMin
, KenmerkNMax
FROM prs_kenmerk
WHERE prs_kenmerk_key = :new.prs_kenmerk_key;
EXCEPTION
WHEN NO_DATA_FOUND
THEN APPLICATION_ERROR_GOTO(-20000,'INS_R_INS_KENMERK_KEY1');
END;
/* Kijk welk KenmerkType gebruikt wordt.
** Aan de hand daarvan moet een controle uitgevoerd worden.
**/
IF KenmerkType = 'C'
/*
** Char
*/
THEN
/*
** Controleer of de lengte te groot of goed is
*/
IF LENGTH(KenmerkWaarde) > KenmerkLengte
THEN
APPLICATION_ERROR_GOTO(-20004, 'ALG_M232,'|| KenmerkOmschr ||','
|| TO_CHAR(KenmerkLengte));
END IF;
ELSIF KenmerkType IN ('N', 'B')
/*
** Number
*/
THEN
/*
** Controleer of er een numerieke waarde ingevuld is
*/
IF KenmerkDec IS NULL OR KenmerkDec = 0
THEN
FormatMask := RPAD('9', KenmerkLengte, '9');
ELSE
FormatMask := RPAD('9', KenmerkLengte - KenmerkDec, '9')
||'D'||RPAD('9', KenmerkDec, '9');
END IF;
/*
** Controleer of er een numerieke waarde ingevuld is
*/
BEGIN
NumberWaarde := TO_NUMBER(KenmerkWaarde);
EXCEPTION
WHEN OTHERS
THEN FormatMask := REPLACE(FormatMask, '9', '#');
FormatMask := REPLACE(FormatMask, '0', '#');
FormatMask := REPLACE(FormatMask, 'D', '.');
RAISE_APPLICATION_ERROR(-20004,'ALG_M233,'|| KenmerkOmschr ||','
|| FormatMask);
END;
/*
** Controleer of de waarde binnen NMin en NMax ligt
*/
IF ( (KenmerkNMin IS NOT NULL AND NumberWaarde < KenmerkNMin)
OR (KenmerkNMax IS NOT NULL AND NumberWaarde > KenmerkNMax))
THEN
APPLICATION_ERROR_GOTO(-20004, 'ALG_M234,'|| KenmerkOmschr ||','
|| TO_CHAR(KenmerkNMin)||','
|| TO_CHAR(KenmerkNMax));
ELSE
/*
** Controleer of de waarde aan het formaat voldoet
*/
KenmerkWaarde := LTRIM(NUMBER_TO_CHAR(NumberWaarde, FormatMask));
IF INSTR2(KenmerkWaarde, '#') <> 0
THEN
FormatMask := REPLACE(FormatMask, '9', '#');
FormatMask := REPLACE(FormatMask, '0', '#');
FormatMask := REPLACE(FormatMask, 'D', '.');
APPLICATION_ERROR_GOTO(-20004,'ALG_M233,'|| KenmerkOmschr ||','
|| FormatMask);
END IF;
END IF;
/*
** Zet de geconverteerde waarde terug
*/
:new.prs_kenmerkLink_waarde := KenmerkWaarde;
ELSIF KenmerkType = 'D'
/*
** Datum
*/
THEN
KenmerkWaarde := DATE_TO_CHAR(_TO_DATE2(KenmerkWaarde,'DD-MM-YY'),'DD-MM-YYYY');
/*
** Zet de geconverteerde waarde terug
*/
:new.prs_kenmerkLink_waarde := KenmerkWaarde;
END IF;
END;
UPDATE_PRIMARY_KEY(prs_kenmerkLink_key, prs_s_prs_kenmerkLink_key);
END IF;
END;
/
CREATE_TRIGGER(prs_t_prs_collega_B_IU)
BEFORE INSERT OR UPDATE ON prs_collega
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_collega_key,prs_s_prs_collega_key);
END;
/
CREATE_TRIGGER(prs_t_prs_contactpersoon_B_IU)
BEFORE INSERT OR UPDATE ON prs_contactpersoon
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_contactpersoon_key,prs_s_prs_contactpersoon_key);
END;
/
CREATE_TRIGGER(prs_t_prs_contactpersoon_B_D)
BEFORE DELETE ON prs_contactpersoon
FOR EACH ROW
BEGIN
DELETE FROM prs_kenmerklink KL WHERE KL.prs_link_key=:old.prs_contactpersoon_key AND KL.prs_kenmerklink_niveau='C';
END;
/
CREATE_TRIGGER(prs_t_prs_contactpers_loc_b_iu)
BEFORE INSERT OR UPDATE ON prs_contactpersoon_locatie
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_contactpersoon_locatie_key,prs_s_prs_contactpers_loc_key);
END;
/
CREATE_TRIGGER(prs_t_prs_dienst_B_IU)
BEFORE INSERT OR UPDATE ON prs_dienst
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_dienst_key,prs_s_prs_dienst_key);
END;
/
CREATE_TRIGGER(prs_t_prs_bedrijfdnstloc_B_IU)
BEFORE INSERT OR UPDATE ON prs_bedrijfdienstlocatie
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_bedrijfdienstlocatie_key,prs_s_prs_bedrijfdienstloc_key);
END;
/
CREATE_TRIGGER(prs_t_prs_kostenplaatsgrp_B_IU)
BEFORE INSERT OR UPDATE ON prs_kostenplaatsgrp
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_kostenplaatsgrp_key, prs_s_prs_kostenplaatsgrp_key);
END;
/
CREATE_TRIGGER(prs_t_prs_kostenplaats_B_IU)
BEFORE INSERT OR UPDATE ON prs_kostenplaats
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_kostenplaats_key, prs_s_prs_kostenplaats_key);
UPDATE_UPPER(prs_kostenplaats_nr, prs_kostenplaats_upper, prs_kostenplaats);
IF :new.prs_kostenplaats_verwijder IS NOT NULL and :old.prs_kostenplaats_verwijder IS NULL
THEN
DELETE FROM prs_perslidkostenplaats
WHERE prs_kostenplaats_key = :new.prs_kostenplaats_key;
END IF;
END;
/
CREATE_TRIGGER(prs_t_prs_kostenpltsdisc_B_IU)
BEFORE INSERT OR UPDATE ON prs_kostenplaatsdisc
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_kostenplaatsdisc_key, prs_s_prs_kostenplaatsdisc_key);
END;
/
CREATE_TRIGGER(prs_t_prs_perslidkp_B_IU)
BEFORE INSERT OR UPDATE ON prs_perslidkostenplaats
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_perslidkostenplaats_key, prs_s_prs_perslidkp_key);
END;
/
CREATE_TRIGGER(prs_t_prs_project_B_IU)
BEFORE INSERT OR UPDATE ON prs_project
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_project_key, prs_s_prs_project_key);
END;
/
CREATE_TRIGGER(prs_t_prs_kostensoortgrp_B_IU)
BEFORE INSERT OR UPDATE ON prs_kostensoortgrp
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_kostensoortgrp_key, prs_s_prs_kostensoortgrp_key);
END;
/
CREATE_TRIGGER(prs_t_prs_kostensoort_B_IU)
BEFORE INSERT OR UPDATE ON prs_kostensoort
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_kostensoort_key, prs_s_prs_kostensoort_key);
UPDATE_UPPER(prs_kostensoort_oms, prs_kostensoort_upper, prs_kostensoort);
END;
/
CREATE_TRIGGER(prs_t_prs_kostencomb_B_IU)
BEFORE INSERT OR UPDATE ON prs_kostencombinatie
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_kostencombinatie_key, prs_s_prs_kostencombinatie_key);
END;
/
CREATE_TRIGGER(prs_t_prs_staffel_B_IU)
BEFORE INSERT OR UPDATE ON prs_staffel
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_staffel_key, prs_s_prs_staffel_key);
END;
/
CREATE_TRIGGER(prs_t_prs_perslid_inzet_B_IU)
BEFORE INSERT OR UPDATE ON prs_perslid_inzetbaar
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_perslid_inzetbaar_key, prs_s_prs_perslid_inzet_key);
END;
/
CREATE_TRIGGER(prs_t_prs_relatietype_B_IU)
BEFORE INSERT OR UPDATE ON prs_relatietype
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(prs_relatietype_key, prs_s_prs_relatietype_key);
CHECK_NOG_REFERENCES(prs_relatietype, prs_relatietype_verwijder, prs_v_aanwezigbedrijf,
prs_relatietype_key, 'PRS_M182');
END;
/
REGISTERRUN('$Id$')
#endif