Tengo que crear un reporte ALV el cual tiene que tener unos datos solicitados por el cliente eso ya lo tengo y lo tengo almacenado en una tabla interna, lo que necesito es que en el infotipo 0021 esta la cantidad de hijos que tiene el empleado y necesito crear que por cada hijo que tenga ese empleado se agreguen dos columnas a esa tabla interna que almacen el nombre y la fecha del hijo asi cuando se haga la busqueda de un empleado se agreguen 2 columnas por cada hijo con su información y si se hace la busqueda de todos los empleados busque el que tenga mas hijos y agregue sus respectivas columnas y los otros empleados que tenga menos hijos o sin hijos que queden vacias dependiendo de la cantidad de hijos que se tenga.
Importante La siguiente respuesta es generada por nuestro Robot de la comunidad de Consultoria-SAP.com denominado “CSAPBOT” usando tecnología de inteligencia artificial. Por lo tanto, puede haber datos incorrectos. No podemos garantizar que la información sea 100% correcta, solo consultores SAP profesionales podrían verificar la información. Muchos consultores leen nuestros foros de Ayuda SAP y lamentablemente pocos ayudan respondiendo y confirmando la información.
Si deseas aportar tus ideas para mejorar nuestros sistemas, te esperamos en este debate.
Para realizar este tipo de reporte en un ALV, lo que necesitas es adaptar dinámicamente la tabla interna, ya que el número de hijos por empleado puede variar y eso implicará crear tantas columnas adicionales como sea necesario para reflejar la información de cada hijo.
Te explico el enfoque que podrías seguir para conseguir este requerimiento, asegurando que tu reporte ALV maneje correctamente este tipo de datos dinámicos.
Pasos a seguir:
-
Obtener la cantidad de hijos por empleado desde el infotipo 0021:
Lo primero que necesitas es leer la información del infotipo 0021, que almacena los datos familiares del empleado, específicamente los hijos. Puedes hacerlo usando la función estándar HRHR_READ_INFOTYPE
o directamente accediendo a las tablas que almacenan la información de los hijos (generalmente la tablaPA0021
). -
Determinar el número máximo de hijos:
Para cumplir con la exigencia de que el reporte agregue dinámicamente las columnas según el número máximo de hijos, debes buscar el empleado con el mayor número de hijos. Esto se puede hacer mediante un loop sobre todos los empleados y un cálculo para determinar el máximo número de hijos. -
Agregar dinámicamente las columnas al catálogo del ALV:
Teniendo en cuenta el número máximo de hijos, debes crear un catálogo dinámico de columnas en el ALV. Es decir, si el empleado con más hijos tiene 5, deberás crear 10 columnas (2 por hijo: una para el nombre y otra para la fecha de nacimiento). -
Crear la tabla interna con las columnas dinámicas:
De acuerdo al número de hijos, deberás modificar tu tabla interna de forma que se agreguen las nuevas columnas (por ejemplo,Hijo_1_Nombre
,Hijo_1_Fecha
,Hijo_2_Nombre
,Hijo_2_Fecha
, etc.). Esto puedes hacerlo utilizando una tabla interna con una estructura tipodynamic
en ABAP. -
Rellenar las columnas con los datos correspondientes:
Para cada empleado, llenarás las columnas con los nombres y fechas de nacimiento de los hijos. En los casos en que un empleado tenga menos hijos que el máximo encontrado, dejarás los campos en blanco.
Ejemplo de Código
Aquí te dejo una estructura de código ABAP que puedes utilizar para implementar esta solución:
DATA: lt_pa0021 TYPE TABLE OF pa0021,
lt_alv TYPE TABLE OF ty_alv,
wa_alv TYPE ty_alv,
lv_max_hijos TYPE i,
lt_fieldcat TYPE lvc_t_fcat,
ls_fieldcat TYPE lvc_s_fcat.
" Lee el infotipo 0021
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr = lv_pernr " Número de empleado
infty = '0021' " Infotipo de datos familiares
TABLES
infty_tab = lt_pa0021
EXCEPTIONS
OTHERS = 1.
" Determina el número máximo de hijos
LOOP AT lt_pa0021 INTO DATA(wa_pa0021).
lv_max_hijos = lv_max_hijos + 1.
ENDLOOP.
" Crea columnas dinámicas
DO lv_max_hijos TIMES.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = |HIJO_{ sy-index }_NOMBRE|.
ls_fieldcat-seltext_m = |Nombre hijo { sy-index }|.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = |HIJO_{ sy-index }_FECHA|.
ls_fieldcat-seltext_m = |Fecha hijo { sy-index }|.
APPEND ls_fieldcat TO lt_fieldcat.
ENDDO.
" Crea la tabla interna con columnas dinámicas
LOOP AT lt_pa0021 INTO wa_alv.
" Rellena los datos del empleado
wa_alv-pernr = wa_pa0021-pernr.
wa_alv-name = wa_pa0021-name.
" Rellena los datos de los hijos
LOOP AT lt_pa0021 INTO DATA(wa_hijo).
wa_alv-hijo_nombre = wa_hijo-faname. " Nombre del hijo
wa_alv-hijo_fecha = wa_hijo-gbdat. " Fecha de nacimiento del hijo
ENDLOOP.
APPEND wa_alv TO lt_alv.
ENDLOOP.
" Mostrar el ALV con las columnas dinámicas
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
it_fieldcat = lt_fieldcat
TABLES
t_outtab = lt_alv
EXCEPTIONS
OTHERS = 1.
Consideraciones:
- Tablas dinámicas: El número de columnas que crees será dinámico, dependiendo de cuántos hijos tiene el empleado que más hijos posea.
- Estructura de datos: Es importante que adaptes la estructura de la tabla interna (
ty_alv
) para que soporte las nuevas columnas que se están creando dinámicamente. - Relleno de datos: Si un empleado tiene menos hijos que el máximo número de hijos encontrado, las columnas extra que no se utilicen quedarán vacías para ese empleado.
Resumen Consultoria-SAP
Con este enfoque, puedes manejar de manera flexible la creación dinámica de columnas en tu reporte ALV, dependiendo de la cantidad de hijos de los empleados. Es clave calcular el número máximo de hijos primero, para luego estructurar tu tabla interna y catálogo de columnas en base a ese resultado. De esta manera, garantizarás que todos los empleados aparezcan en el reporte, incluso aquellos con menos hijos o sin hijos, adaptando las columnas dinámicamente. Este tipo de reporte sería útil en módulos como HR (Human Resources).
¡Estamos aquí para ayudarte!