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

943 lines
34 KiB
Plaintext

#ifdef BES // 03-11-2000 PF
/*
* $Revision: 37 $
* $Modtime: 15-01-07 14:52 $
*/
#include "comsql.h"
/* PF: de >= ipv de = is tbv iets meer robuustheid, niets meer dan dat */
CREATE_TRIGGER(bes_t_bes_bestelling_B_IU)
BEFORE INSERT OR UPDATE ON bes_bestelling
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(bes_bestelling_key,bes_s_bes_bestelling_key);
IF NVL(:new.BES_BESTELLING_ITEM_CNT_ACPT,0) >= NVL(:new.BES_BESTELLING_ITEM_CNT,0) AND
:new.BES_BESTELLING_STATUS IN (2,3) AND :old.BES_BESTELLING_KEY IS NOT NULL THEN
:new.BES_BESTELLING_STATUS := 4;
END IF;
IF NVL(:new.BES_BESTELLING_ITEM_CNT_LEV,0) >= NVL(:new.BES_BESTELLING_ITEM_CNT,0) AND
:new.BES_BESTELLING_STATUS < 6 AND :old.BES_BESTELLING_KEY IS NOT NULL THEN
:new.BES_BESTELLING_AFGEMELD := SYSDATE;
:new.BES_BESTELLING_STATUS := 6;
END IF;
IF (:new.BES_BESTELLING_STATUS =4 and
(:old.BES_BESTELLING_STATUS IS NULL OR :old.BES_BESTELLING_STATUS < 4)) OR
(:new.BES_BESTELLING_FIAT_USER IS NOT NULL and
:old.BES_BESTELLING_FIAT_USER IS NULL) THEN
IF ( :new.BES_BESTELLING_STATUS =4 ) THEN
:new.BES_BESTELLING_GEACCEPTEERD := SYSDATE;
:new.BES_BESTELLING_ITEM_CNT_ACPT := :new.BES_BESTELLING_ITEM_CNT;
END IF;
ELSIF :new.BES_BESTELLING_DATUM is not null and
:old.BES_BESTELLING_DATUM is null THEN
:new.BES_BESTELLING_STATUS := 2;
:new.BES_BESTELLING_ITEM_CNT := 0;
ELSIF (:new.BES_BESTELLING_AFGEWEZEN is not null and
:old.BES_BESTELLING_AFGEWEZEN is null) OR
(:new.BES_BESTELLING_AFGEWEZEN is not null and
:old.BES_BESTELLING_AFGEWEZEN is not null and
:new.BES_BESTELLING_AFGEWEZEN <> :old.BES_BESTELLING_AFGEWEZEN) THEN
BEGIN
IF :old.BES_BESTELLING_DATUM is null THEN
:new.BES_BESTELLING_DATUM := SYSDATE;
END IF;
IF :new.BES_BESTELLING_OPMERKING is not null THEN
:new.BES_BESTELLING_STATUS := 1;
ELSE
APPLICATION_ERROR_GOTO(-20000, 'BES_NO_REJECTED_MESSAGE');
END IF;
END;
ELSIF :new.BES_BESTELLING_VERWERKT is not null and
:old.BES_BESTELLING_VERWERKT is null THEN :new.BES_BESTELLING_STATUS := 7;
ELSIF :new.BES_BESTELLING_DATUM is not null and
:old.BES_BESTELLING_DATUM is not null and
:old.BES_BESTELLING_DATUM <> :new.BES_BESTELLING_DATUM and
:old.BES_BESTELLING_STATUS = 1 THEN :new.BES_BESTELLING_STATUS := 2;
END IF;
-- gooi fiatverzoeknotificaties weg als gefiatteerd of afgewezen-> opnemen in bovenste deel
IF ( :NEW.bes_bestelling_fiat_user IS NOT NULL
AND :OLD.bes_bestelling_fiat_user IS NULL
)
OR ( :NEW.bes_bestelling_status = 1
AND :OLD.bes_bestelling_status <> 1
)
THEN
fac.clrnotifications ('BESAP1', :NEW.bes_bestelling_key);
END IF;
#ifdef MS_SQL
lerror:
#endif
END;
/
CREATE_TRIGGER(bes_t_bes_bestelling_item_B_IU)
BEFORE INSERT OR UPDATE ON bes_bestelling_item
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(bes_bestelling_item_key,bes_s_bes_bestelling_item_key);
IF :old.bes_bestelling_item_key is null THEN
UPDATE BES_BESTELLING SET BES_BESTELLING_ITEM_CNT = BES_BESTELLING_ITEM_CNT + 1
WHERE BES_BESTELLING_KEY = :new.BES_BESTELLING_KEY;
END IF;
END;
/
CREATE_TRIGGER(bes_t_bes_bestelopdr_B_IU)
BEFORE INSERT OR UPDATE
ON bes_bestelopdr
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(bes_bestelopdr_key,bes_s_bes_bestelopdr_key);
IF NVL (:NEW.bes_bestelopdr_item_cnt, 0) = NVL (:NEW.bes_bestelopdr_item_cnt_lev, 0)
AND NOT (:NEW.bes_bestelopdr_item_cnt = 0 AND :NEW.bes_bestelopdr_item_cnt_lev = 0)
AND :NEW.bes_bestelopdr_status < 6
AND :OLD.bes_bestelopdr_key IS NOT NULL
THEN
:NEW.bes_bestelopdr_leverdatum := SYSDATE;
:NEW.bes_bestelopdr_status := 6;
END IF;
IF :OLD.bes_bestelopdr_datum IS NULL
THEN
:NEW.bes_bestelopdr_datum := SYSDATE;
END IF;
IF :OLD.bes_bestelopdr_status IS NULL
THEN
:NEW.bes_bestelopdr_status := 2;
END IF;
END;
/
CREATE_TRIGGER(bes_t_notificatie_bestelling)
AFTER INSERT OR UPDATE
ON bes_bestelling
FOR EACH ROW
BEGIN
DECLARE
soms fac_srtnotificatie.fac_srtnotificatie_oms%TYPE;
scode fac_srtnotificatie.fac_srtnotificatie_code%TYPE;
lreceiver prs_perslid.prs_perslid_key%TYPE;
BEGIN
IF :NEW.bes_bestelling_status = 5 AND :OLD.bes_bestelling_status <> 5
THEN
scode := 'BESBES';
ELSIF :NEW.bes_bestelling_status = 6 AND :OLD.bes_bestelling_status <> 6
THEN
scode := 'BESOTV';
ELSIF :NEW.bes_bestelling_status = 1 AND :OLD.bes_bestelling_status <> 1
THEN
scode := 'BESREJ';
ELSIF :NEW.bes_bestelling_status = 3 AND :OLD.bes_bestelling_status <> 3
THEN
scode := 'BESFIT';
ELSIF :NEW.bes_bestelling_status = 4 AND :OLD.bes_bestelling_status <> 4
THEN
scode := 'BESACP';
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## = bes_bestelling_key
-- ##DATUM## = bes_bestelling_datum
IF INSTR2 (soms, '#') > 0
THEN
soms :=
REPLACE (REPLACE (soms,
'##KEY##',
NUMBER_TO_CHAR (:NEW.bes_bestelling_key)
),
'##DATUM##',
DATE_TO_CHAR (:NEW.bes_bestelling_datum, 'DD-MM-YY HH:MI')
);
END IF;
-- Stuur notificatie naar de aanvrager
fac.putnotificationsrt (:NEW.prs_perslid_key, :NEW.prs_perslid_key, scode, :NEW.bes_bestelling_key, soms, NULL, NULL, NULL, NULL);
-- Stuur notificatie naar de behandelaar indien afwijkend
IF :NEW.prs_perslid_key <> :NEW.bes_bestelling_owner_key
THEN
fac.putnotificationsrt (:NEW.prs_perslid_key, :NEW.prs_perslid_key, scode, :NEW.bes_bestelling_key, soms, NULL, NULL, NULL, NULL);
END IF;
END IF;
END;
#ifdef MS_SQL
lerror:
#endif
END;
/
CREATE_TRIGGER(bes_t_notificatie_bestelopdr)
AFTER INSERT OR UPDATE
ON bes_bestelopdr
FOR EACH ROW
DECLARE
soms fac_srtnotificatie.fac_srtnotificatie_oms%TYPE;
scode fac_srtnotificatie.fac_srtnotificatie_code%TYPE;
rfokey bes_bestelling.bes_bestelling_key%TYPE;
lreceiver prs_perslid.prs_perslid_key%TYPE;
lemail prs_bedrijf.prs_bedrijf_email%TYPE;
lphone prs_bedrijf.prs_bedrijf_telefoon2%TYPE;
lbedrijfnaam prs_bedrijf.prs_bedrijf_naam%TYPE;
BEGIN
-- Nu sturen we naar de leverancier, vooralsnog
IF :NEW.bes_bestelopdr_status = 4 AND :NEW.bes_bestelopdr_status <> 4
THEN
scode := 'BES2BE';
ELSIF :NEW.bes_bestelopdr_status = 1 AND :NEW.bes_bestelopdr_status <> 1
THEN
scode := 'BES2RE';
ELSIF :NEW.bes_bestelopdr_status = 6 AND :NEW.bes_bestelopdr_status <> 6
THEN
scode := 'BES2AF';
ELSIF :NEW.bes_bestelopdr_status = 2 AND :NEW.bes_bestelopdr_status <> 2
THEN
scode := 'BES2NE';
ELSIF :NEW.bes_bestelopdr_status = 7 AND :NEW.bes_bestelopdr_status <> 7
THEN
scode := 'BES2VE';
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;
BEGIN
SELECT prs_bedrijf_email, prs_bedrijf_telefoon2, prs_bedrijf_naam
INTO lemail, lphone, lbedrijfnaam
FROM prs_bedrijf
WHERE prs_bedrijf_key=:NEW.prs_bedrijf_key;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
RETURN;
END;
IF instr2 (soms, '#') > 0
THEN
soms :=
REPLACE (REPLACE (soms, '##KEY##', NUMBER_TO_CHAR(:NEW.bes_bestelopdr_key)),
'##NAAM##', lbedrijfnaam
);
END IF;
fac.putnotificationsrt(NULL, NULL, scode, :NEW.bes_bestelopdr_key, soms, NULL, lemail, lphone, NULL);
END IF;
END;
/
CREATE_TRIGGER(bes_t_bes_bestelopdr_item_B_IU)
BEFORE INSERT OR UPDATE ON BES_BESTELOPDR_ITEM FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(bes_bestelopdr_item_key,bes_s_bes_bestelopdr_item_key);
IF :old.bes_bestelopdr_item_key is null THEN
UPDATE BES_BESTELOPDR SET BES_BESTELOPDR_ITEM_CNT = BES_BESTELOPDR_ITEM_CNT + 1
WHERE BES_BESTELOPDR_KEY = :new.BES_BESTELOPDR_KEY;
END IF;
IF :new.BES_BESTELOPDR_ITEM_STATUS = 7 AND :old.BES_BESTELOPDR_ITEM_STATUS <> 7 AND :new.BES_BESTELOPDR_ITEM_VERWERKT IS NULL THEN
:new.BES_BESTELOPDR_ITEM_VERWERKT := SYSDATE;
END IF;
END;
/
CREATE_TRIGGER(BES_T_BES_BESTELOPDR_ITEM_B_U)
BEFORE UPDATE ON BES_BESTELOPDR_ITEM FOR EACH ROW
BEGIN
IF NVL(:new.bes_bestelopdr_item_aantalontv,0) = NVL(:new.bes_bestelopdr_item_aantal,0)
AND NVL(:old.bes_bestelopdr_item_aantalontv,0) <> NVL(:old.bes_bestelopdr_item_aantal,0)
THEN
UPDATE BES_BESTELOPDR SET BES_BESTELOPDR_ITEM_CNT_LEV = BES_BESTELOPDR_ITEM_CNT_LEV + 1
WHERE BES_BESTELOPDR_KEY = :new.BES_BESTELOPDR_KEY;
END IF;
END;
/
#ifndef MS_SQL
/*
CREATE_TRIGGER(BES_T_BES_BESTELOPDR_ITEM_A_UT)
after update on BES_BESTELOPDR_ITEM
begin
declare bokey number(10);
CURSOR query IS
select bkey from
(select
b1.bes_bestelopdr_key bkey,
sum(bes_bestelopdr_item_aantal) request,
sum(nvl(bes_bestelopdr_item_aantalontv,0)) deliver
from bes_bestelopdr_item b1,
(select bes_bestelopdr_key
from bes_bestelopdr_item b
where b.bes_bestelopdr_key in
(select bes_bestelopdr_key from bes_bestelopdrstate where bes_bestelopdrstate = 1)) b2
where b1.bes_bestelopdr_key = b2.bes_bestelopdr_key
group by b1.bes_bestelopdr_key) where deliver >= request;
BEGIN
bokey := 0;
FOR besitem_rec IN query() LOOP
update bes_bestelopdr set bes_bestelopdr_leverdatum = sysdate, bes_bestelopdr_status = 6
where bes_bestelopdr_key = besitem_rec.bkey;
bokey := besitem_rec.bkey;
END LOOP;
if bokey <> 0 then
DELETE FROM bes_bestelopdrstate;
end if;
END;
END;
/
*/
#endif
CREATE_TRIGGER(BES_T_BES_BESTELLING_ITEM_B_U)
BEFORE UPDATE
ON bes_bestelling_item
FOR EACH ROW
BEGIN
IF :NEW.bes_bestelling_i_gcpt_us_key IS NOT NULL AND :OLD.bes_bestelling_i_gcpt_us_key IS NULL
THEN
:NEW.bes_bestelling_item_status := 4;
UPDATE bes_bestelling
SET bes_bestelling_item_cnt_acpt = bes_bestelling_item_cnt_acpt + 1
WHERE bes_bestelling_key = :NEW.bes_bestelling_key;
END IF;
IF :NEW.bes_bestelopdr_item_key IS NOT NULL AND :OLD.bes_bestelopdr_item_key IS NULL
THEN
:NEW.bes_bestelling_item_status := 5;
UPDATE bes_bestelling
SET bes_bestelling_status = 5
WHERE bes_bestelling_key = :NEW.bes_bestelling_key;
END IF;
IF NVL (:NEW.bes_bestelling_item_aantalontv, 0) = NVL (:NEW.bes_bestelling_item_aantal, 0)
AND NVL (:OLD.bes_bestelling_item_aantalontv, 0) <> NVL (:OLD.bes_bestelling_item_aantal, 0)
THEN
:NEW.bes_bestelling_item_status := 6;
UPDATE bes_bestelling
SET bes_bestelling_item_cnt_lev = bes_bestelling_item_cnt_lev + 1
WHERE bes_bestelling_key = :NEW.bes_bestelling_key;
END IF;
END;
/
#ifndef MS_SQL
/*
CREATE_TRIGGER(BES_T_BES_BESTELLING_ITEM_A_UT)
after update on BES_BESTELLING_ITEM
begin
declare bkey number(10); bstate number(1);
CURSOR query IS
select b_key, bstate, request, deliver from
(select
b2.bes_bestellingstate bstate, b1.bes_bestelling_key b_key,
count(distinct b1.bes_bestelling_item_key) request,
count(distinct b2.bes_bestelling_item_key) deliver
from bes_bestelling_item b1,
(select b.bes_bestelling_key, bes_bestellingstate, bes_bestelling_item_key
from bes_bestelling_item b, bes_bestellingstate bs
where bs.BES_BESTELLING_KEY = b.BES_BESTELLING_KEY
and b.bes_bestelling_item_status = 6 and
bes_bestellingstate = 1 ) b2
where b1.bes_bestelling_key = b2.bes_bestelling_key
group by b2.bes_bestellingstate, b1.bes_bestelling_key)
where deliver = request
union all
select b_key, bstate, request, deliver from
(select
b2.bes_bestellingstate bstate, b1.bes_bestelling_key b_key,
count(distinct b1.bes_bestelling_item_key) request,
count(distinct b2.bes_bestelling_item_key) deliver
from bes_bestelling_item b1,
(select b.bes_bestelling_key, bes_bestellingstate, bes_bestelling_item_key
from bes_bestelling_item b, bes_bestellingstate bs
where bs.BES_BESTELLING_KEY = b.BES_BESTELLING_KEY
and b.bes_bestelling_item_status = 4 and
bes_bestellingstate = 2 ) b2
where b1.bes_bestelling_key = b2.bes_bestelling_key
group by b2.bes_bestellingstate, b1.bes_bestelling_key)
where deliver = request;
BEGIN
bkey := 0;
FOR besitem_rec IN query() LOOP
if besitem_rec.bstate = 1 then
update bes_bestelling set bes_bestelling_afgemeld = sysdate,
bes_bestelling_status = 6
where bes_bestelling_key = besitem_rec.b_key;
bkey := besitem_rec.b_key;
end if;
if besitem_rec.bstate = 2 then
update bes_bestelling set bes_bestelling_geaccepteerd = sysdate,
bes_bestelling_status = 4
where bes_bestelling_key = besitem_rec.b_key;
bkey := besitem_rec.b_key;
end if;
END LOOP;
if bkey <> 0 then
DELETE FROM bes_bestellingstate;
end if;
END;
END;
/
*/
#endif
CREATE_TRIGGER(BES_T_BES_DISC_PARAMS_B_IU)
BEFORE INSERT OR UPDATE ON bes_disc_params
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(bes_disc_params_key, bes_s_bes_disc_params_key);
END;
/
#ifndef MS_SQL
-- SQL Server does not like this because there is no primary key in bes_impcatalogus
CREATE_TRIGGER(bes_t_bes_impcatalogus_b_iu)
BEFORE INSERT OR UPDATE ON bes_impcatalogus
FOR EACH ROW
BEGIN
UPDATE_UPPER(bes_impcatalogus_id, bes_impcatalogus_id, bes_impcatalogus);
UPDATE_UPPER(ins_srtdeel_nr, ins_srtdeel_nr, bes_impcatalogus);
END;
/
#endif
// new
CREATE_TRIGGER(bes_t_bes_refsrtkenmerk_b_iu)
BEFORE INSERT OR UPDATE
ON bes_refsrtkenmerk
FOR EACH ROW
DECLARE
objecttype user_objects.object_type%TYPE;
BEGIN
UPDATE_PRIMARY_KEY(bes_refsrtkenmerk_key, bes_s_bes_refsrtkenmerk_key);
UPDATE_UPPER(bes_refsrtkenmerk_omschrijving, bes_refsrtkenmerk_upper,bes_refsrtkenmerk);
UPDATE_AANMAAKDATUM(bes_refsrtkenmerk, bes_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.bes_refsrtkenmerk_objectnaam;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
objecttype := NULL;
END;
IF objecttype IS NULL
THEN
raise_application_error (-20000, 'bes_m244');
ELSIF objecttype = 'TABLE' OR objecttype = 'VIEW'
THEN
DECLARE
dummy VARCHAR2 (30);
BEGIN
SELECT column_name
INTO dummy
FROM user_tab_columns
WHERE table_name = :NEW.bes_refsrtkenmerk_objectnaam
AND column_name = :NEW.bes_refsrtkenmerk_kolomnaam
AND data_type = 'NUMBER';
EXCEPTION
WHEN NO_DATA_FOUND
THEN
raise_application_error (-20000, 'bes_m245');
END;
DECLARE
dummy VARCHAR2 (30);
BEGIN
SELECT column_name
INTO dummy
FROM user_tab_columns
WHERE table_name = :NEW.bes_refsrtkenmerk_objectnaam
AND column_name = :NEW.bes_refsrtkenmerk_kolomtxt
AND data_type LIKE '%CHAR%';
EXCEPTION
WHEN NO_DATA_FOUND
THEN
raise_application_error (-20000, 'bes_m246');
END;
ELSIF objecttype <> 'SYNONYM'
THEN
raise_application_error (-20000, 'bes_m244');
END IF;
END;
/
CREATE_TRIGGER(bes_t_bes_srtkenmerk_b_iu)
BEFORE INSERT OR UPDATE
ON bes_srtkenmerk
FOR EACH ROW
BEGIN
IF :NEW.bes_srtkenmerk_key IS NULL
THEN
SELECT bes_s_bes_srtkenmerk_key.NEXTVAL
INTO :NEW.bes_srtkenmerk_key
FROM DUAL;
END IF;
:NEW.bes_srtkenmerk_upper := UPPER (:NEW.bes_srtkenmerk_omschrijving);
BEGIN
IF :NEW.bes_srtkenmerk_aanmaak IS NULL
THEN
:NEW.bes_srtkenmerk_aanmaak := SYSDATE;
END IF;
END;
IF (:NEW.bes_srtkenmerk_kenmerktype = 'C' OR :NEW.bes_srtkenmerk_kenmerktype = 'N')
AND :NEW.bes_srtkenmerk_lengte IS NULL
THEN
raise_application_error (-20000, 'bes_C_bes_SRTKENMERK_LENGTE');
END IF;
IF :NEW.bes_srtkenmerk_kenmerktype = 'N' AND :OLD.bes_srtkenmerk_key IS NOT NULL
THEN
IF :OLD.bes_srtkenmerk_nmin <> :NEW.bes_srtkenmerk_nmin
OR (:OLD.bes_srtkenmerk_nmin IS NULL AND :NEW.bes_srtkenmerk_nmin IS NOT NULL)
THEN
DECLARE
dummy CHAR;
BEGIN
SELECT 'X'
INTO dummy
FROM (SELECT 'X'
FROM bes_kenmerkbestell
WHERE fac.safe_to_number (bes_kenmerkbestell_waarde) < :NEW.bes_srtkenmerk_nmin
AND bes_kenmerk_key IN (SELECT bes_kenmerk_key
FROM bes_kenmerk
WHERE bes_srtkenmerk_key = :OLD.bes_srtkenmerk_key)
UNION ALL
SELECT 'X'
FROM bes_kenmerkbesteli
WHERE fac.safe_to_number (bes_kenmerkbesteli_waarde) < :NEW.bes_srtkenmerk_nmin
AND bes_kenmerk_key IN (SELECT bes_kenmerk_key
FROM bes_kenmerk
WHERE bes_srtkenmerk_key = :OLD.bes_srtkenmerk_key));
raise_application_error (-20000, 'bes_C_bes_SRTKENMERK_MIN');
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
WHEN TOO_MANY_ROWS
THEN
raise_application_error (-20000, 'bes_C_bes_SRTKENMERK_MIN');
END;
END IF;
IF :OLD.bes_srtkenmerk_nmax <> :NEW.bes_srtkenmerk_nmax
OR (:OLD.bes_srtkenmerk_nmax IS NULL AND :NEW.bes_srtkenmerk_nmax IS NOT NULL)
THEN
DECLARE
dummy CHAR;
BEGIN
SELECT 'X'
INTO dummy
FROM (SELECT 'X'
FROM bes_kenmerkbestell
WHERE fac.safe_to_number (bes_kenmerkbestell_waarde) > :NEW.bes_srtkenmerk_nmax
AND bes_kenmerk_key IN (SELECT bes_kenmerk_key
FROM bes_kenmerk
WHERE bes_srtkenmerk_key = :OLD.bes_srtkenmerk_key)
UNION ALL
SELECT 'X'
FROM bes_kenmerkbesteli
WHERE fac.safe_to_number (bes_kenmerkbesteli_waarde) > :NEW.bes_srtkenmerk_nmax
AND bes_kenmerk_key IN (SELECT bes_kenmerk_key
FROM bes_kenmerk
WHERE bes_srtkenmerk_key = :OLD.bes_srtkenmerk_key));
raise_application_error (-20000, 'bes_C_bes_SRTKENMERK_MAX');
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
WHEN TOO_MANY_ROWS
THEN
raise_application_error (-20000, 'bes_C_bes_SRTKENMERK_MAX');
END;
END IF;
END IF;
END;
/
CREATE_TRIGGER(bes_t_bes_srtkenmerk_b_d)
BEFORE DELETE ON bes_srtkenmerk
FOR EACH ROW
BEGIN
IF :old.bes_srtkenmerk_systeem = 1
THEN
raise_application_error(-20003, 'bes_C_bes_SRTKENMERK_SYSTEEM');
END IF;
END;
/
CREATE_TRIGGER(bes_t_bes_kenmerk_b_iu)
BEFORE INSERT OR UPDATE
ON bes_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.bes_kenmerk_key IS NOT NULL AND :NEW.bes_kenmerk_verplicht IS NOT NULL
AND :OLD.bes_kenmerk_verplicht IS NULL
THEN
DECLARE
dummy CHAR;
BEGIN
SELECT 'X'
INTO dummy
FROM bes_kenmerkbestell
WHERE bes_kenmerk_key = :NEW.bes_kenmerk_key;
raise_application_error (-20004, 'bes_C_bes_KENMERK_VERPLICHT0');
SELECT 'X'
INTO dummy
FROM bes_kenmerkbesteli
WHERE bes_kenmerk_key = :NEW.bes_kenmerk_key;
raise_application_error (-20004, 'bes_C_bes_KENMERK_VERPLICHT0');
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
WHEN TOO_MANY_ROWS
THEN
raise_application_error (-20004, 'bes_C_bes_KENMERK_VERPLICHT0');
END;
END IF;
UPDATE_PRIMARY_KEY(bes_kenmerk_key, bes_s_bes_kenmerk_key);
UPDATE_AANMAAKDATUM(bes_kenmerk, bes_kenmerk_aanmaak);
END;
/
CREATE_TRIGGER(bes_t_bes_kenmerkbestell_b_iu)
BEFORE INSERT OR UPDATE
ON bes_kenmerkbestell
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(bes_kenmerkbestell_key, bes_s_bes_kenmerkbestell_key);
-- Controleer eerst of de ingevulde waarde goed is.
--
IF :NEW.bes_kenmerkbestell_waarde <> :OLD.bes_kenmerkbestell_waarde
OR :OLD.bes_kenmerkbestell_waarde IS NULL
OR :NEW.bes_kenmerkbestell_waarde IS NULL
THEN
DECLARE
srtkenmerkomschr bes_srtkenmerk.bes_srtkenmerk_omschrijving%TYPE;
srtkenmerktype bes_srtkenmerk.bes_srtkenmerk_kenmerktype%TYPE;
srtkenmerklengte bes_srtkenmerk.bes_srtkenmerk_lengte%TYPE;
srtkenmerkdec bes_srtkenmerk.bes_srtkenmerk_dec%TYPE;
srtkenmerknmin bes_srtkenmerk.bes_srtkenmerk_nmin%TYPE;
srtkenmerknmax bes_srtkenmerk.bes_srtkenmerk_nmax%TYPE;
kenmerkverplicht bes_kenmerk.bes_kenmerk_verplicht%TYPE;
refsrtkenmerkkey NUMBER (10);
numberwaarde NUMBER (15, 5);
formatmask VARCHAR2 (60);
kenmerkbestellingwaarde bes_kenmerkbestell.bes_kenmerkbestell_waarde%TYPE;
BEGIN
kenmerkbestellingwaarde := :NEW.bes_kenmerkbestell_waarde;
--
SELECT bes_sk.bes_srtkenmerk_omschrijving, bes_sk.bes_srtkenmerk_kenmerktype, bes_sk.bes_srtkenmerk_lengte,
bes_sk.bes_srtkenmerk_dec, bes_sk.bes_srtkenmerk_nmin, bes_sk.bes_srtkenmerk_nmax,
bes_sk.bes_refsrtkenmerk_key, bes_k.bes_kenmerk_verplicht
INTO srtkenmerkomschr, srtkenmerktype, srtkenmerklengte,
srtkenmerkdec, srtkenmerknmin, srtkenmerknmax,
refsrtkenmerkkey, kenmerkverplicht
FROM bes_srtkenmerk bes_sk, bes_kenmerk bes_k
WHERE bes_sk.bes_srtkenmerk_key = bes_k.bes_srtkenmerk_key AND bes_k.bes_kenmerk_key = :NEW.bes_kenmerk_key;
--
-- Controleer eerst of het verplichte veld ingevuld is.
--
IF kenmerkverplicht IS NOT NULL AND kenmerkbestellingwaarde IS NULL
THEN
raise_application_error (-20004, 'bes_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 (kenmerkbestellingwaarde) > srtkenmerklengte
THEN
raise_application_error (-20004, 'bes_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(@kenmerkbestellingWaarde)
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,'bes_m242,'||SrtKenmerkOmschr||','||FormatMask);
END;
#endif
numberwaarde := TO_NUMBER (kenmerkbestellingwaarde);
#ifndef MS_SQL
EXCEPTION
WHEN OTHERS
THEN
formatmask := REPLACE (formatmask, '9', '#');
formatmask := REPLACE (formatmask, '0', '#');
formatmask := REPLACE (formatmask, 'D', '.');
raise_application_error (-20004, 'bes_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
raise_application_error (-20004,
'bes_m243,'
|| srtkenmerkomschr
|| ','
|| TO_CHAR (srtkenmerknmin)
|| ','
|| TO_CHAR (srtkenmerknmax)
);
ELSE
-- Controleer of de waarde aan het formaat voldoet.
kenmerkbestellingwaarde := LTRIM (NUMBER_TO_CHAR (numberwaarde, formatmask));
IF INSTR2 (kenmerkbestellingwaarde, '#') <> 0
THEN
formatmask := REPLACE (formatmask, '9', '#');
formatmask := REPLACE (formatmask, '0', '#');
formatmask := REPLACE (formatmask, 'D', '.');
raise_application_error (-20004, 'bes_m242,' || srtkenmerkomschr || ',' || formatmask);
END IF;
END IF;
-- Zet de geconverteerde waarde terug.
:NEW.bes_kenmerkbestell_waarde := kenmerkbestellingwaarde;
ELSIF srtkenmerktype = 'D'
THEN
-- DATUM
#ifdef MS_SQL
DECLARE isdat smallint;
isdat := WEB.IsDateString(@kenmerkbestellingWaarde,'DD-MM-YYYY')
if isdat = -1 GOTO lcontinue
if isdat = 0 BEGIN
FormatMask := 'DD-MM-YYYY';
APPLICATION_ERROR_GOTO(-20004,'bes_m242,'||SrtKenmerkOmschr||','||FormatMask);
END;
#endif
kenmerkbestellingwaarde := DATE_TO_CHAR(_TO_DATE2(kenmerkbestellingwaarde, 'DD-MM-YY'), 'DD-MM-YYYY');
-- Zet de geconverteerde waarde terug.
:NEW.bes_kenmerkbestell_waarde := kenmerkbestellingwaarde;
END IF;
END;
#ifdef MS_SQL
lcontinue:
#endif
END IF;
END;
/
CREATE_TRIGGER(bes_t_bes_kenmerkbesteli_b_iu)
BEFORE INSERT OR UPDATE
ON bes_kenmerkbesteli
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(bes_kenmerkbesteli_key, bes_s_bes_kenmerkbesteli_key);
-- Controleer eerst of de ingevulde waarde goed is.
--
IF :NEW.bes_kenmerkbesteli_waarde <> :OLD.bes_kenmerkbesteli_waarde
OR :OLD.bes_kenmerkbesteli_waarde IS NULL
OR :NEW.bes_kenmerkbesteli_waarde IS NULL
THEN
DECLARE
srtkenmerkomschr bes_srtkenmerk.bes_srtkenmerk_omschrijving%TYPE;
srtkenmerktype bes_srtkenmerk.bes_srtkenmerk_kenmerktype%TYPE;
srtkenmerklengte bes_srtkenmerk.bes_srtkenmerk_lengte%TYPE;
srtkenmerkdec bes_srtkenmerk.bes_srtkenmerk_dec%TYPE;
srtkenmerknmin bes_srtkenmerk.bes_srtkenmerk_nmin%TYPE;
srtkenmerknmax bes_srtkenmerk.bes_srtkenmerk_nmax%TYPE;
kenmerkverplicht bes_kenmerk.bes_kenmerk_verplicht%TYPE;
refsrtkenmerkkey NUMBER (10);
numberwaarde NUMBER (15, 5);
formatmask VARCHAR2 (60);
kenmerkbestelitemwaarde bes_kenmerkbesteli.bes_kenmerkbesteli_waarde%TYPE;
BEGIN
kenmerkbestelitemwaarde := :NEW.bes_kenmerkbesteli_waarde;
--
SELECT bes_sk.bes_srtkenmerk_omschrijving, bes_sk.bes_srtkenmerk_kenmerktype, bes_sk.bes_srtkenmerk_lengte,
bes_sk.bes_srtkenmerk_dec, bes_sk.bes_srtkenmerk_nmin, bes_sk.bes_srtkenmerk_nmax,
bes_sk.bes_refsrtkenmerk_key, bes_k.bes_kenmerk_verplicht
INTO srtkenmerkomschr, srtkenmerktype, srtkenmerklengte,
srtkenmerkdec, srtkenmerknmin, srtkenmerknmax,
refsrtkenmerkkey, kenmerkverplicht
FROM bes_srtkenmerk bes_sk, bes_kenmerk bes_k
WHERE bes_sk.bes_srtkenmerk_key = bes_k.bes_srtkenmerk_key AND bes_k.bes_kenmerk_key = :NEW.bes_kenmerk_key;
--
-- Controleer eerst of het verplichte veld ingevuld is.
--
IF kenmerkverplicht IS NOT NULL AND kenmerkbestelitemwaarde IS NULL
THEN
raise_application_error (-20004, 'bes_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 (kenmerkbestelitemwaarde) > srtkenmerklengte
THEN
raise_application_error (-20004, 'bes_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(@kenmerkbestelitemwaarde)
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,'bes_m242,'||SrtKenmerkOmschr||','||FormatMask);
END;
#endif
numberwaarde := TO_NUMBER (kenmerkbestelitemwaarde);
#ifndef MS_SQL
EXCEPTION
WHEN OTHERS
THEN
formatmask := REPLACE (formatmask, '9', '#');
formatmask := REPLACE (formatmask, '0', '#');
formatmask := REPLACE (formatmask, 'D', '.');
raise_application_error (-20004, 'bes_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
raise_application_error (-20004,
'bes_m243,'
|| srtkenmerkomschr
|| ','
|| TO_CHAR (srtkenmerknmin)
|| ','
|| TO_CHAR (srtkenmerknmax)
);
ELSE
-- Controleer of de waarde aan het formaat voldoet.
kenmerkbestelitemwaarde := LTRIM (NUMBER_TO_CHAR (numberwaarde, formatmask));
IF INSTR2 (kenmerkbestelitemwaarde, '#') <> 0
THEN
formatmask := REPLACE (formatmask, '9', '#');
formatmask := REPLACE (formatmask, '0', '#');
formatmask := REPLACE (formatmask, 'D', '.');
raise_application_error (-20004, 'bes_m242,' || srtkenmerkomschr || ',' || formatmask);
END IF;
END IF;
-- Zet de geconverteerde waarde terug.
:NEW.bes_kenmerkbesteli_waarde := kenmerkbestelitemwaarde;
ELSIF srtkenmerktype = 'D'
THEN
-- DATUM
#ifdef MS_SQL
DECLARE isdat smallint;
isdat := WEB.IsDateString(@kenmerkbestelitemwaarde,'DD-MM-YYYY')
if isdat = -1 GOTO lcontinue
if isdat = 0 BEGIN
FormatMask := 'DD-MM-YYYY';
APPLICATION_ERROR_GOTO(-20004,'bes_m242,'||SrtKenmerkOmschr||','||FormatMask);
END;
#endif
kenmerkbestelitemwaarde := DATE_TO_CHAR(_TO_DATE2(kenmerkbestelitemwaarde, 'DD-MM-YY'), 'DD-MM-YYYY');
-- Zet de geconverteerde waarde terug.
:NEW.bes_kenmerkbesteli_waarde := kenmerkbestelitemwaarde;
END IF;
END;
#ifdef MS_SQL
lcontinue:
#endif
END IF;
END;
/
#endif // BES