Trigger

Fermé
sdrogba Messages postés 67 Date d'inscription mercredi 18 août 2010 Statut Membre Dernière intervention 3 novembre 2016 - Modifié par irongege le 21/01/2013 à 16:54
sdrogba Messages postés 67 Date d'inscription mercredi 18 août 2010 Statut Membre Dernière intervention 3 novembre 2016 - 22 janv. 2013 à 10:47
Bonjour,

Etant donné que ce n'est pas une solution que je suis amené à utiliser souvent je ne me rapelle plus trop de la synthaxe à utiliser pour un trigger.

Celui ci doit mettre une date dans la table bkizcprt à chaque insert ou update de cette même table.

CREATE FUNCTION Affectation_date() RETURNS trigger AS INS_UPD_bkizcprt$ufdbki 
   DECLARE 
      f_sit_cent              CHAR(5)  ; 
      f_date_comptable1       CHAR(8)  ; 
      f_date_comptable2       CHAR(8)  ; 

   BEGIN 
      NEW.date_dermodif := current_timestamp; 

      -- Recherche du site central 
      SELECT MNT1 INTO f_sit_cent FROM BKNOM WHERE CTAB = '098' AND CACC = 'CENT'; 

      IF f_sit_cent IS NOT NULL THEN 
         -- Recherche de la date comptable 
         SELECT MNT1, MNT2  
         INTO f_date_comptable1, f_date_comptable2 
         FROM BKNOM WHERE CTAB = '001' AND CACC = f_sit_cent AND AGE = f_sit_cent; 

         -- Quelle est la bonne date comptable ? 
         IF f_date_comptable2 IS NULL THEN 
            NEW.date_dermodif := f_date_comptable1; 
         ELSE 
            NEW.date_dermodif := f_date_comptable2; 
         END IF 
      END IF 

      RETURN NEW; 
   END; 
INS_UPD_bkizcprt$ufdbki LANGUAGE plpgsql; 

CREATE TRIGGER INS_UPD_bkizcprt$ufdbki BEFORE INSERT OR UPDATE ON BKIZCPRT 
    FOR EACH ROW EXECUTE PROCEDURE Affectation_date(); 

SHOW errors; 
exit;


Il s'avère que je sais même pas où se trouve les erreurs mais je sais qu'il y en a.
De plus, ma procédure retourne NEW cependant je ne sais pas si pour lui cela implémente la nouvelle zone avant de faire l'INSERT ou l'UPDATE et si oracle comprend qu'il faut bien le prendre en compte dans l'action qu'il est entrain de faire.

Si une âme charitable passe dans le coin svp...
Merci d'avance

1 réponse

sdrogba Messages postés 67 Date d'inscription mercredi 18 août 2010 Statut Membre Dernière intervention 3 novembre 2016
22 janv. 2013 à 10:47
J'avance sur mes problèmes le code est devenu ça :

CREATE OR REPLACE TRIGGER INS_UPD_bkizcprt
   AFTER INSERT OR UPDATE ON BKIZCPRT
   FOR EACH ROW

   DECLARE
      f_sit_cent              CHAR(5)  := '99000';
      f_date_comptable1       CHAR(8)  := '02011900';
      f_date_comptable2       CHAR(8)  := '02011900';
      CURSOR cur_bkizcprt
         IS
         SELECT * FROM bkizcprt
         AND   age  = :OLD.age
         AND   ope  = :OLD.ope
         AND   eve  = :OLD.eve
         AND   ave  = :OLD.ave
         AND  iden  = :OLD.iden
         AND  lang  = :OLD.lang;

      f_bkizcprt cur_bkizcprt%ROWTYPE;

      CURSOR cur_sit_cent
         IS
         SELECT MNT1
         FROM BKNOM
         WHERE CTAB = '098'
         AND CACC = 'SITE-CENT';

      CURSOR cur_date_comptable
         IS
         SELECT MNT1, MNT2
         FROM BKNOM
         WHERE CTAB = '001'
         AND CACC = f_sit_cent
         AND AGE = f_sit_cent;

   BEGIN
      OPEN cur_bkizcprt;
      FETCH cur_bkizcprt INTO f_bkizcprt;
      IF cur_bkizcprt%FOUND THEN
         -- Recherche du site central
         OPEN cur_sit_cent;
         FETCH cur_sit_cent INTO f_sit_cent;

         IF cur_sit_cent%FOUND THEN
            -- Recherche de la date comptable
            OPEN cur_date_comptable;
            FETCH cur_date_comptable INTO f_date_comptable1, f_date_comptable2;

            IF cur_date_comptable%FOUND THEN
               -- Quelle est la bonne date comptable ?
               IF f_date_comptable2 IS NULL THEN
                  :NEW.date_dermodif := f_date_comptable1;
               ELSE
                  :NEW.date_dermodif := f_date_comptable2;
               END IF;
            END IF;
         END IF;

         UPDATE bkizcprt SET
         date_dermodif  = to_date(:NEW.date_dermodif)    --Date de modifcation
         WHERE age = :OLD.age
         AND   ope = :OLD.ope
         AND   eve = :OLD.eve
         AND   ave = :OLD.ave
         AND  iden = :OLD.iden
         AND  lang = :OLD.lang
         ;

      END IF;
   END;
   /

SHOW errors;

exit;


Cependant j'ai réussit à determiner des erreurs les voicis :

7/10 PL/SQL: SQL Statement ignored
8/10 PL/SQL: ORA-00933: la commande SQL ne se termine pas correctement

Une idée ?
0