IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Développement SQL Server Discussion :

Dépassement arithmétique dans un trigger


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Par défaut Dépassement arithmétique dans un trigger
    Bonjour à tous.
    Je suis en train de creer un trigger qui permet de générer un IBAN a la création d'un compte. Pour cela je dois faire le modulo 97 d'un nombre à 27 chiffres.

    Tel quel, j'obtiens une erreur de type
    Msg*248, Niveau*16, État*1, Procédure*CHECK_DIGIT, Ligne*19
    La conversion de la valeur varchar '300040082802587413691152700' a dépassé une colonne int.
    On m'a conseillé de faire un cast en bigint, mais le bigint ne tient pas la charge non plus et me donne ce type de message:
    Msg*8115, Niveau*16, État*2, Procédure*CHECK_DIGIT, Ligne*18
    Une erreur de dépassement arithmétique s'est produite lors de la conversion de expression en type de données bigint.
    Auriez vous une solution pour contourner ce problème?

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Normal car vous êtes en dépassement de capacité même pour un BIGINT.

    Postez votre code pour que nous puissions vous aider.

    ++

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Par défaut
    Bonjour et merci,

    Voici le code du 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    USE [IBAN]
    GO
    /****** Object:  Trigger [dbo].[CHECK_DIGIT]    Script Date: 05/30/2011 17:22:39 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER TRIGGER [dbo].[CHECK_DIGIT]
    ON [dbo].[COMPTE]
    FOR INSERT
    AS
    BEGIN
    DECLARE @iban CHAR(27);
    DECLARE @ibanApresModulo CHAR(27);
    DECLARE @checkDigit CHAR(2);
    DECLARE @codeBanque CHAR(10);
    DECLARE @numCompte CHAR(11);
    DECLARE @cleRib CHAR(2);
     
    select @codeBanque = codeBanque from inserted;
    select @numCompte = numCompte from inserted;
    select @cleRib = cleRib from inserted;
     
    select @iban = @codeBanque + @numCompte + '1527' + '00';
    /*select CAST(@iban AS BIGINT)*/
    select @ibanApresModulo = @iban % 97;
    select @checkDigit = 98-@ibanApresModulo;
    select @iban = 'FR' + @checkDigit + @codeBanque + @numCompte + @cleRib;
     
    update compte 
    set iban = @iban
    where numCompte = @numCompte;
    END
    Et voici le type d'insertion lors du trigger:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO COMPTE VALUES ('02587413691','3000400828','1','01','')
    Dans l'ordre on a numCompte, codeBanque, codeClient, cleRib, et ce qui doit stocker l'iban fini.

    Merci encore.

    EDIT: En cherchant des infos sur la façon "manuelle" de calculer le modulo des grands nombre j'ai trouvé ce message qui donnait la solution:
    http://www.developpez.net/forums/d32...-grand-nombre/
    Le problème est donc résolu, merci tout de même à Mikedavem.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour

    Notez tout de même que votre trigger pourrait s’écrire ainsi (sans résoudre le problème du modulo) avec un trigger instead of insert(on pourrait faire le même principe avec un trigger for insert) :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ALTER TRIGGER [dbo].[CHECK_DIGIT]
    ON [dbo].[COMPTE]
    INSTEAD OF INSERT
    AS
    BEGIN
     
    	INSERT INTO compte(laColonneIban, lesAutresColonnes)
    	SELECT
    		'FR' + 98-((codeBanque + numCompte + '1527' + '00')%97) + codeBanque + numCompte + cleRib
    		,lesAutresColonnes
    	FROM INSERTED
     
    END

    plus simple non ?!?

    1/ cela évite toutes ces variables inutiles
    2/ cela prend en charge les insertions multilignes

    Mais plus que ça, vous pourriez créer une fonction qui calcule le IBAN à partir des autres informations, et créer une colonne calculée (eventuellement persistente et eventuellement indexée) dans votre table, et vous passer ainsi d'un couteux trigger.

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Par défaut
    C'est noté, en effet ça m'as l'air beaucoup plus simple.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/10/2004, 16h18
  2. Recuperer derniere valeur modifiée dans un trigger
    Par xabs dans le forum Développement
    Réponses: 2
    Dernier message: 06/08/2004, 16h22
  3. RAZ GENERATOR dans un trigger
    Par kase74 dans le forum SQL
    Réponses: 2
    Dernier message: 08/09/2003, 18h43
  4. select dans un trigger sous Postgresql
    Par kastor_grog dans le forum Requêtes
    Réponses: 1
    Dernier message: 03/09/2003, 17h00
  5. [PostgreSQL] Refus de STATEMENT dans un trigger
    Par alex2205 dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/03/2003, 12h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo