Insertar botón en la barra de herramientas del ALV

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • jplozano
    Member
    • feb
    • 31

    #1

    Insertar botón en la barra de herramientas del ALV

    Hola a todos:

    Tengo preparado un ALV y necesito insetar un botón en la barra de herramientas mediante código, he visto algún ejemplo pero con programación orientada a objetos pero yo tengo un ALV de tipo grid normalillo.

    La idea poder insertar un botón y capturar cuando ese botón sea pulsado para llamar a un formulario, bueno cuando descubra como.

    Saludos.
  • JAC
    Junior Member
    • oct
    • 27

    #2
    Hola jplozano yo tengo el mismo problema que tú. Te comento lo que se hasta ahora a ver si nos podemos ayudar mutuamente.

    Por lo visto cuanto tu llamas a la función alv grid. De la siguiente forma
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
    I_BUFFER_ACTIVE = ' '
    i_callback_program = repid
    i_callback_top_of_page = 'TOP_OF_PAGE'
    i_callback_pf_status_set = 'PF_STATUS_SET'
    I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
    is_layout = s_layout
    it_fieldcat = fieldcat
    it_sort = tab_sort
    i_save = 'A'
    TABLES
    t_outtab = it_list
    EXCEPTIONS
    program_error = 1
    OTHERS = 2.
    En donde pone i_callback_top_of_page lo que estas poniendo en realidad es una llamada a una perform por lo que tienes que tener en tú programa una form con la siguiente forma.
    *---------------------------------------------------------------------*
    * FORM pf_status_set *
    *---------------------------------------------------------------------*
    * ........ *
    *---------------------------------------------------------------------*
    FORM pf_status_set USING gt_extab TYPE slis_t_extab.

    SET TITLEBAR 'ALV' WITH sy-title.
    SET PF-STATUS 'ALV'.

    ENDFORM.
    Desda aqui puedes pinchar en SET PF-STATUS 'ALV' y de esta forma crearas el status.

    Por lo que es posible deducir que para tratar el evento que va a producir el status deberías tener un form que se llamase 'USER_COMMAND'. Es decir de esta forma.
    *---------------------------------------------------------------------*
    * FORM user_command *
    *---------------------------------------------------------------------*
    * ........ *
    *---------------------------------------------------------------------*
    * --> F_UCOMM *
    * --> I_SELFIELD *
    *---------------------------------------------------------------------*
    FORM USER_COMMAND USING f_ucomm LIKE sy-ucomm
    i_selfield TYPE slis_selfield.

    READ TABLE it_list INDEX i_selfield-tabindex.
    CASE f_ucomm.
    WHEN 'SALIR'.
    LEAVE PROGRAM.
    ENDCASE.

    ENDFORM.
    Pero la verdad es que a mi me da un dump me dice lo siguiente

    Errores tiempo ejecució
    MOVE_TO_LIT_NOTALLOWED_NODATA
    ocurrido el 25.02.2007 a 23:15:39

    >> Dump breve ABAP no almacenado completamente (muy grande)


    Assignment error: Overwriting a protected field.

    Siento responderte con una pregunta pero la verdad es que no se por donde seguir a ver si la gente del foro nos echa una mano.
    Archivos Adjuntos

    Comentario

    • jplozano
      Member
      • feb
      • 31

      #3
      Hola JAC:

      Yo está parte creo que la tengo más o menos resuelta. Por lo que he visto mí código es muy parecido al tuyo. Te lo adjunto por si tú ves alguna diferencia.

      form user_command_01 using ucomm like sy-ucomm
      selfield type slis_selfield.

      READ TABLE ti_datos INDEX selfield-tabindex into wa_datos.
      check sy-subrc = 0.

      case ucomm.
      * Doble Click
      when '&IC1'.
      CASE SELFIELD-FIELDNAME.
      WHEN 'CHECKBOX'.
      wa_datos-checkbox = 'X'.
      modify ti_datos from wa_datos index sy-tabix.
      ucomm = '&REFRESH'.
      WHEN OTHERS.
      ENDCASE.
      endcase.
      endform. "user_command_01

      Lo unico que yo controlo si se punsa en una columna para activar un checkbox.

      Saludos. Espero que te sirva.

      Comentario

      • JAC
        Junior Member
        • oct
        • 27

        #4
        jplozano me puedes decir que le has puesto para rellenar el argumento
        IT_EVENTS, es que creo que este es mi problema. Que es precisamente donde se rellena el evento a que form esta asociado.

        Si me equivoco que alguién me corrija gracias.

        Comentario

        • jplozano
          Member
          • feb
          • 31

          #5
          Te pasó la llamada a la función entera, por si quieres compararla.

          CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
          EXPORTING
          i_callback_program = g_repid
          i_callback_user_command = 'USER_COMMAND_01'
          * i_callback_pf_status_set = 'SET_PF_STATUS_01'
          i_structure_name = 't_trabajo '
          is_layout = gs_layout
          it_fieldcat = gt_fieldcat[]
          IT_SORT = GT_SORT[]
          IT_EXCLUDING = GT_EXCLUDE[]
          * I_DEFAULT = 'X'
          I_SAVE = ' ' "Grabar Variante
          IS_VARIANT = ls_vari
          IT_EVENTS = GT_EVENTS[]
          TABLES
          T_OUTTAB = t_materiales
          EXCEPTIONS
          program_error = 1
          OTHERS = 2.

          Suerte.

          Comentario

          • Renzo_bravo
            Junior Member
            • ene
            • 2

            #6
            Solución

            1. Visualizar el programa SAPLSLVC_FULLSCREEN.
            2. Desplegar Status GUI.
            3. clic derecho sobre STANDARD_FULLSCREEN.
            4. clic en copiar.
            5. escoger el programa destino y colocar un nombre.
            6. Editar nuestro programa Z y luego ingresar al status copiado. Modificar ó añadir el botón requerido.

            Funciona!!!

            Comentario

            Trabajando...