#ifdef  BES // 03-11-2000 PF
/*  BES_TRI.SRC
 *  $Revision$
 *  $Id$
 */

CREATE_TRIGGER(bes_t_bes_srtgroep_B_IU)
BEFORE INSERT OR UPDATE ON bes_srtgroep
FOR EACH ROW
BEGIN
    UPDATE_PRIMARY_KEY(bes_srtgroep_key,bes_s_bes_srtgroep_key);
    SET_VERWIJDER_CHILDREN(bes_srtdeel, bes_srtgroep_key, bes_srtgroep_verwijder,
        bes_srtdeel_verwijder,bes_srtgroep);
END;
/

CREATE_TRIGGER(bes_t_bes_srtdeel_B_IU)
BEFORE INSERT OR UPDATE ON bes_srtdeel
FOR EACH ROW
BEGIN
    UPDATE_PRIMARY_KEY(bes_srtdeel_key,bes_s_bes_srtdeel_key);
 END;
/

/*
 *  Wat info:
 *  Oorspronkelijk was er een complex mechanisme met redundante info met betrekking
 *  tot de status van bestelling en bestelopdracht
 *  - per regel wordt bijgehouden hoeveel stuks gevraagd en hoeveel geleverd
 *  - per bestelling/opdracht werd bijgehouden hoeveel regel gevraagd en geleverd
 *  - mutaties daarvan werden met triggers conistent gehouden
 *
 * Dit is vervallen. Elke trigger bemoeit zich alleen met zichzelf, en er zijn
 * een tweetal functies bes.updatebestellingstatus en bes.updatebestelopdrstatus
 * die desgevraagd tellen wat de stand is en daarop zonodig de parent aanpassen
 * Daarvan wordt dan ook tracking bijgehouden.
 */
CREATE_TRIGGER(bes_t_bes_bestelling_B_I)
BEFORE INSERT ON bes_bestelling
FOR EACH ROW
BEGIN
   UPDATE_PRIMARY_KEY(bes_bestelling_key,bes_s_bes_bestelling_key);
END;
/

CREATE_TRIGGER(bes_t_bes_bestelling_B_IU)
BEFORE INSERT OR UPDATE ON bes_bestelling
FOR EACH ROW
BEGIN
   IF  :old.bes_bestelling_status IS NULL
   THEN
     -- weet niet of dit (nog)nodig is, om de status op 2 te zetten
     :NEW.bes_bestelling_status := 2;
     --fac.trackaction ('BESAP2', :new.bes_bestelling_key, NULL , NULL, NULL);
   END IF;
   -- gooi fiatverzoeknotificaties weg als gefiatteerd of afgewezen-> opnemen in bovenste deel
   IF (:new.bes_bestelling_status = 3 AND :old.bes_bestelling_status <> 3)
      OR (:new.bes_bestelling_status = 1 AND :old.bes_bestelling_status <> 1)
   THEN
      fac.clrnotifications ('BESAP1', :new.bes_bestelling_key);
   END IF;

   -- Beoordeling van de bestelling
   IF     (:new.bes_bestelling_satisfaction IS NOT NULL
      AND (:old.bes_bestelling_satisfaction IS NULL OR :old.bes_bestelling_satisfaction <> :new.bes_bestelling_satisfaction))
   THEN
      fac.trackaction('#BESLIK', :old.bes_bestelling_key, NULL , SYSDATE, REPLACE(lcl.l('lcl_faclike_changed'), '{0}', :new.bes_bestelling_satisfaction));
   END IF;
END;
/

CREATE_TRIGGER(bes_t_bes_bestelling_a_d)
   AFTER DELETE
   ON bes_bestelling
   FOR EACH ROW
BEGIN
   -- Alle BES% weggooien. XML generatie zou er toch op falen
   fac.clrnotifications ('BES%', :old.bes_bestelling_key);
END;
/

CREATE_TRIGGER(bes_t_bes_bestelling_item_B_I)
   BEFORE INSERT
   ON bes_bestelling_item
   FOR EACH ROW
BEGIN
   UPDATE_PRIMARY_KEY(bes_bestelling_item_key,bes_s_bes_bestelling_item_key);
END;
/

CREATE_TRIGGER(bes_t_bes_bestelopdr_B_I)
   BEFORE INSERT
   ON bes_bestelopdr
   FOR EACH ROW
BEGIN
   UPDATE_PRIMARY_KEY(bes_bestelopdr_key,bes_s_bes_bestelopdr_key);
END;
/

CREATE_TRIGGER(bes_t_bes_bestelopdr_B_IU)
   BEFORE INSERT OR UPDATE
   ON bes_bestelopdr
   FOR EACH ROW
BEGIN
   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_bes_bestelopdr_item_B_I)
   BEFORE INSERT
   ON bes_bestelopdr_item
   FOR EACH ROW
BEGIN
   UPDATE_PRIMARY_KEY(bes_bestelopdr_item_key,bes_s_bes_bestelopdr_item_key);
END;
/

CREATE_TRIGGER(bes_t_bes_bestellevr_B_I)
   BEFORE INSERT
   ON bes_bestellevr
   FOR EACH ROW
BEGIN
   UPDATE_PRIMARY_KEY(bes_bestellevr_key,bes_s_bes_bestellevr_key);
END;
/

CREATE_TRIGGER(bes_t_bes_bestellevr_item_B_I)
   BEFORE INSERT
   ON bes_bestellevr_item
   FOR EACH ROW
BEGIN
   UPDATE_PRIMARY_KEY(bes_bestellevr_item_key,bes_s_bes_bestellevr_item_key);
END;
/

CREATE_TRIGGER(bes_t_bes_bestelopdr_item_b_u)
   BEFORE UPDATE
   ON bes_bestelopdr_item
   FOR EACH ROW
BEGIN
  -- Bewaak het aantal geleverde regels
  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
     -- Deze opdrachtregel is geleverd
     :NEW.bes_bestelopdr_item_status := 6;
     -- Maar daarmee ook de corresponderende aanvraagregel(s)
     -- Merk op: het overbodige bes_bestelling_item_aantalontv wordt in de ASP bijgehouden
      UPDATE bes_bestelling_item
         SET bes_bestelling_item_status = 6
       WHERE bes_bestelopdr_item_key = :new.bes_bestelopdr_item_key;
  END IF;
END;
/

CREATE_TRIGGER(bes_t_bes_bestelling_item_b_u)
   BEFORE UPDATE
   ON bes_bestelling_item
   FOR EACH ROW
BEGIN
   IF :NEW.bes_bestelopdr_item_key IS NOT NULL AND :OLD.bes_bestelopdr_item_key IS NULL
   THEN
      -- deze aanvraag is nu in een opdracht opgenomen
      :NEW.bes_bestelling_item_status := 5;
      -- Daarmee krijgt de gehele aanvraag de status 5 (als dat al niet zo was)
      bes.setbestellingstatus(:new.bes_bestelling_key, 5, NULL);
   END IF;
   -- Merk op: bijna altijd zal de status al wel op 6 gezet zijn door bes_t_bes_bestelopdr_item_b_u
   -- zie FSN#19735
   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
      -- deze hele regel is nu geleverd
      :NEW.bes_bestelling_item_status := 6;
   END IF;
END;
/


AUDIT_BEGIN(bes_disc_params)
AUDIT_VALUE(bes_disc_params, bes_disc_params_bestellimiet)
AUDIT_VALUE(bes_disc_params, bes_disc_params_bestellimiet2)
AUDIT_VALUE(bes_disc_params, bes_disc_params_bestellimiet3)
AUDIT_VALUE(bes_disc_params, bes_disc_params_bestellimiet4)
AUDIT_VALUE(bes_disc_params, bes_disc_params_bestellimiet5)
AUDIT_VALUE(bes_disc_params, bes_disc_params_min_bedrag)
AUDIT_VALUE(bes_disc_params, bes_disc_params_auto_order)
AUDIT_VALUE(bes_disc_params, bes_disc_params_autoacceptrfo)
AUDIT_VALUE(bes_disc_params, bes_disc_params_herfiat)
AUDIT_VALUE(bes_disc_params, bes_disc_params_herfiatpct)
AUDIT_VALUE(bes_disc_params, bes_disc_params_herfiatmarge)
AUDIT_VALUE(bes_disc_params, bes_disc_params_factuurpct)
AUDIT_VALUE(bes_disc_params, bes_disc_params_factuurmarge)
AUDIT_VALUE(bes_disc_params, bes_disc_params_factmatchmode)
AUDIT_VALUE(bes_disc_params, bes_disc_params_factuurappr)
AUDIT_VALUE(bes_disc_params, bes_disc_params_factuurgrens)
AUDIT_VALUE(bes_disc_params, bes_disc_params_pgb)
AUDIT_VALUE(bes_disc_params, bes_disc_params_leverdagen)
AUDIT_VALUE(bes_disc_params, bes_disc_params_remoteconfirm)
AUDIT_VALUE(bes_disc_params, bes_disc_params_freeartikel)
AUDIT_VALUE(bes_disc_params, bes_disc_params_punchouturl)
AUDIT_VALUE(bes_disc_params, bes_disc_params_punch_bedr_key)
AUDIT_VALUE(bes_disc_params, bes_disc_params_logo_url)
AUDIT_VALUE(bes_disc_params, bes_disc_params_noti_dagen)
AUDIT_VALUE(bes_disc_params, bes_disc_params_noti_opdr)
AUDIT_VALUE(bes_disc_params, bes_disc_params_bonotify)
AUDIT_VALUE(bes_disc_params, bes_disc_params_retour)
AUDIT_VALUE(bes_disc_params, bes_disc_params_retour_url)
AUDIT_VALUE(bes_disc_params, bes_disc_params_levopm_url)
AUDIT_VALUE(bes_disc_params, bes_ins_discipline_key_inkoop)
AUDIT_VALUE(bes_disc_params, bes_disc_params_singlegroep)
AUDIT_VALUE(bes_disc_params, bes_disc_params_kpautorisatie)
AUDIT_VALUE(bes_disc_params, bes_disc_params_maxartikel)
AUDIT_VALUE(bes_disc_params, bes_disc_params_contract)
AUDIT_VALUE(bes_disc_params, bes_disc_params_cnt_disckey)
AUDIT_VALUE(bes_disc_params, bes_disc_params_cnt_termijn)
AUDIT_VALUE(bes_disc_params, bes_disc_params_cnt_opzegterm)
AUDIT_VALUE(bes_disc_params, bes_disc_params_for_others)
AUDIT_END()

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;
/

CREATE_TRIGGER(bes_t_bes_srtkenmerk_b_iu)
   BEFORE INSERT OR UPDATE
   ON bes_srtkenmerk
   FOR EACH ROW
BEGIN
   UPDATE_PRIMARY_KEY(bes_srtkenmerk_key, bes_s_bes_srtkenmerk_key);
   UPDATE_UPPER(bes_srtkenmerk_omschrijving, bes_srtkenmerk_upper,bes_srtkenmerk);
   UPDATE_UPPER(bes_srtkenmerk_code, bes_srtkenmerk_code, bes_srtkenmerk);

   UPDATE_AANMAAKDATUM(bes_srtkenmerk,bes_srtkenmerk_aanmaak);
   IF (:new.bes_srtkenmerk_verwijder IS NOT NULL AND :old.bes_srtkenmerk_verwijder IS NULL AND
       :new.bes_srtkenmerk_systeem = 1)
   THEN
       raise_application_error(-20000, 'bes_C_bes_SRTKENMERK_SYSTEEM');
   END IF;

   IF :NEW.bes_srtkenmerk_kenmerktype IN ('C', 'N') AND :NEW.bes_srtkenmerk_lengte IS NULL
   THEN
      raise_application_error(-20000, 'bes_C_bes_SRTKENMERK_LENGTE');
   END IF;
   -- Numeriek mag niet te lang zijn (numeric overflow)
   IF :new.bes_srtkenmerk_kenmerktype = 'N' AND :new.bes_srtkenmerk_lengte > 20
   THEN
      :new.bes_srtkenmerk_lengte := 20;
   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_kenmerk_b_iu)
   BEFORE INSERT OR UPDATE
   ON bes_kenmerk
   FOR EACH ROW
BEGIN
   -- FSN#13902: we tolereren het achteraf verplicht maken
   UPDATE_PRIMARY_KEY(bes_kenmerk_key, bes_s_bes_kenmerk_key);
   UPDATE_AANMAAKDATUM(bes_kenmerk, bes_kenmerk_aanmaak);
   UPDATE_UPPER(bes_kenmerk_code, bes_kenmerk_code, bes_kenmerk);
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;
         numberwaarde              NUMBER (25,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_k.bes_kenmerk_verplicht
           INTO srtkenmerkomschr, srtkenmerktype, srtkenmerklengte,
                srtkenmerkdec, srtkenmerknmin, srtkenmerknmax,
                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
            APPLICATION_ERROR_GOTO(-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
               APPLICATION_ERROR_GOTO(-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
               numberwaarde := TO_NUMBER (kenmerkbestellingwaarde);
            EXCEPTION
               WHEN OTHERS
               THEN
                  formatmask := REPLACE (formatmask, '9', '#');
                  formatmask := REPLACE (formatmask, '0', '#');
                  formatmask := REPLACE (formatmask, 'D', '.');
                  APPLICATION_ERROR_GOTO(-20004, 'bes_m242,' || 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,
                                           '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', '.');
                  APPLICATION_ERROR_GOTO(-20004, 'bes_m242,' || srtkenmerkomschr || ',' || formatmask);
               END IF;
            END IF;

            -- Zet de geconverteerde waarde terug.
            :NEW.bes_kenmerkbestell_waarde := kenmerkbestellingwaarde;
         ELSIF srtkenmerktype = 'D'
         THEN
        -- DATUM
            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;
  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;
         numberwaarde              NUMBER (25,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_k.bes_kenmerk_verplicht
           INTO srtkenmerkomschr, srtkenmerktype, srtkenmerklengte,
                srtkenmerkdec, srtkenmerknmin, srtkenmerknmax,
                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
            APPLICATION_ERROR_GOTO(-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
               APPLICATION_ERROR_GOTO(-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
               numberwaarde := TO_NUMBER (kenmerkbestelitemwaarde);
            EXCEPTION
               WHEN OTHERS
               THEN
                  formatmask := REPLACE (formatmask, '9', '#');
                  formatmask := REPLACE (formatmask, '0', '#');
                  formatmask := REPLACE (formatmask, 'D', '.');
                  APPLICATION_ERROR_GOTO(-20004, 'bes_m242,' || 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,
                                           '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', '.');
                  APPLICATION_ERROR_GOTO(-20004, 'bes_m242,' || srtkenmerkomschr || ',' || formatmask);
               END IF;
            END IF;

            -- Zet de geconverteerde waarde terug.
            :NEW.bes_kenmerkbesteli_waarde := kenmerkbestelitemwaarde;
         ELSIF srtkenmerktype = 'D'
         THEN
        -- DATUM
            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;
  END IF;
END;
/

CREATE_TRIGGER(bes_t_bes_favoriet_b_iu)
BEFORE INSERT OR UPDATE ON bes_favoriet
FOR EACH ROW
BEGIN
   UPDATE_PRIMARY_KEY(bes_favoriet_key, bes_s_bes_favoriet_key);
END;
/

CREATE_TRIGGER(bes_t_bes_staffeltabel_b_iu)
BEFORE INSERT OR UPDATE ON bes_staffeltabel
FOR EACH ROW
BEGIN
   UPDATE_PRIMARY_KEY(bes_staffeltabel_key, bes_s_bes_staffeltabel_key);
END;
/

CREATE_TRIGGER(bes_t_bes_staffel_b_iu)
BEFORE INSERT OR UPDATE ON bes_staffel
FOR EACH ROW
BEGIN
   UPDATE_PRIMARY_KEY(bes_staffel_key, bes_s_bes_staffel_key);
END;
/

CREATE_TRIGGER(bes_t_bes_srtdeel_prijs_B_IU)
BEFORE INSERT OR UPDATE ON bes_srtdeel_prijs
FOR EACH ROW
BEGIN
    UPDATE_PRIMARY_KEY(bes_srtdeel_prijs_key, bes_s_bes_srtdeel_prijs_key);
 END;
/

REGISTERRUN('$Id$')

#endif  // BES
