1. #1
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    novembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien
    Secteur : Finance

    Informations forums :
    Inscription : novembre 2011
    Messages : 10
    Points : 4
    Points
    4

    Par défaut déconcaténer une zone occursée

    Voici mon problème :

    J'ai en entrée de mon programme un fichier csv dont les données sont séparés par un séparateur point virgule ';' et les données sont de longueurs variables.
    Il faut supprimer les points virgules et mettre les données au format fixe.

    Descriptif du fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    01 NOM    PIC X(20)
    01 PRENOM PIC X(20)
    01 VILLE  PIC X(32)
    01 PAYS   PIC X(10)
    01 NB-ECHEANCE PIC 9(3)
    01 TABLEAU   OCCURS 120
       05 MONTANT   PIC S9(15) COMP-3
       05 DATE      PIC X(8)
    Lorsque la donnée NB-ECHEANCE est valorisée à '003', j'ai la donnée composée TABLEAU renseignée 3 fois


    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    NB-ECHEANCE = 3
    MONTANT(1) = 5642
    DATE(1) = 2010214
    MONTANT(2) = 564897
    DATE(2) = 20170201
    MONTANT(3) = 6598741
    DATE(3) = 20150206

    si mon NB-ECHEANCE est valorisée à '010' alors j'ai les données MONTANT et DATE qui sont renseignées 10 fois.


    Mon objectif est de supprimer les points virgules entre chaque données.

    J'utilise l'ordre UNSTRING avec ENTREE-DATA qui correspond à la totalité de mon enregistrement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UNSTRING ENTREE-DATA delimited by ";"
                         into
                               NOM
                               PRENOM
                               VILLE
                               PAYS
                               NB-ECHEANCE
    END-UNSTRING.
    Mais je ne sais pas comment procéder pour supprimer les points virgules des données occursées MONTANT et DATE en fonction de ce qui est valorisé dans NB-ECHEANCE.

    Merci pour votre aide.

  2. #2
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    novembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien
    Secteur : Finance

    Informations forums :
    Inscription : novembre 2011
    Messages : 10
    Points : 4
    Points
    4

    Par défaut

    Bonjour,

    Avez-vous des pistes à proposer pour le problème posé ?

  3. #3
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 2 974
    Points : 6 533
    Points
    6 533
    Billets dans le blog
    1

    Par défaut

    Bonjour,

    La zone I-O de votre fichier en entrée devrait être décrite comme suit (les fillers permettent d'isoler les séparateurs ";") :
    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
    01  WS-FIC01.
        02 NOM           PIC  X(20).
        02 FILLER        PIC  X(01).
        02 PRENOM        PIC  X(20).
        02 FILLER        PIC  X(01).
        02 VILLE         PIC  X(32).
        02 FILLER        PIC  X(01).
        02 PAYS          PIC  X(10).
        02 FILLER        PIC  X(01).
        02 NB-ECHEANCE   PIC  9(03).
        02 TAB01 OCCURS 120.
           05 TAB01-MT   PIC S9(15) COMP-3.
           05 FILLER     PIC  X(01).
           05 TAB01-DT   PIC  X(08).
           05 FILLER     PIC  X(01).
    Décrivez ensuite votre fichier de sortie comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    01  WS-FIC02.
        02 NOM           PIC  X(20).
        02 PRENOM        PIC  X(20).
        02 VILLE         PIC  X(32).
        02 PAYS          PIC  X(10).
        02 TAB02 OCCURS 120.
           05 TAB02-MT   PIC S9(15) COMP-3.
           05 TAB02-DT   PIC  X(08).
    Et un complément de WSS pour votre indice et les file-status :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    01  FILLER.
        02 II            PIC S9(4) COMP.
        02 FS-FIC01      PIC X(02).
           88 FS-FIC01-OK   VALUE '00'.
           88 FS-FIC01-EOF  VALUE '10'.
        02 FS-FIC02      PIC X(02).
           88 FS-FIC02-OK   VALUE '00'.
    Ensuite, la procédure division doit ressembler à ceci :
    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
    46
    PROCEDURE DIVISION.
    100-000-PROGRAMME.
        [. . .]
      
        PERFORM  610-LECTURE-FIC01.
    
        PERFORM  120-000-FICHIER
          UNTIL  FS-FIC01-EOF
    
        [. . .]    
    
    
    120-000-FICHIER.
        ADD  1  TO  NB-LEC-FIC01
        MOVE CORRESPONDING  WS-FIC01  TO  WS-FIC02
    
        PERFORM  122-000-ALIMENTER-TABLEAU
            VARYING II FROM 1 BY 1
            UNTIL   II > NB-ECHEANCE
    
        PERFORM 620-ECRITURE-FIC02
        ADD  1  TO  NB-ECR-FIC02
        PERFORM  610-LECTURE-FIC01
        .
    
    122-000-ALIMENTER-TABLEAU.
        MOVE  TAB01-MT(II)  TO  TAB02-MT(II)
        MOVE  TAB01-DT(II)  TO  TAB02-DT(II)
        .
    
    610-LECTURE-FIC01.
        READ FIC01 INTO WS-FIC01
        IF  NOT FS-FIC01-OK
        AND NOT FS-FIC01-EOF
            DISPLAY 'ERR014E erreur lecture FIC01, FS=' FS-FIC01
            PERFORM   980-FIN-ANORMALE
        END-IF
        .
    
    620-ECRITURE-FIC02.
        WRITE FD-ENR-FIC02 FROM WS-FIC02
        IF  NOT FS-FIC02-OK
            DISPLAY 'ERR015E erreur écriture FIC02, FS=' FS-FIC02 
            PERFORM   980-FIN-ANORMALE
        END-IF
        .
    Le "move corresponding" permet d'alimenter l'essentiel du fichier en sortie en se débarrassant des ";", et le perform varying complète pour les données à occurrences

  4. #4
    Membre expert
    Homme Profil pro
    Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    juin 2007
    Messages
    2 008
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

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

    Informations forums :
    Inscription : juin 2007
    Messages : 2 008
    Points : 3 893
    Points
    3 893

    Par défaut

    Bonjour.

    Voilà une solution qui a l'air de fonctionner :
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
           PROCESS CRTF                                                     
    0002   IDENTIFICATION DIVISION.                                         
    0008   PROGRAM-ID. FMONTAROU2.                                          
    0009   AUTHOR. H. JAIDANE.                                              
    0010   ENVIRONMENT DIVISION.                                            
    0011   CONFIGURATION SECTION.                                           
    0012   SOURCE-COMPUTER. IBM-AS400.                                      
    0013   OBJECT-COMPUTER. IBM-AS400.                                      
    0014   SPECIAL-NAMES.                                                   
    0015                  DECIMAL-POINT IS COMMA                            
    0016                  LOCAL-DATA IS LOCALDATA                           
    0017                  REQUESTOR IS MONTERMINAL.                         
    0018   INPUT-OUTPUT SECTION.                                            
    0019   FILE-CONTROL.                                                    
    0020       SELECT FMONTARO11 ASSIGN DISK-FMONTARO11                     
                      ORGANIZATION SEQUENTIAL.                              
    0020       SELECT FMONTARO12 ASSIGN DISK-FMONTARO12                     
                      ORGANIZATION SEQUENTIAL.                              
    0032   DATA DIVISION.                                                   
    0033   FILE SECTION.                                                    
    0051   FD  FMONTARO11.                                                  
    0052   01  FMONTARO11D.                                                 
    0053       03 LIGNE1     PIC X(100).                                    
    0051   FD  FMONTARO12.                                                  
    0052   01  FMONTARO12D.                                                 
    0053       03 NOM2         PIC X(20).                                   
    0053       03 NB-ECHANGEX2 PIC XXX.                                     
    0053       03 NB-ECHANGE2 REDEFINES NB-ECHANGEX2 PIC 999.               
    0053       03 TABLEAU2.                                                 
    0053          05 ELEM2  OCCURS 5.                                       
                     07 MONTANT2  PIC S9(15) COMP-3.                        
                     07 MONTANTX2 REDEFINES MONTANT2 PIC X(8).              
                     07 DATE2     PIC X(8).                                 
    0050   WORKING-STORAGE SECTION.                                         
           77  PTR    pic 9(4) comp-4.                                      
           77  WPTR   pic 9(4) comp-4.                                      
           77  I      pic 9999 comp.                                        
           77  FF     pic X.                                                
    0201   PROCEDURE DIVISION.                                              
    0202  ***************************************************************** 
    0203  *                                                               * 
    0204   TRAITEMENT SECTION.                                              
    0205  *                                                               * 
    0206  ***************************************************************** 
    0209   DEBUT.                                                           
               open input  FMONTARO11                                       
                    output FMONTARO12.                                      
               move 0 to FF.                                                
               perform TRAIT until FF = 1.                                  
                                                                            
           FIN.                                                             
    0210       stop run.                                                    
           TRAIT.                                                           
               read FMONTARO11 at end move 1 to FF.                         
               if FF not = 1 perform TRAIT1.                                
           TRAIT1.                                                          
               MOVE SPACES TO NOM2.                                         
               MOVE 0 TO NB-ECHANGE2.                                       
               INITIALIZE TABLEAU2.                                         
               move 1 to PTR.                                               
               UNSTRING LIGNE1                                              
                   DELIMITED BY ";" INTO NOM2 NB-ECHANGEX2                  
                   pointer PTR                                              
               COMPUTE NB-ECHANGE2 = FUNCTION NUMVAL(NB-ECHANGEX2)          
               move 1 to I.                                                 
               perform until PTR > 100 or I > 5                             
                          or I > NB-ECHANGE2                                
                                                                            
                  unstring LIGNE1                                           
                      delimited by ";"                                      
                      into MONTANTX2(I) DATE2(I)                            
                      pointer PTR                                           
                  end-unstring                                              
                  COMPUTE MONTANT2(I) = FUNCTION NUMVAL(MONTANTX2(I))       
                  add 1 to I                                                
               end-perform.                                                 
               WRITE FMONTARO12D.                                           
          *
    Si tu n'as pas la fonction NUMVAL regarde cette discussion : https://www.developpez.net/forums/d1...e/#post8506076

  5. #5
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 2 974
    Points : 6 533
    Points
    6 533
    Billets dans le blog
    1

    Par défaut

    hum, ce code est quand même pas un exemple à donner :
    - aucun test de file status après les io (open, read, write)
    - il manque les close des fichiers
    - instruction at end inutile, le file status positionne automatiquement la fin de fichier, il n'est donc pas nécessaire d'utiliser un indicateur, au risque de l'oublier
    - un indice sur un seul caractère tel que "i" c'est une vrai galère pour faire une recherche dans le source : tous les mots qui contiennent "i" étant trouvés, l'espace étant facultatif exemple move toto to titi(i)
    C'est pourquoi j'utilise toujours des lettres doubles pour des indices : ii, jj etc...
    - les niveaux 77 sont gérés comme des 01 depuis cobol 2 je crois (voire cobol 85), et donc ils s'alignent sur 8 octet et encombrent inutilement la wss contrairement à ce qui se passait autrefois. Donc à remplacer par un filler 01 puis des variables déclarées en 02 ou + pour "tasser" la working et ainsi économiser de l'espace.
    - les fichiers ne devraient jamais être décrits en FD ni utilisés directement via la FD : il est préférable de ne déclarer qu'un filler en FD puis d'utiliser le READ INTO et le WRITE FROM pour éviter les erreurs et aussi les cancel.
    (seul très rare cas d'exception : le fichier très fortement variable, genre des records de 20 de longs, d'autres de 10000, mais en ce cas il convient d'expliquer pourquoi on déroge à la règle)
    - pourquoi réinventer l'équivalent d'un perform varying en gérant manuellement l'incrément de l'indice, ça n'a pas d'intérêt

  6. #6
    Membre expert
    Homme Profil pro
    Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    juin 2007
    Messages
    2 008
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

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

    Informations forums :
    Inscription : juin 2007
    Messages : 2 008
    Points : 3 893
    Points
    3 893

    Par défaut

    Bonjour.

    Ce que j'ai donné comme programme c'est juste une solution technique à un problème bien précis auquel personne n'a répondu depuis plus une dizaine de jours, tout le reste en termes de normes de production n'avait pour moi aucun intérêt ni pertinence.

  7. #7
    Membre expérimenté Avatar de vttman
    Homme Profil pro
    Développeur COBOL et le WE (CSS, PHP, JS et MYSQL)
    Inscrit en
    décembre 2002
    Messages
    692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur COBOL et le WE (CSS, PHP, JS et MYSQL)
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2002
    Messages : 692
    Points : 1 305
    Points
    1 305

    Par défaut

    Citation Envoyé par escartefigue Voir le message
    hum, ce code est quand même pas un exemple à donner :
    ...
    - un indice sur un seul caractère tel que "i" c'est une vrai galère pour faire une recherche dans le source : tous les mots qui contiennent "i" étant trouvés, l'espace étant facultatif exemple move toto to titi(i)
    C'est pourquoi j'utilise toujours des lettres doubles pour des indices : ii, jj etc...
    - les niveaux 77 sont gérés comme des 01 depuis cobol 2 je crois (voire cobol 85), et donc ils s'alignent sur 8 octet et encombrent inutilement la wss contrairement à ce qui se passait autrefois. Donc à remplacer par un filler 01 puis des variables déclarées en 02 ou + pour "tasser" la working et ainsi économiser de l'espace.
    ...
    - pourquoi réinventer l'équivalent d'un perform varying en gérant manuellement l'incrément de l'indice, ça n'a pas d'intérêt
    Ah ça me fait marrer ça on reconnait la vieille école mais je m'y retrouve ... ws-i,ws-j etc. et perform varying ... OK pour moi ! tiens niveau 77 je ne connaissais pas l'histoire ...

    Bon en tout cas fmontarou devrait s'en sortir avec vos réponses (Hédhili Jaïdane et Escartefigue) et c'est le principal !
    Je suis sympa comme tout Mosellan mais ...
    ... (m')aider ou (me) mettre sur la voie c'est une chose
    ... tout (me) faire de A à Z, c'est pas ma conception du rôle d'un forum X ou Y
    Si vous n'êtes pas satisfait de mes réponses, n'hésitez pas à me le faire savoir Merci !

  8. #8
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 2 974
    Points : 6 533
    Points
    6 533
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par Hédhili Jaïdane Voir le message
    Bonjour.

    Ce que j'ai donné comme programme c'est juste une solution technique à un problème bien précis auquel personne n'a répondu depuis plus une dizaine de jours, tout le reste en termes de normes de production n'avait pour moi aucun intérêt ni pertinence.
    Tester le succès d'une opération d'entrée sortie est un impératif quelque soit le langage et quelques soient les normes de production.

  9. #9
    Membre émérite
    Homme Profil pro
    Ingénieur Exploitation Mainframe
    Inscrit en
    octobre 2005
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Exploitation Mainframe
    Secteur : Finance

    Informations forums :
    Inscription : octobre 2005
    Messages : 1 290
    Points : 2 588
    Points
    2 588

    Par défaut

    Citation Envoyé par Hédhili Jaïdane Voir le message
    Bonjour.

    Ce que j'ai donné comme programme c'est juste une solution technique à un problème bien précis ...
    Tout à fait d'accord avec toi et l'avantage de ta solution, c'est que elle fonctionne, elle ...

    Le reste des remarques d'escartefigues ne reflète que ses lubies habituelles ... FILE STATUS dont on peut largement se passer ... READ INTO qui ne présente aucun intérêt à part consommer du CPU inutilement etc etc

  10. #10
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 2 974
    Points : 6 533
    Points
    6 533
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par Luc Orient Voir le message
    Tout à fait d'accord avec toi et l'avantage de ta solution, c'est que elle fonctionne, elle ...
    La solution que j'ai proposée fonctionne, j'ai pu faire des erreurs de saisie car je ne l'ai pas compilée, mais le principe est opérationnel.
    Sinon démontrez le contraire
    Et préconiser du code qui ne fait aucun test après les entrées-sorties est une aberration ! Qu'on soit en cobol, en SQL ou en n'importe quel autre langage, il est indispensable de vérifier le résultat d'une entrée sortie !

    Citation Envoyé par Luc Orient Voir le message
    Le reste des remarques d'escartefigues ne reflète que ses lubies habituelles ... FILE STATUS dont on peut largement se passer ... READ INTO qui ne présente aucun intérêt à part consommer du CPU inutilement etc etc
    Sauf que :
    - AT END n'est applicable que pour un fichier sequentiel en entrée, inapplicable pour des fichiers en sortie, ni pour des fichiers à accès direct ou random, donc intérêt plus que limité
    - AT END ne gère que la fin de fichier, si vous voulez afficher des infos sur les autres conditions, vous ne l'avez que grâce au file-status
    Alors bien sur on peut continuer à programmer en COBOL comme dans les années 60, on peut se passer de plein de trucs et pas seulement du file status, mais s'est vraiment dommage de s'en priver
    A propos d'années 60 : la présence de section dans la procédure division en est justement un reliquat qui n'a plus guère d'intérêt de nos jours
    A propos de CPU : initialize est justement une instruction couteuse, et qui ne se justifie nullement ici

  11. #11
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    novembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien
    Secteur : Finance

    Informations forums :
    Inscription : novembre 2011
    Messages : 10
    Points : 4
    Points
    4

    Par défaut

    Bonjour,
    Vos solutions ne fonctionnent pas.

    Je ne sais pas si je me suis bien fait comprendre.

    Ci-dessous un exemple de fichiers en entrée de mon traitement :

    durand;jacky;paris;france;2;158745;20170605;4587;20170325
    savidan;patrick;lille;allemagne;0
    dupond;david;barcelone;espagne;1;58964;20150323

    Voici le fichier que je dois avoir en sortie de mon traitement :

    durand jacky paris france 00200000000158745201706050000000000458720170325
    savidan patrick lille allemagn000
    dupond david barcelone espagne 00100000000005896420150323


    1) je dois donc supprimer les caractères points virgules ';' et mettre au format fixe les données
    2) la partie occursée (données montant et date) est valorisée en fonction de la donnée NB-ECHEANCE ; il faut supprimer les ; des données occursées et les mettre au format fixe avec pour les montants les mettre en packés

  12. #12
    Membre expert
    Homme Profil pro
    Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    juin 2007
    Messages
    2 008
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

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

    Informations forums :
    Inscription : juin 2007
    Messages : 2 008
    Points : 3 893
    Points
    3 893

    Par défaut

    Bonjour.
    Avant de dire que ça ne fonctionne pas, as tu au moins testé le programme que je t'ai proposé en l'adaptant (ajouter les zones manquantes et modifier le nombre des occurs) ?
    Je viens d'injecter dans mon fichier les données que tu as mises dans ton post et ça a donné les résultats auxquels tu t'attendais.

  13. #13
    Membre émérite
    Homme Profil pro
    Ingénieur Exploitation Mainframe
    Inscrit en
    octobre 2005
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Exploitation Mainframe
    Secteur : Finance

    Informations forums :
    Inscription : octobre 2005
    Messages : 1 290
    Points : 2 588
    Points
    2 588

    Par défaut

    Voilà une solution en partie complète et qui devrait fonctionner ( testée quand même ... ) :

    Ce que j'ai fait :
    - je suis parti de la base de H. Jaidane ( excellente au demeurant ) mais en la complétant
    - j'ai fait quelques adaptations pour mon COBOl et ma machine
    - j'ai légèrement simplifié le format de sortie en faisant l'impasse sur le format PACKé ( plus simple à coder et à tester )

    Et voilà ... à vos remarques ...

    Attention c'est du vite fait / bien fait ...



    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
           IDENTIFICATION DIVISION. 
           PROGRAM-ID. BDELWW81. 
           AUTHOR. H. JAIDANE MODIFIE LUC ORIENT. 
           ENVIRONMENT DIVISION. 
           CONFIGURATION SECTION. 
           SOURCE-COMPUTER. IBM-Z13. 
           OBJECT-COMPUTER. IBM-Z13. 
           INPUT-OUTPUT SECTION. 
           FILE-CONTROL. 
               SELECT FIC-IN  ASSIGN FICIN 
                      ORGANIZATION SEQUENTIAL. 
               SELECT FIC-OUT ASSIGN FICOUT 
                      ORGANIZATION SEQUENTIAL. 
           DATA DIVISION. 
           FILE SECTION. 
           FD  FIC-IN BLOCK 0 RECORDING F. 
           01  ENREG-IN. 
                03 LIGNE1     PIC X(80). 
           FD  FIC-OUT BLOCK 0 RECORDING F. 
           01  ENREG-OUT. 
               02 NOM         PIC X(20). 
               02 PRENOM      PIC X(20). 
               02 VILLE       PIC X(32). 
               02 PAYS        PIC X(10). 
               02 NB-ECHEANCE PIC 9(3). 
               02 TABLEAU. 
                  05 ELEM OCCURS 5. 
                     07 MONTANT  PIC 9(15). 
                     07 LA-DATE  PIC X(8). 
           WORKING-STORAGE SECTION. 
           77  PTR    PIC S9(4) BINARY. 
           77  WPTR   PIC S9(4) BINARY. 
           77  I      PIC S9(4) BINARY. 
           77  FF     PIC S9(4) BINARY. 
           PROCEDURE DIVISION. 
           DEBUT. 
               OPEN INPUT  FIC-IN 
                    OUTPUT FIC-OUT 
               MOVE 0 TO FF 
               READ FIC-IN AT END MOVE 1 TO FF END-READ 
               PERFORM UNTIL FF = 1 
                  MOVE SPACES TO NOM 
                                 PRENOM 
                                 VILLE 
                                 PAYS 
                  MOVE 0 TO NB-ECHEANCE 
                  MOVE SPACE TO TABLEAU 
                  MOVE 1 TO PTR 
                  UNSTRING LIGNE1 DELIMITED BY ";" INTO 
                                  NOM 
                                  PRENOM 
                                  VILLE 
                                  PAYS 
                                  NB-ECHEANCE 
                          POINTER PTR 
                  IF NB-ECHEANCE NOT = ZERO 
                     MOVE 1 TO I 
                     PERFORM UNTIL PTR > 100 OR I > 5 
                               OR I > NB-ECHEANCE 
                       UNSTRING LIGNE1 
                             DELIMITED BY ";" OR SPACE
                             INTO MONTANT(I) LA-DATE(I) 
                             POINTER PTR 
                       END-UNSTRING 
                       ADD 1 TO I 
                     END-PERFORM 
                  END-IF 
                 WRITE ENREG-OUT 
                 READ FIC-IN AT END MOVE 1 TO FF END-READ 
               END-PERFORM 
               CLOSE FIC-IN 
                     FIC-OUT 
               GOBACK

Discussions similaires

  1. Remplissage d'une zone d'un canvas
    Par ulysse66x dans le forum Composants VCL
    Réponses: 5
    Dernier message: 31/01/2004, 12h41
  2. Tabulation dans une zone SELECT
    Par jfphan dans le forum ASP
    Réponses: 4
    Dernier message: 03/10/2003, 15h30
  3. Réponses: 11
    Dernier message: 24/07/2003, 09h24
  4. Réponses: 17
    Dernier message: 25/03/2003, 13h45
  5. Réponses: 17
    Dernier message: 17/10/2002, 20h06

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