27.10.2020 Views

Manual de Recomendaciones - Desarrolladores Cobol DB2-CICS en Altamira

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Desarrolladores

Cobol DB2-CICS

en Altamira

Manual de

Recomendaciones

Venezuela, Octubre 2020


Índice

Índice ....................................................................................................... 2

1. Aspectos generales de la arquitectura Altamira .................................... 4

1.1. Parametrizaciones Básicas de Arquitectura por la opción 2 del menú QM de

Arquitectura .................................................................................................. 4

Campo Tipo Altamira .................................................................................... 4

Campo Tipo de Transacción ................................................................................... 5

Campo Indicador de Tecleo .................................................................................... 6

1.2. Parametrizaciones Básicas de Arquitectura para el DESARROLLO DE

TRANSACCIONES BAJO PROTOCOLO PS9 (Especificidades de Función) ............. 7

Campo Indicador de Sesión ........................................................................... 7

Campo Indicador Asunto ............................................................................... 8

Campo Indicador Grabación de Trazas (Trace).................................................. 9

Campo Indicador Rollback ........................................................................... 10

Campo Indicadores Varios de Arquitectura (S/N) ............................................ 10

Especificación del Tipo de Formato ..............................................................

2. Consideraciones generales para desarrollo de transacciones bajo

protocolo Ps-9................................................................................... 22

3. Consideraciones básicas de CICS ....................................................... 26

Conceptos Generales .................................................................................. 26

Principales Comandos de CICS ..................................................................... 26

Relación entre las Parametrizaciones de Arquitectura y el CICS (New Copy) ........ 27

Principales Errores de CICS en la QMLO ......................................................... 27

Título del documento y versión 2


Principales Instrucciones del CICS ................................................................. 28

Debugging de Programa en CICS (CEDF y CEDX) ....................................... 28

4. Consideraciones generales de programación en lenguaje Cobol ......... 29

Título del documento y versión 3


ASPECTOS GENERALES DE LA ARQUITECTURA ALTAMIRA

Parametrizaciones Básicas de Arquitectura por la opción 2 del menú QM de Arquitectura.

Esta interfaz consta de varios indicadores tal como se muestra en la figura, a continuación se

detallan los más importantes a considerar para las transacciones asociadas a un canal.

Campo Tipo Altamira:

Este indicador puede tomar los valores (N/E/M/A/C) estos indican:

• N: Transacción Altamira Extendida.

• E: Transacción Estándar con pantalla original Altamira.

• M: Transacción Estándar con cabecera y pie de pantalla de la Arquitectura Extendida.

• A: Transacción Altamira AST.

• C: Transacción Altamira Extendida para AST.

Todas las transacciones asociadas a un canal deben tener el indicador tipo Altamira igual a ‘C’ este

tiene la función de realizar validaciones en el mantenimiento de especificidades de función así

como también en el log de la AST, esto permite obtener un mejor control de los totales estadísticos

de ejecuciones por transacción así como también el seguimiento de la producción.

Título del documento y versión 4


Las validaciones más importantes que se realizan en el gestor de canales AST son las siguientes:

1. Validación del límite para las transacciones financieras

2. Validación de asunto propio

3. Validación de firmas conjuntas

4. Validación de las modalidades de uso de sesión (Generación, Uso y Borrado de Sesiones).

Todas las transacciones que generan sesión deben ser tipo Altamira ‘A’, ejemplo la TX KVD1.

Campo Tipo de Transacción

Título del documento y versión 5


Este campo indica la modalidad de uso de la transacción, cuyos valores pueden ser:

• Transaccionales: Son aquellas que manejan un hilo de comunicación único y finito, es decir,

obtienen el dato de entrada, recuperan los datos de salida y finaliza la comunicación.

• Conversacionales: Son aquellas que mantiene un hilo de conversación. Ejemplo:

transacciones tipo listado GTS.

Es un requisito fundamental que las transacciones asociadas a un canal desatendido deben ser tipo

‘T’, es decir, Transaccionales.

Campo Indicador de Tecleo

Este indicador permite los valores (S/N) y tiene la función de actualizar la tabla de tecleos

exclusivamente para las transacciones que se ejecutan desde las oficinas. Para las transacciones que

se ejecutan desde un canal desantendido (ejemplo: banca móvil, provinet personas), este indicador

debe estar con estatus ‘N’. Si el canal es atendido (ejemplo: Terminal Financiero) este indicador

debe estar con valor ‘S’.

Título del documento y versión 6


Parametrizaciones Básicas de Arquitectura para el DESARROLLO DE TRANSACCIONES BAJO

PROTOCOLO PS9 (Especificidades de Función)

Esta interfaz consta de varios indicadores tal como se muestra en la figura.

A continuación se detallan los más importantes para las transacciones asociadas a un canal en el

menú de mantenimiento de especificadas de las transacciones.

Campo Indicador de Sesión

Título del documento y versión 7


Este campo puede tomar los valores (G/U/N/B) donde:

• G= Genera sesión.

• U= Usa sesión

• N= No usa sesión

• B= Baja de sesión.

Para las transacciones asociadas a un canal debe existir una transacción inicial que genere la sesión

(Indicador Sesión con la letra ‘G’) la cual será usada por las transacciones que sean invocadas a

partir de ella, las cuales deben tener el Indicador de Sesión con la letra ‘U’ y para finalizar la sesión

debe existir una transacción que se encargue de dar de baja la misma, la cual se marca con la letra

‘B’ en el Indicador de Sesión.

Campo Indicador Asunto

Todas las transacciones financieras y de consultas de operaciones críticas deben tener activa la

validación de Asunto Propio en el mantenimiento de especificidades de función.

Este indicador sólo puede tomar los valores siguientes:

• 0 = La transacción no valida asunto propio.

• 1 = La transacción valida un asunto (contrato, cuenta, tarjeta).

• 2 = La transacción valida dos asuntos (contratos, cuentas, tarjetas).

Como complemento del indicador de asunto propio se debe especificar en el formato de entrada de

la transacción a cual campo se le efectuará la validación de asunto propio. Esto se marca a través de

la opción 3 del menú QM, navegando hasta la pantalla de Mantenimiento de Campos del Formato y

al identificar el campo, se debe actualizar el indicador Literal 4700 con el valor ”ASP”, de este

modo el gestor de canales realizará la validación de asunto propio antes de ejecutar una

Título del documento y versión 8


operación.Cuando se requiera validar dos campos, al segundo se le debe actualizar el indicador

Literal 4700 con el valor “ASA”.

Nota: Las Transacciones de consulta no poseen este indicador.

Campo Indicador Grabación de Trazas (Trace)

Este indicador se usa para la generación de trazas del gestor de canales en la cola denominada

CNTRACE, por tal motivo es uno de los importantes y ninguna transacción asociada a un canal

debe tener este indicador con estatus activo, (Ind. Trace = A) ya que se pueden generar trazas

en el ambiente de producción y la cantidad máxima permitida de registros en una cola (temporage

storage) en el cics es de 32763. Copar ésta cantidad de registros genera un Sin Servicio en los

Canales Desatendidos por la región CICS donde reside la cola y más aún si la cola no es local y reside

en el CICS de gestión de colas remotas (QOR).

Título del documento y versión 9


Campo Indicador Rollback:

Este indicador puede tomar los valores S/N. Para transacciones financieras debe estar con estatus

“S”, de modo de que si presenta alguna cancelación, incidencia o abend durante la operación, la

misma pueda ser reversada en línea de todas las tablas aplicativas y de arquitectura involucradas.

Campo Indicadores Varios de Arquitectura (S/N):

Estos indicadores (“QF”, “QA”, “QS”, “TCL” y “DIA”) permiten grabar en las tablas de arquitectura,

donde los primeros 4 indicadores deben permanecer con estatus ‘N’ para evitar grabar trazas y

registros en tablas de arquitectura. El último indicador debe permanecer con estatus ‘S’ para

indicar que las operaciones usan el flujo ligero de la arquitectura exclusivo para Canales

Desatendidos.

Título del documento y versión 10


Existe una particularidad para las transacciones que entran en el modelo de funcionamiento de

Firmas Conjuntas. Sólo para éste caso se debe colocar el indicador “S” en el indicador “QF”. Ejemplo:

transacción de Transferencias a Otros Bancos.

Adicional a esto se debe realizar el borrado de la cola +DC para garantizar que no existan mezcla de

mapas en respuesta de transacción.

Se debe garantizar la inclusión de la siguiente sentencia en nuevos desarrollos de programas línea.

Ejemplo:

Título del documento y versión 11


Dónde:

Los elementos que deben registrarse y asociarse en Arquitectura para la ejecución de transacciones

por PS9 son:

A. Transacción

B. Formatos de entrada y salida

C. Si es transacción Transaccional definir Preformato

D. Canal

E. Especificidades de la transacción

F. Terminales Lógicas y Terminal Contable

A continuación se comentan algunos aspectos relevantes acerca de cada uno de ellos.

A) Transacción:

Título del documento y versión 12


En la definición de la transacción toma relevancia el campo Tipo Altamira, ya que en base a

este será el flujo que siga la ejecución de la transacción por PS9. (Al final se muestra

diagrama).

- TIPO ALTAMIRA: Indicador del tipo de transacción (N/E/M/A/C). Es modificable el campo.

Los valores indican:

* N: Transacción Altamira Extendida.

* E: Transacción Estándar con pantalla original Altamira.

* M: Transacción Estándar con cabecera y pie de pantalla de la Arquitectura

Extendida.

* A: Transacción Altamira AST.

* C: Transacción Altamira Extendida para AST.

B) Formatos de Entrada y Salida.

Lista de Formatos de una Transacción

Se accede a este panel desde el mantenimiento de transacciones con la tecla de función PF5.

Para cada línea del listado, existen dos campos:

• El campo de la selección. Se permite utilizar sólo uno de ellos cada vez, usando los caracteres

'X' o ‘S’.

Título del documento y versión 13


• El campo de contenido de las líneas. No es modificable por pantalla. Informa acerca de las

características principales de cada registro de la tabla de Formatos.- Relación de la

transacción con el formato de salida.

Para que en esta pantalla se muestre el Formato de Salida, es necesario relacionarlo a la transacción

mediante la opción en QM de Formatos de salida de una TX (opción 11) , se muestra un ejemplo a

continuación.

Especificación del Tipo de Formato

Título del documento y versión 14


- TIPO: Tipo del formato: define si es correspondiente a un mensaje de entrada BMS (E), a uno de

salida BMS (S), o a uno de entrada y salida BMS(A), o bien entrada no BMS (F) o salida no BMS

(X). Es modificable.

• Si la transacción es nueva o es Transaccional se recomienda tener un formato de entrada (F) y

uno de salida (X) que no sea BMS para no reservar espacio que realmente no se ocupa, debido a que

los formatos BMS reservan 3 bytes en cada campo correspondientes a sus atributos y esto se usa en

transacciones Conversacionales.

• Los Formatos pueden tener como máximo 69 campos y la longitud de cada campo y del formato

depende del tipo:

• Formatos F o X: longitud máxima de cada campo 143 bytes longitud máxima del

formato 9867 bytes.

• Formatos E, S o A: longitud máxima de cada campo 120 bytes longitud máxima del

formato 2000 bytes.

C) Si la transacción es Transaccional, definir un Pre-formato:

El preformato a utilizar en la salida es transparente a las aplicaciones, sabiendo la arquitectura en

cada momento con qué terminal está hablando, y en consecuencia, qué preformato de pantalla debe

utilizar en la salida. Los programas de aplicación solamente tendrán que dar a la arquitectura el

contenido de los campos variables del formato en la correspondiente copy.

Título del documento y versión 15


- PREFORMATO DE SALIDA ESTÁNDAR: Preformato estándar (24x80) asociado al formato

correspondiente a la salida a pantalla. Puede ir informado en formatos de entrada/salida o de

salida (A/S). Es modificable. Si se informa, debe estar antes dado de alta en la tabla de

preformatos. Se utiliza cuando la salida es a pantalla.

D) Definición del Canal.

Son el conjunto de características establecidas para identificar una entidad externa en Arquitectura.

El campo de mayor relevancia en esta definición es el indicador de AST, como se informa en el

diagrama de modos de procesamiento (que se incluye al final), este indicador influye en

cómo debe parametrizarse o definirse la transacción. Si la operación requiere el uso de

colectores AST, este indicador debe establecerse como “S”.

Se puede acceder al panel de Mantenimiento de Canales:

• Desde el menú principal de mantenimiento de tablas de la arquitectura (QM) tecleando la

OPCION 12 y una clave del canal completa, en caso de no teclear ninguna clave a

continuación se mostrará un listado de los canales.

Este panel consta de los siguientes campos:

- CODIGO CANAL: Código del canal ASTA en 2 caracteres. Es modificable.

- DESCRIPCIÓN: Descripción del canal en 25 caracteres. Es modificable.

Título del documento y versión 16


- NEW COPY: Indicador de si se desea que se refresque la copia en memoria del registro del canal

cuando se realiza una modificación. La selección puede hacerse con el carácter ‘X’. Si no se

realiza esta selección, solamente se actualizarán los valores modificados en la tabla DB2. Es

modificable.

- IND. AUTORIZACION CANAL (S/N): Valores ‘N’ o ‘S’. Con valor a ‘S’ no permite su ejecución

durante el proceso de cambio de sesión. Es modificable.

- LIT. ERROR PROPIOS: Indicador del manejo de mensajes de Error y Aviso propios de cada canal,

si se define como N, tomará los mensajes generales. Es modificable.

- IND. CANAL REQUIERE AST (S/N): Indicador si el canal requiere AST o no. Es modificable.

- ALTA-DISPONIBILIDAD ( /C/S): Alta Disponibilidad y Standing. No modificable en este panel.

- CODIGO CANAL AST: Código del canal AST. Es modificable.

- CODIGO CANAL ASTA: Código de canal ASTA. No modificable.

- CODIGO SUBCANAL AST: Código de subcanal AST. Es modificable.

- INDICE SUBCANAL: Indice de subcanal AST. Es modificable.

- CODIGO CANAL AST MODELO: Código de canal AST modelo. Es modificable.

- ENVIO DE MENSAJES: Rutina para envío de otro tipo de mensajes por canal distinto al de

entrada. Es modificable.

- FORMATEO MSG ENTRADA: Es modificable.

- FORMATEO MSG SALIDA: Es modificable.

- TRATAMIENTO ABEND / PARAMETROS: Es modificable.

- INICIO FORMATO PS9 / PARAMETROS: Es modificable.

- INDICADOR TIPO HORARIO: Valores A (abierto) C (cerrado).

- ABIERTO INICIO DIA HABIL: Hora inicio en horario abierto día hábil

- FIN DIA HABIL: Hora fin en horario abierto día hábil.

- ABIERTO INICIO DIA NO HABIL: Hora inicio horario abierto segundo tramo.

- FIN DIA NO HABIL: Hora fin en horario abierto en día no hábil.

- CERRADO INICIO DIA HABIL: Hora inicio en horario cerrado día hábil

- FIN DIA HABIL: Hora fin en horario cerrado en día hábil.

- CERRADO INICIO DIA NO HABIL: Hora fin en horario cerrado día no hábil.

- FIN DIA NO HABIL: Hora fin en horario cerrado en día no hábil.

- STAMPS ULTIMA MODIFICACION: Los siguientes campos no son modificables por pantalla, e

indican:

- Usuario, Fecha, hora y terminal que realizó la última modificación.

Título del documento y versión 17


- Usuario, Fecha, hora y terminal que realizó el alta del registro.

Las teclas de función de este panel son:

- IN: Tecla de consulta. Al modificar el campo Código Canal y presionar la tecla “IN” se efectúa

una consulta de los datos para el canal introducido.

- PF2: Tecla de modificación de algún dato.

- PF3: Tecla de alta de un nuevo registro. Se valida que no exista en la tabla.

- PF4: Limpiar. Se borra toda la información que hubiera en la pantalla.

- PF5: Listado. Ir a la pantalla de Especificidades de función por canal.

- PF6: Tecla para dar de baja un registro previa confirmación con PF7. La baja que se realiza es

una baja física (se realiza un Delete del registro en la tabla).

- PF9: Ir al menú de mantenimiento.

E) Especificidades de la transacción

Parámetros que permiten establecer valores condicionantes del procesamiento para las

funciones ejecutadas en dentro del canal.

Listado de especificidades por función

Se accede a este panel desde el mantenimiento de canales con la tecla de función PF5, o desde el

mantenimiento de transacciones con la tecla de función PF16.

Título del documento y versión 18


Para cada línea del listado, existen dos campos:

• El campo de la selección. Se permite utilizar sólo uno de ellos cada vez, usando los

caracteres ‘X’ ó ‘S’. Es modificable.

• El campo de contenido de las líneas. No es modificable por pantalla. Informa acerca de las

características principales de cada registro de la tabla de especificidades por función-

Parametrización de la transacción para el canal:

Se accede a este panel desde el listado de canales por función

• Seleccionando un registro del listado de la tabla de especificidades por función y pulsando

la tecla PF2, o no realizando ninguna selección y pulsando la tecla PF3 (alta).

Los campos que contiene este panel son:

- FUNCION: Indicador de Función, asociado a este campo se encuentra su descripción.

- CODIGO CANAL El Código de canal, este código no tiene un estándar a seguir, es una

convención entre las áreas involucradas en el proyecto y Arquitectura del país.

- IND. ACTIVO/DESACTIVO: Indicador Activo Desactivo.

- INDICADOR SESION: Indicador Sesión AST (Genera/Usa/No usa)

- INDICADOR ASUNTO: Número de asuntos (0, 1, 2), es el número de cuentas que validará

AST, como complemento de este campo, en la definición del formato de la transacción se

debe indicar cuál es el campo de la cuenta a validar, y si es asunto propio (ASP) o

asociado (ASA).

Título del documento y versión 19


- INDICADOR IMPORTE: Indicador importe, indica si AST validará el importe de la

transacción, como complemento de este campo, en la definición del formato de la

transacción se debe indicar cuál es el campo de importe a validar, con el literal

IMP(Importe)

- INDICADOR ALTA AUTOMATICA: Indicador de alta automática para nuevos clientes en el canal.

- IND. CONTABILIZAR OPERACIONES: Indicador de Contabilización de operaciones.

- IND. CONTABILIZAR IMPORTES: Indicador de contabilización de importes.

- NIVEL DE SEGURIDAD: Indicador de nivel de seguridad

- MAXIMO NUMERO OPERACIONES/MES: Número máximo de operaciones por mes.

- IMPORTE MINIMO ESTANDAR: Importe mínimo estándar por operación.

- CANAL DESTINO: Indicador de trace.

- IND. TRACE: Indicador de trace.

- IND. REVERSO CONEXIÓN: Indicador de reverso de la operación

- IND. ROLLBACK: Indicador de rollback.

- IND. REGISTRO LOG: Indicador de Log.

- IND REGISTRO MONITOR: Indicador de monitor.

- IND. VALIDAR PASSWORD: Indicador de password

- IND. GENERAR FOLIO: Indicador de generar Folio.

- N. MAXIMO ASUNTOS: Máximo número de asuntos

- INDICADORES: QA, QS, TCL, DIA. Los siguientes indicadores se refieren a:

- QA: Indicador de grabar auditoria

- QS: Indicador de validar confidencialidad

- TCL : Indicador de grabar tecleo

- DIA : Indicador de grabar diario electrónico

- IND.TIPO DE HORARIO: Indicador tipo de horario (abierto/cerrado).

- ABIERTO HABIL: Rango horario abierto (hora inicio/hora fin).

- NO HABIL: Rango horario abierto no hábil (hora inicio/hora fin).

- CERRADO HABIL: Rango horario cerrado hábil (hora inicio/hora fin).

- NO HABIL: Rango horario cerrado no hábil (hora inicio/hora fin).

- STAMPS ÚLTIMA MODIFICACION: Los siguientes campos no son modificables por pantalla, e

indican:

Título del documento y versión 20


- Usuario, Fecha, hora y terminal que realizó la última modificación.

- Usuario, Fecha, hora y terminal que realizó el alta del registro.

Las teclas de función de este panel son:

- IN: Tecla de consulta. Al modificar el campo Código Canal y presionar la tecla “IN” se efectúa

una consulta de los datos para el canal introducido.

-PF2: Tecla de modificación de algún dato.

-PF3: Tecla de alta de un nuevo registro. Se valida que no exista en la tabla.

-PF4: Limpiar. Se borra toda la información que hubiera en la pantalla.

-PF6: Tecla para dar de baja un registro previa confirmación con PF7. La baja que se realiza es

una baja física (se realiza un Delete del registro en la tabla).

- CL: Ir al panel anterior.

- Indicador de validación de los campos del formato de entrada de la transacción, con estos

indicadores se informan los asuntos e importes a validar en AST:

Si el canal va a entrar por AST y se van a validar los importes es necesario indicar la Literal

de cada campo asociado a éste.

Título del documento y versión 21


CONSIDERACIONES GENERALES PARA DESARROLLO DE TRANSACCIONES BAJO

PROTOCOLO PS-9.

CAMBIOS DE LA COMMAREA. CONSIDERACIONES GENERALES.

1) La transacción QG30 de Altamira (SIGNON) funcionará bajo DPL pero sin ejecutar la

instrucción Signon prohibida en DPL. Esta transacción la podrá usar el terminal financiero

para leer información del terminal (usuario) que se ha conectado y de incidencias. Que no se

haga Signon no tiene consecuencias si la seguridad es externa y ya se propaga el SIGNON.

2) El SYNCPOINT o SYNCPOINT ROLLBACK deberá estar condicionado al nuevo indicador de

Syncpoint, que vendrán informado en un campo del CAA-STARTCODE en el Área de

comunicaciones de la Arquitectura (QGECCAA). Mientras existan transacciones donde se

requiere un ROLLBACK de parte de la operación y COMMIT del resto dentro de la misma

unidad de ejecución (LWU), se requiere que el Middleware que invoque Altamira vía DPL use

el parámetro SYNCONRETURN al ejecutar el LINK. La ejecución del comando SYNCPOINT

cuando CAA-STARTCODE indique que el SYNCPOINT No se recomienda el uso (‘D’) provocará

un ABEND de la tarea.

3) En caso de invocación DPL (CAA-88-DPL), se prohíbe el uso de los siguientes comandos CICS:

• Comandos de control de terminales referidos a su Principal Facility.

• Comandos que establezcan o pregunten por atributos del terminal.

• Comandos BMS.

• Comandos SIGNON y SIGNOFF.

• Comandos de intercambio de datos con el Batch.

• Comandos que direccionen la TCTUA.

• El uso del comando SYNCPOINT está limitado a la opción SYNCONRETURN establecida

por el LINK a la Arquitectura.

• No hacer uso del EIBTRMID para sufijar colas TS o cualquier tipo de recurso compartido

por transacciones. En su lugar usar CAA-TERMINAL.

CAMBIOS DE LA COMMAREA. CONSIDERACIONES PARA LAS APLICACIONES.

1) No hacer uso del EIBTRNID para identificar el código de la transacción en ejecución. En su

lugar usar CAA-CODTRAN.

2) No ejecutar la instrucción EXEC CICS ASSIGN USERID(). Para obtener la información del

usuario que ejecuta la transacción usar el campo CAA-USERID.

Título del documento y versión 22


3) Usar los campos CAA-ENTIDAD, CAA-TERMINAL-CONT y CAA-NETNAME-CONT para efectos

de totalización y contables. Aunque tienen los mismos valores, es aconsejable usar el campo

CAA-TERMINAL-CONT para informar las áreas de Journal y totales (en lugar de CAA-

NETNAME-CONT).

4) No usar CAA-NETNAME como equivalente a CAA-TERMINAL. A efectos de auditoría

(grabación de stamps en tablas DB2) se aconseja usar el campo CAA-TERMINAL.

5) Las aplicaciones batch que exploten el Journal Contable, deberán tener en cuenta que se ha

añadido el campo JOU-CANAL en la zona de datos de aplicación. Existen dos alternativas

para manejar el problema: a) Utilizar una plantilla del campo en la que se incluya el canal en

los dos primeros bytes; o b) Mover/Tomar los datos variables a JOU-DATOS-APLIC-VAR (en

lugar de JOU-DATOS-APLIC-C), y tener en cuenta que la longitud del campo se incrementa en

dos debido a la existencia del campo JOU-CANAL.

6) Las aplicaciones no deberán utilizar las instrucciones CICS prohibidas en DPL. A

continuación se presenta una tabla con los comandos prohibidos. Excepto que se especifique

“all”, solo estarán prohibido usar el comando con las opciones de la columna derecha.

¦ Table 10. API commands prohibited in programs invoked by DPL ¦

+------------------------------------------------------------------------¦

¦ Command ¦ Options ¦

+----------------------+-------------------------------------------------¦

¦ ADDRESS ¦ ACEE TCTUA ¦

+----------------------+-------------------------------------------------¦

¦ ASSIGN ¦ ALTSCRNHT ALTSCRNWD APLKYBD APLTEXT BTRANS ¦

¦ ¦ COLOR DEFSCRNHT DEFSCRNWD DELIMITER DESTCOUNT ¦

¦ ¦ DESTID DESTIDLENG DS3270 DSSCS EWASUPP EXTDS ¦

¦ ¦ FACILITY FCI GCHARS GCODES GMMI HILIGHT INPARTN ¦

¦ ¦ KATAKANA LDCMNEM LDCNUM MAPCOLUMN MAPHEIGHT ¦

¦ ¦ MAPLINE MAPWIDTH MSRCONTROL NATLANGINUSE ¦

¦ ¦ NEXTTRANSID NUMTAB OPCLASS OPSECURITY OUTLINE ¦

¦ ¦ PAGENUM PARTNPAGE PARTNS PARTNSET PS QNAME ¦

¦ ¦ SCRNHT SCRNWD SIGDATA SOSI STATIONID TCTUALENG ¦

¦ ¦ TELLERID TERMCODE TERMPRIORITY TEXTKYBD ¦

¦ ¦ TEXTPRINT UNATTEND USERNAME USERPRIORITY ¦

¦ ¦ VALIDATION ¦

+----------------------+-------------------------------------------------¦

¦ CONNECT PROCESS ¦ all ¦

+----------------------+-------------------------------------------------¦

¦ CONVERSE ¦ all ¦

+----------------------+-------------------------------------------------¦

¦ EXTRACT ATTRIBUTES ¦ all ¦

+----------------------+-------------------------------------------------¦

¦ EXTRACT PROCESS ¦ all ¦

+----------------------+-------------------------------------------------¦

¦ FREE ¦ all ¦

Título del documento y versión 23


+----------------------+-------------------------------------------------¦

¦ HANDLE AID ¦ all ¦

+----------------------+-------------------------------------------------¦

¦ ISSUE ¦ ABEND CONFIRMATION ERROR PREPARE SIGNAL PRINT ¦

¦ ¦ ABORT ADD END ERASE NOTE QUERY RECEIVE REPLACE ¦

¦ ¦ SEND WAIT ¦

+----------------------+-------------------------------------------------¦

¦ LINK ¦ INPUTMSG INPUTMSGLEN ¦

+----------------------+-------------------------------------------------¦

¦ PURGE MESSAGE ¦ all ¦

+----------------------+-------------------------------------------------¦

¦ RECEIVE ¦ all ¦

+----------------------+-------------------------------------------------¦

¦ RETURN ¦ INPUTMSG INPUTMSGLEN ¦

+----------------------+-------------------------------------------------¦

¦ ROUTE ¦ all ¦

+----------------------+-------------------------------------------------¦

¦ SEND ¦ CONTROL MAP PARTNSET TEXT TEXT(MAPPED) ¦

¦ ¦ TEXT(NOEDIT) PAGE ¦

+----------------------+-------------------------------------------------¦

¦ SIGNOFF ¦ all ¦

+----------------------+-------------------------------------------------¦

¦ SIGNON ¦ all ¦

+----------------------+-------------------------------------------------¦

¦ SYNCPOINT ¦ ¦

+------------------------------------------------------------------------¦

¦ Note: Can be issued in server region if SYNCONRETURN specified ¦

+------------------------------------------------------------------------¦

¦ WAIT TERMINAL ¦ all ¦

+----------------------+-------------------------------------------------¦

¦ XCTL ¦ INPUTMSG INPUTMSGLEN ¦

7) +--os programas de aplicación en on-line que no tengan acceso a la commarea de

Arquitectura (QGECCAA) y necesiten recuperar el terminal lógico, la entidad, el centro

contable, el terminal contable, el usuario que ejecuta la transacción, el STARTCODE, el

idioma del terminal o el canal de entrada, deberán llamar a la rutina QG6CTUT a través de la

commarea QGECTUT, estando permitida únicamente la lectura de los datos.

8) Para las aplicaciones que usen la versión de Arquitectura Estándar, la equivalencia de

campos con la commarea NBA es la siguiente:

• CAA-TERMINAL L10-TERMINAL

• CAA-NETNAME No existente

• CAA-TERMINAL-CONT L10-TERMINAL-CONT

• CAA-NETNAME-CONT No existente

Título del documento y versión 24


• CAA-USERID L10-USUARIO-ID

• CAA-USERID-LOGON No existente

• CAA-CANAL L10-CANAL

9) En ocasiones las transacciones conversacionales ocupan copys independientes al formato

definido para la transacción, estos se almacenan en el puntero CAA-PTRDATA que es un área

auxiliar de memoria.

En el uso de transacciones conversacionales anidadas los datos almacenados en el puntero

CAA-PTRDATA se conservarán solamente durante la ejecución de la tarea activa no se

almacenarán en tareas posteriores (independientes).

PROPAGACIÓN DE CANAL. CONSIDERACIONES GENERALES.

1. Cada tipo de terminal está asociado a un único canal por defecto que se usará en todas las

operaciones, excepto que el protocolo sea capaz de asignar uno diferente o que el terminal

disponga de modelo.

2. El campo canal refleja el tipo de canal; oficina, cajeros, banca telefónica, etc.

PROPAGACIÓN DE CANAL. CONSIDERACIONES PARA LAS APLICACIONES.

1. Se añade un campo al área de comunicación de la Arquitectura con las aplicaciones (CAA):

CAA-CANAL que refleja el canal de operación del terminal

2. Si las aplicaciones necesitan más información sobre el canal, deberán acceder ellas a la Tabla

Corporativa General de Canales.

3. Los módulos de compatibilidad se encargaran de incluir en el área de comunicación especial

el código de canal. Este aparecerá en el campo L10-CANAL.

DEFINICIÓN DE TRANSACCIONES EN EL GESTOR TRANSACCIONAL CICS

Es Importante resaltar que al gestionar la definición de las transacciones con el equipo de soporte

Middleware Cics se debe indicar que debe estar asociada al programa maestro de arquitectura

denominado QG1CDIR0 y con instalación local en las regiones AOR Altamira correspondiente al

canal que le vaya a dar servicio. Existen regiones de CICS Aor diferentes para los canales más

importantes: Banca Móvil y Provinet Personas/Empresas.

Título del documento y versión 25


CONSIDERACIONES BÁSICAS DE CICS

1.- Conceptos Generales

Siglas CICS: Customer Information Control System. Es el servidor de aplicaciones de la

plataforma Mainframe.

Tipos de Regiones CICS. Nomenclatura y Uso

TOR (Terminal Only Region): regiones utilizadas básicamente para el establecimiento de

conexiones con entes externos a través de recursos como sockets, urimaps, mq.

AOR (Application Only Region): son las regiones donde se ejecutan las transacciones

aplicativas de todos los modulos de Altamira.

FOR (File Only Region): son las regiones donde se instalan y tratan a nivel de lectura

y escritura los archivos VSAM, por ejemplo, el archivo vsam de tablas corporativas.

Ejemplo de Archivo.

Nombre corto: RCDF0000

Nombre largo: MBVD.RCFD.STDRVSAM.RCDF0000

QOR (Quee Only Region): son las regiones que se destinan para las definiciones y

tratamiento de las colas denominadas Temporage Storage que son muy usadas en los programas de

CICS para el tratamiento de datos técnicos y de negocio.

Ejemplo de Cola.

Modelo: QGSES

Cola: QGSES600000011

2.- Principales Comandos de CICS

COMANDO

CEMT I / S TRAN(QG30)

CEMT I TERM (CJCL)

CEMT I FILE (RCDF0000)

CEMT I TSQ (+PAR )

CEMT I TSM (QGSES)

CEMT I CONN(*)

CEMT I DB2T(*)

CEMT I DB2E(*)

CEMT I DB2E(*)

FUNCIÓN

Se emplea para consultar transacciones

Se emplea para consultar terminales

Se emplea para consultar archivos en CICS de

archivos

Se emplea para consultar nombres de colas

Se emplea para consultar los nombres de

modelos

Se emplea para consultar las Conexiones entre

los CICS.

Se emplea para consultar las conexiones con los

planes de DB2.

Se emplea para consultar y actualizar la

conexión con los planes de DB2.

Se emplea para consultar las tareas activas en

un CICS.

Título del documento y versión 26


CEMT I TASK(*)

CECI SEND MAP (Nombre del Mapa

Se emplea para consultar las tareas activas en

el CICS.

Se emplea para visualizar el mapa de una

determinada transacción y poder revisar el

tamaño de los Campos.

3.- Relación entre las Parametrizaciones de Arquitectura y el CICS (New Copy)

New Copy de Colas (Refrescamiento de Datos) - Arquitectura: este refrescamiento es el que se

realiza sobre componentes de arquitectura (transacciones, formatos, preformatos, terminales,

teclas, especificidades de función) cuando se realizan modificaciones (incorporación, eliminación,

ampliación de campos) o cambios de parámetros en dichos componentes. El New Copy de

Arquitectura no es más que el borrado de la cola de CICS donde residen las características del

elemento de arquitectura. A continuación se describe los nombres de las colas de los principales

componente de arquitectura:

Cola de Transacciones: +CCRTRAN TRAN: nombre del terminal.

Cola de Aplicativo: +APRXX. XX: Nombre del Aplicativo.

Cola de Formato y Preformato: -R*

Cola del Terminal: Nombre del terminal

Cola de Teclas: +PFRTRAN. TRAN: nombre del terminal

New Copy de Objetos de Programas (Refrescamiento del Compilado) – CICS: este

refrescamiento es el que se hace directamente en las regiones (AOR o TORES) del entorno de CICS

para actualizar la versión de los ejecutables, ya que ha sufrido algún tipo de modificación en el

código del programa, lo cual afecta la longitud de los componentes en sus principales objetos (LOD,

DBR, BAT). Se realiza como un paso de reforzamiento del procedimiento de implantación que se

ejecuta a través de la herramienta CHANGE-MAN. En síntesis, el New Copy en CICS se usa para

refrescar objetos programáticos.

4.- Principales Errores de CICS en la QMLO.

Código de Error

EIBRESP 44 (QIDERR)

EIBRESP 53 (SYSIDERR)

EIBRESP 22 (LENGERR)

EIBRESP 26 (ITEMERR)

EIBRESP 27 (PGMIDERR

EIBRESP 28 (TRANSIDERR )

Significado

No existe el contenido en la cola.

No hay conexión entre los CICS.

Longitud del Registro Incorrecta.

Registro no existe en la cola.

Programa no existe en CICS.

Transacción no existe en CICS.

Título del documento y versión 27


EIBRESP 81 (TERMIDERR)

ICH408I

DB2 -911

DB2 -501

DB2 -923

Terminal no responde o no existe.

Errores de RACF por falta de Autoridad

Time Out por recurso ocupado.

Cierre de Cursor que no está abierto.

Conexión No establecida contra el DB2.

5.- Principales Instrucciones del CICS

LINK

WRITEQ

ENQ

CANCEL

READQ

DELETEQ

DELAY

Enlazar o Invocar programas.

Realizar escritura de Colas

Aplicar retención de un recurso

Aplicar la liberación o cancelación de un

recurso ENQ o DELAY.

Realizar lectura de colas TS.

Realizar borrado de Colas TS.

Establecer un tiempo de espera en un

determinado recurso

6.- Debugging de Programa en CICS (CEDF y CEDX).

El comando CEDF/CEDX se utiliza para monitorear y depurar los programas asociados a

transacciones CICS.

El proceso de DEBUG puede ser iniciado desde el propio terminal o región de CICS donde se está

ejecutando la transacción (CEDF) o desde un terminal diferente donde el CICS intercepta la

transacción especificada a través del comando CEDX mas el nombre de la transacción específica,

donde se muestran el panel de diagnóstico que permite correr el programa interceptando los

comandos de CICS para efecto de seguimiento y determinación de errores. Las principales teclas

que se usan en el panel de Debug son las siguientes:

F9: Establece la instrucción CICS a Monitorear.

F4. Stop en cada ejecución de las Instrucción establecida.

F2: Cambiar entre Decimal e Hexadecimal.

F5: Visualizar datos de una posición de Memoria Específica.

ENTER: se para en cada instrucción CICS.

Título del documento y versión 28


CONSIDERACIONES GENERALES DE PROGRAMACION EN LENGUAJE COBOL

A continuación se detalla un listado de recomendaciones técnicas que se deben considerar para lograr la

generación de un código en lenguaje cobol óptimo y de excelente calidad en términos de procesamiento y

eficiencia en consumo de recursos. Estas buenas prácticas se describen partiendo desde las más comunes o

básicas, hasta algunos casos de mayor complejidad e incluso de poca utilización en la plataforma.

Consideraciones Generales de Programación en Lenguaje Cobol

El máximo valor de un campo numérico es de 18 bytes, considerando los decimales se recomienda

usar la composición siguiente: 9(15)V(2), que indica 9 posiciones enteras con 2 decimales.

El máximo valor de un campo alfanumérico es de 65620 bytes

El máximo valor de un campo editado es de 255 bytes

El máximo valor posible de campo literal o constante es de 4096 bytes

EL nombre de una variable no debe superar los 40 caracteres

El campo AUTHOR debe ir informado. Siempre debe ir informado el campo ‘AUTHOR’ con el fin

de tener identificado al autor del programa.

El PROGRAM-ID es obligatorio y debe ser igual al miembro que lo almacena. Siempre debe ir

informado el campo ‘PROGRAM-ID’ con el nombre del programa que, a su vez, debe corresponder

con el nombre del miembro que lo almacena. La finalidad es tener identificado el nombre del

programa en el código fuente.

No se recomienda el uso de COMP-2.

Se recomienda no utilizar datos numéricos en formato COMP-2 por su elevado consumo. Se deben

utilizar formatos numéricos menos consumidores.

Se recomienda no usar FILLER a nivel 01.

No se asegura que el compilador lo sitúe en memoria en el mismo orden de aparición.

Las tablas deben definirse al final de la WORKING y antes de la declaración de cursores .

Las tablas WORKING deben declararse al final de la misma y antes de la declaración de cursores

con el fin de evitar que cualquier desbordamiento provoque errores en otras variables.

Los cursores deben definirse al final de la WORKING.

Los cursores tienen que declararse en WORKING STORAGE SECTION y nunca en PROCEDURE

DIVISION ya que es sentencia declarativa. Además, deberán declararse al final de dicha sección

para evitar posibles errores de desbordamiento.

Se recomiendan programas pequeños, con menos de 5000 líneas en fuente expandido.

Se recomienda no diseñar programas con un número elevado de líneas de código con el fin de

facilitar la depuración y el mantenimiento. Máximo recomendable 5.000 líneas en fuente

expandido.

Título del documento y versión 29


Se deben poner comentarios al inicio de los párrafos.

Al comienzo de los párrafos se deben escribir comentarios aclaratorios de los mismos.

Existen párrafos no referenciados en el código.

Todos los párrafos, sentencias y variables no utilizados deben ser eliminadas de los programas

Se recomienda el uso de INITIALIZE para variables de nivel 01.

Las variables declaradas a nivel 01 con subniveles, son alfanuméricas (incluso si todos los campos

a los que agrupa son numéricos). Por tanto, la inicialización de este tipo de variables debe hacerse

con la sentencia INITIALIZE a nivel 01.

El índice de una tabla WORKING debe ser COMP.

En la definición de un campo de índice de una tabla, utilizar el formato COMP. Cualquier otro tipo

de formato implica conversión interna cuando el índice es referenciado.

No usar INITIALIZE para DCLGEN.

La sentencia INITIALIZE de una variable a nivel 01 puede ser muy costosa dependiendo del

número de subniveles y variables dependientes. Se debe utilizar sólo cuando sea necesario

inicializar todas las variables asociadas de los subniveles inferiores.

La utilización de la sentencia GO TO está prohibida.

La sentencia GO TO es incompatible con la programación estructurada, su uso está prohibido.

No se recomienda usarla cláusula ALTER.

La cláusula ALTER es incompatible con la programación estructurada, su uso está prohibido.

No se recomienda utilizar la cláusula CANCEL.

La cláusula CANCEL, no es necesaria con un correcto diseño de aplicaciones. Su utilización es

debida normalmente a la aparición de un número elevado de niveles de llamadas entre programas

como consecuencia de una excesiva modularización. La reducción del número de llamadas a

programas dentro de la ejecución de un programa elimina la necesidad de utilizar esta sentencia.

Es obligatorio el control de WHEN OTHER en la cláusula EVALUATE.

Siempre que se utilice la sentencia EVALUATE tiene que controlarse la opción WHEN OTHER para

completar todas las posibles condiciones.

El uso de PERFORM VARYING sólo es aceptado para tratar tablas WORKING.

El uso de PERFORM VARYING sólo se permite, por rendimiento, utilizarse para bucles que

procesan tablas de datos secuencialmente. La variable de control debe ser índice de la tabla

tratada.

El PERFORM THRU debe tener su correspondiente párrafo EXIT.

PERFORM ... THRU ... : La codificación de la etiqueta de la cláusula THRU sólo debe usarse para

garantizar la legibilidad del punto de finalización del PERFORM; por esa razón, esta sentencia

abarcará un máximo de dos párrafos o etiquetas (por ejemplo, PROCESO-XXX y PROCESO-XXX-

FIN), y el contenido del segundo párrafo será una única sentencia EXIT.

Título del documento y versión 30


El uso de PERFORM N TIMES sólo es aceptado para tratar tablas WORKING.

PERFORM N TIMES sólo se permite, por rendimiento, utilizarse para bucles que procesan tablas de

datos secuencialmente. El valor de N debe ser menor o igual al tamaño de la tabla procesada.

Está prohibido el uso de SORT interno.

En caso de necesitar ordenar los datos de entrada y/o salida, utilizar SORT a través de JCL.

No se recomienda el uso de DISPLAY [variable/literal] UPON CONSOLE.

Está completamente prohibido enviar o recibir datos por la consola del sistema.

No se recomienda el uso de ACCEPT [variable/literal] FROM CONSOLE.

Está completamente prohibido enviar o recibir datos por la consola del sistema.

No se recomienda el uso de INCLUDE en la PROCEDURE DIVISION.

Está completamente prohibido el uso de INCLUDE en la PROCEDURE DIVISION.

No se recomienda el uso de COPY en PROCEDURE DIVISION.

Está completamente prohibido el uso de COPY en la PROCEDURE DIVISION.

Se debe finalizar un IF con su END-IF correspondiente.

Por claridad, es recomendable escribir la cláusula de fin de ámbito de un IF con su correspondiente

END-IF.

Se debe finalizar un READ con su END-READ correspondiente.

Por claridad, es recomendable escribir la cláusula de fin de ámbito de un READ con su

correspondiente END-READ.

Se debe finalizar un EVALUATE con su END-EVALUATE correspondiente.

Por claridad, es recomendable escribir la cláusula de fin de ámbito de un EVALUATE con su

correspondiente END-EVALUATE.

Se debe finalizar un SEARCH con su END-SEARCH correspondiente.

Por claridad, es recomendable escribir la cláusula de fin de ámbito de un SEARCH con su

correspondiente END-SEARCH.

Para búsquedas en tablas WORKING de menos de 50 elementos usar SEARCH .

Usar la instrucción SEARCH si la tabla tiene 50 elementos o menos.

Esta instrucción es más rápida que SEARCH ALL para tablas pequeñas.

El uso de DISPLAY sólo se permite por fin de programa o por ABEND.

No se puede utilizar la sentencia DISPLAY excepto en los casos en que informa de un ABEND

controlado (errores DB2 y errores del programa) o para sacar estadísticas al final de la ejecución

del programa. Durante la fase de construcción se puede utilizar la sentencia cuando sea necesario,

pero cuando el módulo se pasa al entorno de Producción deben desaparecer todas las sentencias

DISPLAY de pruebas de programas.

Se recomienda poner punto sólo al final de párrafo.

Evitar poner un punto al final de las sentencias excepto en: 1. Fin de párrafo 2.Sentencias IF que

incluyan la sentencia NEXT SENTENCE; éstas no sólo deberán ir cerradas con END-IF, sino que

además llevarán un punto detrás del END-IF. Esto es debido a que NEXT SENTENCE ignora el END-

Título del documento y versión 31


IF. En el caso que se cumpla la condición asociada al NEXT SENTENCE, la siguiente instrucción que

se ejecutará será la que se encuentre inmediatamente después del punto más próximo. Por esta

razón, no es recomendable el uso de la sentencia NEXT SENTENCE.

Las rutinas con sentencias DB2 deben devolver el SQLCODE al programa principal.

Las rutinas con sentencias SQL deben programarse de forma que cuando se produce un error DB2,

la rutina debe devolver el control al programa principal informándole del SQLCODE producido.

Los campos que intervienen en operaciones aritméticas deben estar definidos como COMP o

COMP-3 y tener la misma longitud.

Cualquier otro formato implica conversión interna. No se admiten constantes numéricas.

Se deben evitar las divisiones entre 0.

Evitar multiplicar y dividir por 0, utilizando si fuese necesario una instrucción IF. Estas

operaciones consumen mucho tiempo de CPU, incluso cuando los resultados no son de interés.

En la instrucción IF no se permiten más de 10 niveles de anidación.

Por mantenibilidad y rendimiento, evitar anidar un número elevado de sentencias IF.

Para búsquedas en tablas WORKING de más de 50 elementos usar SEARCH ALL.

Si la tabla está clasificada y contiene más de 50 elementos, es más eficiente utilizar SEARCH ALL.

Se debe evitar el uso de IF NUMERIC e IF ALPHABETIC.X

Las condiciones IF NUMERIC, IF ALPHABETIC utilizan la instrucción máquina TRT.

Esta instrucción es muy potente y a la vez muy costosa, por lo que se recomienda que se utilice lo

menos posible. Para evitar la utilización de estas instrucciones hay que definir los datos de origen

en fase de diseño en el formato correcto.

No incluir SQLCA si no hay accesos DB2 en el programa.

Los programas que no contengan accesos SQL no deben incluir la SQLCA.

Se han detectado INCLUDE de tablas no utilizadas en el programa.

Las sentencias INCLUDE de tablas que no se utilicen en el programa deben eliminarse. Hacen el

DBRM más grande de lo necesario.

Es obligatorio controlar la variable de FILE STATUS después de cada sentencia de acceso a

ficheros.

No se recomienda utilizar ninguna línea de código entre la sentencia de acceso a fichero y el

control de su FILE-STATUS.

No se recomienda el uso de la variable RETURN-CODE.

Para condicionar ejecuciones posteriores se deben utilizar las condiciones de disparo del

planificador.

Se debe evitar el uso de LIKE '%' y LIKE '_'.

Evitar la utilización de operadores LIKE donde la expresión a evaluar no empiece por un valor

concreto, como por ejemplo: 1. LIKE ‘%dato’ 2. LIKE ‘_dato’.

Este tipo de predicado no es indexable y por tanto si se aplican a campos de índice, estos serán

ignorados por DB2 en el momento de decidir el camino de acceso.

Título del documento y versión 32


No se recomienda la utilización del SUBSELECT.

No se debe utilizar SUBSELECT salvo en casos puntuales y estrictamente necesarios. Esta exigencia

debe preverse y evitarse durante la fase de diseño del modelo de datos.

No se recomienda la utilización de JOIN de dos tablas.

No se debe utilizar JOIN de tablas salvo en casos puntuales y estrictamente necesarios. Esta

exigencia debe preverse y evitarse durante la fase de diseño del modelo de datos.

Evitar el uso o la existencia de sentencias SQL que no se ejecutan.

No se pueden codificar sentencias SQL que no son ejecutadas durante el proceso. Esto hace que

tanto el DBRM como el PLAN sean más grandes de lo necesario, aumentando el tiempo de carga y

el espacio en el EDM POOL necesario para dicha carga. Si por modificación del módulo se quiere

dejar esa sentencia aunque ya no se utilice, debe dejarse como comentario.

En las sentencias FETCH o SELECT se están recuperando campos que no se utilizan

Los datos necesitados de una tabla deben obtenerse mediante un único acceso a ésta.

Evitar reiteradas consultas sobre una misma tabla para recuperar diferentes atributos de un

registro, los datos necesitados de una tabla y todos los atributos de una entidad que se necesiten a

lo largo de un programa, deben ser obtenidos mediante un único acceso.

Las tablas DB2 de bajo volumen y muy accedidas deben copiarse en WORKING al principio

de la ejecución del programa.

En procesos BATCH, es mejor desde el punto de vista de rendimiento acceder a este tipo de tablas

con sentencias de búsqueda COBOL que a través de sentencias SQL. Para el caso de online, sólo en

caso de necesitarse el 90% de las filas de la tabla en cada ejecución, en caso contrario, acceder sólo

a las filas necesarias. Para CCR y en caso de CICS, se podrá cargar la tabla en una Temporary

Storage si se comparte con más transacciones o ejecuciones de una misma transacción

En sentencias SQL se deben utilizar variables DCLGEN u otras definidas en WORKING con la

misma estructura.

En cualquier sentencia SQL, las variables SQL utilizadas deben ser las definidas en la DCLGEN o, si

no se puede, utilizar variables definidas en WORKING con el mismo formato que el generado para

la columna afectada en la DCLGEN. Cuando las variables utilizadas no tienen el mismo formato,

DB2 se ve forzado a realizar conversiones innecesarias. Si además la columna forma parte de un

índice, puede que DB2 no utilice dicho índice, por esta causa, en el acceso; este es el caso de

comparaciones numéricas de distinta precisión, así como alfanuméricas donde la variable HOST es

más larga que el atributo a comparar.

Detectado programa excesivamente grande, con más de 15.000 líneas expandidas.

Se recomienda no diseñar programas con un número elevado de líneas de código con el fin de

facilitar la depuración y el mantenimiento. Además la carga en máquina de este tipo de módulos es

costosa, condicionando el rendimiento del programa.

No debe usarse SQL dinámico.

No se recomienda la utilización de SQL dinámico en programación.

La sentencia FETCH debe incluir las mismas columnas y en el mismo orden que aparecen en

la declaración del cursor.

Para prevenir errores, la sentencia FETCH debe contemplar las mismas columnas y en el mismo

Título del documento y versión 33


orden que el cursor del que se está leyendo.

Se han detectado cursores que no han sido cerrados durante la ejecución del programa.

Es obligatorio cerrar de forma explícita todos los cursores abiertos durante un proceso.

Sólo en caso de error serán cerrados por terminación anormal.

Las columnas actualizadas en UPDATE deben ser las mismas que las declaradas en la

cláusula FOR UPDATE.

Las columnas actualizadas mediante la sentencia UPDATE WHERE CURRENT OF CURSOR deben

ser todas las declaradas en la cláusula FOR UPDATE.

En cursores para borrar filas con DELETE WHERE CURRENT OF, en la cláusula FOR UPDATE

debe tener una sola columna.

Para los cursores declarados FOR UPDATE y en los que sólo se pretende borrar filas (no

actualizaciones) con la sentencia DELETE WHERE CURRENT OF CURSOR, en la cláusula FOR

UPDATE del DECLARE CURSOR sólo se debe declarar una columna.

Evitar el uso de un cursor FOR UPDATE que no informa en el SET del WHERE CURRENT OF

todas las columnas.

En la cláusula FOR UPDATE no se deben incluir columnas que no van a ser modificadas en el

proceso.

El cursor definido puede ser transformado en una SELECT.

Los cursores deben ser utilizados sólo cuando el WHERE de la sentencia devuelva más de una fila y

además todas las filas devueltas necesiten ser tratadas por el programa. En caso contrario, se

deben utilizar sentencias SELECT, controlando el SQLCODE –811 en caso de que la sentencia

devuelva más de una fila.

Evitar el uso de GROUP BY en un acceso SQL.

Por rendimiento, evitar el uso de la cláusulas GROUP BY en sentencias que provoquen SORT DB2

No se recomienda el uso de SELECT *.

Esto es debido a que su uso no independiza al módulo de posibles alteraciones de la tabla como

añadir columnas, etc.

No deben usarse constantes en sentencias SQL excepto cuando se usa IN / NOT IN.

Definir variables HOST para estas constantes y utilizar estas variables en la sentencia SQL.

Es conveniente utilizar las variables HOST definidas en la DCLGEN.

No se debe usar la sentencia SELECT COUNT(*) si sólo se pretende verificar la existencia o

no de filas.

Utilizar para ello una sentencia SELECT y controlar los valores de SQLCODE 0, -811 y 100 para

comprobar si existe o no la fila buscada. Si se precisase conocer el número de filas afectadas por un

UPDATE/DELETE/INSERT, puede obtenerse del campo SQLERRD(3) de la SQLCA una vez

ejecutada la instrucción.

La sentencia INSERT debe codificarse completa y con las variables HOST en el mismo orden

que los valores que toman.

Las variables HOST deben estar en el mismo orden en que se han especificado los atributos. Esto

no significa que se especifiquen todas las columnas de una tabla, sino aquéllas que se necesiten, ya

Título del documento y versión 34


que el resto tomarán los valores por defecto:

1. Espacios para atributos alfanuméricos.

2. Ceros para atributos numéricos.

3. Fecha y/o Hora actual en campos de fecha y hora.

Se debe usar CURSOR FOR UPDATE en lugar de realizar SELECT y UPDATE/DELETE.

Si es necesario conocer previamente el valor de la fila a modificar ó borrar: utilizar un cursor

declarado FOR UPDATE en lugar de realizar primero una sentencia SELECT y luego la sentencia de

actualización. La razón es la forma de adquirir el bloqueo, ya que de la forma recomendada se

evitan posibles DEADLOCKS y TIMEOUTS.

No se recomienda realizar actualizaciones masivas mediante una sentencia SQL.

Dependiendo de la discriminación del WHERE pueden provocar un número elevado de bloqueos,

perjudicando la concurrencia de las aplicaciones.

Se debe controlar el WHEN OTHER/ELSE del SQL para que lleve a la cancelación controlada

del programa.

Los valores no estándar de SQLCODE que no se controlan explícitamente en el programa, deben

controlarse de forma genérica con una cláusula WHEN OTHER/ELSE y provocar la cancelación del

programa.

Evitar el uso de ROLLBACK.

La utilización de la sentencia ROLLBACK puede ser peligrosa.

Faltan por controlar valores necesarios del SQLCODE.

El control del SQLCODE tiene que realizarse inmediatamente después de realizar la sentencia SQL.

Además, es muy importante realizarlo de forma correcta. A continuación se detallan los códigos de

retorno de cada sentencia. Dichos códigos deben ser tratados siempre por programa.

En sentencias SELECT sobre tabla con índice único e informando todos los campos del índice por

igual, los códigos controlables son:

SQLCODE = +0 Registro Encontrado

SQLCODE = +100 Registro no Encontrado

En sentencias SELECT que puedan recuperar más de una fila, los códigos controlables son:

SQLCODE = +0 Registro Encontrado

SQLCODE = +100 Registro no Encontrado

SQLCODE = -811 Más de una fila cumple la condición de búsqueda

En sentencias INSERT sobre tablas con índice único, los códigos controlables son:

SQLCODE = +0 Acceso Correcto

SQLCODE = -803 Registro Duplicado

En sentencias INSERT sobre tablas que no tienen índice único, los códigos controlables son:

SQLCODE = +0 Acceso Correcto

En sentencias DELETE los códigos controlables son:

Título del documento y versión 35


SQLCODE = +0 Borrado correcto de todas las filas que cumplen la condición

SQLCODE = +100 Ningún registro cumple la condición

En sentencias UPDATE los códigos controlables son:

SQLCODE = +0 Actualización correcta de todas las filas que cumplen la condición

SQLCODE = +100 Ningún registro cumple la condición

SQLCODE = -803 Registro duplicado (Índices únicos)

En sentencias OPEN y CLOSE los códigos controlables son:

SQLCODE = +0

Sentencia ejecutada correctamente

En sentencias FETCH los códigos controlables son:

SQLCODE = +0 Registro leído

SQLCODE = +100 No existen más registros que cumplen la condición

En sentencias DELETE y UPDATE WHERE CURRENT OF CURSOR los códigos controlables son:

SQLCODE = +0 Proceso correcto

Se debe evitar el uso del ACCEPT FROM DATE, TIME o DAY.

No se deben utilizar las sentencias ACCEPT DATE, TIME y DAY como fechas de proceso.

La fecha de proceso debería ser un atributo más del modelo de datos de la aplicación.

Si la fecha del sistema se utiliza como fecha de proceso, hay que tener en cuenta los problemas que

se podrían ocasionar si se tuviera que repetir un proceso con fecha del día anterior. Si el resultado

se utiliza para cabeceras de listado o similar, ejecutar cada sentencia una sola vez en el programa.

Se debe codificar OPEN, READ, WRITE una sola vez.

La apertura (OPEN) y cierre (CLOSE) de ficheros se codificarán, siempre que sea posible, una sola

vez en el programa, invocándolas vía PERFORM cada vez que se utilicen. Lo mismo con sentencias

READ y WRITE. Diferenciar el tipo de apertura de ficheros y codificar la sentencia OPEN como

INPUT, OUTPUT o INPUT/OUTPUT.

Se deben agrupar la apertura y cierra de todos los ficheros en un mismo OPEN y CLOSE.

Se deben agrupar tanto las instrucciones OPEN como las CLOSE en una sola instrucción.

No debe usarse en WRITE el registro 01 de la FD, ni una variable working de mayor longitud

que el tamaño del registro.

Las sentencias de escritura (WRITE) de ficheros, se deben codificar utilizando variables definidas

en la WORKING con idéntica longitud (se admite menor), y no trabajar nunca con las definiciones

de la FD de la FILE SECTION.

Se debe eliminar el uso de ON SIZE ERROR.

Eliminar la cláusula ON SIZE ERROR usando técnicas como comprobar que el denominador no está

a cero antes de ejecutar la instrucción. Esto es debido al elevado número de instrucciones máquina

Título del documento y versión 36


para chequear que no se ha producido error después de ejecutar dicha instrucción.

No se permite la utilización de más de 10 ficheros en un programa.

Por mantenibilidad, se recomienda no diseñar programas que manejen un número elevado de

ficheros (máximo 10).

No debe usarse AFTER o BEFORE en WRITE.

En su lugar utilizar el carácter ASA escribiendo en ficheros definidos FBA.

El fichero referenciado no ha sido cerrado.

Como medida preventiva hacia la aparición de errores, se deben cerrar de forma explícita todos los

ficheros que sean abiertos a lo largo del programa.

Evitar el uso de ficheros VSAM.

La utilización de ficheros VSAM queda restringida a casos muy específicos. La necesidad de

utilización de este tipo de ficheros debe ser consultada con Calidad Técnica en fase de diseño.

Evitar la definición de una tabla WORKING con demasiados elementos (más de 5.000) ó un

tamaño total grande.

Por rendimiento del programa, se recomienda no utilizar en los programas tablas que tengan

definido un número elevado de ocurrencias. No se deben definir tablas que ocupen mucha zona de

memoria.

Los datos contenidos en estas tablas WORKING grandes deberían almacenarse en otro tipo de

dispositivos, como ficheros o tablas DB2, a los que se puede acceder de una forma más eficiente

cara al consumo de recursos.

Se han detectado más llamadas a rutinas de las permitidas (máximo: 10).

Se recomienda diseñar los procesos evitando la excesiva modularización de programas.

Este tipo de procesos implican un elevado consumo de recursos como consecuencia del coste

aplicado a la carga de módulos en máquina.

No se recomienda el uso de la sentencia LOCK TABLE.

No se puede utilizar la sentencia LOCK TABLE, ya que el nivel de bloqueo, en este caso, lo decide el

programa; es decir, el ámbito y duración del bloqueo quedan definidos por el propio programa,

pudiendo provocar con ello contenciones en datos. Además, existen otras maneras de bloquear los

datos de forma más ágil, eficiente e independiente del programa.

Se han detectado accesos SQL duplicados.

Las sentencias SQL idénticas deben codificarse en un párrafo aparte e invocarlas mediante

PERFORM, en lugar de escribirlas varias veces en el programa. Hacen el DBRM más grande de lo

necesario.

No se recomienda el uso de funciones sobre variables HOST en la cláusula WHERE de las

sentencias SQL.

Se recomienda no utilizar expresiones aritméticas en la parte derecha de la cláusula WHERE en

sentencias SQL; en su lugar, realizar la operación aritmética, mover el resultado a una variable

HOST y comparar con dicha variable. Esto se debe a que en dichos casos, si la columna a comparar

forma parte de un índice, el DB2 decide no acceder por el mismo, incrementando el coste de la

Título del documento y versión 37


sentencia.

No se recomienda el uso de la DCLGEN a nivel 01.

En sentencias SQL está prohibido el uso de la DCLGEN a nivel 01, las columnas deben ser siempre

referenciadas una a una. La razón es la misma que en el caso de SELECT *.

Evitar el uso de un acceso a una tabla pequeña (nº páginas <= 7) en el que no se informan

los primeros campos de índice.

Siempre que las tablas DB2 tengan índices definidos, las sentencias SQL deben acceder por campos

que estén incluidos en estos índices. Además, se debe informar el mayor número posible de

campos del índice por el que se accede, informando siempre los primeros campos para evitar que

el acceso a DB2 sea costoso.

No se recomienda el uso de funciones sobre columnas en la cláusula WHERE de las

sentencias SQL.

Evitar la utilización de operaciones con columnas de la tabla en las cláusulas WHERE de las

sentencias., como por ejemplo : 1. WHERE COL1 + COL2 = :VAR-HOST 2. WHERE COL1 = COL1 +

:VAR-HOST 3. WHERE COL1 = COL2 + :VAR-HOST 4. WHERE SUBSTR(COL1,n,n) = :VAR-HOST 5.

WHERE UPPER(COL1) = :VAR-HOST .

Estos tipos de predicado no son indexables y por tanto si se aplican a campos de índice, estos

serán ignorados por DB2 en el momento de decidir el camino de acceso.

Evitar el uso de SORT DB2 en el acceso a la tabla.

Se debe tratar de evitar la realización de SORT por parte de DB2.

Si existe una necesidad funcional, deben buscarse soluciones de diseño identificando el origen de

la necesidad del SORT con el fin de evitarlo. Posibles soluciones al SORT DB2, dependiendo de cada

caso en particular y de la gravedad del SORT podrían ser :

- Pasos previos de SORT en JCL

- Cambios en el orden de tablas del modelo de datos

- Diseño de índices alternativos.

- Modificación de índices existentes.

- Etc, dependiendo del caso.

Se debe evitar el uso de sentencias SELECT función con baja discriminación en las

condiciones de la cláusula WHERE.

Es muy costoso utilizar sentencias SELECT <FUNCION> con cláusulas WHERE poco restrictivas que

seleccionen un elevado número de filas. Se debe evitar su uso.

Evitar la definición de una tabla en LINKAGE con demasiados elementos o un tamaño total

grande.

Por rendimiento del programa, se recomienda no utilizar en los programas tablas que tengan

definido un número elevado de ocurrencias. No se deben definir tablas que ocupen mucha zona de

memoria.

Título del documento y versión 38


Evitar el uso de COMMIT.

Se detecta la utilización de la sentencia COMMIT. La frecuencia de COMMIT en el programa

dependerá de factores como la hora de ejecución, el tipo de tablas a actualizar, la concurrencia con

otras aplicaciones, el tipo de proceso, el bloqueo de recursos etc. La sentencia COMMIT es costosa

por lo que la elección correcta de la frecuencia de COMMIT en el programa es importante.

Evitar el uso de una sentencia sobre una tabla pequeña (nº páginas <= 7), que usa más de

un índice para resolver el acceso.

No se deben construir sentencias SQL que accedan a las tablas utilizando más de un índice definido

sobre ellas. Posibles soluciones , dependiendo de cada caso en particular y de lo costoso del acceso,

podrían ser :

- Modificaciones funcionales que permitan cambiar el WHERE de la sentencia.

- Rediseño de los índices existentes.

- Diseño de índices alternativos.

- Etc, dependiendo del caso.

Se debe definir correctamente el indicador de nulos (PIC S9(4) COMP).

La definición correcta es:

WORKING-STORAGE SECTION

----------

05 IND-NULL PIC S9(4) COMP.

No se debe utilizar el indicador de nulos en SELECT COUNT, utilizar SQLCODE.

En la sentencia SQL SELECT COUNT(*) no se debe contemplar indicador de nulos, solamente debe

controlarse el SQLCODE.

No mezclar SQLCODE con variables del programa en IF.

Es obligatorio controlar el SQLCODE inmediatamente después de la sentencia SQL.

No se recomienda utilizar ninguna línea de código entre la sentencia SQL y el control de su

SQLCODE. Además, la línea de control debe ser exclusiva para el SQLCODE, es decir, no se deben

mezclar la condiciones del control de SQLCODE con variables HOST del programa.

un control de valores de SQLCODE que no pueden darse.

Cualquier valor de SQLCODE diferente de los estándares son errores y deben tratarse como tal.

Evitar el uso de SELECT CURRENT TIMESTAMP.

Evitar la utilización de sentencias SELECT CURRENT TIMESTAMP, DATE o TIME. La fecha de

proceso debería ser un atributo más del modelo de datos de la aplicación. Si la fecha del sistema se

utiliza como fecha de proceso, hay que tener en cuenta los problemas que se podrían ocasionar si

se tuviera que repetir un proceso con fecha del día anterior. Si el resultado se utiliza para

cabeceras de listado o similar, ejecutar cada sentencia una sola vez en el programa.

Evitar el uso de la sentencia WHENEVER.

Es muy costoso el control del SQLCODE a través de la sentencia WHENEVER SQLERROR.

Se recomienda controlar el SQLCODE de forma explícita en el programa.

Título del documento y versión 39


Evitar el uso de LIST PREFETCH en el acceso a DB2.

En ON-LINE, los cursores que tienen como finalidad construir listas, no deberían recuperar muchas

filas. Si debido a las condiciones de los WHERE los cursores recuperaran muchas filas, sería

necesario aplicar técnicas de lista-reposicionamiento para realizar recuperaciones parciales de

filas y optimizar los accesos.

La sentencia desencadena un proceso costoso de SORT por parte de DB2, debido al elevado

número de filas seleccionadas .

Si existe una necesidad funcional, deben buscarse soluciones de diseño identificando el origen de

la necesidad del SORT con el fin de evitarlo. Posibles soluciones al SORT DB2, dependiendo de cada

caso en particular y de la gravedad del SORT podrían ser :

- Pasos previos de SORT en JCL

- Cambios en el orden de tablas del modelo de datos

- Diseño de índices alternativos.

- Modificación de índices existentes.

- Etc, dependiendo del caso.

Se están recuperando campos que se condicionan por igual en el WHERE.

No se deben recuperar campos que se condicionan por igual en el WHERE: el valor del campo es

conocido y por lo tanto no es necesario aumentar el bloque de E/S. Sólo en caso de comprobar la

existencia o no de un registro en una tabla, se justifica esta selección.

Evitar el uso de un acceso sobre una tabla mediana (7 < nº páginas < 10.000), en el que no

hay campos del índice informados en el WHERE.

Siempre que se pueda se deben utilizar los campos del índice para el acceso a datos. DB2, si puede

utilizar los índices, los utiliza facilitando así el camino de acceso a datos. Dependiendo del tamaño

de la tabla, del WHERE de la sentencia y de la frecuencia de ejecución del programa, podría ser

conveniente la creación de un índice sobre la tabla.

Se debe cambiar en la cláusula WHERE la condición C>DATO OR C=DATO por C>=DATO.

Aunque las dos sentencias siguientes recuperan los mismo datos, DB2 realiza un proceso de

búsqueda más sencillo en el segundo caso que en el primero:

1.WHERE (C1 > &gml.C1 OR C1 = &gml.C1)

2.WHERE (C1 >= &gml.C1)

No se permite el uso de la cláusula UNION.

Evitar la utilización de sentencias SELECT UNION y UNION ALL. Modificaciones en el modelo de

datos pueden evitar la utilización de estas sentencias.

No usar NOT> y NOT<, usar <= y >= respectivamente.

Evitar todos aquellos casos en los que DB2 no utiliza índices (predicados no indexables) como:

1. Predicados con '<>' o 'Not ='

2. Predicados con 'Not >' y 'Not <' que se pueden cambiar por '<=' y '>=' respectivamente

Si se necesita saber si existe o no una fila, buscarla seleccionando un solo campo y que sea

de índice.

Si es necesario verificar sólo la existencia o no de una fila y, no es necesario conocer ningún valor

de la misma, seleccionar sólo una columna del índice (aunque se condicione por igual). Esto

provoca que DB2 sólo acceda al fichero de índices no teniendo necesidad de acceder al fichero de

Título del documento y versión 40


datos.

Evitar el uso de CURRENT DATE.

La fecha de proceso debería ser un atributo más del modelo de datos de la aplicación. Si la fecha del

sistema se utiliza como fecha de proceso, hay que tener en cuenta los problemas que se podrían

ocasionar si se tuviera que repetir un proceso con fecha del día anterior.

Evitar el uso de CURRENT TIME.

Si la hora del sistema se utiliza como hora de proceso puede ser peligroso por los posibles desfases.

El control del SQLCODE debe hacerse inmediatamente después de cada acceso SQL.

No se recomienda usar ninguna línea de código entre la sentencia SQL y el control de su SQLCODE.

Evitar el uso de un cursor declarado FOR UPDATE sin DELETE o UPDATE WHERE CURRENT

posterior.

Los cursores declarados con la cláusula FOR UPDATE deben tener una sentencia UPDATE/DELETE

WHERE CURRENT OF CURSOR asociada en el programa.

En UPDATE no se deben poner columnas cuyo valor no ha sido modificado.

No deben incluirse en la cláusula SET de un UPDATE columnas cuyo valor no hay sido modificado a

lo largo de la ejecución del programa.

No deben usarse SELECT/FETCH para verificar la existencia de una fila para su posterior

lectura o actualización.

Se deben controlar directamente los valores de retorno del SQLCODE en la sentencia de

actualización para comprobar si la fila existe.

Evitar el uso de HAVING.

Por rendimiento, no es recomendable la utilización de la cláusula de condición HAVING para

GROUP BY. Se deben realizar diseños de aplicación que eviten la utilización de este tipo de

cláusulas en fase de programación.

No se recomienda el uso de la cláusula CASE.

Por rendimiento no es recomendable la utilización de la cláusula CASE. Se deben realizar diseños

de aplicación que eviten la utilización de este tipo de cláusulas en fase de programación.

Evitar el uso de DISTINCT.

Por rendimiento no es recomendable la utilización de la cláusula DISTINCT. Se deben realizar

diseños de aplicación que eviten la utilización de este tipo de cláusulas en fase de programación.

Se recomienda el uso de INCLUDE de la DCLGEN de las tablas DB2 utilizadas.

Para todas las tablas utilizadas en el programa, se debe incluir la DCLGEN de cada una de ellas.

Evitar el uso de un cursor en PROCEDURE que no está declarado.

Los CURSORES referenciados a través de sentencias SQL OPEN, CLOSE y FETCH deben estar

declarados en el programa.

No están permitidas vistas que en su definición incluyan más de una tabla.

Título del documento y versión 41


Por rendimiento, la utilización de este tipo de vistas es muy costosa.

Evitar el uso de la definición de una tabla en LINKAGE con demasiados elementos ó un

tamaño total muy grande.

Por rendimiento del programa, se recomienda no utilizar en los programas tablas que tengan

definido un número elevado de ocurrencias. No se deben definir tablas que ocupen mucha zona de

memoria

En las sentencias FETCH o SELECT se están recuperando más de 10 campos que no se

utilizan

Las sentencias SQL no deben recuperar columnas que no se utilizan en el proceso.

Evitar el uso de la definición de una tabla WORKING con demasiados elementos (más de:

10.000) ó un tamaño total muy grande.

Por rendimiento del programa, se recomienda no utilizar en los programas tablas que tengan

definido un número elevado de ocurrencias. No se deben definir tablas que ocupen mucha zona de

memoria.

Los datos contenidos en estas tablas WORKING grandes deberían almacenarse en otro tipo de

dispositivos, como ficheros o tablas DB2, a los que se puede acceder de una forma más eficiente

cara al consumo de recursos.

Evitar el uso de un acceso sobre una tabla grande (nº páginas >= 10.000), en el que no hay

campos del índice informados en el WHERE.

Siempre que se pueda se deben utilizar los campos del índice para el acceso a datos. DB2, si puede

utilizar los índices, los utiliza facilitando así el camino de acceso a datos. Dependiendo del tamaño

de la tabla, del WHERE de la sentencia y de la frecuencia de ejecución del programa, podría ser

conveniente la creación de un índice sobre la tabla.

Evitar el uso de un acceso a una tabla mediana (7 < nº páginas < 10.000) en el que no se

informan los primeros campos de índice.

Siempre que las tablas DB2 tengan índices definidos, las sentencias SQL deben acceder por campos

que estén incluidos en estos índices. Además, se debe informar el mayor número posible de

campos del índice por el que se accede, informando siempre los primeros campos para evitar que

el acceso a DB2 sea costoso.

Evitar el uso de un acceso a una tabla grande (nº páginas >= 10.000) en el que no se

informan los primeros campos de índice.

Siempre que las tablas DB2 tengan índices definidos, las sentencias SQL deben acceder por campos

que estén incluidos en estos índices. Además, se debe informar el mayor número posible de

campos del índice por el que se accede, informando siempre los primeros campos para evitar que

el acceso a DB2 sea costoso.

Evitar el uso de un acceso dentro de un bucle a una tabla (nº páginas >= 7) en el que no se

informan los primeros campos de índice.

Siempre que las tablas DB2 tengan índices definidos, las sentencias SQL deben acceder por campos

que estén incluidos en estos índices. Además, se debe informar el mayor número posible de

campos del índice por el que se accede, informando siempre los primeros campos para evitar que

el acceso a DB2 sea costoso.

Título del documento y versión 42


Evitar el uso de una sentencia sobre una tabla mediana (7 < nº páginas < 10.000), que usa

más de un índice para resolver el acceso.

No se deben construir sentencias SQL que accedan a las tablas utilizando más de un índice definido

sobre ellas. Posibles soluciones , dependiendo de cada caso en particular y de lo costoso del acceso,

podrían ser :

- Modificaciones funcionales que permitan cambiar el WHERE de la sentencia.

- Rediseño de los índices existentes.

- Diseño de índices alternativos.

- Etc, dependiendo del caso.

Evitar el uso de una sentencia sobre una tabla grande (nº páginas >= 10.000), que usa más

de un índice para resolver el acceso.

No se deben construir sentencias SQL que accedan a las tablas utilizando más de un índice definido

sobre ellas. Posibles soluciones, dependiendo de cada caso en particular y de lo costoso del acceso,

podrían ser :

- Modificaciones funcionales que permitan cambiar el WHERE de la sentencia.

- Rediseño de los índices existentes.

- Diseño de índices alternativos.

- Etc, dependiendo del caso

Evitar el uso de un acceso en un bucle sobre una tabla (nº páginas >= 7), en el que no hay

campos del índice informados en el WHERE.

Siempre que se pueda se deben utilizar los campos del índice para el acceso a datos. DB2, si puede

utilizar los índices, los utiliza facilitando así el camino de acceso a datos. Dependiendo del tamaño

de la tabla, del WHERE de la sentencia y de la frecuencia de ejecución del programa, podría ser

conveniente la creación de un índice sobre la tabla.

Evitar el uso de una sentencia dentro de un bucle sobre una tabla (nº páginas >= 7), que usa

más de un índice para resolver el acceso.

No se deben construir sentencias SQL que accedan a las tablas utilizando más de un índice definido

sobre ellas. Posibles soluciones, dependiendo de cada caso en particular y de lo costoso del acceso,

podrían ser :

- Modificaciones funcionales que permitan cambiar el WHERE de la sentencia.

- Rediseño de los índices existentes.

- Diseño de índices alternativos.

- Etc, dependiendo del caso.

No se recomienda la utilización de JOIN de más de dos tablas.

No se debe utilizar JOIN de tablas salvo en casos puntuales y estrictamente necesarios. Esta

exigencia debe preverse y evitarse durante la fase de diseño del modelo de datos.

No se recomienda la utilización de JOIN que contengan accesos costosos (R0, I0, MX).

No se debe utilizar JOIN de tablas que requieran accesos costosos a alguna de las tablas que

intervienen. Deben evitarse especialmente, accesos de tipo R0, I0 y MX. Esta exigencia debe

preverse y evitarse durante la fase de diseño del modelo de datos.

Título del documento y versión 43


No se recomienda el uso de sentencias SQL que incluyan tablas temporales definidas

mediante la cláusula ‘AS’.

Se debe evitar el uso de sentencias que asignan mediante la cláusula “AS” un nombre de tabla

temporal a una subsentencia SQL incluida dentro de una sentencia SQL principal.

Evitar el uso de repetición de la operación Open / Close para un fichero a lo largo del

proceso.

Se ha de comprobar si el tratamiento verdaderamente requiere esta operatoria y tratar de evitarla

mediante el rediseño del modelo de procesos.

En sentencias que usen la opción MULTIROW, el tamaño del ROWSET nunca debe ser

superior a 200.

Por encima der de 200, la mejora en el rendimiento de las sentencias se ve considerablemente

mermado.

En sentencias que usen la opción MULTIROW, el valor del parámetro “N” de la opción FOR

“N” ROWS ha de ser <= al OCCURS de la tabla definida para recibir el ROWSET.

Se debe garantizar que todas las filas seleccionadas mediante la opción MULTIROW, tienen el

espacio necesario definido en la tabla que recibirá el ROWSET.

Si un cursor se define WHIT ROWSET POSITIONING, el FETCH correspondiente a ese cursor,

debe ser definido con la cláusula NETX ROWSET y viceversa.

La definición del cursor y el tratamiento de las filas seleccionadas por el mismo, ha de ser

concordante.

Si una sentencia está definida con la cláusula NEXT ROWSET, se debe realizar un control y

tratamiento adecuados del SQLCODE -100.

Se ha de comprobar si el ROWSET devuelto junto con el SQLCODE -100 ha devuelto alguna fila y

realizar el tratamiento adecuado para el conjunto de filas devuelto. El nº de filas realmente

devuelto, se obtiene examinado el contenido de SQLERR(3).

Todas las columnas declaradas en la SELECT de un cursor definido WITH ROWSET

POSITIONING deben ser utilizadas posteriormente en el programa.

Se debe garantizar que todas la filas seleccionadas son necesarias puesto que son usadas

posteriormente en el programa.

En sentencias INSERT definidas con opción MULTIROW, no se permite usar la cláusula NOT

ATOMIC CONTINUE ON SQLEXCEPCION.

Se debe garantizar que si el INSERT termina con error, no se ha insertado ninguna fila y todo el

ROWSET ha sido rechazado. No se permiten inserciones parciales por la dificultad de control.

En sentencias que usen la opción MULTIROW, la frecuencia del COMMIT, se debe definir en

función del número de filas afectado por cada sentencia, no del número de sentencias

ejecutado.

Cada sentencia afecta a un número de filas que viene determinado por el tamaño del ROWSET,

luego se tendrá en cuenta este dato para calcular la frecuencia del COMMIT, no solo el número de

sentencias ejecutado.

Título del documento y versión 44


En sentencias UPDATE ö DELETE definidas con opción MULTIROW, No se recomienda usar

la cláusula FOR ROW “N” para actualizar ó borrar solo la N’ésima fila del ROWSET.

Se considera una práctica de riesgo y de difícil control realizar una sentencia que solo afecte a una

fila de un ROWSET que contiene varias.

En el tratamiento de OBJETOS SEQUENCE mediante cláusulas NEXT VALUE y PREVIOUS

VALUE, se debe controlar respectivamente, el SQLCODE -359 y -845.

El control adecuado de estos códigos, garantiza la fiabilidad del valor de la secuencia obtenida y

permite tomar las acciones oportunas cuando se producen.

El uso de cursores SCROLLABLES está estrictamente prohibido en la instalación.

Se considera una práctica de riesgo el uso de este tipo de cursores y no se permite su uso.

Es obligatorio definir mediante el uso de una COPY cualquier variable de uso EXTERNAL.

El control adecuado de este tipo de variables y su uso, requiere el uso de COPY para evitar

duplicidades y uso indebido de las mismas.

Es obligatorio sustituir los módulos obsoletos por el correspondiente módulo actualizado.

Los módulos de otras aplicaciones que sean llamados desde cualquier otra aplicación, deben ser

sustituidos por la nueva versión de los mismos cuando queden obsoletos. Se debe consultar a la

aplicación propietaria, los datos del nuevo módulo que sustituye al obsoleto.

El uso de la instrucción FUNCTION se considera que afecta negativamente al rendimiento.

Se recomienda buscar una alternativa al uso de la instrucción FUNCTION debido al coste de su uso.

No se recomienda el uso de REWRITE en ficheros secuenciales. No es óptimo utilizar la

sentencia REWRITE para reemplazar registros existentes en ficheros secuenciales. Este tipo de

mantenimiento se debe realizar a través de JCL.

Definición de fichero sin FILE STATUS o FILE STATUS mal definido

Es obligatorio controlar cualquier acceso a fichero mediante el FILE-STATUS. Debe ser declarado y

tratado en PROCEDURE DIVISION.

SELECT F-ENTRADA ASSIGN TO EJEMPLO

FILE STATUS IS FS-EJEMPLO.

Donde EJEMPLO es la DDNAME correspondiente al fichero elegido. El campo FS-EJEMPLO debe

estar definido posteriormente en WORKING como un campo alfanumérico de 2 posiciones.

01 DEF-FILE-STATUS.

05 FS-EJEMPLO PIC X(2) VALUE '00'.

El control correcto del FILE-STATUS tiene como objetivo el minimizar posibles ABENDS del

programa.

La cláusula BLOCK CONTAINS debe estar definida como BLOCK CONTAINS 0 RECORDS.

La cláusula BLOCK CONTAINS debe tener definido siempre 0 RECORDS para dejar al JCL la gestión

del bloque óptimo según el tipo de dispositivo.

No se permite la cláusula LINAGE.

No es óptimo utilizar la cláusula LINAGE en la definición de ficheros para especificar el tamaño de

una página lógica. El salto de página debe controlarse mediante caracteres ASA.

Título del documento y versión 45


No permitida la cláusula OPTIONAL en la FILE CONTROL.

No se debe utilizar la cláusula OPTIONAL en la FD de definición de ficheros. Un fichero tratado por

un programa debe existir en el momento de la ejecución.

En la sentencia READ usa el registro 01 de la FD o una variable WORKING con distinta

longitud.

No se puede utilizar nunca la definición de registro REG-ENTRADA de la FILE SECTION para leer,

hay que utilizar un registro definido en WORKING con idéntica longitud (se admite mayor), y con la

definición de campos necesaria.

En SEARCH debe controlarse la cláusula AT END.

Siempre que se utilice la sentencia SEARCH tiene que controlarse la opción AT END de fin de

búsqueda.

No utilizar la cláusula NOREWIND en ficheros secuenciales.

Si un programa utiliza entrada mediante cinta, y ésta no puede ser cargada a disco previamente, no

se debe utilizar la opción NOREWIND.

Título del documento y versión 46

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!