jueves, 29 de septiembre de 2011

¿Muerte del TSO?

Compuware presentará a un nutrido grupo de grandes empresas españolas un nuevo y moderno entorno abierto para la gestión del desarrollo de aplicaciones en entorno mainframe, denominado Workbench. Según la empresa, ha llegado el momento de que las grandes organizaciones con mainframe aborden un cambio del interfaz que actualmente se usa para gestionar estos entornos (las denominadas “pantallas verdes”), a otro gráfico (GUI), que facilite el reto que tienen las empresas de relevar generacionalmente a los profesionales que hasta ahora han gestionado esta plataforma en las empresas.

Compuware dará a conocer este nuevo entorno, así como las ventajas asociadas a él, el próximo día cinco de octubre, a lo largo de una reunión a la que asistirán grandes empresas de un amplio espectro de sectores de la actividad económica, tales como BBVA, Bankia, Banco Popular, CECE, Infocaja, Gnesis, Generali, Mutua Madrileña, El Corte Inglés, Iberdrola, Telefónica, Coritel, Indra, Everis o Ibermática.

El nuevo entorno de trabajo (Workbench) es intuitivo y utiliza un interface gráfico de usuario (GUI), basado en Eclipse, un entorno común y desde el cual se inician todos los productos de Compuware, ofreciendo capacidades de gestión tanto en distribuido como en mainframe.

Sin conocer las características y ventajas de dicho entorno de trabajo, a un servidor le cuesta imaginarse picando programas cobol, lanzando jcls o accediendo a db2 sin el la querida pantalla negra y verde.

Noticia Computerworld

miércoles, 28 de septiembre de 2011

CONSULTIRAS 22: "Reseteo"

A veces a los ordenadores, se les resetea la fecha sin motivo alguno, esto origina ciertas situaciones un tanto extrañas...


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

martes, 27 de septiembre de 2011

Publicado "PGM=SORT: utilidades."

Buenos días a todos.
Como se indica en el título, ya está publicado el segundo libro del Consultorio Cobol, "PGM=SORT: utilidades", donde se recogen todos los artículos relacionados con el uso del programa SORT en JCL.

Está a la venta en la web de Lulu.com con el título "PGM=SORT: utilidades", y podéis adquirirlo por tan sólo 1,50€.

Una vez más se trata de un formato pdf para facilitar la búsqueda dentro de un mismo tema como es el SORT.




















Esperamos que os guste y, sobre todo, que os sea útil.

lunes, 26 de septiembre de 2011

COBOL/CICS vol.1: primer contacto.

En este artículo veremos en uso el programa COBOL/CICS más sencillo. Usaremos las sentencias CICS para enviar y recoger texto de la pantalla, pero sin formatear. Este programa será conversacional, es decir, el código se ejecutará de principio a fin sin devolver el control al CICS en ningún momento (salvo al finalizar la ejecución).
Cualquier sentencia CICS debe escribirse entre las etiquetas EXEC CICS y END-EXEC.

Se trata de un programa ONLINE, por lo que ya no hay que usar un JOB para ejecutarlo. Ahora necesitaremos una transacción CICS.

Dependiendo de vuestro sistema, habrá una u otra manera de dar de alta una nueva transacción CICS, que tenga asociado nuestro programa de pruebas. Incluso es probable que muchos de vosotros no tengáis permisos para poder darla de alta en vuestro trabajo.
Para aquellos que tengáis Hércules instalado en vuestro PC de casa, ahí va como generarla:

Transacción CEDA

La transacción CEDA es una transacción del sistema (como la CEMT) que nos permitirá definir nuestra transacción CICS. Una transacción a efectos prácticos, es un código de 4 dígitos que lleva asociado un programa (ya sea COBOL, PL/I, ensamblador...), de tal manera que si la consultamos desde CEMT I TRANS nos mostrará lo siguiente:



Para definirla entraremos en nuestra sesión de CICS y escribiremos CEDA. Nos mostrará la siguiente lista:


Aquí elegimos Define, pues vamos a definir algo nuevo:



Y aquí elegimos Transaction, pues vamos a definir una transacción:


Los campos que debemos rellenar son:
Transaction
Group
Description
Program

Una vez definida la transacción tendremos que hacer lo mismo para el programa:



Y rellenaremos los datos:
Program
Group
Description
Language

Terminada la definición, pasamos a la instalación:
CEDA INSTALL TRANS(ACCQ)
Se debe rellenar el campo Group.


CEDA INSTALL PROG(PGMCICS1)
Se debe rellenar el campo Group.


Hecho esto, ya podemos empezar a codificar nuestro programa.
Nota: Si tenéis algún problema dando de alta la transacción, dejad un comentario y lo vemos.

PROGRAMA:
Por tratarse de un programa COBOL/CICS, tendrá la misma estructura que un programa cobol normal, simplemente incluiremos algunas sentencias CICS en el código.

 IDENTIFICATION DIVISION.
 PROGRAM-ID. PGMCICS1.
 AUTHOR. CONSULTORIO COBOL.
*
*==========================================================*
* MI PRIMER PROGRAMA EN CICS *
* ENVIA UN SALUDO PERSONALIZADO *
*==========================================================*
*
 ENVIRONMENT DIVISION.
*
 CONFIGURATION SECTION.
*
 SPECIAL-NAMES.
    DECIMAL-POINT IS COMMA.
*
 DATA DIVISION.
*
 WORKING-STORAGE SECTION.
*
 01 WX-PREGUNTA-NOMBRE.
    05 WX-PN.
       10 FILLER    PIC X(20) VALUE 'INTRODUCE TU NOMBRE:'.
       10 FILLER    PIC X(10) VALUE '__________'.

 01 WX-RESPUESTA.
    05 WX-RES1.
       10 FILLER    PIC X(3).
       10 FILLER    PIC X(20).
       10 WX-NOMBRE PIC X(10).

 01 WX-SALUDO       PIC X(30).
 01 WX-HOLA         PIC X(5)  VALUE 'HOLA '.
 01 WX-RESTO-SALUDO PIC X(17) VALUE '! YO SOY EL CICS.'.
*
***********************************************************
 PROCEDURE DIVISION.
***********************************************************
*  | 0000 - PRINCIPAL
*--|------------------+----------><----------+-------------* 

* 1| EJECUTA EL INICIO DEL PROGRAMA 
* 2| EJECUTA EL PROCESO DEL PROGRAMA 
* 3| EJECUTA EL FINAL DEL PROGRAMA ************************************************************
 0000-PRINCIPAL. 

     PERFORM 1000-INICIO 
     PERFORM 2000-PROCESO 
     PERFORM 3000-FINAL 
     . 

************************************************************ 
*  | 10000 - INICIO 
*--|------------+----------><----------+-------------------* 
*  | SE REALIZA EL TRATAMIENTO DE INICIO: 
* 1| INICIALIZACIóN DE ÁREAS DE TRABAJO 
* 2| PRIMERA LECTURA DE SYSIN ************************************************************ 
 1000-INICIO.
*
     INITIALIZE WX-RESPUESTA 
                WX-SALUDO 
     . 

************************************************************ 
*  | 20000 - PROCESO 
*--|------------------+----------><------------------------* 
*  | SE REALIZA EL TRATAMIENTO DE LOS DATOS: 
* 1| REALIZA EL TRATAMIENTO DE CADA REGISTRO RECUPERADO DE 
*  | LA ENTRADA ************************************************************ 
 2000-PROCESO. 
*
     PERFORM 2100-PEDIR-DATOS 
     PERFORM 2200-ENVIA-SALUDO 
     . 

************************************************************ 
* 2100 PEDIR DATOS 
*--|------------------+----------><----------+-------------* 
* ENVIA UN MENSAJE A LA PANTALLA ************************************************************
 2100-PEDIR-DATOS. 
* POSICIONAMOS EL CURSOR EN LA POSICION 21 
     MOVE 21   TO EIBCPOSN 
*
* ENVIAMOS UN TEXTO A LA VENTANA 
     EXEC CICS SEND TEXT 
               FROM (WX-PREGUNTA-NOMBRE) 
               ERASE 
               CURSOR (EIBCPOSN) 
               LENGTH (LENGTH OF WX-PREGUNTA-NOMBRE) 
     END-EXEC 

* RECOGEMOS LA RESPUESTA EN WX-RESPUESTA 

     EXEC CICS RECEIVE 
               INTO (WX-RESPUESTA) 
               LENGTH (LENGTH OF WX-RESPUESTA) 
     END-EXEC 
     .
*
************************************************************ 
* 2200 ENVIAMOS SALUDO 
*--|------------------+----------><----------+-------------* 
* FORMATEA EL NOMBRE PARA QUITAR LOS GUIONES BAJOS 
* ENVIA EL SALUDO PERSONALIZADO A LA PANTALLA 
************************************************************ 
 2200-ENVIA-SALUDO. 

     INSPECT WX-NOMBRE REPLACING ALL '_' BY SPACES 

     STRING WX-HOLA DELIMITED BY SIZE 
            WX-NOMBRE DELIMITED BY SPACES 
            WX-RESTO-SALUDO DELIMITED BY SIZE 
       INTO WX-SALUDO 

     EXEC CICS SEND TEXT 
               FROM (WX-SALUDO) 
               ERASE LENGTH (LENGTH OF WX-SALUDO) 
     END-EXEC 
     . 

************************************************************ 
*  | 30000 - FINAL 
*--|------------------+----------><----------+-------------* 
*  | FINALIZA LA EJECUCION DEL PROGRAMA Y DEVUELVE EL 
*  | CONTROL AL CICS 
************************************************************ 
 3000-FINAL. 

     EXEC CICS RETURN 
     END-EXEC
     . 
*

En el programa podemos ver las siguientes divisiones/secciones:
IDENTIFICATION DIVISION: existirá siempre.
ENVIRONMENT DIVISION: existirá siempre.
  CONFIGURATION SECTION: existirá siempre.
  INPUT-OUTPUT SECTION: en este ejemplo no exisitrá porque no vamos a usar ficheros.
DATA DIVISION: existirá siempre.
  FILE SECTION: en este ejemplo no exisitrá porque no vamos a usar ficheros.
  WORKING-STORAGE SECTION: exisitirá siempre.
  En este caso NO exisistirá la LINKAGE SECTION pues se trata de un programa conversacional en el que el CICS inmobiliza áreas de memoria para guardar los datos intercambiados.
PROCEDURE DIVISION: exisitirá siempre.


En el programa podemos ver las siguientes sentencias:
PERFORM: llamada a párrafo
INITIALIZE: para inicializar variable
MOVE/TO: movemos la información de un campo a otro.
EXEC CICS/END-EXEC: Etiquetas entre las que se codifica una sentencia CICS
SEND TEXT: envía un mensaje de texto al CICS.
RECEIVE: recibe un mensaje de texto desde el CICS.
INSPECT/REPLACING: recorre todos los caracteres de una cadena sustituyendo el carácter indicado en "ALL" por el carácter indicado en "BY".
STRING/INTO: concatena los campos indicados en STRING y los guarda en la variable indicada en INTO. La explicación completa en PROCEDURE DIVISION: proceso del programa.
RETURN: Sentencia de finalización de ejecución. Devuelve el control al CICS.

Descripción del programa:
En el inicio del programa, inicializamos las variables de trabajo WX-RESPUESTA y WX-SALUDO.

En el proceso tenemos los siguientes párrafos:
2100-PEDIR-DATOS.
En este párrafo colocamos el cursor en la posición 21, posición donde empieza la línea para escribir el nombre, informando la variable EIBCPOSN con un 21.
Enviamos el mensaje WX-PREGUNTA-NOMBRE a la ventana con la instrucción SEND TEXT.
En "FROM" indicamos la variable que contiene el texto, en este caso WX-PREGUNTA-NOMBRE.
ERASE limpia la pantalla.
CURSOR posiciona el cursor en la posición indicada en EIBCPOSN.
En LENGTH indicamos la longitud del texto a enviar con "LENGTH OF".

Recogemos la información de la pantalla con la sentencia RECEIVE.
En "INTO" indicamos la variable donde guardaremos la información.
En LENGTH indicamos la longitud de la variable con "LENGTH OF".

2200-ENVIA-SALUDO.
En este párrafo formateamos el mensaje recibido:
INTRODUCE TU NOMBRE:TALLI______
En WX-NOMBRE tendremos el texto "TALLI______". La sentencia INSPECT WX-NOMBRE recorrerá todos los caracteres almacenados en WX-NOMBRE. La sentencia REPLACING ALL '_' BY SPACES sustiruitá todos los guiones bajos por espacios, quedándonos en WX-NOMBRE el texto "TALLI      ".

Con la sentencia STRING concatenaremos el texto "HOLA ", WX-NOMBRE, y "! YO SOY EL CICS." dentro de la variable WX-SALUDO. Con DELIMITED BY SPACES eliminamos los espacios sobrantes en WX-NOMBRE.

Ahora con un nuevo SEND TEXT enviamos WX-SALUDO a la pantalla.

En el párrafo de final codificamos la sentencia CICS RETURN que finaliza la ejecución y devuelve el control al CICS.

Nota para usuarios de Hércules: para que CICS coja la última compilación de nuestro programa (si hemos compilado más de una vez) debemos "refrescarla" desde CEMT:
CEMT SET PROG(PGMCICS1) NEW

RESULTADO:
Ejecutamos el programa escribiendo el código de la transacción y pulsando Intro:


Se muestra el mensaje:


Introducimos nuestro nombre y pulsamos Intro:


Se muestra el saludo:



Como veis esto es una chorrada de programa^^ pero hay que empezar por lo fácil.
En próximos artículos veremos como actualizar ficheros indexados desde un programa COBOL/CICS conversacional. Más adelante veremos el uso de mapas para dar formato a la ventana. Paciencia!

Como siempre, cualquier duda que tengáis... dejad un comentario : )

viernes, 23 de septiembre de 2011

Banco Sabadell implanta checKing QA

Banco Sabadell (BS) ha implantado la solución checKing QA de Optimyth con el objetivo de analizar el código de sus aplicativos COBOL y J2EE para conocer el estado de calidad previo a su paso a producción.

Las necesidades que BS tuvo en su momento provenían inicialmente del afán de mejora, y de los beneficios técnicos y económicos de evitar la puesta en producción de código erroneo o poco mantenible; así como a ciertas exigencias técnicas e información que solicitaba el Banco de España y del cambio de modelo operativo de desarrollo de Aplicaciones con la implantación de unas Factorías de Software y de Test que requiere un mayor control en la calidad de las entregas.

Ahora disponen de un medio para medir métricas e identificar incumplimientos normativos dentro de su código COBOL y J2EE. Al rechazar entregas de código que no cumplan con unos mínimos niveles de calidad, preservan el grado de rendimiento en producción de las aplicaciones, la seguridad y los costes de mantenimiento se mantienen o reducen con el tiempo.

Esta iniciativa se une a otras ya mencionadas en el Consultorio, como la de Zurich Financial.

Noticia Computing

miércoles, 21 de septiembre de 2011

CONSULTIRAS 21: "Desde tiempos inmemoriables"

Que el COBOL tiene más años que la hipoteca del Partenón, no es nada nuevo, pero el Consultorio, después de varias décadas de investigaciones, ha llegado a descubrir cosas impresionantes de este (¿cómo decirlo?) estupendo/magnifique/wunderbar lenguaje.



PD-Toda la culpa se la echaron a los becarios Juan, Marcos, Mateo y Lucas...

lunes, 19 de septiembre de 2011

Sort vol.7: OMIT.

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:

OMIT

Excluye 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
OMIT 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 NO cumplan lo siguiente: Sean AUTONOMOS y su número de teléfono sea un móvil (comience por 6), es decir, se excluirán del fichero de salida aquellos registros que SI cumplan esa condición:

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:

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


Fichero salida:

-----------------------------------------------------------------------
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO      983275586
FFFFFFFFFDCECCD4444DCDECDCE44CCDDCECDDCECDCDCCCD400001FFFFFFFFF44444444
00000000211595900004193955900319953596121319914600000C98327558600000000
-----------------------------------------------------------------------
000000006ANTONIO   VILLA     SUSO     AUTONOMO        918514535
FFFFFFFFFCDEDDCD444ECDDC44444EEED44444CEEDDDDD44400003FFFFFFFFF44444444
00000000615365960005933100000242600000143656460000000C91851453500000000
-----------------------------------------------------------------------
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO        988453548
FFFFFFFFFEDDCDCC444DDDCE44444CDDDED444CEEDDDDD44400001FFFFFFFFF44444444
00000000586315410003675900000136526000143656460000000C98845354800000000
-----------------------------------------------------------------------
000000003CARLOS    PEREZ     FANO     AUTONOMO        986115484
FFFFFFFFFCCDDDE4444DCDCE44444CCDD44444CEEDDDDD44400001FFFFFFFFF44444444
00000000331936200007595900000615600000143656460000000C98611548400000000



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 NO cumplan lo siguiente: Sean AUTONOMOS y su número de teléfono sea un móvil (comience por 6) , es decir, se excluirán del fichero de salida aquellos registros que SI cumplan esa condición. 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:

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


Resultado:

-----------------------------------------------------------------------
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO      q Íì%
FFFFFFFFFDCECCD4444DCDECDCE44CCDDCECDDCECDCDCCCD40000193756444444444444
00000000211595900004193955900319953596121319914600000C8258C000000000000
-----------------------------------------------------------------------
000000006ANTONIO   VILLA     SUSO     AUTONOMO        q Î %
FFFFFFFFFCDEDDCD444ECDDC44444EEED44444CEEDDDDD4440000393716444444444444
00000000615365960005933100000242600000143656460000000C8265C000000000000
-----------------------------------------------------------------------
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO        o ÍÌ
FFFFFFFFFEDDCDCC444DDDCE44444CDDDED444CEEDDDDD4440000193772444444444444
00000000586315410003675900000136526000143656460000000C6858C000000000000
-----------------------------------------------------------------------
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO        o ÍÌ
FFFFFFFFFEDDCDCC444DDDCE44444CDDDED444CEEDDDDD4440000193772444444444444
00000000586315410003675900000136526000143656460000000C6858C000000000000
-----------------------------------------------------------------------
000000003CARLOS    PEREZ     FANO     AUTONOMO        m nç%
FFFFFFFFFCCDDDE4444DCDCE44444CCDD44444CEEDDDDD4440000193946444444444444
00000000331936200007595900000615600000143656460000000C4558C000000000000


Como veis hemos utilizado los mismos ficheros de entrada que para el caso del INCLUDE. El resultado es que ahora obtenemos en el fichero de salida los registros que con el INCLUDE no se mostraban, es decir, justo lo contrario.

viernes, 16 de septiembre de 2011

Subscripciones por cortesía de SUSE

SUSE les proporciona a los clientes que ejecuten SUSE® Linux Enterprise Server para System z en IBM zEnterprise, subscripciones de cortesía para el nuevo zEnterprise Blade Center Extension (zBX) de IBM.

Esta Oferta de Derecho de Acceso al IBM zEnterprise Blade Center Extension (zBX) para SUSE® Linux Enterprise Server aplica tanto para las subscripciones activas como para las nuevas y existentes de SUSE Linux Enterprise Server for System z ejecutándose sobre zEnterprise 196 o la recientemente anunciada zEnterprise 114 de IBM.

Desde el año 2000, cuando SUSE Linux Enterprise Server se volvió la primera distribución de Linux empresarial comercialmente disponible para mainframes IBM System z, SUSE ha ofrecido soluciones para mainframe basadas en Linux, que pueden ser implementadas por los clientes de todas las industrias para expandir sus cargas de trabajo y aplicaciones críticas.

Noticia ciberespacio


miércoles, 14 de septiembre de 2011

CONSULTIRAS 20: "Tan pequeño..."

La informática (y la tecnología en general), avanza de forma increible, lo que hoy es ordenador último modelo, mañana está obsoleto. Y encima hacen ordenadores cada vez más pequeños...













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

lunes, 12 de septiembre de 2011

Ejemplo 5: programa con DB2

En este ejemplo vamos a ver un programa que accede a base de datos para recuperar información. Veremos un ejemplo sencillo en el que el programa recuperará de SYSIN la clave por la que accederá a la base de datos, y displayará la información recuperada por SYSOUT.

JCL:

//PASO01 EXEC PGM=IKJEFT01,DYNAMNBR=20
//SYSTSIN DD *
DSN SYSTEM(DSN1)
RUN PROGRAM(PRUEBA5) PLAN(PRUEBA5) -
LIB('LIBRERIA.DE.TU.INSTALACION')
//SYSOUT DD SYSOUT=*
//SYSIN DD *
PEREZ
/*


Donde EXEC PGM=IKJEFT01 ejecutará el programa que le indiquemos en el SYSTSIN.
El DSN SYSTEM dependerá de cada instalación y puede variar según el entorno (desarrollo, preproduccion, explotación...).
En PROGRAM indicaremos el programa con DB2 a ejecutar, y en PLAN el plan DB2 asociado.
La librería indicada en LIB es opcional.
En la SYSIN le pasaremos la clave por la que accederemos a la tabla. En este caso será el campo APELLIDO.

TABLA:

Nombre     Apellido   Telefono
CARMEN     PEREZ      666555444
JAVIER     LOPEZ      666999888
SARA       GARCIA     666222111


Donde:
El campo Nombre es un CHAR(10).
El campo Apellido es un CHAR(10).
El campo Telefono es un DECIMAL(9).

PROGRAMA:

 IDENTIFICATION DIVISION.
 PROGRAM-ID. PRUEBA5.
*==========================================================*
*     PROGRAMA QUE ACCEDE A BASE DE DATOS CON UNA SELECT
*==========================================================*
*
 ENVIRONMENT DIVISION.
*
 CONFIGURATION SECTION.
*
 SPECIAL-NAMES.
     DECIMAL-POINT IS COMMA.
*
 DATA DIVISION.
*
 WORKING-STORAGE SECTION.
*

 EXEC SQL
    INCLUDE SQLCA
 END-EXEC.

 EXEC SQL
    INCLUDE TABLA
 END-EXEC.

 01 WX-SYSIN.
    05 WX-CLAVE        PIC X(10).
    05 FILLER          PIC X(70).

 01 WX-TABLA.
    05 WX-NOMBRE       PIC X(10).
    05 WX-APELLIDO     PIC X(10).
    05 WX-TELEFONO     PIC S9(9) COMP-3.
 01 WX-VARIABLES.
    05 WX-TELEFONO-NUM PIC 9(9).
*
************************************************************
 PROCEDURE DIVISION.
************************************************************
*  |     00000 - PRINCIPAL
*--|------------------+----------><----------+-------------*
* 1| EJECUTA EL INICIO DEL PROGRAMA
* 2| EJECUTA EL PROCESO DEL PROGRAMA
* 3| EJECUTA EL FINAL DEL PROGRAMA
************************************************************
 00000-PRINCIPAL.
*
     PERFORM 10000-INICIO
*
     PERFORM 20000-PROCESO
*
     PERFORM 30000-FINAL
     .
************************************************************
*  |     10000 - INICIO
*--|------------+----------><----------+-------------------*
*  | SE REALIZA EL TRATAMIENTO DE INICIO:
* 1| Inicialización de Áreas de Trabajo
* 2| Lectura de SYSIN
************************************************************
 10000-INICIO.
*
     INITIALIZE WX-SYSIN

                WX-TABLA
                WX-VARIABLES

     ACCEPT WX-SYSIN FROM SYSIN

     .
************************************************************
*  |     20000 - PROCESO
*--|------------------+----------><------------------------*
*  | SE REALIZA EL TRATAMIENTO DE LOS DATOS:
* 1| Realiza el acceso a base de datos
************************************************************
 20000-PROCESO.
*

     EXEC SQL
        SELECT NOMBRE
              ,TELEFONO
          INTO :WX-NOMBRE
              ,:WX-TELEFONO 
          FROM TABLA
         WHERE APELLIDO = :WX-CLAVE
         ORDER BY APELLIDO
     END-EXEC

     EVALUATE TRUE
        WHEN SQLCODE EQUAL ZEROES
             DISPLAY 'TODO VA BIEN'

             PERFORM 21000-GRABAR-SALIDA

        WHEN SQLCODE EQUAL +100
             DISPLAY 'NO ENCONTRE NADA'


        WHEN OTHER
             DISPLAY 'ALGO HA IDO MAL. EL SQLCODE ES: 'SQLCODE
             PERFORM 30000-FINAL
     END-EVALUATE
    

     .

*************************************************************
*  |     21000 - GRABAR - SALIDA
*--|------------------+----------><----------+--------------*
*  | ESCRIBE EN SYSOUT LA INFORMACIÓN RECUPERADA DE LA TABLA
*************************************************************
  21000-GRABAR-SALIDA.
*

     MOVE WX-TELEFONO TO WX-TELEFONO-NUM
     MOVE WX-CLAVE    TO WX-APELLIDO

     DISPLAY 'NOMBRE  :'WX-NOMBRE

     DISPLAY 'APELLIDO:'WX-APELLIDO
     DISPLAY 'TELEFONO:'WX-TELEFONO-NUM

     .

************************************************************
*  |     30000 - FINAL
*--|------------------+----------><----------+-------------*
*  | FINALIZA LA EJECUCION DEL PROGRAMA
************************************************************
 30000-FINAL.
*
     STOP RUN
     .


En el programa podemos ver las siguientes divisiones/secciones:
IDENTIFICATION DIVISION: existirá siempre.
ENVIRONMENT DIVISION: existirá siempre.
CONFIGURATION SECTION: existirá siempre.
En este caso no existirá la INPUT-OUTPUT SECTION, pues nuestro programa no utiliza ficheros.
DATA DIVISION: existirá siempre.
En este caso no existirá la FILE SECTION, pues nuestro programa no utiliza ficheros.
WORKING-STORAGE SECTION: exisitirá siempre.
En este caso no exisistirá la LINKAGE SECTION pues el programa no se comunica con otros programas.
PROCEDURE DIVISION: exisitirá siempre.


En el programa podemos ver las siguientes sentencias:
PERFORM: llamada a párrafo
INITIALIZE: para inicializar variable
ACCEPT: esta sentencia recoge la información del campo indicado en el "FROM". En este caso recoge la información almacenada en "SYSIN"; la que nosotros hemos introducido en el JCL.
EXEC SQL/END-EXEC: son las etiquetas para incluir código SQL. Todas las sentencias DB2 se deben incluir entre estas etiquetas.
EVALUATE TRUE: Valida que se cumplan las condiciones indicadas en cada uno de los "WHEN".
MOVE/TO: movemos la información de un campo a otro
DISPLAY: escribe el contenido del campo indicado en la SYSOUT del JCL.
STOP RUN: sentencia de finalización de ejecución.


Descripción del programa:
En la WORKING-STORAGE hemos incluido la copy SQLCA (SQL communications area ó área de comunicación SQL), que es la que utiliza el gestor de base de datos para devolver la información de errores. La estructura es la siguiente:

01 SQLCA SYNC.
   05 SQLCAID PIC X(8) VALUE "SQLCA ".
   05 SQLCABC PIC S9(9) COMP-5 VALUE 136.
   05 SQLCODE PIC S9(9) COMP-5.
   05 SQLERRM.
   05 SQLERRP PIC X(8).
   05 SQLERRD OCCURS 6 TIMES PIC S9(9) COMP-5.
   05 SQLWARN.
      10 SQLWARN0 PIC X.
      10 SQLWARN1 PIC X.
      10 SQLWARN2 PIC X.
      10 SQLWARN3 PIC X.
      10 SQLWARN4 PIC X.
      10 SQLWARN5 PIC X.
      10 SQLWARN6 PIC X.
      10 SQLWARN7 PIC X.
      10 SQLWARN8 PIC X.
      10 SQLWARN9 PIC X.
      10 SQLWARNA PIC X.
   05 SQLSTATE PIC X(5).
*


Como veis incluye la variable SQLCODE, donde guardará el código de retorno que nos indicará si la consulta ha ido bien o no.
Hemos incluido también la DCLGEN de la tabla "TABLA" que contendrá los campos DB2 de la tabla (los que codificamos en la parte de la SELECT) y sus campos working y que tendrá algo de este estilo:

EXEC SQL  DECLARE TABLA TABLE
     (NOMBRE        CHAR(10)           NOT NULL,
      APELLIDO      CHAR(10)           NOT NULL,
      TELEFONO      DECIMAL(9)         NOT NULL)
END-EXEC.

01  DCLTABLA.
     10 TAB-NOMBRE        PIC X(10).
     10 TAB-APELLIDO      PIC X(10).
     10 TAB-TELEFONO      PIC S9(9) COMP-3.

En el párrafo de inicio, inicializamos todas las variables de trabajo definidas en la WORKING-STORAGE, y realizamos un ACCEPT para recoger la información que hemos puesto en la SYSIN. En nuestro caso se trata del campo clave por el que accederemos a nuestra tabla.

En el párrafo de proceso, hacemos una SELECT a la tabla con la condición APELLIDO = :WX-CLAVE. Donde WX-CLAVE contiene el apellido recogido por SYSIN. Comprobamos el SQLCODE que nos devuelve esta consulta:
Si el SQLCODE es cero, la consulta ha ido bien y se ha encontrado el apellido contenido en WX-CLAVE en nuestra tabla. En nuestro caso dará este SQLCODE, pues "PEREZ" está en la tabla.
Si el SQLCODE es 100, la consulta ha ido bien pero no ha encontrado el apellido "PEREZ" en nuestra tabla.
Si el SQLCODE es cualquier otro, la consulta ha ido mal y habrá que comprobar en la tabla de errores DB2 cuál ha sido el problema.

NOTA: el tema de la puntuación en sentencias SQL (es decir, poner o no poner un punto '.' al final de una sentencia DB2 dentro de la PROCEDURE DIVISION) dependerá de la versión del compilador.

En el párrafo de GRABAR-SALIDA, movemos el campo WX-TELEFONO a una variable numérica sin comprimir (WX-TELEFONO-NUM), para que al hacer el DISPLAY se vea correctamente. Luego displayamos los campos recuperados de la consulta.


RESULTADO:

NOMBRE  : CARMEN
APELLIDO: PEREZ
TELEFONO: 666555444


Si queréis probar este ejemplo, tendréis que hacer una sentencia SELECT a una tabla que exista en vuestra base de datos^^

viernes, 9 de septiembre de 2011

Cintas virtuales para mainframe

EMC ha anunciado su nueva biblioteca de cintas virtuales (VTL) para mainframe bajo el sistema DLm6000 que integra un sistema de almacenamiento basado en disco capaz de virtualizar los procesos tradicionales de copias de seguridad en soporte de cinta.

El resultado es que permite duplicar la velocidad de archivado de la información con respecto a las soluciones de sus competidores al permitir tasas de 2 GB/s, tal y como asegura la compañía. Además, reduce la dependencia de las cintas en la plataforma mainframe gracias al uso de arrays de discos duros. La solución incorpora capacidades de deduplicación de los datos, por lo que tan sólo se guardará una instancia de la información, desechándose la que se encuentre duplicada.

Se ha diseñado para su uso en entornos IBM z/OS y permite ajustar las diferentes cargas de trabajo al tipo de almacenamiento más adecuado. El EMC DLm6000 está disponible a partir de este mismo mes de septiembre.


Noticia eweekeurope

jueves, 8 de septiembre de 2011

CONSULTIRAS 19: "Carnicerías... "

Las Consultoras TIC, también llamadas Cárnicas, tienen su peculiar forma de conseguir empleados....

















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

miércoles, 7 de septiembre de 2011

Los libros de Consultorio Cobol

Bienvenidos a todos!
Las vacaciones de verano ya se han terminado, y en el Consultorio Cobol volvemos al trabajo.
En esta ocasión os traemos "Los libros del Consultorio Cobol", que consistirán en una recopilación de artículos de un determinado tema, en formato pdf. De esta forma tendréis toda la información en un sólo archivo, y podréis hacer búsquedas fácilmente.

Los libros los publicaremos a través de la web Lulu.com y podrán adquirirse por la módica cantidad de 1,50€. ¿Por qué esa cantidad y no gratis? Pues sobre todo para que los interesados nos echen una mano en mantener esto. No sólo nos servirá para pagar el dominio y el hosting, sino que también nos dará ánimos para seguir adelante : )

Hemos empezado publicando el libro "JCL Básico. Introducción al mundo del JCL o cómo hacer copy/paste con “sentidiño”." que ya tenéis disponible:



Esperamos que os guste y, sobre todo, que os sea útil.

Próximos lanzamientos: PGM=SORT: utilidades.

lunes, 5 de septiembre de 2011

Sort vol.2.2: OUTREC. Máscaras de edición

FICHERO DE ENTRADA

Supongamos que tenemos este fichero, en el que tenemos los siguientes campos sin formatear:

- una fecha (posiciones del 5 al 10)
- una hora (del 20 al 25)
- importe 1 comprimido (del 26 al 31)
- importe 2 (del 32 al 35)
- importe 3 (del 36 al 45)
- importe 4 (del 46 al final)


----+----1----+----2----+----3----+----4----+----5----+
***************************** Top of Data *************
0001100811MARIA    143010      011100001111110000111111
FFFFFFFFFFDCDCC4444FFFFFF000001FFFFFFFFFFFFFFFFFFFFFFFF
000110081141991000014301000000C011100001111110000111111
-------------------------------------------------------
0002230411VICTOR   153523      022200002222220000222222
FFFFFFFFFFECCEDD444FFFFFF000002FFFFFFFFFFFFFFFFFFFFFFFF
000223041159336900015352300000C022200002222220000222222
-------------------------------------------------------
0003150811MARIANO  164022      033300003333330000333333
FFFFFFFFFFDCDCCDD44FFFFFF000003FFFFFFFFFFFFFFFFFFFFFFFF
000315081141991560016402200000C033300003333330000333333
-------------------------------------------------------
0004251211LUCIA    174515     <044400004444440000444444
FFFFFFFFFFDECCC4444FFFFFF000004FFFFFFFFFFFFFFFFFFFFFFFF
000425121134391000017451500000C044400004444440000444444



Con este ejemplo vamos a aprender a dar el formato que queramos a cada uno de estos campos. Para ello utilizaremos un OUTREC, en donde vamos a tener este fichero de entrada y otro de salida donde saldrán los campos formateados. En este OUTREC vamos a aplicar las MASCARAS. Las máscaras simplemente son herramientas que nos van a permitir modificar el formato de los campos seleccionados con el OUTREC:


//PASO040 EXEC SORTD,OUT=*
//SYSOUT  DD SYSOUT=*
//SORTIN  DD DSN=fichero_de_entrada,DISP=SHR
//SORTOUT DD DSN=fichero_de_salida,
//           DISP=(,CATLG),
//           SPACE=(CYL,(150,75),RLSE)
//SYSIN DD *
SORT FIELDS=COPY
OUTREC FIELDS=(01,04,
               05,06,ZD,M9,LENGTH=8,
               11,09,
               20,06,ZD,M8,LENGTH=8,
               26,06,PD,
               32,04,ZD,M18,LENGTH=4,
               36,10,ZD,M4,LENGTH=11,
               46,10,ZD,M26,LENGTH=11)



En el fichero_de_salida obtendremos como RESULTADO:

----+----1----+----2----+----3----+----4----+----5----+----6----+--
***************************** Top of Data *************************
000110/08/11MARIA    14:30:10     11.11  +1,111.11+0000111111
000223/04/11VICTOR   15:35:23     22.22  +2,222.22+0000222222
000315/08/11MARIANO  16:40:22     33.33  +3,333.33+0000333333
000425/12/11LUCIA    17:45:15     44.44  +4,444.44+0000444444


Por ejemplo, en el primer caso (01,04), simplemente hemos seleccionado el campo pero no hemos aplicado ninguna máscara.
Sin embargo, en el segundo (05,06,ZD,M9,LENGTH=8), hemos seleccionado el campo 'fecha' que ocupa 6 posiciones(DDMMAA) y la hemos aplicado el código de máscara M9 que lo que hace es meter una '/' entre medias formateando el campo a DD/MM/AA.

Para el campo 'hora' hemos hecho lo mismo pero aplicando el código M8, que convierte un formato HHMMSS en HH:MM:SS.
Para los importes también hemos aplicado otros códigos, por ejemplo el M4 que pone a una cantidad un signo(+ o -), una coma para separar los miles y un punto para separar los decimales.

Existe una tabla donde están reflajados los códigos de conversión de las máscaras. Os dejo la que tengo para descargar, si encontráis más códigos de conversión por favor indicarlos.

Lista de códigos de conversión de las máscaras

Tengo entendido que puedes formar tus propias máscaras a partir de estos valores, y así no utilizar los códigos de conversión. De ese modo es más libre y cada uno puede formatear según le interese. Cuando sepa como se hace lo indico, estoy en ello...


MÁS UTILIDADES DE LAS MÁSCARAS.

El ejemplo anterior nos permite dar un formato más leíble a nuestros ficheros, pero además si tu host lo permite, podemos exportar este fichero fuera del host, y visualizarlo en una hoja de cálculo. Para ello, podemos preparar el fichero para abrirlo por ejemplo con el Excel. Solo tenemos que poner un ';' entre cada campo del siguiente modo:

//PASO040 EXEC SORTD,OUT=*
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=LAET.LAEHISTA.CCOBOL,DISP=SHR
//SORTOUT DD DSN=LAET.MASCARA.SALIDA,
// DISP=(,CATLG),
// SPACE=(CYL,(150,75),RLSE)
//SYSIN DD * 

SORT FIELDS=COPY
OUTREC FIELDS=(01,04,C';',
               05,06,ZD,M9,LENGTH=8,C';',
               11,09,C';',
               20,06,ZD,M8,LENGTH=8,C';',
               26,06,PD,C';',
               32,04,ZD,M18,LENGTH=4,C';',
               36,10,ZD,M4,LENGTH=11,C';',
               46,10,ZD,M26,LENGTH=11)



RESULTADO:

----+----1----+----2----+----3----+----4----+----5----+----6----+----7----
***************************** Top of Data ********************************
0001;10/08/11;MARIA    ;14:30:10;    1;1.11;  +1,111.11;+0000111111
0002;23/04/11;VICTOR   ;15:35:23;    2;2.22;  +2,222.22;+0000222222
0003;15/08/11;MARIANO  ;16:40:22;    3;3.33;  +3,333.33;+0000333333
0004;25/12/11;LUCIA    ;17:45:15;    4;4.44;  +4,444.44;+0000444444


Ahora solo hay que exportar el fichero host a un archivo excel poniendo al archivo la extensión .CSV (por ejemplo: "ejemplo_mascaras.csv").
De este modo el excel utiliza los ';' para separar los campos en celdas y que cada campo quede organizado en su correspondiente columna. Si has seguido el ejemplo te ha de quedar de este modo:


jueves, 1 de septiembre de 2011

CONSULTIRAS 18: "De vueltas de vacaciones"

¡Hola corazones!

El Consultorio está de vuelta, ¿nos echasteis de menos?

Al volver de vacaciones, mucha gente se encuentra su casa/hogar/leonera/mazmorra destrozada, han entrado y os han desvalijado todo... o casi todo, que aún quedan "hackers presenciales" (lo que vienen siendo, informáticos que roban, que la cosa está muy mala y de algo tenemos que vivir los frikis...) que más que robar, desmoralizan....


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