Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Expert Confirmé
    Avatar de Metalman
    Homme Profil pro Fabrice Boissier
    Ingé Sys/Réseau en reprise d'études SI
    Inscrit en
    juin 2005
    Messages
    972
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabrice Boissier
    Âge : 25
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingé Sys/Réseau en reprise d'études SI
    Secteur : Finance

    Informations forums :
    Inscription : juin 2005
    Messages : 972
    Points : 3 172
    Points
    3 172

    Par défaut Test ligne vide

    Bonjour,

    Je souhaiterai savoir s'il est possible de tester si une ligne est vide en COBOL.
    Après mon autre sujet + pc-xp-percobol-lecture-sequentielle-fichier-tete/, j'ai vu que normalement les fichiers sont bien fixés à l'avance...
    Il n'y a donc JAMAIS de lignes vides dans "la vie réelle en COBOL" ?

    Enfin en gros pour essayer d'améliorer ce que je fais :
    1) fichier en entrée avec du texte et quelques lignes vides
    2) tri interne de ce fichier (en suivant l'aide de Hedhili)
    3) lecture du tri pour écrire en sortie

    J'aimerais avant d'écrire de vérifier si ma ligne est vide ou pas (chaque ligne est stockée dans un PIC X(100)... il n'y a qu'un seul champs en gros...)

    Merci d'avance !

  2. #2
    Expert Confirmé
    Homme Profil pro Hédhili Jaïdane
    Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    juin 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Nom : Homme Hédhili Jaïdane
    Localisation : Tunisie

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

    Informations forums :
    Inscription : juin 2007
    Messages : 1 869
    Points : 3 399
    Points
    3 399

    Par défaut

    Citation Envoyé par Metalman Voir le message
    Bonjour,

    Je souhaiterai savoir s'il est possible de tester si une ligne est vide en COBOL.
    On peut rencontrer des lignes (enregistrements) vides dans un fichier quelle que soit sa nature. Dans les fichiers de type texte quand 2 CR/LF se suivent, dans les fichiers d'organisation relative (direct, en gruyère) quand les rooms sont vides, dans les fichiers indexés quand les clés ne sont pas remplies par erreur et que le reste de l'enregistrement est aussi vide (cas rarissime).

    Comment les tester ? Tout dépend de comment les enregistrements ont été initialisés avant leur écriture, globalement par MOVE SPACES ou MOVE LOW-VALUE dans le niveau 01 du FD (le nom de l'enregistrement ou du format), ou zone par zone par des MOVE individuels ou l'instruction INTIALIZE. Cette instruction mets des 0 ou des espaces (pour simplifier à cause des types date/time) dans les zones élémentaires d'un groupe (niveau juste en dessous (supérieur) du niveau du groupe) en fonction de leur type.

    Pour simplifier : soit on teste le niveau 01 à SPACES ou à LOW-VALUE, soit chaque zone à 0 (ou ALL 0, ZEROS, ALL ZEROS), à SPACES ou à LOW-VALUE.

    Pour les fichiers texte, on teste à SPACES même si le CR/LF est en début de ligne.

    Je te laisse traduire tout ça.

  3. #3
    Expert Confirmé
    Avatar de Metalman
    Homme Profil pro Fabrice Boissier
    Ingé Sys/Réseau en reprise d'études SI
    Inscrit en
    juin 2005
    Messages
    972
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabrice Boissier
    Âge : 25
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingé Sys/Réseau en reprise d'études SI
    Secteur : Finance

    Informations forums :
    Inscription : juin 2005
    Messages : 972
    Points : 3 172
    Points
    3 172

    Par défaut

    C'est bon ça marche !
    Merci beaucoup !

    Voici les variables et la routine :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
            DATA DIVISION.
            FILE SECTION.
            FD  ENTER-DATA.
            01  IN-REC.
                05  SET-NAME                PICTURE X(100).
            SD  SORTED-DATA.
            01  SRT-REC.
                05  SORTED-NAME             PICTURE X(100).
            FD  OUT-DATA.
            01  OUT-REC.
                05  OUT-SET-NAME            PICTURE X(100).
    
            WORKING-STORAGE SECTION.
            01  ARE-THERE-MORE-RECORDS      PICTURE XXX VALUE 'YES'.
            77  CURRENT-NAME                PICTURE X(100).
            77  CURRENT-ENTRIES             PICTURE 999.
            01  IS-FIRST-ENTRY              PICTURE XXX VALUE 'YES'.
                88 NOT-FIRST-ENTRY                      VALUE 'NO '.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            300-WRITE-ROUTINE.
                IF  SRT-REC IS NOT = SPACES
                    IF  IS-FIRST-ENTRY = 'YES'
                        MOVE SORTED-NAME TO CURRENT-NAME
                        MOVE 1 TO CURRENT-ENTRIES
                        MOVE 'NO ' TO IS-FIRST-ENTRY
                    ELSE
                        ADD 1 TO CURRENT-ENTRIES
                        MOVE SORTED-NAME TO CURRENT-NAME
                    END-IF
                    MOVE CURRENT-NAME TO OUT-SET-NAME
                    WRITE OUT-REC
                END-IF.
    Il ne me manquait que le "IF SRT-REC IS NOT = SPACES" !

  4. #4
    Membre habitué
    Homme Profil pro Julien Guiffroy
    Ingénieur d'étude Mainframe
    Inscrit en
    septembre 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Nom : Homme Julien Guiffroy
    Âge : 28
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur d'étude Mainframe
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2012
    Messages : 61
    Points : 114
    Points
    114

    Par défaut

    En fait t'u navais pas besoin de programme pour ça

    Si tu utilises le JCL pour compiler/exécuter des programmes, tu peux le faire par JCL

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //EXCLSPAC EXEC PGM=SORT
    //SORTIN    DD DSN=fichier.a.trier,DISP=SHR
    //SORTOUT   DD DSN=fichier.sortie.sans.ligne.vide,DISP=SHR
    //SYSOUT    DD *
    //SYSIN     DD *
    SORT FIELDS=COPY
    OMIT COND=(1,10,CH,EQ,C'          ')
    /*
    Vu que toute la ligne = 1 enregistrement tu peux même mettre
    Code :
    OMIT COND=(1,1,EQ,CH,C' ')
    Sinon, si tu sais combiner JCL et Assembleur (mais on sort du sujet, mais ça peut servir) :

    Code :
    1
    2
    3
    4
    5
    6
    7
    MODIF  CSECT
           USING   *,9
           CLC     0(1,11),=C' '
           BE      SUPPR1
           BR      15
    SUPPR1 BR      14
           END
    Et tu consultes le fichier issu de BR15, mais là assembleur/JCL je m'y connais moins pour savoir qui est quel fichier...

    assembleur tout seul ......... ok
    JCL tout seul ......... ok
    les deux ensemble ......... euh
    Voilà

  5. #5
    Invité de passage
    Homme Profil pro philippe
    Ingénieur intégration
    Inscrit en
    avril 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Nom : Homme philippe
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : avril 2013
    Messages : 1
    Points : 4
    Points
    4

    Par défaut ligne (enregistrement) nulle

    Bonjour,
    il existe un autre moyen de tester le contenu "vide" d'un champ COBOL, il faut tester la longueur de son contenu.
    Exemple :
    un champ TOTO pic x(100).
    écrire l'instruction suivante

    MOVE LENGTH OF TOTO TO LONG (à définir en WSS)
    IF LONG = 0
    le contenu de TOTO est vide.

    ATTENTION :
    le contenu d'un enregistrement "vide" n'est pas obligatoirement à SPACES il peut aussi être à LOW-VALUE.

    Philippe

  6. #6
    Expert Confirmé
    Avatar de Metalman
    Homme Profil pro Fabrice Boissier
    Ingé Sys/Réseau en reprise d'études SI
    Inscrit en
    juin 2005
    Messages
    972
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabrice Boissier
    Âge : 25
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingé Sys/Réseau en reprise d'études SI
    Secteur : Finance

    Informations forums :
    Inscription : juin 2005
    Messages : 972
    Points : 3 172
    Points
    3 172

    Par défaut

    Tout cela s'ajoute aux premiers posts en effet !

    Merci pour le complément d'informations (certes un peu tardif, mais pas inutile) !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  7. #7
    Membre habitué
    Homme Profil pro Julien Guiffroy
    Ingénieur d'étude Mainframe
    Inscrit en
    septembre 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Nom : Homme Julien Guiffroy
    Âge : 28
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur d'étude Mainframe
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2012
    Messages : 61
    Points : 114
    Points
    114

    Par défaut

    Citation Envoyé par philippe59250 Voir le message
    Bonjour,
    il existe un autre moyen de tester le contenu "vide" d'un champ COBOL, il faut tester la longueur de son contenu.
    Exemple :
    un champ TOTO pic x(100).
    écrire l'instruction suivante

    MOVE LENGTH OF TOTO TO LONG (à définir en WSS)
    IF LONG = 0
    le contenu de TOTO est vide.

    ATTENTION :
    le contenu d'un enregistrement "vide" n'est pas obligatoirement à SPACES il peut aussi être à LOW-VALUE.

    Philippe
    Hello, un peu tard mais juste une remarque :

    L'instruction LENGTH OF ne renvoie pas la taille maximale allouée par le programme ? (en l'occurence 100 pour l'exemple)

    Le plus simple serait de passer par

    Code :
    1
    2
    3
    4
    5
    6
    7
    SET VIDE TO TRUE
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > LENGTH OF TOTO OR NON-VIDE
       IF TOTO(I:1) NOT = SPACES AND LOW-VALUE
          SET NON-VIDE TO TRUE
       END-IF
    END-PERFORM
    et de définir en WSS

    Code :
    1
    2
    3
    4
    5
    6
    01 STATUT-CHAINE PIC 9(1) VALUE 0.
      88 VIDE VALUE 1.
      88 NON-VIDE VALUE 0.
    
    01 I PIC 9(3).

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •