Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 12 sur 12
  1. #1
    Invité régulier
    Inscrit en
    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

  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 866
    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 866
    Points : 3 464
    Points
    3 464

    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 :
    IF marubrique = "RUB_01" MOVE SPACES TO RUB_01.
    ou par un EVALUATE.

  3. #3
    Invité régulier
    Inscrit en
    septembre 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 38
    Points : 6
    Points
    6

    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 Hédhili Jaïdane
    Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    juin 2007
    Messages
    1 866
    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 866
    Points : 3 464
    Points
    3 464

    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
    Invité régulier
    Inscrit en
    septembre 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 38
    Points : 6
    Points
    6

    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
    Invité régulier
    Inscrit en
    septembre 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 38
    Points : 6
    Points
    6

    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 Hédhili Jaïdane
    Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    juin 2007
    Messages
    1 866
    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 866
    Points : 3 464
    Points
    3 464

    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 Confirmé Sénior
    Profil pro
    Inscrit en
    décembre 2007
    Messages
    3 013
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2007
    Messages : 3 013
    Points : 8 472
    Points
    8 472

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

  9. #9
    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 866
    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 866
    Points : 3 464
    Points
    3 464

    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
    Invité régulier
    Inscrit en
    septembre 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 38
    Points : 6
    Points
    6

    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 Hédhili Jaïdane
    Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    juin 2007
    Messages
    1 866
    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 866
    Points : 3 464
    Points
    3 464

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

  12. #12
    Invité régulier
    Inscrit en
    septembre 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 38
    Points : 6
    Points
    6

    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

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
  •