LLenado de Checkbox en ALV

Que tal @Abapers!!!

En esta oportunidad les hago una nueva consulta sobre ALV. En el requerimiento en especifico me solicitan que coloque una columna que sea tipo checkbox para todos lo registros que contenga en mi tabla interna. Esto con la finalidad de enviar información contable hacía un sistema legado via RFC.

Ahora bien ya hice la construcción del ALV y quedo de esta forma:

Ahora lo que quiero, es que a través de los botones que agregue en el “status gui” pueda marcar y desmarcar los checkbox según convenga al usuario.

Estaba haciendo algo como esto, pero no me funciona, no se si estoy aplicando algo erroneo.

WHEN 'CHECK'.
* Seleccionar
      LOOP AT it_detalle INTO wa_detalle.
        wa_detalle-flag = 'X'.
        MODIFY it_detalle FROM wa_detalle.
      ENDLOOP.

      l_selfield-refresh = c_check.

    WHEN 'UNCHECK'.
* Desmarcar
      LOOP AT it_detalle INTO wa_detalle.
              wa_detalle-flag = ' '.
      MODIFY it_detalle FROM wa_detalle.
 ENDLOOP.

      l_selfield-refresh = c_check.

Espero haberme explicado correctamente.

Saludos a todos…

Yo lo veo bien. Debugueaste y confirmaste que está pasando por el CASE-WHEN??

Confirmaste que el SY-UCOMM son UNCHECK y CHECK respectivamente??

Definiste el evento USER-COMMAND para el ALV?

2 Me gusta

Que tal @Haden_Yasser_,

Disculpa la demora pero estaba en reunion.

Fijate si realice el debbug y todo anda con normalidad, igual definí el user command en el ALV. El problema es que no se esta imprimiendo por pantalla, pero en el debbug se observa claramente que esta llenando los campos(FLAG).


Saludos

@Abapers,

Chicos ahora bien he estado revisando el tema del marcado del checkbox en el ALV Grid y me surgen dos inconvenientes:

  1. Como hacer que al presionar el botón “Seleccionar Todo” me marque todos los checkbox como seleccionado. A nivel de Debug observo que funciona correctamente, sin embargo no se refleja en el grid.

  2. Igualmente me hace falta “GUARDAR” los datos seleccionados de manera individual dentro de la tabla interna. Lo estoy haciendo de esta forma en otro botón, sin embargo me hace falta saber como hago para marcar las posiciones previamente seleccionados antes de guardar.
    WHEN ‘SAVE’.
    LOOP AT it_detalle INTO wa_detalle WHERE flag = ‘X’.
    MODIFY it_detalle FROM wa_detalle.
    ENDLOOP.

Se les ocurre alguna idea???

Buenos días @johnny282,
he hecho una prueba en mi desarrollo y a mi si me funciona el check todo y el check nada.
El código es muy sencillo:

WHEN 'TODO'. LOOP AT GT_ZCHANGE1. GT_ZCHANGE1-CHECK = 'X'. MODIFY GT_ZCHANGE1. ENDLOOP.
Sabiendo que he definido la tabla interna como:

DATA BEGIN OF gt_zchange1 OCCURS 0. include STRUCTURE zchange_dni. data check type flag. data end of gt_zchange1.
Porque realmente he reusado un modulpool que tenía en la que se usaba una tabla basada en la estructura del diccionario zchange_dni pero para este caso la he tenido que ampliar para poder el checkbox.

Después de pulsar el botón de ‘TODO’ en el pai el module user_command de mi dynpro y luego obviamente salta el pbo donde muestro la alv con la sentencia

CALL METHOD gv_grid1->refresh_table_display.
porque la alv ya está creada y sólo hay que refrescar la tabla interna.

Con respecto al punto 2:
He creado una alv editable, pero para que los datos los tome he tenido que refrescar la propia alv con el botón refresh, porque si no, el dato aparece en pantalla pero realmente luego no está en la tabla interna.

1 me gusta

Que tal @Salco,

Gracias por la explicación, pero en dado caso que no este usando una Dynpro??? Como pudiera refrescar el ALV para que se reflejen los Check???

Utilice el método que indicas pero me arroja un Dump. Me puedes orientar a que se refiere???


Saludos…

Saludos @jojnny282

Utiliza el check_changed_data descrito en la rutina sgte:

FORM user_command USING lv_okcode LIKE sy-ucomm l_selfield TYPE slis_selfield.

* assign the function code to variable v_okcode
  lv_okcode = sy-ucomm.

* handle the code execution based on the function code encountered
  CASE lv_okcode.

* when the function code is EXECUTE then process the selected records
    WHEN 'EXECUTE'.       "Here you can give func code of your refresh button

* refresh it_process when user processes selected records
      REFRESH it_process.

* to reflect the data changed into internal table
      DATA : ref_grid TYPE REF TO cl_gui_alv_grid. "new

      IF ref_grid IS INITIAL.
        CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
          IMPORTING
            e_grid = ref_grid.
      ENDIF.

      IF NOT ref_grid IS INITIAL.
        CALL METHOD ref_grid->check_changed_data.
      ENDIF.

*----------------------------------------------------------------------*
* sort the internal table by flag descending so that the selected
* records are appended at the beginning of internal table
*----------------------------------------------------------------------*
      SORT it_final BY flag DESCENDING.

*----------------------------------------------------------------------*
* move the selected records from final internal table into another
* internal table so that they can be processed
*----------------------------------------------------------------------*
      LOOP AT it_final INTO wa_final WHERE flag = 'X'.
        wa_process-aufnr = wa_final-aufnr.
        wa_process-ktext = wa_final-ktext.
        wa_process-qmnum = wa_final-qmnum.
        APPEND wa_process TO it_process.
      ENDLOOP.

* refresh the ALV Grid output from internal table
      l_selfield-refresh = c_check.

* now all the selected records by the user at run-time are appended into
* into a new internal table which can now be used to processed as per the
* user requirements
      DATA : line_count1 TYPE i.

      DESCRIBE TABLE it_process
      LINES line_count1.
      IF line_count1 GE 1.
        PERFORM user_action.
      ELSE.
        MESSAGE e002.
      ENDIF.

    WHEN 'SEL_ALL'.
* to select all the records displayed in ALV Grid
      LOOP AT it_final INTO wa_final.
        wa_final-flag = 'X'.
        MODIFY it_final FROM wa_final.
      ENDLOOP.
* refresh the ALV Grid output from internal table
      l_selfield-refresh = c_check.

    WHEN 'DESEL_ALL'.
* to deselect all the records displayed in ALV Grid
      LOOP AT it_final INTO wa_final.
        wa_final-flag = ' '.
        MODIFY it_final FROM wa_final.
      ENDLOOP.
* refresh the ALV Grid output from internal table
      l_selfield-refresh = c_check.

  ENDCASE.

ENDFORM.                    "USER_COMMAND
4 Me gusta

Si no usas dynpro entonces hay que ver lo que está diciendo @David147

1 me gusta

Por los momentos dejare el tema abierto chicos ya que estoy trabajando adicionalmente con SQL SERVER y tengo que revisar algunas cosas con prioridad.

Apenas me desocupe, retomo este tema y les dejo mis comentarios a respecto.

Saludos…

Que tal @Abapers!!!

En estos momentos no tengo asignaciones, pero por aquí recuerdo este tema que coloque hace unos días y que quiero retomar mientras me llega algún requerimiento.

Estoy tratando de entender como refrescar de alguna forma un ALV Grid que contengan Checkbox.

  • Leí sus aportes y la verdad se los agradezco mucho!!!, pero como dicen en Chile “No Cacho” jajajajja.

Estoy intentando utilizar esta rutina que según entiendo me puedo ayudar con lo que necesito, pero sigue sin funcionar.

DATA:
lv_ref_grid TYPE REF TO cl_gui_alv_grid.
 
CLEAR : gv_tcode.
*-- to ensure that only new processed data is displayed
IF lv_ref_grid IS INITIAL.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lv_ref_grid.
ENDIF.
IF NOT lv_ref_grid IS INITIAL.
CALL METHOD lv_ref_grid->check_changed_data.
ENDIF.

Estoy haciendo algo como esto:

    WHEN 'CHECK'.

      LOOP AT it_detalle.
        it_detalle-flag = 'X'.
        MODIFY it_detalle. 
      ENDLOOP.

      IF ref_grid IS INITIAL.
        CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
          IMPORTING
            e_grid = ref_grid.
      ENDIF.

      IF NOT ref_grid IS INITIAL.
        CALL METHOD ref_grid->check_changed_data.
      ENDIF.

*       l_selfield-refresh = c_check.

Un abrazo a Todos!!!

Mi pana, yo hace poco hice algo parecido…osea, el usuario puede elegir uno o varios registros pero no lo hice con check sino con seleccion simple o multiple de registro pero lo hice con la clases…CL_SALV_TABLE !! tendrias que cambiar varias cositas jejejeje…si no consigues nada por ahi, te ayudo con eso

pero asi como lo hiciste, paso…mala mia

1 me gusta

Epale mi pana,

Realmente en el documento de especificaciones me lo pidieron así y lo estoy nueva retomando porque se que en algún momento me la van a solicitar de nuevo y prefiero adelantarme a los acontecimientos y la verdad me serviría también de experiencia.

Te comento que en el Debug al momento de chequear los botones de marcar y desmarcar funcionan correctamente. El tema esta en que no se como refrescar el ALV para que se marquen y desmarquen por pantalla.

Estuve indagando el google y me conseguí esa rutina que pase que en teoría debería funcionar, pero al aplicarlo no genera ningún cambio :sweat:

Otra de las cosas que quiero hacer es capturar el valor marcado de forma manual, es decir, que el usuario marque cualquier casilla y apartir de ello pueda llenar una tabla interna que es lo que hace el botón ejecutar por los momentos.

Prueba con esto en el FORM de User_command

wa_selfield-refresh = 'X'.
wa_selfield-col_stable = 'X'.
wa_selfield-row_stable = 'X'.

IF ref_grid IS INITIAL.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = ref_grid.
ENDIF.
IF NOT ref_grid IS INITIAL.
CALL METHOD ref_grid->check_changed_data.
ENDIF.

Este tema se cerró automáticamente 29 días después del último post. No se permiten nuevas respuestas.