Mostrando entradas con la etiqueta JCL. Mostrar todas las entradas
Mostrando entradas con la etiqueta JCL. Mostrar todas las entradas

miércoles, 22 de junio de 2022

La beca COBOL (agilecobol)

 La famosa beca COBOL.

¿Qué cobolero no la ha vivido? Alguno hay, pero seguro que a muchos os suena esa famosa formación inicial de semanas o meses, antes de sumergirte en el mundo de la programación cobol.

El año pasado tuve mi primer contacto como formadora en una beca cobol. Me tocó la "parte 2" con COBOL y DB2.

Era mi primera vez y como el covid aún andaba por ahí me tocó dar toda la formación en remoto, sin más herramientas que una reunión de Teams.

Al segundo día supe que aquello no marchaba bien. En una llamada con 8 personas, los alumnos perdían el "preguntarle al compañero". Perdían el ayudarse entre ellos. Y tenían que escuchar cómo yo iba resolviendo los problemas de cada uno. Era un caos.

Pero no hay nada mejor que la necesidad. Si los que llevan tiempo en esto no hacían más que decir que lo mejor para aprender a programar era hacer Pair Programming, pues había que intentarlo.
Preparé una pequeña presentación para explicar en qué consistía y elegí las parejas (fuimos haciendo cambios de pareja a lo largo de la semana).

Et voilà! El ánimo subió, los ejercicios salían más rápido, yo seguía pasándome por sus reuniones a dos cuando me necesitaban y todo el mundo le pilló el punto en un instante.
Formación salvada.

Este año he tenido otra oportunidad de participar como formadora en una beca cobol, pero esta vez en presencial.
Qué diferencia. Echaba taaaanto de menos la pizarra y los rotuladores... xd Y ver la cara a la gente. No hay nada como verle la cara a alguien para saber si está en dificultades sin que diga nada.

En la anterior beca había aprovechado para hacer una retrospectiva sobre la formación y así detectar puntos de mejora para la siguiente. Y en ésta me apliqué el cuento. Por ejemplo "mucha teoría seguida sin ver nada de práctica al principio", pues nos hacemos un "Hola mundo" el primer día y desde ahí avanzamos.

Esta vez no hubo pair programming así que pude comparar las dos situaciones y sacar conclusiones:

1. Enseñar en presencial gana de calle a enseñar en remoto.
Poder pintar en la pizarra, poder señalar con el dedo (en la pizarra o en el proyector), poder ver la cara de la gente que no consigue que su programa compile... Podría dar 1000 razones.

2. Se puede enseñar sin Pair Programming (obvio), pero.
- Trabajando por pares consigues que todo el grupo avance a la vez (o casi xd). El que lo pilla más rápido arrastra al que lo pilla más despacio, y al revés, se frena a los "demasiado rápidos" para mantener un ritmo sostenible.
- Trabajando de manera individual, tienes al que va al doble de velocidad que el otro. Y lo tienes que entretener con otra cosa mientras los que van más despacio terminan.
- Aunque siempre se preguntan entre ellos, no aprenden tanto unos de otros.
- Los que terminan rápido se ponen a hacer "otras cosas" y dejan de estar centrados en la formación.

3. Hay que adaptar las formaciones a los tiempos que corren.
Lo que aprendí en la primera beca me sirvió para esta última. Mucha práctica, teoría después de la práctica y no antes, deja que fallen y corrige después...

¿Qué os hubiese gustado encontraros en vuestra beca COBOL? ¡Os leo en comentarios!

#thisistheway

lunes, 28 de diciembre de 2020

SORT vol.1: SORT, INCLUDE.

ACTUALIZADO: comparando zonas de un mismo registro con INCLUDE.

La estructura general de un SORT es la siguiente:

//SORT001  EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//SORTIN   DD DSN=nombre.fichero.entrada1,DISP=SHR
//         DD DSN=nombre.fichero.entrada2,DISP=SHR
//SORTOUT  DD DSN=nombre.fichero.salida1,
//            DISP=(,CATLG,DELETE),SPACE=(CYL,(500,100))
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *




PGM=SORT --> Indica el programa a utilizar, en este caso el SORT
PARM=('DYNALLOC=(SYSALLDA,32)') --> Cantidad de memoria que se da a la ejecución del paso. Si se queda corto, aumentarla en valores de 8,12,32,64,128, 256 (como las memorias RAM)
SORTIN --> Ficheros de entrada
SORTOUT --> Ficheros de salida
SYSIN --> Indica el tipo de sort a realizar, las opciones disponibles son muchas y muy variadas, pudiendo utilizarse varias juntas en un mismo paso. Algunas de ellas son SORT, SUM, OMIT, INCLUDE, INREC, OUTREC, OUTFIL, OPTION … .

En este documento se explica en detalle algunas de estas funciones:

SORT

SORT FIELDS --> Ordena los registros a partir del fichero de entrada y los guarda ordenados en el fichero de salida:

//SORT001  EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//SORTIN   DD DSN=nombre.fichero.entrada1,DISP=SHR
//         DD DSN=nombre.fichero.entrada2,DISP=SHR
//SORTOUT  DD DSN=nombre.fichero.salida1,
//            DISP=(,CATLG,DELETE),SPACE=(CYL,(500,100))
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
 SORT FIELDS=(I,L,T,O,I,L,T,O)

I – Inicio. Posición donde empieza el campo por el que se quiere ordenar
L – Longitud máxima del campo por el que se quiere ordenar
T – Tipo de dato del campo que se quiere ordenar:
       CH --> Alfanumérico o numérico normal(sin COMP)
       BI --> Hexadecimal (campos COMP)
       PD --> Empaquetado con o sin signo(campos COMP-3)
O – Orden. A-Ascendente, D- Descendente

Ejemplo:

Ordenar el siguiente fichero por Número y Nombre de cliente en orden ascendente:

----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO
000000006ANTONIO   VILLA     SUSO     AUTONOMO
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO
000000001JOSE      LOPEZ     PITA     AUTONOMO
000000004CARLOS    POLO      DEL BARROAUTONOMO
000000003CARLOS    PEREZ     FANO     AUTONOMO

Fórmula:

SORT FIELDS=(1,9,CH,A,10,10,CH,A)

Resultado:

----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000001JOSE      LOPEZ     PITA     AUTONOMO
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO
000000003CARLOS    PEREZ     FANO     AUTONOMO
000000004CARLOS    POLO      DEL BARROAUTONOMO
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO
000000006ANTONIO   VILLA     SUSO     AUTONOMO

Otra opción que tiene el SORT es la siguiente:

SORT FIELDS=COPY

Con ella no indicamos ningún tipo de orden, por lo cual, el fichero de entrada se grabará en salida con el mismo orden.


INCLUDE

Filtra los registros deseados por la condición que se indique:

//SORT001  EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//SORTIN   DD DSN=nombre.fichero.entrada1,DISP=SHR
//         DD DSN=nombre.fichero.entrada2,DISP=SHR
//SORTOUT  DD DSN=nombre.fichero.salida1,
//            DISP=(,CATLG,DELETE),SPACE=(CYL,(500,100))
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
 SORT FIELDS=COPY
 INCLUDE COND=(I,L,T,C,V)

I – Inicio. Posición donde empieza el campo por el que se quiere filtrar
L – Longitud máxima del campo por el que se quiere filtrar
T – Tipo de dato del campo que se quiere filtrar:
       CH - Carácter o numérico normal(sin COMP)
       BI - Hexadecimal (campos COMP)
C – Condición de la igualdad que se quiere realizar:
       EQ – Igual
       NE - Distinto
       GE – Mayor o igual
       GT - Mayor
       LE – Menor o igual
       LT - Menor
V – Valor del dato por el que se quiere filtrar
       X’001A‘ – Indica un valor hexadecimal o empaquetado
       C’AL12’ – Indica un valor alfanumérico

Ejemplos:

Ejemplo 1. Vamos a realizar un paso de SORT que realice un filtrado del fichero indicado, para quedarse con los clientes que cumplan lo siguiente: Sean AUTONOMOS y su número de teléfono sea un móvil (comience por 6):

Copy:

01 ENTRADA1.
   05 ENTRADA1-NUMCLI    PIC 9(9).
   05 ENTRADA1-NOMBRE    PIC X(10).
   05 ENTRADA1-APELLID1  PIC X(10).
   05 ENTRADA1-APELLID2  PIC X(10).
   05 ENTRADA1-TIPO      PIC X(11).
   05 ENTRADA1-CATEGORIA PIC 9(9) COMP-3.
   05 ENTRADA1-TLFNO     PIC 9(9).
   05 FILLER             PIC X(9) VALUE SPACES.

Fichero entrada:

=COLS>
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO      983275586
FFFFFFFFFDCECCD4444DCDECDCE44CCDDCECDDCECDCDCCCD400001FFFFFFFFF444444444
00000000211595900004193955900319953596121319914600000C983275586000000000
------------------------------------------------------------------------
000000006ANTONIO   VILLA     SUSO     AUTONOMO        918514535
FFFFFFFFFCDEDDCD444ECDDC44444EEED44444CEEDDDDD44400003FFFFFFFFF444444444
00000000615365960005933100000242600000143656460000000C918514535000000000
------------------------------------------------------------------------
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO        988453548
FFFFFFFFFEDDCDCC444DDDCE44444CDDDED444CEEDDDDD44400001FFFFFFFFF444444444
00000000586315410003675900000136526000143656460000000C988453548000000000
------------------------------------------------------------------------
000000001JOSE      LOPEZ     PITA     AUTONOMO        676757687
FFFFFFFFFDDEC444444DDDCE44444DCEC44444CEEDDDDD44400001FFFFFFFFF444444444
00000000116250000003675900000793100000143656460000000C676757687000000000
------------------------------------------------------------------------
000000004CARLOS    POLO      DEL BARROAUTONOMO        666415887
FFFFFFFFFCCDDDE4444DDDD444444CCD4CCDDDCEEDDDDD44400003FFFFFFFFF444444444
00000000431936200007636000000453021996143656460000000C666415887000000000
------------------------------------------------------------------------
000000003CARLOS    PEREZ     FANO     AUTONOMO        986115484
FFFFFFFFFCCDDDE4444DCDCE44444CCDD44444CEEDDDDD44400001FFFFFFFFF444444444
00000000331936200007595900000615600000143656460000000C986115484000000000
------------------------------------------------------------------------

Fórmula:

INCLUDE COND=(39,8,CH,EQ,C'AUTONOMO',AND,55,1,CH,EQ,C'6')


Fichero salida:

=COLS> ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000001JOSE      LOPEZ     PITA     AUTONOMO        676757687
FFFFFFFFFDDEC444444DDDCE44444DCEC44444CEEDDDDD44400001FFFFFFFFF444444444
00000000116250000003675900000793100000143656460000000C676757687000000000
-------------------------------------------------------------------------
000000004CARLOS    POLO      DEL BARROAUTONOMO        666415887
FFFFFFFFFCCDDDE4444DDDD444444CCD4CCDDDCEEDDDDD44400003FFFFFFFFF444444444
00000000431936200007636000000453021996143656460000000C666415887000000000
-------------------------------------------------------------------------


Ejemplo 2. Vamos a realizar un paso de SORT similar al anterior, que realice un filtrado del fichero indicado, para quedarse con los clientes que cumplan lo siguiente: Sean AUTONOMOS y su número de teléfono sea un móvil (comience por 6). Pero en este caso el número de teléfono vendrá empaquetado(COMP-3):

Copy:

01 ENTRADA1.
   05 ENTRADA1-NUMCLI    PIC 9(9).
   05 ENTRADA1-NOMBRE    PIC X(10).
   05 ENTRADA1-APELLID1  PIC X(10).
   05 ENTRADA1-APELLID2  PIC X(10).
   05 ENTRADA1-TIPO      PIC X(11).
   05 ENTRADA1-CATEGORIA PIC 9(9) COMP-3.
   05 ENTRADA1-TLFNO     PIC 9(9) COMP-3.
   05 FILLER             PIC X(13) VALUE SPACES.

Fichero entrada:

----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO      q Íì%
FFFFFFFFFDCECCD4444DCDECDCE44CCDDCECDDCECDCDCCCD400001937564444444444444
00000000211595900004193955900319953596121319914600000C8258C0000000000000
-----------------------------------------------------------------------
000000006ANTONIO   VILLA     SUSO     AUTONOMO        q Î %
FFFFFFFFFCDEDDCD444ECDDC44444EEED44444CEEDDDDD44400003937164444444444444
00000000615365960005933100000242600000143656460000000C8265C0000000000000
-----------------------------------------------------------------------
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO        o ÍÌ 
FFFFFFFFFEDDCDCC444DDDCE44444CDDDED444CEEDDDDD44400001937724444444444444
00000000586315410003675900000136526000143656460000000C6858C0000000000000
-----------------------------------------------------------------------
000000001JOSE      LOPEZ     PITA     AUTONOMO        #jéì%
FFFFFFFFFDDEC444444DDDCE44444DCEC44444CEEDDDDD44400001695564444444444444
00000000116250000003675900000793100000143656460000000C9118C0000000000000
-----------------------------------------------------------------------
000000004CARLOS    POLO      DEL BARROAUTONOMO        ÅÂÌì%
FFFFFFFFFCCDDDE4444DDDD444444CCD4CCDDDCEEDDDDD44400003667564444444444444
00000000431936200007636000000453021996143656460000000C7288C0000000000000
-----------------------------------------------------------------------
000000003CARLOS    PEREZ     FANO     AUTONOMO        m nç%
FFFFFFFFFCCDDDE4444DCDCE44444CCDD44444CEEDDDDD44400001939464444444444444
00000000331936200007595900000615600000143656460000000C4558C0000000000000
-----------------------------------------------------------------------

Fórmula:

 INCLUDE COND=(39,8,CH,EQ,C'AUTONOMO',AND,
    (55,5,BI,GE,X'600000000C',AND,55,5,BI,LT,X'700000000C'))

Resultado:

----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000001JOSE      LOPEZ     PITA     AUTONOMO        #jéì%
FFFFFFFFFDDEC444444DDDCE44444DCEC44444CEEDDDDD44400001695564444444444444
00000000116250000003675900000793100000143656460000000C9118C0000000000000
------------------------------------------------------------------------
000000004CARLOS    POLO      DEL BARROAUTONOMO        ÅÂÌì%
FFFFFFFFFCCDDDE4444DDDD444444CCD4CCDDDCEEDDDDD44400003667564444444444444
00000000431936200007636000000453021996143656460000000C7288C0000000000000
------------------------------------------------------------------------


NOTA: a la hora de comparar con valor (EQ, NE, GT...) podemos utilizar para la comparación otra zona del fichero:

Fichero entrada:
----+----1----+----2-
XXXXX111111XXXXX
YYYYY111111XXXXX
ZZZZZ111111ZZZZZ
WWWWW111111XXXXX

Fórmula:
INCLUDE COND =(1,5,CH,EQ,12,5,CH)

Resultado:
----+----1----+----2-
XXXXX111111XXXXX
ZZZZZ111111ZZZZZ

Hemos comparado las posiciones 1 a 5 con las posiciones 12 a 16 del mismo registro.

domingo, 22 de marzo de 2020

Vuelve el Consultorio Cobol

Hola amigas y amigos del Consultorio Cobol.

Son días extraños. El estado de alarma en España nos tiene a todos en casa.
Me considero afortunada porque puedo trabajar desde casa, como muchos otros compañeros coboleros.

El teletrabajo, todos soñábamos con él. Yo ya teletrabajaba un día a la semana desde hacía más de 6 meses, pero para otros es algo completamente nuevo. Y éste es un teletrabajo permanente hasta no se sabe cuándo.
Teletrabajar tiene muchas ventajas pero también hace que cosas tan sencillas como preguntar a tu compi de al lado se vuelvan más complicadas.
Es cierto que tenemos mil herramientas para comunicarnos, compartir el escritorio, compartir archivos, trabajar sobre un mismo documento de forma colaborativa... pero no siempre es lo mismo.

Es por eso que en estos días en que todo es más difícil, ponemos a vuestra disposición todo el contenido del Consultorio Cobol una vez más.

En este tiempo hemos estado trabajando para lograr una versión mejorada del blog, y no dejaremos de hacerlo. Pero mientras dure la cuarentena creemos que, ya que no tenemos al compañero experto a un giro de silla de nosotros, al menos vamos a intentar echar una mano compartiendo los artículos del blog.

Muchos junior han empezado en pleno confinamiento y para ellos seguro que se hace aún más difícil.
Esperamos ayudar un poquito reabriendo el blog.
No puedo aseguraros que vayamos a contestar dudas, porque ya ninguno estamos en el día a día de un programador.


Esto sólo es un granito de arena en medio de la que está cayendo, pero menos es nada :-)

Espero de verdad que estéis todos bien y que salgamos de ésta fortalecidos.


Un abrazo muy fuerte a todos,

Talli.


lunes, 16 de julio de 2018

Utilidades Rexx IV: listar miembros

ACTUALIZADO: hagamos un .csv para tener la lista en un fichero excel.

Aquí os dejo un programilla rexx que lista los componentes/miembros de una librería que le indiquemos:

/* REXX*/                                               
ADDRESS "ISPEXEC"                                       
"LMINIT DATAID(LMID) DATASET('"libreria.componentes.alistar"')"
"LMOPEN DATAID("LMID")"                                 
DO FOREVER = 1                                          
    "LMMLIST DATAID("LMID") MEMBER(LMMEM) STATS(YES)"   
    IF RC > 0 THEN LEAVE                                
    SAY 'MEMBER NAME:' LMMEM                            
    SAY 'TSO UID    :' ZLUSER                           
    SAY 'CREATE DATE:' ZLCDATE                          
END                                                     
"LMFREE DATAID("LMID")"   
                         

Donde:
LMMEM es el nombre del componente/miembro de la librería.
ZLUSER es el usuario que lo creó.
ZLCDATE es la fecha de creación del componente.

ó para nuestro fichero excel:
/* REXX*/                                                
ADDRESS "ISPEXEC"                                        
"LMINIT DATAID(LMID) DATASET('"libreria.componentes.alistar"')"
"LMOPEN DATAID("LMID")"                                  
DO FOREVER = 1                                           
    "LMMLIST DATAID("LMID") MEMBER(LMMEM) STATS(YES)"    
    IF RC > 0 THEN LEAVE                                 
    SAY LMMEM ';' ZLUSER ';' ZLCDATE                             
END                                                      
"LMFREE DATAID("LMID")" 

Para ejecutar nuestro código rexx hemos hecho este job:



//REXXJCL  JOB (OPC0,001),'CONSU',REGION=0M,NOTIFY=&SYSUID,
//            CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1),COND=(4,LT)
//REXXPGM  EXEC PGM=IKJEFT01                              
//SYSEXEC   DD DSN=librería donde tengo el programa rexx,DISP=SHR               
//ISPPROF   DD DSN=&&PROF,UNIT=SYSDA,SPACE=(TRK,(5,5,5)), 
//             RECFM=FB,LRECL=80                          
//ISPSLIB   DD DISP=SHR,DSN=ISP.SISPSLIB                  
//ISPPLIB   DD DISP=SHR,DSN=ISP.SISPPENU                  
//ISPMLIB   DD DISP=SHR,DSN=ISP.SISPMENU                  
//ISPTLIB   DD DISP=SHR,DSN=ISP.SISPTENU                  
//ISPLOG    DD SYSOUT=*,DCB=(LRECL=125,RECFM=VBA)         
//SYSTSPRT DD  SYSOUT=*,DCB=LRECL=125                     
//SYSPRINT DD  SYSOUT=*                                   
//SYSTSIN  DD  *                                          
  ISPSTART CMD(REXXLIS)                                   
/*
                               

Donde REXLIST sería el nombre de nuestro programa rexx.
La información la veremos en el SYSTSPRT:


lunes, 23 de octubre de 2017

REPLACE / REEMPLAZAR con FINDREP en JCL

Hola a todos.
Hace unos días un amigo me contaba que tenía un fichero que generaba desde Java, y que le llegaba a host con espacios al final.
Él necesitaba cambiar esos espacios a low-values y me preguntaba cómo hacerlo por JCL.

Así que aprovecho y os enseño este job facilito para reemplazar algunos valores de tu fichero usando OUTREC FINDREP, como complemento al artículo SORT vol.2: OUTREC donde explicábamos el uso de CHANGE.

Imaginad que tenemos un fichero de longitud variable que viene relleno con espacios al final de los datos:

                                                           Columns 00001 00072
Command ===>                                                  Scroll ===> CSR 
****** ***************************** Top of Data ******************************
000001 ENTRADA1                                                               
       CDEDCCCF4444444444444444444444444444444444444444444444444444444444444444
       553914110000000000000000000000000000000000000000000000000000000000000000
------------------------------------------------------------------------------
000002 ENTRADA1MASCOSAS                                                       
       CDEDCCCFDCECDECE44444444444444444444444444444444444444444444444444444444
       553914114123621200000000000000000000000000000000000000000000000000000000
------------------------------------------------------------------------------
****** **************************** Bottom of Data ****************************


Y que queremos reemplazar esos espacios por low-values.



JCL:
//******************************************* 
//* SORT REPLACE DE ESPACIOS POR LOW-VALUES   
//******************************************* 
//REPLACE EXEC PGM=SORT                       
//SORTIN   DD DSN=ENTRADA.OUTRECVB,DISP=SHR
//SORTOUT  DD DSN=ENTRADA.OUTRECVB.SAL,   
//            DISP=(,CATLG,DELETE),           
//            SPACE=(CYL,(200,50),RLSE)       
//SYSOUT   DD SYSOUT=*                        
//SYSIN    DD *                               
    SORT FIELDS=COPY                          
    OUTREC FINDREP=(IN=(X'40'),OUT=(X'00')) 
  
/*     
                                     

Podéis poner varios valores en IN, y pueden ser caracteres alfanuméricos (un guión, una letra, un número....), parejas de reemplazo...
Tenéis un montón de ejemplos de FINDREP en este enlace de IBM.

NOTA: Tened en cuenta que si reemplazáis una cadena (por ejemplo 'HOLA') por otra con diferente longitud (por ejemplo 'HI'), se eliminarán las posiciones sobrantes, es decir, si en mi fichero de entrada tenía:
HOLATALLIAN
En el de salida tendré
HITALLIAN
:-)

Saludos!

lunes, 17 de julio de 2017

FTP desde JCL

Muchas veces nos preguntamos cómo se crea un FTP desde cero, sin embargo no existe un manual o un estándar, que nos indique, como debe de ser generado.
Como estamos en el camino, los ayudaré dando la pauta con lo básico para que lo puedas crear. Antes de nada podemos decir de los FTP’S:
  •  File Transfer Protocol, es un protocolo con una arquitectura cliente – servidor que te permite transferir archivos entre tu servidor local y un servidor FTP.
  •  Debes de identificar que el FTP que quieras generar es cliente. (Si es así es porque tu deseas transferir archivos a un alojamiento, o a un directorio).
  • Que existen varias maneras de transferir ficheros desde el host por FTP, pero que aquí veremos el caso del PGM=FTP en un proceso batch (job) al que le pasaremos parámetros utilizando el PARM.
  •  Podemos utilizar el nombre del servidor o su dirección IP utilizando el puerto 21.

//FTPSON   JOB,'FTP CONSULTORIO',
//             CLASS=P,MSGCLASS=S,REGION=0M
//*
//PASO01   EXEC PGM=FTP,REGION=2048K,
//         COND=(4,LT),
//          PARM='(EXIT=08 TIMEOUT 20'
//SYSMDUMP   DD SYSOUT=*
//SYSPRINT   DD SYSOUT=*
//OUTPUT     DD SYSOUT=*
//INPUT      DD *
nombre.servidor ó DIRECCIÓN IP
Usuario Contraseña
CD /Directorio/destino
PUT 'FICHERO.DEL.HOST' fichero.txt
QUIT

Donde:
EXEC PGM=FTP: necesario para hacer un ftp
REGION=2048K es lo mínimo, se puede aumentar
EXIT=08 significa que en caso de error el job devolverá un return code 08, se puede indicar otro valor
timeout=20 significa que va a esperar 20 segundos a que se haga el envío y si tarda más dará error, se puede indicar otro valor

En la información del INPUT, vemos que tenemos mayúsculas y minúsculas. Para ello hemos tecleado CAPS OFF en la línea de comandos.

El nombre del servidor es el mismo que se utiliza en un software FTP como filezilla:

El usuario y contraseña será el mismo que tengamos configurado para el acceso a ese servidor.
La dirección de destino la indicamos con el comando CD (change directory):

El fichero de nuestro host (el fichero local) se indica entre comillas simples, y el fichero destino no lleva comillas.
PUT 'FICHERO.DEL.HOST' fichero.txt
El comando PUT copia un fichero del host local al servidor destino.
El comando QUIT provoca la desconexión del servidor y finaliza la sesión FTP.

También se puede indicar el nombre del servidor en el PARM:
PARM='nombre.servidor (EXIT=08 TIMEOUT 20'

PARM='direcciónIP (EXIT=08 TIMEOUT 20'


Ambas formas las hemos probado y funcionan correctamente :-)


Otras formas de hacer un FTP:
//FTP00001 EXEC PGM = IKJEFT01, DYNAMNBR = 50
//OUT DD SYSOUT = *
//AMSDUMP DD SYSOUT = *
//SYSTSPRT DD SYSOUT = *
//SYSIN DD DUMMY
//SYSPRINT DD DUMMY
//OUTPUT DD SYSOUT = *
//SYSTSIN DD *
FTP (EXIT
Dirección IP
Usuario
Contraseña
Pwd
Ascii
Cd /Directorio/destino
Pwd
PUT 'FICHERO.DEL.HOST' fichero.txt
QUIT

Otra opción es utilizar el NETRC para especificar en ese fichero los datos del login (servidor, usuario y contraseña) de forma que así no queden visibles en el job. Por ejemplo:
machine nombre.servidor.com login usuario password contraseña


//FTPSON   JOB,'FTP CONSULTORIO',
//             CLASS=P,MSGCLASS=S,REGION=0M
//*
//PASO01   EXEC PGM=FTP,REGION=2048K,
//         COND=(4,LT),
//          PARM='(EXIT=08 TIMEOUT 20'
//SYSMDUMP   DD SYSOUT=*
//SYSPRINT   DD SYSOUT=*
//NETRC      DD DSN=FICHEROHLQ.NETRC,DISP=SHR
//OUTPUT     DD SYSOUT=*
//INPUT      DD *
CD /Directorio/destino
PUT 'FICHERO.DEL.HOST' fichero.txt
QUIT

Podéis encontrar mucha más información en la web de IBM en pdf.


Espero que este artículo, os haya servido, me dio mucho gusto volver a publicar, y espero ya no tardar tanto :D



lunes, 28 de noviembre de 2016

¿Tipos de Archivos Secuenciales? Bah!

¡¡Hola coboleros!! Ya vimos en un artículo anterior la diferencia entre los archivos secuenciales y VSAM, pero en este artículo nos ocuparemos de distinguir los distintos tipos de organización de estos archivos secuenciales.
Primero debemos de indicar qué entendemos por “organización del archivo”. Esto indica como los registros se organizan en un archivo, y cuya finalidad es aumentar su eficiencia de acceso a los registros.

Se muestra a continuación los tipos de “organización” que existen:

  • Organización del archivo secuencial
  • Organización del archivo secuencial indexado
  • Organización de archivo relativa

Empezando…. Organización del Archivo Secuencial…


Un archivo secuencial consta de registros almacenados en el archivo y cuyo acceso a ellos es meramente secuencial. Esto quiere decir que el primero que entra es el último en salir y que no se puede acceder a un registro que está en medio del archivo, si no se recorre esa primera mitad del archivo.
Muchas de las características que se requieren saber sobre los archivos secuenciales se mencionaron en el artículo Ficheros Secuenciales vs Ficheros VSAM ¿Cuál es el mejor?”, sin embargo vamos a rememorar algunas de las principales características que se tienen de los archivos secuenciales.

·         Se pueden leer los archivos en orden secuencial, esto quiere decir que si tienes un registro en medio del archivo, tienes que leer los archivos anteriores a este para que puedas leer el registro que te interesa.
·        Los registros se escriben en orden secuencial, el último registro en ser insertado, es el primer registro en ser leído.
·        Después de insertar un registro en un archivo secuencial, no es posible eliminar, reducir o alargar un registro.
·        Orden de los registros, una vez insertados, no se puede cambiar.
·        Actualización de registro es posible. El registro se puede sobrescribir, si la nueva longitud de registro es el mismo que el de longitud de registro.


Dentro del programa siempre se podrá especificar la sintaxis de la organización del archivo secuencial:
       FILE-CONTROL                                           
       SELECT ENTRADA ASSIGN TO ENTRADA                
                       ORGANIZATION IS SEQUENTIAL       
                       ACCESS MODE  IS SEQUENTIAL       
                       FILE STATUS IS WS-FS-ENTRADA.
  

Donde

ASSIGN TO: Asigna el archivo de entrada “ENTRADA” al nombre de la tarjeta del sistema también llamado “ENTRADA”
ORGANIZATION: Se especifica que su organización es secuencial
ACCESS MODE: Tipo de acceso, el cual se especifica que es secuencial
FILE STATUS: El estatus del archivo el cual deberá de comenzar con 00.

Mientras que en el JCL nosotros podemos encontrarlo como se muestra en el ejemplo de a continuación:

//ENTRADA  DD  DSN=MOVDELL.R08.I1OUP10.SORTINYU,
//             DISP=(OLD,KEEP,KEEP)                

ENTRADA: Archivo que se va a mandar a llamar para entrada del proceso.


Organización del archivo secuencial indexado


Un archivo secuencial indexado consiste de registros que pueden tener acceso a los datos de forma secuencial. Consta de dos partes:

  • Archivo de Datos contiene registros en orden secuencial.
  • Archivo de índice contiene la clave principal y su dirección en el archivo de datos.

Por Archivo de datos nos referimos a los registros escritos en orden secuencial, del tamaño que requiera la información, y también de la estructura que requiera la información.

Por Archivo de Índice nos referimos a la clave principal que rige a cada uno de los registros, y su dirección pero de memoria dentro del archivo de datos. Esta dirección de memoria por lo general suele ser hexadecimal.

A continuación se muestran las ventajas y desventajas más importantes que tienen estos archivos:

Ventaja:

·         Es rápida si se cuenta con los datos llave con los que se quiere encontrar un dato.
·         Permite el acceso secuencial
·         Permite el acceso directo de los registros
·         Se pueden actualizar los registros en el mismo fichero sin necesidad de crear un fichero nuevo de copia en el proceso de actualización

Desventaja:

·         Requiere implementar índices que ocupan recursos como espacio en disco y algoritmos diversos para optimizar búsquedas (aunque de eso ya se ocupan los manejadores de bases de datos)
·         Ocupa más espacio en el disco que los ficheros secuenciales, debido al uso del área de índices
·         Tiene tendencia a que aumente el tiempo medio de acceso a los registros, cuando se producen muchas altas nuevas con claves que hay que intercalar entre las existentes.

Se mencionan algunas de las principales características que tienen este tipo de archivos:

·         El índice nos proporciona una capacidad de búsqueda para llegar rápidamente al registro deseado
·         El “archivo de datos”  es similar al archivo secuencial, pero está integrado de forma que los registros se ubiquen siguiendo un puntero o dirección de memoria desde su registro predecesor.
·         Cuando se añade un nuevo registro, al archivo principal que sigue al nuevo registro y  según la secuencia lógica, se actualiza con el puntero del registro nuevo en el archivo de datos.
·         El diseño del registro tiene que tener un campo o combinación de campos, que permita identificar cada registro de forma única. Este campo que hará esa distinción será campo clave, y es el que va a servir de índice.
·          Un mismo fichero puede tener más de un campo clave, pero al menos uno de ellos no admitirá valores duplicados y se les llama clave primaria.
·        Se pueden leer los registros en orden secuencial, como en organización de archivos secuenciales.
·        Los registros se pueden acceder aleatoriamente si la clave principal es conocida.
·        El archivo índice se utiliza para obtener la dirección de un registro (hexadecimal) y, a continuación, se obtiene el registro del archivo de datos, ya con la dirección de memoria.


Sintaxis

FILE-CONTROL.                                                 
    SELECT ARCH-VSAMDIR   ASSIGN TO VSAMDIR                   
                          ORGANIZATION IS INDEXED             
                          ACCESS IS DYNAMIC                   
                          RECORD KEY IS KEY-VSAMDIR           
                          FILE STATUS IS FS-VSAMDIR.          
Donde

ASSIGN TO: Se le asigna ARCH-VSAMDIR a VSAMDIR
ORGANIZACIÓN IS De tipo indexada
ACCESS IS El acceso es dinámico
RECORD KEY IS El archivo se está recorriendo por la llave KEY-VSAMDIR
FILE STATUS IS El estatus del archivo, al inicio el cual deberá de ser 00.

Espero que el articulo te haya gustado y te haya sido de utilidad. :-)