Resultados 1 al 10 de 10

Tema: Informar variable JCL con contenido de fichero.

  1. #1
      Acabo de llegar...
    R

    Registrado
    marzo de 2018
    Ubicación
    Madrid
    Mensajes
    5
    Última visita
    02.06.2022

    Agradecimientos
     
    Recibidos
    2
    Enviados
    4

    Citaciones y menciones
     
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    0 Post(s)
    Poder de Reputación
    0

    Predeterminado Informar variable JCL con contenido de fichero.

    Buenos días,

    Me va a llegar un fichero (por ejemplo F1), procedente de otra máquina, dicho fichero tiene un único registro con el nombre de otro fichero (F2).

    Lo que quiero tratar el F2, y sobre todo poder validar si tiene contenido.

    Con outrec he conseguido rellenar algunas fichas sysin, como las de LISTCAT con lo que puedo "preguntar" directamente por el fichero F2

    ejemplo

    JCL Código:
    1. //**********************************************************
    2. //SORT002  EXEC SORTD
    3. //SORTIN   DD DISP=SHR,DSN=F1          
    4. //SORTOUT  DD DSN=F3.SYSIN,                  
    5. //          DISP=(,CATLG,DELETE),                          
    6. //          SPACE=(CYL,(1,1),RLSE),                        
    7. //          RECFM=FB,BLKSIZE=0,LRECL=35                    
    8. //SYSIN    DD *                                        
    9.  SORT FIELDS=COPY                                          
    10.  OUTREC FIELDS=(C'  LISTCAT ENT(',1,20,C')')

    JCL Código:
    1. //*********************************************************************
    2. //LISTCA01 EXEC PGM=IDCAMS                                            
    3. //SYSPRINT DD DUMMY                                                    
    4. //SYSIN    DD DSN=F3.SYSIN,DISP=SHR

    Que es como si hubiera hecho esto.

    JCL Código:
    1. //*********************************************************************
    2. //LISTCA01 EXEC PGM=IDCAMS                                            
    3. //SYSPRINT DD DUMMY                                                    
    4. //SYSIN    DD *                                                        
    5.    LISTCAT ENT(F2)

    Lo malo es que este método no me funciona para otros procesos.

    Por favor ¿hay alguna manera de informar o setear una variable jcl con el contenido del F1 (el F2)?

    Saludos y gracias.

    0 Not allowed!

  2. #2
      Administrador
    Avatar de Kuk

    Registrado
    enero de 2015
    Ubicación
    Madrid
    Edad
    39
    Mensajes
    2,286
    Última visita
    Ayer a las 21:52

    Agradecimientos
     
    Recibidos
    1,036
    Enviados
    888

    Citaciones y menciones
     
    Mentioned
    102 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    31 Post(s)
    Poder de Reputación
    10

    Predeterminado

    @RaulC, a lo mejor podrías intentar grabando el dato que te interesa a un miembro de PDS el cual luego introduces en tu JCL con INCLUDE:

    JCL Código:
    1. //   JCLLIB ORDER=MI.LIBRERIA.PDS
    2. //   INCLUDE MIEMBRO

    Otra opción sería crear un JOB en dinámico (con un programa, o SORT OUTREC) y lanzarlo desde el JOB que lo ha creado con el siguiente step:

    JCL Código:
    1. //STEPJCL  EXEC PGM=IEBGENER,COND=(5,LT)
    2. //SYSIN    DD DUMMY
    3. //SYSPRINT DD SYSOUT=*
    4. //SYSUT2   DD SYSOUT=(A,INTRDR)
    5. //SYSUT1   DD DSN=&&FICHJLC,DISP=(OLD,DELETE,DELETE)
    6. /*

    Lugo está el REXX que no conozco mucho, pero se puede hacer muchas cosas. Lo mismo lo más fácil es tirar por ahí.

    0 Not allowed!
    ¿Te han ayudado? NO TE OLVIDES de darle al botón
    ¿Quieres dirigirte a alguien en tu post? Notifícale con una mención, tienes 2 opciones:
    1. Haciendo clic en el icono al lado de su nick
    2. Haciendo clic en el botón en el editor y escribiendo su nick.

  3. #3
      Acabo de llegar...
    R

    Registrado
    marzo de 2018
    Ubicación
    Madrid
    Mensajes
    5
    Última visita
    02.06.2022

    Agradecimientos
     
    Recibidos
    2
    Enviados
    4

    Citaciones y menciones
     
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    0 Post(s)
    Poder de Reputación
    0

    Predeterminado

    Cita Iniciado por Kuk Ver Mensaje
    @RaulC, a lo mejor podrías intentar grabando el dato que te interesa a un miembro de PDS el cual luego introduces en tu JCL con INCLUDE:

    JCL Código:
    1. //   JCLLIB ORDER=MI.LIBRERIA.PDS
    2. //   INCLUDE MIEMBRO

    Otra opción sería crear un JOB en dinámico (con un programa, o SORT OUTREC) y lanzarlo desde el JOB que lo ha creado con el siguiente step:

    JCL Código:
    1. //STEPJCL  EXEC PGM=IEBGENER,COND=(5,LT)
    2. //SYSIN    DD DUMMY
    3. //SYSPRINT DD SYSOUT=*
    4. //SYSUT2   DD SYSOUT=(A,INTRDR)
    5. //SYSUT1   DD DSN=&&FICHJLC,DISP=(OLD,DELETE,DELETE)
    6. /*

    Lugo está el REXX que no conozco mucho, pero se puede hacer muchas cosas. Lo mismo lo más fácil es tirar por ahí.
    Estoy analizando las propuestas que me has comentado, aunque creo que están todas prohibidas en mi instalación.

    He visto en algún ejemplo como se vuelcan fichas DD a variables JCL, como por ejemplo un sysprint. ¿Habría algún programa de utilidad o algo así para sacar el contenido de un fichero por sysout (u otra ficha DD)?

    Voy a mirarlo en detalle, saludos y muchas gracias.

    0 Not allowed!

  4. #4
      Administrador
    Avatar de Kuk

    Registrado
    enero de 2015
    Ubicación
    Madrid
    Edad
    39
    Mensajes
    2,286
    Última visita
    Ayer a las 21:52

    Agradecimientos
     
    Recibidos
    1,036
    Enviados
    888

    Citaciones y menciones
     
    Mentioned
    102 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    31 Post(s)
    Poder de Reputación
    10

    Predeterminado

    @RaulC, puedes hacer lo siguiente:

    En tu OUTREC escribe esto:

    CODE Código:
    1. REPRO INFILE(NOMBRE.FICHERO.OBTENIDO)  -

    Luego con IDCAMS copias el fichero el nombre del cual has escrito con OUTREC a uno con nombre definido por ti. Esto te permite reutilizarlo en DSN de los step siguientes:

    Para copiar el fichero usa:

    JCL Código:
    1. //S2002640 EXEC PGM=IDCAMS
    2. //SYSPRINT DD SYSOUT=*
    3. //OUT      DD DSN=FICHERO.DESTINO,
    4. //            DISP=(NEW,CATLG,DELETE),
    5. //            SPACE=(TRK,(10,10),RLSE),
    6. //            RECFM=FB,LRECL=80
    7. //SYSIN    DD DSN=FICHERO.OUTREC
    8. //         DD *
    9.      OUTDATASET(OUT)
    10.   END
    11. /*

    Ya cuentas qué tal.

    0 Not allowed!
    ¿Te han ayudado? NO TE OLVIDES de darle al botón
    ¿Quieres dirigirte a alguien en tu post? Notifícale con una mención, tienes 2 opciones:
    1. Haciendo clic en el icono al lado de su nick
    2. Haciendo clic en el botón en el editor y escribiendo su nick.

  5. #5
      Acabo de llegar...
    R

    Registrado
    marzo de 2018
    Ubicación
    Madrid
    Mensajes
    5
    Última visita
    02.06.2022

    Agradecimientos
     
    Recibidos
    2
    Enviados
    4

    Citaciones y menciones
     
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    0 Post(s)
    Poder de Reputación
    0

    Predeterminado

    Cita Iniciado por Kuk Ver Mensaje
    @RaulC, puedes hacer lo siguiente:

    En tu OUTREC escribe esto:

    CODE Código:
    1. REPRO INFILE(NOMBRE.FICHERO.OBTENIDO)  -

    Luego con IDCAMS copias el fichero el nombre del cual has escrito con OUTREC a uno con nombre definido por ti. Esto te permite reutilizarlo en DSN de los step siguientes:

    Para copiar el fichero usa:

    JCL Código:
    1. //S2002640 EXEC PGM=IDCAMS
    2. //SYSPRINT DD SYSOUT=*
    3. //OUT      DD DSN=FICHERO.DESTINO,
    4. //            DISP=(NEW,CATLG,DELETE),
    5. //            SPACE=(TRK,(10,10),RLSE),
    6. //            RECFM=FB,LRECL=80
    7. //SYSIN    DD DSN=FICHERO.OUTREC
    8. //         DD *
    9.      OUTDATASET(OUT)
    10.   END
    11. /*

    Ya cuentas qué tal.
    Estoy teniendo el mismo problema que tuve yo en su momento antes de hacer esta consulta.

    Se produce este error:
    CODE Código:
    1. IDCAMS  SYSTEM SERVICES                                           TIM
    2.                                                                      
    3.   REPRO INFILE(nombre.fichero.largo) -                                
    4. IDC3201I CONSTANT 'nombre.fichero.largo' EXCEEDS LENGTH LIMIT          
    5.      OUTDATASET(OUT)                                                
    6. IDC3202I ABOVE TEXT BYPASSED UNTIL NEXT COMMAND. CONDITION CODE IS 12
    7.                                                                      
    8.   END                                                                
    9.                                                                      
    10. IDC0002I IDCAMS PROCESSING COMPLETE. MAXIMUM CONDITION CODE WAS 12

    En el INFILE no puede estar el nombre completo de un fichero, o por lo menos no el nombre de un fichero que yo necesito, ya que como en toda instalación, necesito un nombre de fichero bastante largo, debido a la normativa sobre nomenclatura.

    Realmente lo que necesito es comprobar si el fichero contenido (F2/nombre.fichero.largo en los ejemplos) tiene o no tiene datos.

    En esta instalación se usa este método para ver si el fichero tiene datos o no.

    JCL Código:
    1. //**********************************************************
    2. //**********************************************************
    3. //CONTROL2 EXEC PGM=IDCAMS                              
    4. //FILETEST DD DSN=nombre.fichero.largo,DISP=SHR              
    5. //SYSIN DD *                                            
    6.    PRINT CHARACTER -                                        
    7.         COUNT(1)  -                                        
    8.         INFILE(FILETEST)                                    
    9. //*

    Por eso intento meter el contenido del fichero en una variable, para poder hacer esto

    JCL Código:
    1. //**********************************************************
    2. //**********************************************************
    3. //CONTROL2 EXEC PGM=IDCAMS                              
    4. //FILETEST DD DSN=&&FICH2,DISP=SHR              
    5. //SYSIN DD *                                            
    6.    PRINT CHARACTER -                                        
    7.         COUNT(1)  -                                        
    8.         INFILE(FILETEST)                                    
    9. //*

    Quería informar &&FICH2 con el contenido del fichero contenedor F1, y es lo que no consigo.

    Con el LISTCAT no hay problema, porque el parámetro LISTCAT ENT sí acepta nombre largo.

    Me quedo con la idea de intentar copiar el contenido del fichero contenido F2, en otro fichero, con un nombre fijo. A ver si lo consigo.

    Muchas gracias.

    ---------- Post añadido : 17:11 ---------- Post anterior : 12:26 ----------

    Al final me han dicho un programa que copia el contenido de los ficheros, cuyo nombre está en el fichero de entrada, al fichero de salida. Parece un travalenguas

    Ya con eso puedo comprobar si tiene contenido o no, y ya trabajar con un fichero con nombre fijo.

    Saludos y muchas gracias por la ayuda. Espero que esto pueda servirle a alguien, que pena que el programa/utilidad es de la instalación, no de IBM

    0 Not allowed!

  6. #6
      Administrador
    Avatar de Kuk

    Registrado
    enero de 2015
    Ubicación
    Madrid
    Edad
    39
    Mensajes
    2,286
    Última visita
    Ayer a las 21:52

    Agradecimientos
     
    Recibidos
    1,036
    Enviados
    888

    Citaciones y menciones
     
    Mentioned
    102 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    31 Post(s)
    Poder de Reputación
    10

    Predeterminado

    Cita Iniciado por RaulC Ver Mensaje
    En el INFILE no puede estar el nombre completo de un fichero, o por lo menos no el nombre de un fichero que yo necesito, ya que como en toda instalación, necesito un nombre de fichero bastante largo, debido a la normativa sobre nomenclatura.
    No lo entiendo. Si el límite de la longitud del nombre de fichero para IDCAMS es el mismo que para z/OS, creo que eran 44 caracteres y también un máximo de 8 entre los puntos. O sea qeu si el SO lo acepta, lo debería aceptar también IDCAMS.

    IBM Knowledge Center

    Cita Iniciado por IBM
    Qualified names: Multiple unqualified names joined by periods. Each qualifier is coded like an unqualified name; therefore, the name must contain a period after every 8 characters or fewer. The maximum length of a qualified data set name is:

    • 44 characters, including periods.
    • For a generation data group, 35 characters, including periods.
    • For an output tape data set, 17 characters, including periods.

    Cita Iniciado por RaulC Ver Mensaje
    Realmente lo que necesito es comprobar si el fichero contenido (F2/nombre.fichero.largo en los ejemplos) tiene o no tiene datos.
    Yo lo que había entendido es que el problema era acceder a ese fichero extrayendo su nombre desde el fichero Nº1.

    Cita Iniciado por RaulC Ver Mensaje
    Quería informar &&FICH2 con el contenido del fichero contenedor F1
    Una variable que empieza por && es una variable de fichero temporal, es decir es el JES es que gestiona y asigna un nombre temporal de un dataset que se eliminará al finalizar el JOB.

    Un variable normal empieza por un solo &.

    Cita Iniciado por RaulC Ver Mensaje
    Con el LISTCAT no hay problema, porque el parámetro LISTCAT ENT sí acepta nombre largo.
    Lo veo muy raro. ¿Puedes ejecutar el step que te pasé poniendo un fichero de nombre más corto a mano y ver si hace lo que esperábamos? Para cerciorarnos de que el método funciona.

    0 Not allowed!
    ¿Te han ayudado? NO TE OLVIDES de darle al botón
    ¿Quieres dirigirte a alguien en tu post? Notifícale con una mención, tienes 2 opciones:
    1. Haciendo clic en el icono al lado de su nick
    2. Haciendo clic en el botón en el editor y escribiendo su nick.

  7. #7
      Acabo de llegar...
    R

    Registrado
    marzo de 2018
    Ubicación
    Madrid
    Mensajes
    5
    Última visita
    02.06.2022

    Agradecimientos
     
    Recibidos
    2
    Enviados
    4

    Citaciones y menciones
     
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    0 Post(s)
    Poder de Reputación
    0

    Predeterminado

    Ya tengo el problema resuelto, pero voy a intentar dejar esto lo mejor posible para el que se encuentre con este problema en el futuro.

    Cita Iniciado por Kuk Ver Mensaje
    No lo entiendo. Si el límite de la longitud del nombre de fichero para IDCAMS es el mismo que para z/OS, creo que eran 44 caracteres y también un máximo de 8 entre los puntos. O sea qeu si el SO lo acepta, lo debería aceptar también IDCAMS.

    IBM Knowledge Center
    Pues da el error CONSTANT 'nombre.fichero.largo' EXCEEDS LENGTH LIMIT

    En este ejemplo, el fichero es nombre.fichero.largo, que se referencia en la ficha FILETEST, y en la sentencia INFILE lo que espera es el nombre de la ficha DD del fichero sobre el que se va a trabajar ¿no?

    JCL Código:
    1. //**********************************************************
    2. //CONTROL2 EXEC PGM=IDCAMS                              
    3. //FILETEST DD DSN=nombre.fichero.largo,DISP=SHR              
    4. //SYSIN DD *                                            
    5.    PRINT CHARACTER -                                        
    6.         COUNT(1)  -                                        
    7.         INFILE(FILETEST)                                    
    8. //*



    Yo lo que había entendido es que el problema era acceder a ese fichero extrayendo su nombre desde el fichero Nº1.
    Sí, tienes razón. Lo que yo quería en primera instancia es comprobar si el fichero contenido(F2), cuyo nombre está en el fichero contenedor(F1), está vacío o no.

    Para ello quería sacar el nombre del fichero F2 a una variable jcl, para poder meterlo en el INFILE del control de si está vacío y para todo lo que me pudiera hacer falta.

    El tema es que al conseguir volcar el contenido del fichero F2 a un fichero cuyo nombre conozco, ya no me hace falta pasar el contenido del F1 a una variable JCL.

    Una variable que empieza por && es una variable de fichero temporal, es decir es el JES es que gestiona y asigna un nombre temporal de un dataset que se eliminará al finalizar el JOB.

    Un variable normal empieza por un solo &.
    Estoy muy pez con lo de las variables JCL, me lo apunto, gracias.

    Lo veo muy raro. ¿Puedes ejecutar el step que te pasé poniendo un fichero de nombre más corto a mano y ver si hace lo que esperábamos? Para cerciorarnos de que el método funciona.
    Yo creo que es lo que te he comentado unas líneas antes, que en el INFILE lo que espera no es un nombre de fichero sino una ficha DD. Y LISTCAT ENT espera un nombre de fichero, con lo que ya tiene más sentido.

    Aunque lo haya resuelto de otra manera, muchas gracias por tu ayuda, de verdad.

    0 Not allowed!

  8. #8
      Administrador
    Avatar de Kuk

    Registrado
    enero de 2015
    Ubicación
    Madrid
    Edad
    39
    Mensajes
    2,286
    Última visita
    Ayer a las 21:52

    Agradecimientos
     
    Recibidos
    1,036
    Enviados
    888

    Citaciones y menciones
     
    Mentioned
    102 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    31 Post(s)
    Poder de Reputación
    10

    Predeterminado
    ¡Solución!1 usuarios han marcado el post como Solución

    @RaulC, desde hace ya varios años no trabajo con z/OS así que no puedo comprobar los ejemplos. El caso es que tenía un ejemplo que funciona al 100% que es el siguiente:

    JCL Código:
    1. //S2002640 EXEC PGM=IDCAMS
    2. //SYSPRINT DD SYSOUT=*
    3. //IN       DD DISP=SHR,DSN=VSHRDV.P3ADALCE.DAABBCC
    4. //SYSIN    DD *
    5.   REPRO INFILE(IN)                                      -
    6.      OUTDATASET(PREFIJO.NOMBRE.FICHERO)
    7.   END
    8. /*

    Y lo he querido adaptar. Lo que pasa es que acabo de verificar que efectivamente el subcomando INFILE espera el nombre DD y no DSN.

    http://docweb.cns.ufl.edu/docs/d0071/ar09.html

    Así que lo correcto sería reemplazar INFILE por INDATASET que como OUTDATASET espera DSN.

    Resumiendo, el ejemplo correcto sería este: en el OUTREC pones

    CODE Código:
    1. REPRO INDATASET(NOMBRE.FICHERO.OBTENIDO)  -

    Y el step de copiado no sería con OUTDATASET sino con OUTFILE para que apunte a la ficha DD:

    JCL Código:
    1. //S2002640 EXEC PGM=IDCAMS
    2. //SYSPRINT DD SYSOUT=*
    3. //OUT      DD DSN=FICHERO.DESTINO,
    4. //            DISP=(NEW,CATLG,DELETE),
    5. //            SPACE=(TRK,(10,10),RLSE),
    6. //            RECFM=FB,LRECL=80
    7. //SYSIN    DD DSN=FICHERO.OUTREC
    8. //         DD *
    9.      OUTFILE(OUT)
    10.   END
    11. /*

    Si lo pudieras comprobar estaría genial.

    Y gracias por tus comentarios, siempre se agradece cuando la gente publica las soluciones que haya encontrado para que los demás puedan aprovecharlas.

    Un saludo.

    0 Not allowed!
    ¿Te han ayudado? NO TE OLVIDES de darle al botón
    ¿Quieres dirigirte a alguien en tu post? Notifícale con una mención, tienes 2 opciones:
    1. Haciendo clic en el icono al lado de su nick
    2. Haciendo clic en el botón en el editor y escribiendo su nick.

  9. #9
      Acabo de llegar...
    R

    Registrado
    marzo de 2018
    Ubicación
    Madrid
    Mensajes
    5
    Última visita
    02.06.2022

    Agradecimientos
     
    Recibidos
    2
    Enviados
    4

    Citaciones y menciones
     
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    0 Post(s)
    Poder de Reputación
    0

    Predeterminado

    Ha funcionado perfectamente, y me gusta más que la solución que he usado yo, aunque cada una tiene sus pros y sus contras. Lo malo es que ya he implantado en producción esta mañana

    Lo bueno es que tu solución sirve para todas las instalaciones host, porque tira de idcams y no de un programilla propio de mi instalación, como en mi caso.

    Cita Iniciado por Kuk Ver Mensaje
    Y gracias por tus comentarios, siempre se agradece cuando la gente publica las soluciones que haya encontrado para que los demás puedan aprovecharlas.
    Es de bien nacidos, ser agradecidos.

    Un saludo y gracias de nuevo.

    0 Not allowed!

  10. #10
      Administrador
    Avatar de Kuk

    Registrado
    enero de 2015
    Ubicación
    Madrid
    Edad
    39
    Mensajes
    2,286
    Última visita
    Ayer a las 21:52

    Agradecimientos
     
    Recibidos
    1,036
    Enviados
    888

    Citaciones y menciones
     
    Mentioned
    102 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    31 Post(s)
    Poder de Reputación
    10

    Predeterminado

    Cita Iniciado por RaulC Ver Mensaje
    Ha funcionado perfectamente
    Me alegro. Queda confirmado entonces.

    Yo siempre solía tirar de utilidades estándar precisamente por lo que dices. Así mis chanchullos me servían en cualquier instalación.

    Siempre me han interesado este tipo de retos, me parece interesante

    Un saludo.

    0 Not allowed!
    ¿Te han ayudado? NO TE OLVIDES de darle al botón
    ¿Quieres dirigirte a alguien en tu post? Notifícale con una mención, tienes 2 opciones:
    1. Haciendo clic en el icono al lado de su nick
    2. Haciendo clic en el botón en el editor y escribiendo su nick.

Información de Tema

Usuarios Viendo este Tema

Actualmente hay 1 usuarios viendo este tema. (0 miembros y 1 visitantes)

Temas Similares

  1. [Herramienta] Interpretador de JCL para Windows
    Por B4K4NDFCV en el foro JCL y utilidades
    Respuestas: 4
    Último Mensaje: 20.07.2018, 17:19
  2. [Sintaxis] Compratir variable con un EXE de PowerCOBOL
    Por Recato53 en el foro PowerCOBOL (ActiveX, v4 - v11)
    Respuestas: 10
    Último Mensaje: 14.02.2017, 17:18
  3. [Sintaxis] Ordenar fichero con comando Sort
    Por Begoguay en el foro PowerCOBOL (ActiveX, v4 - v11)
    Respuestas: 4
    Último Mensaje: 14.11.2016, 10:43
  4. [Información] Contenido de la caja
    Por Dasije en el foro WinDev
    Respuestas: 2
    Último Mensaje: 03.08.2016, 18:59
  5. [Información] Hacer pruebas COBOL, DB2, JCL, CICS
    Por Eduardo en el foro IBM Enterprise COBOL
    Respuestas: 7
    Último Mensaje: 26.05.2016, 14:12

Etiquetas para este Tema

Marcadores

Marcadores

Permisos de Publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •