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 :

Utilisation de rubriques "variables" dans un programme COBOL


Sujet :

Cobol

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 45
    Points : 26
    Points
    26
    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

  2. #2
    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 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    IF marubrique = "RUB_01" MOVE SPACES TO RUB_01.
    ou par un EVALUATE.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 45
    Points : 26
    Points
    26
    Par défaut
    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 ...

  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
    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é.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 45
    Points : 26
    Points
    26
    Par défaut
    Voici une copie contenant les divers enregistrements du fichier en question (voir niveaux 01)
    Fichiers attachés Fichiers attachés

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 45
    Points : 26
    Points
    26
    Par défaut
    Le fichier parametre contiendrait les enregistrements suivants (exemple) :
    MASQUE CN-P-ABA0-FA
    MASQUE NADLPRS-AB9Z-FA

  7. #7
    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
    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.

  8. #8
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 803
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 803
    Points : 32 058
    Points
    32 058
    Par défaut
    +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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  9. #9
    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
    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.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 45
    Points : 26
    Points
    26
    Par défaut
    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

  11. #11
    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 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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 45
    Points : 26
    Points
    26
    Par défaut
    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

Discussions similaires

  1. Réponses: 5
    Dernier message: 02/02/2008, 11h35
  2. Réponses: 10
    Dernier message: 01/02/2008, 17h14
  3. Utiliser les solveurs ODE de MATLAB dans un programme en C++
    Par yanndublanche dans le forum MATLAB
    Réponses: 8
    Dernier message: 12/12/2007, 15h40

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