¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Consejos para mantener la integridad de la tabla interna en un ALV Grid editable

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 38 Vistas
0
Cargando...

Hola a todos

Actualmente estoy trabajando en un ALV Grid editable, que escucha el controlador on data changed y asigna valores predeterminados a las filas nuevas insertadas.

Hasta aquí todo bien, pero por alguna razón la tabla interna del ALV se modifica después del evento "on data changed". ¿Podrían darme algún consejo al respecto?

Aquí está la sección de código relevante en el evento on_data_changed:

W_JOBSTEP

Nota: GW_JOBSTEP / GT_JOBSTEP son la tabla interna / área de trabajo para el ALV grid.

<fs> es un fieldsymbol para p_data_changed -> mp_mod_row. p_data_changed -> mp_mod_rows -> * p_data_changed -> mp_mod_rows -> * <fs> p_data_changed -> mp_mod_rows -> *


*  V-----------------set default Value for new row---------------------------V*
   "   Loop at the inserted rows table and assign default values
     LOOP AT p_data_changed->mt_inserted_rows INTO dl_ins_row.

       ASSIGN p_data_changed->mp_mod_rows->* TO <fs>.

       READ TABLE <fs> INTO GW_JOBSTEP INDEX sy-tabix.

       "set default values
       GW_JOBSTEP-MANDT  = sy-mandt.
       GW_JOBSTEP-JOBNAME  = ZBC_JOB-JOBNAME.
       GW_JOBSTEP-STEPCOUNT  = sy-tabix.
       GW    
            
Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

Hola a todos

Después de una noche de sueño, encontré una solución para mi problema. Encontré una forma de no modificar directamente el itab, sino la fila recién insertada en el alv. De esta manera, el protocolo de cambios del alv ya no afecta mis cambios de datos.

Aquí está el código de referencia:


* V-----------------set default Value for new row---------------------------V*

   " leer la tabla de filas insertadas y asignar valores predeterminados
     READ TABLE p_data_changed->mt_inserted_rows INTO dl_ins_row INDEX 1.

     " Encontrar el índice de fila para la tabla GW_JOBSTEP según la tabla coincidente
     READ TABLE p_data_changed->MT_ROID_FRONT  WITH KEY ROW_ID = DL_INS_ROW-ROW_ID TRANSPORTING NO FIELDS.
      "(sy-tabix contiene el ID de fila de MT_ROID_FRONT con la fila coincidente.)
     IF sy-subrc EQ 0.
       DATA: idx TYPE sy-tabix.
       idx = sy-tabix.
     ENDIF.

     " Establecer valores predeterminados para la nueva fila
     PERFORM modify_alv_cell USING dl_ins_row-row_id 'MANDT'     sy-mandt          CHANGING p_data_changed.
     PERFORM modify_alv_cell USING dl_ins_row-row_id 'JOBNAME'   ZBC_JOB-JOBNAME   CHANGING p_data_changed.
     PERFORM modify_alv_cell USING dl_ins_row-row_id 'STEPCOUNT' idx               CHANGING p_data_changed.
     PERFORM modify_alv_cell USING dl_ins_row-row_id 'XPGFLAG'   K_DEFAULT_XPGFLAG CHANGING p_data_changed.
     PERFORM modify_alv_cell USING dl_ins_row-row_id 'PRNEW'     'X'               CHANGING p_data_changed.
     PERFORM modify_alv_cell USING dl_ins_row-row_id 'PDEST'     K_DEFAULT_PRINTER CHANGING p_data_changed.
     PERFORM modify_alv_cell USING dl_ins_row-row_id 'LANGUAGE'  sy-LANGU          CHANGING p_data_changed.

     " Deshabilitar ciertos campos para editar (en nueva fila)
     PERFORM ALV_DISABLE_FIELDS USING K_DEFAULT_XPGFLAG CHANGING it_style.
     LOOP AT it_style INTO wa_style.

        
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Mi máximo.

Gracias por la respuesta rápida.

Dado que solo puedes insertar una fila a la vez, utilicé esta línea para asignar los valores de la primera fila de <fs> a mi área de trabajo. (sy-tabix siempre fue 1)

Dado que <fs> (la nueva fila) siempre está vacío, cambié la línea a un simple CLEAR GW_JOBSTEP, que tiene el mismo efecto.

Sin embargo, esto no resolvió mi problema.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola

mi primera pregunta es ¿por qué estás usando SY-TABIX para leer la tabla <FS>? (línea 85);

LEER TABLA <fs> EN GW_JOBSTEP ÍNDICE sy-tabix.


Máximo

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola a todos

Después de una noche de sueño, encontré una solución para mi problema. Encontré una forma de no modificar directamente el itab, sino la fila recién insertada en el alv. De esta manera, el protocolo de cambios del alv ya no interfiere con mis cambios de datos.

Aquí está el código de referencia:


* V-----------------set default Value for new row---------------------------V*

   " leer la tabla de filas insertadas y asignar valores predeterminados
     READ TABLE p_data_changed->mt_inserted_rows INTO dl_ins_row INDEX 1.

     "Encontrar el índice de fila para la tabla GW_JOBSTEP según la tabla coincidente
     READ TABLE p_data_changed->MT_ROID_FRONT  WITH KEY ROW_ID = DL_INS_ROW-ROW_ID TRANSPORTING NO FIELDS.
      "(sy-tabix contiene el ID de fila de MT_ROID_FRONT con la fila coincidente.)
     IF sy-subrc EQ 0.
       DATA: idx TYPE sy-tabix.
       idx = sy-tabix.
     ENDIF.

     "Establecer valores predeterminados para la nueva fila
     PERFORM modify_alv_cell USING dl_ins_row-row_id 'MANDT'     sy-mandt          CHANGING p_data_changed.
     PERFORM modify_alv_cell USING dl_ins_row-row_id 'JOBNAME'   ZBC_JOB-JOBNAME   CHANGING p_data_changed.
     PERFORM modify_alv_cell USING dl_ins_row-row_id 'STEPCOUNT' idx               CHANGING p_data_changed.
     PERFORM modify_alv_cell USING dl_ins_row-row_id 'XPGFLAG'   K_DEFAULT_XPGFLAG CHANGING p_data_changed.
     PERFORM modify_alv_cell USING dl_ins_row-row_id 'PRNEW'     'X'               CHANGING p_data_changed.
     PERFORM modify_alv_cell USING dl_ins_row-row_id 'PDEST'     K_DEFAULT_PRINTER CHANGING p_data_changed.
     PERFORM modify_alv_cell USING dl_ins_row-row_id 'LANGUAGE'  sy-LANGU          CHANGING p_data_changed.

     "Deshabilitar ciertos campos para la edición (en la nueva fila)
     PERFORM ALV_DISABLE_FIELDS USING K_DEFAULT_XPGFLAG CHANGING it_style.
     LOOP AT it_style INTO wa_style
            
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?