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 :

Concaténation chaîne de caractères


Sujet :

Cobol

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 489
    Points : 171
    Points
    171
    Par défaut Concaténation chaîne de caractères
    Bonjour,

    Je pensais que la fonction STRING servait à concaténer des valeurs ....

    Visiblement c'est pas le cas, ou alors je l'utilise très mal. Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    STRING                  
     W-VAR21                
     DELIMITED BY SPACES    
                            
     W-LIMIT                
     DELIMITED BY SIZE      
                            
     W-VAR00(1:18)          
     DELIMITED BY SPACES    
                            
     INTO W-VAR21           
     END-STRING
    pour chaque valeur, je passe dans ce paragraphe et je veux ajouter ma nouvelle valeur à celle qui existe ...or le résultat que j'obtiens, est que ma nouvelle valeur (W-VAR00(1:18) ) remplace celle qui existe (W-VAR21)
    Quelqu'un pourrait-il m'expliquer comment faire ?

    D'avance merci.

  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
    Salut,

    Cela fonctionne très bien sur Microfocus, il faut toutefois que ta zone w-var21 soit correctement initialisée.

  3. #3
    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
    Quelle est la PICTURE de W-VAR21 ?

    Si PIC X(05) et que tu y "string" du PIC X(20), elle fera toujours du PIC X(05)
    .

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 489
    Points : 171
    Points
    171
    Par défaut
    ma variable W-VAR021 est un PIC X(170)

  5. #5
    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 vince29 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     W-VAR00(1:18)          
     DELIMITED BY SPACES
    Tu es sûr de "BY SPACE" ? W-VAR00 est cadrée à gauche ou à droite ?

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 489
    Points : 171
    Points
    171
    Par défaut
    W-VAR00 est cadré à droite

    le :
    correspond à ma variable que je veux ajouter dans ma variable finale : W-VAR00

  7. #7
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Faudrait nous expliquer en clair ce que tu veux faire précisément ...

    Et je suis d'accord avec "fremen167", le "BY SPACE" me semble étrange surtout si ta variable est cadrée à droite ...

  8. #8
    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 vince29 Voir le message
    W-VAR00 est cadré à droite

    le :
    correspond à ma variable que je veux ajouter dans ma variable finale : W-VAR00
    Si j'ai bien compris, ce sujet est la suite de celui que tu as ouvert sur la fonction STRING + suppression des zéros.

    Si tel est le cas, ton STRING doit juste ajouter un délimiteur (W-LIMIT), puis rien puisque la variable, étant cadrée à droite, commence par un SPACE (sauf si > 99 999 999 999 999 999), et donc le DELIMITED BY SPACE fait que rien n'est inséré dans le résultat. Et encore à condition que W-VAR21 soit initialisée avec des SPACE.

    Sinon, comme le dit très justement Luc Orient, il faut nous en montrer + si tu veux de l'aide...

  9. #9
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 489
    Points : 171
    Points
    171
    Par défaut
    Effectivement il s'agit de la suite de premier post que j'avais déposé.

    Voila ce que fai mon traitement :
    Je lis un tableau et pour chaque valeur du tableau (chaine de caractère sur 18) je passe dans un paragraphe "FORMAT-00" afin de concaténer ma variable issue du tableau à celle de sortie.

    Mon paragraphe FORMAT-00 me permet de récupérer seulement la partie significative de ma variable (suppression des zéros devant)

    Donc si je suis ce que tu me dit, je devrai avoir comme code qqch du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    STRING               
     W-VAR00(14:5)       
                         
     W-LIMIT             
     DELIMITED BY SIZE   
                         
     INTO W-VAR21        
     END-STRING

  10. #10
    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 vince29 Voir le message
    Effectivement il s'agit de la suite de premier post que j'avais déposé.

    Voila ce que fai mon traitement :
    Je lis un tableau et pour chaque valeur du tableau (chaine de caractère sur 18) je passe dans un paragraphe "FORMAT-00" afin de concaténer ma variable issue du tableau à celle de sortie.

    Mon paragraphe FORMAT-00 me permet de récupérer seulement la partie significative de ma variable (suppression des zéros devant)

    Donc si je suis ce que tu me dit, je devrai avoir comme code qqch du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    STRING               
     W-VAR00(14:5)       
                         
     W-LIMIT             
     DELIMITED BY SIZE   
                         
     INTO W-VAR21        
     END-STRING
    Pas tout-à-fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     STRING
        W-VAR21
        DELIMITED BY SPACE
    
        W-VAR00(14:5)
        W-LIMIT
        DELIMITED BY SIZE
    
        INTO W-VAR21
     END-STRING

  11. #11
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 489
    Points : 171
    Points
    171
    Par défaut
    Ok je vais essayer avec le code que tu as indiqué.
    Pour info, il faut savoir que W-LIMIT est égal à un espace, afin que la variable W-VAR21 contienne chaque valeur séparée d'un espace

    C'est peut-être pas une bonne idée cet espace ?

  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 vince29 Voir le message
    Ok je vais essayer avec le code que tu as indiqué.
    Pour info, il faut savoir que W-LIMIT est égal à un espace, afin que la variable W-VAR21 contienne chaque valeur séparée d'un espace

    C'est peut-être pas une bonne idée cet espace ?
    C'est sûr que ce n'est pas une bonne idée

    Comment veux-tu que le STRING différencie ce SPACE de ceux qui sont en fin de chaîne ?

    Tu peux contourner ce problème de deux manière :
    1) mettre un DELIM à "/" par exemple (comme je te l'avais conseillé au début) ;
    2) le laisser à SPACE, mais modifier ton code de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    STRING
        W-VAR21
        DELIMITED BY "  "
    
        W-VAR00(14:5)
        W-LIMIT
        DELIMITED BY SIZE
    
        INTO W-VAR21
     END-STRING
    J'ai mis deux espaces entre les guillements, donc le STRING ne s'arrêtera pas sur les espaces simples de séparation.

  13. #13
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 489
    Points : 171
    Points
    171
    Par défaut
    Effectivement, l'espace comme séparateur était une mauvaise idée.

    En utilisant le code que tu m'a fourni + un délimiteur "/", ça fonctionne tout de suite mieux.

    Encore merci.

  14. #14
    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
    Citation Envoyé par fremen167 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    STRING
        W-VAR21
        DELIMITED BY "  "
    
        W-VAR00(14:5)
        W-LIMIT
        DELIMITED BY SIZE
    
        INTO W-VAR21
     END-STRING
    J'ai mis deux espaces entre les guillements, donc le STRING ne s'arrêtera pas sur les espaces simples de séparation.
    Nota Bene :

    J'aurais utilsé le mot réservé SPACE plutôt que le nom donnée W-LIMIT et conservais le DELIMITED BY SPACE:


    .

  15. #15
    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 Peut-êtreUneRéponse Voir le message
    Nota Bene :

    J'aurais utilsé le mot réservé SPACE plutôt que le nom donnée W-LIMIT et conservais le DELIMITED BY SPACE:

    .
    Salut Peut-êtreUneRéponse,

    Je n'ai pas bien compris ce que tu proposes : le problème est d'éviter la confusion entre le simple SPACE comme délimiteur, et les SPACES de fin de chaîne réceptrice. Comment veux-tu que ça fonctionne avec un DELIMITED BY SPACE ?

    De plus, j'ai un doute sur l'interprétation par COBOL du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    STRING ....
    SPACE DELIMITED BY SIZE
    Comment définir la taille de "SPACE" qui peut signifier n blancs ?

  16. #16
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Citation Envoyé par fremen167 Voir le message
    ... De plus, j'ai un doute sur l'interprétation par COBOL du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    STRING ....
    SPACE DELIMITED BY SIZE
    Comment définir la taille de "SPACE" qui peut signifier n blancs ?
    Il n'y a plus de doute à avoir, il suffit de lire la doc ...

    The length of a figurative constant depends on the context of its use. The following rules apply:


    When a figurative constant is specified in a VALUE clause or associated with a data item (for example, when it is moved to or compared with another item), the length of the figurative constant character-string is equal to 1 or the number of character positions in the associated data item, whichever is greater.

    When a figurative constant, other than the ALL literal, is not associated with another data item (for example, in a CALL, INVOKE, STOP, STRING, or UNSTRING statement), the length of the character-string is one character.
    Source :
    Figurative constants

  17. #17
    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 Luc Orient Voir le message
    Il n'y a plus de doute à avoir, il suffit de lire la doc ...
    C'est noté, merci M'sieur

    Ceci dit, ça ne répond pas à mon autre question...

  18. #18
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Je n'ai pas regardé le problème en détail (préparation des fêtes oblige ... désolé), mais je préconiserais une solution légèrement différente de celles déjà proposées.

    J'ai déjà programmé (quand j'étais plus jeune !) des choses voisines de la question, à savoir une série de STRING consécutifs (dans une boucle ou pas d'ailleurs) avec comme cible une seule chaîne de caractères et à chaque fois j'ai utilisé une option bien pratique de l'instruction STRING à savoir POINTER.

    L'option POINTER permet de définir la position dans la chaîne réceptrice et la valeur est incrémentée à chaque concaténation des chaînes émetrices.

    Il suffit donc d'initialiser la variable à 1 et de laisser se dérouler les différentes instructions STRING consécutives avec à chaque fois la même option POINTER bien sûr.

    A la fin la variable contient la longueur de la chaine de caractères ainsi constituée augmentée de 1.

    Voilà ...

    STRING statement

  19. #19
    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 Luc Orient Voir le message

    J'ai déjà programmé (quand j'étais plus jeune !) des choses voisines de la question, à savoir une série de STRING consécutifs (dans une boucle ou pas d'ailleurs) avec comme cible une seule chaîne de caractères et à chaque fois j'ai utilisé une option bien pratique de l'instruction STRING à savoir POINTER. [...]
    Oui, j'ai un exemple :

    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
    * INITIALISATION DU COMPTEUR DE LA PARTIE VARIABLE
         MOVE 1                        TO W-L-DATA-IMPACT-POINTER
    * LE FORMATAGE DE LA PARTIE VARIABLE DE L'EVENEMENT EST UNE
    * SUCCESSION DE DONNEES AYANT UNE STRUCTURE DE LA FORME :
    * NUMERO(6 CARACTERES), RANG(2 CARACTERES), LONGUEUR(2 CARACTERES)
    * VALEUR(NOMBRE DE CARACTERES = LONGUEUR) ET UNE ETOILE COMME
    * CARACTERE DE SEPARATION ENTRE LES DONNEES
    *
    * IDENTIFIANT INTERNE DU DOSSIER DE FINANCEMENT
         STRING
            '100220' '00' '17' ZCOM-I-DSR-FNCMNT '*'
            DELIMITED BY SIZE INTO CM00-L-DATA-IMPACT
            WITH POINTER W-L-DATA-IMPACT-POINTER
         END-STRING
    *
    C'est vrai que ça évite d'incrémenter le compteur de position à la main, comme je l'avais fait dans ma première solution (sur la première discussion).

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

    Si je me permets d'ajouter mon grain de sel puisque vince29 travaille en COBOL/400 et que la fête (la mienne) est terminée.

    Le STRING :
    - ne supprime les espaces ou des caractères quelconques du début des zones émettrices contrairement à ce qui a été pensé dans la discussion précédente.
    - il ne fait que concaténer des chaînes de caractères dans la zone réceptrice, elle même peut être considérée comme émettrice.
    - les constantes figuratives en tant que délimiteur sont réduites à 1 seul caractère.
    - la zone réceptrice ne peut pas être une référence modifiée.
    - le transfert se fait caractère par caractère à partir des zones émettrices vers la zone réceptrice selon les règles du MOVE (enfin 1 caractère, on ne va pas chicaner)
    - si DELIMITED by délimiteur est utilisé, ce dernier arrête le transfert dès l'instant où il est rencontré sans qu'il soit lui même transféré.
    - si DELIMITED by SIZE est utilisé, la totalité de la zone est transférée, même si elle contient des nuls binaires (low-value).
    - si WITH POINTER est utilisée, le pointeur doit être un integer de taille suffisante pour contenir la taille de la zone réceptrice + 1 (pour l'overflow). Il doit être initialisé à 1 ou plus mais inférieur à la taille de la zone réceptrice. Il est mis à jour par le système pour contenir l'emplacement du dernier caractère transféré.
    - certains Cobol exigent que la zone réceptrice doit être initialisée avant son utilisation.
    - si des espaces doivent être insérés dans la zone réceptrice, il faut qu'ils soient dans le STRING.

    PS : Tout ça est du vecu de tous les jours.

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

Discussions similaires

  1. Concaténation chaînes de caractères
    Par kedmard dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 22/03/2012, 12h15
  2. [MySQL] concaténation chaîne de caractères : exclusion de certains caractères
    Par johnlito dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 04/01/2012, 15h41
  3. [iTEXT] concaténation chaîne de caractére et variable
    Par jeremlerugbyman dans le forum Documents
    Réponses: 1
    Dernier message: 06/05/2010, 08h53
  4. [WD10] Erreur concaténation chaîne de caractères
    Par COLOMBAT dans le forum WinDev
    Réponses: 6
    Dernier message: 20/04/2010, 10h28
  5. concaténation, chaîne de caractères
    Par bul dans le forum C++
    Réponses: 8
    Dernier message: 28/02/2005, 07h03

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