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 :

Fonction OGET dans un REXX


Sujet :

z/OS

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 45
    Points : 28
    Points
    28
    Par défaut Fonction OGET dans un REXX
    Bonjour,

    Je chercher a récupérer un fichier via la fonction suvante dans un rexx:
    OGET 'fic_unix' 'fic_zos'

    Je souhaiterais que la copy soit en extend dans le cas ou il existe déja.

    Est ce que cela est possible de paramétrer OGET ?

  2. #2
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 45
    Points : 28
    Points
    28
    Par défaut
    Ne trouvant le moyen de paramèter correctement la fonction OGET.

    Je souhaiterais savoir, si il est possible en rexx de faire la chose suivante :

    Le fichier destination existe déja et son nom est connu
    - Allouer un fichier temp sur le même format que le final (pas de soucis)
    - Decharger le fichier de la fonction OGET sur le fichier Temp(pas de soucis)
    - Copier le fichier temporaire sur le fichier destination en extend (alors la...)

  3. #3
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    L'ajout en 'EXTEND' c'est le DISP=MOD du JCL. Il suffit donc dans son JCL de coder qque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //STEP002  EXEC PGM=SORT                       
    //SYSOUT   DD  SYSOUT=*                        
    //SYSPRINT DD  SYSOUT=*                        
    //SORTIN   DD  DISP=SHR,DISP=DSN=FICHIER.EN.ENTREE      
    //SORTOUT  DD DSN=FICHIER.EN.SORTIE,DISP=MOD,  
    //           SPACE=(TRK,(15,15)),UNIT=3390,LIKE=FICHIER.EN.ENTREE 
    //SYSIN    DD  *                               
     SORT FIELDS=COPY                              
     OUTREC FIELDS=(1,80)                          
    //*
    Si on veut faire ça en REXX sous TSO on à également la possibilité des spécifier MOD dans son ALLOC fichier qui sera donc complété s'il existe déjà par ce que l'on aura ecrit ensuite par 'EXECIO' nblignes 'DISKW ddname (STEM TAB. FINIS' (pour exemple)

    Maintenant quand on parle de commande TSO (ALLOC, FREE, ou même OGET comme indiqué dans le 1er post, il faut se rappeller que l'on dispose d'un HELP pour toutes ces commandes et que les infos fournies sont assez détaillées.
    TSO HELP OGET par exemple.
    Personnellement j'utilise un REXX comme ceci (appellons le TED pour l'exemple. Il intercepte les lignes affichées à l'écran pour avoir le résultat du HELP en EDIT. Ca me permet de saisir TSO TED HELP OGET. Avoir le fichier en EDIT est un + pratique pour faire du find en particulier.

    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
    /* TED : REXX DE RECUPERATION D'UN HELP OU DE TOUT AFFICHAGE ECRAN   */ 
    /*         VIA UNE PROCEDURE EN EDIT SUR SON FICHIER ISPF ZTEMPF     */ 
    /*       - ON PEUT INSERER UNE MACRO EDIT (MACRO(xxx)) AVANT la cde  */ 
    /* ----------------------------------------------------------------- */ 
    Arg COMMAND                                                             
    MACRO = ''                                                              
    if left(COMMAND,6) = 'MACRO(' then parse var COMMAND MACRO COMMAND      
    if length(COMMAND) = 0 then do                                          
       say "Erreur: TED DOIT RECEVOIR DES PARAMETRES POUR LES TRAITER"      
       say "        Exemple --> TSO TED HELP LISTCAT"                       
       say "                --> TSO TED LISTALC     "                       
       say "----------------------------------------"                       
       exit 4                                                               
    end                                                                     
    address TSO                                                             
    x = outtrap("trap.","*")          /* interception de l'affichage */     
    command                           /* execution de la cde en PARM */     
    x= outtrap("off")                 /* remise en service affichage */     
    "ISPEXEC CONTROL ERRORS RETURN"                                         
    Address ISPEXEC "VGET (ZTEMPF)"   /* ALLOC sur DDNAME ALEATOIRE  */     
    DDN = "TP"random()                                                      
    "ALLOC DD("DDN") DA('"ZTEMPF"') SHR"                                    
    "EXECIO * DISKW" DDN "(FINIS STEM trap."                                
    Address ISPEXEC "EDIT  DATASET('"ZTEMPF"')" MACRO                       
    if RC > 8 then do   /* EDIT sur ZTEMPF non récursif ! */                
       ZEDLMSG = "Sortir de l'Edit" ZTEMPF "avant de relancer TED !"        
       "ISPEXEC SETMSG MSG(ISRZ001)"                                        
    end                
    "FREE DD("DDN")"   
    EXIT RC

  4. #4
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 45
    Points : 28
    Points
    28
    Par défaut
    Merci Homer pour toutes ces infos, j'arrive à un truc du genre qui fait ce que je veux...(Y a surement mieux mais j'ai réussis à faire marché ca) a part qu'il faut que je delete le fichier temp

    y'a t-il moyen de faire que mon TMP_NZOS soit vraiment un fichier temp ?
    J'ai pas réussis à faire fonctionner ton exemple de génération de fichier ave le VGET et le ZTEMP, j'ai un rc(-3) sur le VGET

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TMP_NZOS = xxxxxxxx.yyyyyyyy.zzzzzzzz
    "ALLOC DD(TEMP0) DA('"TMP_NZOS"') LIKE ('"VAL_NZOS"') NEW"
    "OGET '"VAL_NNAS"'  '"TMP_NZOS"' "PAR_BIN
    "ALLOC DD(TEMP1) DA('"VAL_NZOS"') MOD"
    "EXECIO * DISKR TEMP0  (STEM TMP. FINIS"
    "EXECIO * DISKW TEMP1  (STEM TMP. FINIS"
    "FREE DD(TEMP0)"
    "FREE DD(TEMP1)"

  5. #5
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    y'a t-il moyen de faire que mon TMP_NZOS soit vraiment un fichier temp ?
    J'ai pas réussis à faire fonctionner ton exemple de génération de fichier ave le VGET et le ZTEMP, j'ai un rc(-3) sur le VGET
    Pour ce que j'ai déjà vu, un RC-3 sur une commande ISPF (ici VGET) est assez typique d'un ISPF non démarré. Sous TSO il l'est nécessairement, donc tu dois essayer de passer ton REXX en Batch.
    Si c'est le cas comme je l'imagine, il est inutile, voire risqué, de passer des alloc dans ton REXX. Utilise le JCL d'exécution de ton batch. JES fait ça très bien.
    J'ai déjà posté un exemple de JCL Batch d'un REXX qui passe des ordres ISPF sur ce forum. Je ne sais plus ou. De toutes façons, si tu essayes de travailler avec le fichier ISPFILE d'ISPF (VGET ZTEMPF), il risque d'être insuffisant. Voici donc un exemple de JCL batch qui devrait fonctionner après adaptation aux standards de ton site et ajout des DD que tu utilises via EXECIO (TEMPO et TEMP1).
    Il faut faire monter ISPF via un ISPSTART et indiquer ensuite ton REXX à exécuter. De plus, il te faut allouer (avec une ISPPROF de travail et les autres bibliothèques ISPxLIB nécessaires à ISPF), un fichier ISPFILE et ISPCTL1 si tu veux travailler avec ZTEMPF.
    En ce qui concerne tes DD TEMPO et TEMP1, tu peux les mettre en DISP(NEW,PASS) sur un fichier DSN=&&TEMPO (par exemple) pour TEMPO et un DISP MOD pour TEMP1. Ca devrait règler ton problème de delete.

    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
    //user JOB ........  
    //*-----------------------------------------------------------
    //REXXLIB  SET  REXXLIB='ta.bib.de.REXX'                       
    //PREFISP  SET  PREFISP='ISP'    prefixe des bib ISPF sur le site                 
    //STPISPF  EXEC PGM=IKJEFT01,DYNAMNBR=10                      
    //* APPEL DIRECT VIA PARM=('ISPSTART CMD(%MYREXX MYPARAM')   
    //*                                                           
    //SYSTSIN  DD  *                                              
    PROFILE NOPREFIX                                              
    ISPSTART CMD(MYREXX MYPARAM)                  
    //*                                                           
    //SYSPROC  DD  DSN=&PREFISP..SISPCLIB,DISP=SHR                
    //SYSEXEC  DD  DISP=SHR,DSN=&REXXLIB                          
    //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                           
    //ISPFILE  DD  DSN=&&ISPF0,DISP=(NEW,PASS),                   
    //     DCB=(LRECL=80,BLKSIZE=800,RECFM=FB,DSORG=PS),          
    //     SPACE=(TRK,(2,1)),UNIT=VIO                             
    //ISPCTL1  DD  DSN=&&ISPF1,DISP=(NEW,PASS),                   
    //     DCB=(LRECL=80,BLKSIZE=800,RECFM=FB,DSORG=PS),          
    //     SPACE=(TRK,(2,1)),UNIT=VIO                             
    //ISPWRK1  DD  DSN=&&ISPF2,DISP=(NEW,PASS),                   
    //     DCB=(LRECL=80,BLKSIZE=2560,RECFM=FB,DSORG=PS),   
    //     SPACE=(TRK,(2,1)),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=*                                 
    //*

  6. #6
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 45
    Points : 28
    Points
    28
    Par défaut
    Merci Homer.

    Ce JCL me permet effectivement de lancer la fonction VGET sans problème.

    Pour les allocs TEMP0 etTEMP1 je suis obligé de les faire dans le REXX car le nom du fichier à ouvrir est dans une donnée dans un fichier.

    De plus les informations pour la création ne sont aujourd'hui pas connus...dans ce cas la fonction OGET crée un fichier VB 255.

    Je risque donc prochainement de devoir récupérer le nom, taille, format du fichier à créer en sortie de la fonction OGET. Je pense donc que je suis obligé de faire les alloc dans le REXX

  7. #7
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 45
    Points : 28
    Points
    28
    Par défaut
    Rebonjour,

    Il semble que depuis que j'ai changé la manière d'appeler le REXX, les codes retour ne sont plus gérés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ISPD117
    The initially invoked CLIST ended with a return code = 8
     NULLFILE was preallocated (no free was done).
    READY
    END
    J'ai message en Sysprint cependant j'ai un RC 0 au step du rexx.

    Je suppose que mes codes retours sont intercepté par ISPF.
    La question est donc comment les remettre

  8. #8
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 45
    Points : 28
    Points
    28
    Par défaut
    Bon apparement voila solution qui marche dans mon cas :

    Sans ISPF :
    Avec ISPF :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ZISPFRC = RC
    ADRESS ISPEXEC "VPUT (ZISPFRC) SHARED"
    EXIT RC

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/08/2014, 18h22
  2. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 12h42
  3. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 14h33
  4. Réponses: 7
    Dernier message: 24/05/2003, 16h56
  5. [VBA-E] Fonction sum() dans une cellule
    Par Gonzo dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/12/2002, 11h18

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