Cómo añadir un dropdown en una columna de un ALV Grid en SAP ABAP

En los desarrollos ABAP, muchas veces necesitamos que una columna del ALV Grid (clásico con CL_GUI_ALV_GRID) permita seleccionar un valor de una lista desplegable en lugar de introducir texto libre. Esto es posible gracias a la técnica de field catalog + dropdown handle y se logra de forma sencilla si conoces los pasos.

En este artículo te muestro cómo hacerlo paso a paso, con ejemplos de código.

✅ Paso 1: Crear la tabla interna de datos

Primero, definimos la tabla interna que usaremos en el ALV. Por ejemplo, una lista de empleados con un campo “Rol” que tendrá el dropdown:

TYPES: BEGIN OF ty_empleado,
id TYPE i,
nombre TYPE string,
rol TYPE string,
END OF ty_empleado.

DATA: gt_empleados TYPE TABLE OF ty_empleado,
gs_empleado TYPE ty_empleado.

gs_empleado-id = 1.
gs_empleado-nombre = ‘Andrea’.
gs_empleado-rol = ‘FI’.
APPEND gs_empleado TO gt_empleados.

gs_empleado-id = 2.
gs_empleado-nombre = ‘Carlos’.
gs_empleado-rol = ‘CONS’.
APPEND gs_empleado TO gt_empleados.

✅ Paso 2: Definir el catálogo de campos (field catalog)

Creamos el catálogo de campos del ALV y configuramos la columna “ROL” para que use un dropdown.

DATA: gt_fieldcat TYPE lvc_t_fcat,
gs_fieldcat TYPE lvc_s_fcat.

CLEAR gs_fieldcat.
gs_fieldcat-fieldname = ‘ID’.
gs_fieldcat-coltext = ‘ID’.
APPEND gs_fieldcat TO gt_fieldcat.

CLEAR gs_fieldcat.
gs_fieldcat-fieldname = ‘NOMBRE’.
gs_fieldcat-coltext = ‘Nombre’.
APPEND gs_fieldcat TO gt_fieldcat.

CLEAR gs_fieldcat.
gs_fieldcat-fieldname = ‘ROL’.
gs_fieldcat-coltext = ‘Rol’.
gs_fieldcat-drdn_hndl = ‘1’. » Asignamos el identificador del dropdown
APPEND gs_fieldcat TO gt_fieldcat.

✅ Paso 3: Definir la tabla de valores para el dropdown

Aquí definimos los valores disponibles en el desplegable (pueden ser códigos de rol, estados, etc.):

DATA: gt_dropdown TYPE lvc_t_drop,
gs_dropdown TYPE lvc_s_drop.

gs_dropdown-handle = ‘1’.
gs_dropdown-value = ‘FI’.
APPEND gs_dropdown TO gt_dropdown.

gs_dropdown-handle = ‘1’.
gs_dropdown-value = ‘CONS’.
APPEND gs_dropdown TO gt_dropdown.

gs_dropdown-handle = ‘1’.
gs_dropdown-value = ‘PM’.
APPEND gs_dropdown TO gt_dropdown.

Otra opción es rellenar la tabla con los datos de una tabla de base de datos:

DATA: lt_roles TYPE TABLE OF zroles,
ls_role TYPE zroles.

SELECT * FROM zroles INTO TABLE lt_roles.

LOOP AT lt_roles INTO ls_role.
gs_dropdown-handle = ‘1’.
gs_dropdown-value = ls_role-rol.
APPEND gs_dropdown TO gt_dropdown.
ENDLOOP.

O podemos rellenar la tabla con los valores (value range) de un dominio:

DATA: lt_domvalues TYPE TABLE OF dd07v,
ls_domvalue TYPE dd07v.

CALL FUNCTION ‘DD_DOMVALUES_GET’
EXPORTING
domname = ‘ZDOM_ROLES’
TABLES
dd07v_tab = lt_domvalues
EXCEPTIONS
wrong_textflag = 1
OTHERS = 2.

LOOP AT lt_domvalues INTO ls_domvalue WHERE domvalue_l IS NOT INITIAL.
gs_dropdown-handle = ‘1’.
gs_dropdown-value = ls_domvalue-domvalue_l.
A PPEND gs_dropdown TO gt_dropdown.
ENDLOOP.

✅ Paso 4: Crear el ALV Grid y asignar el dropdown

Finalmente, mostramos el ALV y asociamos la tabla de dropdown al handle definido en el field catalog.

DATA: gr_alv TYPE REF TO cl_gui_alv_grid,
gr_cont TYPE REF TO cl_gui_custom_container.

CREATE OBJECT gr_cont
EXPORTING
container_name = ‘CONTAINER’.

CREATE OBJECT gr_cont
EXPORTING
container_name = ‘CONTAINER’.

CREATE OBJECT gr_alv
EXPORTING
i_parent = gr_cont.

CALL METHOD gr_alv->set_table_for_first_display
EXPORTING
is_layout = gs_layout
CHANGING
it_fieldcatalog = gt_fieldcat
it_outtab = gt_empleados.

» Asignamos el dropdown al ALV
CALL METHOD gr_alv->set_drop_down_table
EXPORTING
it_drop_down = gt_dropdown.

🎯 Resultado esperado

Cuando ejecutes este código, el campo “ROL” aparecerá como una columna con un menú desplegable en cada fila. El usuario podrá seleccionar entre los valores DEV, CONS y PM.

❌ Problemas comunes y qué revisar

Aquí podemos añadir un apartado tipo checklist de errores típicos:

  • El dropdown no aparece:
    • Revisa que el campo en el field catalog tenga el atributo DRDN_HNDL con el mismo número que usas en la tabla de dropdown.
  • La columna no es editable:
    • El ALV solo permite el dropdown en columnas editables. Asegúrate de que el EDIT esté activado en el field catalog.
  • No carga los valores:
    • Verifica que el método SET_DROP_DOWN_TABLE se haya llamado después de inicializar el ALV.
  • Error de tipo de datos:
    • El campo que recibe el valor del dropdown debe ser del mismo tipo que los valores de la tabla de dropdown (ejemplo: CHAR, STRING, NUMC).
  • El ALV no responde a cambios:
    • En algunos casos, tendrás que manejar el evento DATA_CHANGED para actualizar la lógica del programa.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *