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

z/OS Discussion :

Programme en REXX


Sujet :

z/OS

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Programme en REXX
    Sur MVS.
    A partir d'un fichier séquentiel qui a cette forme :

    Info1
    texte1=données1,texte2,texte3
    texte1=données2,texte4,texte5

    Info2
    texte1=données3,texte4,texte3

    Info3
    texte1=données4,texte2,texte6
    texte1=données5,texte2,texte6
    texte1=données6,texte2,texte6
    ...

    Je voudrai à l'aide de procédure en REXX (j'ai essayé avec des dfsort,iceman, icetool etc.. je n'ai pas réussi à obtenir ce que je voulais) obtenir un fichier de sortie de la forme ci-dessous :

    Info1,données1,données2
    Info2,données3
    Info3,données4,données4,données5
    ...

    Auriez-vous des idées,solutions? J'ai cherché des docs sur le REXX mais il n'y en a pas tant que ça et je suis novice en la matière.

    NB : les champs info* sont de type variable tout comme données*
    le champ texte1= est fixe (13 caractères)

    Merci d'avance.

  2. #2
    Membre actif
    Inscrit en
    Novembre 2009
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2009
    Messages : 165
    Points : 216
    Points
    216
    Par défaut
    Bonjour,

    Si tu as des délimiteurs dans tes données, c'est plutôt simple à faire. Il suffit de trouver la position de celui-ci et d'extraire tes données pour les concaténer et les écrire dans un fichier en sortie.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Pour trouver le champ Info*, il se trouve toujours après les caractéres * (astérisque et blanc) en position 1 et 2
    => donc Info* est en position 3 de longueur variable.
    Pour les champs données*, ils se trouvent toujours entre texte1= et ,

    Auriez-vous une idée du code à utiliser en sachant cela?

  4. #4
    Membre actif
    Inscrit en
    Novembre 2009
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2009
    Messages : 165
    Points : 216
    Points
    216
    Par défaut
    Ca ne me parait pas insurmontable comme rexx à faire. Quelques ordres pos, length et substr ainsi que quelques boucles do et des if. Je pense que ça peut faire l'affaire.

    Es-tu novice en programmation, connais-tu le langage REXX?

    J'aurai un peu de temps la semaine prochaine pour t'orienter de façon plus précise sur le code sauf si quelqu'un passe avant.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Routines REXX
    Bonjour Damien.
    A priori vous n'êtes pas un spécialiste du REXX sinon votre demande, banale en ce domaine, n'aurait pas lieu d'être.
    Pour faire court, REXX manipule des piles, votre fichier résultat doit donc être "monté" dans une pile. Ensuite chaque ligne de cette pile doit être manipulée pour conserver en mémoire les éléments (données) à extraire, afin de constituer un enregistrement composite.
    Plusieurs fonctions permettent de manipuler les lignes de façon à extraire les éléments cherchés (PARSING).
    Tip: WVAR1=WORD(FI.1,1) retourne dans WVAR1 le 1er mot de la 1ère ligne de la pile traitée (FI.1). Remarque: Dans une boucle si I est l'indice de balayage, on codera FI.I pour traiter la ligne I de la pile, sachant que FI.0 contient le nombre de lignes de la pile...

    Bref, à voir votre fichier, voici l'algo qu'on pourrait écrire
    Pour I=1 à FI.0
    SI le caractère "=" n'est pas dans la ligne FI.I
    SI WINFO n'est pas vide ALORS
    écrire WINFO concaténé avec WDATA1 ...
    RàB des données de travail (W...)
    Récupération de WINFO
    Init de l'indice de données (j)
    FINSI
    SINON
    Eclater la ligne par rapport au signe "=" et au signe "," (donne donnéesx) ; j++; sauver dans la variable WDATA indicée par j
    FINSI
    FINPOUR
    Ecriture de la pile de travail sur le fichier en sortie...
    FIN

    Mais je peux comprendre que vous restiez sur votre faim. Allez, je suis inscrit sur ce forum pour aider tout un chacun. De ce fait, je vous propose de vous donner demain le code complet de cette routine REXX (je ne travaille plus en télé-travail le soir, 30 ans ça suffit, donc il vous faudra attendre demain soir...). Je dis ça mais après manger, je vais me connecter sur le Z-os du boulot et je vais me taper cette routine... Que voulez-vous, on ne se refait pas ;=)
    A plus tard...

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci pour ce début de réponse, mais j'avoue ne pas tout comprendre dans ta réponse BiTonio car effectivement je suis totalement novice dans ce langage.

    Auriez-vous un exemple de code sur lequel je puisse m'appuyer..? Toutes ces explications me semblent abstraites et j'avoue avoir besoin de pratiquer pour comprendre...

    Désolé pour cette réponse tardive mais si vous pouviez me donner un dernier coup de main...

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur et formateur Mainframe
    Inscrit en
    Février 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur et formateur Mainframe
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 44
    Points : 103
    Points
    103
    Par défaut
    Bonjour,

    Voici un REXX qui devrait fonctionner (si j'ai bien compris la structure du fichier à traiter)

    Code : 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
    32
    33
    34
    35
    36
    37
    38
    /* REXX <= obligatoire sur la premiere ligne d'un rexx !!                     */
    /* Algorithme :                                                               */
    /*  1) Lire le fichier de DDNAME DDE1                                         */
    /*     Chaque enregistrement est charge dans un item E1.                      */
    /*  2) Boucle sur l'ensemble des item E1.                                     */
    /*  3) Pour chaque item E1.,                                                  */
    /*     3a) si la chaine de caracteres correspondant a l'extraction de 4       */
    /*         caracteres depuis la 3eme position vaut 'Info' alors               */
    /*         3a1) incrementer le compteur de lignes                             */
    /*         3a2) creer un nouvel item S1. valorise avec l'extraction des       */
    /*              caracteres de E1 depuis le 3eme caractere                     */
    /*     3b) sinon                                                              */
    /*         3b1) determiner la position du signe '=' dans E1                   */
    /*         3b2) determiner la position de la premiere virgule dans E1         */
    /*         3b3) concatener a l'item S1. cree en 3a2) une virgule et le contenu*/
    /*              de l'extraction de E1 depuis le signe = jusqu'a et y compris  */
    /*              le dernier caractere avant la premiere virgule                */
    /*  4) Ecrire dans un fichier de DDNAME DDS1 tous les item S1.                */
    /******************************************************************************/
    "Execio * DiskR DDE1 (Finis Stem E1."   /* etape 1 */                                 
                                                                                    
    l=0 /* initialiser a zero le compteur l */                                      
                                                                        
    Do i=1 To E1.0 /* E1.0 correspond au nombre d'item E1. */           
       If Substr(E1.i,3,4)='Info'                                       
          Then Do                    /* etape 3a  */                    
                 l=l+1               /* etape 3a1 */                    
                 S1.l=Substr(E1.i,3) /* etape 3a2 */                    
               End                                                      
          Else Do                                       /* etape 3b  */ 
                 PosEq=Pos('=',E1.i)                    /* etape 3b1 */ 
                 PosV1=Pos(',',E1.i)                    /* etape 3b2 */ 
                 S1.l=S1.l','Substr(E1.i,PosEq,PosV1-1) /* etape 3b3 */ 
               End                                                      
    End                                                                 
    "Execio * DiskW DDS1 (Finis Stem S1." /* etape 4 */                 
    Exit
    Il y a moins de code que d'explications (et encore j'aurais pu imbriquer des fonctions) mais quand on débute autant faire du pas à pas.

    N'hésitez pas à me dire si je n'ai pas été assez clair.

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/08/2014, 17h22
  2. Réponses: 4
    Dernier message: 26/09/2011, 16h12
  3. rexx et abend programme
    Par bernard59139 dans le forum z/OS
    Réponses: 0
    Dernier message: 11/05/2011, 15h48
  4. [REXX] Adressage ISPSTART pour un sous-programme
    Par icalinf dans le forum Autres langages
    Réponses: 0
    Dernier message: 26/10/2007, 20h51

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