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 :

REXX - Chercher occurrences dans des membres de PDS


Sujet :

z/OS

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur système MVS en apprentissage
    Inscrit en
    Octobre 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur système MVS en apprentissage

    Informations forums :
    Inscription : Octobre 2019
    Messages : 2
    Points : 1
    Points
    1
    Par défaut REXX - Chercher occurrences dans des membres de PDS
    Bonjour à tous,

    Nouveau dans le REXX je cherche à récupérer des occurrences dans des membres de PDS.

    Par exemple dans le PDS : "EXEMPLE.PDS.MEMBRES" qui contient X membres (5 par exemple : MEMBRE1 / MEMBRE2 / MEMBRE3 / MEMBRE4 / MEMBRE5)

    je voudrais trouver par exemple le mot /INCLUDE (mis en 1ere position) dans un ou plusieurs de ces membres.

    Comme vous pouvez le constater ci-dessous mes compétences sont vite atteintes en l'état de mes connaissances sur REXX (j'apprends... ) J'arrive à récupérer les membres de mon PDS dans un PS ou à l'afficher via un "SAY" mais je bloque pour la suite. J'ai essayé pas mal de trucs qui ont tous été infructueux jusqu’à présent, raison pour laquelle je me permet de vous demander votre aide.

    Si une âme charitable aurait la gentillesse de m'aider je l'en remercie mille fois par avance.

    /* REXX */

    v=0

    x=outtrap("z.")

    "LISTD" EXEMPLE.PDS.MEMBRES "MEMBERS"

    x=outtrap("off")

    do i=7 to z.0
    v=v+1
    y.v=strip(z.i)

    end

    "ALLOC FI(EXOOUT) DA('GEOFRAY.REXX.SORTIE') SHR REUSE"
    "EXECIO "v" DISKW EXOOUT (STEM y. FINIS"

    Encore merci pour votre aide.

    Geofray

  2. #2
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Bonjour,

    En principe pour une recherche assez simple, c'est inutile d'écrire une procédure REXX, un outil comme PDSMAN de CA sait faire cela.

    Tape " PDSM18 Utility " sur GOOGLE.

    Là, c'est une solution batch, d'autres solutions sont possibles avec EZYEDIT sous TSO (c'est le même outil d'ailleurs).


    Sinon, pour ton REXX, il te faut une fonction de recherche de chaînes de caractères, la fonction POS pourrait faire l'affaire.


    Par contre, dans la phrase :
    " je voudrais trouver par exemple le mot /INCLUDE (mis en 1ere position) "

    Que veux tu dire par : " mis en 1ere position " ?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur système MVS en apprentissage
    Inscrit en
    Octobre 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur système MVS en apprentissage

    Informations forums :
    Inscription : Octobre 2019
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour Luc,

    Merci pour ta réponse et pour ton aide.

    Malheureusement je n'ai pas le choix, je ne peux que le développer en REXX cela m'est imposé

    Ce que je veux dire c'est que dans certains membres du dit PDS, "INCLUDE" peut se trouver n'importe où. Dans d'autres il n'est qu'au début d'une ligne (d’où mon "1ere position") avec un slash devant "/INCLUDE"

    Comme pour une carte EXEC par exemple avec ses "//" en début de ligne pour te donner une idée de la position.

    Et c'est précisément uniquement ces noms de membres contenants /INCLUDE en début de ligne que je doit afficher dans mon fichier en sortie.

    Encore merci pour ton aide et ta réponse.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 554
    Points
    38 554
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Voici un script pannel et programme REXX qui permettent de remplacer une chaine de caractères dans les membres d'un PDS entre deux colonnes.
    J'avais écrit ce traitement il y a pas mal d'années pour m'exercer au REXX
    Le principe est de saisir le nom du PDS, la colonne début et fin, puis la chaîne de caractères source et cible ; le traitement vérifie l'existence du PDS puis effectue le remplacement dans tous les membres où la chaîne source est trouvée entre les colonnes saisies.

    Script Panel :
    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
    )ATTR
     % TYPE(TEXT)  INTENS(HIGH)  COLOR(TURQ)
     + TYPE(TEXT)  INTENS(LOW)   COLOR(BLUE)
     $ TYPE(INPUT) INTENS(HIGH)  COLOR(YELLOW) CAPS(ON)  JUST(LEFT) PAD('_')
     Ł TYPE(INPUT) INTENS(HIGH)  COLOR(YELLOW) CAPS(OFF) JUST(LEFT) PAD('_')
     * TYPE(TEXT)  SKIP(ON)
    )BODY EXPAND(//)
    +
    +                Kikiveu remplacer des trucs ?                     % &zd
    +                                                                  % &zt
    +                                                                  % &zu
    +
    +
    +/ / PDS :* $DSNM                                        * / /+
    +
    +/ / CHAINE DE CARACTERES :ŁCH0                          * / /+
    +/ / A REMPLACER PAR      :ŁCH1                          * / /+
    +/ /                                            / /+
    +/ / Entre les colonnes   :$CO0*et$CO1*         / /+
    +/ /                                            / /+
    +/ /                                            / /+
    +/ /                                            / /+
    +/ /                                            / /+
    +/ / - V=Valider   X=Sortie                     / /+
    +/ /                                            / /+
    +/ /       CHOIX : _C*                          / /+
    +/ /
    +/ / PF3=RETOUR PF4=FIN
    +
    )INIT
        .HELP = MAJHLP00
    )REINIT
        REFRESH(ZTIME)
    )PROC
    )END
    Script programme :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    
    /* REXX */
    /*==================================================================*/
    /* MAJPDS : remplacement d'une chaine de caractères par une autre   */
    /*          dans un pds dont le nom est saisi sur panel CLIST       */
    /*          entre colonnes saisies en parametre                     */
    /*==================================================================*/
    INIT:
       "ALTLIB ACTIVATE APPLICATION(CLIST) DATASET('TSUS721.SCT.REXX.PROGS')"
       "ISPEXEC LIBDEF ISPPLIB DATASET ID('TSUS721.SCT.REXX.PANEL')"
       "ISPEXEC LIBDEF ISPSLIB DATASET ID('TSUS721.SCT.REXX.PROGS')"
       "ISPEXEC LIBDEF ISPMLIB DATASET ID('TSUS721.SCT.REXX.MESSG')"
        TRACE O
        PROF NOPREF
        TSOUSER = USERID()
        ZDATE=SUBSTR(DATE(S),7,2)!!'-',
            !!SUBSTR(DATE(S),5,2)!!'-',
            !!SUBSTR(DATE(S),1,4)
        OUKIFO  ='DSNM'   /* Au départ, le curseur est sur le DSN */
    
    MAIN:
        DO  UNTIL STRIP(C) = 'X'
            ERREUR = 0
            ADDRESS ISPEXEC 'DISPLAY PANEL(MAJPDS) CURSOR(' OUKIFO
            IF  RC > 0 THEN CALL BYEBYE  /* SI PF3 OU PF4 : EXIT LOOP */
            CALL CONTROLES
            IF  C='V' & ERREUR = 0 THEN DO
                CALL ALLOCATE_FILES
            END
            C=' '
        END
    
    BYEBYE:
       "ALTLIB DEACTIVATE APPLICATION(CLIST)"
       "ISPEXEC LIBDEF ISPPLIB"
       "ISPEXEC LIBDEF ISPSLIB"
       "ISPEXEC LIBDEF ISPMLIB"
        EXIT
    
    CONTROLES:
        OUKIFO ='C'
        IF  STRIP(DSNM) = '' THEN DO
            ERREUR = 1
            OUKIFO ='DSNM'
            ADDRESS ISPEXEC 'SETMSG MSG(MJPE001)'      /* obligatoire    */
        END
        ELSE DO
            RC=SYSDSN("'"STRIP(DSNM)"'")
            IF  RC<>'OK'  THEN DO
                ERREUR = 1
                OUKIFO ='DSNM'
                ADDRESS ISPEXEC 'SETMSG MSG(MJPE002)'  /* dsn non trouve */
            END
        END
        IF  ERREUR = 0,
        &   STRIP(CH0) = '' THEN DO
            ERREUR = 1
            OUKIFO ='CH0'
            ADDRESS ISPEXEC 'SETMSG MSG(MJPE001)'      /* obligatoire    */
        END
        IF  ERREUR = 0,
        &   STRIP(CH1) = '' THEN DO
            ERREUR = 1
            OUKIFO ='CH1'
            ADDRESS ISPEXEC 'SETMSG MSG(MJPE001)'      /* obligatoire    */
        END
        IF  STRIP(CO0) = '' THEN CO0=001
        IF  STRIP(CO1) = '' THEN CO1=080
        IF  ERREUR = 0,
        &   DATATYPE(CO0)<>'NUM'  THEN DO
            ERREUR = 1
            OUKIFO ='CO0'
            ADDRESS ISPEXEC 'SETMSG MSG(MJPE003)'      /* non numerique */
        END
        IF  ERREUR = 0,
        &   DATATYPE(CO1)<>'NUM'  THEN DO
            ERREUR = 1
            OUKIFO ='CO1'
            ADDRESS ISPEXEC 'SETMSG MSG(MJPE003)'      /* non numerique */
        END
        IF  ERREUR = 0,
        &   CO1 < CO0       THEN DO
            ERREUR = 1
            OUKIFO ='CO0'
            ADDRESS ISPEXEC 'SETMSG MSG(MJPE004)'      /* mini > maxi !  */
        END
        IF  ERREUR = 0,
        &   LENGTH(CH0) > CO1-CO0+1  THEN DO
            ERREUR = 1
            OUKIFO ='CO0'
            ADDRESS ISPEXEC 'SETMSG MSG(MJPE005)'      /* impossible     */
        END
        RETURN
    
    ALLOCATE_FILES:
    /* FICHIER RAPPORT EN SORTIE */
        NBMBRS = 0
       "ALLOC FI(XXOUT) DA('TSUS721.MAJPDS.PRINT') MOD REUSE LRECL(133)"
        IF  RC ^= 0  THEN DO
            SAY 'ERR002 PROBLEME ALLOCATION XXOUT' RC
            EXIT 0
        END
        RECOUT.1=Insert( '-', '', 1, 131, '-' )
        RECOUT.2="---" ZDATE "-" TIME(N),
                 "--- Recherche de la chaine " CH0 " dans " DSNM,
                 " entre les colonnes " CO0 " et " CO1
        RECOUT.3=Insert( '-', '', 1, 131, '-' )
        RECOUT.0=3
        "EXECIO" RECOUT.0 "DISKW XXOUT (STEM RECOUT."
    
    /* PDS A EXAMINER            */
        NBFND=0
        "ISPEXEC LMINIT DATAID(DATAID) DATASET('"DSNM"') ENQ(SHR)"
        IF  RC > 0  THEN RETURN 0
        "ISPEXEC LMOPEN DATAID("DATAID")"
        IF  RC > 0  THEN DO
            "ISPEXEC LMFREE DATAID("DATAID")"
            RETURN 0
        END
        MEMNAME = ''
        "ISPEXEC LMMLIST DATAID("DATAID") OPTION(LIST) MEMBER(MEMNAME)" ,
                "PATTERN(*)"
        DO  WHILE  RC = 0
            CALL CHK_UPD_MBR
            "ISPEXEC LMMLIST DATAID("DATAID") OPTION(LIST) MEMBER(MEMNAME)" ,
                    "PATTERN(*)"
        END
        "ISPEXEC LMCLOSE DATAID("DATAID")"
        IF  RC > 0  THEN DO
            "ISPEXEC LMFREE DATAID("DATAID")"
            RETURN 0
        END
        "ISPEXEC LMFREE DATAID("DATAID")"
    /*  */
        RECOUT.1="------------------------------------------------"
    /*  RECOUT.2="--- MEMBRES CONSULTES :" NBMBRS - 6     */
        RECOUT.2="--- MEMBRES CONSULTES :" NBMBRS
        RECOUT.3="--- DONT CONTENANT LA CHAINE '" CH0 "' :" NBFND
        RECOUT.4="------------------------------------------------"
        RECOUT.0=4
        "EXECIO" RECOUT.0 "DISKW XXOUT (STEM RECOUT."
        "EXECIO 0 DISKW XXOUT (FINIS"
        "FREE F(XXOUT)"
        RETURN
    
    CHK_UPD_MBR:
        SAVERC=0
        MEMNAME=STRIP(MEMNAME)
        HDR=1
        RECIN.0=0
        NBMBRS = NBMBRS + 1
        SAY "MEMBER="DSNM"("MEMNAME")"
        "ALLOC F(XXIN) DS('"DSNM"("MEMNAME")') OLD REUSE"
        "EXECIO * DISKR XXIN (STEM RECIN. FINIS"
        FND=0
        DO  RECID = 1 TO RECIN.0
            /* 1ere position de la chaine dans l'enreg lu                 */
            DEB=POS(CH0,RECIN.RECID)
            /* position a modifier compte tenu des colonnes en parametre  */
            RECUPD=SUBSTR(RECIN.RECID,CO0,CO1+1-CO0)
            DB1=CO0+POS(CH0,RECUPD)-1
            IF  DB1 >= CO0,
            &   DB1 <= CO1  THEN DO
                IF  FND=0   THEN DO
                    FND=1
                    NBFND=NBFND+1
                END
                CALL REPLACE_STR
                IF  HDR = 1 THEN DO
                    RECOUT.1=Insert( '-', '', 1, 50, '-' )
                    RECOUT.2="LLL " MEMNAME " CONTIENT <" CH0 ">   LLL"
                    RECOUT.0=2
                    "EXECIO" RECOUT.0 "DISKW XXOUT (STEM RECOUT."
                    HDR=0
                END
                VLG=LENGTH(RECID)
                VED=INSERT('0',RECID,,9-VLG,0)
                RECOUT.1 = 'REC-' !! VED !! ' ' !! RECIN.RECID
                RECOUT.0=1
                "EXECIO" RECOUT.0 "DISKW XXOUT (STEM RECOUT."
            END
        END
    /*  "EXECIO * DISKW XXIN (STEM RECIN. FINIS"   */
        "EXECIO" RECIN.0 "DISKW XXIN (STEM RECIN. FINIS"
        "FREE F(XXIN)"
        RETURN
    
    REPLACE_STR:
    /*  SAY MEMNAME ' ligne ' RECID 'avant : ' RECIN.RECID */
        DO  UNTIL  DB1=0
            RECUPD=LEFT(RECIN.RECID,DB1-1)!!CH1!!SUBSTR(RECIN.RECID,DB1+LENGTH(CH0))
            RECIN.RECID=RECUPD
            RECUPD=SUBSTR(RECIN.RECID,CO0,CO1+1-CO0)
            DB1=CO0+POS(CH0,RECUPD)-1
            /* Si au dela des colonnes choisies, on sort de la boucle */
            IF  DB1 > CO1  ! DB1 < CO0 THEN  DB1=0
        END
    /*  SAY MEMNAME ' ligne ' RECID 'apres : ' RECIN.RECID */
        RETURN
    Et enfin le fichier de messages correspondants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    === MJPEnn messages d'erreur application MAJPDS
    MJPE001 'Zone obligatoire'          .ALARM=YES
    'MJPE001 - Zone obligatoire'
    MJPE002 'PDS erroné'                .ALARM=YES
    'MJPE002 - Ce PDS n existe pas'
    MJPE003 'Non numérique'             .ALARM=YES
    'MJPE003 - Saisir une valeur numérique'
    MJPE004 'Mini > Maxi'               .ALARM=YES
    'MJPE004 - La valeur 1 doit être < à la valeur 2'
    MJPE005 'Lg chaine > C1-C0'         .ALARM=YES
    'MJPE005 - Colonnes de rech incompatibles avec lg de la chaine recherché

  5. #5
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut
    Bonjour

    Pourquoi ne pas utiliser le Searchfor?

  6. #6
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Dans ta procédure REXX, tu as une première boucle de recherche sur la liste des membres du PDS, et ça c'est OK.

    Mais te faut en plus une seconde boule imbriquée qui fera la recherche à l'intérieur du membre en cours de traitement, après l'avoir alloué et ouvert.

    En tout cas, c'est comme cela que je procéderais ...

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 554
    Points
    38 554
    Billets dans le blog
    9
    Par défaut
    Le traitement rexx que j'ai publié un peu plus haut fonctionne, je l'avais testé à l'époque.
    Encore une fois il avait été créé à but purement didactique, mais il est opérationnel.
    Comme il est commenté, ça facilite la vie pour l'apprentissage du langage ce qui semble être le souhait du demandeur

  8. #8
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Je parlais de la procédure REXX de JOJOZ ...

  9. #9
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Je suis parti de l'exemple initial de JOJOZ et j'obtiens :


    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
    TRACE O
    PDS=" my PDS "
    V=0
    X=OUTTRAP(Z.)
    "LISTD '"PDS"' MEMBERS"
    X=OUTTRAP("OFF")
    DO I=7 TO Z.0
       V=V+1
       Y=STRIP(Z.I)
       "ALLOC F(MBR) DA('"PDS"("Y")') SHR REUSE"
       "EXECIO * DISKR MBR (FINIS STEM L."
       "FREE F(MBR)"
       DO K=1 TO L.0
          IF SUBSTR(L.K,1,8)="/INCLUDE" THEN DO
             SAY "MEMBRE "Y "LIGNE" K
          END
       END
    END
    EXIT

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/06/2014, 11h10
  2. Réponses: 5
    Dernier message: 09/06/2010, 09h22
  3. Liste des membres d'1 PDS sous REXX
    Par Fred Ratel dans le forum z/OS
    Réponses: 3
    Dernier message: 29/09/2009, 19h41
  4. READ des membres de PDS
    Par Antichoc dans le forum z/OS
    Réponses: 2
    Dernier message: 27/11/2008, 16h11
  5. programme qui plante. chercher/remplacer dans des fichiers.
    Par [Hugo] dans le forum Général Python
    Réponses: 2
    Dernier message: 31/10/2006, 17h10

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