Bonjour,
J’ai regardé dans la doc, mais je n’ai pas trouvé, alors je pose quand même la question..
Est-il possible de copier des membres de façon générique :
Select member=(rac*)
Merci d’avance pour votre aide.
Bonjour,
J’ai regardé dans la doc, mais je n’ai pas trouvé, alors je pose quand même la question..
Est-il possible de copier des membres de façon générique :
Select member=(rac*)
Merci d’avance pour votre aide.
La reponse est non avec l'IEBCOPY standard IBM
Toutefois certains sites ont installé PDSMAN qui fournit entre autres un IEBCOPY acceptant le générique. A défaut, comme souvent, un REXX qui fait un relevé des membres (TSO LISTDS) et génére l'IEBCOPY, ou mieux via un LMCOPY qui accepte effectivement le générique. Ou enfin, trivialement par JCL (LISTPDS IEHLIST + SORT avec l'INCLUDE et l'OUTREC qui va bien + IEBCOPY des membres passés dans le SYSIN généré par le step SORT).
Exemple REXX ;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 .......... /* COPY DU MEMBRE */ Address ISPEXEC "LMINIT DATAID(DDIN1) DATASET("PDSIN") ENQ(SHRW)" "LMINIT DATAID(DDOUT) DATASET("PDSOU") ENQ(SHRW)" "LMCOPY FROMID("DDIN1") FROMMEM("MEMBER")" , "TODATAID("DDOUT") REPLACE" WRC = RC "LMFREE DATAID("DDIN1")" "LMFREE DATAID("DDOUT")" RETURN WRC
Bonjour et merci pour cette réponse précise.
J'ai fait "en attendant une réponse sur ce site un rexx simumaire au votre.
J'ai juste un petit souci avec ce rexx : Quand je l'utilise en mode Noreplace, il plante avec un message :
******************************************************************************
* ISRLS212 *
* *
* Members not replaced *
* 19 members not replaced, 0 members copied *
* *
* *
* *
* *
* *
* *
* Current dialog statement: *
* LMCOPY FROMID(ISR00001) FROMMEM(C*) TODATAID(ISR00002) *
* *
existe t-il un moyen d'éviter de sortir brutaelment de cette façon ?
j'ai un nouveau poste à ajouter et puisque c'est dans la continuité, je préfère l'ajouter à cet endroit.
Lorsque je fais le lmcopy via un panel ça marche parfaitement mais lorsque je veux passer par un batch, ça plante avec le message d'erreur ci-dessous :
le souci c'est que dès que j'ai une commande ispexec, je n'arrive as à passer de rexx par batch. Y a t-il un paramètre à rajouter dans mon jcl :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 ADDRESS ISPEXEC "LMINIT DATAID(FICS) DATASET(xxx.JCLLIB) ENQ(SHRW)" "LMINIT DATAID(FICS) DATASET(xxx.JCLLIB) ENQ(SHRW)" RC(-3) +++ "LMINIT DATAID(FICC) DATASET(xxx.JCLLIB.TEST) ENQ(SHRW)" "LMINIT DATAID(FICC) DATASET(xxx.JCLLIB.TEST) ENQ(SHRW)" RC(-3) +++ "LMCOPY FROMID(&FICS) FROMMEM(C*) TODATAID(&FICC) REPLACE" "LMCOPY FROMID(&FICS) FROMMEM(C*) TODATAID(&FICC) REPLACE"
//XXX02E JOB (S),MSGCLASS=X,CLASS=O,NOTIFY=PB00302
/*JOBPARM SYSAFF=*
//*SICAP SETVAR
//COPSTE EXEC PGM=IKJEFT01,DYNAMNBR=30,REGION=5000K
//SYSEXEC DD DSN=XXXX.REXXLIB,DISP=SHR
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
%COPMBR02
//*
Merci d'avance pour votre aide.
1) Pour réponse générale, il faut comprendre que les services LM sont des services ISPF (on passe d'ailleurs un address ISPEXEC en amont dans le REXX). IKJEFT01 est l'interface TSO BATCH. Il doit 'monter' ISPF. C'est l'ordre ISPSTART qui fait ça, étant entendu qu'il est déjà passé dans sa logon procédure TSO, il va manquer en batch avec d'ailleurs tous les PDS nécessaires au fonctionnement d'ISPF. Il faut donc un JCL BATCH ressemblant à ça :
2) Ensuite sur la question des erreurs, pour TSO un RC > 0 ou 4 representera une erreur grave. Pour ISPF c'est un RC > 8 qui est significatif d'une erreur grave et qui fera 'planter'.
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 // job ...... //PREFISP SET PREFISP='ISP' //REXXLB SET REXXLB='MY.BIBLIO.DE.REXX' //*----------------------------------------------------------------* //IKJ EXEC PGM=IKJEFT01,DYNAMNBR=100,REGION=4M //* Appel direct via PARM=('ISPSTART CMD(%MONREXX MYPARAM') //SYSTSIN DD * PROFILE NOPREFIX ISPSTART CMD(%MONREXX MYPARAM) //SYSPROC DD DSN=&PREFISP..SISPCLIB,DISP=SHR //SYSEXEC DD DISP=SHR,DSN=&REXXLB //SYSTSPRT DD SYSOUT=* //ISPLOG DD DUMMY //ISPPROF DD DSN=&&PROF,DISP=(NEW,PASS), // DCB=(LRECL=80,BLKSIZE=6160,RECFM=FB), // SPACE=(TRK,(2,1,2)),UNIT=VIO //ISPMLIB DD DSN=&PREFISP..SISPMENU,DISP=SHR //ISPSLIB DD DSN=&PREFISP..SISPSENU,DISP=SHR //ISPPLIB DD DSN=&PREFISP..SISPPENU,DISP=SHR //ISPTLIB DD DSN=&PREFISP..SISPTENU,DISP=SHR //SYSTSPRT DD SYSOUT=* //SYSTERM DD SYSOUT=* //SYSABEND DD SYSOUT=* //ISPLOG DD SYSOUT=*, // LRECL=120,BLKSIZE=2400,DSORG=PS,RECFM=FB
Donc en REXX cela suppose de neutraliser un CALL ou SIGNAL ON ERREUR éventuel par un CALL ou SIGNAL OFF ERREUR avant de passer des commandes ISPF. ISPF va 'planter' sur tout RC > 8. Ca se neutralise par un address ISPEXEC 'CONTROL ERRORS RETURN' en amont, ce qui permet ensuite de tester tout RC après un appel de service ISPF pour gérer les erreurs dens le REXX.
Ca c'est de la réponse !!!
Un grand merci.
Bonne journée.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager