Tabla dinámica que agrega 2 campos variables

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.

:heavy_heart_exclamation: Importante :exclamation: 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:

  1. 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 HR HR_READ_INFOTYPE o directamente accediendo a las tablas que almacenan la información de los hijos (generalmente la tabla PA0021).

  2. 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.

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

  4. 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 tipo dynamic en ABAP.

  5. 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!