La clase que hemos creado debe heredar obligatoriamente de la clase CL_CRM_GENIL_ABSTR_COMPONENT2. Con esto nos aseguramos que tenemos todos los métodos necesarios para su buen funcionamiento. Si no hiciesemos esto las llamadas desde el WebUI nos provocarían dumps continuamente.
Vamos a ver paso a paso que tenemos que ampliar en esta clase, en este primer post como obtener datos
- Obtención de objetos y modelos
Lo primero que necesitamos es obtener los objetos y modelos que hemos definido en las diferentes tablas. Los métodos a redefinir los siguientes
- Método IF_GENIL_APPL_MODEL~GET_MODEL
Debemos obtener los modelos de la tabla correspondiente. Insertar el siguiente código:
SELECT * FROM ztabla_modelo
INTO CORRESPONDING FIELDS OF TABLE rt_relation_det.
- Método IF_GENIL_APPL_MODEL~GET_OBJECT_PROPS
Debemos obtener los modelos de la tabla correspondiente. Insertar el siguiente código:
SELECT * FROM ztabla_objetos
INTO CORRESPONDIG FIELDS OF TABLE rt_obj_props.
- Método IF_GENIL_APPL_INTLAY~GET_OBJECTS.
Este método transforma la entrada interna del objeto en un objeto de la BD. Insertar el siguiente código.
DATA: lr_object TYPE REF TO if_genil_container_object,
lr_msg_cont TYPE REF TO cl_crm_genil_global_mess_cont,
lv_name_obj TYPE ztabla-id,
lr_attr_props TYPE REF TO if_genil_obj_attr_properties,
l_result TYPE ztabla,
lv_name TYPE crmt_ext_obj_name.
* Cogemos la primera entrada de la tabla
lr_object = iv_root_list->get_first( ).
lr_msg_cont ?= iv_root_list->get_global_message_container().
WHILE lr_object IS BOUND.
lv_name = lr_object->get_name( ).
IF lr_object->check_attr_requested( ) = abap_false.
CALL METHOD lr_object->get_key
IMPORTING es_key = lv_name_obj.
SELECT SINGLE * FROM ztabla
INTO CORRESPONDING FIELDS OF l_result
WHERE id = lv_name_obj.
lr_object->set_attributes( l_result ).
lr_attr_props = lr_object->get_attr_props_obj( ).
lr_attr_props->set_all_properties( if_genil_obj_attr_properties=>changeable ).
ENDIF.
lr_object = iv_root_list->get_next( ).
ENDWHILE. - Selección de datos
Para la selección de datos es necesario definir en primer lugar un tipo local mediante el botón para poder realizar búsquedas por rangos. El tipo se define de la siguiente manera:
TYPES: BEGIN OF ty_general_rng,
sign TYPE bapisign,
option TYPE bapioption,
low TYPE string,
high TYPE string,
END OF ty_general_rng.
TYPES: tt_general_rng TYPE STANDARD TABLE OF ty_general_rng.
A continuación redefinimos el siguiente método: - Método IF_GENIL_APPL_INTLAY~GET_DYNAMIC_QUERY_RESULT
Para hacer la selección se realizará un select con todos los parámetros de la tabla asignando los parámetros a rangos. En el ejemplo solo filtro por un campo pero su puede utilizar cualquiera de la tabla. Hay que implementar el siguiente código.
DATA:lr_object TYPE REF TO if_genil_cont_root_object,
lt_result TYPE TABLE OF zestructura,
lv_dyn_where TYPE string,
lv_len TYPE i,
ls_range TYPE tt_general_rng.
* Variables para la búsqueda
DATA: lt_variable TYPE tt_general_rng.
FIELD-SYMBOLS: <fs_result> TYPE zestructura,
<fs_selection_range> TYPE genilt_selection_parameter.
*Se recorren los parámetros
LOOP AT it_selection_parameters[] ASSIGNING <fs_selection_range>
MOVE: <fs_selection_range>-sign TO ls_range-sign,
<fs_selection_range>-option TO ls_range-option,
<fs_selection_range>-low TO ls_range-low,
<fs_selection_range>-high TO ls_range-high.
CASE <fs_selection_range>-attr_name.
WHEN 'NOMBRE_CAMPO'.
APPEND ls_range TO lt_variable[].
ENDCASE.
CLEAR ls_range.
ENDLOOP.*Obtengo los datos de la tabla.
SELECT * FROM ztabla INTO TABLE lt_result
WHERE id IN lt_id
AND campò IN lt_variable.
CHECK LINES ( lt_result[] ) > 0.
* Asigno el resultado
LOOP AT lt_result ASSIGNING <fs_result>.
lr_object = iv_root_list->add_object( iv_object_name = 'Root'
is_object_key = <fs_result>-id ).
CHECK lr_object IS BOUND.
lr_object->set_query_root( abap_true ).
ENDLOOP.
En el siguiente post veremos como crear, modificar y borrar entradas.
Relacionado:
Programación Bol/GenIL (1/.)
Programación Bol/GenIL (2/.)
Programación Bol/GenIL (4/.)
Programación Bol/GenIL (5/.)
Programación BOL/GenIL (6/.)
Muy útil, esperado continuación.
ResponderEliminarSaludos
Gracias.
ResponderEliminarA ver si puedo publicar en breve, me falta tiempo....