Files
Database/MLD/MLD_TRI.SRC
Peter Feij 0bc61f6286 api-change
svn path=/Database/trunk/; revision=9429
2007-01-23 10:04:26 +00:00

970 lines
35 KiB
Plaintext

#ifdef MLD // 13-03-96 AH
/*
* $Revision: 51 $
* $Modtime: 15-01-07 14:51 $
*/
#include "comsql.h"
CREATE_TRIGGER(mld_t_mld_disc_params_b_iu)
BEFORE INSERT OR UPDATE ON mld_disc_params
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(mld_disc_params_key, mld_s_mld_disc_params_key);
END;
/
CREATE_TRIGGER(mld_t_mld_oorzaak_B_IU)
BEFORE INSERT OR UPDATE ON mld_oorzaak
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(mld_oorzaak_key,mld_s_mld_oorzaak_key);
UPDATE_UPPER(mld_oorzaak_omschrijving,mld_oorzaak_upper,mld_oorzaak);
END;
/
CREATE_TRIGGER(mld_t_mld_meldbron_B_IU)
BEFORE INSERT OR UPDATE ON mld_meldbron
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(mld_meldbron_key,mld_s_mld_meldbron_key);
UPDATE_UPPER(mld_meldbron_omschrijving,mld_meldbron_upper,mld_meldbron);
END;
/
CREATE_TRIGGER(mld_t_mld_standaardopdr_B_IU)
BEFORE INSERT OR UPDATE ON mld_standaardopdr
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(mld_standaardopdr_key,mld_s_mld_standaardopdr_key);
UPDATE_UPPER(mld_standaardopdr_afk,mld_standaardopdr_afk_upper,mld_standaardopdr);
END;
/
CREATE_TRIGGER(mld_t_mld_stdmelding_B_IU)
BEFORE INSERT OR UPDATE ON mld_stdmelding
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(mld_stdmelding_key,mld_s_mld_stdmelding_key);
UPDATE_UPPER(mld_stdmelding_omschrijving,mld_stdmelding_upper,mld_stdmelding);
END;
/
CREATE_TRIGGER(mld_t_mld_typeopdr_B_IU)
BEFORE INSERT OR UPDATE ON mld_typeopdr
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(mld_typeopdr_key,mld_s_mld_stdmelding_key);
UPDATE_UPPER(mld_typeopdr_omschrijving,mld_typeopdr_upper,mld_typeopdr);
END;
/
CREATE_TRIGGER(mld_t_mld_typeopdr_srtdi_B_IU)
BEFORE INSERT OR UPDATE ON mld_typeopdr_srtdiscipline
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(mld_typeopdr_srtdiscipline_key,mld_s_mld_typeopdr_srtdisc);
END;
/
CREATE_TRIGGER(mld_t_mld_melding_B_IU)
BEFORE INSERT OR UPDATE ON mld_melding
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(mld_melding_key, mld_s_mld_melding_key);
/* Vul het veld MLD_ALG_LOCATIE_KEY als de onroerendgoed_key wijzigd */
IF :new.mld_alg_onroerendgoed_keys <> 0 AND (:old.mld_alg_onroerendgoed_keys IS NULL
OR :old.mld_alg_onroerendgoed_keys <> :new.mld_alg_onroerendgoed_keys)
THEN
CHECK_REFERENCE_ONROERENDGOED(mld_alg_onroerendgoed_keys, 'alg_m090');
SELECT alg_locatie_key
INTO :NEW.mld_alg_locatie_key
FROM mld_v_onroerendgoed_locatie
WHERE alg_onroerendgoed_keys = :NEW.mld_alg_onroerendgoed_keys;
#ifdef MS_SQL
else
if :new.mld_alg_locatie_key is null then
APPLICATION_ERROR_GOTO(-20000,'mld_r_alg_locatie_key1')
end if
#endif
END IF;
IF :new.prs_perslid_key IS NULL
THEN
APPLICATION_ERROR_GOTO(-20000, 'mld_m233');
END IF;
IF :new.mld_melding_afgewezen IS NOT NULL
AND :new.mld_melding_geaccepteerd IS NOT NULL
THEN
APPLICATION_ERROR_GOTO(-20000, 'mld_m175');
END IF;
IF :new.mld_melding_verwerkt IS NOT NULL AND :old.mld_melding_verwerkt IS NULL THEN
-- De melding wordt nu verwerkt
IF :old.mld_melding_geaccepteerd IS NULL AND :old.mld_melding_afgemeld IS NULL THEN
APPLICATION_ERROR_GOTO(-20000, 'mld_m203');
ELSE
DECLARE
Dummy VARCHAR2(1);
BEGIN
SELECT 'X'
INTO dummy
FROM mld_opdr mld_o, mld_statusopdr mld_so
WHERE mld_o.mld_statusopdr_key = mld_so.mld_statusopdr_key
AND (mld_so.mld_statusopdr_upper = 'MLD_UITGEGEVEN' OR mld_so.mld_statusopdr_upper = 'MLD_AFGEMELD')
AND mld_o.mld_melding_key = :NEW.mld_melding_key;
APPLICATION_ERROR_GOTO(-20000, 'mld_m192');
EXCEPTION
WHEN NO_DATA_FOUND
THEN NULL;
WHEN TOO_MANY_ROWS
THEN APPLICATION_ERROR_GOTO(-20000, 'mld_m192');
END;
END IF;
ELSIF :NEW.mld_melding_afgemeld IS NOT NULL AND :OLD.mld_melding_afgemeld IS NULL
THEN
-- De melding wordt nu afgemeld
IF :old.mld_melding_geaccepteerd IS NULL THEN
APPLICATION_ERROR_GOTO(-20000, 'mld_m202');
ELSIF :old.mld_melding_verwerkt IS NOT NULL THEN
APPLICATION_ERROR_GOTO(-20000, 'mld_m195');
END IF;
END IF;
IF :new.mld_melding_uitvoertijd2 IS NULL
THEN
:new.mld_melding_uitvoertijd2 := :new.mld_melding_uitvoertijd;
END IF;
-- Update melding status
IF :NEW.mld_melding_afgewezen IS NOT NULL
THEN
:NEW.mld_melding_status := 1;
ELSIF :NEW.mld_melding_verwerkt IS NOT NULL
THEN
:NEW.mld_melding_status := 6;
ELSIF :NEW.mld_melding_afgemeld IS NOT NULL
THEN
:NEW.mld_melding_status := 5;
ELSIF :NEW.mld_melding_geaccepteerd IS NOT NULL
THEN
DECLARE
ord_num NUMBER;
BEGIN
SELECT NVL (MIN (o.mld_statusopdr_key), 0)
INTO ord_num
FROM mld_opdr o
WHERE o.mld_melding_key = :NEW.mld_melding_key;
IF ord_num = 0
THEN
-- No orders: status = Accepted
:NEW.mld_melding_status := 4;
ELSIF ord_num = 5
THEN
-- Open orders: status = in progress
:NEW.mld_melding_status := 7;
ELSE
-- Only closed orders: status = Accepted again
:NEW.mld_melding_status := 4;
END IF;
END;
ELSIF :NEW.mld_melding_ingezien IS NOT NULL
THEN
:NEW.mld_melding_status := 3;
ELSE
:NEW.mld_melding_status := 2;
END IF;
END;
/
CREATE_TRIGGER(mld_t_mld_opdr_B_IU)
BEFORE INSERT OR UPDATE ON mld_opdr
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(mld_opdr_key, mld_s_mld_opdr_key);
/* Controleer of de opdracht bij een melding hoort die de goede status heeft,
* namelijk: GEACCEPTEERD of AFGEMELD (minimaal GEACCEPTEERD),
* Zo niet, dan mag het alleen als de contract_key is ingevuld
*/
IF :NEW.mld_melding_key IS NOT NULL
THEN
DECLARE
dummy CHAR;
BEGIN
SELECT 'X'
INTO dummy
FROM mld_melding
WHERE mld_melding_key = :NEW.mld_melding_key
AND mld_melding_geaccepteerd IS NOT NULL
AND mld_melding_verwerkt IS NULL;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
IF :NEW.cnt_contract_key IS NULL
THEN
raise_application_error (-20000, 'mld_m201');
END IF;
END;
END IF;
CHECK_REFERENCE_UITVOERENDE(mld_uitvoerende_keys, 'mld_m37');
IF :NEW.mld_statusopdr_key = 7 AND :OLD.mld_statusopdr_key <> 7 AND :NEW.mld_opdr_verwerkt IS NULL
THEN
:NEW.mld_opdr_verwerkt := SYSDATE;
END IF;
END;
/
CREATE_TRIGGER(mld_t_mld_adres_B_IU)
BEFORE INSERT OR UPDATE ON mld_adres
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(mld_adres_key, mld_s_mld_adres_key);
UPDATE_UPPER(mld_adres_naam, mld_adres_upper,mld_adres);
END;
/
CREATE_TRIGGER(mld_t_mld_vrije_dagen_b_iu)
BEFORE INSERT OR UPDATE ON mld_vrije_dagen
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(mld_vrije_dagen_key, mld_s_mld_vrije_dagen_key);
/* Haal het tijdgedeelte van de ingevoerde datum af. */
:new.mld_vrije_dagen_datum := TRUNC_DATE(:new.mld_vrije_dagen_datum);
END;
/
CREATE_TRIGGER(mld_t_mld_mld_object_B_IU)
BEFORE INSERT OR UPDATE ON mld_melding_object
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(mld_melding_object_key, mld_s_mld_object_key);
END;
/
CREATE_TRIGGER(mld_t_mld_refsrtkenmerk_b_iu)
BEFORE INSERT OR UPDATE ON mld_refsrtkenmerk
FOR EACH ROW
DECLARE
ObjectType USER_OBJECTS.OBJECT_TYPE%TYPE;
BEGIN
UPDATE_PRIMARY_KEY(mld_refsrtkenmerk_key, mld_s_mld_refsrtkenmerk_key);
UPDATE_UPPER(mld_refsrtkenmerk_omschrijving, mld_refsrtkenmerk_upper,mld_refsrtkenmerk);
UPDATE_AANMAAKDATUM(mld_refsrtkenmerk, mld_refsrtkenmerk_aanmaak);
--
-- Controleer of de ingevulde tablenaam, kolomnaam en kolomtxt
-- wel bestaan. Controle moet ook gebeuren als de omschrijving
-- is gewijzigd; de objectnaam is dan hetzelfde.
--
BEGIN
SELECT object_type
INTO ObjectType
FROM USER_OBJECTS
WHERE object_name = :new.mld_refsrtkenmerk_objectnaam;
EXCEPTION
WHEN NO_DATA_FOUND THEN ObjectType := NULL;
END;
--
IF ObjectType IS NULL
THEN
raise_application_error(-20000, 'mld_m244');
ELSIF ObjectType = 'TABLE'
OR ObjectType = 'VIEW'
THEN
-- Bij een TABLE of VIEW staan de kolommen in USER_TAB_COLUMNS
-- Controleer of deze KOLOMNAAM en KOLOMTXT bestaan.
--
DECLARE
Dummy VARCHAR2(30);
BEGIN
SELECT column_name
INTO Dummy
FROM USER_TAB_COLUMNS
WHERE table_name = :new.mld_refsrtkenmerk_objectnaam
AND column_name = :new.mld_refsrtkenmerk_kolomnaam
AND data_type = 'NUMBER';
EXCEPTION
WHEN NO_DATA_FOUND THEN raise_application_error(-20000, 'mld_m245');
END;
--
DECLARE
Dummy VARCHAR2(30);
BEGIN
SELECT column_name
INTO Dummy
FROM USER_TAB_COLUMNS
WHERE table_name = :new.mld_refsrtkenmerk_objectnaam
AND column_name = :new.mld_refsrtkenmerk_kolomtxt
AND data_type LIKE '%CHAR%';
EXCEPTION
WHEN NO_DATA_FOUND THEN raise_application_error(-20000, 'mld_m246');
END;
ELSIF ObjectType <> 'SYNONYM'
THEN
-- Bij een SYNONYM kan er niet gecontroleerd worden
-- of de ingevulde kolommen bestaan.
--
/* NULL;
ELSE */
raise_application_error(-20000, 'mld_m244');
END IF;
END;
/
CREATE_TRIGGER(mld_t_mld_srtkenmerk_b_iu)
BEFORE INSERT OR UPDATE ON mld_srtkenmerk
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(mld_srtkenmerk_key, mld_s_mld_srtkenmerk_key);
UPDATE_UPPER(mld_srtkenmerk_omschrijving, mld_srtkenmerk_upper,mld_srtkenmerk);
UPDATE_AANMAAKDATUM(mld_srtkenmerk, mld_srtkenmerk_aanmaak);
--
IF (:new.mld_srtkenmerk_kenmerktype = 'C'
OR :new.mld_srtkenmerk_kenmerktype = 'N')
AND :new.mld_srtkenmerk_lengte IS NULL
THEN
raise_application_error(-20000, 'MLD_C_MLD_SRTKENMERK_LENGTE');
END IF;
--
IF :new.mld_srtkenmerk_kenmerktype = 'N'
AND :old.mld_srtkenmerk_key IS NOT NULL
THEN
IF :old.mld_srtkenmerk_nmin <> :new.mld_srtkenmerk_nmin
OR (:old.mld_srtkenmerk_nmin IS NULL AND :new.mld_srtkenmerk_nmin IS NOT NULL)
THEN
DECLARE
Dummy CHAR;
BEGIN
SELECT 'X'
INTO Dummy
FROM mld_kenmerkmelding
WHERE FAC.SAFE_TO_NUMBER(mld_kenmerkmelding_waarde) < :new.mld_srtkenmerk_nmin
AND mld_kenmerk_key IN
(SELECT mld_kenmerk_key
FROM mld_kenmerk
WHERE mld_srtkenmerk_key = :old.mld_srtkenmerk_key
);
raise_application_error(-20000, 'MLD_C_MLD_SRTKENMERK_MIN');
EXCEPTION
WHEN NO_DATA_FOUND
THEN NULL;
WHEN TOO_MANY_ROWS
THEN raise_application_error(-20000, 'MLD_C_MLD_SRTKENMERK_MIN');
END;
END IF;
--
IF :old.mld_srtkenmerk_nmax <> :new.mld_srtkenmerk_nmax
OR (:old.mld_srtkenmerk_nmax IS NULL AND :new.mld_srtkenmerk_nmax IS NOT NULL)
THEN
DECLARE
Dummy CHAR;
BEGIN
SELECT 'X'
INTO Dummy
FROM mld_kenmerkmelding
WHERE FAC.SAFE_TO_NUMBER(mld_kenmerkmelding_waarde) > :new.mld_srtkenmerk_nmax
AND mld_kenmerk_key IN
(SELECT mld_kenmerk_key
FROM mld_kenmerk
WHERE mld_srtkenmerk_key = :old.mld_srtkenmerk_key
);
raise_application_error(-20000, 'MLD_C_MLD_SRTKENMERK_MAX');
EXCEPTION
WHEN NO_DATA_FOUND
THEN NULL;
WHEN TOO_MANY_ROWS
THEN raise_application_error(-20000, 'MLD_C_MLD_SRTKENMERK_MAX');
END;
END IF;
END IF;
END;
/
CREATE_TRIGGER(mld_t_mld_srtkenmerk_b_d)
BEFORE DELETE ON mld_srtkenmerk
FOR EACH ROW
BEGIN
IF :old.mld_srtkenmerk_systeem = 1
THEN
raise_application_error(-20003, 'MLD_C_MLD_SRTKENMERK_SYSTEEM');
END IF;
END;
/
CREATE_TRIGGER(mld_t_mld_kenmerk_b_iu)
BEFORE INSERT OR UPDATE ON mld_kenmerk
FOR EACH ROW
BEGIN
-- Een kenmerk mag niet verplicht worden gemaakt als er al
-- waarden ingevuld zijn en hij daarvoor niet verplicht was.
-- Dit is alleen bij wijzigen te controleren, doordat
-- de PrimaryKey niet NULL is.
--
IF :new.mld_kenmerk_key IS NOT NULL
AND :new.mld_kenmerk_verplicht IS NOT NULL
AND :old.mld_kenmerk_verplicht IS NULL
THEN
DECLARE
Dummy CHAR;
BEGIN
SELECT 'X'
INTO Dummy
FROM mld_kenmerkmelding
WHERE mld_kenmerk_key = :new.mld_kenmerk_key;
raise_application_error(-20004, 'MLD_C_MLD_KENMERK_VERPLICHT0');
EXCEPTION
WHEN NO_DATA_FOUND
THEN NULL;
WHEN TOO_MANY_ROWS
THEN raise_application_error(-20004, 'MLD_C_MLD_KENMERK_VERPLICHT0');
END;
END IF;
--
UPDATE_PRIMARY_KEY(mld_kenmerk_key, mld_s_mld_kenmerk_key);
UPDATE_AANMAAKDATUM(mld_kenmerk, mld_kenmerk_aanmaak);
END;
/
CREATE_TRIGGER(mld_t_mld_kenmerkmelding_b_iu)
BEFORE INSERT OR UPDATE ON mld_kenmerkmelding
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(mld_kenmerkmelding_key, mld_s_mld_kenmerkmelding_key);
-- Controleer eerst of de ingevulde waarde goed is.
--
IF :new.mld_kenmerkmelding_waarde <> :old.mld_kenmerkmelding_waarde
OR :old.mld_kenmerkmelding_waarde IS NULL
OR :new.mld_kenmerkmelding_waarde IS NULL
THEN
DECLARE
SrtKenmerkOmschr mld_srtkenmerk.mld_srtkenmerk_omschrijving%TYPE;
SrtKenmerkType mld_srtkenmerk.mld_srtkenmerk_kenmerktype%TYPE;
SrtKenmerkLengte mld_srtkenmerk.mld_srtkenmerk_lengte%TYPE;
SrtKenmerkDec mld_srtkenmerk.mld_srtkenmerk_dec%TYPE;
SrtKenmerkNMin mld_srtkenmerk.mld_srtkenmerk_nmin%TYPE;
SrtKenmerkNMax mld_srtkenmerk.mld_srtkenmerk_nmax%TYPE;
KenmerkVerplicht mld_kenmerk.mld_kenmerk_verplicht%TYPE;
RefSrtKenmerkKey NUMBER(10);
NumberWaarde NUMBER(15,5);
FormatMask VARCHAR2(60);
KenmerkMeldingWaarde mld_kenmerkmelding.mld_kenmerkmelding_waarde%TYPE;
BEGIN
KenmerkMeldingWaarde := :new.mld_kenmerkmelding_waarde;
--
SELECT MLD_SK.mld_srtkenmerk_omschrijving
, MLD_SK.mld_srtkenmerk_kenmerktype
, MLD_SK.mld_srtkenmerk_lengte
, MLD_SK.mld_srtkenmerk_dec
, MLD_SK.mld_srtkenmerk_nmin
, MLD_SK.mld_srtkenmerk_nmax
, MLD_SK.mld_refsrtkenmerk_key
, MLD_K.mld_kenmerk_verplicht
INTO SrtKenmerkOmschr
, SrtKenmerkType
, SrtKenmerkLengte
, SrtKenmerkDec
, SrtKenmerkNMin
, SrtKenmerkNMax
, RefSrtKenmerkKey
, KenmerkVerplicht
FROM mld_srtkenmerk MLD_SK
, mld_kenmerk MLD_K
WHERE MLD_SK.mld_srtkenmerk_key = MLD_K.mld_srtkenmerk_key
AND MLD_K.mld_kenmerk_key = :new.mld_kenmerk_key;
--
-- Controleer eerst of het verplichte veld ingevuld is.
--
IF KenmerkVerplicht IS NOT NULL AND KenmerkMeldingWaarde IS NULL
THEN
APPLICATION_ERROR_GOTO(-20004, 'mld_m240,'||SrtKenmerkOmschr);
--
-- Kijk welk KenmerkType gebruikt wordt.
-- Aan de hand daarvan moet een controle uitgevoerd worden.
--
ELSIF SrtKenmerkType = 'C'
THEN
-- CHAR
-- Controleer of de lengte te groot of goed is.
IF LENGTH(KenmerkMeldingWaarde) > SrtKenmerkLengte
THEN
APPLICATION_ERROR_GOTO(-20004, 'mld_m241,'||SrtKenmerkOmschr||','||TO_CHAR(SrtKenmerkLengte));
END IF;
ELSIF SrtKenmerkType = 'N'
THEN
-- NUMBER
-- 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;
--
BEGIN
#ifdef MS_SQL
DECLARE isnum smallint;
isnum := WEB.IsNumberString(@KenmerkMeldingWaarde)
if isnum = -1 GOTO lcontinue
if isnum = 0 BEGIN
FormatMask := REPLACE(FormatMask, '9', '#');
FormatMask := REPLACE(FormatMask, '0', '#');
FormatMask := REPLACE(FormatMask, 'D', '.');
APPLICATION_ERROR_GOTO(-20004,'mld_m242,'||SrtKenmerkOmschr||','||FormatMask);
END;
#endif
NumberWaarde := TO_NUMBER(KenmerkMeldingWaarde);
#ifndef MS_SQL
EXCEPTION
WHEN OTHERS
THEN FormatMask := REPLACE(FormatMask, '9', '#');
FormatMask := REPLACE(FormatMask, '0', '#');
FormatMask := REPLACE(FormatMask, 'D', '.');
raise_application_error(-20004,'mld_m242,'||SrtKenmerkOmschr||','||FormatMask);
#endif
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, 'mld_m243,'||SrtKenmerkOmschr||','||
TO_CHAR(SrtKenmerkNMin)||','||
TO_CHAR(SrtKenmerkNMax));
ELSE
-- Controleer of de waarde aan het formaat voldoet.
KenmerkMeldingWaarde := LTRIM(NUMBER_TO_CHAR(NumberWaarde, FormatMask));
IF INSTR2(KenmerkMeldingWaarde, '#') <> 0
THEN
FormatMask := REPLACE(FormatMask, '9', '#');
FormatMask := REPLACE(FormatMask, '0', '#');
FormatMask := REPLACE(FormatMask, 'D', '.');
APPLICATION_ERROR_GOTO(-20004,'mld_m242,'||SrtKenmerkOmschr||','||FormatMask);
END IF;
END IF;
-- Zet de geconverteerde waarde terug.
:new.mld_kenmerkmelding_waarde := KenmerkMeldingWaarde;
ELSIF SrtKenmerkType = 'D'
THEN
-- DATUM
#ifdef MS_SQL
DECLARE isdat smallint;
isdat := WEB.IsDateString(@KenmerkMeldingWaarde,'DD-MM-YYYY')
if isdat = -1 GOTO lcontinue
if isdat = 0 BEGIN
FormatMask := 'DD-MM-YYYY';
APPLICATION_ERROR_GOTO(-20004,'mld_m242,'||SrtKenmerkOmschr||','||FormatMask);
END;
#endif
KenmerkMeldingWaarde := DATE_TO_CHAR(_TO_DATE2(KenmerkMeldingWaarde,'DD-MM-YY'),'DD-MM-YYYY');
-- Zet de geconverteerde waarde terug.
:new.mld_kenmerkmelding_waarde := KenmerkMeldingWaarde;
END IF;
END;
#ifdef MS_SQL
lcontinue:
#endif
END IF;
END;
/
CREATE_TRIGGER(mld_t_mld_kenmerkopdr_b_iu)
BEFORE INSERT OR UPDATE ON mld_kenmerkopdr
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(mld_kenmerkopdr_key, mld_s_mld_kenmerkopdr_key);
-- Controleer eerst of de ingevulde waarde goed is.
--
IF :new.mld_kenmerkopdr_waarde <> :old.mld_kenmerkopdr_waarde
OR :old.mld_kenmerkopdr_waarde IS NULL
OR :new.mld_kenmerkopdr_waarde IS NULL
THEN
DECLARE
SrtKenmerkOmschr mld_srtkenmerk.mld_srtkenmerk_omschrijving%TYPE;
SrtKenmerkType mld_srtkenmerk.mld_srtkenmerk_kenmerktype%TYPE;
SrtKenmerkLengte mld_srtkenmerk.mld_srtkenmerk_lengte%TYPE;
SrtKenmerkDec mld_srtkenmerk.mld_srtkenmerk_dec%TYPE;
SrtKenmerkNMin mld_srtkenmerk.mld_srtkenmerk_nmin%TYPE;
SrtKenmerkNMax mld_srtkenmerk.mld_srtkenmerk_nmax%TYPE;
KenmerkVerplicht mld_kenmerk.mld_kenmerk_verplicht%TYPE;
RefSrtKenmerkKey NUMBER(10);
NumberWaarde NUMBER(15,5);
FormatMask VARCHAR2(60);
KenmerkOpdrWaarde mld_kenmerkopdr.mld_kenmerkopdr_waarde%TYPE;
BEGIN
KenmerkOpdrWaarde := :new.mld_kenmerkopdr_waarde;
--
SELECT MLD_SK.mld_srtkenmerk_omschrijving
, MLD_SK.mld_srtkenmerk_kenmerktype
, MLD_SK.mld_srtkenmerk_lengte
, MLD_SK.mld_srtkenmerk_dec
, MLD_SK.mld_srtkenmerk_nmin
, MLD_SK.mld_srtkenmerk_nmax
, MLD_SK.mld_refsrtkenmerk_key
, MLD_K.mld_kenmerk_verplicht
INTO SrtKenmerkOmschr
, SrtKenmerkType
, SrtKenmerkLengte
, SrtKenmerkDec
, SrtKenmerkNMin
, SrtKenmerkNMax
, RefSrtKenmerkKey
, KenmerkVerplicht
FROM mld_srtkenmerk MLD_SK
, mld_kenmerk MLD_K
WHERE MLD_SK.mld_srtkenmerk_key = MLD_K.mld_srtkenmerk_key
AND MLD_K.mld_kenmerk_key = :new.mld_kenmerk_key;
--
-- Controleer eerst of het verplichte veld ingevuld is.
--
IF KenmerkVerplicht IS NOT NULL AND KenmerkOpdrWaarde IS NULL
THEN
APPLICATION_ERROR_GOTO(-20004, 'mld_m240,'||SrtKenmerkOmschr);
--
-- Kijk welk KenmerkType gebruikt wordt.
-- Aan de hand daarvan moet een controle uitgevoerd worden.
--
ELSIF SrtKenmerkType = 'C'
THEN
-- CHAR
-- Controleer of de lengte te groot of goed is.
IF LENGTH(KenmerkOpdrWaarde) > SrtKenmerkLengte
THEN
APPLICATION_ERROR_GOTO(-20004, 'mld_m241,'||SrtKenmerkOmschr||','||TO_CHAR(SrtKenmerkLengte));
END IF;
ELSIF SrtKenmerkType = 'N'
THEN
-- NUMBER
-- 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;
--
BEGIN
#ifdef MS_SQL
DECLARE isnum smallint;
isnum := WEB.IsNumberString(@KenmerkOpdrWaarde)
if isnum = -1 GOTO lcontinue
if isnum = 0 BEGIN
FormatMask := REPLACE(FormatMask, '9', '#');
FormatMask := REPLACE(FormatMask, '0', '#');
FormatMask := REPLACE(FormatMask, 'D', '.');
APPLICATION_ERROR_GOTO(-20004,'mld_m242,'||SrtKenmerkOmschr||','||FormatMask);
END;
#endif
NumberWaarde := TO_NUMBER(KenmerkOpdrWaarde);
#ifndef MS_SQL
EXCEPTION
WHEN OTHERS
THEN FormatMask := REPLACE(FormatMask, '9', '#');
FormatMask := REPLACE(FormatMask, '0', '#');
FormatMask := REPLACE(FormatMask, 'D', '.');
raise_application_error(-20004,'mld_m242,'||SrtKenmerkOmschr||','||FormatMask);
#endif
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, 'mld_m243,'||SrtKenmerkOmschr||','||
TO_CHAR(SrtKenmerkNMin)||','||
TO_CHAR(SrtKenmerkNMax));
ELSE
-- Controleer of de waarde aan het formaat voldoet.
KenmerkOpdrWaarde := LTRIM(NUMBER_TO_CHAR(NumberWaarde, FormatMask));
IF INSTR2(KenmerkOpdrWaarde, '#') <> 0
THEN
FormatMask := REPLACE(FormatMask, '9', '#');
FormatMask := REPLACE(FormatMask, '0', '#');
FormatMask := REPLACE(FormatMask, 'D', '.');
APPLICATION_ERROR_GOTO(-20004,'mld_m242,'||SrtKenmerkOmschr||','||FormatMask);
END IF;
END IF;
-- Zet de geconverteerde waarde terug.
:new.mld_kenmerkopdr_waarde := KenmerkOpdrWaarde;
ELSIF SrtKenmerkType = 'D'
THEN
-- DATUM
#ifdef MS_SQL
DECLARE isdat smallint;
isdat := WEB.IsDateString(@KenmerkOpdrWaarde,'DD-MM-YYYY')
if isdat = -1 GOTO lcontinue
if isdat = 0 BEGIN
FormatMask := 'DD-MM-YYYY';
APPLICATION_ERROR_GOTO(-20004,'mld_m242,'||SrtKenmerkOmschr||','||FormatMask);
END;
#endif
KenmerkOpdrWaarde := DATE_TO_CHAR(_TO_DATE2(KenmerkOpdrWaarde,'DD-MM-YY'),'DD-MM-YYYY');
-- Zet de geconverteerde waarde terug.
:new.mld_kenmerkopdr_waarde := KenmerkOpdrWaarde;
END IF;
END;
#ifdef MS_SQL
lcontinue:
#endif
END IF;
END;
/
/* Workflow triggers */
CREATE_TRIGGER(mld_t_mld_workflowstep_B_IU)
BEFORE INSERT OR UPDATE ON mld_workflowstep
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(mld_workflowstep_key,mld_s_mld_workflowstep_key);
END;
/
CREATE_TRIGGER(mld_t_mld_workflowrule_B_IU)
BEFORE INSERT OR UPDATE ON mld_workflowrule
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(mld_workflowrule_key,mld_s_mld_workflowrule_key);
END;
/
/* checks type of complain status change
* and generates correspondent notification if active
*/
CREATE_TRIGGER(mld_t_notificatie_melding)
AFTER INSERT OR UPDATE
ON mld_melding
FOR EACH ROW
BEGIN
DECLARE
soms fac_srtnotificatie.fac_srtnotificatie_oms%TYPE;
scode fac_srtnotificatie.fac_srtnotificatie_code%TYPE;
varstdmld mld_stdmelding.mld_stdmelding_omschrijving%TYPE;
vardisc ins_tab_discipline.ins_discipline_omschrijving%TYPE;
varsrtdisc ins_srtdiscipline.ins_srtdiscipline_prefix%TYPE;
lreceiver prs_perslid.prs_perslid_key%TYPE;
varplaats alg_v_plaatsaanduiding_all.alg_plaatsaanduiding%TYPE;
BEGIN
-- Ontvanger is voor alle events gelijk, de aanvrager.
lreceiver := :NEW.prs_perslid_key;
IF :OLD.mld_melding_datum IS NULL AND :NEW.mld_melding_datum IS NOT NULL
THEN
scode := 'MLDNEW';
ELSIF :OLD.mld_melding_afgewezen IS NULL AND :NEW.mld_melding_afgewezen IS NOT NULL
THEN
scode := 'MLDREJ';
ELSIF :OLD.mld_melding_ingezien IS NULL AND :NEW.mld_melding_ingezien IS NOT NULL
THEN
scode := 'MLDING';
ELSIF :OLD.mld_melding_geaccepteerd IS NULL AND :NEW.mld_melding_geaccepteerd IS NOT NULL
THEN
scode := 'MLDACP';
ELSIF :OLD.mld_melding_verwerkt IS NULL AND :NEW.mld_melding_verwerkt IS NOT NULL
THEN
scode := 'MLDVER';
ELSIF :OLD.mld_melding_afgemeld IS NULL AND :NEW.mld_melding_afgemeld IS NOT NULL
THEN
scode := 'MLDAFM';
ELSIF :OLD.mld_alg_onroerendgoed_keys <> :NEW.mld_alg_onroerendgoed_keys
OR :OLD.mld_melding_omschrijving <> :NEW.mld_melding_omschrijving
OR :OLD.mld_melding_opmerking <> :NEW.mld_melding_opmerking
OR (:OLD.mld_melding_opmerking IS NULL AND :NEW.mld_melding_opmerking IS NOT NULL)
OR :OLD.mld_melding_uitvoertijd <> :NEW.mld_melding_uitvoertijd
OR :OLD.mld_melding_ordernr <> :NEW.mld_melding_ordernr
OR :OLD.prs_kostenplaats_key <> :NEW.prs_kostenplaats_key
OR :OLD.mld_adres_key <> :NEW.mld_adres_key
THEN
-- alleen bovenstaande wijzigingen worden hiervoor relevant geacht
-- wordt dus niet gesignaleerd als oud of nieuw leeg was(!), behoudens opmerking
scode := 'MLDUPD';
END IF;
IF scode IS NOT NULL
THEN
BEGIN
SELECT sn.fac_srtnotificatie_oms
INTO soms
FROM fac_srtnotificatie sn
WHERE sn.fac_srtnotificatie_code = scode AND sn.fac_srtnotificatie_mode > 0;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- Nothing to do
RETURN;
END;
-- We support substitution of placeholders in the messages
-- ##DISC## = ins_discipline_omschrijving
-- ##STDMLD## = mld_stdmelding_omschrijving
-- ##KEY## = ins_srtdiscipline_prefix+key
-- ##PLAATS## = praatsaanduidig van plaats service
IF INSTR2(soms, '#') > 0
THEN
SELECT stdm.mld_stdmelding_omschrijving, d.ins_discipline_omschrijving, sd.ins_srtdiscipline_prefix
INTO varstdmld, vardisc, varsrtdisc
FROM mld_stdmelding stdm, ins_tab_discipline d, ins_srtdiscipline sd
WHERE d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
AND stdm.mld_ins_discipline_key = d.ins_discipline_key
AND stdm.mld_stdmelding_key = :NEW.mld_stdmelding_key;
soms :=
REPLACE (REPLACE (REPLACE (soms, '##DISC##', vardisc), '##STDMLD##', varstdmld),
'##KEY##',
varsrtdisc || TO_CHAR (:NEW.mld_melding_key)
);
IF INSTR2(soms, '#') > 0
THEN
SELECT NVL(alg_plaatsaanduiding, '')
INTO varplaats
FROM alg_v_plaatsaanduiding_all p
WHERE p.alg_onroerendgoed_keys = :new.mld_alg_onroerendgoed_keys;
soms := REPLACE(soms, '##PLAATS##', varplaats);
END IF;
END IF;
-- Stuur notificatie naar de aanvrager
fac.putnotificationsrt (:NEW.mld_melding_user_key, lreceiver, scode, :NEW.mld_melding_key, soms, NULL, NULL, NULL, NULL);
END IF;
END;
END;
/
/* Formatted on 2006/11/21 14:04 (Formatter Plus v4.8.5) */
CREATE_TRIGGER(mld_t_notificatie_opdr)
AFTER INSERT OR UPDATE
ON mld_opdr
FOR EACH ROW
BEGIN
DECLARE
soms fac_srtnotificatie.fac_srtnotificatie_oms%TYPE;
scode fac_srtnotificatie.fac_srtnotificatie_code%TYPE;
varstdmld mld_stdmelding.mld_stdmelding_omschrijving%TYPE;
vardisc ins_tab_discipline.ins_discipline_omschrijving%TYPE;
lafmelder prs_v_perslid_fullnames_all.prs_perslid_naam_full%TYPE;
varsrtdisc ins_srtdiscipline.ins_srtdiscipline_prefix%TYPE;
varspoed mld_melding.mld_melding_spoed%TYPE;
lreceiver prs_perslid.prs_perslid_key%TYPE;
luitvtype mld_v_uitvoerende.TYPE%TYPE;
lemail prs_bedrijf.prs_bedrijf_email%TYPE;
lphone prs_bedrijf.prs_bedrijf_telefoon2%TYPE;
BEGIN
lreceiver := :NEW.mld_uitvoerende_keys;
lemail := NULL;
lphone := NULL;
-- Opdracht wordt afgemeld
SELECT u.TYPE
INTO luitvtype
FROM mld_v_uitvoerende u
WHERE u.mld_uitvoerende_key = :NEW.mld_uitvoerende_keys;
IF :NEW.mld_statusopdr_key = 6 AND :OLD.mld_statusopdr_key <> 6
THEN
IF luitvtype = 'P' AND :NEW.mld_opdr_afgemeld_user <> :NEW.mld_uitvoerende_keys
THEN
-- afgemeld, maar niet door mezelf (ik hoef geen notificatie zei ooit iemand)
-- voor externe uitvoerenden (B) notificeren we niet
scode := 'ORDAFM';
END IF;
ELSIF :NEW.mld_statusopdr_key = 5 AND :OLD.mld_statusopdr_key <> 5
THEN
-- toegekend/uitgegeven
IF luitvtype = 'P' THEN
scode := 'ORDMLI';
ELSE
scode := 'ORDMLE';
lreceiver := NULL; -- maar een extern bedrijf
END IF;
ELSIF :NEW.mld_statusopdr_key = 4 AND :OLD.mld_statusopdr_key <> 4
THEN
-- gefiatteerd
scode := 'ORDACP';
ELSIF :NEW.mld_statusopdr_key = 1 AND :OLD.mld_statusopdr_key <> 1
THEN
-- afgewezen
scode := 'ORDREJ';
END IF;
IF scode IS NOT NULL
THEN
BEGIN
SELECT sn.fac_srtnotificatie_oms
INTO soms
FROM fac_srtnotificatie sn
WHERE sn.fac_srtnotificatie_code = scode AND sn.fac_srtnotificatie_mode > 0;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- Nothing to do
RETURN;
END;
-- We support substitution of placeholders in the messages
-- ##KEY## = ins_srtdiscipline_prefix+key+/+volgnr
-- ##NAAM## = volledige naam van de afmelder
-- ##DISC## = ins_discipline_omschrijving
-- ##STDMLD## = mld_stdmelding_omschrijving
-- ##DESC## = mld_opdr_omschrijving (tbv SMS)
-- ##SPOED## = 'SPOED' indien spoed, anders ''
IF INSTR2(soms, '#') > 0
THEN
SELECT prs_perslid_naam_full
INTO lafmelder
FROM prs_v_perslid_fullnames_all
WHERE prs_perslid_key = lreceiver;
SELECT stdm.mld_stdmelding_omschrijving, d.ins_discipline_omschrijving, sd.ins_srtdiscipline_prefix, m.mld_melding_spoed
INTO varstdmld, vardisc, varsrtdisc, varspoed
FROM mld_melding m, mld_stdmelding stdm, ins_tab_discipline d, ins_srtdiscipline sd
WHERE d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
AND stdm.mld_ins_discipline_key = d.ins_discipline_key
AND stdm.mld_stdmelding_key = m.mld_stdmelding_key
AND m.mld_melding_key = :NEW.mld_melding_key;
soms :=
REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (soms, '##NAAM##', lafmelder),
'##KEY##',
varsrtdisc
|| TO_CHAR (:NEW.mld_melding_key)
|| '/'
|| TO_CHAR (:NEW.mld_opdr_bedrijfopdr_volgnr)
),
'##DISC##',
vardisc
),
'##STDMLD##',
varstdmld
),
'##DESC##',
:NEW.mld_opdr_omschrijving
);
IF varspoed = 1
THEN
soms := REPLACE (soms, '##SPOED##', '(SPOED)');
ELSE
soms := REPLACE (soms, '##SPOED##', '');
END IF;
END IF;
IF lreceiver IS NULL THEN
-- Het gaat om een externe receiver
BEGIN
SELECT prs_bedrijf_email, prs_bedrijf_telefoon2
INTO lemail, lphone
FROM prs_bedrijf
WHERE prs_bedrijf_key=:new.mld_uitvoerende_keys;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
RETURN;
END;
END IF;
-- Stuur notificatie naar de uitvoerende (vooralsnog intern)
fac.putnotificationsrt (:NEW.mld_opdr_afgemeld_user, lreceiver, scode, :NEW.mld_opdr_key, soms, NULL, lemail, lphone, NULL);
END IF;
END;
END;
/
#endif // MLD