0% encontró este documento útil (0 votos)
409 vistas35 páginas

Manejo de ABEND en CICS

El documento describe los principales componentes y comandos del sistema CICS/VS. CICS/VS controla tareas, programas y terminales mediante una serie de tablas y módulos de gestión. El documento explica comandos como RETURN, LINK, XCTL, SEND, RECEIVE, WAIT y otros para controlar programas, terminales y ficheros en CICS/VS. También describe funciones básicas como gestión de datos transitorios y memoria temporal.

Cargado por

probe13
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
409 vistas35 páginas

Manejo de ABEND en CICS

El documento describe los principales componentes y comandos del sistema CICS/VS. CICS/VS controla tareas, programas y terminales mediante una serie de tablas y módulos de gestión. El documento explica comandos como RETURN, LINK, XCTL, SEND, RECEIVE, WAIT y otros para controlar programas, terminales y ficheros en CICS/VS. También describe funciones básicas como gestión de datos transitorios y memoria temporal.

Cargado por

probe13
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd

CCCCCCCC

CCCCCCCC
CC
CC
CCCCCCCC
CCCCCCCC
IIIIIIII
IIIIIIII
II
II
II
IIIIIIII
CCCCCCCC
CCCCCCCC
CC
CC
CCCCCCCC
CCCCCCCC

Begoa Ramos Barrios

SSSSSSSSS
SSS
SSSSSSS
SSSSSSS
SSS
SSSSSSSSS

I
INDICE

CICS / VS.
Control tareas. Control programas ...................... 1
COMPONENTES DEL CICS/VS.
Modulos de gestion del CICS/VS ....................... 2

Tablas del
Tabla
Tabla
Tabla
Tabla
Tabla

CICS/VS .....................................
de control de terminales (TCT) ............
de control de programas (PCT) .............
de programas de procesos (PPT) ............
de control de ficheros (FCT) ..............
de control de destinos (DCT) ..............

3
3
3
3
3
3

CONTROL DE PROGRAMAS DEL CICS.


Return ................................................... 3
Link ..................................................... 4
Xctl ..................................................... 4
CONTROL DE TERMINALES DEL CICS.
Send ..................................................... 5
Receive .................................................. 5
Wait ..................................................... 6
CONTROL DE FICHEROS DEL CICS.
Read .....................................................
Write ....................................................
Update ...................................................
Delete ...................................................
Unlock ...................................................

6
7
7
8
8

ACCESO SECUENCIAL A REGISTROS.


Browse / Starbr ..........................................
Readnext .................................................
Readprev .................................................
Endbr ....................................................

9
10
10
11

II
INDICE

GESTION DE DATOS.
Gestion de
Datos
Datos
Gestion de

datos transitorios .........................


transitorios intraparticion .................
transitorios extraparticion .................
memoria temporal ...........................

11
12
12
12

GESTION DE DATOS TRANSITORIOS.


Escribir datos transitorios ............................ 13
Leer datos transitorios ................................ 14

Borrar datos transitorios .............................. 14


GESTION DE MEMORIA TEMPORAL.
Escribir memoria temporal .............................. 15
Leer memoria temporal .................................. 16
Borrar memoria temporal ................................ 16
APLICACION DE COMANDOS CICS.
Comando
Comando
Comando
Comando
Comando

Syncpoint .......................................
Start ...........................................
Abend ...........................................
Address .........................................
Assign ..........................................

17
17
18
18
18

SOPORTE BASICO DE TRANSFORMACION DE DATOS (BMS).


Componentes de las operaciones del BMS ...............
Mapas fisicos ......................................
Mapas de descripcion simbolica ...................
Macros de definicion de mapas fisicos ...............
Macro de definicion de conjunto de mapas ......
Macro de definicion de mapas ....................
Macro de definicion de campos ...................
Fin de definicion de conjunto de mapas ........
Descripciones de mapas simbolicos (DSECTS) ...........
Receive map ........................................
Send map ...........................................
Condiciones que se pueden activar ...............

19
19
19
19
19
20
20
20
20
21
21
22

III
INDICE

C.I.C.S.
Transaccion ..............................................
Monitor DB/DC ............................................
Multiprogramacion ........................................
Modularidad y tablas ...................................
Modulos de gestion .....................................
Programacion con comandos ..............................
Handle condition ........................................
Como se arranca una transaccion ......................
Funcion terminal control ...............................
Funcion file control ...................................

23
23
23
23
24
24
24
25
25
26

NORMATIVA PARA EL EMPLEO DE MAPAS EN TRANSACCIONES CICS.

Empleo de mapas en transacciones .....................


Descripcion de una operacion de salida ..............
Parametros de control del terminal ...................
Infor. de la situacion de los datos a enviar .....
Como realizar la descrip. simbolica de datos .......
Forma de realizar la descrip. simbolica de datos ..
Corriente de salida ...............................
Limpieza del area de descripcion simbolica ..........

28
29
30
30
30
30
33
34

CAMBIOS EN PROGRAMAS CICS PARA CONVERTIR A COBOL II.


Obtencion de la fecha del sistema ................... 35
Instruccion ADDRESS ..................................... 35
Instruccion GETMAIN ..................................... 36

1
*********************
*
*
* C I C S / V S *
*
*
*********************

_________________________________________
| .
C T R L T A R E A S
. |
| ._______________________________. |
| | --------------------------- | C |
_________
| C | | PROGRAMAS ACTUALIZACION | | T |
| BASES |
| T | |
DE FICHEROS
| | R |
-------------| DE |----| R | --------------------------- | L |----| TERMINALES |
| DATOS |
| L |
| |
|____________|
|_______|
| | --------------------------- | T |
| F | |
OTROS
| | E |
| I | |
PROGRAMAS
| | R |
| C | ___________________________ | M |
| H |
| I |
| E | --------------------------- | N |
| R | |
PROGRAMAS DE
| | A |
| O | |
APLICACION
| | L |
| S | ___________________________ | E |
| ._______________________________. S |
| . C T R L P R O G R A M A S
. |
|_______________________________________|
|
|
|
________|________
| BIBLIOTECA DE |
| PROGRAMAS |
|_______________|

2
*****************************
* COMPONENTES DEL CICS/VS *
*****************************

----------------------|
MODULOS DE
|
|
GESTION
|
|
DEL CICS/VS
|
|_____________________|
|
|
|
|
|
|
--------------------------------------------|
TABLAS
|
|
PROGRAMAS
|
|
DEL CICS/VS
|
|
DEL CICS/VS
|
|_____________________|
|_____________________|

MODULOS DE GESTION DEL CICS/VS


==============================

- Control de tareas (KC).


- Control de memoria (SC) - Controla la memoria virtual de
la particion CICS/VS.
- Control de programas (PC).
- Control de terminales (TC).
- Soporte basico de transformacion (BMS) - Codificacion/Decodificacion.
- Control de ficheros (FC) - Soporta solo acceso directo.
- Control de datos transitorios (TD) - Secuencial (Colas intrapar y extraparticion).
- Control de memoria temporal (TS).
- Control de tiempos. - Intervalos (IC).
- Control de volcados (DC).

3
TABLAS DEL CICS/VS
==================
- Tabla de control de terminales (TCT) - Define las caracteristicas de cada terminal mediante entradas de
la TCT. Cada terminal tiene una entrada en
esta tabla (TCTTE).

- Tabla de control de programas (PCT) - Relaciona cada codigo de transaccion con un programa.
- Tabla de programas de procesos (PPT) - Tiene una entrada
por cada programa usado en CICS/VS. Cada entrada tiene informacion sobre la posicion de un
programa.
- Tabla de control de ficheros (FCT) - Tiene una entrada por
cada fichero usado en CICS/VS. Cada entrada
guarda la informacion de DTF/DCB/ACB.
- Tabla de control de destinos (DCT) - Suministra al CICS/VS
la informacion sobre los conjuntos de datos utilizados por datos transitorios.

************************************
* CONTROL DE PROGRAMAS DEL CICS *
************************************

============
= RETURN =
============
FUNCION: Dar control al CICS. El programa se termina y se
------descarga.
FORMATO:
-------

EXEC CICS RETURN |TRANSID ('CODIGO-TRANSACCION')| *1


|COMMAREA(DATA-AREA)|
*2
|LENGTH (VALOR-DATOS)|
*3
END-EXEC.

*1 Se trata de dar un control temporal al CICS. Cuando el


operador teclee intro, se carga la transaccion que se
indica (4 digitos).

4
*2 Nombre de dato definido en la Working.
*3 Longitud de la commarea.

===========
= LINK =
===========

FUNCION: (Equivalente a CALL en BATCH). Dar control a una


------- rutina o programa a nivel inferior. Al final del
programa llamado debe ponerse GOBACK. Cuando termina
de ejecutarse se a a la sentencia siguiente del
programa principal.
FORMATO:
-------

EXEC CICS LINK PROGRAM ('NAME')


|COMMAREA(DATA-AREA)|
|LENGTH (DATA-VALUE)|
END-EXEC.

*1

*1 Area de paso o de E/S. Ejem . Comprobar numeros tecleados


va siempre con el parametro LENGTH.

===========
= XCTL =
===========
FUNCION: Dar control a un programa al mismo nivel. El pro------- grama llamante se descarga y se carga el programa
llamado. Se encadenan programas y no se devuelve el
control al programa llamante a menos que se haga
otro XCTL.
FORMATO:
-------

EXEC CICS XCTL PROGRAM ('NAME')


|COMMAREA(DATA-AREA)|
|LENGTH (DATA-VALUE)|
END-EXEC.

*1

CONDICIONES QUE SE PUEDEN ACTIVAR :


=================================
INVREQ

: Peticion Invalida. - Se especifico un TRANSID para


una transaccion no asociada con un terminal.

PRMIDERR : Se ha especificado un nombre de programa que no


esta en la PPT, o que no esta disponible.

5
************************************
* CONTROL DE TERMINALES DEL CICS *
************************************

==================
= SEND
=
==================

FUNCION: Envia datos a otro terminal.


------FORMATO:
-------

EXEC CICS SEND FROM (AREA-DATOS)


LENGTH (VALOR-DATOS)
|WAIT|
END-EXEC.

*1
*2
*3

*1 - Area de memoria donde se conlocara el mensaje; puede


ser cualquier area definida en memoria.
*2 - Longitud del mensaje que se envia.
*3 - Asegura que la salida se ha completado antes de permitir otro SEND o RECEIVE.

===================
= RECEIVE
=
===================
FUNCION: Recibe datos desde otro terminal.
------FORMATO:
-------

EXEC CICS RECEIVE INTO (AREA-DATOS)


LENGTH (VALOR-DATOS)
END-EXEC.

*1
*2

*1 - Area de memoria desde la que se cogera el mensaje;


puede ser cualquier area definida en memoria.
*2 - Longitud del mensaje.

6
=============
= WAIT
=
=============
FUNCION: Permite hacer proceso intermedio durante un WAIT,
------con lo que conseguimos solapar la E/S de ficheros con la E/S de terminales.
FORMATO:
-------

EXEC CICS WAIT TERMINAL


END-EXEC.

**********************************
* CONTROL DE FICHEROS DEL CICS *

**********************************

==========
= READ =
==========
FUNCION: Leer un registro en un fichero.
------FORMATO:
-------

EXEC CICS READ DATASET (NOMBRE)


*1
INTO (AREA-DATOS)
*2
|LENGTH (VALOR-DATOS)|
*3
RIDFLD (AREA-DATOS)
*4
|KEYLENGTH (VALOR-DATOS) GENERIC| *5
|GTEQ / EQUAL|
*6
|UPDATE|
*7
|RBA / RRN|
*8
END-EXEC.

*1 Nombre del fichero definido para el CICS en la FCT.


*2 Nombre de dato definido en la Working.
*3 Si se omite se lee entero.
*4 Clave del registro. Obligatorio para ficheros indexados.
*5 Longitud de la clave, para leer por clave generica.
*6 Mayor o igual, igual. Si se omite asume y busca igual.
*7 Se pone si se quiere leer para modificar el registro.
No suelta el control hasta que no se haga el REWRITE.

7
*8 RBA : Se lee un registro por su direccion en el fichero
RRN : Se lee un registro por la posicion relativa que
ocupa. Se utiliza con ficheros relativos (El contenido de la clave se identifica con la posicion
relativa dentro del fichero).

==============
= WRITE
=
==============
FUNCION: Escribir un registro en un fichero.
------FORMATO:
-------

EXEC CICS WRITE DATASET (NOMBRE)


FROM (AREA-DATOS)

|LENGTH (VALOR-DATOS)|
RIDFLD (AREA-DATOS)
|RBA / RRN|
END-EXEC.

*1

*1 Numero, longitud del registro que se quiere escribir.

================
= UPDATE
=
================
FUNCION: Actualizar un registro. Para ensayar este mandato,
------antes ha habido que dar un mandato READ con opcion UNDATE, el cual bloquea este registro para
otras peticiones. Al terminar el mandato REWRITE,
es liberado el registro. Si por alguna razon no
se ensaya el mandato REWRITE, es preciso ensayar
un mandato UNLOCK para liberar el registro.
FORMATO:
-------

EXEC CICS REWRITE DATASET (NOMBRE)


FROM (AREA-DATOS)
|LENGTH (VALOR-DATOS)|
END-EXEC.

8
============
= DELETE =
============
FUNCION: Borrar un registro en un fichero.
------FORMATO:
-------

EXEC CICS DELETE DATASET (NOMBRE)


RIDFLD (AREA-DATOS)
*1
|KEYLENGTH (VALOR-DATOS) GENERIC|
END-EXEC.

*1 Si no se pone hay que hacer primero una READ con UPDATE.

=============
= UNLOCK =
=============
FUNCION: Libera el control exclusivo creado por una READ
------con opcion UPDATE.
FORMATO:

EXEC CICS UNLOCK DATASET (NOMBRE)

END-EXEC.

CONDICIONES QUE SE PUEDEN ACTIVAR :


=================================
DSIDER

: Dataset identification error. Se manda leer desde un


fichero no identificado en las tablas del CICS.

INVREQ

: Se ha
UPDATE.
con un
Tambien
UPDATE

ILLOGIC

: Ejemplo: Se hace una lectura, da not open, y sin


abrir se intenta volver a leer. Viene de un error anterior.

NOTFND

: Registro no encontrado.

hecho un REWRITE sin una previa READ con


Se puede poner como una HANDLE-CONDITION,
mandato a una rutina de error.
se activa cuando se hacen dos READ con
sin una REWRITE en medio.

9
DUPREC

: Intento escribir en un fichero indexado y la


clave ya existe.

ENDFILE

: Fin de fichero durante un BROWSE.

LENGERR

: Hay discordancia entre la longitud dada en LENGHT


y la longitud del registro que se va a leer.

DUPKEY

: Definimos un indice alternativo para acceder a


un fichero. Avisa de que hay clave duplicada.

IOERR

: Error de E/S en disco.

NOSPACE

: No hay espacio para aadir registros.

NOTOPEN

: Se va a leer por primera vez y ese fichero


esta cerrado.

***********************************

* ACCESO SECUENCIAL A REGISTROS *


***********************************

=====================
= BROWSE = STARBR =
=====================
FUNCION: Posicionarse en un registro determinado de un fi------chero.
FORMATO:
-------

EXEC CICS STARBR DATASET (NOMBRE)


RIDFLD (AREA-DATOS)
|KEYLENGTH (VALOR-DATOS) GENERIC|
|GTEQ / EQUAL|
*1
|RBA / RRN|
END-EXEC.

*1 Por defecto asume GTEQ.

10
====================
= READNEXT
=
====================
FUNCION: Leer hacia adelante despues de posicionarse en un
------registro con BROWSE.
FORMATO:
-------

EXEC CICS READNEXT DATASET (NOMBRE)


INTO (AREA-DATOS)
|LENGTH (AREA-DATOS)|
RIDFLD (AREA-DATOS)
END-EXEC.

*1
*2
*3

*1 Nombre del campo de la working donde quiero almacenar


los datos.
*2 Longitud del campo que quiero leer. Asume la longitud
del registro.
*3 Variable de salida. Tiene la clave que ha leido.

===================
= READPREV
=
===================
FUNCION: Leer o recuperar hacia atras despues de posicionar------- nos en un registro con BROWSE.

FORMATO:
-------

EXEC CICS READPREV DATASET (NOMBRE)


INTO (AREA-DATOS)
|LENGTH (AREA-DATOS)|
RIDFLD (AREA-DATOS)
END-EXEC.

*1
*2
*3

*1 Nombre del campo de la Working donde quiero almacenar


los datos.
*2 Longitud del campo que quiero leer. Asume la longitud
del registro.
*3 Variable de salida. Tiene la clave que ha leido.

11
=============
= ENDBR
=
=============
FUNCION: Finalizar una BROWSE en un fichero. Quita el pun------tero.
FORMATO:
-------

EXEC CICS ENDBR DATASET ('NAME')


END-EXEC.

**********************
* GESTION DE DATOS *
**********************
Hay veces en que hay que guardar datos en un estado
intermedio, como :
- Mensajes a un terminal que esta ocupado.
- Datos creados por una tarea y que van a ser
utilizados por otra tarea.
El CICS/VS proporciona dos caminos para tratar estos
datos :
1.- Gestion de datos transitorios (TD).
2.- Gestion de memoria temporal (TS).

1.- GESTION DE DATOS TRANSITORIOS


*********************************
Los datos transitorios son una facilidad generalizada de
colas que permite que los datos se dirijan (o se adquie-

ran) a (o desde) un destino simbolico predefinido.


Habra varias colas de datos, una para cada destino diferente. No se mezclaran clases diferentes de datos.
Cada ITEM de datos solo puede ser recuperado una vez.

12
Hay dos formas de datos transitorios :
1.- Datos transitorios intraparticion.- Colas de datos
creadas y leidas por tareas de la particion CICS/VS
2.- Datos transitorios extraparticion.- Son colas de datos :
- Creadas fuera del CICS, y procesadas dentro del CICS
- Creadas dentro del CICS, y procesadas fuera del CICS

1.1.- DATOS TRANSITORIOS INTRAPARTICION


***************************************
Se almacenan en disco
tinos intraparticion. Cada
por un codigo de cuatro
en la tabla de control
longitud variable.

(DAM) y las colas se llaman desdestino debe estar identificado


caracteres que estara contenido
de destinos. Los registros son de

Un destino intraparticion se puede usar por una o mas


tareas al mismo tiempo. Mas tarde empezara una tarea a recuperar los datos de la cola.

1.2.- DATOS TRANSITORIOS EXTRAPARTICION


***************************************
Son conjuntos de datos secuenciales, en cualquier dispositivo secuencial. Los datos son registros secuenciales de
longitud
|FIJA
| Y |BLOQUEADOS |
|VARIABLE| |DESBLOQUEADOS|

2.- GESTION DE MEMORIA TEMPORAL


*******************************
Es una facilidad de "Cuaderno de Notas", para almacenar
y precuperar datos. Los datos pueden ser almacenados por

una transaccion, y recuperados por otras, utilizando un nombre unico, asignado por la tarea de origen.
Los datos almacenados por la memoria temporal, se pueden
recuperar mas de una vez.

13
La memoria temporal no se libera automaticamente una vez
recuperados los datos; debemos liberarla nosotros, y se libera la cola completa.
Es posible almacenar varios ITEMS bajo un nombre simbolico creando una cola de memoria temporal. Estos datos se
pueden recuperar:
- Secuencialmente.
- Directamente.- Especificando el numero de entrada
del ITEM dentro de la cola.

***********************************
* GESTION DE DATOS TRANSITORIOS *
***********************************

=================================
= ESCRIBIR DATOS TRANSITORIOS =
=================================
FUNCION: Escribe en una cola de datos transitorios.
------FORMATO:
-------

EXEC CICS WRITEQ TD QUEUE (NOMBRE)


FROM (AREA-DATOS)
|LENGTH (VALOR-DATOS)|
END-EXEC.

*1
*2
*3

*1 Nombre simbolico de destino de los datos tal como esta


definido en la DCT.
*2 Area del programa desde la que se van a obtener los
datos.
*3 Longitud de los datos que se van a escribir.

14

=============================
= LEER DATOS TRANSITORIOS =
=============================
FUNCION: Lee en una cola de datos transitorios.
------FORMATO:
-------

EXEC CICS READQ TD QUEUE (NOMBRE)


INTO (AREA-DATOS)
|LENGTH (VALOR-DATOS)|
END-EXEC.

*1
*2
*3

*1 Nombre simbolico de origen de los datos tal como esta


definido en la DCT.
*2 Area del programa desde la que se van a obtener los
datos.
*3 Longitud de los datos que se van a escribir.

===============================
= BORRAR DATOS TRANSITORIOS =
===============================
FUNCION: Solo se utiliza en las colas intraparticion, y bor------ra todos los datos asociados con un destino. Como consecuencia de este mandato, la memoria se
libera aunque los datos no se hayan leido.
FORMATO:
-------

EXEC CICS DELETEQ TD QUEUE (NOMBRE)


END-EXEC.

CONDICIONES QUE SE PUEDEN ACTIVAR :


=================================
QZERO

: Cola vacia en la READQ TD.

LENGERR

: La longitud de los datos es mayor que el campo de entrada.

NOSPACE

: No hay espacio para aadir mas registros.

NOTOPEN

: Un destina de TD esta cerrado.

QBUSI

: Se intenta una READQ TD mientras otra esta escribiendo en esa cola.

15
QIDERR

: No hay entrada en la DCT para una cola de TD

referenciada.
INVREQ

: La longitud de los datos es cero o excede la


longitud del chwh intervalo de control.

*********************************
* GESTION DE MEMORIA TEMPORAL *
*********************************

===============================
= ESCRIBIR MEMORIA TEMPORAL =
===============================
FUNCION: Escribe en una cola de memoria temporal.
------FORMATO:
-------

EXEC CICS WRITEQ TS QUEUE (NOMBRE)


FROM (AREA-DATOS)
LENGTH (VALOR-DATOS)
|ITEM (AREA-DATOS)|REWRITE||
|MAIN / AUXILIARY|
END-EXEC.

*1
*2
*3
*4
*5

*1 Nombre simbolico de destino de los datos tal como esta


definido en la DCT.
*2 Area del programa desde la que se van a obtener los
datos.
*3 Longitud de los datos que se van a escribir.
*4 ITEM.- En el area de datos se pondra el numero de registro que ha sido escrito. Empieza por uno, y se
incrementa de uno en uno.
REWRITE.- Si queremos actualizar un registro, usamos esta
opcion, especificando en ITEM el numero de registro
que queremos actualizar.
*5 MAIN.-Memoria principal.
AUXILIARY.- DASD.

16
===========================
= LEER MEMORIA TEMPORAL =
===========================
FUNCION: Lee en una cola de memoria temporal.

------FORMATO:
-------

EXEC CICS READQ TS QUEUE (NOMBRE)


INTO (AREA-DATOS)
LENGTH (VALOR-DATOS)
|ITEM (AREA-DATOS) / NEXT|
END-EXEC.

*1
*2
*3
*4

*1 Nombre simbolico de origen de los datos tal como esta


definido en la DCT.
*2 Area del programa desde la que se van a obtener los
datos.
*3 Longitud de los datos que se van a escribir.
*4 ITEM.- En el area de datos se pondre el numero de registros que se va a leer.
NEXT.- Se va a recuperar el siguiente registro logico de
la cola, dentro de la tares.

=============================
= BORRAR MEMORIA TEMPORAL =
=============================
FUNCION: Libeta la cola de memoria temporal, y todos los
------datos asociados a ella se borraran.
FORMATO:
-------

EXEC CICS DELETEQ TS QUEUE (NOMBRE)


END-EXEC.

CONDICIONES QUE SE PUEDEN ACTIVAR :


=================================
ITEMERR

: El ITEM utilizado en la READQ TS o una WRITEQ


TS esta fuera de los limites.

LENGERR

: La longitud de los datos es mayor que el campo de entrada.

NOSPACE

: No hay espacio para aadir mas registros.

17
IOERR

: Irrecuperable error de entrada/salida para TS.

QIDERR

: No esite una cola TS con ese nombre.

INVREQ

: La longitud de los datos es cero o excede la


longitud del intervalo de control.

*********************************
* AMPLIACION DE COMANDOS CICS *
*********************************

=======================
= COMANDO SYNCPOINT =
=======================
FUNCION: Punto de sincronismo. Todas las actualizaciones hechas
------desde el comienzo de la tarea hasta la ejecucion
del SYNCPOINT no se pierden si despues de el ocurre :
-Terminacion anormal de la tarea.
-Caida del CICS.
FORMATO:
-------

EXEC SYNCPOINT
END-EXEC.

===================
= COMANDO START =
===================
FUNCION: Arranca desde una tarea una transaccion contra otro
-------- terminal pasando los datos necesarios si lo desea
FORMATO:
-------

EXEC CICS START TRANSID (TRANSACCION)


|FROM (AREA-DATOS)|
|LENGTH (VALOR-DATOS)|
TERMID (ID-TERMINAL)
END-EXEC.

18
===================
= COMANDO ABEND =
===================
FUNCION: Sirve para terminar anormalmente una tarea. La me------moria asociada a esta tarea es liberada, y opcionalmente un DUMP con el codigo indicado en
ABCODE es obtenido de la tarea.
FORMATO:
-------

EXEC CICS ABEND |ABCODE (CODIGO-DE-ABEND)|


END-EXEC.

=====================
= COMANDO ADDRESS =
=====================
FUNCION: Sirve para tener acceso a las determinadas areas.
------FORMATO:
-------

EXEC CICS ADDRESS |CSA (PTR-CSA)|


|CWA (PTR-CWA)|
|TWA (PTR-TWA)|
|TCTUA (PTR-TCTUA)|
END-EXEC.

====================
= COMANDO ASSIGN =
====================
FUNCION: Sirve para asignar areas de datos.
------FORMATO:
-------

EXEC CICS ASSIGN TWALENG (AREA-DATOS-1)


CWALENG (AREA-DATOS-2)
OPID (AREA-DATOS-3) .....ID-OPERADOR
END-EXEC.

19
*****************************************************
* SOPORTE BASICO DE TRANSFORMACION DE DATOS (BMS) *
*****************************************************

COMPONENTES DE LAS OPERACIONES DEL BMS


**************************************

MAPAS FISICOS
=============
Contienen informacion sobre :
- Posiciones de los campos.
- Atributos.
- Caracteristicas dependientes de los disposivos.

- Datos de cabecera e iniciales.

MAPAS DE DESCRIPCION SIMBOLICA


==============================
Describen las areas de entrada/salida tal como son vistas por los programas de aplicacion.

MACROS DE DEFINICION DE MAPAS FISICOS


*************************************

MACRO DE DEFINICION DE CONJUNTO DE MAPAS


========================================
Nombre-Conjunto-De-Mapas DFHMSD
TYPE = MAP / FINAL
|,MODE = IN / OUT / INOUT|
|,TERM = TIPO-DE-TERMINAL|
|,LANG = COBOL / ASM / PL1|
|,CTLR = (|PRINT| |,FREEKB| |,ALARM| |,FRSET|)|
|,DATA = FIELD / BLOCK|

20
MACRO DE DEFINICION DE MAPAS
============================
Nombre-De-Mapa

DFHMDI
|SIZE = (LINEA,COLUMNA)
|,LINE = NUMERO / NEXT / SAME|
|,COLUMN = NUMERO / NEXT / SAME|
|,JUSTIFY = (|LEFT / RIGHT| |,FIRST / LAST|)|
|,TIOAPFX = YES /NO|
|,DATA = FIELD / BLOCK|

MACRO DE DEFINICION DE CAMPOS


=============================
|NOMBRE-DE-CAMPO| DFHMDF
|,POS = NUMERO / (LINEA,COLUMNA)|
|ATTRB = (|ASKIP / PROT / UNPROT| |,NUM|
|,BTR / NORM / DRK| |,DET| |,IC| |,FSET|)|
|,LENGTH = NUMERO|

|,JUSTIFY = (|LEFT / RIGHT| |,BLANK / ZERO|)|


|,INITIAL = 'CUALQUIER INFORMACION USUARIO'|
|,GPRNAME = NOMBRE-GRUPO|
|,OCCURS = NUMERO|
|,PICIN = 'VALOR'|
|,PICOUT = 'VALOR'|

FIN DE DEFINICION DE CONJUNTO DE MAPAS


======================================
DFHMSD

TYPE = FINAL

DESCRIPCIONES DE MAPAS SIMBOLICOS (DSECTS)


******************************************
Nombre-Conjunto-De-Mapas DFHMSD
TYPE = DSECT
|,BASE = NOMBRE|
|,TIOAPFX = YES / NO|
|,STORAGE = AUTO|
Los nombres de los campos en las DSECTC de entrada
tienen el sufijo "I", y en las de salida el sufijo "O".

21
==================
= RECEIVE MAP =
==================
FUNCION: Recibe un mapa.
------FORMATO: EXEC CICS RECEIVE MAP (NOMBRE)
*1
------|MAPSET (NOMBRE)|
*2
|FROM (AREA-DATOS)| |LENGTH (VALOR)| *3
|TERMINAL |ASIS||
*4
END-EXEC.
*1 - Nombre del mapa.
*2 - Nombre del conjunto de mapas.
*3 - Especifica que los datos proceden de otra area del
programa, asi como su longitud.
*4 - Los datos se provienen de un terminal.

=============
= SEND MAP =
=============
FUNCION: Envia un mapa.
------FORMATO:
-------

EXEC CICS SEND MAP (NOMBRE)


*1
|MAPSET (NOMBRE)|
*2
|TERMINAL |WAIT||
*3
|FROM (AREA-DATOS)| |LENGTH (VALOR)| *4
|DATAONLY / MAPONLY|
*5
END-EXEC.

*1 - Nombre del mapa.


*2 - Nombre del conjunto de mapas.
*3 - Los datos se envian a un terminal.
*4 - Area definida en la aplicacion desde la que se van a
transformar los datos, asi como su longitud.
*5 - DATAONLY.- Solo se van a escribir los datos del programa.
- MAPONLY.- Solo se van a escribir los datos por defecto del mapa.

22
CONDICIONES QUE SE PUEDEN ACTIVAR :
=================================
MAPFAIL

: Los datos tienen longitud cero, o entrada sin


formato.

INVMPSZ

: El mapa especificado es demasiado ancho para el


area de representacion de la pantalla.

23
=========
C.I.C.S
=========

* TRANSACCION.

----------Es uno o varios programas que se van a ejecutar como resultado


de una peticion. Puede tener asociados varios programas, en principio, el programa esta asociado a una unica transaccion y de esta
se puede arrancar otra transaccion.

* MONITOR DB/DC.
------------Monitor de teleproceso con base de datos, encargado de comunicarnos con el Host y acceder a los datos atraves de funciones. El
cics permite dar de alta nuevos terminales sin modificar el programa que envia el mensaje.

* MULTIPROGRAMACION.
----------------La multiprogramacion reparte el tiempo de CPU entre varios
programas, pero en cada instante hay un solo programa en la CPU.
Multitasking : (tareas)
Multihreading : Puede haber varios seores ejecutando el mismo
programa a la vez.

* MODULARIDAD Y TABLAS.
-------------------Para el ordenador el cics es un unico Job, es el solo. El
cics ejecuta programas de usuario, tiene tablas y es una coleccion
de programas.

24
* MODULOS DE GESTION.
-----------------KCP
SCP
TCP
FCP
TDP
PCP

:
:
:
:
:
:

mira como avanza cada tarea,...


antes de meter un programa en memoria, mirara se cabe.
mensajes.
read y write se pueden sustituir en cics.
programas que circulan de un programa a otro.
mira si el programa esta en memoria cargado o no.

Para todo esto utilizan las tablas de control.

* PROGRAMACION CON COMANDOS.


------------------------EXEC CICS
funcion argumento
END-EXEC
-

valor-de-datos : variable cobol o una constante.


area-de-datos : variable cobol.
apuntador : direccion a la que hay que ir a buscar la variable.
nombre : literal, nombre de variable.
etiqueta : nombre etiqueta en cobol.

Cuando hacemos una peticion a cics, nos dara una respuesta,


como el sqlcode en DB2, pero hay dos opciones:
- El equivalente al sqlcode, EIBRCODE.
- Mediante la funcion HANDLE CONDITION.

* HANDLE CONDITION.
---------------EXEC CICS HANDLE CONDITON
condicion(etiqueta)
condicion(etiqueta)
END-EXEC.
Establece a que etiqueta se va a saltar en caso de tener un
error determinado.
Los errores en vez de darlos con numeros los
En la HANDLE CONDITION se le dice "para todo
encuentras con un 'map file' te vas a 'esta
sucesivamente". No es muy recomendable porque
tructura JAKCSON.

da con literales.
el programa si te
etiqueta', y asi
parte toda la es-

25
Si se pone la HANDLE CONDITION, no se puede usar el EIBRCODE.
Se pueden poner varias HANDLE CONDITION en el mismo programa.
Cuando queremos anular una condicion de la HANDLE CONDITION ponemos la condicion pero sin etiqueta.

* COMO SE ARRANCA UNA TRANSACCION.


------------------------------Llega un identificador de transaccion tecleado en un terminal.

El TCP (programa de control de terminales) y usando la tabla TCT


reconoce los datos de entrada del terminal. SCP (programa de
control de memoria) autoriza el almacenamiento de estos datos en
en la TIOA (terminal input output area). Una vez autorizado el
almacenamiento, el TCP coloca los datos ahi y coloca un puntero
en la zona de la TCT que le corresponde a ese terminal. Si no hay
tarea asociada a ese terminal, el TCP pasa control al KCP (programa de control de tareas), quien reconoce los datos de TIOA. El SCP
autoriza el almacenamiento de esa tarea en el TCA y el KCP prepara
los datos para esta tarea. El KCP atraves de PCT (tabla de control
de programas) busca el programa asociado con esa transaccion. Si
el PPT dice que no esta pasa control a PCP (programa de control de
programas) que obtiene el programa de su libreria LOAD y lo coloca
en memoria y entonces el KCP pasa control al programa de aplicacion.

* FUNCION TERMINAL CONTROL.


-----------------------EXEC CICS SEND
FROM(area-datos)
LENGTH(valor-datos)
{WAIT}
END-EXEC.
Su funcion es la de envio de datos al terminal.
EXEC CICS
RETURN
END-EXEC.
Una de las funciones es terminar la transaccion y devolver
control al cics. Para su uso basico no necesita ningun parametro.
Despues del RETURN siempre tiene que ir un GOBACK.

26
EXEC CICS RECEIVE
INTO(area-datos)
LENGTH(valor-datos)
END-EXEC.
Recepciona datos desde un terminal.
EXEC CICS HANDLE AID
opcion (etiqueta)
opcion (etiqueta)
END-EXEC.
Hace lo mismo que la HANDLE CONDITION pero en vez de manejar
condiciones de error, son teclas que nosotros damos desde el
terminal. Podemos evitar el quedarnos en un bucle. Para ver la
tecla que nos han pulsado podemos utilizar tambien la funcion

EIBAID. Se suele hacer por medio de una copy .

* FUNCION FILE CONTROL.


-------------------El cics va a controlar los ficheros, no tendremos que abrirlos
ni cerrarlos, para eso utilizamos las funciones cics.
Los VSAM son de 3 tipos:
- KSDS : (KEY SECUENCIED DATA SET)
- ESDS : (ENTRY SECUENCIED DATA SET)
- RRDS : (RELATIVE REGISTER DATA SET)
VSAM, conjunto de programas que componen lo que se denomina
metodo de acceso que nos proporcionan unas ciertas facilidades
para acceder a los datos. Es a los ficheros lo que DB2 a las
tablas. Maneja tres tipos de ficheros:
- KSDS , son los ficheros ordenados por clave. Hay una clave principal por la que se ordenan los ficheros
fisicamente, reservando parte del espacio libre por
necesidades de reorganizacion.
- ESDS, ficheros secuenciales ordenados por el orden de
llegada, parecidos a los secuenciales pero con la
posibilidad de definir claves secuendarias.
- RRDS, funcionan conociendo la posicion relativa del
registro dentro del fichero, acceso directo.

27
EXEC CICS
READ DATASET(nombre)
INTO(area-datos)
RIDFLD(area-datos)
{KEYLENGTH(valor-datos)}
{UPDATE}
{GTEQ|EQUAL}
{LENGTH(valor-datos)}

*1
*2
*3
*4
*5
*6

END-EXEC.
Lectura de un conjunto de datos de acceso directo.
*1

nombre del fichero en CICS definido en la FCT.

*2

donde queremos que nos deje los datos.

*3

contiene la clave que queremos leer. Hay que mover a este


campo la clave antes de leer.

*5

el registro que vamos a leer sa va a quedar pillado para


nosotros, se queda en exclusiva hasta que lo escriba.

EXEC CICS REWRITE


DATASET(nombre)
FROM(area-datos)
END-EXEC.

*2

Se usa para actualizar un registro existente en un conjunto de


datos.
*2

especifica el area de datos desde el que se desea actualizar


el registro.
Las operaciones a seguir son:
- Lanzar un comando READ con opcion UPDATE.
- Realizar los datos necesarios en el area de datos.
- Ensayar un comando REWRITE.
- Si el comando REWRITE falla, sa debera ejecutar un comando
UNLOCK, para liberar el registro bloqueado.
EXEC CICS WRITE
DATASET(nombre)
FROM(area-datos)
RIDFLD(area-datos)
{MASSINSERT}
END-EXEC.
Sirve para aadir un nuevo registro en un conjunto de datos.

28
NORMATIVA PARA EL EMPLEO DE MAPAS EN
TRANSACCIONES CICS
=======================================
Con el fin de optimizar el uso de la red y no transmimitir informacion superflua, es necesario aplicar por todos
los programadores los parametros "MAPONLY" y "DATAONLY" correctamente.
En la recepcion de mapas desde el terminal (RECEIVE MAP),
solo se reciben aquellos datos que han sido modificados.
En el envio (SEND MAP) si no se usan dichos parametros
se envia al terminal el mapa fisico y los datos.
Con el parametro "MAPONLY" en la send, solamente se envia
al terminal el mapa fisico.
Con el parametro "DATAONLY" en la send, solamente se envia
al terminal los campos que tiene valor en el area de descripcion simbolica.

Por lo tanto, excepto la primera vez en que puede ser


necesario enviar todo, se hace obligatorio el empleo de estos
parametros.
Se definiran los campos en los mapas con "MDT OFF" es
decir no poner el parametro "FSET". La opcion DATAONLY se
encargara de mantener la condicion de modificados de los
campos en los sucesivos reenvios
Si un campo tiene en su atributo el MDT en ON, sera
recibido en la primera operacion de entrada. Al desaparecer
este atributo habra campos que, aunque se visualicen en la
pantalla, no seran recibidos por el programa de aplicacion
y por ello este debera tener especial cuidado en tratar esta ausencia de informacion de entrada, se asume en este caso
los ultimos valores actualizados sobre la copia del mapa.
Toda esta normativa es asumida standart cuando se programa con el lenguaje CSP.
Se incluye a continuacion algunas especificaciones sobre el
uso los parametros mencionados.

29
DESCRIPCION DE UNA OPERACION DE SALIDA
======================================
Una operacion de salida, en general implica:
1.- El BMS recoge del Area de Descripcion Simbolica del
programa los datos a enviar al terminal.
2.- Construye, utilizando la informacion del Mapa Fisico y
la informacion proporcionada en el mandato Send Map, el mensaje respecto a un terminal.
3.- Envia por medio del programa de Control de Terminales
el mensaje al terminal concreto.
Una operacion de salida se pide por medio del mandato:
SEND MAP(nombre)
FROM(area-dato)
DATAONLY | MAPONLY
LENGTH(valor-dato)
MAPSET(nombre)
FMHPARM solo LUs
REQID(nombre)
LCD(nombre) solo LUs
CURSOR(valor-dato)
SET(ref-ptr) | TERMINAL | PAGING
WAIT
ACCUM

ERASE | ERASEAUP
PRINT
FREEKB
ALARM
FRSET
L40 | L64 | L80 | HONEOM,
NLEOM
LAST solo LUs
Condiciones:
IGREQCD, IGREQID, INVLDC, INVMPSZ,
INVREQ, OVERFLOW, RETPAGE, TSIOERR, WRBRK

30
PARAMETROS DE CONTROL DEL TERMINAL
==================================
Estos parametros producen que el BMS origine en la operacion de salida una corriente de datos con informacion para
el control del terminal.
FREEKB ERASE/ERASEAUP ALARM CURSOR
FRSET PRINT
NLEOM L40 L64 L80

INFORMACION DE LA SITUACION DE LOS DATOS A ENVIAR


=================================================
La opcion por defecto es el area de descripcion simbolica del programa. Podemos especificar otra area con la opcion
FROM, LENGTH.

COMO REALIZAR LA DESCRIPCION SIMBOLICA DE LOS DATOS


===================================================
Disponemos de tres opciones:
MAPONLY

DATAONLY

NINGUN PARAMETRO

FORMA DE REALIZAR LA DESCRIPCION SIMBOLICA DE LOS DATOS


=======================================================
Ha de tenerse en cuenta como realiza el BMS la fusion
de los datos con la informacion existente en el mapa fisi-

co.
De igual forma se tendra en cuenta los elementos involucrados en la construccion de los mensajes por el BMS.

31
La informacion que el BMS podra utilizar estara en:
Datos del programa
Datos en el mapa fisico
------------------------------| DATOS
|
| INFORMACION |
| EN EL
|
--------|
EN
|
| PROGRAMA |===>| BMS |<===| MAPA FISICO |
|
|
|---|---|
|
|
|-------------|
|
|---------------|
|
|
V
----------------------------------|
CORRIENTE DE SALIDA
|
----------------------------------A partir de estos datos, el BMS debe crear una corriente
de salida, controlada con los parametros
MAPONLY

DATAONLY

SIN OPCIONES

Con la opcion MAPONLY, el BMS no hace caso del area de


transformacion y envia al terminal la informacion existente
en el mapa fisico.
----------------|
|
| INFORMACION |
--------|
EN
|
| BMS |<====| MAPA FISICO |
|-------|
|---------------|
|
|
|
V
------------------------------| CORRIENTE DE SALIDA
|
|-----------------------------|
Con la opcion DATAONLY, especificamos al bms que no debe
utilizar la informacion existente en el mapa fisico.
La corriente de salida se construye con la informacion
existente en el area de descripcion simbolica.

32
|---------------|
|
|
| DATOS
|
|--------|
| EN EL
|=======>| BMS |
| PROGRAMA
|
|--------|
|---------------|
|
|
|
V
|-----------------------------|
| CORRIENTE DE SALIDA
|
|-----------------------------|
El BMS utiliza esta filosofia:
|---------|-----------|-----------|------------|------------|
| CAMPOA | X'00' | X'00' | NO X'00' | NO X'00' |
|---------|-----------|-----------|------------|------------|
| CAMPOO | X'00' | NO X'00' |
X'00' | NO X'00' |
|---------|-----------|-----------|------------|------------|
| NO ENVIA | ENVIA
| ENVIA
| ENVIA
|
| NADA
| CAMPOO | CAMPOA | CAMPOA Y |
|
|
|
| CAMPOO
|
|-----------|-----------|------------|------------|
La opcion DATAONLY, sirve para limitar el numero de caracteres que el CICS transmitira al terminal.
EN OPCION DATAONLY X'00' SIGNIFICA CARACTER DE NO-ENVIO
Un ejemplo tipico de la opcion DATAONLY es el envio de
mensajes de error en procesos de validacion.
En una operacion de entrada tenemos:
|------------------------|
|
|
|-------------|
|
RECEIVE MAP.....
|<<=====| TERMINAL |
|
|
|-------------|
|------------------------|
|
|
| VALIDACION DE ENTRADA |
|
|
|------------------------|
|
|
|-------------|
|
SI ERROR, ENVIO
|=====>>| TERMINAL |
|
DE MENSAJE
|
|-------------|
|------------------------|

33
En estas operaciones de envio de mensaje de error, podemos
utilizar la opcion DATAONLY para enviar solamente un atributo
que destaque el campo erroneo, por ejemplo poniendolo mas
brillante y aprovechar la informacion existente en el buffer
del terminal.
Si no se especifica ninguna opcion, el BMS realiza la fusion entre la informacion actual en el area de transformacion y la informacion existente en el mapa fisico.
|-----------------|
|------------------|
|
|
|
|
| DATOS
|
|-------|
| INFORMACION
|
| EN EL
|===>>| BMS |<<==|
EN
|
| PROGRAMA
|
|-------|
| MAPA FISICO
|
|-----------------|
|
|------------------|
|
|
V
|--------------------------------|
|
CORRIENTE DE SALIDA
|
|--------------------------------|
Para realizar esta fusion, el bms considera los datos para campos variables existentes en el area de descripcion
simbolica segun esta filosofia:
|----------|----------|-----------|-----------|-----------|
| CampoA | X'00' | X'00' | NO X'00' | NO X'00' |
|----------|----------|-----------|-----------|-----------|
| CampoO | X'00' | NO X'00' | X'00' | NO X'00' |
|----------|----------|-----------|-----------|-----------|
| ATRIBUTO | ATRIBUTO | ATRIBUTO | ATRIBUTO |
| Y DATO | DEL MAPA | DEL AREA. | Y DATO
|
| DEL
| FISICO. | DATO DEL | DEL
|
| MAPA
| DATO DEL | MAPA
| AREA
|
| FISICO | AREA.
| FISICO
|
|
|----------|-----------|-----------|-----------|
Esta forma de actuar, implica
ficar dinamicamente los atributos
gun las circunstancias, colocando
seado en el area de descripcion

que el programa puede modidefinidos para un campo sesimplemente el atributo desimbolica.

34
Por otra parte, si se desea enviar una informacion al
terminal, habra que limpiar previamente con ceros binarios el

area de descripcion simbolica de tal forma que el formato


deseado para estos datos no se modifique.
Una operacion de salida basica en bms supone estos pasos:
LIMPIAR EL AREA DE DESCRIPCION SIMBOLICA A X'00'
MODIFICAR DINAMICAMENTE ATRIBUTOS (COPIAR DFHBMSCA)
MOVER DATOS A CAMPOS DE SALIDA
REALIZAR LA PETICION DE SALIDA AL BMS

LIMPIEZA DEL AREA DE DESCRIPCION SIMBOLICA


==========================================
Cada lenguaje de programacion tiene una tecnica diferente.
El objetivo es poner a ceros binarios, X'00', toda el area
de descripcion simbolica.
NOTA.- Para una informacion mas detallada dirigirse al manual, Programacion Avanzada de CICS/VS.

35
****************************************************************
***
***
**** CAMBIOS EN PROGRAMAS CICS PARA CONVERTIR A COBOL II
****
***
***
****************************************************************

**********************************************************************
* Obtencion de la Fecha del Sistema
*
*--------------------------------------------------------------------*
* En los programas Cics no esta permitida la instruccion:
*
*
ACCEPT xxxxxx FROM DATE
*
*
*
* La Fecha del Sistema se podra obtener mediante las instrucciones: *
*
EXEC CICS ASKTIME ABSTIME | (ver formato en fotocopias de
*
*
EXEC CICS FORMATTIME
| normas de conversion a Cobol II) *
**********************************************************************

***********************************************************************
* Instruccion ADDRESS
*
*---------------------------------------------------------------------*
* - Quitar de la LINKAGE-SECTION la lista de BLL.
*
*
*
* - Definir en la WORKING-STORAGE SECTION:
*
*
01 APUNTADOR.
*
*
01 RAPUNTADOR REDEFINES APUNTADOR
*

*
*
* - Codificar en la PROCEDURE DIVISION:
*
*
EXEC CICS ADDRESS identificador1(APUNTADOR)
END-EXEC. *
*
SET ADDRESS OF identificador2 TO APUNTADOR.
*
*
MOVE RAPUNTADOR TO identificador3.
*
*
*
*
DONDE:
*
*
. identificador1 = estructura que direccionaba la BLL
*
*
(TCTUA, CWA ...)
*
*
. identificador2 = nombre del registro (nivel 01)
*
*
. identificador3 = campo en el que se guarda la direccion
*
*
*
***********************************************************************

36

***********************************************************************
* Instruccion GETMAIN
*
*---------------------------------------------------------------------*
* - Quitar de la LINKAGE-SECTION la lista de BLL.
*
*
*
* - Definir en la WORKING-STORAGE SECTION:
*
*
01 APUNTADOR.
*
*
01 RAPUNTADOR REDEFINES APUNTADOR
*
*
*
* - Codificar en la PROCEDURE DIVISION:
*
*
EXEC CICS GETMAIN SET (APUNTADOR) LENGTH (longitud)
*
*
INITIMG (identificador1) END-EXEC. *
*
SET ADDRESS OF identificador2 TO APUNTADOR.
*
*
MOVE RAPUNTADOR TO identificador3.
*
*
*
*
DONDE:
*
*
. identificador1 = valor al que se inicializa el area
*
*
. identificador2 = nombre del registro (nivel 01)
*
*
. identificador3 = campo en el que se guarda la direccion
*
*
*
***********************************************************************

También podría gustarte