extraer una linea en un secuencial

Todo lo relacionado con REXX en este ambiente.
italo_pm
Usuario avanzado
Usuario avanzado
Mensajes: 56
Registrado: 25 Mar 2015, 20:59
País: italia
Ciudad: milano
Ocupación: Consultor

extraer una linea en un secuencial

Mensaje por italo_pm » 12 Jul 2016, 10:18

Hola Vicente, otra vez aqui para pedirte ayuda

deseo copiar el contenido de una linea de este file:

contendio del file MIUSER.SYSVIEW.OUTPUT.CICSAORA

Código: Seleccionar todo

 BROWSE    MIUSER.SYSVIEW.OUTPUT.CICSAORA                                                             Line 00000136 Col 001 128
 Command ===>                                                                                                   Scroll ===> CSR
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2----+----
04.10.30 JOB04179  +OC1164 OCSETI KOCEXE INTERFACE IS NOW INSTALLED IN CICS
04.10.31 JOB04179  +OC1213 OCSRI SERVICE TASK INITIALIZATION COMPLETED
04.10.31 JOB04179  +OC1019 OCOMEG OMEGAMON II FOR CICS INITIALIZATION IS COMPLETE
04.10.31 JOB04179  +DFHSI8434I CICSAORA Control returned from PLT programs during the third stage of initialization.
04.10.31 JOB04179  +DFHEJ0102 CICSAORA Enterprise Java domain initialization has ended.
04.10.31 JOB04179  OPS1181O CICSAORA OPSS (*Local*) MVS N/A MSG.DFHS1517 F SOLVECNM,START DFHSI151 MSG="DFHSI1517 CICSAORA Contr
                            is being give
04.10.31 JOB04179  F SOLVECNM,START DFHSI151 MSG="DFHSI1517 CICSAORA CONTROL IS BEING GIVEN TO CICS." JOBNAME='CICSAORA'
04.10.31 JOB04179  +DFHSI1517 CICSAORA Control is being given to CICS.
04.10.31 JOB04179  +DFHSO0101I CICSAORA Sockets domain initialization has ended.
04.10.32 JOB04179  +GSVC024I (GSVI) CA SYSVIEW Performance Management
04.10.32 JOB04179  +GSVC001I (GSVI) CA SYSVIEW for CICS Release 14.1 Build 0940 Service Level 0000
04.10.32 JOB04179  +GSVC002I (GSVI) Copyright (C) 2015 CA Technologies, Inc.
04.10.32 JOB04179  +GSVC003I (GSVI) z/OS Release = 1.13.0 System name = OS390CX
04.10.32 JOB04179  +GSVC004I (GSVI) CICS Release = 6.5.0 HCI6500
04.10.32 JOB04179  +GSVC050I (GSVI) System configuration options loaded for SSID *
04.10.32 JOB04179  +GSVC034I (GSVI) WARM start has been initiated
04.10.32 JOB04179  +GSVC027I (GSVI) (GSVI) Services Userid = CXAORA
04.10.32 JOB04179  +GSVC025I (GSVI) (GSVS) Initialization Tranid = GSVS
04.10.32 JOB04179  +GSVC025I (GSVI) (GSVT) Initialization Tranid = GSVT
04.10.32 JOB04179  +GSVC025I (GSVI) (GSVI) Initialization Tranid = GSVI
04.10.32 JOB04179  +GSVC025I (GSVI) (SYSV) Online Tranid = SYSV
el objetivo es copiar esta linea:

Código: Seleccionar todo

04.10.31 JOB04179  +DFHSI1517 CICSAORA Control is being given to CICS.
pero solo

Código: Seleccionar todo

+DFHSI1517 CICSAORA Control is being given to CICS.
he creado esta rexx para ver que me muestra el SAY

Código: Seleccionar todo

/* REXX */
VRFCICS = 'MIUSER.SYSVIEW.OUTPUT.CICSAORA'
address TSO
   "FREE FILE(CICSFTP)"
   "ALLOC FILE(CICSFTP) DSNAME("VRFCICS") SHR REU"
   "EXECIO 1 DISKR CICSFTP (FINIS STEM LINEA." /* leo una linea de entrada */
   DO WHILE <= 0 /* Bucle de lectura de lineas hasta el final del fichero  */
      codegiven  = SUBSTR(LINEA.1,20,10) /* +DFHSI1517 */
      IF codegiven = '+DFHSI1517' THEN DO
         nomecics = SUBSTR(LINEA.1,30,8)
         msggiven = SUBSTR(LINEA.1,40,30)

      SAY ' - codice given:' codegiven
      SAY ' - nome cics   :' nomecics
      SAY ' - msg cics    :' msggiven

      END  /* de IF */
   END  /* WHILE */

/*-----*/
el error que me da es:

Código: Seleccionar todo

     7 +++  DO WHILE <= 0 /* Bucle de lectura de lineas hasta el final del fichero  */
Error running RXSMOT6X, line 7: Invalid expression
***
si intento con

Código: Seleccionar todo

DO WHILE = 0
pues me va en loop osea se queda cargando y nunca acaba...

me serviria crear un secuencial solo con

Código: Seleccionar todo

+DFHSI1517 CICSAORA Control is being given to CICS.

alguna idea??

gracias nuevamente

saludos.

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 543
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: extraer una linea en un secuencial

Mensaje por Vicente » 13 Jul 2016, 08:15

Hola Italo,
En una pregunta lo normal es que haya dos expresiones unidas por un operador lógico.
Por ejemplo WHILE a <= b pero no WHILE < = b
Creo que has querido escribir
DO WHILE rc <= 0
en lugar de
DO WHILE <= 0

rc es una variable interna en la que EXECIO pone el return code de la operación.
Por otro lado, si ya tienes previamente hecho ALLOC del fichero de salida, bastará sustituir las instrucciones SAY por una EXECIO DISKW

Un saludo
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

italo_pm
Usuario avanzado
Usuario avanzado
Mensajes: 56
Registrado: 25 Mar 2015, 20:59
País: italia
Ciudad: milano
Ocupación: Consultor

Re: extraer una linea en un secuencial

Mensaje por italo_pm » 13 Jul 2016, 10:06

hola Vicente, pues logre extraer la lineas que deseaba, solo que ahora tengo problemas con el ciclo cuando deseo hacer en todos los fichero...


este es el codigo para extraer lo que deseo>

Código: Seleccionar todo

/* REXX */
VRFCICS = 'MIUSER.SYSVIEW.OUTPUT.CICSAORA'
address TSO
   "ALLOC FILE(CICSFTP) DSNAME("VRFCICS") SHR REU"
   "EXECIO * DISKR CICSFTP (FINIS STEM LINEA." /* leo una linea de entrada */
   DO cics = 1 to LINEA.0 /* Bucle de lectura de lineas hasta el final del fichero  */
   /* attachment */
      codeattach    = SUBSTR(LINEA.cics,20,12) /* +DFHDB2023I */
      IF codeattach = '+DFHDB2023I' THEN DO
         attachdata  = SUBSTR(LINEA.cics,32,11)
         attachora   = SUBSTR(LINEA.cics,43,9)
         attachnomci = SUBSTR(LINEA.cics,52,9)
         attachmsg = SUBSTR(LINEA.cics,61,69)
         attachxphp  = SUBSTR(LINEA.cics,1,129)
         SAY 'PHP ATTACHMENT:'attachxphp
/*       SAY 'COD-DATA-ORA-NOM-MSG      :'codeattach'-'attachdata'-'attachora'-'attachnomci'-'attachmsg */
      END  /* de IF */

   /* codegiven */
      codegiven  = SUBSTR(LINEA.cics,20,11) /* +DFHSI1517 */
      IF codegiven = '+DFHSI1517' THEN DO
         nomecics  = SUBSTR(LINEA.cics,31,9)
         msggiven  = SUBSTR(LINEA.cics,40,32)
         givenxphp = SUBSTR(LINEA.cics,1,71)
         SAY 'PHP GIVEN:'givenxphp
/*       SAY 'COD-NOM-MSG:'codegiven'-'nomecics'-'msggiven */
      END  /* de IF */
   END  /* WHILE */
   "FREE FILE(CICSFTP)"

pues con el SAY funciona correctamente, ahora el problema es en esta rexx donde deseo copiar las lineas de los ficheros en otros nuevos solo con ese contenido aqui el rexx>

Código: Seleccionar todo

/* REXX */
address TSO
   "ALLOC FILE(LISTCICS) DSNAME('MIUSER.SCRIPT.TEXT(CICSLISV)') SHR"
IF rc <> 0 THEN DO
  SAY 'Error' rc 'en ALLOC de la lista de cicsnames'
END
address TSO
"EXECIO * DISKR LISTCICS (FINIS STEM cicsname."
IF rc <> 0 THEN DO
   SAY  'Error' rc 'leyendo la lista de cicsnames'
END
 "FREE FILE(LISTCICS)"
/*--------------------------------------------------------------------- */
 DO cics = 1 to cicsname.0
 lcics = SUBSTR(cicsname.cics,1,8) /* nombre cics de columan 1 a 8 */
/*--------------------------------------------------------------------- */
   INPCISEQ = "MIUSER.SYSVIEW.OUTPUT."lcics""
   OUTCISEQ = "MIUSER.SYSVIEW.OUTPUT2."lcics""
/*--------------------------------------------------------------------- */
   "FREE  FI(INPCITEM)"
   "ALLOC FILE(INPCITEM) DSNAME('"INPCISEQ"') SHR REU"
   "ALLOC FI(OUTCITEM) DSNAME('"OUTCISEQ"') SHR REUSE"

   "EXECIO * DISKR INPCITEM (FINIS STEM LINEA." /* leo todas las lineas */


   DO cics = 1 to LINEA.0 /* Bucle de lectura de lineas hasta el final del fichero  */
   /* attachment */
      codeattach    = SUBSTR(LINEA.cics,20,12) /* +DFHDB2023I */
      IF codeattach = '+DFHDB2023I' THEN DO
         attachxphp  = SUBSTR(LINEA.cics,1)
         QUEUE attachxphp
      END  /* de IF */
   /* codegiven */
      codegiven  = SUBSTR(LINEA.cics,20,11) /* +DFHSI1517 */
      IF codegiven = '+DFHSI1517' THEN DO
         givenxphp = SUBSTR(LINEA.cics,1)
         QUEUE givenxphp
      END  /* de IF */
   END  /* DO */
/*-----*/

/*
   DO UNTIL QUEUED() = 0
     PULL LINEA
     SAY LINEA
   END
*/
 /*  "EXECIO * DISKW OUTCITEM (FINIS" */
"EXECIO" QUEUED() "DISKW OUTCITEM (FINIS"
   "FREE  FI(OUTCITEM)"
END

luego del EX el error es>

Código: Seleccionar todo

DATA SET MIUSER.SYSVIEW.OUTPUT2.CICS0001 NOT IN CATALOG OR CATALOG CAN NOT BE ACCESSED
The input or output file OUTCITEM is not allocated. It cannot be opened for I/O.
EXECIO error while trying to GET or PUT a record.
A command entered or contained in a CLIST has invalid syntax.
lo que deseo es que para cada fichero que le paso con la informacion del MSGSYS extrar solo los campos que me interesan y cree nuevos ficheros con el contenido extraido...

Código: Seleccionar todo

04.10.26 JOB01233  +DFHDB2023I 13/07/2016 04:10:26 CICSAORA The CICS-DB2 attachment has connected to DB2 subsystem DSC group DB2
04.10.26 JOB01233  +DFHSI1517 CICSAORA Control is being given to CICS.
pero por lo visto el ciclo esta mal...

seguire practicando

saludos.

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 543
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: extraer una linea en un secuencial

Mensaje por Vicente » 13 Jul 2016, 11:27

Hola,
DATA SET MIUSER.SYSVIEW.OUTPUT2.CICS0001 NOT IN CATALOG OR CATALOG CAN NOT BE ACCESSED
Claramente el fichero MIUSER.SYSVIEW.OUTPUT2.CICS0001 no existe.
Esto es porque no lo has creado. Has utilizado un ALLOC como para leer un fichero existente.
Al ALLOC de OUTCITEM debes añadirle parámetros para decirle que el fichero no existe y que lo cree.
Esto lo hicimos en el hilo anterior, por ejemplo para crear el jcl del ftp:

Código: Seleccionar todo

"ALLOC FI(FTPJCLPA) DA('"DSNAME"') NEW TRACKS SPACE(10 10) DIR(44) RECFM(F B) LRECL(80)"

(por cierto, 10 pistas me parecen una barbaridad de espacio)
DO UNTIL QUEUED() = 0
PULL LINEA
SAY LINEA
END
Si retiras, con PULL, las líneas del stack que has puesto con QUEUE, no las tendrás disponibles para escribirlas con tu
"EXECIO" QUEUED() "DISKW OUTCITEM (FINIS"
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

italo_pm
Usuario avanzado
Usuario avanzado
Mensajes: 56
Registrado: 25 Mar 2015, 20:59
País: italia
Ciudad: milano
Ocupación: Consultor

Re: extraer una linea en un secuencial

Mensaje por italo_pm » 13 Jul 2016, 12:35

hola Vicente, si intente agregando ese codigo,tome como base el ejemplo del ftp, pero tampoco funcionaba

Código: Seleccionar todo

"ALLOC FI(FTPJCLPA) DA('"DSNAME"') NEW TRACKS SPACE(10 10) DIR(44) RECFM(F B) LRECL(80)"
o por lo menos, me daba error onde decia q el fichero no existia,por ese escribi el otro codigo

sobre

Código: Seleccionar todo

Si retiras, con PULL, las líneas del stack que has puesto con QUEUE, no las tendrás disponibles para escribirlas con tu
"EXECIO" QUEUED() "DISKW OUTCITEM (FINIS"
esa parte si tendre que controlarlar y corregirla eso del QUEUE()

espero que entre el el.ciclo de la creacion d los ficheros con su respectivo contenido, para cada uno...

seguire intentando,

gracias
saludos.

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 543
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: extraer una linea en un secuencial

Mensaje por Vicente » 14 Jul 2016, 04:05

Hola,
Comprueba con p.3.4 que se está creando el fichero.
Podría existir pero no estar accesible porque no esté catalogado y no estándolo no se le dice el disco donde está.
Dos posibilidades:
a la instrucción ALLOC añadirle el parámetro CATALOG y/o VOLUME(volser)
"ALLOC FI(FTPJCLPA) DA('"DSNAME"') NEW TRACKS SPACE(10 10) DIR(44) RECFM(F B) LRECL(80) CATALOG VOLUME(volser)"
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

italo_pm
Usuario avanzado
Usuario avanzado
Mensajes: 56
Registrado: 25 Mar 2015, 20:59
País: italia
Ciudad: milano
Ocupación: Consultor

Re: extraer una linea en un secuencial

Mensaje por italo_pm » 14 Jul 2016, 08:24

hola Vicente, hare la prueba tal como me sugieres, aunq primero lo hare con un solo dataset en input, porque no sabria si el error es dado porque tiene que elaborar mas de un dataset ya que sus nombres vienen definidos de una parte estatica y al final concatenados con una variable que es la que contiene el nombre del cics,

pues por lo pronto lo hace con el primero que lee, lo lee y crea correctamente ,tendre que resolver el problema de la caalogacion para ver si el ciclo va adelante con el siguiente dataset, si funciona estaba pensando en unir este codigo de rexx al otro que ya tengo gracias a tu ayuda, lo pondre antes del jcl del ftp creado con el stack, y solo hare el ftp con las lineas que me sirven y no todo el contenido...

lo estoy haciendo separado ya q en tu ultimo post del otro tema me sugerias primero hacer los codigos singularmente, dividiendolos, asi me parece q en fase de test es comodo para no combinar mucho codigo en una rexx que ya funcionaba...

gracias nuevamente, seguire intentando.

saludos!!

italo_pm
Usuario avanzado
Usuario avanzado
Mensajes: 56
Registrado: 25 Mar 2015, 20:59
País: italia
Ciudad: milano
Ocupación: Consultor

Re: extraer una linea en un secuencial

Mensaje por italo_pm » 19 Jul 2016, 01:45

Hola Vicente, tenias razon, use:

Código: Seleccionar todo

 "ALLOC FI(OUTCITEM) DSNAME('"OUTCISEQ"') NEW TRACKS SPACE(10 10) RECFM(F B) LRECL(132) CATALOG"
en donde elimine el paramentro DIR() me parece que con ese parametro me crea una libreria y no un dataset...

tambien habia otro error y era el nombre de la variable que se repetia 2 veces para 2 cosas distitna, lo cambie y funciono correctamente todo, aqui el codigo:

Código: Seleccionar todo

/* REXX */
address TSO
   "ALLOC FILE(LISTCICS) DSNAME('MIUSER.SCRIPT.TEXT.TEMPFTP(CICSEXE2)') SHR"
address TSO
"EXECIO * DISKR LISTCICS (FINIS STEM cicsname."
 "FREE FILE(LISTCICS)"
/*--------------------------------------------------------------------- */
 DO cics8 = 1 to cicsname.0
 lcics = SUBSTR(cicsname.cics8,1,8) /* nombre cics de columan 1 a 8 */
   INPCISEQ = "MIUSER.SYSVIEW.OUTPUT."lcics""
   OUTCISEQ = "MIUSER.SYSVIEW.OUTPUT2."lcics""
   SAY OUTCISEQ
/*--------------------------------------------------------------------- */
   "FREE  FI(INPCITEM)"
   "ALLOC FILE(INPCITEM) DSNAME('"INPCISEQ"') SHR REU"
   "EXECIO * DISKR INPCITEM (FINIS STEM LINEA." /* leo todas las lineas */

   "ALLOC FI(OUTCITEM) DSNAME('"OUTCISEQ"') NEW TRACKS SPACE(10 10) RECFM(F B) LRECL(132) CATALOG"

   DO cics = 1 to LINEA.0 /* Bucle de lectura de lineas hasta el final del fichero  */
   /* attachment */
      codeattach    = SUBSTR(LINEA.cics,20,12) /* +DFHDB2023I */
      IF codeattach = '+DFHDB2023I' THEN DO
         attachxphp  = SUBSTR(LINEA.cics,1)
         QUEUE attachxphp
      END  /* de IF */
   /* codegiven */
      codegiven  = SUBSTR(LINEA.cics,20,11) /* +DFHSI1517 */
      IF codegiven = '+DFHSI1517' THEN DO
         givenxphp = SUBSTR(LINEA.cics,1)
         QUEUE givenxphp
      END  /* de IF */
   END  /* DO */

   "EXECIO" QUEUED() "DISKW OUTCITEM (FINIS"
   "FREE  FI(OUTCITEM)"
END
muchas gracias, ahora he creado un solo REXX donde hago todo, funcionacorrectamente, falta solo perfeccionar un poco la parte de los dataset catalogados y no.

he decidido y nose si es correcto que la cancelacion de los dataset que he creado para el ftp y el resto los eliminare al ejecutar el rexx y no luego del ftp, de esta manera cada vez que ejecute el rexx los elimino al inicio, ya que como regla estos dataset se eliminan luego de 24 horas en automatico, asi que mejor los elimino yo en el inicio del rexx cada vez que este venga ejecutado...

aqui el rexx:

Código: Seleccionar todo

/* REXX */
/*--------------------------------------------------------------------- */
 /* PURGE DATASET */
address TSO
   "ALLOC FILE(CILIDELE) DSNAME('MIUSER.SCRIPT.TEXT(CICSSV55)') SHR"
address TSO
"EXECIO * DISKR CILIDELE (FINIS STEM cidelall."
 "FREE FILE(CILIDELE)"
 /*  --  */
 DO cicsdel = 1 to cidelall.0
 ciseqdel = SUBSTR(cidelall.cicsdel,1,8) /* nombre cics de columan 1 a 8 */
   "DELETE ('MIUSER.SYSVIEW.OUTPUT."ciseqdel"') PURGE"
   "DELETE ('MIUSER.SYSVIEW.OUTPUT2."ciseqdel"') PURGE"
END
 /*  --  */
DSNAME = 'MIUSER.SCRIPT.TEXT.TEMPFTP'
DSE = SYSDSN("'"STRIP(DSNAME)"'")
IF DSE <> 'OK' THEN DO
  "FREE  FI(FTEMCIEX)"
  "ALLOC FI(FTEMCIEX) DA('"DSNAME"') NEW TRACKS SPACE(10 10) DIR(44) RECFM(F B) LRECL(80)"
END

"FREE  FI(FTEMCIEX)"
"ALLOC FI(FTEMCIEX) DA('"DSNAME"(CICSEXE2)') SHR"
/*---------------------------------------------------------------------

ADDRESS LINK 'GSVXRXAA'
    ADDRESS "SYSVIEWE" "C(PREFIX *)"
    "DROPBUF"
    ADDRESS "SYSVIEWE" "C(LISTJOBS CICS*)"

  i = 0
  DO UNTIL QUEUED() = 0
     PULL linea
     tipo = LEFT(linea,1)
     IF tipo = 'D' THEN DO
        i = i + 1
        PARSE VAR linea tipo "!" cmd "!" nombre.i "!"
     END
  END

ADDRESS 'SYSVIEWE' 'C(END)'

"DROPBUF"
   DO k = 1 TO i
     QUEUE nombre.k
 END
    "EXECIO * DISKW FTEMCIEX (FINIS"
 "FREE  FI(FTEMCIEX)"
 "DROPBUF"

 address TSO
    "ALLOC FILE(CICSLIST) DSNAME('MIUSER.SCRIPT.TEXT.TEMPFTP(CICSEXE2)') SHR"
 address TSO
 "EXECIO * DISKR CICSLIST (FINIS STEM cicsname."
  "FREE FILE(CICSLIST)"

  DO cics8= 1 TO cicsname.0

  lcics = SUBSTR(cicsname.cics8,1,8) /* NOMBRE CICS DE COLUMAN 1 A 8 */


    "DROPBUF"
    ADDRESS 'LINK' 'GSVXRXAA'                          /* START SESION SYSVIEW */
    ADDRESS "SYSVIEWE" "C(PREFIX *)"
    ADDRESS "SYSVIEWE" "C(LISTJOBS *)"
    ADDRESS "SYSVIEWE" "C(LISTJOBS "lcics")"
    ADDRESS "SYSVIEWE" "C(LINECMD L 1)"
   ADDRESS "SYSVIEWE" "C(SELECT DDNAME EQ JESMSGLG)"
   ADDRESS "SYSVIEWE" "C(SET COPYDSN MIUSER.SYSVIEW.OUTPUT."lcics")"
   ADDRESS "SYSVIEWE" "INPUT(1,COD)"
   ADDRESS "SYSVIEWE" "C(TYPE TAB 1 ERE DATA '' ENTER)"
   ADDRESS "SYSVIEWE" "C(END)"

   "DROPBUF"
END
/*--------------------------------------------------------------------- */
 DO cics82 = 1 to cicsname.0
 lcics2 = SUBSTR(cicsname.cics82,1,8) /* nombre cics de columan 1 a 8 */
   INPCISEQ = "MIUSER.SYSVIEW.OUTPUT."lcics2""
   OUTCISEQ = "MIUSER.SYSVIEW.OUTPUT2."lcics2""
   SAY 'OK - 'OUTCISEQ
/*--------------------------------------------------------------------- */
   "FREE  FI(INPCITEM)"
   "ALLOC FILE(INPCITEM) DSNAME('"INPCISEQ"') SHR REU"
   "EXECIO * DISKR INPCITEM (FINIS STEM LINEA2." /* leo todas las lineas */

   "ALLOC FI(OUTCITEM) DSNAME('"OUTCISEQ"') NEW TRACKS SPACE(10 10) RECFM(F B) LRECL(132) CATALOG"

   DO cics = 1 to LINEA2.0 /* Bucle de lectura de lineas hasta el final del fichero  */
   /* attachment */
      codeattach    = SUBSTR(LINEA2.cics,20,12) /* +DFHDB2023I */
      IF codeattach = '+DFHDB2023I' THEN DO
         attachxphp  = SUBSTR(LINEA2.cics,1)
         QUEUE attachxphp
      END  /* de IF */
   /* codegiven */
      codegiven  = SUBSTR(LINEA2.cics,20,11) /* +DFHSI1517 */
      IF codegiven = '+DFHSI1517' THEN DO
         givenxphp = SUBSTR(LINEA2.cics,1)
         QUEUE givenxphp
      END  /* de IF */
   END  /* DO */

   "EXECIO" QUEUED() "DISKW OUTCITEM (FINIS"
   "FREE  FI(OUTCITEM)"
END
/*-----------------------------------------------*/
"FREE  FI(FTPJCLPA)"
"ALLOC FI(FTPJCLPA) DA('"DSNAME"(FTPARMOT)') SHR"
"NEWSTACK"
/* */
QUEUE "//Z99OTSF1  JOB  CLASS=0,MSGCLASS=8,NOTIFY=&SYSUID"
QUEUE "//*---------------------------------------------------------------"
QUEUE "//*---------------------------------------------------------------"
QUEUE "//FTPSTEP1 EXEC PGM=FTP,PARM='(EXIT',REGION=4096K"
QUEUE "//STEPLIB  DD DSN=CEE.SCEERUN,DISP=SHR"
QUEUE "//SYSTCPD  DD DSN=TCPIP.OS390PRD.TCPPARMS(TCPDATA),DISP=SHR"
QUEUE "//SYSPRINT DD SYSOUT=*"
QUEUE "//OUTPUT   DD SYSOUT=*"
QUEUE "//INPUT    DD *"
QUEUE "NOMBRESERVER"
QUEUE "USER"
QUEUE "PASS"
QUEUE "CD DIR/DIR-DESTINO"
/*--------------------------------------------------------------------- */
 DO cics = 1 to cicsname.0
 nomecicsftp = SUBSTR(cicsname.cics,1,8) /* nombre cics de columan 1 a 8 */
QUEUE "PUT 'MIUSER.SYSVIEW.OUTPUT2."nomecicsftp"' SV.MIUSER.SYSVIEW.OUTPUT2."nomecicsftp".txt"
END
/*--------------------------------------------------------------------- */
QUEUE "quit"
QUEUE "/*"
QUEUE "//FINEFTP  EXEC PGM=IEFBR14"
QUEUE "//*"
QUEUE "//FINEJOB EXEC PGM=IEFBR14"
/* */
"EXECIO * DISKW FTPJCLPA (FINIS"
"FREE  FI(FTPJCLPA)"
/* */
"DELSTACK"
/* */
   ADDRESS TSO "SUBMIT '"DSNAME"(FTPARMOT)'"
/* */
EXIT
/* */          

funciona , pero he notado una cosa y es que luego q lo ejecuto con el comando EX tengo que presionar la tecla "enter" 3 veces para q pase al paso sucesivo (no para avanzar al pantalla) es como si no pudiera hacerlo con una sola ejecucion osea con un solo "enter"

,como te decia tengo que perfeccionar el delete de los dataset creados...

por el momento estoy usando:

Código: Seleccionar todo

/* PURGE DATASET */
address TSO
   "ALLOC FILE(CILIDELE) DSNAME('MIUSER.SCRIPT.TEXT(CICSSV55)') SHR"
address TSO
"EXECIO * DISKR CILIDELE (FINIS STEM cidelall."
 "FREE FILE(CILIDELE)"
 /*  --  */
 DO cicsdel = 1 to cidelall.0
 ciseqdel = SUBSTR(cidelall.cicsdel,1,8) /* nombre cics de columan 1 a 8 */
   "DELETE ('MIUSER.SYSVIEW.OUTPUT."ciseqdel"') PURGE"
   "DELETE ('MIUSER.SYSVIEW.OUTPUT2."ciseqdel"') PURGE"
END
y solo deberia de eliminar los que existen, para eso he escrito este rexx:

Código: Seleccionar todo

/* REXX */
/*--------------------------------------------------------------------- */
 /* PURGE DATASET */
/*--------------------------------------------------------------------- */
address TSO
   "ALLOC FILE(CILIDELE) DSNAME('MIUSER.SCRIPT.TEXT(CICSSV55)') SHR"
address TSO
"EXECIO * DISKR CILIDELE (FINIS STEM cidelall."
 "FREE FILE(CILIDELE)"
 /*  --  */
 DO cicsdel = 1 to cidelall.0
 ciseqdel = SUBSTR(cidelall.cicsdel,1,8) /* nombre cics de columan 1 a 8 */

address TSO
   "ALLOC FILE(DELEOUTE) DSNAME('MIUSER.SYSVIEW.OUTPUT."ciseqdel"') SHR"
   "ALLOC FILE(DELEOUT2) DSNAME('MIUSER.SYSVIEW.OUTPUT2."ciseqdel"') SHR"
   IF rc <> 0 THEN DO
     SAY 'OK - DATASET NO EXISTE' rc
  END
   IF rc = 0 THEN DO
     "DELETE ('MIUSER.SYSVIEW.OUTPUT."ciseqdel"') PURGE"
     "DELETE ('MIUSER.SYSVIEW.OUTPUT2."ciseqdel"') PURGE"
     SAY 'EXISTE - DELETE' rc
  END

 "FREE FILE(DELEOUTE)"
 "FREE FILE(DELEOUT2)"
END
funciona correctamente, es decir elimina los que existen y no elimina los q no existen, pero me surge una pregunta, todos los mensajes que me da el rexx durante su ejecucion los vere si es q lo ejecuto desde un panel?? o es que lo veo porque los ejecuto con el comando EX ???

espero tus sugerencias y observaciones en cuanto tengas tiempo oviamente, muchas gracias por todo.

saludos.

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 543
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: extraer una linea en un secuencial

Mensaje por Vicente » 19 Jul 2016, 05:23

Hola Italo,
Me alegro de tus progresos,
Se me ocurren tres comentarios que hacer:
Dices:
tengo que presionar la tecla "enter" 3 veces para q pase al paso sucesivo
Esto suele ocurrir cuando se ejecutan instrucciones PULL sin nada en el stack que leer. En este caso el programa espera que se teclee el dato que está leyendo con PULL.
Solo he visto una instrucción PULL en tu REXX y no alcanzo a comprender como puede estar leyendo más líneas de las que hay en el stack.
Revisa esto.

Por otro lado, respecto a borrar ficheros, has escrito

Código: Seleccionar todo

 "ALLOC FILE(DELEOUTE) DSNAME('MIUSER.SYSVIEW.OUTPUT."ciseqdel"') SHR"
   "ALLOC FILE(DELEOUT2) DSNAME('MIUSER.SYSVIEW.OUTPUT2."ciseqdel"') SHR"
   IF rc <> 0 THEN DO
Ten en cuenta que la pregunta IF rc solo comprueba el código de retorno del segundo ALLOC, el del primero ya lo has perdido.
Deberías poner un IF rc y un delete para cada ALLOC.
No obstante, si no te preocupa intentar DELETEs de ficheros que no existen, podrías simplificar todo y hacer solo los DELETE, lo cuales darán un código de retorno=8 si el fichero no existe. Siempre puedes terminar tu rexx con código 0 ejecutando la instrucción EXIT 0.

Por último, respecto a los mensajes del REXX, pienso que vas atener los mismos si lo ejecutas desde un panel, salvo que con una instrucción en el panel se puedan suprimir. Ya vimos en otra ocasión que puedes escribir en tu REXX una instrucción como:
msgstatus = MSG(ON) o msgstatus = MSG(OFF) para hacer que salgan, o no, los mensajes de TSO.

Un saludo
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 543
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: extraer una linea en un secuencial

Mensaje por Vicente » 19 Jul 2016, 05:27

Recuerda que siempre puedes poner una instrucción
TRACE R
en cualquier lugar de tu programa, para ver que está haciendo.
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

italo_pm
Usuario avanzado
Usuario avanzado
Mensajes: 56
Registrado: 25 Mar 2015, 20:59
País: italia
Ciudad: milano
Ocupación: Consultor

Re: extraer una linea en un secuencial

Mensaje por italo_pm » 19 Jul 2016, 06:29

hola Vicente, gracias por la respuesta, pues si, en la parte del delete tendre que poner un if y un delete para cada ALLOC que realice, a mi me interesa eliminar todos los ficheros que existan obviament , hare como me sugieres, pondre TRACE justo en el punto donde me pide que teclee "ENTER" para saber que es lo que sucede y el porque.... sobre el MSG ON o OFF tambien lo trabajare, en algunas partes me sera util lo tomare en cuenta. gracias nuevamente,

por otra parte Vicente el delete lo intente hacer en el jcl dinamicamente luego del ftp,funciona pero siempre me da error en el ultimo delete me decia dataset in use y el job acababa en abend, bueno el step de delete por eso decidi trabajarlo en el rexx....

queria hacer un WAIT en el rexx luego del SUBMIT del jcl del ftp, pero no tenia mucho sentido ya que nose cuanto dura o si el rexx espera 30 segundos y luego sigue su ejecucion asi el job submitido este en ejecucióno no... hay alguna manera de interceptar el return code del job submitido para saber si acabo bien o no?

gracias, saludos.

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 543
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: extraer una linea en un secuencial

Mensaje por Vicente » 19 Jul 2016, 09:14

Hola,
Creo haber leído algo en este foro sobre como interceptar el return code del job submitido.
Pero no recuerdo cómo.
Pero, sin saber cuando se va a ejecutar el job, estás en el mismo problema. Podrías esperar segundos, minutos, horas, ..., para poder leer el return code.
El delete debe hacerlo el último en utilizar el fichero, es decir el job de ftp.
Yo estudiaría mejor la opción del delete en el job del ftp; esa que te da error por estar en uso.
Trata de averiguar por qué está en uso cuando no debería ser así.
Revisa si en tu rexx has cerrado el fichero, antes de submitir el jcl de ftp (es decir, si has escrito un EXECIO con FINIS y una instrucción FREE).
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

italo_pm
Usuario avanzado
Usuario avanzado
Mensajes: 56
Registrado: 25 Mar 2015, 20:59
País: italia
Ciudad: milano
Ocupación: Consultor

Re: extraer una linea en un secuencial

Mensaje por italo_pm » 21 Jul 2016, 10:00

hola Vicente, pues tenia razon me falto hacer un "FREE FI(INPCITEM)" para no tener el error de dataset in use al momento de hacer el delete desde el ftp, tambien logra hacer la gestion de los ficheros que no existen, los creo con al interno un texto que luego me servira para detectar aquellos vacios...


aqui el rexx completo, no logre encontrar la manera de que con un solo EX se ejecute toda el rexx, debo de teclear ENTER 3 veces, pero lo "resolvi" con 3 mensajes "SAY" para que se presione ENTER y continuar aunq el objetivo es que con un solo EX se hago todo... bueno.. el rexx es el siguente:

Código: Seleccionar todo

/* REXX */
/*-----------------------------------------------*/
   SAY '------------------------------------------------'
   SAY 'INICIO - STEP 1/4 - ENTER PARA CONTINUAR'
   SAY '------------------------------------------------'
/*-----------------------------------------------*/
DSNAME = 'MIUSER.SCRIPT.TEXT.TEMPFTP'
DSE = SYSDSN("'"STRIP(DSNAME)"'")
IF DSE <> 'OK' THEN DO
  "FREE  FI(FTEMCIEX)"
  "ALLOC FI(FTEMCIEX) DA('"DSNAME"') NEW TRACKS SPACE(10 10) DIR(44) RECFM(F B) LRECL(80)"
END

"FREE  FI(FTEMCIEX)"
"ALLOC FI(FTEMCIEX) DA('"DSNAME"(CICSEXE2)') SHR"
/*--------------------------------------------------------------------- */
ADDRESS LINK 'GSVXRXAA'
    ADDRESS "SYSVIEWE" "C(PREFIX *)"
    "DROPBUF"
    ADDRESS "SYSVIEWE" "C(LISTJOBS CICS*)"

  i = 0
   DO UNTIL QUEUED() = 0
      PULL linea
      tipo = LEFT(linea,1)
      IF tipo = 'D' THEN DO
         i = i + 1
         PARSE VAR linea tipo "!" cmd "!" nombre.i "!"
      END
   END

 ADDRESS 'SYSVIEWE' 'C(END)'

    SAY '---------------------------------------'
    SAY 'STEP 2/4 - ENTER PARA CONTINUAR'
    SAY '---------------------------------------'

    DO k = 1 TO i
     QUEUE nombre.k
 END
    "EXECIO * DISKW FTEMCIEX (FINIS"
 "FREE  FI(FTEMCIEX)"
 /*-----------------------------------------------*/
 address TSO
    "ALLOC FILE(CICSLIST) DSNAME('MIUSER.SCRIPT.TEXT.TEMPFTP(CICSEXE2)') SHR"
address TSO
"EXECIO * DISKR CICSLIST (FINIS STEM cicsname."
 "FREE FILE(CICSLIST)"
/*--------------------------------------------------------------------- */

 DO cics8= 1 TO cicsname.0

 lcics = SUBSTR(cicsname.cics8,1,8) /* NOMBRE CICS DE COLUMAN 1 A 8 */

   ADDRESS 'LINK' 'GSVXRXAA'                          /* START SESION SYSVIEW */
    ADDRESS "SYSVIEWE" "C(PREFIX *)"
    ADDRESS "SYSVIEWE" "C(LISTJOBS *)"
    ADDRESS "SYSVIEWE" "C(LISTJOBS "lcics")"
    ADDRESS "SYSVIEWE" "C(LINECMD L 1)"
    ADDRESS "SYSVIEWE" "C(SELECT DDNAME EQ JESMSGLG)"
    ADDRESS "SYSVIEWE" "C(SET COPYDSN MIUSER.SYSVIEW.OUTPUT."lcics")"
    ADDRESS "SYSVIEWE" "INPUT(1,COD)"
    ADDRESS "SYSVIEWE" "C(TYPE TAB 1 ERE DATA '' ENTER)"
    ADDRESS "SYSVIEWE" "C(END)"

    "DROPBUF"
 END

    SAY '---------------------------------------'
    SAY 'STEP 3/4 - ENTER PARA CONTINUAR'
    SAY '---------------------------------------'

 /* INIZIO -  si no existe el dataset en input lo creo vacio con un mensaje */
 address TSO
 /* en el miembro CICSSV55 esta la lista de todos los cics de SV  */
    "ALLOC FILE(CILIDELE) DSNAME('MIUSER.SCRIPT.TEXT(CICSSV55)') SHR"
 address TSO
 "EXECIO * DISKR CILIDELE (FINIS STEM cidelall."
 "FREE FILE(CILIDELE)"
 DO cicsdel = 1 to cidelall.0
 ciseqdel = SUBSTR(cidelall.cicsdel,1,8) /* nombre cics de columan 1 a 8 */
address TSO
 "FREE FILE(DELEOUTE)"
   "ALLOC FILE(DELEOUTE) DSNAME('MIUSER.SYSVIEW.OUTPUT."ciseqdel"') SHR"
   IF rc <> 0 THEN DO
   "ALLOC FI(DELEOUTE) DSNAME('MIUSER.SYSVIEW.OUTPUT."ciseqdel"') NEW TRACKS SPACE(10 10) RECFM(F B) LRECL(132) CATALOG"
    vacio = 'DATASET NO EXISTE - CICS NOT EXEC'
         QUEUE vacio
   "EXECIO" QUEUED() "DISKW DELEOUTE (FINIS"
  END
 "FREE FILE(DELEOUTE)"
END
/* FIN -  si no existe el dataset en input lo creo vacio con un mensaje */
/*--------------------------------------------------------------------- */
/*--------------------------------------------------------------------- */
/* mod , uso los nombres cics del cidelall */
/*--------------------------------------------------------------------- */
 DO cics82 = 1 to cidelall.0
 lcics2 = SUBSTR(cidelall.cics82,1,8) /* nombre cics de columan 1 a 8 */
   INPCISEQ = "MIUSER.SYSVIEW.OUTPUT."lcics2""
   OUTCISEQ = "MIUSER.SYSVIEW.OUTPUT2."lcics2""
 /*--------------------------------------------------------------------- */
    "FREE  FI(OUTCITEM)"
    "ALLOC FI(OUTCITEM) DSNAME('"OUTCISEQ"') NEW TRACKS SPACE(10 10) RECFM(F B) LRECL(132) CATALOG"
 /*--------------------------------------------------------------------- */
    "FREE  FI(INPCITEM)"
    "ALLOC FILE(INPCITEM) DSNAME('"INPCISEQ"') SHR REU"
    "EXECIO * DISKR INPCITEM (FINIS STEM LINEA2." /* leo todas las lineas */

    DO cics = 1 to LINEA2.0 /* Bucle de lectura de lineas hasta el final del fichero  */
    /* attachment */
       codeattach    = SUBSTR(LINEA2.cics,20,12) /* +DFHDB2023I */
       IF codeattach = '+DFHDB2023I' THEN DO
          attachxphp  = SUBSTR(LINEA2.cics,1)
          QUEUE attachxphp
       END  /* de IF */
    /* codegiven */
       codegiven  = SUBSTR(LINEA2.cics,20,11) /* +DFHSI1517 */
       IF codegiven = '+DFHSI1517' THEN DO
          givenxphp = SUBSTR(LINEA2.cics,1)
          QUEUE givenxphp
       END  /* de IF */
    /* dataset vacio */
       datasetvacio  = SUBSTR(LINEA2.cics,1,8) /* 'DATASET' */
      IF datasetvacio = 'DATASET' THEN DO
         dsvacioxphp = SUBSTR(LINEA2.cics,1)
         QUEUE dsvacioxphp
      END  /* de IF */
   END  /* DO */

   "EXECIO" QUEUED() "DISKW OUTCITEM (FINIS"
   "FREE  FI(OUTCITEM)"
   "FREE  FI(INPCITEM)"
   END
/*-----------------------------------------------*/
/*-----------------------------------------------*/
"FREE  FI(FTPJCLPA)"
"ALLOC FI(FTPJCLPA) DA('"DSNAME"(FTPARMOT)') SHR"

   "DROPBUF"
/* */
QUEUE "//Z99OTSF1  JOB  CLASS=0,MSGCLASS=8,NOTIFY=&SYSUID"
QUEUE "//*---------------------------------------------------------------"
QUEUE "//FTPSTEP1 EXEC PGM=FTP,PARM='(EXIT',REGION=4096K"
QUEUE "//STEPLIB  DD DSN=CEE.SCEERUN,DISP=SHR"
QUEUE "//SYSTCPD  DD DSN=TCPIP.OS390PRD.TCPPARMS(TCPDATA),DISP=SHR"
QUEUE "//SYSPRINT DD SYSOUT=*"
QUEUE "//OUTPUT   DD SYSOUT=*"
QUEUE "//INPUT    DD *"
QUEUE "SERVER"
QUEUE "USER"
QUEUE "PASSWORD"
QUEUE "CD DIR/DIR"
/*--------------------------------------------------------------------- */
 DO cics = 1 to cidelall.0
 nomecicsftp = SUBSTR(cidelall.cics,1,8) /* nombre cics de columan 1 a 8 */
QUEUE "PUT 'MIUSER.SYSVIEW.OUTPUT2."nomecicsftp"' SV."nomecicsftp".JESMSGLG.OUTPUT.txt"
END
/*--------------------------------------------------------------------- */
QUEUE "quit"
QUEUE "/*"
QUEUE "//FINEFTP  EXEC PGM=IEFBR14"
QUEUE "//*"
/*------------------------------------------*/
/* -DELETE DATASET --------------------------*/
/*------------------------------------------*/
QUEUE "//INIZDELE EXEC PGM=IEFBR14"
QUEUE "//*"
QUEUE "//DELE99   EXEC PGM=RASDELET"
QUEUE "//SYSPRINT DD  SYSOUT=*"
QUEUE "//SYSIN    DD  *"
 DO cics = 1 to cidelall.0
 dellistcics = SUBSTR(cidelall.cics,1,8)
 QUEUE "DELETE DSNAME=MIUSER.SYSVIEW.OUTPUT."dellistcics""
 QUEUE "DELETE DSNAME=MIUSER.SYSVIEW.OUTPUT2."dellistcics""
 END
 QUEUE "//*"
 QUEUE "//FINEDELE EXEC PGM=IEFBR14"
/*------------------------------------------*/
/*- FINE DELETE DATASET --------------------*/
/*------------------------------------------*/
QUEUE "//*"
QUEUE "//FINEJOB EXEC PGM=IEFBR14"
/* */
/*--------------------------------------------------------------------- */
"EXECIO * DISKW FTPJCLPA (FINIS"
"FREE  FI(FTPJCLPA)"
   "DROPBUF"
/* */

/* "ISPEXEC EDIT DATASET('"DSNAME"(FTPARMOT)')" */
   ADDRESS TSO "SUBMIT '"DSNAME"(FTPARMOT)'"

   SAY '-----------------------------------------------'
   SAY 'SUBMIT DEL JOB Z99OTSF1 - VERIFICAR EXITO'
   SAY 'files descargados en P:/DIR/DIR2'
   SAY '-----------------------------------------------'
   SAY '-----------------------------------------------'
   SAY 'FINE - STEP 4/4 - ENTER O F3 PARA SALIR'
   SAY '-----------------------------------------------'
   SAY '-----------------------------------------------'

EXIT
/* */                       
seguire probando para ver porq me pide que teclee 3 veces ENTER, por el momento solucione eso asi... ahora tengo que hacer un panel para que el usuario confirme el ambiente y con un SI o NO al confirmar ejecute el rexx...

otra cosa que recien me doy cuenta es que por ejemplo tengo 5 particiones, produccion, desarrollo, test , etc, etc todo en un symplex, hay alguna manera para pasarle el codigo del sistema ?? aunq no creo que si el panel se abre en el ambiente de produccion pueda ejecutar el rexx aun asi este el especificado el sistema de desarrollo verdad?? osea tengo que abrir el panel desde la particion donde se encuentran los cics ?? imagino que si .... no creo q desde produccion pueda ejecutar algo en otra particion...

muchas gracias nuevamente por todo.

saludos.

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 543
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: extraer una linea en un secuencial

Mensaje por Vicente » 22 Jul 2016, 12:11

Hola Italo,
respecto a tu problema de teclear ENTER 3 veces, quiero hacer algún comentario más al que ya hice de revisar el número de instrucciones PULL ejecutadas y de utilizar TRACE. Observa el siguiente segmento de tu código:

Código: Seleccionar todo

 DO UNTIL QUEUED() = 0
      PULL linea
      tipo = LEFT(linea,1)
      IF tipo = 'D' THEN DO
         i = i + 1
         PARSE VAR linea tipo "!" cmd "!" nombre.i "!"
      END
   END
¿Recuerdas mis comentarios sobre mi método de trabajo para resolver un problema, en el hilo anterior?

Uno de ellos era:
¿Qué libros me pueden ayudar?
Supongo que a estas alturas del tema, estarás durmiendo con el manual de referencia de REXX, debajo de tu almohada.
Lee con mucha atención la parte donde explica las diferencias entre DO UNTIL y DO WHILE.
Podrías sacar la conclusión de que estás ejecutando una vez más de las necesarias las instrucciones del bucle y estar haciendo una lectura PULL cuando no hay nada que leer y también estarás aumentando en una unidad de más la variable i y el número de variables nombre.i, donde esta última estará vacía.
Si fuera así piensa en como estará afectando todo esto al resto de tu código.

Otro de ellos era:
¿Qué puedo hacer para obtener más información?
Al principio de tu REXX pon una instrucción TRACE R o TRACE I, ejecuta el programa para ver si ocurre lo que he comentado; observarás donde se para el programa, también el valor de i, el valor de nombre.0 y el del último nombre.i.
¿Qué ocurrirá si cuanto tu programa está pidiendo que pulses ENTER, en su lugar introduces un texto? Observa en este caso los valores que maneja el programa.

Respecto a tu otra pregunta, no creo que se pueda ejecutar un programa desde un sistema, en otro;
SÍ conozco un modo de enviar un JCL a ejecutar desde un sistema a otro.
(Piensa que tu rexx se podría ejecutar en batch)

NOTA:
En el hilo anterior se me olvidó añadir en mi método de trabajo una de las más importantes reflexiones. Es la siguiente
Una vez resuelto el problema (no dudo que lo resolverás):
Revisar todos los pasos que has dado hasta encontrar la solución y preguntate.
¿Dónde me equivoqué?
¿Cuál ha sido la clave para resolverlo?
¿Puedo mejorar la solución?

P.D.:
Permíteme aconsejar una lectura (a ti y a todos los participantes en este foro).
Hace 30 años leí un maravilloso libro que enseña a resolver problemas.
Es de los años 60, y lo escribió G. Polya, uno de los mejores matemáticos y divulgadores del siglo XX.
No se necesitan conocimientos avanzados de matemáticas para leerlo.
En este libro podrás ver muchas de las cosas que he comentado.
Su título en inglés es: HOW TO SOLVE IT
Su título en español es: CÓMO PLANTEAR Y RESOLVER PROBLEMAS
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

italo_pm
Usuario avanzado
Usuario avanzado
Mensajes: 56
Registrado: 25 Mar 2015, 20:59
País: italia
Ciudad: milano
Ocupación: Consultor

Re: extraer una linea en un secuencial

Mensaje por italo_pm » 03 Ago 2016, 02:48

Hola Vicente, te puedp responder solo ahora, gracias por el comentarioy sugerencias, pues ahoraque leo nuevamente tu respuesta me doy cuenta que no he trabajado en los casos de errores, en mi rexx me limite a extraer las lineas que deseaba, pero no he escrito nada en el caso de que no encuentre esas lineas... pero antes de eso deja que te comente queahora se a decidido que ta no se realicen los transfer via ftp, ya no se debe hacer el ftp, solo desean que se vea en la pantalla el resultado por cada cics y al maximo crear un fichero para luego hacer el browse, asi que bueno me toco mmodificar nuevamente el rexx,

agregue un SAY "INICIO --- NOMBRECICS" al inicio del primer ciclo y un SAY "FINAL -- NOMBRECICS" al final del ciclo, cosa qye por cada cics obtengo un bloque separado, hasta ahi todo correcto, ahora debere crear un solo fichero que me contenga todo lo que muestro con el SAY de las variables que contienen el valor de lo que deseabab buscar (attached y given) o vacio... luego provare, ahora estaba haciendo la parte en donde si fuera el caso el IF no encuentee lo que busco, eso no lo hice, comencé con un ELSE y tube errores de sintaxis luego agregue un ELSE DO porque me parece sino entendi mal que cada DO debere de tener un END osea

IF condicion THEN DO
instrucción
END
ELSE DO
iinstrucción
END
pero me da error, luego intente sin el DO

IF condicion THEN
instrucción
ELSE
iinstrucción
END

pero ttambién me da error, nose si es porque tengo 3 bloques de IF, a lo mejor debere hacer un

IF condicion1 THEN DO
instrucciones ELSE
instrucciones
ELSE IF condición 2 THEN DO
instrucciones ELSE
instrucciones
ELSE IF condición 3 THEN DO
instrucciones ELSE
instrucciones
END

de esa manere en el ELSE deseo poner un mensaje de ERROR y seria un control serio.

gracias por leerme, saludos.

Italo

Responder