Mostrar/Ocultar botón ALV Status GUI

Buenas a todos,

estoy empezando a trabajar con ALV’s y mas o menos voy avanzando, pero me ha surgido una duda que no he conseguido solucionarla. Creo que tiene que ser sencillo…pero he probado varias cosas y no lo consigo, :S.

Tengo un report con parámetros de selección y contiene un alv con los resultados. Como status guid de este ALV tengo una copia de status gui estandar (FM: SALV).

Lo que quiero hacer es que, en función de un parámetro de selección (es un checkbox), aparezca o desaparezca un botón personalizado de mi status gui.

He investigado un poco acerca de este tema y he encontrado dos opciones para solucionarlo:
1.- Usando el metodo “GRID_CONTENEDOR->set_table_for_first_display”.
2.- Usando la funcion “REUSE_ALV_GRID_DISPLAY”.

Estoy usando un ALV construido a partir de la clase CL_SALV_TABLE, y al no definir en ningún sitio ni contenedor ni grid he descartado usar la primera opción.

Estoy usando la segunda opción, pero al ejecutarse me lanza un error el programa y no carga el ALV diciéndome que “No es posible determinar un catalogo del campo”:

A continuación os pongo el trozo de código implementado:

DATA: w_salida TYPE LINE OF tipo_salida,
           it_exclude TYPE slis_t_extab,
             wa_exclude TYPE slis_extab.

      wa_exclude-fcode = '&ADDPREINM'. " Codigo de mi boton
      APPEND wa_exclude TO it_exclude.


  IF it_exclude IS NOT INITIAL.

    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING
*       I_STRUCTURE_NAME = 'TIPO_SALIDA' " Tipo de linea de la tabla de salida
        it_excluding = it_exclude "exclude functions
    TABLES
      T_OUTTAB         = t_salida "table data    " Mi tabla de salida con los datos a mostrar
    EXCEPTIONS
      PROGRAM_ERROR   = 6.

    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.   ENDIF.
   g_alv->display( ).

He visto que algunos aconsejan poner también el parámetro “I_STRUCTURE_NAME”, aunque yo lo tengo comentado.

También ha coincidido que los ejemplos que he visto son sobre Tablas del estandar (SFLIGHT, SPFLI…) y en mi caso se trata de una estructura y tabla de salida personalizada (no sé si esto puede afectar en algo).

Bueno espero haberme explicado y que me podáis orientar un poco, :).

Un saludo,
Rafa.

¿qué tipo de estructura tiene la tabla t_salida? ¿si está definida en el ddic por qué no la pones en dicho parámetro?
Si no usas ese parámetro ¿ por qué no usas el parámetro “it_fieldcat” para pasarle un catálogo de campos a la función?

Buenas @Salco,

t_salida es una tabla que tiene la siguiente estructura:

TYPES: BEGIN OF ty_salida,
         bukrs        TYPE bukrs,
         plno         TYPE relmplno,
         xlp          TYPE relmxpl,
        .............                                  (contiene mas campos)
       END OF ty_salida.

DATA:  t_salida   TYPE STANDARD TABLE OF ty_salida,

Tendría que inicializar “it_fieldcat” añadiendo todos los campos del estructura ty_salida entonces?

Gracias.

he realizado esta funcion, la buscare en la tarde si es que nadie te da la respuesta, pero permiteme indicarte, que hacer este tipo de magia no es aconcejable, al final del dia quienes usan los reportes son contadores, y a ellos no les vendria bien un boton que aparezca o desaparezca dependiento de un check, creeme, se les olvida, y luego ya ni saben como hacerlo funcionar, mejor dejas el boton siempre visible, y si es un usuario con privilegios podra usarlo, pero sino tiene privilegios le mandas un error en pantalla de que no esta acto para usar dicha funcionalidad.

Claro si es practicando que estas, excelente.

2 Me gusta

Buenas @smota,

la verdad es que un requerimiento del cliente, :smiley:.

También había pensado investigar un poco acerca de modificar el estado del botón (que este desactivado por ejemplo), pero no sé si será mas sencillo o complicado que hacer desaparecer el botón completamente, :S

Gracias.

El problema con hacerlo desaparecer, es que en una lo tendras y en otra no, y esto trabajando con numeros ocaciona mas confuciones, mejor bloquealo por codigo, si pinchan el boton y se cumple la condicion necesaria, que diga “No tiene acceso a esta funcionalidad” y si tiene acceso entonces que se ejecute.

Yo tuve un caso asi, y al cabo del tiempo ni yo mismo sabia porque desaparecia y porque aparecia a veces, y tuve que debuguear nuevmente el sistema para ver cuales eran las condiciones.

Tranquilo, si el cliente exigio esa funcionalidad asi, ellos son los que saben, pero al menos explicale las futuras concecuencias del boton magico, xD asi lo llamo.

2 Me gusta

Buenas.
Dos cosas: estoy de acuerdo con @smota en lo peligroso que puede ser que aparezca o no el botón, porque después de un tiempo uno ni se acuerda del motivo. Pero si son requisitos del cliente la forma de hacerlo es como pones en tu posts, con la tabla de exclusión.

Para el catálogo de campos necesitas rellenar la tabla “it_fieldcat”:

TYPE-POOLS: slis.
FORM build_fieldcat USING it_fieldcat TYPE slis_t_fieldcat_alv.
DATA: ls_fieldcat TYPE slis_fieldcat_alv.

REFRESH fieldcat.

CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'BUKRS'.
ls_fieldcat-tabname = 'USR_TABL_ALV'.
ls_fieldcat-key = 'X'.
ls_fieldcat-reptext_ddic = 'Sociedad'
ls_fieldcat-outputlen = 12.
APPEND ls_fieldcat TO fieldcat.
(PARA TODOS LOS CAMPOS)
2 Me gusta

Buenas.

¿El botón del GUI lo quieres esconder según un checkbox en la pantalla de selección?
Veo una forma fácil de hacerlo y es teniendo dos Status GUI: uno completo con todos los botones y otro donde lo elimines y lo que haces es asignar uno u otro en base al estado del checkbox. No es una forma elegante, pero puedes resolver con ello.

La otra forma que se me ocurre es usando un ALV OO y modificar allí los elementos que quieres que salgan en el ALV. Si consigo un ejemplo te lo envío.

1 me gusta

Buenas @nacaballero,

pues en principio es un checkbox en la pantalla de selección, pero puede ser que cambie a un radiobutton, pero la acción va a ser la misma…al activar/desactivar el checkbox, se ocultará/mostrará un botón en la barra de botones del status grid.

Os agradezco la ayuda y en cuanto pueda sigo vuestros consejos y os comento, que ahora tiene otra cosa más prioridad y ya sabeis como funciona esto, :D.

Un saludo,
Rafa.

Buenas de nuevo chicos,

he retomado de nuevo el ALV…y ahora me han pedido hacerlo utilizando la clase CL_GUI_ALV_GRID, por lo que he podido resolver el problema de una forma sencilla:

Tengo un evento a la escucha del Toolbar y en función de un parámetro de entrada añado un botón u otro al objeto estandar del Toolbar (cl_alv_event_toolbar_set). Os pongo el código por si le puede ayudar a alguien:

Declaración de evento:

  METHOD alv_set_events_grid.
    SET HANDLER handle_toolbar FOR g_alv_grid.
  ENDMETHOD.

LLamada a PERFORM:

  METHOD handle_toolbar.
* Mostramos/Ocultamos botones de status gui
    PERFORM handle_tool_bar USING e_object.
  ENDMETHOD.

Código fuente:

FORM handle_tool_bar  USING    i_object TYPE REF TO cl_alv_event_toolbar_set.
  TYPE-POOLS: icon.

  DATA:
        ls_toolbar TYPE stb_button.

  CLEAR: ls_toolbar.
  IF p_create EQ abap_true.
    ls_toolbar-function = 'CREAR'.
    ls_toolbar-icon     = icon_create.
    INSERT ls_toolbar INTO i_object->mt_toolbar INDEX 1.

  ELSEIF p_delete EQ abap_true.
    ls_toolbar-function = 'ELIMINAR'.
    ls_toolbar-icon     = icon_delete.
    INSERT ls_toolbar INTO i_object->mt_toolbar INDEX 1. 
  ENDIF.
ENDFORM.

NOTA: INDEX corresponde a la posición del Toolbar donde se añade el botón.

Por último, cargamos datos de salida en ALV (esto lo pongo como informativo, ya que aqui no se añade nada del toolbar, :blush: ):

CALL METHOD g_alv_grid->set_table_for_first_display
  EXPORTING
    i_structure_name = c_struct_name
    is_layout        = gs_layout
  CHANGING
    it_outtab        = t_salida_grid[].

Pongo el post como solucionado, muchas gracias por vuestra ayuda!

Un saludo,
Rafa.

3 Me gusta

Este tema se cerró automáticamente 7 días después del último post. No se permiten nuevas respuestas.