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 :

déconcaténer une zone occursée


Sujet :

Cobol

  1. #1
    Invité
    Invité(e)
    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.
    Dernière modification par -Nikopol- ; 08/09/2017 à 22h34.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

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

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    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
    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.

    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
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    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
    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.

    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 émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    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 !
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    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 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 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
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    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
    Invité
    Invité(e)
    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
    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.
    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 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
    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

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    ca fonctionne.
    Cependant, j'ai encore des questions car je ne connais pas l'instruction POINTER.
    Que fait cette instruction exactement ?

    Pour l'instruction PERFORM UNTIL PTR > 100 OR I > 5
    que représente la valeur 100 ?
    que représente la valeur 5 ? Est-ce l'occurs ?


    La donnée MONTANT dans l'occurs doit être en packé.
    Comment faire ?

  15. #15
    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 fmontarou Voir le message
    Bonjour,
    ca fonctionne.



    Cependant, j'ai encore des questions car je ne connais pas l'instruction POINTER.
    Que fait cette instruction exactement ?
    L'option POINTER (ce n'est pas une instruction au sens strict) avec UNSTRING permet de gérer un pointeur sur la zone réceptrice.
    Ici l'intérêt et de faire démarrer la cible du second UNSTRING là où s'est terminé le premier.

    Pour l'instruction PERFORM UNTIL PTR > 100 OR I > 5
    que représente la valeur 100 ?
    que représente la valeur 5 ? Est-ce l'occurs ?
    J'ai juste repris les conditions de sortie de la boucle sur la zone en OCCURS qui étaient déjà présentes.
    La description de ton problème ne dit rien là dessus.
    Il faudrait préciser la taille maximale en entrée.
    5 correspond à l'OCCURs, oui.


    La donnée MONTANT dans l'occurs doit être en packé.
    Comment faire ?
    Il suffit juste de passer par une variable intermédiaire.
    Je te laisse chercher un peu ...

  16. #16
    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
    Citation Envoyé par fmontarou Voir le message
    Bonjour,

    ca fonctionne.
    Cependant, j'ai encore des questions car je ne connais pas l'instruction POINTER.
    Que fait cette instruction exactement ?
    POINTER est une clause de l'instruction UNSTRING, si elle est utilisée, elle sert à indiquer la position relative de la zone émettrice de la recherche du UNSTRING. Dans l'exemple que j'ai donné, elle sert à garder la position de recherche à partir de la quelle va commencer la recherche du UNSTRING suivant, et aussi du UNSTRING courant. C'est pour cela qu'il est initialisé à 1 une seule fois au tout début et pas du tout après.
    Contains a value that indicates a relative position in the sending field. When
    this phrase is specified, the user must initialize this field before execution of the
    UNSTRING statement is begun.
    Pour l'instruction PERFORM UNTIL PTR > 100 OR I > 5
    que représente la valeur 100 ?
    que représente la valeur 5 ? Est-ce l'occurs ?
    Dans mon exemple :
    - 100 est la longueur maximale de l'enregistrement du fichier en entrée, celui qui contient les données séparées par ";", il faut l'adapter à tes besoins.
    - 5 et le nombre des éléments du tableau en sortie (occurs), il faut aussi l'adapter à ton cas, à savoir 150.

    La donnée MONTANT dans l'occurs doit être en packé.
    Comment faire ?
    Dans l'exemple que j'ai donné, MONTANT est bien packé (COMP-3) et je passe par la fonction NUMVAL pour le faire car le UNSTRING s'il autorise bien le numérique pour les zones réceptrices, il exige que cela soit en usage étendu (DISPLAY).
    Si tu n'as pas cette fonction utilise une zone intermédiaire en usage DISPLAY dans le UNSTRING puis remets cette zone dans la zone packée du tableau en sortie.

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

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