En el bloque que voy a tratar tengo una tabla Z que guarda los datos y está incrustado en un componente estándar. Podéis ver entradas anteriores para ver como crear un bloque Z, empezando aqui.
Debemos modificar la vista en la que se encuentra nuestro bloque. En este post podéis ver como averiguar la vista y como modificarla.
El método que nos interesa modificar es el DO_FINISH_INPUT que se ejecuta al finalizar la entrada de los campos (presionando enter). Es necesario controlar que evento se está lanzando ya que el comportamiento debe ser diferente al grabar o al presionar el botón cancelar. Para controlar los eventos tenemos el parámetro GLOBAL_EVENT que se utiliza en el método. Para mandar mensajes al usuario utilizaremos el parámetro GLOBAL_MESSAGES. Es necesario definir las siguientes variables:
DATA: lr_entity TYPE REF TO cl_crm_bol_entity,
lv_comm_type TYPE string,
lr_message_cont TYPE REF TO cl_crm_genil_global_mess_cont,
ls_expos TYPE zexpo_bol_st.
Como en todos los métodos redefinidos primero llamamos al método de la clase superior.
CALL METHOD super->do_finish_input
EXPORTING
global_event = global_event
global_messages = global_messages.
global_event = global_event
global_messages = global_messages.
Para controlar los diferentes eventos utilizamos un case. La forma más rápida que he encontrado de averiguar el nombre del evento es debugando.
CASE global_event.
WHEN 'ZEXPOSICIONES/zvexposiciones.select'.
Si nos interesa tratar la posición en la que se esta trabajando o está marcada debemos coger la posición actual con la sentencia get_current:
lr_entity ?= me->typed_context->root->collection_wrapper->get_current( ).
En el caso de que queramos recorrer toda la tabla obtenemos la primera posición y navegamos hasta la última.
lr_entity ?= me->typed_context->root->collection_wrapper->get_first( ).
WHILE lr_entity IS BOUND.
lr_entity ?= me->typed_context->root->collection_wrapper->get_next( ).
ENDWHILE.
Muchas veces solo queremos que el control se ejecute en el modo modificación, en ese caso debemos revisar el atributo is_changeable:
IF lr_entity->is_changeable( ) = abap_true.
Para controlar los datos obtenemos el valor del campo con GET_PROPERTY_AS_VALUE
lr_entity->get_property_as_value( EXPORTING iv_attr_name = 'ID'
IMPORTING ev_result = lv_comm_type ).
Una vez revisado el valor si es necesario mandar un mensaje al usuario usamos el método ADD_MESSAGE:
global_messages->add_message( condition = co_mandatory_field_empty
message = text-e01 "'Mensaje
severity = cl_bsp_messages=>co_severity_error
p1 = 'TABLAS'
dummy = me->component_id ).
p1 = 'TABLAS'
dummy = me->component_id ).
También podemos modificar el valor del campo mediante el método SET_PROPERTY.
lr_entity->set_property( EXPORTING iv_attr_name = 'TABLAS'
iv_value = ls_expos-tablas ).
Con esto podemos trabajar y controlar un poco mejor los datos de nuestro bloque e informar a los usuarios de si están informando los datos correctamente antes de hacer los datos consistentes en la base de datos.
No hay comentarios:
Publicar un comentario