Précédent   Forum du club des développeurs et IT Pro > Autres langages > Autres langages > Cobol
Cobol Forum d'entraide sur la programmation en langage Cobol
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 01/06/2012, 00h07   #1
Metalman
Membre émérite
 
Avatar de Metalman
 
Homme Fabrice
Ingénieur systèmes et réseaux
Inscription : juin 2005
Messages : 393
Détails du profil
Informations personnelles :
Nom : Homme Fabrice
Âge : 24
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Finance

Informations forums :
Inscription : juin 2005
Messages : 393
Points : 940
Points : 940
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 !
Metalman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2012, 00h45   #2
Hédhili Jaïdane
Expert Confirmé
 
Homme
Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
Inscription : juin 2007
Messages : 1 789
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Tunisie

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

Informations forums :
Inscription : juin 2007
Messages : 1 789
Points : 2 723
Points : 2 723
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.
__________________

Hédhili Jaïdane est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/06/2012, 01h44   #3
Metalman
Membre émérite
 
Avatar de Metalman
 
Homme Fabrice
Ingénieur systèmes et réseaux
Inscription : juin 2005
Messages : 393
Détails du profil
Informations personnelles :
Nom : Homme Fabrice
Âge : 24
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Finance

Informations forums :
Inscription : juin 2005
Messages : 393
Points : 940
Points : 940
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" !
Metalman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2012, 21h06   #4
Skylyn
Membre habitué
 
Homme Julien Guiffroy
Ingénieur d'étude Mainframe
Inscription : septembre 2012
Messages : 61
Détails du profil
Informations personnelles :
Nom : Homme Julien Guiffroy
Âge : 27
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 : 113
Points : 113
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à
Skylyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2013, 16h37   #5
philippe59250
Invité régulier
 
Homme philippe
Ingénieur intégration
Inscription : 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 : 7
Points : 7
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
philippe59250 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/04/2013, 16h43   #6
Metalman
Membre émérite
 
Avatar de Metalman
 
Homme Fabrice
Ingénieur systèmes et réseaux
Inscription : juin 2005
Messages : 393
Détails du profil
Informations personnelles :
Nom : Homme Fabrice
Âge : 24
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Finance

Informations forums :
Inscription : juin 2005
Messages : 393
Points : 940
Points : 940
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
OU
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" !
Metalman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2013, 21h14   #7
Skylyn
Membre habitué
 
Homme Julien Guiffroy
Ingénieur d'étude Mainframe
Inscription : septembre 2012
Messages : 61
Détails du profil
Informations personnelles :
Nom : Homme Julien Guiffroy
Âge : 27
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 : 113
Points : 113
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).
Skylyn est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 04h22.


 
 
 
 
Partenaires

Hébergement Web