PDA

Ver la Versión Completa : Seleccionar registros en ALV


elena_mr
29/12/08, 12:43:33
Buenos días,
Por favor, a ver si alguien me puede echar una mano con esto:
He creado un ALV GRID con tres campos editables, y me piden que cuando se modifique alguno de estos campos se marque automáticamente la fila correspondiente (es decir, quede seleccionado el registro para el cual se ha hecho 1 o varias modificaciones en sus campos editables).
Muchas gracias de antemano por vuestra ayuda.
Elena

DavidXD_XD
29/12/08, 19:26:56
Hola ... probe un metodo y funciono, intenta esto ...

* Definiendo Layout
gs_layout-grid_title = 'Titulo ALV'.
gs_layout-sel_mode = 'A'.

* Desplegando ALV
CALL METHOD grid1->set_table_for_first_display
EXPORTING i_structure_name = 'SFLIGHT'
is_layout = gs_layout
CHANGING it_outtab = gt_sflight.

* Pintando la fila 2 y la fila 5
CLEAR gs_row_no.
gs_row_no-row_id = 2.
APPEND gs_row_no TO gt_row_no.

CLEAR gs_row_no.
gs_row_no-row_id = 5.
APPEND gs_row_no TO gt_row_no.

CALL METHOD grid1->set_selected_rows
EXPORTING
it_row_no = gt_row_no.

Ojo que ese codigo va en el PBO, nos cuentas como te fue :D

elena_mr
30/12/08, 08:15:28
Muchas gracias David,
el problema es que ya tengo completamente terminado el alv, y querría tener que modificar lo menos posible...
Para mostrar el alv utilizo lo siguiente:
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'ALV_STATUS'
i_callback_user_command = 'USER_COMMAND'
is_layout = sg_layout
it_fieldcat = tg_fieldcat[]
i_save = c_save
i_grid_settings = sg_grid_settings
TABLES
t_outtab = it_tabla3.

Si utilizo un metodo creo que no puedo pasarle el status, el user command, el grid_settings ,... y me hacen falta.
Muchas gracias
Elena

francesc
30/12/08, 09:17:26
En el catálogo de campos tendrás el campo de selección como un char(1), a este campo prueba, en modo debugging a pasarle un valor ( .... = 'x' ) justo antes de la llamada a la función y ver si en el ALV te marca el registro. Si es así entonces esta 'marca' la tienes que hacer en el perform del user-command, recuerda también que el campo rs_selfield-refresh = 'X' para que te actualice el ALV.

elena_mr
30/12/08, 11:23:37
Gracias francesc,
pero creo que no puede ser nada del catálogo de campos, ya que lo que quiero seleccionar son filas, no columnas, y en el catálogo de campos defino columnas ¿no?.
Me estoy volviendo loca con este tema...

francesc
30/12/08, 13:07:51
Si marcas la casilla de selección, te tiene que salir la línea marcada ( lo que antes comentaba que hicieras con un break-point justo antes de la llamada a la función, marcas el campo de selección de un registro cualquiera .... = 'X' y en el ALV te tiene que aparecer el registro marcado )

elena_mr
07/01/09, 08:37:21
Gracias Francesc,
creo que el problema es precisamente lo que tú me planteas, no sé qué campo toma el valor 'X' cuando se marca una fila.
Si alguien me lo puede decir, a lo mejor puedo seguir por ahí.
Gracias a todos.

Mauricio Hidalgo
07/01/09, 11:36:08
Para interactuar con la fila seleccionada en el ALV basado en MF.

1. A tu tabla interna it_tabla3, agregale un campo, este nuevo campo es Caracater de largo 1.

2. A la estructura GS_LAYOUT que estás pasando al MF 'REUSE_ALV_GRID_DISPLAY' agrega lo siguiente

gs_layout-box_fieldname = 'FLAG'.

Don de FLAG es el nombre del campo que te pedí agregar en el punto 1.

Con eso, cuando te marquen una fila del ALV ése campo, en este caso FLAG, quedará con una X indicando que la fila está seleccionada.

Espero te ayude, Saludos

elena_mr
07/01/09, 12:22:48
Muchisimas gracias,
era eso lo que estaba buscando, ahora sólo me falta que se me marque el flag con X cuando se modifique alguno de los campos editables del ALV (también me valdría cuando dé un enter creo) el problema es que no encuentro el valor adecuado del sy-ucomm donde poner el flag a X.
Alguna idea???
Lo dicho muchas gracias, me ha sido muy útil.

francesc
07/01/09, 12:56:15
Ponle un break-point en la rutina del user-command del ALV (la rutina declarada en el i_callback_user_command de la función REUSE.... del ALV ).

Mauricio Hidalgo
07/01/09, 13:07:19
Umm, hay está más dificil la cosa de controlar porque en un ALV OO hay que crear un evento y registrarlo en el ALV para que cuando una celda ha cambiado este gatille la acción. Pero en un ALV basado en funciones, no tengo claro que haya una función que agregue tal evento al objeto ALV.

Un enter no provoca evento alguno en el ALV, tal vez si te sirve un doble click podrías ser, en cuyo caso el sy-ucomm es &IC1.

En la subrutina command agrega la setencia selfield-refresh = 'X'. para que se refresque la línea cuando asignes la 'X' al campo de selecci{on.

saludos

elena_mr
07/01/09, 13:31:07
Ya probé con el break-point, el problema es que tras un enter no entra en la rutina del user-command y no se me para el programa...

francesc
07/01/09, 14:08:49
Justo después de haber editado el campo correspondiente, modifica el valor del campo FLAG , asignándole el valor 'X' con lo que al volverse a mostrar el ALV el registro te aparecerá marcado ( recuerda el selfield-refresh = 'X' que te comentó Mauricio Hidalgo)

elena_mr
08/01/09, 10:04:27
Muchas gracias a los 2,
he encontrado cómo hacerlo con eventos, pero no me funciona bien, he puesto otra pregunta en este foro sobre eso.
Muchas gracias