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

Cobol Discussion :

Récupérer la partie entière d'un montant


Sujet :

Cobol

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2007
    Messages : 27
    Points : 40
    Points
    40
    Par défaut Récupérer la partie entière d'un montant
    Bonjour,

    Je dois mettre un montant dans une chaîne de caractères comme cela :

    Déclaration des données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    01 A                   PIC 9(4)V9(2).
    01 WS-PART-ENT PIC 9(4).
    01 WS-PART-DEC PIC 9(2).
    01 B                   PIC X(7).
    Voila ce que je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    COMPUTE WS-PART-ENT = FUNCTION INTEGER (A)
    COMPUTE WS-PART-ENT = FUNCTION FRACTION-PART (A)
    STRING WS-PART-ENT "," WS-PART-DEC DELIMITED BY SIZE INTO B
    A la compilation, il me dit qu'il ne connaît pas FRACTION-PART.

    Quelqu'un connaîtrait-il un autre nom de fonction qui me donne la partie décimale ?

    Merci pour votre réponse

  2. #2
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 60

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 62
    Points
    62
    Par défaut
    Bonjour,

    La fonction FRACTION-PART existe bien sous Microfocus.
    Tu tournes sous quoi ?

    Sinon, tu peux faire ton montant moins la partie entière et tu colle le résultat dans WS-PART-DEC.

    Tu peux aussi décrire B de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    01 B.
      05  B-NUM PIC 9999,99.
    Puis
    Il faut t'assurer que tu as DECIMAL-POINT IS COMMA dans SPECIAL-NAMES

    Bye

  3. #3
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    677
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 677
    Points : 638
    Points
    638
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    01 A PIC 9(4)V99.
    01 AR REDEFINES A.
       05 A-ENT  PIC 9(4).
       05 A-DEC  PIC 99.
    grâce à cette description, aucune instruction n'est necessaire pour
    obtenir A-ENT et A-DEC à partir de A

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 362
    Points : 419
    Points
    419
    Par défaut
    La dernière solution de Fred RATEL est plus simple à mon avis, mais attention à ne pas oublier le V dans le picture d'édition (B-NUM, qui d'ailleurs n'a pas besoin de deux niveaux) :
    En WORKING :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    01 A        PIC 9(04)V9(02).
    01 B-NUM    PIC 9(04)V,9(02).
    Sinon, le cadrage ne se fera pas sur la virgule virtuelle (division par 100).

  5. #5
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 60

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 62
    Points
    62
    Par défaut
    Salut Fremen,

    D'acord pour le niveau unique.

    Pour la présence de la virgule virtuelle, c'était vrai auparavant.
    Certains compilateurs sont de nos jours + permissifs.
    Le "V" joint à la "," peut donc être omis avec COBOL sous Microfocus.

    A tester sur d'autres compilateurs !

  6. #6
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Points : 4 155
    Points
    4 155
    Par défaut
    Bonjour.

    La méthode proposée par HRS est la technique utilisée d'habitude. Elle est valable quelque soit le niveau ou la version du Cobol et sa "permessivité" à partir du moment où il respecte l'ANS 74. Le redefines évite le Move. Le cadrage sur la virgule se fait quand la zone num est initialisée (ou remplie/renseignée) par un move ou un résultat de calcul.

    Bonne journée.

  7. #7
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 60

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 62
    Points
    62
    Par défaut
    Désolé, mais il faut bien un MOVE pour répondre à la demande initiale qui est de mettre un numérique décimal dans une zone numérique display (avec virgule physique et non plus virtuelle).

    Par contre, pour identifier la partie entière et la partie décimale sans passer par des fonctions, OK pour la solution avec redefines.

  8. #8
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Points : 4 155
    Points
    4 155
    Par défaut
    Salut Fred.

    J'ai bien dit :
    Citation Envoyé par Hédhili Jaïdane Voir le message
    ... Le cadrage sur la virgule se fait quand la zone num est initialisée (ou remplie/renseignée) par un move ou un résultat de calcul...
    Je précise en reprenant la question précise de Petit_scarabé et l'exemple qu'il donne en le modifiant.
    ...
    Déclaration des données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    01 A PIC 9(4)V9(2).
    01 AX REDEFINES A.
        03 WS-PART-ENT PIC 9(4).
        03 WS-PART-DEC PIC 9(2).
    01 B PIC X(7).
    ...
    * flagué COMPUTE WS-PART-ENT = FUNCTION INTEGER (A)
    * flagué S'il utilise ici le A, A est donc déjà renseignée
    * flagué COMPUTE WS-PART-ENT = FUNCTION FRACTION-PART (A)

    STRING WS-PART-ENT "," WS-PART-DEC DELIMITED BY SIZE INTO B

    Ceci est valable quelque soit le cobol.

    Mais on peut aussi faire, si l'on veut faire apparaître la virgule sans passer par le string :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SPECIMAL-NAMES. DECIMAL IS COMMA.
    ....
    01 A PIC 9(4)V9(2).
    01 AZ  PIC ZZZ9,99.
    01 B REDEFINES AZ.
    ...
    MOVE A TO AZ.
    ...
    et du coup B contient la zone A formatée avec sa virgule.

    Alors tu vois on n'est pas tellement en désaccord.

  9. #9
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 60

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 62
    Points
    62
    Par défaut
    Salut Hédhili
    Tu avais également dit
    Le redefines évite le Move
    et c'est la dessus que je me suis focalisé.
    A la vue de ta dernière intervention, j'en conclue que l'on est d'accord à 100%.
    Bon WE

  10. #10
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Points : 4 155
    Points
    4 155
    Par défaut
    A tésigue aussi

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2007
    Messages : 27
    Points : 40
    Points
    40
    Par défaut
    Merci pour vos réponses...

    Je sais pas trop sous quel compilateur je travaille car doit pas y en avoir. Je travaille dans une banque et j'ai besoin de mettre le montant dans une phrase pour dire : "Tu gagnes que XXXX,XX ?? Désolé mais on peut pas te préter d'argent..."

    Je vais essayer vos différentes astuces.

    Moi, je me suis plus pris la tête en faisant :

    COMPUTE A = A × 2
    STRING A (1:4) "," A (5,6) REDFINES BY SIZE INTO B

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 362
    Points : 419
    Points
    419
    Par défaut
    Citation Envoyé par Petit scarabé Voir le message
    Je vais essayer vos différentes astuces.

    Moi, je me suis plus pris la tête en faisant [...]
    Je serais très surpris que ça compile !

    Essaye plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    STRING A(1:4) "," A(5:2) DELIMITED BY SIZE INTO B
    Note bien que cette solution ne fonctionne que si A est en format numérique étendu non signé ! Autant dire qu'elle n'est vraiment pas générale...

    P.S. : à quoi sert la multiplication par 2 ?

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 20/04/2009, 11h53
  2. récupérer la partie entière d'un nombre
    Par JauB dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 10/04/2008, 12h47
  3. partie entière supérieure
    Par pmboutteau dans le forum ASP
    Réponses: 3
    Dernier message: 10/03/2005, 10h31
  4. Fonction retournant la partie entière d'un nombre
    Par annedjomo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/11/2004, 15h58
  5. récupérer la partie décimale d’un champ
    Par maouazzani dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/04/2004, 16h10

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