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 05/06/2012, 19h13   #1
dvi24
Invité régulier
 
Inscription : septembre 2007
Messages : 38
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 38
Points : 6
Points : 6
Par défaut Utilisation de rubriques "variables" dans un programme COBOL

Bonjour

Je souhaiterai pouvoir initialiser certaines rubriques d'un fichier, ces rubriques étant mentionnees dans un fichier de parametre
(parametres = liste des rubriques a initialiser)


<debut description fichier en sortie>
RUB_00 PIC X(01)
RUB_01 PIC X(01)
RUB_02 PIC X(01)
RUB_03 PIC X(01)
RUB_04 PIC X(01)
RUB_05 PIC X(01)
<fin description fichier en sortie>

<début fichier parametre : liste des rubriques a initialiser>
RUBRIQUE RUB_01
RUBRIQUE RUB_02
<fin fichier parametre>

<debut programme>
...
lecture fichier parametre : on recupere la valeur RUB_01
on veut mettre a blanc la rubrique RUB_01 du fichier en sortie
MOVE SPACES TO <valeur>

lecture fichier parametre : on recupere la valeur RUB_02
on veut mettre a blanc la rubrique RUB_02 du fichier en sortie
MOVE SPACES TO <valeur>




Question : est-il possible d'utiliser une variable dans l'ordre "MOVE SPACES TO ..." ?

Je vous remercie par avance pour vos réponses.


Dominique
dvi24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2012, 19h23   #2
Hédhili Jaïdane
Expert Confirmé
 
Homme
Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
Inscription : juin 2007
Messages : 1 782
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 782
Points : 2 712
Points : 2 712
Citation:
Envoyé par dvi24 Voir le message
Bonjour

...
Question : est-il possible d'utiliser une variable dans l'ordre "MOVE SPACES TO ..." ?

Je vous remercie par avance pour vos réponses.


Dominique
Bonjour.

Je pense que non à priori à moins d'utiliser des tableaux.

Tes rubriques étant connues à l'avance et pas trop nombreuses, personnellement je ferais des tests en dur par des IF successifs :
Code :
IF marubrique = "RUB_01" MOVE SPACES TO RUB_01.
ou par un EVALUATE.
__________________

Hédhili Jaïdane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2012, 22h10   #3
dvi24
Invité régulier
 
Inscription : septembre 2007
Messages : 38
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 38
Points : 6
Points : 6
Bonsoir

Merci pour votre intervention.

Cependant, mon exemple n'est malheureusement qu'un exemple. Mon souci est que j'ai une vingtaine d'enregistrements avec une moyenne de trente rubriques chacun. Donc beaucoup de lignes à coder ...
dvi24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2012, 22h30   #4
Hédhili Jaïdane
Expert Confirmé
 
Homme
Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
Inscription : juin 2007
Messages : 1 782
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 782
Points : 2 712
Points : 2 712
Tu peux nous indiquer les structures réelles de tes fichiers s'il te plait, peut être qu'on peut trouver des solutions en redéfinissant les rubriques sous la forme d'un tableau ou d'une clé de fichier indexé.
__________________

Hédhili Jaïdane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2012, 22h57   #5
dvi24
Invité régulier
 
Inscription : septembre 2007
Messages : 38
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 38
Points : 6
Points : 6
Voici une copie contenant les divers enregistrements du fichier en question (voir niveaux 01)
Fichiers attachés
Type de fichier : txt Fichier.txt (59,1 Ko, 10 affichages)
dvi24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2012, 22h59   #6
dvi24
Invité régulier
 
Inscription : septembre 2007
Messages : 38
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 38
Points : 6
Points : 6
Le fichier parametre contiendrait les enregistrements suivants (exemple) :
MASQUE CN-P-ABA0-FA
MASQUE NADLPRS-AB9Z-FA
dvi24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2012, 23h51   #7
Hédhili Jaïdane
Expert Confirmé
 
Homme
Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
Inscription : juin 2007
Messages : 1 782
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 782
Points : 2 712
Points : 2 712
A la vue des structures données, personnellement je ne vois pas d'autres solutions que ce que j'ai préconisé dans mon premier post.
__________________

Hédhili Jaïdane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2012, 10h18   #8
el_slapper
Expert Confirmé Sénior
 
Inscription : décembre 2007
Messages : 2 544
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 2 544
Points : 6 160
Points : 6 160
+1. Il n'y a pas d'introspection en COBOL. Si toutes les rubriques avaient eu le même format et avaient été dans un seul bloc de données, il aurait été possible de faire un redefines sur un tableau avec des données génériques. Du genre :

Code :
1
2
3
4
5
6
7
8
9
10
11
01 Tableau.
    05 Rubrique-Local-Lib  PIC x(20).
    05 Rubrique-Local-Num  PIC S9(9) COMP-3.
    05 Rubrique-Export-Lib PIC x(20).
    05 Rubrique-Export-Num PIC S9(9) COMP-3.
    05 Rubrique-Import-Lib PIC x(20).
    05 Rubrique-Import-Num PIC S9(9) COMP-3.
01 Tableau-Bis redefines Tableau.
    05 Element OCCURS 3.
        10 Element-Lib     PIC X(20).
        10 Element-Num     PIC 9(8) COMP-3.
Et, avec ça, on peut naviguer dynamiquement sur les rubriques, même si celles-ci dont définies de manière statique. Mais ça impose d'avoir une structure fixe(ici un X(20) suivi d'un S9(9) COMP-3). Et de tenir à jour la taille de l'occurs quand on ajoute des lignes. Pas moyen de faire comme en C# un for each sur tous les champs d'un bloc, de determiner dynamiquement le type de la donnée, et de mouliner dessus.

Le seul élément qu'on peut avoir, et il n'est que faussement dynamique, c'est le LENGTH OF. Je m'en sers généralement de la manière suivante :

Code :
1
2
3
4
DIVIDE LENGTH OF TABLEAU-BIS
    BY LENGTH OF ELEMENT (1)
       GIVING    NOMBRE-ELEMENTS
.
ça permet d'avoir la taille du tableau sans la coder en dur.....autre part que dans l'occurs(oubli fréquent qui amène parfois à des drames). Si l'occurs est faux, on est caramel quand même.
__________________
Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
3)le temps de comprendre toutes les exigences, le projet est terminé
4)le temps de terminer le projet, les exigences ont changé
Et le serment de non-allégiance :
Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.
el_slapper est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2012, 11h30   #9
Hédhili Jaïdane
Expert Confirmé
 
Homme
Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
Inscription : juin 2007
Messages : 1 782
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 782
Points : 2 712
Points : 2 712
Deux autres techniques sont possibles en plus de l'utilisation des tableaux redéfinissant la structure de données à utiliser :

- à la lecture de la littérature, il parait que les pointeurs peuvent être éventuellement utilisés, mais comme je les ai jamais utilisés sauf en ce qui concerne les userspaces, et encore juste en démo, je ne peux pas tellement en parler.

- les CALL dynamiques, cette technique, quand le compilateur permet de faire des CALL à des s/programmes dont le nom est mis dans une variable, m'a permis de résoudre ce genre de problèmes mais, il faut le reconnaitre, par une véritable usine à gaz. D'ailleurs ce qui est pratiquement en train de se faire dans la culture des Service Oriented Application Programs.
J'explicite un peu :
- les rubriques à traiter (calculer, initialiser, etc...) sont associées à des s/programmes qui portent les même noms;
- on récupère le nom de la rubrique et on appelle le s/programme qui a le même nom que cette rubrique;
- le s/programme réalise l'action voulue, qui peut être différente d'une rubrique à l'autre, et retourne le contrôle au main programme.
__________________

Hédhili Jaïdane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2012, 13h37   #10
dvi24
Invité régulier
 
Inscription : septembre 2007
Messages : 38
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 38
Points : 6
Points : 6
Bonjour

Merci pour toutes ces informations.

Je suis à priori intéressé par le "faussement dynamique". Je vais voir comment je peux le traiter dans mon cas.

Sinon, aurais-tu un programme exemple en ce qui concerne les CALL. Je vois vaguement ce que tu indiques mais s'il est possible d'avoir du concret, ça m'intéresserait.

Merci

Dvi
dvi24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2012, 22h03   #11
Hédhili Jaïdane
Expert Confirmé
 
Homme
Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
Inscription : juin 2007
Messages : 1 782
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 782
Points : 2 712
Points : 2 712
Citation:
Envoyé par dvi24 Voir le message
Bonjour....
Sinon, aurais-tu un programme exemple en ce qui concerne les CALL. Je vois vaguement ce que tu indiques mais s'il est possible d'avoir du concret, ça m'intéresserait.

Merci

Dvi
Bonjour.

Voilà un jeu de simulation avec un main programme RUB_XX, et deux s/programmes, RUB_01, RUB_02. J'ai utilisé un LDA (ZCU) pour stocker les données en sortie et des données en dur pour les données en entrée.

Dans le main j'ai 3 rubriques à initialiser mais je n'ai que deux s/programmes pour tester le fail du programme appelé quand il n'existe pas.

Code RUB_XX :
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
0032   DATA DIVISION.                                                           
0050   WORKING-STORAGE SECTION.                                                 
0076   01  RUB_SPGM      PIC X(10).                                             
0076   01  LDARD.                                                               
0077       03 RUB_01     PIC X(10).                                             
0077       03 FILLER     PIC X(02) VALUE SPACES.                                
0077       03 RUB_02     PIC X(10).                                             
       LINKAGE SECTION.                                                         
0201   PROCEDURE DIVISION.                                                      
0209   DEBUT.                                                                   
           PERFORM AFF-LDA.                                                     
0209   TRAIT.                                                                   
0211       MOVE "RUB_01" TO RUB_SPGM.                                           
           PERFORM CALL-RUB_SPGM.                                               
0211       MOVE "RUB_02" TO RUB_SPGM.                                           
           PERFORM CALL-RUB_SPGM.                                               
0211       MOVE "RUB_03" TO RUB_SPGM.                                           
           PERFORM CALL-RUB_SPGM.                                               
       FIN.                                                                     
           PERFORM AFF-LDA.         
0627       STOP RUN.                                                            
       CALL-RUB_SPGM.                                                           
           CALL RUB_SPGM ON EXCEPTION PERFORM ERR_SPGM.                         
       AFF-LDA.                                                                 
0210       ACCEPT LDARD FROM LOCALDATA.                                         
0212       DISPLAY "[" LDARD "]".                                               
       ERR_SPGM.                                                                
           DISPLAY "S/Programme de traitement de la rubrique "                  
                   RUB_SPGM                                                     
                   " non trouvé".

Code RUB_01 :
1
2
3
4
5
6
7
8
9
10
11
12
13
0050   WORKING-STORAGE SECTION.                                                 
0076   01  LDARD.                                                               
0077       03 RUB_01     PIC X(10).                                             
0077       03 FILLER     PIC X(02) VALUE SPACES.                                
0077       03 RUB_02     PIC X(10).                                             
       LINKAGE SECTION.                                                         
0201   PROCEDURE DIVISION.                                                      
0209   DEBUT.                                                                   
0210       ACCEPT LDARD FROM LOCALDATA.                                         
0211       MOVE ALL "3" TO RUB_01.                                              
0212       DISPLAY LDARD UPON LOCALDATA.                                        
0627       GOBACK.

Code RUB_02 :
1
2
3
4
5
6
7
8
9
10
11
12
13
0050   WORKING-STORAGE SECTION.                                                 
0076   01  LDARD.                                                               
0077       03 RUB_01     PIC X(10).                                             
0077       03 FILLER     PIC X(02) VALUE SPACES.                                
0077       03 RUB_02     PIC X(10).                                             
       LINKAGE SECTION.                                                         
0201   PROCEDURE DIVISION.                                                      
0209   DEBUT.                                                                   
0210       ACCEPT LDARD FROM LOCALDATA.                                         
0211       MOVE ALL "4" TO RUB_02.                                              
0212       DISPLAY LDARD UPON LOCALDATA.                                        
0627       GOBACK.


NOTA BENE:

Si tu ne voulais pas faire 30 IF ... ELSE dans ton programme pour tester les rubriques, avec cette méthode tu vas écrire 30 s/programmes rien que pour initialiser les rubriques à SPACES !!

Cette méthode est utilisée pour les cas de traitements bien spécifiques à chaque rubrique et où le nombre de rubriques dépasse les centaines. Cette véritable usine à gaz n'est pas nécessaire pour cuire ton oeuf à la coque.
__________________

Hédhili Jaïdane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2012, 23h46   #12
dvi24
Invité régulier
 
Inscription : septembre 2007
Messages : 38
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 38
Points : 6
Points : 6
Bonsoir

Merci pour ta participation et tes exemples.

Pour l'instant, j'ai créé un prog qui, à partir d'un résultat de compil, génère les "n" IF et INITIALIZE qu'il m'aurait fallu écrire, pour chaque rubrique de chaque type d'enregsitrement de mon fichier.
Je vais insérer ces lignes dans le programme principal.

Je pensais qu'il y aurait une solution plus souple et moins verbeuse. A priori, ça n'est pas le cas. Dommage.


Merci encore pour ton assistance de ces derniers jours.

Dvi
dvi24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h02.


 
 
 
 
Partenaires

Hébergement Web