viernes, 4 de mayo de 2012

Programación BOL/GenIL. Crear nuevo bloque (3/7)

Siguiendo los post de programación GenIL vamos un paso más allá modificando nuestra clase para darle la funcionalidad que necesitamos.

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/.)

2 comentarios:

  1. Muy útil, esperado continuación.
    Saludos

    ResponderEliminar
  2. Gracias.
    A ver si puedo publicar en breve, me falta tiempo....

    ResponderEliminar