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.
Mostrando entradas con la etiqueta natural. Mostrar todas las entradas
Mostrando entradas con la etiqueta natural. Mostrar todas las entradas
domingo, 22 de marzo de 2020
miércoles, 9 de marzo de 2011
Natural/ADABAS para coboleros: parte II.
En esta segunda parte vamos a ver cómo acceder a la base de datos ADABAS.
La base de datos ADABAS es "no relacional" con ficheros en vez de tablas, registros en vez de filas y campos en vez de columnas.
Para entenderlo veremos un ejemplo de un programa natural que accede a una "tabla".
Fichero(tabla) EMPLEADOS:
11111JOSE MARTINEZ
33333LAURA VAZQUEZ
44444SUSANA LOPEZ
22222JAVIER GUTIERREZ
Donde el primer campo es el número de empleado y el segundo campo el nombre del empleado.
JCL:
//**************EJECUCION NATURAL*******************
//**************************************************
//PROG1 EXEC NATBAT
//CMPRINT DD SYSOUT=*
//CMSYNIN DD *
LOGON SYSEXBAT
EXECUTE PGMNAT2
FIN
//SYSIN DD *
11111
/*
Programa:
DEFINE DATA LOCAL
1 EMPLEADOS-VISTA VIEW OF EMPLEADOS
2 NUM-EMPLEADO (N5)
2 NOMBRE-EMPLEADO (A30)
1 #NUM-EMPL (N5)
END-DEFINE
INPUT #NUM-INPUT
READ EMPLEADOS-VISTA BY NUM-EMPLEADO = #NUM-INPUT
DISPLAY NUM-EMPLEADO 3X NOMBRE-EMPLEADO
END-READ
END
Donde:
EMPLEADOS-VISTA sería una vista del fichero EMPLEADOS, que podría tener más campos que los que nosotros mostramos en la LOCAL.
#NUM-EMPL es una cariable que recibimos de la SYSIN.
La sentencia READ recuperará todos los registros de la tabla que cumplan
NUM-EMPLEADO >= #NUM-IMPUT ordenados por NUM-EMPLEADO.
Si quisiésemos recuperar sólo el empleado con número = #NUM-INPUT tendríamos que codificarlo así:
READ EMPLEADOS-VISTA BY NUM-EMPLEADO FROM #NUM-INPUT THRU #NUM-INPUT
Utilizaremos el DISPLAY en lugar del WRITE para que quede más bonito :P y "3X" indica que deje 3 espacios en blanco entre cada columna.
Resultado para NUM-EMPLEADO = #NUM-INPUT:
NUM NOMBRE
EMPLEADO EMPLEADO
-------- --------------------
11111 JOSE MARTINEZ
22222 JAVIER GUTIERREZ
33333 LAURA VAZQUEZ
44444 SUSANA LOPEZ
Resultado para NUM-EMPLEADO FROM #NUM-INPUT THRU #NUM-INPUT:
NUM NOMBRE
EMPLEADO EMPLEADO
-------- --------------------
11111 JOSE MARTINEZ
Más ejemplos de accesos a base de datos.
READ(1) --> lee por "mayor o igual" y recupera sólo 1 registro; equivaldría a nuestro "fetch first row only".
Sentencia: READ(1) EMPLEADOS BY NUM-EMPLEADO = 30000
Resultado: 33333LAURA VAZQUEZ
READ --> lee por "mayor o igual" y recupera todos los registros; equivaldría a nuestro cursor.
Sentencia: READ EMPLEADOS BY NUM-EMPLADO = 30000
Resultado: 33333LAURA VAZQUEZ
44444SUSANA LOPEZ
FIND --> se utiliza cuando el campo que buscamos es clave primaria del fichero ADABAS. Lee por "igual".
Sentencia: FIND EMPLEADOS WITH NUM-EMPLEADO = 33333
Resultado: 33333LAURA VAZQUEZ
UPDATE --> actualiza un registro del fichero ADABAS.
INSERT --> inserta un registro en el fichero ADABAS.
DELETE --> borra un registro del fichero ADABAS.
Este es un ejemplo muy sencillo de acceso a base de datos con Natural/ADABAS, pero espero que sirva para que os hagáis una idea de cómo funciona.
Como en el ejemplo de la parte I, he probado el programa con la versión de Natural que ya teníamos, y una versión de ADABAS que se puede descargar de la página de Software AG.
Para la próxima vemos cómo utilizar ADABAS en un programa COBOL : )
La base de datos ADABAS es "no relacional" con ficheros en vez de tablas, registros en vez de filas y campos en vez de columnas.
Para entenderlo veremos un ejemplo de un programa natural que accede a una "tabla".
Fichero(tabla) EMPLEADOS:
11111JOSE MARTINEZ
33333LAURA VAZQUEZ
44444SUSANA LOPEZ
22222JAVIER GUTIERREZ
Donde el primer campo es el número de empleado y el segundo campo el nombre del empleado.
JCL:
//**************EJECUCION NATURAL*******************
//**************************************************
//PROG1 EXEC NATBAT
//CMPRINT DD SYSOUT=*
//CMSYNIN DD *
LOGON SYSEXBAT
EXECUTE PGMNAT2
FIN
//SYSIN DD *
11111
/*
Programa:
DEFINE DATA LOCAL
1 EMPLEADOS-VISTA VIEW OF EMPLEADOS
2 NUM-EMPLEADO (N5)
2 NOMBRE-EMPLEADO (A30)
1 #NUM-EMPL (N5)
END-DEFINE
INPUT #NUM-INPUT
READ EMPLEADOS-VISTA BY NUM-EMPLEADO = #NUM-INPUT
DISPLAY NUM-EMPLEADO 3X NOMBRE-EMPLEADO
END-READ
END
Donde:
EMPLEADOS-VISTA sería una vista del fichero EMPLEADOS, que podría tener más campos que los que nosotros mostramos en la LOCAL.
#NUM-EMPL es una cariable que recibimos de la SYSIN.
La sentencia READ recuperará todos los registros de la tabla que cumplan
NUM-EMPLEADO >= #NUM-IMPUT ordenados por NUM-EMPLEADO.
Si quisiésemos recuperar sólo el empleado con número = #NUM-INPUT tendríamos que codificarlo así:
READ EMPLEADOS-VISTA BY NUM-EMPLEADO FROM #NUM-INPUT THRU #NUM-INPUT
Utilizaremos el DISPLAY en lugar del WRITE para que quede más bonito :P y "3X" indica que deje 3 espacios en blanco entre cada columna.
Resultado para NUM-EMPLEADO = #NUM-INPUT:
NUM NOMBRE
EMPLEADO EMPLEADO
-------- --------------------
11111 JOSE MARTINEZ
22222 JAVIER GUTIERREZ
33333 LAURA VAZQUEZ
44444 SUSANA LOPEZ
Resultado para NUM-EMPLEADO FROM #NUM-INPUT THRU #NUM-INPUT:
NUM NOMBRE
EMPLEADO EMPLEADO
-------- --------------------
11111 JOSE MARTINEZ
Más ejemplos de accesos a base de datos.
READ(1) --> lee por "mayor o igual" y recupera sólo 1 registro; equivaldría a nuestro "fetch first row only".
Sentencia: READ(1) EMPLEADOS BY NUM-EMPLEADO = 30000
Resultado: 33333LAURA VAZQUEZ
READ --> lee por "mayor o igual" y recupera todos los registros; equivaldría a nuestro cursor.
Sentencia: READ EMPLEADOS BY NUM-EMPLADO = 30000
Resultado: 33333LAURA VAZQUEZ
44444SUSANA LOPEZ
FIND --> se utiliza cuando el campo que buscamos es clave primaria del fichero ADABAS. Lee por "igual".
Sentencia: FIND EMPLEADOS WITH NUM-EMPLEADO = 33333
Resultado: 33333LAURA VAZQUEZ
UPDATE --> actualiza un registro del fichero ADABAS.
INSERT --> inserta un registro en el fichero ADABAS.
DELETE --> borra un registro del fichero ADABAS.
Este es un ejemplo muy sencillo de acceso a base de datos con Natural/ADABAS, pero espero que sirva para que os hagáis una idea de cómo funciona.
Como en el ejemplo de la parte I, he probado el programa con la versión de Natural que ya teníamos, y una versión de ADABAS que se puede descargar de la página de Software AG.
Para la próxima vemos cómo utilizar ADABAS en un programa COBOL : )
miércoles, 23 de febrero de 2011
Natural/ADABAS para coboleros: parte I.
¿Qué es Natural? Es un lenguaje de programación de la empresa Software AG que también se utiliza en entornos mainframe. La base de datos que lo acompaña es ADABAS. Del mismo modo que Natural podría tener similitudes con COBOL, ADABAS no las tiene en absoluto con DB2.
Hoy día no tengo conocimiento de que quede algún banco en España que lo utilice, pues el único que conocí de primera mano lo estaba migrando a COBOL. Creo que telefónica todavía tenía una parte en Natural/ADABAS...
En este artículo nos haremos una idea de cómo codificar en Natural asociándolo a un programa COBOL. Tomaremos como ejemplo el "Ejemplo 1" del manual de COBOL para principiantes.
Vamos a construir un programa que recogerá datos de la SYSIN de un JCL, y displayará la inforamción contenida en él.
JCL:
//**************EJECUCION NATURAL*******************
//**************************************************
//PROG1 EXEC NATBAT
//CMPRINT DD SYSOUT=*
//CMSYNIN DD *
LOGON SYSEXBAT
EXECUTE PGMNAT1
FIN
//SYSIN DD *
JOSE LOPEZ VAZQUEZ %
HUGO CASILLAS DIAZ %
JAVIER CARBONERO %
PACO GONZALEZ
/*
Donde EXEC NATBAT indica que vamos a ejecutar un programa natural en modo batch(puede cambiar según instalación).
CMPRINT DD SYSOUT=* indica que la información "displayada" se quedará en la cola CMPRINT (no lo vamos a guardar en un fichero).
En CMSYNIN DD * hace logon a la librería e indicamos el programa q vamos a ejecutar (PGMNAT1).
En SYSIN incluimos la información que va a recibir el programa. El '%' indica que la información continúa en la siguiente línea.
Programa:
DEFINE DATA LOCAL
1 WI-INDICE(P4)
1 #WX-NOMBRE1(A20)
1 #WX-NOMBRE2(A20)
1 #WX-NOMBRE3(A20)
1 #WX-NOMBRE4(A20)
1 WX-TABLA-NOMBRES
2 WX-NOMBRE(A20/4)
END-DEFINE
INPUT #WX-NOMBRE1 #WX-NOMBRE2 #WX-NOMBRE3 #WX-NOMBRE4
MOVE #WX-NOMBRE1 TO WX-NOMBRE(1)
MOVE #WX-NOMBRE2 TO WX-NOMBRE(2)
MOVE #WX-NOMBRE3 TO WX-NOMBRE(3)
MOVE #WX-NOMBRE4 TO WX-NOMBRE(4)
FOR WI-INDICE = 1 TO 4
WRITE 'WX-NOMBRE:'WX-NOMBRE(WI-INDICE)
END
Donde el área "DEFINE DATA LOCAL" equivaldría a nuestra WORKING-STORAGE; ahí definiríamos las variables/copys que necesitásemos para el programa. En nuestro caso:
WI-INDICE: empaquetado(P) de 4 posiciones. Equivaldría a un 9(4) COMP-3. Los índices para bucles en natural deben ser siempre numéricos (N) o empaquetados (P).
#WX-NOMBRE1: alfanumérico (A) de 20. Equivaldría a nuestro PIC X(20). La almohadilla indica que es una variable que se recibe por INPUT.
WX-TABLA-NOMBRES: sería una tabla interna donde el campo WX-NOMBRE es un alfanumérico (A) de 20 y se repite 4 veces. Equivaldría a nuestro OCCURS 4 TIMES.
A continuación codificaríamos el "PROCESO" del programa. En nuestro caso:
INPUT: recoge los datos introducidos por SYSIN.
MOVE/TO: para informar variables existen otras opciones:
WX-NOMBRE(1) := #WX-NOMBRE1 ó
ASSIGN WX-NOMBRE(1) = #WX-NOMBRE1
FOR: es uno de los bucles de natural. Las sentencias se repetirán "PARA" WI-INDICE = 1, =2, =3 e =4.
WRITE: escribe en el CMPRINT, que equivaldría a nuestra SYSOUT. La sentencia WRITE equivaldría a nuestro DISPLAY. En natural también existe la sentencia DISPLAY. La diferencia con el WRITE está en que el DISPLAY da formato a los datos, crea columnas con cabeceras por ejemplo.
El resultado usando WRITE sería:
WX-NOMBRE: JOSE LOPEZ VAZQUEZ
WX-NOMBRE: HUGO CASILLAS DIAZ
WX-NOMBRE: JAVIER CARBONERO
WX-NOMBRE: PACO GONZALEZ
Y usando DISPLAY sería:
WX-NOMBRE:
--------------------
JOSE LOPEZ VAZQUEZ
HUGO CASILLAS DIAZ
JAVIER CARBONERO
PACO GONZALEZ
Esto es un ejemplo muuuy sencillo, lo he probado con la versión de demo que se puede descargar desde la página de Software AG. Eso sí, sólo el código que los JCLs no se puede.
Para la próxima veremos el ejemplo de acceso a ADABAS más sencillo, y así tener una idea de como funciona esta base de datos : )
Hoy día no tengo conocimiento de que quede algún banco en España que lo utilice, pues el único que conocí de primera mano lo estaba migrando a COBOL. Creo que telefónica todavía tenía una parte en Natural/ADABAS...
En este artículo nos haremos una idea de cómo codificar en Natural asociándolo a un programa COBOL. Tomaremos como ejemplo el "Ejemplo 1" del manual de COBOL para principiantes.
Vamos a construir un programa que recogerá datos de la SYSIN de un JCL, y displayará la inforamción contenida en él.
JCL:
//**************EJECUCION NATURAL*******************
//**************************************************
//PROG1 EXEC NATBAT
//CMPRINT DD SYSOUT=*
//CMSYNIN DD *
LOGON SYSEXBAT
EXECUTE PGMNAT1
FIN
//SYSIN DD *
JOSE LOPEZ VAZQUEZ %
HUGO CASILLAS DIAZ %
JAVIER CARBONERO %
PACO GONZALEZ
/*
Donde EXEC NATBAT indica que vamos a ejecutar un programa natural en modo batch(puede cambiar según instalación).
CMPRINT DD SYSOUT=* indica que la información "displayada" se quedará en la cola CMPRINT (no lo vamos a guardar en un fichero).
En CMSYNIN DD * hace logon a la librería e indicamos el programa q vamos a ejecutar (PGMNAT1).
En SYSIN incluimos la información que va a recibir el programa. El '%' indica que la información continúa en la siguiente línea.
Programa:
DEFINE DATA LOCAL
1 WI-INDICE(P4)
1 #WX-NOMBRE1(A20)
1 #WX-NOMBRE2(A20)
1 #WX-NOMBRE3(A20)
1 #WX-NOMBRE4(A20)
1 WX-TABLA-NOMBRES
2 WX-NOMBRE(A20/4)
END-DEFINE
INPUT #WX-NOMBRE1 #WX-NOMBRE2 #WX-NOMBRE3 #WX-NOMBRE4
MOVE #WX-NOMBRE1 TO WX-NOMBRE(1)
MOVE #WX-NOMBRE2 TO WX-NOMBRE(2)
MOVE #WX-NOMBRE3 TO WX-NOMBRE(3)
MOVE #WX-NOMBRE4 TO WX-NOMBRE(4)
FOR WI-INDICE = 1 TO 4
WRITE 'WX-NOMBRE:'WX-NOMBRE(WI-INDICE)
END
Donde el área "DEFINE DATA LOCAL" equivaldría a nuestra WORKING-STORAGE; ahí definiríamos las variables/copys que necesitásemos para el programa. En nuestro caso:
WI-INDICE: empaquetado(P) de 4 posiciones. Equivaldría a un 9(4) COMP-3. Los índices para bucles en natural deben ser siempre numéricos (N) o empaquetados (P).
#WX-NOMBRE1: alfanumérico (A) de 20. Equivaldría a nuestro PIC X(20). La almohadilla indica que es una variable que se recibe por INPUT.
WX-TABLA-NOMBRES: sería una tabla interna donde el campo WX-NOMBRE es un alfanumérico (A) de 20 y se repite 4 veces. Equivaldría a nuestro OCCURS 4 TIMES.
A continuación codificaríamos el "PROCESO" del programa. En nuestro caso:
INPUT: recoge los datos introducidos por SYSIN.
MOVE/TO: para informar variables existen otras opciones:
WX-NOMBRE(1) := #WX-NOMBRE1 ó
ASSIGN WX-NOMBRE(1) = #WX-NOMBRE1
FOR: es uno de los bucles de natural. Las sentencias se repetirán "PARA" WI-INDICE = 1, =2, =3 e =4.
WRITE: escribe en el CMPRINT, que equivaldría a nuestra SYSOUT. La sentencia WRITE equivaldría a nuestro DISPLAY. En natural también existe la sentencia DISPLAY. La diferencia con el WRITE está en que el DISPLAY da formato a los datos, crea columnas con cabeceras por ejemplo.
El resultado usando WRITE sería:
WX-NOMBRE: JOSE LOPEZ VAZQUEZ
WX-NOMBRE: HUGO CASILLAS DIAZ
WX-NOMBRE: JAVIER CARBONERO
WX-NOMBRE: PACO GONZALEZ
Y usando DISPLAY sería:
WX-NOMBRE:
--------------------
JOSE LOPEZ VAZQUEZ
HUGO CASILLAS DIAZ
JAVIER CARBONERO
PACO GONZALEZ
Esto es un ejemplo muuuy sencillo, lo he probado con la versión de demo que se puede descargar desde la página de Software AG. Eso sí, sólo el código que los JCLs no se puede.
Para la próxima veremos el ejemplo de acceso a ADABAS más sencillo, y así tener una idea de como funciona esta base de datos : )
Suscribirse a:
Comentarios (Atom)