PDA

Ver la Versión Completa : Acciones en ALV


Driau
17/09/07, 13:05:14
Hola a todos!

Sólo os quería preguntar una cosilla. He hecho un ALV que lista los documentos de compra de material. Lo que passa es que he visto ALV's en los que cuando por ejemplo le das al número de documento de compras en el mismo ALV...te redirije a otra transacción...o a otro lado para poder ver ése documento de compras. En mi ALV si le doy a un número de documento de compras...no passa nada.

Alguien sabe porque??? :confused:

ibecerra
17/09/07, 14:37:08
lo que deseas es darle doble click al campo donde se encuentra el documento y q llame una transaccion estandar para poder visualizarla si es asi..
te adjunto el codigo
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
i_callback_program = g_repid
i_callback_pf_status_set = 'SET_STATUS'
i_callback_user_command = 'USER_COMMAND'
i_structure_name = 'it_alv_ind'
is_layout = gs_layout
it_fieldcat = gt_fieldcat[]
i_save = g_save
is_variant = g_variant
it_events = gt_events[]
is_print = gs_print
TABLES
t_outtab = it_alv_ind
EXCEPTIONS
program_error = 1
OTHERS


*---------------------------------------------------------------------*
* FORM user_command *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> PA_UCOMM *
* --> PA_TABLA *
*---------------------------------------------------------------------*
Este es un ejemplo en este caso llamo a la transaccion FB03 para ver un documento contable..

FORM user_command USING pa_ucomm LIKE sy-ucomm
pa_tabla TYPE slis_selfield.
WHEN '&IC1'.
CHECK NOT pa_tabla-value IS INITIAL.
READ TABLE it_alv_ind INDEX pa_tabla-tabindex.
CASE pa_tabla-sel_tab_field.
WHEN 'IT_ALV_IND-BELNR'.
SET PARAMETER ID 'BLN' FIELD pa_tabla-value.
SET PARAMETER ID 'BUK' FIELD it_alv_ind-bukrs.
SET PARAMETER ID 'GJR' FIELD it_alv_ind-gjahr.
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.

ENDFORM

Driau
17/09/07, 15:35:20
Gracias por el código. Lo he estado mirando y utiliza la misma función que para mostrar el ALV que mi código. El problema es que al compilar-lo me da un montón de errores como la variable g_repid, etc.... No acabo de saber como montar-lo. Lo veo...pero nose cómo...me podrias ayudar?? Mi codigo de ALV és éste:

Primero ejecuto el catálogo en un form:

FORM CATALEG_ALV.
SORT IT_OUT BY TEXT EBELN.
CLEAR IT_FIELDCAT.
CLEAR WA_FIELDCAT.
WA_FIELDCAT-FIELDNAME = 'EINDT'.
WA_FIELDCAT-REF_FIELDNAME = 'EINDT'.
WA_FIELDCAT-REF_TABNAME = 'MDBS'.
WA_FIELDCAT-OUTPUTLEN = 16.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.
WA_FIELDCAT-FIELDNAME = 'MATNR'.
WA_FIELDCAT-REF_FIELDNAME = 'MATNR'.
WA_FIELDCAT-REF_TABNAME = 'EKPO'.
WA_FIELDCAT-OUTPUTLEN = 10.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.
WA_FIELDCAT-FIELDNAME = 'TXZ01'.
WA_FIELDCAT-REF_FIELDNAME = 'TXZ01'.
WA_FIELDCAT-REF_TABNAME = 'EKPO'.
WA_FIELDCAT-OUTPUTLEN = 35.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.
WA_FIELDCAT-FIELDNAME = 'TEXT'.
WA_FIELDCAT-REF_FIELDNAME = 'TEXT'.
WA_FIELDCAT-SELTEXT_L = 'Proveedor'.
WA_FIELDCAT-OUTPUTLEN = 30.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.
WA_FIELDCAT-FIELDNAME = 'MENGE'.
WA_FIELDCAT-REF_FIELDNAME = 'MENGE'.
WA_FIELDCAT-REF_TABNAME = 'EKPO'.
WA_FIELDCAT-OUTPUTLEN = 13.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.
WA_FIELDCAT-FIELDNAME = 'MEINS'.
WA_FIELDCAT-REF_FIELDNAME = 'MEINS'.
WA_FIELDCAT-REF_TABNAME = 'EKPO'.
WA_FIELDCAT-OUTPUTLEN = 4.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.
WA_FIELDCAT-FIELDNAME = 'EBELN'.
WA_FIELDCAT-REF_FIELDNAME = 'EBELN'.
WA_FIELDCAT-REF_TABNAME = 'EKPO'.
WA_FIELDCAT-OUTPUTLEN = 17.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.
WA_FIELDCAT-FIELDNAME = 'BEDAT'.
WA_FIELDCAT-REF_FIELDNAME = 'BEDAT'.
WA_FIELDCAT-REF_TABNAME = 'EKKO'.
WA_FIELDCAT-OUTPUTLEN = 14.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.
WA_FIELDCAT-FIELDNAME = 'PEINH'.
WA_FIELDCAT-REF_FIELDNAME = 'PEINH'.
WA_FIELDCAT-REF_TABNAME = 'EIPA'.
WA_FIELDCAT-OUTPUTLEN = 7.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.
WA_FIELDCAT-FIELDNAME = 'PREIS'.
WA_FIELDCAT-REF_FIELDNAME = 'PREIS'.
WA_FIELDCAT-REF_TABNAME = 'EIPA'.
WA_FIELDCAT-OUTPUTLEN = 12.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.
WA_FIELDCAT-FIELDNAME = 'ENTREGA'.
WA_FIELDCAT-REF_FIELDNAME = 'MENGE'.
WA_FIELDCAT-SELTEXT_L = 'Por entregar'.
WA_FIELDCAT-OUTPUTLEN = 10.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.
WA_FIELDCAT-FIELDNAME = 'MENGE2'.
WA_FIELDCAT-REF_FIELDNAME = 'MENGE'.
WA_FIELDCAT-REF_TABNAME = 'EKPO'.
WA_FIELDCAT-SELTEXT_L = 'Ctd. EM'.
WA_FIELDCAT-OUTPUTLEN = 12.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.
WA_FIELDCAT-FIELDNAME = 'IMPORT'.
WA_FIELDCAT-REF_FIELDNAME = 'IMPORT'.
WA_FIELDCAT-SELTEXT_L = 'Importe'.
WA_FIELDCAT-OUTPUTLEN = 12.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
ENDFORM. "CATALEG_ALV


Luego voy a por el layout:

FORM LAYOUT_ALV USING LS_LAYOUT TYPE SLIS_LAYOUT_ALV.
LS_LAYOUT-ZEBRA = 'X'.
LS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
ENDFORM. "LAYOUT_ALV


Y finalmente (que creo que es donde debo modificar mayoritáriamente) llamo a la función:

FORM MOSTRAR_ALV.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
IT_FIELDCAT = IT_FIELDCAT
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
IS_LAYOUT = GS_LAYOUT
TABLES
T_OUTTAB = IT_OUT
.
IF SY-SUBRC <> 0.
ENDIF.
ENDFORM. "MOSTRAR_ALV

Como ves mi tabla de salida es la IT_OUT.

Nose--si me podrias ayudar con ésto...sy lo haces lo único que podré darte es mi gratitud...pero creeme que a mi me seria de gran ayuda.

Gracias por tu tiempo,

Un saludo! :)

ibecerra
17/09/07, 15:57:36
esto es lo que tienes ok .. esta bien lo unico q deberias d hacer es lo siguiente
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
IT_FIELDCAT = IT_FIELDCAT
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
IS_LAYOUT = GS_LAYOUT
TABLES
T_OUTTAB = IT_OUT
*------------------------------------------------------------------------
*---------------------------------------------------------------------*
* FORM user_command *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> PA_UCOMM *
* --> PA_TABLA *
*---------------------------------------------------------------------*
FORM user_command USING pa_ucomm LIKE sy-ucomm
pa_tabla TYPE slis_selfield.
WHEN '&IC1'.
CHECK NOT pa_tabla-value IS INITIAL.
READ TABLE IT_OUT INDEX pa_tabla-tabindex.
CASE pa_tabla-sel_tab_field.
WHEN 'IT_OUT-tucampo'.
SET PARAMETER ID 'BLN' FIELD pa_tabla-value.
-- tus valor o pedido de compra
CALL TRANSACTION 'tu transaccion' AND SKIP FIRST SCREEN.

ENDFORM

Driau
18/09/07, 07:38:09
Hola amigo!

Ante todo gracias por contestar!! Me sirve de mucho todo esto!

He estado probando el codigo y lo único que falla es que me da un error en el

WHEN '&IC1'.

No me hara falta abrir una estructur de tipo "WHEN"??

Imagino que el "&IC1" debe ser el valor asociado al click de ratón no???

melerogalan
18/09/07, 08:37:23
Para utilizar el when...debes de abrir el case, asi es la estrutura:
Case <var>.
when valor1.
....
when valor2.
...
endcase.

Saludos.

Driau
18/09/07, 10:24:57
Pos eso...que eso del when lo tengo claro. Pero segun está hecho el código....seria CASE que?

Grácias a todos por contestar!

melerogalan
18/09/07, 10:45:54
Seria case pa_ucomm.
En esta variable se almacena el boton que pulsas en el alv, en el ejemplo es el clic l oque tiene almacenado, que creo que es lo que buscas, que al hacer click se te vaya a un docuemnto o material.

Espero que ahora te funcione :)

Pd- Si no te va todavia, yo tengo echo algo similar pero en lugar de materiales accedo a la visualizacion de unos pedidos al hacer click y el pedido sale en el alv subrayado como si fuera un hiperenlace, sin cambiar el color, solo subrayado.

ibecerra
18/09/07, 13:27:04
melerogalan Tiene razon.. la sentencia deberia decir lo siguiente.
pero asumia yo que conocias un poco mas abap por eso reduje el codigo

*---------------------------------------------------------------------*
* FORM user_command *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> PA_UCOMM *
* --> PA_TABLA *
*---------------------------------------------------------------------*
FORM user_command USING pa_ucomm LIKE sy-ucomm
pa_tabla TYPE slis_selfield.
CASE pa_ucomm.
WHEN '&IC1'.
CHECK NOT pa_tabla-value IS INITIAL.
READ TABLE IT_OUT INDEX pa_tabla-tabindex.
CASE pa_tabla-sel_tab_field.
WHEN 'IT_OUT-tucampo'.
SET PARAMETER ID 'BLN' FIELD pa_tabla-value.
-- tus valor o pedido de compra
CALL TRANSACTION 'tu transaccion' AND SKIP FIRST SCREEN.
ENDCASE.
ENDFORM

Driau
19/09/07, 11:02:48
Hola a todos!

He estado probando varias cosillas y al final trasteando por ahí, he conseguido algo parecido. Ahora los pedidos me salen subrayados y efectivamente cuando le doy a uno me redirige a la ME23N!!! És decir que funciona casi casi a la perfección...si no fuera porque siempre me coge el mismo número de pedido....es decir...le importa un bledo a que número de pedido le de...el siempre coge el mismo. Tendrá que ver con ésto?

FORM USER_COMMAND USING P_UCOMM LIKE SY-UCOMM
P_SELFIELD TYPE SLIS_SELFIELD.
CASE P_UCOMM.
WHEN '&IC1'. " SAP standard code for double-clicking
SET PARAMETER ID 'EBELN' FIELD P_SELFIELD-VALUE.
CALL TRANSACTION 'ME23N'.
ENDCASE.

ENDFORM.

Éste es mi código...veis algo mal???

Grácias a todos por vuestro tiempo!

ibecerra
19/09/07, 13:36:46
prueba asi y debe llamar al codigo q le das click
FORM USER_COMMAND USING P_UCOMM LIKE SY-UCOMM
P_SELFIELD TYPE SLIS_SELFIELD.
CASE P_UCOMM.
WHEN '&IC1'. " SAP standard code for double-clicking
CHECK NOT P_SELFIELD-value IS INITIAL.
*identifica el registro q has dado click
READ TABLE IT_OUT INDEX P_SELFIELD-tabindex.
*capturado el registro pasa como parametro a la Tx.
SET PARAMETER ID 'EBELN' FIELD P_SELFIELD-VALUE.
CALL TRANSACTION 'ME23N'.
ENDCASE.
ENDFORM

melerogalan
19/09/07, 14:26:05
Te falta pasarle el documento, fijate.

Te escribo lo qeu veo que te falta.
en la cabecera esto:
FORM f_user_command USING p_ucomm LIKE sy-ucomm
p_selfield TYPE slis_selfield.


.
.
.
* NOTA: En p_selfield se te guarda el campo que has seleccionado, el valor de ese campo y algunas cosillas mas ,lo qeu a nosotros nos interesa son estos.

IF NOT p_selfield-value IS INITIAL
AND p_selfield-sel_tab_field = 'TABLA-CAMPO'
PERFORM f_VER_LO_QUE_SEA USING p_selfield-value.

* En 'value' esta el valor y el 'sel_tab_field' para que cuando pulses sobre ese campo te vaya al documento y no sobre cualquiera.
*******
FORM f_VER_LO_QUE_SEA USING p_value TYPE slis_selfield-value.

* Define una variable del tipo que corresponda
DATA: ld_input LIKE tabla-campo o TYPE tipo.

MOVE p_value TO ld_input.
SET PARAMETER ID 'AUN' FIELD ld_input.

CALL TRANSACTION 'NOMBRE_TRANSACCION' AND SKIP FIRST SCREEN.

ENDFORM.


ASI TE FUNCIONA, SAludos.

Driau
20/09/07, 08:06:11
oK! Ya lo tengo funcionando. Al finla mi código ha sido el siguiente:

FORM USER_COMMAND USING P_UCOMM LIKE SY-UCOMM
P_SELFIELD TYPE SLIS_SELFIELD.
CASE P_UCOMM.
WHEN '&IC1'. " SAP standard code for double-clicking
CHECK NOT P_SELFIELD-VALUE IS INITIAL.
READ TABLE IT_OUT INDEX P_SELFIELD-TABINDEX.
SET PARAMETER ID 'BES' FIELD P_SELFIELD-VALUE.
CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN..
ENDCASE.
ENDFORM. "USER_COMMAND

Lo único que no enteiendo es lo de:
SET PARAMETER ID 'BES' FIELD P_SELFIELD-VALUE.

Porque me lo habeis dicho...pero yo otra vez como sabre que si al EBELN le equivale un BES....a un MATNR...que le equivale??? Hay alguna tabla de equivalencias para ésto???

Bueno...grácias a todos por vuestra ayuda...ha costado pero ha valido la pena!!

melerogalan
20/09/07, 08:32:15
Es muy facil compañero.
Cuando tu ejecutas cualquier transaccion(cualquier cosa en general), si pones el cursor del raton sobre cualquier sitio, en nuestro ejemplo, en la casilla donde se introduce el numero de material y le das a F1 te sale la ayuda, abajo vendrá un botón llamado 'DATOS TECNICOS', en esa hoja que te aparece te viene información muy importante como los datos para hacer un batch input (nombre del campo que debes incluir) y otras cosas, entre ellas te viene el ID del parametro para utilizarlo en estas ocasiones.
Si quieres mas aclaraciones, pregunta. :)