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

SQL Firebird Discussion :

Arithemetic overflow or division by zero has occured


Sujet :

SQL Firebird

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    345
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 345
    Points : 90
    Points
    90
    Par défaut Arithemetic overflow or division by zero has occured
    Salut tout le monde,
    j'ai une procedure stockée quand le l'execute me sort le message suivant:
    Arithmetic overflow or division by zero has occured .
    voici le code de la procedure :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    CREATE PROCEDURE IMPLIENTC (
        JRL VARCHAR (10))
    RETURNS (
        JOURNAL VARCHAR (10),
        SEQUENCE INTEGER,
        LIGNE INTEGER,
        CP VARCHAR (3),
        CATEGORIE VARCHAR (1),
        COMPTE VARCHAR (10),
        LIBELLE VARCHAR (35),
        DATEMVT DATE,
        PIECE VARCHAR (20),
        DEBIT NUMERIC (15, 2),
        CREDIT NUMERIC (15, 2),
        NBRECRITURE INTEGER,
        REGLEMENT VARCHAR (10),
        REM VARCHAR (20))
    AS
    DECLARE VARIABLE CODE_TVA VARCHAR(5);
    DECLARE VARIABLE C_TVA VARCHAR(10);
    DECLARE VARIABLE C_VENTE VARCHAR(10);
    DECLARE VARIABLE HT NUMERIC(15,2);
    DECLARE VARIABLE TAX NUMERIC(15,2);
    DECLARE VARIABLE TTC NUMERIC(15,2);
    DECLARE VARIABLE CPT VARCHAR(10);
    DECLARE VARIABLE PIE VARCHAR(20);
    DECLARE VARIABLE SEQNBR INTEGER;
    DECLARE VARIABLE SEQ INTEGER;
    DECLARE VARIABLE ECEX INTEGER;
    DECLARE VARIABLE CPTEX INTEGER;
    DECLARE VARIABLE T VARCHAR(1);
    DECLARE VARIABLE TTT VARCHAR(10);
    DECLARE VARIABLE TTV NUMERIC(15,2);
    DECLARE VARIABLE INTI VARCHAR(35);
    DECLARE VARIABLE LIB VARCHAR(35);
    DECLARE VARIABLE ORDRE VARCHAR(10);
    DECLARE VARIABLE MODE VARCHAR(30);
    begin
        seqnbr=0;
        TTT='';
        For
        Select Distinct Mouv.sequence from Mouv into :SEQ
        do
        begin
        if (seq<5000) then begin seq=5000; end else seq=seq+1;
        end
     
       select count(LIENTC.n_fact) from LIENTC into :nbrecriture;
     
     for select LienTC.n_fact, Sum(lienTC.mnt_ht) from LienTC
     Group By LienTC.n_fact into :pie, :ttv
     do
     begin  /* Boucle 1 */
       For
       Select Distinct
           LIENTC.code_comp,
           LIENTC.rs,
           LIENTC.date_fac,
           LIENTC.c_tva,
           LienTC.code_tva,
           LIENTC.mnt_ht,
           LIENTC.mnt_ttc,
           LienTC.transfert,
           LienTC.libelle,
           LienTC.ordre,
           LienTC.mode
       from
           LIENTC
       Where
           LIENTC.code_comp is not null and LIENTC.n_fact=:pie
       Order By
           N_Fact
       into
           :CPT,:lib, :datemvt, :C_TVA,:code_tva, :HT, :TTC , :t,:inti, :ordre,:mode
       do
        Begin   /* Boucle 2 */
     
                  reglement=:ttc;
        if (T IS NULL) then T='0';
        if (inti is null) then inti='';
          LIBELLE=:inti||'-'||:mode;
              if ((T<>2))  then
                  Begin
                      SeqNbr=:SeqNbr+1;
                      if ((seqNbr>102) and (pie<>:REM)) then
                          bEGIN
                              SeqNbr=1;
                              Seq=:Seq+1;
                          end
                      JOURNAL=:jrl;
                      Sequence=:SEQ;
                      Ligne=:SEQNBR;
                      Piece=:PIE;
                      if (ordre<>'I') then
                          begin
                             categorie='C';
                             Compte=:cpt;
                             Debit=0;
                             Credit=HT;
                             CP='C';
                            if (ordre='A') Then
                             libelle='A/'||:libelle;
                             Suspend;
                             INSERT INTO MOUV (SEQUENCE, LIGNE, CP, JOURNAL, CATEGORIE, COMPTE, DATEMVT, PIECE, LIBELLE, CONTRE_PARTIE, LETTRAGE, LIGNE_CONTRE_PARTIE, DEBIT, CREDIT, PARLOT, REG, TYPE_REG, COMMENTAIRE, SECTION, INFO1, INFO2, INFO3, INFO4, INFO5, INFO6, INFO7, INFO8, INFO9, INFO10, DATEVALEUR, STATUS, SOLDE, MNT_REGLEMENT) VALUES (:sequence,:ligne,:CP,:jrl,:CATEGORIE,:COMPTE,:datemvt,:piece,:libelle,:code_tva,NULL,NULL,:debit,:credit,NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, :debit-:credit, :reglement);
                             rem=:PIE;
                          end
                      else
                          Begin
                             categorie='C';
                             Compte=:cpt;
                             Credit=0;
                             Debit=-HT;
                             CP='C';
                             libelle='IMP/'||:libelle;
                             Suspend;
                             INSERT INTO MOUV (SEQUENCE,LIGNE,CP,JOURNAL,CATEGORIE,COMPTE,DATEMVT,PIECE,LIBELLE,CONTRE_PARTIE,LETTRAGE,LIGNE_CONTRE_PARTIE,DEBIT,CREDIT,PARLOT, REG, TYPE_REG, COMMENTAIRE, SECTION, INFO1, INFO2, INFO3, INFO4, INFO5, INFO6, INFO7, INFO8, INFO9, INFO10, DATEVALEUR, STATUS, SOLDE, MNT_REGLEMENT) VALUES (:sequence,:ligne,:CP,:jrl,:CATEGORIE,:COMPTE,:datemvt,:piece,:libelle,:code_tva,NULL,NULL,:debit,:credit,NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, :debit-:credit, :reglement);
                            rem=:PIE;
                          end
     
                  end
              else
                  begin
                      SeqNbr=:SeqNbr+1;
                      if ((seqNbr>102) and (pie<>:REM)) then
                         bEGIN
                            SeqNbr=1;
                            Seq=:Seq+1;
                         end
                       JOURNAL=:jrl;
                       Sequence=:SEQ;
                       Ligne=:SEQNBR;
                       Piece=:PIE;
                       if (ORDRE<>'I') then
                          Begin
                            categorie='C';
                            Compte=:cpt;
                            Debit=0;
                            Credit=:HT;
                            if (ordre='A') Then
                             libelle='A/'||:libelle;
                            CP='C';
                            Suspend;
                            INSERT INTO MOUV (SEQUENCE, LIGNE, CP, JOURNAL, CATEGORIE, COMPTE, DATEMVT, PIECE, LIBELLE, CONTRE_PARTIE, LETTRAGE, LIGNE_CONTRE_PARTIE, DEBIT, CREDIT, PARLOT, REG, TYPE_REG, COMMENTAIRE, SECTION, INFO1, INFO2, INFO3, INFO4, INFO5, INFO6, INFO7, INFO8, INFO9, INFO10, DATEVALEUR, STATUS, SOLDE, MNT_REGLEMENT) VALUES (:sequence,:ligne,:CP,:jrl,:CATEGORIE,:COMPTE,:datemvt,:piece,:libelle,:code_tva,NULL,NULL,:debit,:credit,NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, :debit-:credit, :reglement);
                            rem=:PIE;
                         end
                       else
                          Begin
                            categorie='C';
                            Compte=:cpt;
                            Debit=-:ht;
                            Credit=0;
                            CP='C';
                            Suspend;
                            INSERT INTO MOUV (SEQUENCE, LIGNE, CP, JOURNAL, CATEGORIE, COMPTE, DATEMVT, PIECE, LIBELLE, CONTRE_PARTIE, LETTRAGE, LIGNE_CONTRE_PARTIE, DEBIT, CREDIT, PARLOT, REG, TYPE_REG, COMMENTAIRE, SECTION, INFO1, INFO2, INFO3, INFO4, INFO5, INFO6, INFO7, INFO8, INFO9, INFO10, DATEVALEUR, STATUS, SOLDE, MNT_REGLEMENT) VALUES (:sequence,:ligne,:CP,:jrl,:CATEGORIE,:COMPTE,:datemvt,:piece,:libelle,:code_tva,NULL,NULL,:debit,:credit,NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, :debit-:credit, :reglement);
                           rem=:PIE;
                          end
                  end
        end  /* Boucle 2 */
        if (T<>2) then
           Begin
        LIBELLE='TOTAL REGLEMENT N° '||:pie;
                      SeqNbr=:SeqNbr+1;
                if (TTV>0) then
                   begin
                        categorie='G';
                        Compte=:c_tva;
                        Debit=:ttv;
                        Credit=0;
                        CP='';
     
                       JOURNAL=:jrl;
                       Sequence=:SEQ;
                       Ligne=:SEQNBR;
                       Piece=:PIE;
                        suspend;
                        sELECT count(Mouv.piece) from mouv
                        where mouv.piece=:piece
                        into :ECEX;
     
                        INSERT INTO MOUV (SEQUENCE, LIGNE, CP, JOURNAL, CATEGORIE, COMPTE, DATEMVT, PIECE, LIBELLE, CONTRE_PARTIE, LETTRAGE, LIGNE_CONTRE_PARTIE, DEBIT, CREDIT, PARLOT, REG, TYPE_REG, COMMENTAIRE, SECTION, INFO1, INFO2, INFO3, INFO4, INFO5, INFO6, INFO7, INFO8, INFO9, INFO10, DATEVALEUR, STATUS, SOLDE, MNT_REGLEMENT) VALUES (:sequence,:ligne,:CP,:jrl,:CATEGORIE,:COMPTE,:datemvt,:piece,:libelle,:code_tva,NULL,NULL,:debit,:credit,NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, :debit-:credit, :reglement);
                    end
                else
                    Begin
                       categorie='G';
                        Compte=:c_tva;
                        Credit=-:ttv;
                        Debit=0;
                        CP='';
                       JOURNAL=:jrl;
                       Sequence=:SEQ;
                       Ligne=:SEQNBR;
                       Piece=:PIE;
                        suspend;
                        INSERT INTO MOUV (SEQUENCE,LIGNE,CP,JOURNAL,CATEGORIE,COMPTE,DATEMVT,PIECE,LIBELLE,CONTRE_PARTIE,LETTRAGE,LIGNE_CONTRE_PARTIE,DEBIT,CREDIT,PARLOT, REG, TYPE_REG, COMMENTAIRE, SECTION, INFO1, INFO2, INFO3, INFO4, INFO5, INFO6, INFO7, INFO8, INFO9, INFO10, DATEVALEUR, STATUS, SOLDE, MNT_REGLEMENT) VALUES (:sequence,:ligne,:CP,:jrl,:CATEGORIE,:COMPTE,:datemvt,:piece,:libelle,:code_tva,NULL,NULL,:debit,:credit,NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, :debit-:credit, :reglement);
                     end
           end
        else
           begin
            LIBELLE='TOTAL REMISE N° '||:pie;
              Piece=:PIE;
                      SeqNbr=:SeqNbr+1;
              if (TTV>0) then
                 begin
                    categorie='G';
                    Compte=:c_tva;
                    debit=:ttv;
                    Credit=0;
                    CP='';
                       JOURNAL=:jrl;
                       Sequence=:SEQ;
                       Ligne=:SEQNBR;
                       Piece=:PIE;
     
                    suspend;
                    sELECT count(Mouv.piece) from mouv
                    where mouv.piece=:piece
                    into :ECEX;
     
                    INSERT INTO MOUV (SEQUENCE, LIGNE, CP, JOURNAL, CATEGORIE, COMPTE, DATEMVT, PIECE, LIBELLE, CONTRE_PARTIE, LETTRAGE, LIGNE_CONTRE_PARTIE, DEBIT, CREDIT, PARLOT, REG, TYPE_REG, COMMENTAIRE, SECTION, INFO1, INFO2, INFO3, INFO4, INFO5, INFO6, INFO7, INFO8, INFO9, INFO10, DATEVALEUR, STATUS, SOLDE, MNT_REGLEMENT) VALUES (:sequence,:ligne,:CP,:jrl,:CATEGORIE,:COMPTE,:datemvt,:pie,:libelle,:code_tva,NULL,NULL,:debit,:credit,NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, :debit-:credit, :reglement);
                 end
                else
                begin
                    categorie='G';
                    Compte=:c_tva;
                    debit=0;
                    credit=-:ttv;
                    CP='';
                       JOURNAL=:jrl;
                       Sequence=:SEQ;
                       Ligne=:SEQNBR;
                       Piece=:PIE;
     
     
                    suspend;
                    sELECT count(Mouv.piece) from mouv
                    where mouv.piece=:piece
                    into :ECEX;
     
                    INSERT INTO MOUV (SEQUENCE, LIGNE, CP, JOURNAL, CATEGORIE, COMPTE, DATEMVT, PIECE, LIBELLE, CONTRE_PARTIE, LETTRAGE, LIGNE_CONTRE_PARTIE, DEBIT, CREDIT, PARLOT, REG, TYPE_REG, COMMENTAIRE, SECTION, INFO1, INFO2, INFO3, INFO4, INFO5, INFO6, INFO7, INFO8, INFO9, INFO10, DATEVALEUR, STATUS, SOLDE, MNT_REGLEMENT) VALUES (:sequence,:ligne,:CP,:jrl,:CATEGORIE,:COMPTE,:datemvt,:pie,:libelle,:code_tva,NULL,NULL,:debit,:credit,NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, :debit-:credit, :reglement);
                end
           end
     
     end   /* Boucle 1 */
     
    end
    merci

  2. #2
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    pfou, il y surement pleins de raisons possibles
    j'en voie déjà une :
    LIBELLE VARCHAR (35)
    INTI VARCHAR(35)
    MODE VARCHAR(30)
    et plus loin :
    LIBELLE=:inti||'-'||:mode;

    donc vérifie ce genre de truc et aussi les éventualités de division par zéro

    et puis il y a trop de suspend dans ce code
    un seul suffit pour ramener la valeur en sortie, à la fin du traitement
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  3. #3
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    345
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 345
    Points : 90
    Points
    90
    Par défaut
    peut tu m'explique un peu pourquoi un seul suspend suffit

  4. #4
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    suspend cela veut dire dans le cas de EXECUTE procedure "j'arrête le traitement ici et je renvoie une valeur ou un ensemble de valeurs"
    dans le cas de SELECT procedure
    "je renvoie une valeur ou un ensemble de valeurs et je continue le traitement s'il y en a derrière"
    donc il faut bien que tu vérifies aussi que ta variable de sortie c'est bien vue attribuer un valeur avant que le SUSPEND se déclenche
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/09/2006, 16h39
  2. [FLASH 8] An error has occured opening the file?
    Par baleiney dans le forum Flash
    Réponses: 1
    Dernier message: 16/07/2006, 22h28
  3. [debutant]ERROR:An error has occured
    Par iftolotfi dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 08/06/2006, 13h47
  4. [Math][Info]division par zéro
    Par niko8181 dans le forum Général Java
    Réponses: 9
    Dernier message: 23/05/2005, 09h58
  5. Réponses: 3
    Dernier message: 16/09/2004, 14h11

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