martes, 11 de junio de 2013

Crear lista desplegable en un campo

En ocasiones nos interesa que un campo se transforme en una lista desplegable. En principio podemos hacer cualquier campo como una lista pero este código en concreto está creado y probado para un campo en un bloque Z creado mediante programación Bol.
Lo primero que debemos hacer es crear un nuevo atributo en la clase de contexto que contiene nuestro campo. Este nuevo atributo debe ser del tipo de referencia CL_CRM_UIU_DDBL y protegido:




A continuación redefinimos el método GET_P del campo para indicar que es una lista desplegable:

 CASE iv_property.
  WHEN if_bsp_wd_model_setter_getter~fp_fieldtype.
  rv_value = cl_bsp_dlc_view_descriptor=>field_type_picklist.
 ENDCASE.


Ahora redefinimos el método GET_V para crear el objeto de lista desplegable y rellenarlo:
 
 DATA:lt_ddlb TYPE bsp_wd_dropdown_table,
      ls_ddlb TYPE bsp_wd_dropdown_line.
 DATA: it_interna TYPE TABLE OF ztabla,
       wa_estructura LIKE LINE OF it_interna.


 IF gr_ddlb_canto IS NOT BOUND.
   CREATE OBJECT gr_ddlb_atributo
     EXPORTING
      iv_source_type = 'T'.
   REFRESH: it_canto.
* acabado
   SELECT id descripcion INTO CORRESPONDING FIELDS OF TABLE it_interna
     FROM ztabla
     WHERE idioma = sy-langu.

   LOOP AT it_interna INTO wa_estructura.
     ls_ddlb-key = wa_estructura-id.
     ls_ddlb-value = wa_estructura-descripcion.
     APPEND ls_ddlb TO lt_ddlb.
   ENDLOOP.

* Línea vacía de la Listbox:

   INSERT INITIAL LINE INTO lt_ddlb INDEX 1.
   IF sy-subrc = 0.
     gr_ddlb_canto->set_selection_table( it_selection_table = lt_ddlb ).
   ENDIF.
  ENDIF.
 rv_valuehelp_descriptor = gr_ddlb_atributo.

 
De esta forma ya tenemos los valores de la lista rellenos.