Desarrollando en Cobol y Natural sobre Plataforma Mainframe

jueves, 26 de marzo de 2015

Sentencia SQL SELECT COUNT GROUP BY para DB2

En numerosas ocasiones estamos trabajando con una determinada tabla DB2 y, en un momento dado, nos surge la necesidad de conocer cuántos registros hay para los diferentes valores existentes en un determinado campo. Hoy vamos a hablar de una cláusula que nos soluciona los problemas de este tipo.

El comando COUNT(*) es un tipo de cláusula SQL mediante la que podemos obtener, en cualquier objeto Cobol, el número de registros que hay almacenados para cada uno de los posibles valores que puede tomar un campo determinado de una tabla DB2.

Supongamos que, en nuestro programa Cobol, estamos trabajando con un fichero de Pedidos (PEDI), donde tenemos almacenado registros en los que se especifica un código interno de Provincia y un código de Pedido (entre otras cosas). Imaginemos que necesitamos saber cuántos pedidos, cuyo código comience por '5', hay almacenados para cada provincia.



Aunque en Universocobol.com sabemos que existen muchas posibilidades para implementar una solución, una query SQL que podría dar respuesta a nuestra necesidad sería la siguiente.

SELECT CO_PROVINCIA, COUNT(*) AS CANTIDAD
FROM JJPEDIT0                                     
WHERE CO_PROVINCIA BETWEEN 500000 AND 599999         
GROUP BY CO_PROVINCIA;                                             

Una vez vista la query a nivel general, a continuación vamos a detallar un poco más su contenido. La información especificada es la siguiente.

1º) GROUP BY: En la última línea indicamos el campo por el que deseamos que se agrupe la información de la tabla, en este caso, CO_PROVINCIA. Esto nos permitirá, posteriormente, indicar que queremos realizar un recuento de los registros existentes para cada provincia.

2º) WHERE: aquí simplemente estamos indicando que queremos recuperar los pedidos cuyo código se encuentre entre 500000 y 599999 (los que comiencen por '5').

3º) SELECT: En la primera línea tenemos que especificar el campo por el que hemos agrupado la información (CO_PROVINCIA). A continuación, incluimos la cláusula COUNT(*), con la que estamos indicando que queremos recuperar también la cantidad de registros que hay almacenados para cada uno de los diferentes valores existentes en el campo CO_PROVINCIA.

Una vez codificado todo lo anterior, podríamos lanzar la sentencia SELECT de SQL. La ejecución de la query anterior daría el resultado siguiente.



Como se puede apreciar, en la salida se están mostrando todos los códigos de CO_PROVINCIA que comienzan por '5' (en realidad, en la tabla DB2 hay más, pero aquí sólo incluimos los primeros) y, junto a ellos, una columna en la que se muestra el número de registros existentes en la tabla para cada uno de dichos códigos de provincia (según el recuento realizado por COUNT). Básicamente, esta era la información que estábamos buscando.

Eso es todo. Esperamos que lo comentado en el post sea suficiente para aclararos el funcionamiento de la cláusula COUNT(*). Si os queda alguna duda, preguntadnos lo que queráis y trataremos de responderos lo antes posible.

Saludos.

jueves, 19 de marzo de 2015

Tipos de Error DB2 -900 sqlcode

A continuación mostramos una lista de los posibles tipos de error DB2 -900 sqlcode que podemos encontrar al intentar lanzar nuestro programa Cobol CICS DB2. Junto a ellos incluimos una breve descripción explicativa de cada uno de los fallos de ejecución.



Error DB2 -900 sqlcode: La sentencia SQL no puede ser ejecutada porque el proceso (de la aplicación) no está conectado a un servidor.

Error DB2 -901 sqlcode: Fallo de ejecución causado por un error de sistema que no impide la ejecución de sentencias SQL posteriores.

Error DB2 -902 sqlcode: El puntero al Essential Control Block (CT/RDA) tiene valor cero. Se requiere un REBIND.

Error DB2 -904 sqlcode: Fallo de ejecución causado por un recurso no disponible.
Se indica:
Razón: REASON-CODE.
Tipo de Recurso: RESOURCE-TYPE.
Nombre Recurso: RESOURCE-NAME.

Error DB2 -905 sqlcode: Fallo de ejecución por superación del límite de recursos.
Se indica:
Nombre Recurso: RESOURCE-NAME.
Límite: LIMIT-AMOUNT1.
Segundos de CPU: LIMIT-AMOUNT2.
Procedencia: LIMIT-SOURCE.

Error DB2 -906 sqlcode: La sentencia SQL no puede ser ejecutada porque dicha función está desactivada debido a un error previo.

Error DB2 -908 sqlcode: Error BIND-TYPE con nivel de autorización AUTH-ID. Las operaciones Bind, Rebind o Auto-Rebind no están permitidas.

Error DB2 -909 sqlcode: El objeto ha sido borrado o modificado.

Error DB2 -910 sqlcode: La sentencia SQL no puede acceder a un objeto en el que hay cambios pendientes no consolidados (uncommitted).

Error DB2 -911 sqlcode: La unidad de trabajo actual (UOW) ha sufrido una retrocesión (rollback) debido a un bloqueo (deadlock) o a un exceso de tiempo de ejecución (timeout).
Se indica:
Razón: REASON-CODE.
Tipo de Recurso: RESOURCE-TYPE.
Nombre de Recurso: RESOURCE-NAME.



Error DB2 -913 sqlcode: Fallo de ejecución causado por un bloqueo (deadlock) o un exceso de tiempo de ejecución (timeout).
Se indica:
Razón: REASON-CODE.
Tipo de Recurso: RESOURCE-TYPE.
Nombre de Recurso: RESOURCE-NAME.

Error DB2 -917 sqlcode: Fallo en la ejecución del paquete Bind.

Error DB2 -918 sqlcode: La sentencia SQL no puede ser ejecutada debido a que se ha perdido la conexión.

Error DB2 -919 sqlcode: Se requiere una operación de retrocesión (rollback).

Error DB2 -922 sqlcode: Fallo de autorización.
Se indica:
Error: ERROR-TYPE.
Razón: REASON-CODE.

Error DB2 -923 sqlcode: Conexión no establecida.
Se indica:
DB2: CONDITION
Reason: REASON-CODE
Tipo: RESOURCE-TYPE
Nombre: RESOURCE-NAME

Error DB2 -924 sqlcode: Error interno de conexión a DB2.
Se indica:
Función: FUNCTION-CODE
Retorno: RETURN-CODE
Razón: REASON-CODE

Error DB2 -925 sqlcode: Consolidación (commit) no válida en entorno IMS, CICS o RRSAF.

Error DB2 -926 sqlcode: Retrocesión (rollback) no válida en entorno IMS, CICS o RRSAF.

Error DB2 -927 sqlcode: La interfaz LI (Language Interface) fue invocada cuando el entorno de conexión no estaba establecido. El programa debería ser invocado con el comando DSN.



Error DB2 -929 sqlcode: Fallo en captura de datos de salida.
Se indica TOKEN.

Error DB2 -939 sqlcode: Retrocesión (rollback) requerida debido a una retrocesión no solicitada de un servidor remoto.

Error DB2 -947 sqlcode: La sentencia SQL falló porque intenta cambiar una tabla definida con DCC (Data Capture Changes), pero los datos no pueden ser propagados.

Error DB2 -948 sqlcode: La operación distribuida no es válida.

Error DB2 -950 sqlcode: El nombre de ubicación especificado en la sentencia de conexión (connect) es inválido o no está registrado en la base de datos de comunicaciones.

Error DB2 -951 sqlcode: El objeto OBJECT-NAME de tipo OBJECT-TYPE se encuentra en uso y no puede ser el destino de la sentencia de modificación especificada.

Error DB2 -952 sqlcode: El procesamiento fue interrumpido por una petición de cancelación (cancel) procedente de un programa cliente.

Error DB2 -981 sqlcode: La sentencia SQL falló porque la conexión RRSAF no se encuentra en un estado que permita operaciones SQL.
Se indica Razón REASON-CODE.

Error DB2 -989 sqlcode: El disparador TRIGGER-NAME intentó modificar una fila en una tabla TABLE-NAME que fue modificada por una sentencia SQL de cambio de datos perteneciente a una cláusula From.

Error DB2 -991 sqlcode: La llamada vinculada fue incapaz de establecer una conexión implícita o abierta a DB2.
Se indica:
Rc1: RC1
Rc2: RC2

Error DB2 -992 sqlcode: El paquete PACKAGE-NAME no puede ser ejeuctado o desplegado en la ubicación LOCATION-NAME.



Desde Universocobol.com esperamos que las observaciones mostradas os sean de ayuda a la hora de entender mejor la causa origen del problema Cobol CICS DB2. A pesar de todo, si hay algo que no queda del todo claro, no dudéis en preguntarnos: en la medida de nuestras posibilidades, intentaremos resolver vuestras inquietudes.

Saludos.

jueves, 12 de marzo de 2015

Comandos Natural de acceso a ficheros ADABAS (y 2)

En la primera parte del post comenzamos a revisar, hace algunas semanas, la lista de instrucciones utilizadas para la conexión Natural ADABAS. Recordemos que una de las ventajas principales del lenguaje Natural es su facilidad para interaccionar con la base de datos ADABAS.

Ya estuvimos viendo los que son considerados como los comandos más importantes a este respecto (ver post Comandos Natural de acceso a ficheros ADABAS - 1). A continuación, trataremos de completar la revisión enumerando el resto de cláusulas que pueden ser utilizadas en la conexión Natural ADABAS.

- FIND: Esta instrucción sirve para buscar un registro o un grupo de registros en el fichero ADABAS sin necesidad de usar un superdescriptor. Normalmente, a diferencia de la instrucción READ, se utiliza para procesar un número reducido de registros. En general, no se suele emplear en las instalaciones debido al elevado consumo de recursos que conlleva.

FIND CLIENTES WITH APELLIDO1 = ’ALDEGUER’

 

- GET SAME: Este comando se emplea para obtener de nuevo la información del registro que está siendo procesado en ese momento.

GET SAME VALOR

- GET TRANSACTION DATA: Con esta cláusula podremos recuperar la información que haya sido almacenada en la última transacción con la instrucción END TRANSACTION.

GET TRANSACTION DATA CLIENTES-ET

- HISTOGRAM: Este comando nos permite extraer los datos de los campos del fichero ADABAS que hayan sido definidos como descriptores o que formen parte de un superdescriptor. En general, el uso de esta sentencia está prohibido en las instalaciones debido a su alto consumo de recursos.

HISTOGRAM CLIENTES DNI STARTING FROM '1'
  DISPLAY DNI *NUMBER *COUNTER
END-HISTOGRAM

- OBTAIN: Esta instrucción se utiliza para poner a disposición una serie de ocurrencias de una matriz ADABAS en almacenamiento continuo.

OBTAIN VALOR

 

De los comandos indicados, los que se suelen emplear con mayor frecuencia son READ, UPDATE, STORE, DELETE y GET, junto con las sentencias END TRANSACTION y BACKOUT TRANSACTION. Con estas 7 instrucciones tendremos suficiente para realizar el 90% de los accesos a la base de datos ADABAS.

Como vemos, el uso de estos comandos es muy intuitivo y, como decíamos más arriba, las sentencias son más sencillas de codificar que en el caso de otros lenguajes como Cobol o Java. De hecho, a pesar de su antigüedad, la sencillez de acceso a la base de datos sigue siendo una de las ventajas competitivas del lenguaje Natural.

 

Como siempre, lo importante para hacernos con el control de estas sentencias es practicar. En este caso, debido a la similitud de Natural con los lenguajes clásicos de programación, el tiempo requerido para adaptarnos a su funcionamiento es muy inferior al de los modernos lenguajes orientados a objetos.

Y nada más. Con lo comentado debería ser suficiente para hacernos con una idea de cuáles son los comandos que vamos a necesitar para acceder a ADABAS desde Natural. Ahora ya es cuestión de cada uno aprovechar este conocimiento o no...

Saludos.

jueves, 5 de marzo de 2015

Comandos Natural de acceso a ficheros ADABAS (1)

En la mayoría de los casos, en las grandes aplicaciones el lenguaje Natural aparece integrado con la base de datos ADABAS. Una de las ventajas de dicha unión, es que en dicho lenguaje tenemos una serie de comandos que hace que el acceso a los ficheros de esta base de datos sea relativamente fácil.

Usando comandos Natural, los accesos a ADABAS son más sencillos que los que se realizan en la mayoría de las conexiones entre otros lenguajes y sus bases de datos asociadas. En particular, la operativa Natural-ADABAS se realiza de forma más directa que, por ejemplo, los accesos Cobol-DB2 o los accesos Java-ORACLE.


A continuación, vamos a ir repasando cuáles son los principales comandos de los que disponemos en Natural para ir accediendo a la información de los ficheros ADABAS.

- READ: Este comando se utiliza para leer los registros de un fichero mediante el uso de un superdescriptor. Nos da la posibilidad de leer un número determinado de registros o de extraer todos los registros que cumplan una determinada condición de búsqueda.

CL. READ CLIENTES BY CLIENTES-CL-CLAVE = 'US06004'
  DISPLAY CODIGO DNI NOMBRE APELLIDO1 APELLIDO2 *ISN
END-READ 

- UPDATE: Se utiliza para actualizar los campos de un registro del fichero. Actuará únicamente sobre el registro que estemos leyendo en ese momento.

CL. READ (1) CLIENTES BY CLIENTES-CL-CLAVE = 'US06004'
  MOVE 'FRANCISCO JESUS' TO NOMBRE
  UPDATE (CL.)
END-READ

- STORE: Se emplea para dar de alta un nuevo registro en el fichero. Se creará un registro que contenga, en los campos correspondientes, toda la información que hayamos proporcionado previamente.

MOVE 'US06099'      TO CODIGO
MOVE '45281999H'    TO DNI
MOVE 'JOSE ANTONIO' TO NOMBRE
MOVE 'SANCHEZ'      TO APELLIDO1
MOVE 'PEREZ'        TO APELLIDO2
STORE CLIENTES

- DELETE: Este comando procederá a borrar un registro completo. Solamente actuará sobre el registro que estemos leyendo en ese momento.

CL. READ (1) CLIENTES BY CLIENTES-CL-CLAVE = 'US06004'
  DELETE (CL.)
END-READ

- GET: Sirve para obtener la información de los campos correspondientes a un registro concreto. La búsqueda de dicho registro se puede realizar únicamente mediante su ISN asociado (Internal Sequence Number).

GE. GET CLIENTES *ISN (CL.)

 

- END TRANSACTION: Este comando sirve para confirmar y consolidar las modificaciones propuestas sobre los ficheros mediante UPDATE, DELETE o STORE. Hasta que no se ejecute el END TRANSACTION realmente la informacion no estará almacenada en la base de datos ADABAS.

READ CLIENTES WITH CLIENTES-CL-CLAVE = ’US06099’
  DELETE
  END TRANSACTION
END-READ  

- BACKOUT TRANSACTION: Sirve para deshacer y desechar todas las modificaciones propuestas mediante los comandos UPDATE, DELETE o STORE. De esta forma nos aseguramos de que dichos cambios nunca van a llegar a la base de datos ADABAS.

READ CLIENTES WITH CLIENTES-CL-CLAVE = ’US06099’
  DELETE
END-READ
...
BACKOUT TRANSACTION

El próximo día continuaremos viendo la lista de comandos Natural con los que podemos acceder a la base de datos ADABAS. Aunque, evidentemente, los enumerados anteriormente son los más importantes, no podemos dejar de conocer la funcionalidad del resto de la API de la conexión Natural ADABAS.

Eso es todo. Como siempre, quedáis invitados a la segunda parte del post, donde completaremos el trabajo de revisión, iniciado hoy, de las instrucciones Natural ADABAS.

Saludos.

Related Posts Plugin for WordPress, Blogger...