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

Langage Delphi Discussion :

IF THEN ELSE et fiscalité


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 26
    Points : 14
    Points
    14
    Par défaut [résolu] IF THEN ELSE et fiscalité
    Bonjour tout le monde,

    Je suis actuellement en train de developper un petit programme de fiscalité.
    Il s'execute normalement par contre ce sont les résultats qu'il me sort qui sont éronés...
    Je m'explique, le but de l'application est d'effectuer 2 opérations simple :

    - Déterminer le résultat d'une cession d'un bien (dans une entreprise)
    Il est égal au prix de cession - (prix d'achat - amortissement effectués).
    Le résultat est donc soit une plus value soit une moins value.
    - Donner une requalification fiscal à la cession ===> la +ou-value est soit à court terme soit à long terme.
    NB : un bien peut etre soit amortissable soit non amortissable. L'utilisateur
    coche ou non un checkbox"bien non amortissable"

    Mon probleme est que qqsoient mes entrées, la requalification me donne toujours du court terme. Je soupsonne mon imprication de de blocs if then else avec les pts virgules.
    je sais que la structure c'est :
    If condition then
    begin
    truc
    end
    else
    begin
    truc2
    end ;

    mais quand yen a plusieurs les uns ds les autres je m'enmelle....
    Voici le code en question :


    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
    if per < 730 then     // on vérifie la durée de détention par rapport à 2ans
          begin
             qualif2 &#58;= 'Court Terme' ;
          end
                     else
          begin
             if checkbox1.Checked = false then
               begin
                  if rc > 0 then
                     begin
                        if rc > a then
                           begin
                               pvalct &#58;= a ;
                               pvallt &#58;= rc-a ;
                               qualif2 &#58;= 'Court terme et à long terme' ;
                           end
                                  else
                           begin
                               qualif2 &#58;= 'Court Terme' ;
                           end ;
                      end
                            else
                     begin
                        qualif2 &#58;= 'Court terme' ;
                     end ;
               end
     
                                         else
               begin
                  qualif2 &#58;= 'Long Terme' ;
               end ;
          end ;
        edit12.Text &#58;= qualif2  ;
    Voilà je sais que c'est chiant mais merci d'avance

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    J'ai reformatté le code pour le rendre plus lisible.
    On a "court terme" dans les 2 cas suivants :

    1) per inférieur à 730
    2) amortissable("non amort." checked) ET rc compris entre 0 et a.

    Le plus simple pour résoudre ce genre de problème et bien d'autres est d'utiliser le debugger en pas à pas pour voir les instructions executées et les valeurs des variables.

    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
     
    if per < 730 
       then  begin   // on vérifie la durée de détention par rapport à 2ans 
               qualif2 &#58;= 'Court Terme' ; 
               end 
       else begin 
              if checkbox1.Checked = false 
                 then begin 
                        if rc > 0 
                           then begin 
                                  if rc > a 
                                     then begin 
                                            pvalct &#58;= a ; 
                                            pvallt &#58;= rc-a ; 
                                            qualif2 &#58;= 'Court terme et à long terme' ; 
                                            end 
                                     else  begin 
                                             qualif2 &#58;= 'Court Terme' ; 
                                             end ; 
                                   end 
                           else  begin 
                                   qualif2 &#58;= 'Court terme' ; 
                                   end ; 
                        end 
                 else begin 
                       qualif2 &#58;= 'Long Terme' ; 
                       end ; 
              end ; 
    edit12.Text &#58;= qualif2  ;
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    merci pour le message graffito.

    pour per < 730 c'est normal mais quand la case est coché ça doit etre du "long terme".

    Pour le mode pas à pas je ne comprends pas bien car le debuggeur lit une par une les lignes du prog lors de son initialisation et apres l'application se lance et le mode devient inutilisable.

    Dans ma structure d'embriquement ce qui me gene c'est je sois obligé de mettre apres "end ; " un autre "end" et je pense que c'est là que ça coince mais si je le mets pas le programme ne s'execute pas car selon lui il n'ya jamais de ";" avant un "else"....

  4. #4
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    740
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 740
    Points : 500
    Points
    500
    Par défaut
    salut ..
    a chacun sont mode d'indentation .. çà me semble correct ..
    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
     
      if per < 730 then   // on vérifie la durée de détention par rapport à 2ans
      begin
          qualif2 &#58;= 'Court Terme' ;
      end
      else
      begin
         if checkbox1.Checked = false then
         begin
             if rc > 0 then
             begin
                 if rc > a then
                 begin
                     pvalct &#58;= a ;
                     pvallt &#58;= rc-a ;
                     qualif2 &#58;= 'Court terme et à long terme' ;
                 end
                 else
                 begin
                     qualif2 &#58;= 'Court Terme' ;
                 end; // fin Rc>a
             end
             else
             begin
                  qualif2 &#58;= 'Court terme' ;
             end ;  // fin Rc >0
         end
         else
         begin
                 qualif2 &#58;= 'Long Terme' ;
         end ; // fin checkbox
      end ; // fin per
      edit12.Text &#58;= qualif2  ;
    bye
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  5. #5
    Membre averti
    Avatar de Hauwke
    Inscrit en
    Septembre 2005
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 329
    Points : 400
    Points
    400
    Par défaut
    Bonsoir,
    Bon, je vais te faire de la peine, mais tu peux tout reprendre
    Tout d'abord, la structure d'une boucle, comme tu l'as justement dit, est IF.. THEN.. ELSE on imbrique pas plusieurs ELSE à la suite, le système ne le traitera pas. Ensuite, un bloc "Begin .. End" n'est là que pour obliger le système à traiter une suite d'instructions; il est inutile d'alourdir le code avec des "Begin.. end" partout. Dans ton code, que je n'arrive même pas à lire la seule vraie suite d'instruction que le système doit impérativement éffectuer dans son ensemble est celle ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    begin 
                               pvalct &#58;= a ; 
                               pvallt &#58;= rc-a ; 
                               qualif2 &#58;= 'Court terme et à long terme' ; 
                           end
    et uniquement si rc>0 et par voie de conséquence si rc>a! Première remarque, une ligne de code qui vérifie directement que a est > 0 évitera une redondance de la boucle ou bien il manque le traitement du cas rc<a dans ton code!
    Enfin, ton code va d'abord vérifier et traiter ta condition la plus imbriquée avant de traiter le début. Autrement dit, il agit comme avec des poupées gigognes mais en commencant par la plus petite, celle qui est dans le corps de toutes les autres. C'est logique pour lui et illogique pour nous! En fait c'est bien logique sur une condition "if .. then.." puisque le code ne s'éxécute que si les conditions sont remplies! Il faut donc que le code vérifie la condition la plus imbriquée afin de déterminer si il doit éxécuter les lignes de condition ou pas. C'est d'ailleurs la source de toutes les erreurs sur ce type de traitement. Enfin, il y a une gouttière logique dans ton code, il me semble qu'un petit tour vers les tutoriels de ce forum, notamment celui sur la récurcivité pas à pas te serait des plus profitables pour le cas qui t'occupe. Les boucles sont difficilement maintenables dans le temps or les conditions d'amortissement sont directements liées à une situation comptable suceptible de changer d'un jour à l'autre au grés et humeurs de nos trés chers dirigeants! Les nouvelles directives européennes vont jetés ton code aux oubliettes en deux coups les gros puisqu'il va être permis de gérer les plans comptables anglo-saxon d'ici 2007 en France pour n'importe quelle entreprise. De fait, refonte de ton code prévue avant mm que la phase de déploiement soit achévée puisqu'en plan comptable "Anglo-saxon" on amortit pas, on budgéte un remplacement sur la valeur totale du bien!
    Bon courage en tout cas
    Cordialement,
    Hauwke

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    bonjour,

    oui je m'en doutais , toute la partie est à refaire. Cependant il y a quelque chose que je ne comprend pas car tu dis que le seul bloc qui s'execute impérativement est celui avec "court terme et long terme" comme réponse or justement le prog ne me sort jamais cette réponse.
    au fait pour les variables pvalct et pvallt, on peut les oublier, elles ne servent pas ici.

    Première remarque, une ligne de code qui vérifie directement que a est > 0 évitera une redondance de la boucle ou bien il manque le traitement du cas rc<a dans ton code!
    J'ai un controle en début de prog pour voir si la checkbox et cochée si c'est le cas : a = 0. Mais à ta remarque je ne comprend pas pourquoi il y aurait une redondance néfaste puisque ce ne sont pas des boucles. Il ya 2 tests successifs pour savoir si le bien est amortissable : un pour a et l'autre qui constitue un embranchement pour aller + loin.

    Pour les nouveautés de 2007, tu m'apprends qqchose, il va falloir que je me renseigne...

    Au fait, ce schéma de traitement n'est valable que pour le cas général, j'avais prévu pour la suite de faire les cas particulier mais ça sera donc plus complexe....Y'aurait-il un autre moyen de traiter ça sans passer par ces IF then else ?


    Mais c'est quand meme dingue d'avoir autant de complication pour un simple organigramme avec 5 sorties possible !

    Je fournis le code précèdant les IF :
    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
     
    if checkbox1.Checked = true then
        begin
           a &#58;= 0 ;
           qualif2 &#58;= 'long terme' ;
        end
        else
        begin
           a &#58;= strtofloat &#40;edit3.Text&#41; ;  // entrée possible des amortissements
        end ;
        pc &#58;= strtofloat &#40;edit1.Text&#41; ;    // prix de cession
        vb &#58;= strtofloat &#40;edit2.Text&#41; ;   // valeur d'achat
        vc &#58;= vb-a ;
        edit4.Text &#58;= floattostr&#40;vc&#41; ;
        rc &#58;= pc-vc ;                     //  résultat de cession
        edit5.Text &#58;= floattostr&#40;rc&#41; ;
        j1 &#58;= strtoint&#40;edit6.Text&#41; ;     // on entre la date d'acquisition
        m1 &#58;= strtoint &#40;edit7.Text&#41; ;
        an1 &#58;= strtoint &#40;edit8.Text&#41; ;
        j2 &#58;= strtoint &#40;edit9.Text&#41; ;    // ...date de cession
        m2 &#58;= strtoint &#40;edit10.Text&#41; ;
        an2 &#58;= strtoint &#40;edit11.Text&#41; ;
        jtot1 &#58;= j1 + &#40;m1*30-30&#41;+ &#40;an1*365-365&#41; ;   //conversion en nb de jours
        jtot2 &#58;= j2 + &#40;m1*30-30&#41; + &#40;an1*365-365&#41; ;
        per &#58;= jtot2-jtot1 ;                        // durée de détention
    de meme que l'interface :
    [/img]

    merci pour les réponses précèdentes et merci d'avance pour les suivantes

  7. #7
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2003
    Messages : 166
    Points : 206
    Points
    206
    Par défaut
    d'apres les conditions ecrites et sauf erreur pour avoir 'Long Terme' il faut que
    per > 730 et checkbox1.checked = true
    pour avoir 'Court terme et à long terme' il faut que
    per < 730 ou que checkbox1.checked = false et RC >0 et RC >a
    tout les autres cas donnent 'Court Terme'

    petite remarque
    au lieu d'ecrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if checkbox1.Checked = false then
    moi j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if not checkbox1.Checked then
    certe le resultat est le même

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 839
    Points : 11 257
    Points
    11 257
    Billets dans le blog
    6
    Par défaut
    pour éviter des if then else imbriqués, compliqués... quand il y en a beaucoup, une solution utilisable est pê de faire des tests unitaires de conditions avec incrément d'un score, puis un case of sur le score
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if somme>150 then Inc&#40;Score,1&#41;;
    if CheckBox1.Checked then Inc&#40;Score,2&#41;;
    if .....
    case score of
     1 &#58; //
     2 &#58; //
     3 &#58; //
    else //
    end;
    Delphi 5 Pro - Delphi 10.4 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Raaah j'ai trouvé ! :o
    Finalement c'était vraiment tout bete ! une simple erreur d'inattention : la meme variable pour 2 champs différents ("an1" deux fois), ce qui faisait que ma durée de détention était toujours inférieur à 2ans !
    J'ai perdu du temps en pensant que l'erreur était dans les IF..... mais non....
    merci pour les réponses.
    @+

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

Discussions similaires

  1. [Débutant] if...then...else
    Par jive dans le forum ASP
    Réponses: 5
    Dernier message: 16/09/2005, 15h11
  2. [TagLib] Structure if then else
    Par mush_H dans le forum Taglibs
    Réponses: 5
    Dernier message: 19/07/2005, 16h31
  3. If Then Else
    Par Piout dans le forum MS SQL Server
    Réponses: 13
    Dernier message: 24/02/2005, 17h09
  4. IF THEN ELSE imbriqués
    Par nuke_y dans le forum Oracle
    Réponses: 2
    Dernier message: 15/11/2004, 15h57
  5. [CR 7] [débutante] pb avec if then else
    Par xs_nady dans le forum Formules
    Réponses: 8
    Dernier message: 28/05/2004, 16h36

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