PDA

Ver la Versión Completa : Function 'reuse_alv_popup_to_select'


acha3318
11/03/09, 20:42:56
Hola a todos,

Estoy usando la función CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT', para mostrar una lista de SOLPED, la pregunta es: ¿Como hago para que desde este ALV, haga click sobre un registro y me muestre la SOLPED y ejecute la ME53N?
Alguién sabe algún truco sobre esta función ? Gracias por sus respuestas

ACHA

ongo
12/03/09, 10:42:31
Buenas,

Con esa función en el alv puedes poner que un campo sea de tipo check box utilizando la linea i_checkbox_fieldname. En tu tabla interna pones un char de 1 y en esa linea de la función pones el nombre del campo tipo char1.
Si te fijas en tables t_outtab la función te devuelve la tabla que tu le digas. Los registros que hayas elegido en el pop up tendran una X en el campo de tipo char1. Luego puedes hacer un loop a esta tabla donde el campo ese tenga la X y ejecutar el programa o transacción ke necesites.

Espero haberte ayudado en algo.

Un saludo,

Ongo

acha3318
12/03/09, 12:17:31
Gracias por responder, pero te cuento, eso que me dices ya lo tengo hecho para mostrar una lista de SOLPED, esa lista es para rechazarlas y la "X" en el campo es para identificar las que seran rechazadas, pero el usuario quiere ahi que sobre la lista, poder hacer doble click y entrar a revisar la SOLPED en la transacción ME53N. Se que con esta linea de la función i_callback_user_command = 'USER_COMMAND' se puede hacer pero no he logrado hacerla funcionar no se que tanto debo tener antes para que funcione

CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
EXPORTING
i_title = 'Modos:'
i_selection = ' '
i_zebra = 'X'
i_tabname = 'TI_MODOS'
it_fieldcat = ti_cat1
i_callback_program = l_repid
i_callback_user_command = 'USER_COMMAND'
IMPORTING
es_selfield = l_selfield
e_exit = l_exit
TABLES
t_outtab = ti_modos
EXCEPTIONS
program_error = 1
OTHERS = 2.

Les agradezco si alguién me puede ayudar...


Buenas,

Con esa función en el alv puedes poner que un campo sea de tipo check box utilizando la linea i_checkbox_fieldname. En tu tabla interna pones un char de 1 y en esa linea de la función pones el nombre del campo tipo char1.
Si te fijas en tables t_outtab la función te devuelve la tabla que tu le digas. Los registros que hayas elegido en el pop up tendran una X en el campo de tipo char1. Luego puedes hacer un loop a esta tabla donde el campo ese tenga la X y ejecutar el programa o transacción ke necesites.

Espero haberte ayudado en algo.

Un saludo,

Ongo

ongo
12/03/09, 14:32:09
Buenas,

Yo para esas cosas utilizo la función POPUP_WITH_TABLE_DISPLAY. Aquí pinchas una linea y la función te devuelve la linea que has elegido. Después puedes hacer un read a tu tabvla injterna y el call a la transacción.

A ver si esta vez si te vale

acha3318
12/03/09, 16:26:23
Vale, voy a probar la función POPUP_WITH_TABLE_DISPLAY y te cuento como me fué.

Gracias.

Buenas,

Yo para esas cosas utilizo la función POPUP_WITH_TABLE_DISPLAY. Aquí pinchas una linea y la función te devuelve la linea que has elegido. Después puedes hacer un read a tu tabvla injterna y el call a la transacción.

A ver si esta vez si te vale

Jonathan Barrio Rodriguez
12/03/09, 17:19:04
En cuanto al REUSE_ALV_POPUP_TO_SELECT, funcionará igual que la función de ALV?

Podrías probar a verificar las líneas rojas...

"controla que si selo pones en mayusculas el "user_command" a continuación tb, y que esté igual escrito

FORM user_command USING r_ucomm rs_selfield TYPE slis_selfield.
DATA:
answer.
DATA p_ref1 TYPE REF TO cl_gui_alv_grid.

l_okcode = r_ucomm.
CASE sy-ucomm. "ANTES R_UCOMM.
*====================================================================*
*
WHEN 'RENOVAR'.
*________________________________________________________________*
CLEAR: code.
status = '9001'.
* Función que actualiza la tabla interna con los valores modificados en el alv, en este caso el
* valor del campo flag, el cual hemos modificado para indicarlo para borrado.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = p_ref1.
CALL METHOD p_ref1->check_changed_data.
* RS_SELFIELD-IGNORE_MULTI = 0.
*====================================================================*
* tabla buffer para recargar el box seleccionado registros seleccionados.
* si las ordenes del usuario son volver.
REFRESH: tabla_alv_buffer. tabla_alv_buffer[] = tabla_alv[].
*____________________________________________________________________*

No sé si esto te puede ayudar o es lo que pedías, por si sirve.

acha3318
13/03/09, 12:28:42
Saludos a todos, muchas gracias a los abaperos que intentaron ayudarme, pero ya solucioné el caso y para todos los que estuvieron pendientes explico como se soluciona:

CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
EXPORTING
i_title = 'RECHAZAR SOLICITUDES DE PEDIDOS'
i_selection = ' '
i_zebra = 'X'
i_screen_start_column = 1
i_screen_start_line = 1
i_screen_end_column = 130
i_screen_end_line = 20
it_fieldcat = lt_fieldcat
i_tabname = 'TI_SOLPEDS'
i_checkbox_fieldname = 'CHECK'
i_callback_program = l_repid
i_callback_user_command = 'USER_COMMAND'
IMPORTING
es_selfield = l_selfield
e_exit = l_exit
TABLES
t_outtab = ti_solpeds.

Yo intentaba usar esta función para mostrar mis datos de SOLPED donde adicioné un campo para manejarlo como checkbox, y asi mas adelante evaluar si estaba con X o no. Pero además intentaba dar doble click sobre el numero de SOLPED para consultar sobre la ME53N, pero esta función no me proporciona la opción de manejar eventos sobre el ALV, osea que no sirve para mi propósito de doble click.

La función para este propósito es:

CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
i_callback_program = l_repid
is_layout = wa_layout
it_fieldcat = lt_fieldcat
i_default = 'X'
i_save = 'A'
it_events = ti_events
TABLES
t_outtab = ti_solpeds
EXCEPTIONS
program_error = 1
OTHERS = 2.

Esta función además de propórcionarme las mismas bondades de la anterior, me permite manejar eventos mediante el parametro (it_events), aqui traigo todos los eventos en especial el USER_COMMAND que son los eventos hechos por el usuario final, veamos como obtengo los eventos:

CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = l_type
IMPORTING
et_events = ti_events.

* Leer evento 'TOP_OF_PAGE'
READ TABLE ti_events WITH KEY name = slis_ev_top_of_page
INTO wa_events.
* Asignar Rutina FORM 'TOP_OF_PAGE' a evento
IF sy-subrc = 0.
MOVE slis_ev_top_of_page TO wa_events-form.
MODIFY ti_events FROM wa_events INDEX sy-tabix.
ENDIF.

Ya teniendo en la tabla interna ti_events los eventos que deseo manejar construyo la rutina USER_COMMAND, para evaluar cuando se hace doble click asi:

FORM user_command USING ucomm LIKE sy-ucomm
sfields TYPE slis_selfield.

DATA: l_objectname TYPE tstc-tcode.

* Hace una copia de los registros antes de regresar
ti_solpeds_bakup[] = ti_solpeds[]
.
* Rescatar el registro seleccionado.
IF sfields-tabname EQ 'TI_SOLPEDS'.
READ TABLE ti_solpeds INDEX sfields-tabindex.
ENDIF.

* Selección de opción.
CASE ucomm.
* DOUBLE CLICK.
WHEN '&IC1' OR '&ICM'.
* Evaluar valor de campo seleccionado.
CHECK NOT sfields-value IS INITIAL.

CASE sfields-fieldname.

* ########################################################
* ##### Solicitud de Pedido. #####
* ########################################################
WHEN 'BANFN'.
MOVE sfields-value TO sy-lisel.
SET PARAMETER ID 'BAN' FIELD sy-lisel. "BANFN Numero de Solicitud de Pedido
CALL TRANSACTION 'ME53N' AND SKIP FIRST SCREEN.
WHEN 'MATNR'.
MOVE sfields-value TO sy-lisel.
SET PARAMETER ID 'MAT' FIELD sy-lisel. "Material
CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.

WHEN OTHERS.
* DO NOTHING !!!
ENDCASE.

WHEN OTHERS.
* DO NOTHING !!!
ENDCASE.

IF sfields-tabname EQ 'TI_SOLPEDS'.
* Hago el refresh en el ALV.
ti_solpeds[] = ti_solpeds_bakup[].
* PERFORM seleccionar_datos.
sfields-refresh = 'X'.
ENDIF.

ENDFORM. "user_command

Espero que estos datos les sirva a alguien mas que desea hacer algo parecido

Gracias,

ACHA