Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Firebird Discussion :

[FB3] Bug bizarre dans la création d'un trigger


Sujet :

SQL Firebird

  1. #1
    Membre émérite
    [FB3] Bug bizarre dans la création d'un trigger
    bonjour
    j'ai fais un petit erreur en créant un trigger:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SET TERM !! ;
    CREATE TRIGGER PARAMS_NORMES_BI FOR PARAMS_NORMES
    ACTIVE BEFORE INSERT POSITION 0
    AS
    BEGIN
      IF (NEW.ID IS NULL) THEN
        NEW.ID =  new.ID=GEN_ID(GEN_PARAMETRE,1);
    END!!
    SET TERM ; !!

    le trigger se crée, bien sûr le champs ID ne ce rempli pas,
    j'ai FB3,
    est ce normal, ou un bug??
    merci
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  2. #2
    Rédacteur/Modérateur

    Bonjour,

    Déjà il y a une erreur dans le trigger, deux fois NEW.ID

    Je n'ai trouvé aucune erreur de ce type dans FB3 voici un trigger que j'utilise (généré quasi automatiquement avec FlameRobin)
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    SET TERM ^ ;
    ALTER TRIGGER ACHEMINEMENT_BI ACTIVE
    BEFORE INSERT POSITION 0
    AS
    DECLARE VARIABLE tmp DECIMAL(18,0);
    BEGIN
      IF (NEW.ID_PARAM IS NULL) THEN
        NEW.ID_PARAM = GEN_ID(ID_PARAMETRES, 1);
      ELSE
      BEGIN
        tmp = GEN_ID(ID_PARAMETRES, 0);
        if (tmp < new.ID_PARAM) then
          tmp = GEN_ID(ID_PARAMETRES, new.ID_PARAM-tmp);
      END
    END^
    SET TERM ; ^
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Membre émérite
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    Déjà il y a une erreur dans le trigger, deux fois NEW.ID

    Je n'ai trouvé aucune erreur de ce type dans FB3 voici un trigger que j'utilise (généré quasi automatiquement avec FlameRobin)
    bonjour
    j'utilise moi aussi FlameRobin pour crée mes trigger, mais je le modifie, surtout je supprime cette partie
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        tmp = GEN_ID(ID_PARAMETRES, 0);
        if (tmp < new.ID_PARAM) then
          tmp = GEN_ID(ID_PARAMETRES, new.ID_PARAM-tmp);
      END

    je sais qu'il y a deux fois NEW.ID, mais firebird ne réclame pas d'erreur, c'est ma question, est ce "normal" ou bug?
    merci
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  4. #4
    Rédacteur/Modérateur

    AMHA avec
    Code SQL :Sélectionner tout -Visualiser dans une fenêtre à part
     NEW.ID =  new.ID=GEN_ID(GEN_PARAMETRE,1);

    on obtient un Boolean a priori False
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  5. #5
    Membre émérite
    Citation Envoyé par SergioMaster Voir le message
    AMHA avec
    Code SQL :Sélectionner tout -Visualiser dans une fenêtre à part
     NEW.ID =  new.ID=GEN_ID(GEN_PARAMETRE,1);

    on obtient un Boolean a priori False
    j'ai modifier mon trigger:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SET TERM ^ ;
    alter TRIGGER PARAMS_NORMES_BI
    AS
    declare variable x int;
    BEGIN
      IF (NEW.ID IS NULL) THEN
        NEW.ID =NEW.ID=GEN_ID(GEN_PARAMETRE,1);
      IF (NEW.ID IS NULL) THEN
        new.ID=-GEN_ID(GEN_PARAMETRE,1);
    END^
    SET TERM ; ^

    alors ID à reçu une valeur négatif


    [EDIT]
    je crois que tu as vu juste, ce code marche et me donne une valeur négatif:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SET TERM ^ ;
    alter TRIGGER PARAMS_NORMES_BI
    AS
    declare variable x int;
    declare variable b boolean;
    BEGIN
      b=true;
      IF (NEW.ID IS NULL) THEN
        b =coalesce(NEW.ID,0) =GEN_ID(GEN_PARAMETRE,1);
      IF (b=false) THEN
        new.ID=-GEN_ID(GEN_PARAMETRE,1);
    END^
    SET TERM ; ^

    sans coalesce la valeur de b =null
    merci, je met résolu
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  6. #6
    Rédacteur/Modérateur

    Bonjour,

    la logique m'échappe
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     IF (NEW.ID IS NULL) THEN
        b =coalesce(NEW.ID,0) =GEN_ID(GEN_PARAMETRE,1);
    // coalesce inutile puisque new.ID est déjà testé et considéré null
    autant écrire b= GEN_ID(GEN_PARAMETRE,1)=0 et on le sait ce sera toujours faux donc IF (NEW.ID IS NULL) THEN b=False;

    IF (b=false) THEN new.ID=-GEN_ID(GEN_PARAMETRE,1); // Pourquoi demander une valeur négative ?

    le tout revenant, si l'on veut des valeurs négatives, à
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    IF (NEW.ID IS NULL) THEN NEW.ID=-GEN_ID(GEN_PARAMETRE,1);
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  7. #7
    Membre émérite
    bonjour
    désoler, le code que j'ai présenter c'est pour faire le teste de ta suggestion;

    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS