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 :

variables locales changent de valeur lorsqu'on quitte un bloc d'instructions


Sujet :

SQL Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de khaled-benloucif
    Inscrit en
    Octobre 2008
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Octobre 2008
    Messages : 74
    Par défaut variables locales changent de valeur lorsqu'on quitte un bloc d'instructions
    Bonjour, je suis nouveau dans ce forum.
    j'expose mon problème: je travaille sur un logiciel de paie, j'ai un soucis dans la procédure de calcule de la paie d'un employé donné. dans ce code, j'ai réduis les lignes de la procédure pour exposer que le problème existant :

    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
    begin
      /*initialisation des variables*/
      cnt_g_imp= 0;
      cnt_g_n_imp= 0;
      cnt_r_imp= 0;
      cnt_r_n_imp= 0;
     
      base_sal_base= 0;
     
      base_cot= 0.00;
      base_irg= 0.00;
      /**/
      paie_sec= 0;
      /* insertion des données master*/
      insert into t_paies_mas ( paie_a, paie_m, emp_id, paie_sec, paie_date)
      values ( :paie_a, :paie_m, :emp_id, :paie_sec, :paie_date);
      /*calculer les gains*/
      for select rbq_id, rbq_type, rbq_used, rbq_base, rbq_rate, rbq_imp, rbq_cot
          from t_rbqs_paie_det
          where rbq_type= 1 and rbq_used= 255
          order by rbq_call_ord
          into :rbq_id, :rbq_type, :rbq_used, :rbq_base, :rbq_rate, :rbq_imp, :rbq_cot
      do
       begin
        if (rbq_id= '1000') then/*salaire de base*/
         begin
          execute procedure get_emp_wd(emp_id) returning_values :rbq_cnt;
          execute procedure get_emp_scale(emp_id) returning_values :emp_scale;
          execute procedure get_base_hw(paie_a, paie_m, emp_scale) returning_values :rbq_base;
          rbq_amt= rbq_cnt*rbq_base;
          base_sal_base= rbq_amt;
         end
        /*cumuler les gains*/
        if (rbq_imp= 255) then
         cnt_g_imp= cnt_g_imp+ rbq_amt;
        else
         cnt_g_n_imp= cnt_g_n_imp+ rbq_amt;
        /* insertion des données détails*/
        insert into t_paies_det ( paie_a, paie_m, emp_id, paie_sec, rbq_id, rbq_base, rbq_cnt, rbq_amt, rbq_rate)
        values (:paie_a, :paie_m, :emp_id, :paie_sec, :rbq_id, :rbq_base, :rbq_cnt, :rbq_amt, :rbq_rate);
        g_imp= cnt_g_imp;
        g_n_imp= cnt_g_n_imp;
        suspend;
       end
    end
    si j'exécute la procédure, le paramètre g_imp doit me rendre cnt_g_imp, donc je dois trouver moins la valeur rbq_amt qui représente le salaire de base, le problème est que rbq_amt contient vraiment la valeur mais des que je l'ajoute a l'ancienne valeur de cnt_g_imp j'obtiens un résultat nul. quant à l'insertion dans la table t_paie_det, la variable rbq_amt est inserée correctement.

    j'ai désactivé la ligne /*rbq_amt= rbq_cnt*rbq_base;*/ dans le bloque de test sur la rubrique '1000' et j'ai initialisé la variable rbq_amt a la valeur voulue dans la partie initialisation des variables, la quand j'exécute tout marche bien! j'ai pas pu expliquer ce problème

    Quelqu'un a une idée ? merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 633
    Billets dans le blog
    65
    Par défaut
    Bonjour , je me permets de te souhaiter la Bienvenue sur le forum

    Ma question sera simple :
    Comment est déclaré rbq_amt ?

    Je crains que cela soit quelque chose du genre NUMERIC(x,2) de même que les deux valeurs rbq_cnt et rbq_base .
    Or, la multiplication de ces deux valeurs fourniras un NUMERIC(x,4) d'où une possibilité non négligeable de 'Numeric overflow' et/ou d'une perte de précision
    il est recommandé de transtyper pour éviter ces problèmes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Valeur:=CAST(CAST(valeur1 AS DOUBLE PRECISION) * CAST(valeur2 AS DOUBLE PRECISION) AS NUMERIC(18,2))
    peut être ceci explique le pourquoi de
    j'ai désactivé la ligne /*rbq_amt= rbq_cnt*rbq_base;*/ dans le bloque de test sur la rubrique '1000' et j'ai initialisé la variable rbq_amt a la valeur voulue dans la partie initialisation des variables, la quand j'exécute tout marche bien! j'ai pas pu expliquer ce problème

  3. #3
    Membre éclairé Avatar de khaled-benloucif
    Inscrit en
    Octobre 2008
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Octobre 2008
    Messages : 74
    Par défaut
    bonjour, je vous remercie pour votre réponse. j'ai trouvé hier la réponse à mon problème. les variables contenues dans les bloques begin end changeaient de valeur à cause de la clause . en réalité j'ai ajouté ce champ pour imposer l'ordre dans le quel je calcul les valeurs finales des rubriques de paie. je sais pas pourquoi ce order by a cet effet ! ! !

    pour le type j'utilise float carrément! le résultat de la multiplication est exacte, mais tout de même il est affiché sur 3 positions après la virgule et moi en revanche je veux que deux, plus précisément arrondir les deux derniers chiffres
    exemple: 10.256 devient 10.26. je sais pas s'il faut basculer vers le type numeric ou garder le float ! cast(rbq_xxx as numerix(x, 2)) semble fonctonner bien avec float

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 22/09/2009, 21h00
  2. Variables qui perdent leur valeur lorsqu'utilisées dans fonction
    Par damlarumeur dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/02/2009, 09h05
  3. Echec de stockage d'une valeur dans une variable locale pointée par EBP
    Par homeostasie dans le forum x86 32-bits / 64-bits
    Réponses: 1
    Dernier message: 16/12/2008, 13h52
  4. Variables de session qui changent de valeur
    Par webtheque dans le forum Langage
    Réponses: 1
    Dernier message: 17/09/2008, 19h40
  5. Réponses: 2
    Dernier message: 08/04/2007, 22h24

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