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 :

Erreur sur requête


Sujet :

SQL Firebird

  1. #1
    Membre habitué
    Erreur sur requête
    Bonjour à tous,

    j'ai une erreur sur une requete sql avec ce message d'erreur "integer overflow the result of an integer operation caused the most significate bit of the result to carry at 'trigger FDT'".

    J'ai compris que c'est un depassement de capacité champs par contre je ne sais pas comment faire un "try except" dans un trigger.

  2. #2
    Expert confirmé
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  3. #3
    Membre habitué
    bonjour,

    j'ai vu le lien mais sa répond pas vraiment à ce que je souhaite. En effet, mon probléme c'est que j'ai dans un trigger "BEFORE INSERT OR UPDATE " un champs qui reçoit des données aléatoirement c'est pour ça que je veut mettre une exception pour qu'il mette le champs=0
    comme ceci
    try new.champ1=new.champ2*new.champ3; except new.champ1=0;

  4. #4
    Rédacteur/Modérateur

    Bonjour,

    Et si vous commenciez par nous fournir le code de ce trigger et, tant qu'à faire le code erreur pour ne pas avoir à le chercher nous même ?
    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, Sidney) 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
    Expert éminent sénior
    Peut être tout simplement une colonne marquée "null", auquel cas "COALESCE" résoudra le problème
    Mais effectivement, fournir les requêtes et le diagnostic est la moindre des choses

  6. #6
    Membre habitué
    Bonjour,
    voici le trigger
    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
    18
    19
    20
    21
    22
    SET TERM ^ ;
     
    CREATE TRIGGER STK_BIU0 
    FOR STK ACTIVE
    BEFORE INSERT OR UPDATE POSITION 0
     
    AS 
    BEGIN 
     
    IF (NEW.DES IS null) then 
     
    NEW.DES='.';	
     
    IF (NEW.DAT IS null) then 
     
           NEW.DAT=current_date;
    IF (new.mon is null) then
     
    new.mon=CAST(new.QTR*new.PUA as numeric(14,2));  ///erreur ici sachant que QTR=numeric(14,5), PUA=numeric(14,5),mon=numeric(14,5)  
    END^
     
    SET TERM ; ^

  7. #7
    Rédacteur/Modérateur

    Bonjour
    Vous nous avez toujours pas indiqué le code erreur mais plusieurs choses m'interpellent
    1. new.QTR et new.PUA peuvent être NULL donc un petit COALESCE ne serait pas de trop CAST(COALESCE(new.QTR,0.0)*COALESCE(new.PUA,0.0) as numeric(14,2))
    2. Plutôt qu'un COALESCE il serait peut-être bon de le faire en amont
      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
      SET TERM ^ ;
       
      CREATE TRIGGER STK_BIU0 
      FOR STK ACTIVE
      BEFORE INSERT OR UPDATE POSITION 0
      AS 
      BEGIN 
      IF (NEW.DES IS null) then NEW.DES='.';	
      IF (NEW.DAT IS null) then   NEW.DAT=current_date;
      IF (new.QTR IS NULL) THEN NEW.QTR=0.00;
      IF (new.PUA IS NULL) THEN NEW.PUA=0.00;
      IF (new.mon is null) then new.mon=CAST(new.QTR*new.PUA as numeric(14,2));   
      END^
       
      SET TERM ; ^
    3. Si La colonne mon est numeric(14,5) pourquoi faites-vous un CAST AS NUMERIC(14,2) ?
    4. Pourquoi stockez-vous une colonne (mon) calculée (COMPUTED BY) ?
    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, Sidney) 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

  8. #8
    Membre habitué
    Bonjour
    Vous nous avez toujours pas indiqué le code erreur
    je l'ai indiqué depuis le début!
    new.QTR et new.PUA
    ces 2 champs ne peuvent jamais être null, ils ont au pire une valeur par défaut.

    Si La colonne mon est numeric(14,5) pourquoi faites-vous un CAST AS NUMERIC(14,2) ?
    non, mon est NUMERIC(14,2)

  9. #9
    Rédacteur/Modérateur

    Bonjour,
    Citation Envoyé par chekkal Voir le message


    Vous nous avez toujours pas indiqué le code erreur
    je l'ai indiqué depuis le début!
    Non, vous nous avez indiqué le texte de l'erreur. Chaque erreur est aussi indiqué par un numéro (GDSCODE) c'est ec dernier que je demandais, vous ne croyez quand même pas que je vais aller faire cette recherche ?


    Ces 2 champs ne peuvent jamais être null, ils ont au pire une valeur par défaut.
    j'ai un principe il faut toujours appliquer la loi de Murphy : "tout ce qui peux foirer le fera". Avez-vous essayé avec mes préconisations avant de les rejeter ? Bien sûr j'ai proposé 0.00 mais tout autre valeur par défaut serait acceptable, d'ailleurs ces valeurs sont-elles indiquées (et correctement) dans le DML ?


    non, mon est NUMERIC(14,2)
    ce n'est pas ce que vous indiquez dans votre code de trigger
    ///erreur ici sachant que QTR=numeric(14,5), PUA=numeric(14,5),mon=numeric(14,5)
    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, Sidney) 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

  10. #10
    Membre habitué
    Bonjour,

    Désolé pour l’ambiguïté. Je vous remercie pour les conseils sur la structure et les contrôles a faire sur la base de données, soyez certains que je prendrais en considération la prochaine fois. Cependant, ma question est toutes simple, peut on introduire un code d'exception dans un trigger comme avec programmation

  11. #11
    Rédacteur/Modérateur

    Citation Envoyé par chekkal Voir le message
    Ma question est toute simple, peut-on introduire un code d'exception dans trigger
    Oui et QI130 vous l'a déjà indiqué il existe le WHEN .. DO
    C'est pour cette raison que je vous demandais le code de l'erreur pour pouvoir l'écrire

    Pour une gestion "fine" de l'erreur WHEN GDSCODE 335544779 DO BEGIN ... END
    Pour une gestion plus "globale" WHEN SQLCODE -901 DO BEGIN ...END
    au cas où voulez traiter (gestion générale) tout type d'erreur WHEN ANY DO BEGIN ... END

    Mais attention aux portées de cette gestion d'exception. En gros, on met ce code en fin de bloc et cette gestion est valable pour tout le bloc. Ce n'est donc pas la même chose qu'en programmation Delphi.


    par exemple
    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
    18
    19
    20
    21
    22
    23
    SET TERM ^ ;
     
    CREATE TRIGGER STK_BIU0 
    FOR STK ACTIVE
    BEFORE INSERT OR UPDATE POSITION 0
     
    AS 
    BEGIN 
     
    IF (NEW.DES IS null) then 
     
    NEW.DES='.';	
     
    IF (NEW.DAT IS null) then 
     
           NEW.DAT=current_date;
    IF (new.mon is null) then
     
    new.mon=CAST(new.QTR*new.PUA as numeric(14,2)); 
    WHEN ANY DO new.mon=0.00; 
    END^
     
    SET TERM ; ^

    c'est une très mauvaise gestion de l'erreur mais "c'est vous qui voyez"
    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, Sidney) 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

  12. #12
    Membre habitué
    Bonjour,
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    WHEN ANY DO


    C'est bien ce que je cherche merci. cependant l'exception est pour le trigger complet et pas pour une opérations spécifique dans le trigger.

###raw>template_hook.ano_emploi###