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:
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).
Chicos ahora bien he estado revisando el tema del marcado del checkbox en el ALV Grid y me surgen dos inconvenientes:
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.
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.
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.
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
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.
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.
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
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
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.
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.