✒️ABAP POO Los Eventos
ABAP POO Los Eventos
EVENTOS
Los eventos estan sujetos a los atributos de visibilidad, determinando quien esta autorizado para controlar o manejar el evento.
Ejemplo, los eventos publicos pueden ser usados por cualquiera.
La visibilidad de un metodo handler determina quien esta autorizado para registrar el metodo (donde podremos usar SET HANDLER). Los publicos pueden ser usados en cualquier lugar, mientras los privados solo pueden ser usados por el usuario dentro de la clase.
Hay metodos triggers, que disparan un evento, y metodos
Handles que se ejecutan cuando ocurre un event.
EVENTOS DISPARADORES (TRIGGERS)
Dependientes de instancia
La clase (o interfaz) debe declarar el evento en la parte declarativa y disparar el evento en uno de sus metodos.
Para declarar eventos dependientes de instancia, se usa
EVENTS <evento> EXPORTING… VALUE( <ei>) TYPE type [OPTIONAL]
Exporting especifica los parametros que se le pasan al manejador de eventos. Estos siempre se pasan por valor (VALUE).
Los metodos dependientes de instancia tienen el parametro implicito SENDER, que tiene el tipo de referencia a la clase o la interface en la cual el evento es declarado.
Los eventos dependientes de instancia solo pueden ser declarados por metodos dependientes de instancia (no estaticos).
Todos los metodos (dependientens de instancia o estaticos) pueden desencadenar eventos estaticos.
Estaticos
Es el unico tipo de evento que puede ser desencandenado por un evento metido estatico.
Para declarar eventos estaticos se usa
CLASS-EVENTS
Y para dispararlo:
RAISE EVENT <evento> EXPORTING … <ei> = < f i>…
(se le deben pasar todos los parametros formales!) La referencia a sí mismo ME es pasada autoamticamente al parametro implicito SENDER
EVENTOS MANEJADORES (HANDLES)
Se usan para ejecutar una serie de metodos, los cuales tienen que estar definitos como eventos manejadores ede ese evento y estar registrados en tiempo de ejecucion para el evento.
Una clase puede tener metodos manejadores tanto para su propia clase como de otras clases.
Manejador de eventos dependiente de instancia
METHODS <metodo> FOR EVENT <evento> of < cif > IMPORTING … <ei>…
Manejador de eventos estaticos
CLASS-METHODS <metodo> FOR EVENT <evento> of < cif > IMPORTING … <ei>…
La interface de un metodo manejador de eventos solo puede contener parametros FORMALES definidos en la declaracion del evento. Los atributos de los parametros tambien son adoptados por el evento.
El metodo manejador de eventos no necesita usar todos los parametros pasados en la sentencia RAISE EVENT
REGISTRAR A LOS METODOS MANEJADORES DE EVENTOS
Para que un metodo handler pueda reaccionar a un evento, en tiempo de ejecución se debe determinar al disparador al cual va a reaccionear con la sentencia
SET HANDLER <hi> … [FOR] …
Esta sentencia relaciona los metodos manejadores de eventos con sus correspondientes metodos. Hay 4 tipos de eventos:
Eventos dependientes de instancia (declarados en una clase o en una interfaz), en los cuales se usa la palabra clave FOR para especificar la instancia para la cual se quiere registrar el manejador. Se puede especificar una sola instancia como disparador usando una variable referenciada ó para todas las instancias que puedan disparar el evento
SET HANDLER …. <handler i> .. FOR < referencia a instancia > ó
SET HANDLER … <handler i> … FOR ALL INSTANCES.
En caso de aplicarse para todas las intancias, se aplica incluso a instancias que no han sido creadas al momento que se registro el manejador.
Eventos estaticos declarados en una clase o en una interfaz)
No se la palabra FOR
SET HANDLER … <handler i>…
Y se aplica automaticamente a la clase entera o a todas las clases que implementan la interfaz que contiene el evento estatico.
COORDINACION EN EL MANEJO DEL EVENTO
Despues de la sentencia RAISE EVENT, todos los metodos manejadores registrados son ejecutados antes de que la siguiente sentencia sea procesada (es sincronico)
Solo se permiter 64 niveles de anidado para evitar la posibilidad de bucles infinitos.
Como los eventos son registrados de manera dinamica, no se puede saber el orden en el que seran procesados, es por eso que se deben programar todos los manejadores de eventos como si se fueren a ejecutar todos simultaneamente.
Ejemplo
REPORT zejercicio_eventos.
CLASS contador DEFINITION.
PUBLIC SECTION.
METHODS incrementar_contador.
EVENTS valor_critico EXPORTING value(exceso) TYPE i.
PRIVATE SECTION.
DATA: cuenta TYPE i,
umbral TYPE i VALUE 10.
ENDCLASS. "contador DEFINITION
CLASS contador IMPLEMENTATION.
METHOD incrementar_contador.
DATA diferencia TYPE i.
ADD 1 TO cuenta.
IF cuenta > umbral.
diferencia = cuenta - umbral.
RAISE EVENT valor_critico EXPORTING exceso = diferencia.
ENDIF.
ENDMETHOD. "incrementar_contador
ENDCLASS. "contador IMPLEMENTATION
CLASS manejador DEFINITION.
PUBLIC SECTION.
METHODS manejar_exceso FOR EVENT valor_critico OF contador
IMPORTING exceso.
ENDCLASS. "manejador DEFINITION
CLASS manejador IMPLEMENTATION.
METHOD manejar_exceso.
WRITE: / 'El Exceso es: ', exceso.
ENDMETHOD. "manejar_exceso
ENDCLASS. "manejador IMPLEMENTATION
*programa principal
DATA: cuenta TYPE REF TO contador,
manejador TYPE REF TO manejador.
START-OF-SELECTION.
CREATE OBJECT: cuenta, manejador.
SET HANDLER manejador->manejar_exceso FOR ALL INSTANCES.
DO 20 TIMES.
CALL METHOD cuenta->incrementar_contador.
ENDDO.
En pantalla, se mostraria al ejecutar
Eventos en ABAP
El exceso es: 1
El exceso es: 2
..
El exceso es: 10.
Ejemplo ejercicio de practica
Crear un programa que lance un evento cuando el atributo SUM_DEUDAS perteneciente a la clase DEUDA sea mayor a 100.
Para ello definiremos la clase DEUDA y la clase MANEJADOR.
En la clase DEUDA se definirán los siguientes atributos, métodos y eventos:
• Métodos: INCREMENTAR_DEUDA
• Eventos: VALOR_CRITICO
• Atributos: SUM_DEUDAS (tipo I) y UMBRAL (tipo I ) con valor inicial 100
Dentro de la clase MANEJADOR se deberá definir e implementar el evento MANEJAR_EXCESO, el cual imprimirá en pantalla el exceso de deuda.
REPORT zejercicio_eventos_BK54Z.
CLASS deuda DEFINITION.
PUBLIC SECTION.
METHODS incrementar_deuda.
EVENTS valor_critico EXPORTING value(exceso) TYPE i.
PRIVATE SECTION.
DATA: sum_deudas TYPE i,
umbral TYPE i VALUE 100.
ENDCLASS. "deuda DEFINITION
CLASS deuda IMPLEMENTATION.
METHOD incrementar_deuda.
DATA diferencia TYPE i.
ADD 10 TO sum_deudas.
IF sum_deudas > umbral.
diferencia = sum_deudas - umbral.
RAISE EVENT valor_critico EXPORTING exceso = diferencia.
ENDIF.
ENDMETHOD. "incrementar_deuda
ENDCLASS. "deuda IMPLEMENTATION
CLASS manejador DEFINITION.
PUBLIC SECTION.
METHODS manejar_exceso FOR EVENT valor_critico OF deuda
IMPORTING exceso.
ENDCLASS. "manejador DEFINITION
CLASS manejador IMPLEMENTATION.
METHOD manejar_exceso.
WRITE: / 'La deuda es: ', exceso.
ENDMETHOD. "manejar_exceso
ENDCLASS. "manejador IMPLEMENTATION
*Programa principal
DATA: deuda TYPE REF TO deuda,
manejador TYPE REF TO manejador.
START-OF-SELECTION.
CREATE OBJECT: deuda, manejador.
SET HANDLER manejador->manejar_exceso FOR ALL INSTANCES.
DO 20 TIMES.
CALL METHOD deuda->incrementar_deuda.
ENDDO.
 
 
 
Sobre el autor
Publicación académica de Juan Pablo Carro, en su ámbito de estudios para el Máster ABAP POO.
Juan Pablo Carro
Profesión: Analista de Sistemas - Argentina - Legajo: DB81J
✒️Autor de: 8 Publicaciones Académicas
🎓Egresado de los módulos:
Disponibilidad Laboral: FullTime
Certificación Académica de Juan Carro