Acciones en ALV

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • Driau
    Senior Member
    • ago
    • 235

    #1

    Acciones en ALV

    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???
  • ibecerra

    #2
    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

    Comentario

    • Driau
      Senior Member
      • ago
      • 235

      #3
      Una última ayuda

      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!

      Comentario

      • ibecerra

        #4
        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

        Comentario

        • Driau
          Senior Member
          • ago
          • 235

          #5
          Problema con &quot;When&quot;

          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???

          Comentario

          • melerogalan
            Senior Member
            • nov
            • 142

            #6
            Para utilizar el when...debes de abrir el case, asi es la estrutura:
            Case <var>.
            when valor1.
            ....
            when valor2.
            ...
            endcase.

            Saludos.
            Cada vez que un programador hace una hora extra, Dios mata a un gatito...tenlo en cuenta

            Comentario

            • Driau
              Senior Member
              • ago
              • 235

              #7
              Pero...CASE que???

              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!

              Comentario

              • melerogalan
                Senior Member
                • nov
                • 142

                #8
                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.
                Editado por última vez por melerogalan; 18/09/2007, 10:53:32.
                Cada vez que un programador hace una hora extra, Dios mata a un gatito...tenlo en cuenta

                Comentario

                • ibecerra

                  #9
                  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

                  Comentario

                  • Driau
                    Senior Member
                    • ago
                    • 235

                    #10
                    Casi Casi está! ;-)

                    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!

                    Comentario

                    • ibecerra

                      #11
                      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

                      Comentario

                      • melerogalan
                        Senior Member
                        • nov
                        • 142

                        #12
                        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.
                        Editado por última vez por melerogalan; 19/09/2007, 14:29:26.
                        Cada vez que un programador hace una hora extra, Dios mata a un gatito...tenlo en cuenta

                        Comentario

                        • Driau
                          Senior Member
                          • ago
                          • 235

                          #13
                          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!!

                          Comentario

                          • melerogalan
                            Senior Member
                            • nov
                            • 142

                            #14
                            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.
                            Cada vez que un programador hace una hora extra, Dios mata a un gatito...tenlo en cuenta

                            Comentario

                            Trabajando...