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 :

Alignement à droite


Sujet :

Cobol

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Alignement à droite
    Bonjour,

    Je suis débutant en COBOL et je fais appel à vos services pour pouvoir m'aider sur le problème qui se pose à moi.

    C'est un problème qui me semble fort simple mais je ne vois pas comment le résoudre :
    A un moment de mon programme COBOL je lis dans un fichier en INPUT 7 caractères. Ces caractères représentent un numéro.
    Or ce numéro peut contenir 2 ou 3 ou ... ou 7 chiffres.
    J'ai créé une variable PICTURE X(07) pour stocker cette valeur.
    Le chiffre sera toujours aligné à gauche dans ma variable.

    Par exemple : si le numéro était 73 alors ma variable contiendrait "73#####"
    # correspond à un espace

    Mon problème vient que je voudrais aligner les chiffres sur la droite de ma variable et ainsi obtenir, avec l'exemple précédent :
    "#####73"

    J'ai essayé avec la fonction STRING pour n'extraire que le numéro et pas les espaces mais je ne suis pas parvenu à mes fins : le numéro reste malgré tout aligné à gauche.

    Connaissez-vous une méthode pour les aligner à droite ?

    Merci de vos réponses

  2. #2
    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
    avez vous essayé ?

    PIC X(7) JUSTIFIED RIGHT.

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    J'ai essayé avec la JUSTIED RIGHT et son raccourci JUST mais le résultat est resté le même.
    Pour l'instant j'ai obté pour une autre méthode un peu bourinne qui est de stocker ma variable dans un tableau de dimension 7 et de créer une fonction qui permet de bien décaler vers la droite.

    Mais si vous avez d'autres méthode, je serais bien content de pouvoir l'utiliser afin d'avoir un programme "propre" et "optimisé"

  4. #4
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    La clause JUST RIGHT ne fonctionne que si l'on fait un MOVE d'une zone vers une zone de taille supérieure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    02   A   PIC X(7)
    02   B   PIC X(7) JUST RIGHT
    ...
    MOVE A TO B
    Si A vaut 73##### alors B vaudra 73#####

    tandis que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    02   A   PIC X(7)
    02   B   PIC X(10) JUST RIGHT
    ...
    MOVE A TO B
    Si A vaut 73##### alors B vaudra ########73

    J'ai complètement oublié pourquoi
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Pb alignement en cobol DB2.
    Bonjour,

    Je rencontre le même type de problème : j'ai une variable IDENT, au format PIC X(9) que je move dans un PIC 9(9).

    Ensuite, je souhaite faire le MOVE dans un PIC S9(9).

    A chaque fois je rencontre un problème de cadrage, car il me colle des zéros à la fin. Et évidemment, je veux mes zéros devant.

    Quelqu'un a-t-il une solution ?
    D'avance merci.

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut Justified right
    HRS & Alcatiz,

    tandis que
    Code :

    02 A PIC X(7) 02 B PIC X(10) JUST RIGHT ... MOVE A TO B

    Si A vaut 73##### alors B vaudra ########73
    Si mes souvenirs cobolistiques sont bons, sans vouloir t'offenser, je ne crois pas que ça marche
    car je pense que c'est toute la zone de 7 caractères qui sera cadrée à droite, c'est à dire avec les 5 blancs qui suivent 73 et 3 blancs qui le précèdent :

    Si A vaut 73##### alors B vaudra ###73#####

    Maintenant, je n'ai pas de solution miracle et la méthode appelée "bourrine" par David_Prog est probablement correcte. J'aurais essayé également avec une clause "occurs 7 depending on", mais je crois pas que ce soit mieux. Désolé.

  7. #7
    Membre éclairé Avatar de Peut-êtreUneRéponse
    Homme Profil pro
    IT Specialist - IBM Z
    Inscrit en
    Décembre 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : IT Specialist - IBM Z
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 548
    Points : 801
    Points
    801
    Par défaut
    Peut-être que le mieux dans ce cas est de:

    compter le nombre d'espace dans la variable (ID-1) et d'enregistrer le resultat dans une variable (W-CPT):

    Code Ligne 1 : Sélectionner tout - Visualiser dans une fenêtre à part
    INSPECT ID-1 TALLYING W-CPT FOR ALL SPACES

    Ensuite on récupère la position de la partie sans espace dans une variable (W-POS):

    Code Ligne 2 : Sélectionner tout - Visualiser dans une fenêtre à part
    COMPUTE W-POS = LENGTH OF ID-1 - W-CPT

    Puis on déplace la partie sans espace dans une variable en PIC 9(7) (W-PIC9-7)

    Code Ligne 3 : Sélectionner tout - Visualiser dans une fenêtre à part
    MOVE ID-1 (1:W-POS) TO W-PIC9-7

    Avec ton exemple,
    ID-1 = "73#####"
    Ligne 1 --> W-CPT = 5 (5 espaces)
    Ligne 2 --> W-POS = 7 - 5 = 2
    Ligne 3 --> ID-1 (1:2) = "73", W-PIC9-7 = "0000073"

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 13
    Points : 16
    Points
    16
    Par défaut alignement
    Voici la solution :
    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
     WORKING-STORAGE SECTION.
      01   ZONE   PIC  X(12) VALUE SPACES.
      01   CTR    PIC  99    VALUE 0.
      01   RESU   PIC  X(12). 
      01   ZE     VALUE "123456789".
        03  E OCCURS 9  PIC X.
     PROCEDURE       DIVISION.
    * cadrage num à gauche sans zeros non signif pour nbrs entiers  
     DEB. 
    *  zones numériques pour test *
           MOVE "000002459000" TO ZONE PERFORM  CAD-G.
           MOVE "001000200011" TO ZONE PERFORM  CAD-G.
           MOVE "000000000012" TO ZONE.      
     CAD-G.       
           UNSTRING ZONE delimited by E(1) or E(2) or E(3) or E(4) or E(5) 
           or E(6) or E(7) or E(8) or E(9)
           INTO RESU COUNT CTR.
    *       DISPLAY RESU.
    *       DISPLAY CTR. 
           ADD 1 TO CTR
           MOVE SPACES TO RESU
           UNSTRING ZONE INTO RESU WITH POINTER CTR.
    *      DISPLAY RESU.
    salut
    Valmi32 :

  9. #9
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    cf. exemple de solution possible par utilisation des référence modifiers : post sur suppression des zéro non significatifs et aligmt gauche auquel je viens de répondre. Il suffit de calculer les longueurs par un INSPECT par exemple.
    On peut utiliser les reference modifiers (norme ANSI 85) pour la zone d'origine ou/et la zone receptrice (MOVE DATA1 (début1:longueur1) to DATA2(début2:longueur2).
    Nb. Dans ce cas, COBOL gére les zones comme si elles avaient été déclarées en pic X.

  10. #10
    Futur Membre du Club
    Inscrit en
    Octobre 2003
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 5
    Points : 7
    Points
    7
    Par défaut
    Si tu utilises Cobol 3, il y a des fonctions internes qui te permettent de résoudre ton problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CHAMP-X  PIC X(07) Value '17       '.
    CHAMP-N  PIC 9(07).
    ...
    MOVE FUNCTION NUMVAL(CHAMP-X)                
                                           TO CHAMP-N.
    -> CHAMP-N devrait contenir 0000017.

  11. #11
    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.

    Idem pour le ILE.

  12. #12
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    Précisions peut être utile à propos du vocable COBOL 3

    COBOL 1 fait référence à COBOL norme ANSI 74 (après norme ANSI 68)
    COBOL 2 fait référence à la norme ANSI 85.
    On parle usuellement de COBOL 3 pour l'apport des fonctions intinsèques (ISO 89, complément norme ANSI 85).

    Je ne suis pas compétant pour les autres plates formes que les mainframe IBM et des compléments m'interessent !

    Pour ceux qui travaillent en z/OS, on attend toujours que COBOL (Enterprise COBOL pour le compilateur actuel) intègre les apports de la norme ANSI 2002.
    Plusieurs pages de nouveautés qu'il serait trop long de développer.
    Certes certaines, comme la généralisation de la gestion du siècle dans les dates sont intégrées, d'autres comme la possibilité de commentaires sur la ligne COBOL (ce ne serait pas du luxe), manquent encore à l'appel.
    Enfin toujours pour COBOL z/OS, a partir du moment ou on dispose d'un compilateur 'COBOL 3', on dispose aussi des routines de service Language Environnement, (L.E. pour les intimes), interface avec l'OS, indépendent du langage.
    4 intérets essentiels :
    - On dispose d'un code retour si la zone communiquée est invalide (on peut éviter facilement les si classiques ABENDS S0C7)
    - On dispose de masques de restitution (d'une date/heure par exemple avec un grand choix de format)
    - On peut avoir un niveau de précision souvent supérieur (pas seulement dans les fonctions de calcul. Par exemple on à l'heure en centièmes de secondes avec la fonction DATE, en millièmes avec la routine de service L.E. 'CEELOCT'
    - On dispose de possibilités que n'offrent pas les fonctions (acquisition et libération dynamique de mémoire, opérations booléennes (norme ANSI 2002 pourtant), et j'en passe pour faire (un peu) court.
    Une (presque) dernière remarque, je trouve la documentation L.E. mieux faite que la doc Enterprise COBOL. Au moins est elle riche en exemples concrets.
    Enfin, pour ceux qui objecteraient d'éventuels problèmes de performances, j'ajouterai qu'un appel de fonction COBOL tout comme certaines opérations un peu complexes (hors opérateurs usuels +,-,/,*) génèrent aussi des CALL à des routines externes similaires. Donc pas d'états d'ames à avoir.
    Bref, L.E. pour ceux que ça intéresse, saine lecture, avec éventuellement de nouvelles possibilités pour COBOL.

  13. #13
    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 Homer-ac Voir le message
    Bref, L.E. pour ceux que ça intéresse, saine lecture, avec éventuellement de nouvelles possibilités pour COBOL.
    Merci Homer-ac pour toutes ces infos. Tu ne veux pas mettre le lien sur le forum pour faciliter la lecture de la communauté ?

  14. #14
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    Les Documentations L.E. et COBOL IBM dépendent bien entendu de la version z/OS installée, à choisir via le lien suivant :
    http://www-03.ibm.com/servers/eserve...y/library.html
    ensuite L.E. Programming référence en particulier.

  15. #15
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    C'est simple :
    UNSTRING ZONE-ALPHA DELIMITED BY SPACES INTO ZONE-NUM

    Et ça marche

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

Discussions similaires

  1. tableau aligné à droite et CSS
    Par MicroPuce dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 07/09/2010, 16h10
  2. Aligner à droite la dernière ligne
    Par Ange44 dans le forum Mise en forme
    Réponses: 4
    Dernier message: 25/05/2008, 17h06
  3. Div align à droite sort de l'écran
    Par dadzz77 dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 08/10/2007, 17h17
  4. Tableau, colonne alignée à droite
    Par progfou dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 7
    Dernier message: 21/05/2006, 17h09
  5. listbox alignement à droite
    Par Tymk dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/11/2005, 19h56

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