lunes, 8 de abril de 2013

Control de datos obligatorios en programación BOL

En este post contaré como controlar los datos y hacerlos obligatorios en un bloque Z creado con programación BOL/GenIL.

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:

DATAlr_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.


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_valueEXPORTING 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_messagecondition co_mandatory_field_empty 
                    message   text-e01 "'Mensaje

                 severity  cl_bsp_messages=>co_severity_error
                 p1        
'TABLAS'
                 dummy     
me->component_id ).


También podemos modificar el valor del campo mediante el método SET_PROPERTY.


lr_entity->set_propertyEXPORTING 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.