jueves, 30 de junio de 2011

Ticjob.es

Ya hay disponible un portal de empleo exclusivamente orientado a profesionales relacionados con las Tecnologías de la Información y las Comunicaciones.

Entre las características específicas que aporta este portal podemos resaltar el equipo de consultores de RRHH especializados en el sector TIC que verifica la calidad de toda la información que se introduce.

Desde su creación y lanzamiento el 23 de marzo pasado, Ticjob ha recibido más de 60.000 visitas, tiene unos 2.000 currículums registrados y alrededor de 700 ofertas de empleo en línea.

Como adelantó Consultorio Cobol hace unas semanas en el estudio de mercado que realizamos, y que viene a confirmar el director de Ticjob.es, es que los desarrollos más buscados son java, Cobol, y .net. Los sistemas más demandados son Oracle y Unix, y dentro de las aplicaciones gerenciales la más pedida por las empresas es claramente SAP.

La herramienta es totalmente gratuita para los candidatos, se puede consultar en cualquier momento las ofertas de empleo, su totalidad o las más recientes, se puede también crear alertas que te avisen a través del correo electrónico de la publicación de nuevas ofertas que se ajusten a tus búsquedas.

Entrevista Computing.es

CONSULTIRAS 15: "Dignidad"

Tiene casi veinte años y ya esta
cansado de soñar
Pero tras la pantalla esta su hogar
Su mundo y su ciudad

Piensa que el ordenador solo es
un trozo de metal
algo que nunca puede detener
sus ansias de picar...

Digno, como el sol cuando amanece
Yo soy Digno, como el mar
Digno, como el código que me compila y puedo al fin probar
Digno, como el salario que me merezco Y mi categoría,
trabajando cada día
Detrás de la pantalla,
y sabre lo que es al fin la dignidad.
(...)

(Pinchad en la imagen para hacerla más grande)

viernes, 24 de junio de 2011

Maximiza el valor de tu mainframe

En una encuesta la empresa BMC Software descubrió que 65% de las empresas indicó que reducir el costo de sus tecnologías de la información (TI) es una prioridad para sus negocios.

Las claves que presenta BMC Software para reducir el costo son tres:

- Tomar ventaja de los procesadores especializados
- Seleccionar correctamente a los vendedores con los que va a trabajar
- Mejorar el mantenimiento

Para mejorar esas tres áreas nos dan 10 recomendaciones a seguir:

- Utilizar procesadores especializados para reducir los costos
- Reducir el tiempo de uso del mainframe
- No ahorrar dinero a costa de niveles de servicio
- Un código eficiente es el rey
- Buscar proveedores que puedan descargar algunos de sus propios trabajos a los procesadores especializados
- Analizar si el outsourcing es el adecuado para su negocio
- Trabajar en conjunto con el proveedor de outsourcing
- Aprovechar el software independiente
- Evaluar el valor a largo plazo
- Buscar herramientas que ayuden con dinámicas de ajuste SQL y rendimiento

Desde aquí esperamos servir de ayuda para realizar desarrollos eficientes siguiendo la máxima "un código eficiente es el rey".

Artículo altonivel.com

jueves, 23 de junio de 2011

CONSULTIRAS 14: "Loco del Cobol Vol. 3"

Tened cuidado, que a veces se me va mucho la pinza....


(Pinchad en la imagen para hacerla más grande)

miércoles, 22 de junio de 2011

Ejemplo 1: Leer de SYSIN y escribir en SYSPRINT (pl/i).

En PL/I hay que diferenciar entre los programas que acceden a DB2 y los que no, pues se compilarán de maneras diferentes y se ejecutarán de forma diferente.
Enpezaremos por ver el programa sin DB2 más sencillo:

El programa más sencillo es aquel que recibe datos por SYSIN del JCL y los muestra por SYSPRINT.

JCL:

//PROG1 EXEC PGM=PRUEBA1
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
JOSE LOPEZ VAZQUEZ  HUGO CASILLAS DIAZ
JAVIER CARBONERO    PACO GONZALEZ
JESUS IGLESIAS      RICARDO MONTES
/*


donde EXEC PGM= indica el programa SIN DB2 que vamos a ejecutar
SYSPRINT DD SYSOUT=* indica que la información "displayada" se quedará en la cola del SYSPRINT (no lo vamos a guardar en un fichero)
en SYSIN DD * metemos la información que va a recibir el programa

Fijaos en las posiciones de los nombres de la SYSIN, para entender bien el programa:

----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
JOSE LOPEZ VAZQUEZ  HUGO CASILLAS DIAZ
JAVIER CARBONERO    PACO GONZALEZ
JESUS IGLESIAS      RICARDO MONTES


Como veis, hemos dividido la información en 2 trozos de 20 posiciones, cada uno con un nombre. Además hemos escrito varias líneas de SYSIN, pues como vimos en el artículo de Ficheros en PL/I, podemos recuperar varias líneas (en COBOL esto no es posible).

PROGRAMA:

PLIPRU1: PROCEDURE OPTIONS (MAIN);
/* PROGRAMA QUE LEE DE SYSIN(GET EDIT)*/
/* Y ESCRIBE EN SYSPRINT (PUT EDIT) */
/*DEFINIMOS SYSIN*/
DCL SYSIN FILE STREAM INPUT;
/*DEFINIMOS SYSPRINT*/
DCL SYSPRINT FILE PRINT;
/*DECLARACION DE VARIABLES DEL PROGRAMA*/
DCL 1 TABLA_NOMBRES,
      2 NOMBRE(6) CHAR(20);
DCL 1 LINEA_SYSIN,
      2 NOMBRE_SYSIN1 CHAR(20),
      2 NOMBRE_SYSIN2 CHAR(20);
DCL CONT_NOMBRE DEC FIXED (2);
DCL FIN CHAR(1) INIT ('0');
/*CONTROL FIN SYSIN*/
ON ENDFILE(SYSIN) BEGIN;
   FIN = '1';
END;
/*PROCESO DEL PROGRAMA*/
GET FILE(SYSIN) EDIT(LINEA_SYSIN)(A(40));

CONT_NOMBRE = 1;

DO WHILE (FIN = '0');
   CALL MOVER_A_TABLA;

   GET FILE(SYSIN) EDIT(LINEA_SYSIN)(A(40));
END;

CALL PINTAR_NOMBRES;

/*PARRAFO QUE GUARDA LOS NOMBRES RECUPERADOS EN TABLA_NOMBRES*/
MOVER_A_TABLA: PROC;
NOMBRE(CONT_NOMBRE) = NOMBRE_SYSIN1;

CONT_NOMBRE = CONT_NOMBRE + 1;

NOMBRE(CONT_NOMBRE) = NOMBRE_SYSIN2;

CONT_NOMBRE = CONT_NOMBRE + 1;

END MOVER_A_TABLA;

/*PARRAFO QUE ESCRIBE EN EL SYSPRINT LOS NOMBRES DE LA SYSIN*/
PINTAR_NOMBRES: PROC;
CONT_NOMBRE = 1;

DO WHILE CONT_NOMBRE < 7 

   PUT EDIT('NOMBRE: ', NOMBRE(CONT_NOMBRE)) (SKIP,A,A); 

CONT_NOMBRE = CONT_NOMBRE + 1; 
END;

END PINTAR_NOMBRES; 
END PLIPRU1;


En el programa podemos ver las siguientes sentencias:
ON ENDFILE(SYSIN): controla el final de la SYSIN (como el fin fichero pero para la SYSIN).
GET FILE: lee del fichero STREAM SYSIN.
DO WHILE: es un bucle. Las instrucciones de dentro del bucle se harán MIENTRAS se cumpla la condición indicada.
CALL: llamada a párrafo
PUT EDIT: escribe en el fichero STREAM SYSPRINT.
SKIP: indica salto de línea.
END PLIPRU1: indica fin del programa.


Descripción del programa:
Al inicio, declararemos los ficheros y las variables que utilizaremos a lo largo del programa.
En el proceso principal, leemos el primer registro de la SYSIN y ponemos a 1 el contador CONT_NOMBRE y montamos un bucle para recuperar todos los registros.

En el párrafo MOVER_A_TABLA guardamos los 2 nombres recuperados de la SYSIN en diferentes filas de la tabla TABLA_NOMBRES. Para ello indicamos entre paréntesis el número de la fila donde se va a guardar. El máximo de filas de la tabla es 6 (es el número indicado entre paréntesis al lado del campo NOMBRE).

En el párrafo PINTAR_NOMBRES escribiremos en el SYSPRINT todos los nombres guardados en nuestra TABLA_NOMBRES.
Informamos el campo CONT_NOMBRE con un 1, pues vamos a utilizar los campos de la tabla interna:
Para utilizar un campo que pertenezca a una tabla interna, debemos acompañar el campo de un "índice" entre paréntesis. De tal forma que indiquemos a que fila de la tabla nos estamos refiriendo. Por ejemplo, NOMBRE(1) sería el primer nombre guardado (JOSE LOPEZ VAZQUEZ).
Como queremos displayar todas las filas de la tabla, haremos que el índice sea una variable que va aumentando.

A continuación montamos un bucle (DO WHILE) con la condición CONT_NOMBRE menor de 7, pues el máximo es 6. La primera vez CONT_NOMBRE valdrá 1, y necesitamos que el bucle se repita 6 veces:
CONT_NOMBRE = 1: NOMBRE(1) = JOSE LOPEZ VAZQUEZ
CONT_NOMBRE = 2: NOMBRE(2) = HUGO CASILLAS DIAZ
CONT_NOMBRE = 3: NOMBRE(3) = JAVIER CARBONERO
CONT_NOMBRE = 4: NOMBRE(4) = PACO GONZALEZ
CONT_NOMBRE = 5: NOMBRE(5) = JESUS IGLESIAS
CONT_NOMBRE = 6: NOMBRE(6) = RICARDO MONTES
CONT_NOMBRE = 7: salimos del bucle porque ya no se cumple CONT_NOMBRE menor que 7


NOTA: el índice de una tabla interna NUNCA puede ser cero, pues no existe la fila cero. Si no informásemos CONT_NOMBRE con 1, el PUT de NOMBRE(0) nos daría un estupendo OFFSET.

RESULTADO:
NOMBRE: JOSE LOPEZ VAZQUEZ
NOMBRE: HUGO CASILLAS DIAZ
NOMBRE: JAVIER CARBONERO
NOMBRE: PACO GONZALEZ
NOMBRE: JESUS IGLESIAS
NOMBRE: RICARDO MONTES


He de decir que no me ha dado tiempo a ejecutar este ejemplo, en cuanto tenga un rato lo pruebo y corrijo si es necesario.

lunes, 20 de junio de 2011

SORT vol.6: INREC.

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(opcional),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:

INREC

INREC FIELDS --> Toma los registros del fichero de entrada y los guarda formateados en el fichero de salida. A diferencia del OUTREC, el INREC modifica los registros de entrada antes de ordenarlos.

//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=...
  INREC FIELDS=(I,L,D(opcional))

I – Inicio. Posición donde empieza el campo.
L – Longitud máxima del campo.
D – Dato a incluir (opcional).

Hay diferentes formas y ejemplos de utilizar el INREC, no voy a explicarlas pues se realizan del mismo modo que en el OUTREC (Ir al artículo):

- FORMATEO DE FICHEROS - Seleccionar y alterar los campos de los registros del fichero de entrada.
– CONVERSIÓN DE DATOS - Permite cambiar el formato de los campos. Se realiza del siguiente modo:
- CHANGE – Cambiar datos - Sustituir datos del fichero por otros.
- CONDICIONES - IFTHEN. Incluir condiciones

NOTA:La forma de codificar es la misma que en el OUTREC pero poniendo INREC. Lo único que se ha de tener en cuenta es acordarse que va a realizar la operación antes de ordenar el/los fichero/s de entrada. En algunas operaciones hay que tener en cuenta esta situación porque el resultado puede variar.

Lo mejor de la semana: lunes 13 a domingo 19.

Buenos días a todos.
El tiempo pasa rápido y cada vez queda menos para la ansiada jornada de verano; lo que significa tener todas las tardes libres!! Playita, piscinita, río...
Mientras esperamos que llegue, veamos que tal ha ido la semana pasada:

  1. Sort vol.2: OUTREC.
  2. WORKING-STORAGE: definiendo variables.
  3. ICETOOL I: SPLICE; cruce de ficheros.
  4. CONSULTIRAS
  5. Sort vol.1: SORT, INCLUDE.
  6. Programas con DB2 III: COUNT, MAX y FOR UPDATE.
  7. JCL Básico V: IDCAMS, IEFBR14, IEBGENER.
  8. El mapa de Consultorio Cobol
  9. Sort vol.3: OUTFIL
  10. PROCEDURE DIVISION: proceso del programa.

Parece que OUTREC, WORKING y ICETOOL repiten top 3.
Al final la semana pasada se nos complicó y saldrá ésta el primer programa de ejemplo en PL/I. Hoy añadimos un artículo más a nuestra saga del SORT, el INREC.

Y hasta aquí el resumen de hoy. Buena semana a tod@s : )

jueves, 16 de junio de 2011

Zurich, apuesta por la calidad


El Centro de Excelencia (CoE) de Zurich Financial Services ubicado en Barcelona, que cuenta con el nivel 3 de certificación en CCMI y con la ISO 27001 de seguridad, es el responsable de prestar servicios de desarrollo, gestión y soporte a las aplicaciones que utilizan distintas entidades de este grupo asegurador que, con una plantilla de más de 60.000 empleados, tiene clientes en más de 170 países.

Como gran entidad, deben mantener el equilibro entre la flexibilidad que implica responder a las necesidades de cada país y las sinergias y el ahorro de costes que se derivan de la estandarización y la centralización.

Uno de los principales problemas a la hora de establecer una arquitectura de Calidad Interna Software residía en tener un nucleo común para todas las instalaciones en los distintos paises añadiendo en cada una de ellas las necesidades específicas que puedan surgir. Por ello, el reto exigía al CoE realizar un inventario para identificar los elementos comunes y los específicos. Para ello usaron la solución checKing AIM de Optimyth Software.

A lo largo de 2009 y 2010, el COE realizó el inventario de su aplicación Info2000, registrando un total de alrededor de 30.000 componentes incluyendo desde el back-end -basado en Cobol y DB2- hasta el middleware -Tuxedo- y un triple front-end, en el que conviven J2EE y servicios web.



Una vez que toda la plataforma estuvo inventariada en un único repositorio central, el CoE dio luz verde en 2010 al desarrollo de un proyecto de calidad para imprimir eficacia y control a una actividad que implica a un total de 24 entornos de desarrollo y contempla seis puestas de producción al año.

El análisis de la calidad del software tiene su base en la herramienta checKing QA y se ha estructurado en tres ejes: gobierno de reglas, reporting y procesos.

- Gobierno de reglas: aplicación de nuevas reglas que doten al sistema de cierta inteligencia inteligente y tenga capacidad para discriminar cambios que ya existían o si se trata de un elemento nuevo, introduciendo asimismo reglas clasificadas como violaciones que pueden suponer una penalización en caso de no cumplir con los requerimientos de calidad fijados. Este punto resulta fundamental en el trabajo del CoE con los proveedores externos.

- Reporting: facilitar la información sobre los procesos de desarrollo de la forma más adecuada al perfil de su consumidor (responsables de la gestión de proveedores, responsables de aplicaciones...)

- Procesos: soporte de los procesos organizativos y operativos permitiendo establecer procesos de calidad y automatizar la promoción automática del software por los diferentes estadios utilizando la herramienta Rational Clear Case de IBM.

Sin duda el CoE es un referente de apuesta por la calidad software en nuestro pais, esperemos que exista una tendencia al alza en este tipo de iniciativas.

Noticia en Computing.es

CONSULTIRAS 13: "Aumento de Sueldo"

A veces, cuando uno va a pedirle un aumento de sueldo a su jefe, hay que darle unas razones convincentes, unas razones por las que no te pueda decir que NO.

(Pinchad en la imagen para verla más grande)










miércoles, 15 de junio de 2011

El mapa de Consultorio Cobol

A modo de curiosidad, nos gustaría compartir con vosotros el mapa de visitas del Consultorio cobol.
Por raro que parezca, no sólo están los países de habla hispana, sino que hay un poco de todo. Algunos que directamente nos meten en el Google Translator. No está mal!

Vamos a ver primero el mapa del Consultorio Cobol en el mundo:


La lista de los 10 países que más nos visitan es:
  1. España
  2. México
  3. Argentina
  4. Estados Unidos
  5. Chile
  6. Perú
  7. Colombia
  8. India
  9. Venezuela
  10. Brasil

Y más en detalle el top 3 de países:

España


Top 10 ciudades para España:
  1. Madrid
  2. Vigo
  3. Ourense
  4. Salamanca
  5. Barcelona
  6. Alcobendas
  7. Málaga
  8. A Coruña
  9. Alicante
  10. Sevilla

México



Top 10 ciudades para México:
  1. Mexico D.F.
  2. Queretaro
  3. Toluca
  4. Monterrey
  5. Guadalajara
  6. Aguascalientes
  7. Poza Rica de Hidalgo
  8. Naucalpan
  9. Cuautitlan Izcalli
  10. León de Los Aldama

Argentina



Top 10 ciudades para Argentina:
  1. Buenos Aires
  2. Rosario
  3. Córdoba
  4. San Miguel de Tucumán
  5. Lomas de Zamora
  6. Morón
  7. Quilmes
  8. La Plata
  9. Avellaneda
  10. Santa Fe

Sólo queda decir: gracias por elegir Consultorio Cobol : )

lunes, 13 de junio de 2011

Ficheros en PL/I

Seguimos adentrándonos en el mundo del PL/I. En este artículo veremos los tipos de ficheros con los que se puede trabajar y como defenirlos. Los usos los iremos viendo en futuros ejemplos.

FICHEROS RECORD
Como vimos en artículos anteriores, un programa PL/I no tiene divisiones como el COBOL, por lo que podremos definir el fichero en cualquier punto del programa. Para poner orden, lo definiremos al principio del procedimiento principal.
Los ficheros de tipo RECORD deben declararse explícitamente.

PRUEBA1: PROCEDURE OPTIONS(MAIN);

DCL FICHERO1 FILE INPUT;


Donde FICHERO1 será el nombre lógico del fichero, que se corresponderá con el nombre que se le haya dado en el JOB.
FILE nos indica que se trata de un fichero.
INPUT es el atributo, y nos indica que se trata de un fichero de entrada. Otros posibles atributos son:
OUTPUT: fichero de salida.
UPDATE: fichero de entrada y salida (para modificaciones; DISP=MOD).
SEQUENTIAL: fichero secuencial.
DIRECT: acceso directo.
INDEXED: fichero indexado.
KEYED: para acceder al fichero se utilizarán claves.
ENVIROMENT: describe el conjunto de datos externos asociados al fichero (ej: ENV(VSAM)).
EXTERNAL: el fichero es un elemento externo al programa.
RECORD: fichero tipo record.


Apertura/Cierre
Forma explícita:
OPEN FILE (FICHERO1); / CLOSE FILE (FICHERO1);


Podemos añadir atributos a continuación del nombre, siempre que no se contradigan con lo declarado en la definición.

Forma implícita:
Si se ejecuta una instrucción de entrada/salida sin haber abierto el fichero con la sentencia OPEN, el sistema abrirá el fichero de forma implícita y se le asignarán los atributos que tenga en la declaración.
Si no hacemoe el CLOSE del fichero, el sistema lo cerrará al final de la ejecución.
OJO! En los ficheros de salida, importante hacer OPEN. Si por casuística no se escribe sobre ellos, el sistema intentará cerrarlos al final de la ejecución, y al no haberlos abierto previamente dará un error.

Lectura
Dependerá del tipo de acceso:
SEQUENTIAL(secuencial)
READ FILE (FICHERO1) INTO (REG_ENTRADA);


Donde REG_ENTRADA es la variable donde se guardará la información del registro.

DIRECT(directo)
READ FILE (FICHERO1) INTO (REG_ENTRADA) KEY(CLAVE);


Donde KEY indica que se accederá por clave, y CLAVE es una variable donde estará el valor de la clave por la que vamos a acceder.

Escritura
Dependerá del tipo de acceso.
SEQUENTIAL(secuencial)
WRITE FILE (FICHERO2) FROM (REG_SALIDA);


Donde REG_SALIDA es la variable que contiene la información que escribiremos en el fichero.

DIRECT(directo)
WRITE FILE (FICHERO2) FROM (REG_SALIDA) KEYFROM (CLAVE);


Donde KEYFROM indica que se accederá por clave, y la varriable CLAVE llevará el valor de la clave.

Modificación/Sobreescritura
Dependerá del tipo de acceso.
SEQUENTIAL(secuencial)
REWRITE FILE (FICHERO3) FROM (REG_ENTSAL);


Donde REWRITE indica sobreescritura.

DIRECT(directo)
REWRITE FILE (FICHERO3) FROM (REG_ENTSAL) KEY(CLAVE);


Borrado
Dependerá del tipo de acceso.
SEQUENTIAL(secuencial)
Todo borrado debe estar precedido por una operación de lectura.
DELETE FILE (FICHERO4);


Donde DELETE indica que debe borrarse el último registro leído del fichero especificado.

DIRECT(directo)
DELETE FILE (FICHERO4) KEY (CLAVE);


Donde DELETE indica que debe borrarse el registro del fichero y clave especificados.

FICHEROS STREAM
El acceso siempre es de tipo SEQUENTIAL(secuencial). Los datos se guardan como una cadena de caracteres.
Existen 3 tipos de declaración para estos ficheros:
1. Explícita.
DCL SYSIN FILE STREAM INPUT;
DCL SYSPRINT FILE PRINT;


Donde STREAM indica que el fichero se procesará por flujo de caracteres.
PRINT indica que el fichero es de tipo impresora.

Estos dos ejemplos se refieren a la SYSIN de un JOB y a la cola del SYSPRINT. En la SYSIN escribiremos los datos que va a leer el programa, y en ek SYSPRINT escribiremos datos de salida.
El resto de posibles atributos son los mismos que para los ficheros RECORD.

2. Implícita.
Si omitimos el nombre del fichero en una operación de lectura (READ), el sistema supondrá que se trata de un fichero STREAM INPUT (SYSIN). En caso de la escritura (WRITE) se asumirá STREAM OUTPUT (SYSPRINT).

3. Por defecto.
Si se realiza una operación de entrada/salida contra un fichero que no tenga atributos se considerará STREAM por defecto.

Apertura/Cierre
Es el mismo caso que para los ficheros RECORD.

Lectura
GET FILE (SYSIN) LIST/DATA/EDIT;


Donde GET indica orden de lectura.
SYSIN indica que se trata del fichero del sistema. Si no se indica nombre asume SYSIN.
LIST/DATA/EDIT: son las opciones de lectura que se pueden indicar.
LIST: requiere que los datos de entrada estén en formato dato1,...,datoN. Entre cada dato debe haber una coma o un espacio en blanco. Cada dato se leerá sobre la variable indicada.
SYSIN DD *
datos1 datos2 datos3
/*

GET FILE LIST(variable_1, variable_2, variable_3);


DATA: requiere que la entrada esté en el formato var_1 = dato_1. Entre und ato y la variable siguiente debe haber una coma o un espacio en blanco. Cada dato se copiará sobre su variable correspondiente.
SYSIN DD *
var1=datos1 var2=datos2 var3=datos3
/*

GET FILE DATA (variable_1,variable_2,variable_3);


EDIT: los datos están dispuestos igual que en la opción LIST, pero podemos añadir el formato en que los leemos.
SYSIN DD *
campo1 campo2 campo3
/*

GET FILE EDIT (variable1,variable2,variable3) (A,A,A);


Los formatos que se pueden indicar son:
SKIP(n): salta n líneas antes de leer.
COL(n): se posiciona en la columna n antes de leer.
A: datos alfanuméricos.
P'formato PIC': datos numéricos. Ej P'999'.
X(n): salta n posiciones antes de leer.

Vamos a fijarnos en la opción SKIP.
Pensad que estamos leyendo de la SYSIN, y con SKIP le estamos indicando que salte a la siguiente línea de la SYSIN:
SYSIN DD *
campo1
campo2
campo3
/*


Esto en COBOL no sería posible, pues la SYSIN tiene una única línea que se recupera mediante un ACCEPT.
Sin embargo en PL/I podemos introducir mucha más información a través de la SYSIN.

Escritura
PUT FILE (SYSPRINT) LIST/DATA/EDIT;


Donde PUT indica orden de escritura.
Si no se indica nombre del fichero el sistema asume SYSPRINT.
LIST/DATA/EDIT son las mismas opciones que para el GET, pero referido a los datos que vamos a escribir. En EDIT se ñade la opción de "PAGE" para hacer salto de página al escribir.

"Los PUT" en PL/I son el equivalente a los DISPLAYs en COBOL. Cuando necesitemos "displayar" alguna variable para controles de errores, buscar un fallo en el programa, etc. lo haremos con un PUT y la información saldrá en el SYSPRINT en lugar de salir en la SYSOUT.
Tanto para programa ONLINE como BATCH, podremos ver los "PUTs" en el SYSPRINT.


En próximos artículos veremos ejemplos concretos del uso de estos ficheros. Hasta entonces, cualquier duda preguntad sin problema : )

Lo mejor de la semana: lunes 06 a domingo 12.

Otro lunes más, volvemos para hacer recuento de lo que ha sido la semana pasada.

  1. Sort vol.2: OUTREC.
  2. WORKING-STORAGE: definiendo variables.
  3. ICETOOL I: SPLICE; cruce de ficheros.
  4. JCL Básico IV: Sentencia DD (Parte III).
  5. Esquema de un programa COBOL.
  6. Programas con DB2 III: COUNT, MAX y FOR UPDATE.
  7. Programas con DB2 I: SELECT, INSERT, UPDATE y DELETE.
  8. JCL Básico V: IDCAMS, IEFBR14, IEBGENER.
  9. Sort vol.1: SORT, INCLUDE.
  10. JCL Básico I: ¿Qué es JCL?

Esta semana retomamos el PL/I, que lo teníamos un poco abandonado. Tendremos ficheros y el primer ejemplo : )

Ánimos y buena semana!

viernes, 10 de junio de 2011

SIVER, cobol en alta velocidad

Renfe aborda una transformación TIC para la incorporación de nuevas funcionalidades en su plataforma tecnológica.

Un claro ejemplo de ello es el check-in basado en códigos bidimensionales en el nuevo sistema de Venta y Reserva de Billetes (SIVER).

El SIVER tiene un diseño modular y configura un ecosistema compuesto por 65 aplicaciones y servicios, que hacen uso de los mundos mainframe y Linux: IBM z/Os para el transaccional y Linux (Suse y Red Hat) para la presentación web. El desarrollo de la parte mainframe ha sido realizado en Cobol mientras que el de la parte web en J2EE.

El proyecto ha requerido más de 500.000 horas de desarrollo y se han generado más de 20 millones de líneas de código, con una inversión en desarrollo e infraestructuras de 29,7 millones.

La evolución de SIVER contempla básicamente tres líneas de trabajo:

- La primera línea de trabajo, adjudicada a Accenture, supone la ampliación de las funcionalidades de venta.

- La segunda línea de actuación, adjudicada también a Accenture, implica la reingeniería y convergencia del sistema.

- La dotación de herramientas a los gestores que intervienen en los procesos de reserva y venta constituye la tercera línea de trabajo en el SIVER, la cual se desarrolla en colaboración con Deloitte.

Otra compañía que colabora en el proyecto es Sogeti, que es responsable de la Oficina de Calidad y se encarga del seguimiento de todo el desarrollo del software hasta su paso en producción, mientras que Anova IT es responsable de la coordinación de todas las líneas de trabajo.


Noticia en Computing.es

jueves, 9 de junio de 2011

CONSULTIRAS 12: "Programa Único"

Un Programa para gobernarlos a todos, un Programa para encontrarlos,
un Programa para atraerlos a todos y atarlos en las tinieblas.
(Pinchad en la imagen para hacerla más grande)

miércoles, 8 de junio de 2011

Lo mejor de la semana: lunes 30 a domingo 05.

Saludos una semana más. Aquí tenéis lo mejor de la semana pasada:

  1. Sort vol.2: OUTREC.
  2. WORKING-STORAGE: definiendo variables.
  3. Programas con DB2 III: COUNT, MAX y FOR UPDATE.
  4. Ejemplo 3: leer de fichero y escribir en fichero.
  5. Cruce de 3 ficheros: cruce 1-1-1.
  6. ICETOOL(I): SPLICE; Cruce de ficheros.
  7. JCL Básico I: ¿Qué es JCL?
  8. Esquema de un programa cobol.
  9. Sort vol.1: SORT, INCLUDE.
  10. Programas con DB2 I: SELECT, INSERT, UPDATE y DELETE.

Hoy daremos por terminada la saga de "JCL Básico". Si veis que necesitáis que entremos en más detalle en alguna de las partes, dejad un comentario y lo ampliaremos.

Aprovechando que hemos cambiado de mes, vamos a ver como nos ha ido en el mes de mayo:

  1. Sort vol.2: OUTREC.
  2. WORKING-STORAGE: definiendo variables.
  3. Esquema de un programa cobol.
  4. ICETOOL(I): SPLICE; Cruce de ficheros.
  5. JCL Básico V: IDCAMS, IEFBR14, IEBGENER.
  6. Programas con DB2 III: COUNT, MAX y FOR UPDATE.
  7. CONSULTIRAS
  8. Sort vol.1: SORT, INCLUDE.
  9. Comandos TSO vol.1: Comandos del editor
  10. Programas con DB2 I: SELECT, INSERT, UPDATE y DELETE.

Y como estadísticas podemos decir que ha habido más de 4000 visitas y 11500 páginas vistas. No ha estado mal la verdad!
Gracias a todos y perdonad el retraso de esta semana^^

JCL Básico IV: Sentencia DD (Parte III)

Continuamos con el último apartado de la sentencia DD. Vamos a hablar de todos los posibles parámetros que se pueden indicar en una sentencia DD DSN.

DSN ó DSNAME
Sirve para indicar el nombre del fichero en donde vamos ha guardar la salida. Por ejemplo, un programa con dos ficheros de entrada y dos de salida quedaría del siguiente modo:

//PAS01 EXEC PGM=MIPROGRAMA
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//ENTRADA2 DD DSN=xxxx.nombre.fichero2,DISP=SHR
//SALIDA1 DD DSN=xxxx.nombre.fichero3,
// ...
//SALIDA2 DD DSN=xxxx.nombre.fichero4,
// ...

¿Qué nombre he de dar al fichero?

El nombre que des a un fichero es libre pero teniendo en cuenta las reglas obligatorias que marca el host y las reglas opcionales que te marque la arquitectura donde te encuentres.
Como las reglas de arquitectura van en función del entorno donde te encuentres voy a comentar las reglas del host:
- Nombres simples: Un único nombre de 8 posiciones alfanuméricas en donde el primer carácter alfabético ha de ser uno de los siguientes: @ $ #
- Nombres compuestos: Puede tener varios nombres simples separados por puntos siempre y cuando el total de posiciones(incluidos los puntos) no supere las 44 posiciones.
- Nombres de ficheros particionados: los explicaré más adelante
- Nombres de ficheros temporales: los explicaré más adelante
- Nombres de ficheros generacionales: los explicaré más adelante
- Nombres que referencian a ficheros anteriores:

Una opción es utilizar "DSN=NULLFILE" en vez de "DD DUMMY"

Estos dos ejemplo son lo mismo:

//PAS01 EXEC PGM=MIPROGRAMA
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//ENTRADA2 DD DSN=xxxx.nombre.fichero2,DISP=SHR
//SALIDA1 DD DSN=xxxx.nombre.fichero3,
// ...
//SALIDA2 DD DSN=NULLFILE

//PAS01 EXEC PGM=MIPROGRAMA
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//ENTRADA2 DD DSN=xxxx.nombre.fichero2,DISP=SHR
//SALIDA1 DD DSN=xxxx.nombre.fichero3,
// ...
//SALIDA2 DD DUMMY

DISP
Se usa para indicar la disposición del fichero. Tiene hasta 3 posibles subparámetros:

- El primero indica la disposición del fichero en el estado inicial. Este estado puede ser: NEW, OLD, SHR ó MOD.
- El segundo indica la disposición del fichero en caso de que la ejecución sea correcta. Este estado puede ser: DELETE,KEEP,PASS,CATLG,UNCATLG
- El tercero indica la disposición del fichero en caso de que la ejecución falle. Este estado puede ser DELETE,KEEP,CATLG,UNCATLG

Explico cada uno de ellos:

NEW - El fichero es de nueva creación.
OLD - El fichero existe y se abrirá para uso exlusivo del proceso que lo lance.
SHR - El fichero existe y será compartido con cualquier otro proceso que quiera usarlo.
MOD - Si el fichero existe se abrirá para uso exlusivo del proceso que lo lance. Se posicionará en el ultimo registro y comenzará a escribir a partir de ese último registro. Si el fichero no existe asume DISP=(NEW)

NOTA: Si no se codifica el primer subparámetro (,xxx,xxx) por defecto el sistema pone NEW

DELETE - Se elimina el fichero tras la ejecución.
Si (,DELETE,xxx) --> en caso de que el paso termine bien se borra el fichero
Si (,xxx,DELETE) --> en caso de error se borra el fichero
Si (,DELETE,DELETE) --> tanto si el paso termina bien como si no, en cualquier caso se borra el fichero

KEEP - El fichero se guarda al final del paso. El sistema no guarda la dirección del fichero y por ello deberemos referenciar todos los datos para recuperar la información del mismo
Si (,KEEP,xxx) --> en caso de que el paso termine bien se guarda
Si (,xxx,KEEP) --> en caso de error se guarda el fichero
Si (,KEEP,KEEP) --> tanto si el paso termina bien como si no, en cualquier caso se guarda el fichero

PASS - Permite utilizar el fichero solo durante la ejecución del jcl. Una vez terminada la ejecución el fichero se borra solo.

CATLG - Permite guardar el fichero una vez creado. Puedes utiliar el fichero una vez terminada la ejecución. Siguiendo con el ejemplo:
Si (,CATLG,xxx) --> en caso de que el paso termine bien se cataloga
Si (,xxx,CATLG) --> en caso de error se cataloga el fichero
Si (,CATLG,CATLG) --> tanto si el paso termina bien como si no, en cualquier caso se cataloga el fichero

UNCATLG - Se borra la dirección del catalogo del acceso a un fichero

NOTA: Los valores por defecto son:
Si no pones nada o pones DISP=(NEW) por defecto el sistema toma --> DISP=(NEW,DELETE,DELETE)
Si pones solo DISP=(OLD) el sistema toma por defecto DISP=(OLD,KEEP,KEEP)
Si pones solo DISP=(SHR) el sistema toma por defecto DISP=(SHR,KEEP,KEEP)

Como ejemplos de estas combinaciones pueden salir muchos, os lo dejo en vuestras manos. Simplemente es ir combinando los 3 subparámetros para obtener el resultado esperado.

UNIT
Sirve para especificar en que tipo de dispositivo queremos guardar el fichero:
UNIT=dispositivo

SYSALLDA - Dispositivo de acceso directo (Disco). Uso: UNIT=SYSALLDA
TAPE - Cinta. Uso: UNIT=TAPE
TA80 - Cartucho. Uso: UNIT=TA80
TA90 - Cartucho de alta densidad . Uso: UNIT=TA90

SPACE
Se utiliza para asignar el espacio necesario para catalogar un fichero. Consta de varios subparámetros:

SPACE=(unidad,(mem_primaria,mem_secundaria,num_bloq),RLSE,tipo_asig,ROUND)
Un ejemplo: SPACE=(CYL,(250,125),RLSE,,)

Unidad --> Lo primero en hacer es elegir la unidad de medida del espacio, teniendo en cuenta que:
- TRK: El espacio necesario se pide en pistas. PISTAS = (LONG.REGISTRO * NUM.REGISTROS) / 47474
- CYL: El espacio necesario se pide en cilindros.
Generalmente este se utiliza para cadenas de JCL que utiliza 15 pistas.
Ojo este prácticamente no libera pistas. CILINDROS = PISTAS / 15

Memoria primaria --> Cantidad de memoria que se estima que necesitará el fichero
Memoria secundaria --> cantidad a añadir en caso de sobrepasar la memoria primaria
Número de bloques --> Número de bloques del directorio. Este dato se obtiene mediante:
- FICHEROS PEQUEÑOS Y MEDIANOS.
BLOQUE = (15476 / LONG.REGISTRO) ENTERO * LONG.REGISTRO

- FICHEROS GRANDES.
BLOQUE = (23476 / LONG.REGISTRO) ENTERO * LONG.REGISTRO

RLSE --> Se encarga de liberar el espacio no ocupado tras crear el fichero
Tipo de Asignación:
-CONTIG. Pide que el espacio asignado para la petición primaria sea contiguo
-MXIG. Solicita la asignación del área mayor de espacio libre
-ALX. Solicita la asignación del área mayor de espacio libre no inferior a 5 áreas contiguas
ROUND --> Tiene sentido en espacio por bloques y efectúa el redondeo a número entero de cilindros.

DCB
Con el DCB se definen parámetros del fichero tales como la longitud fija o variable, el tipo de organización o el tipo de particionamiento. Su estructura es:

DCB=(RECFM=?,LRECL=?,BLKSIZE=?,DSORG=?,DEN=?)
Ejemplo: DCB=(RECFM=FB,LRECL=80,BLKSIZE=8000,DSORG=PS)

RECFM:
U-Indefinido
V-Longitud variable
VB-longitud variable bloqueado
F-Longitud fija
FB-Longitud fija bloqueada
FBA-Longitud fija bloqueda con caracteres ASA (para impresión)

LRECL --> Longitud del registro

BLKSIZE --> Longitud del bloqueo. Poner un número múltiplo del LRECL

DSORG --> Tipo de organización
PS-Secuancial
IS-Secuancial Indexado
DA-Organización directa
PO-Particionado

jueves, 2 de junio de 2011

CONSULTIRAS 11: "Cosas raras"

Como diría el niño del sexto sentido "en ocasiones me compila a la primera", pero al igual que en la película, esos seres extraños (aquí los llamamos "return codes = 0") no existen. Si algo sale bien a la primera, ya puedes ir revisando todo porque hay algo que no es normal...
(Pinchad en la imagen para hacerla más grande)

miércoles, 1 de junio de 2011

CONSULTIRAS: primero en Facebook

Buenos días a tod@s!
Como dice el título de la noticia, a partir de ahora, las consultiras estarán primero en Facebook.
Todos los seguidores del Consultorio Cobol en facebook, podrán ver la consultira semanal un día antes que el resto.
Hoy ya ha sido publicada la consultira que se verá mañana en el blog.

Rápido!! A hacerse seguidor!!

Seguir a Consultorio cobol en Facebook

Cruce de 3 ficheros: cruce 1-1-1

Continuando con la saga de los programas de cruce, puede darse el caso de que queramos comparar tres ficheros en lugar de dos.

El ejemplo que vamos a ver es el más simple, donde la clave no se repite en ninguno de los ficheros, es decir, se trata de un cruce 1-1-1.

En nuestro ejemplo, el archivo principal será el número 2.
Podéis escoger cualquiera de ellos, porque lo que buscamos es que la clave existe en los tres.

La base del proceso de cruce sería:

EVALUATE TRUE

   WHEN Clave1 = Clave2 = Clave3
   WHEN Clave1 < Clave2
   WHEN Clave3 < Clave2
   WHEN Clave1 > Clave2
   WHEN Clave3 > Clave2

END-EVALUATE


En cada uno de los "WHEN" escribiremos el código de lo que queramos hacer. Por ejemplo, cuando las 3 claves coincidan, escribiremos un registro en el fichero de salida.



Al inicio del programa leeremos el primer registro de cada fichero e informaremos los campos Clave1, Clave2 y Clave3:
Clave1 = 1; Clave2 = 1; Clave3 = 1.

Repetiremos el proceso hasta el final de alguno de los tres ficheros (pues si llegamos al final de alguno de los ficheros, las 3 claves ya no coincidirán):

PERFORM 3000-PROCESO
  UNTIL FIN-FICHERO1
     OR FIN-FICHERO2
     OR FIN-FICHERO3


a) Clave1 = Clave2 = Clave3:
Realizamos las funciones necesarias. En nuestro ejemplo, escribir en un fichero de salida.
Leemos el siguiente registro de cada uno de los ficheros.
Clave1 = 2; Clave2 = 3; Clave3 = 2.

b) Clave1 < Clave2:
Esto significa que la Clave1 no existe en los 3 ficheros. Leemos el siguiente registro del fichero 1 (el de menor clave).
Clave1 = 3; Clave2 = 3; Clave3 = 2.

c) Clave3 < Clave2:
Esto significa que la Clave3 no existe en los 3 ficheros. Leemos el siguiente registro del fichero 3 (el de menor clave).
Clave1 = 3; Clave2 = 3; Clave3 = 5.

d) Clave3 > Clave2:
Esto significa que la Clave2 no existe en los 3 ficheros. Leemos el siguiente registro del fichero 2 (el de menor clave).
Clave1 = 3; Clave2 = 5; Clave3 = 5.

e) Clave1 < Clave2:
Esto significa que la Clave1 no existe en los 3 ficheros. Leemos el siguiente registro del fichero 1 (el de menor clave).
Clave1 = 6; Clave2 = 5; Clave3 = 5.

f) Clave1 > Clave2:
Esto significa que la Clave2 no existe en los 3 ficheros. Leemos el siguiente registro del fichero 2 (el de menor clave).
Clave1 = 6; Clave2 = 6; clave3 = 5.

g) Clave3 < Clave2:
Esto significa que la Clave3 no existe en los 3 ficheros. Leemos el siguiente registro del fichero 3 (el de menor clave).
Clave1 = 6; Clave2 = 6; Clave3 = 6.


El proceso descrito se refiere al ejemplo del esquema "Curece 1-1-1 sencillo". Pero si os fijáis, lo importante al comparar las claves es leer siempre del fichero con menor clave, para ir posicionándonos correctamente sin dejar ninguna comparación por hacer.

Este ejemplo es MUY sencillo. Muchas veces cuando cruzamos 3 ficheros no buscamos los registros cuyas 3 claves coincidan, sino que puede ser que necesitemos los registros con Clave1 = Clave2 por un lado, y los registros con Clave3 = Clave2 por otro lado.

Aquí la cosa se complica (y ya no digamos si las claves se repiten n veces), porque ya no podemos hacer las lecturas en cada comparación, sino que tendremos que hacer las comparaciones necesarias en primer lugar, y las lecturas correspondientes al final del proceso.

Pero todo esto lo veremos en otro artículo : )