Ayuda SAP

Como activar opciones de menu, reporte zeta

Hola,
Tengo una duda, existe un reporte Z, en el cual dentro de las opciones del menú(Tratar) las opciones Marcar Todo y Desmarcar Todo

Deseó habilitar esta opción para que las pueda usar el usuario, pero no encuentro la forma de hacerlo.

Veó que estos botones están definidos en el GUI

Si, los botones pueden estar bien definidos a nivel diseño, pero qué me dices del código del reporte zeta?
Puede estar programado para que no sean funcionales. ¬¬

Tendrás que brindar más datos si deseas que los @abapers te ayuden, no me animaría a decir que necesitarían leer todo el código, pero casi con seguridad que el código del menú si.

Saludos

Asi es, como dice @SidV se necesita adicionar codigo para que al presionar esos botones que ya tienes configurados a nivel visual, tengan la funcionalidad de marcar y desmarcar esos radio button.

Buenas,

mirá por favor en la se38 el report SALV_TEST_TABLE_SELECTIONS. En el está usando también el mismo status que vos y el quiz de la cuestión es usar una ALV que la primera columna sea la de poder hacer una selección de cada fila individualmente. En ese caso los elementos del menú Marcar todo y Desmarcar todo se habilitan.

En tu aLv parece que no tienes esa primera columna de selección habilitada.

1 me gusta

Keveli_Alba

Que tipo de código debería adicionar.

siempre es dependiento de tu programa, pero lo que si debes hacer es asignarle una ‘X’ a todos tus raddiobutton en la rutina del boton de seleccionar todo, y cuando estes en la rutina que desmarcar, solo asinale un espacio ’ '.

Ya agregué la opción que me indicas, pero lo guarda en nivel de la tabla, pero no se muestra a nivel de ALV,

La sección de código donde carga el ALV es la siguiente

METHOD generate_output.

  • PERFORM generate_output.
    DATA: lx_msg TYPE REF TO cx_salv_msg.
    DATA: lo_cols TYPE REF TO cl_salv_columns.
    DATA: lo_column TYPE REF TO cl_salv_column_list.
    DATA: lo_events TYPE REF TO cl_salv_events_table.
    DATA: lo_event_handler TYPE REF TO lcl_event_handler.
    DATA: lo_funct TYPE REF TO cl_salv_functions.
TRY.
    cl_salv_table=>factory(
      IMPORTING
        r_salv_table = o_alv
      CHANGING
        t_table      = gdt_alv ).
  CATCH cx_salv_msg INTO lx_msg.
ENDTRY.

o_alv->set_screen_status(
pfstatus      = 'SALV_STANDARD'
report        = sy-repid
set_functions = o_alv->c_functions_all ).

lo_cols = o_alv->get_columns( ).
lo_cols->set_optimize( 'X' ).

TRY.
    lo_column ?= lo_cols->get_column( 'CHECK' ).
    lo_column->set_cell_type( if_salv_c_cell_type=>checkbox_hotspot ).
    lo_column->set_output_length( 10 ).

    lo_column ?= lo_cols->get_column( 'LLIB' ).
    lo_column->set_long_text( 'Ind.Liber' ).
    lo_column->set_output_length( 10 ).

    lo_column ?= lo_cols->get_column( 'IMPORTE' ).
    lo_column->set_long_text( 'Importe' ).
  •    lo_column->set_output_length( 10 ).
    

*{insert @001
lo_column ?= lo_cols->get_column( ‘NAME1’ ).
lo_column->set_long_text( ‘Nombre Proveedor’ ).

  •    lo_column->set_output_length( 10 ).
    

*}insert @001

    lo_column ?= lo_cols->get_column( 'FRGKE' ).
    lo_column->set_visible( space ).

  CATCH cx_salv_not_found.                          "#EC NO_HANDLER
ENDTRY.

lo_events = o_alv->get_event( ).

CREATE OBJECT lo_event_handler.
SET HANDLER lo_event_handler->on_link_click   FOR lo_events.
SET HANDLER lo_event_handler->on_double_click FOR lo_events. "insert@001
SET HANDLER lo_event_handler->on_user_command FOR lo_events.


o_alv->display( ).

ENDMETHOD. "generate_output

no, en un ALV debe ser diferente, se debe activar mediante las opciones de tu catalogo, me imagine que era un raddiobutton normal

Estoy viendo que este programa lo han trabajado con metodos y clases, los botones ya me aparecen pero no me refresca las posiciones con el check marcado, al dar clip en marcar todo no me refresca la vista.

Para esto debes recorrer toda la tabla y marcar el campo “Idicador” por programación y luego refrescar el alv con el método adecuado.

claro ya hice el loop a la tabla y moví el valor ‘X’ a campo check, modifique la tabla y todo, pero para este caso como hago un refrescar a este tipo de ALV.

Al objeto del alv debes llamarle el metodo refresh , asi se llama “Refresh”.

He ingresado lo siguiente luego de modificar el reporte y asinarle el check de selección, pero me sigue sin visualizar los cambios

CASE sy-ucomm.
  WHEN '&SEL_ALL'.
    CLEAR: W_CHK, W_POS.
    ldt_alv[] = gdt_alv[].
    LOOP AT ldt_alv ASSIGNING <g_alv>.
      W_POS = SY-TABIX.
      <g_alv>-check = 'X'.
      MODIFY ldt_alv FROM <g_alv> INDEX W_POS.
    ENDLOOP.
    REFRESH gdt_alv[].
    gdt_alv[] = ldt_alv[].

*/…
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = o_alv
CHANGING
t_table = gdt_alv ).
CATCH cx_salv_msg INTO lx_msg.
ENDTRY.

    o_alv->set_screen_status(
    pfstatus      = 'SALV_STANDARD'
    report        = sy-repid
    set_functions = o_alv->c_functions_all ).

    lo_cols = o_alv->get_columns( ).
    lo_cols->set_optimize( 'X' ).

    TRY.
        lo_column ?= lo_cols->get_column( 'CHECK' ).
        lo_column->set_cell_type( if_salv_c_cell_type=>checkbox_hotspot ).
        lo_column->set_output_length( 10 ).

        lo_column ?= lo_cols->get_column( 'LLIB' ).
        lo_column->set_long_text( 'Ind.Liber' ).
        lo_column->set_output_length( 10 ).

        lo_column ?= lo_cols->get_column( 'IMPORTE' ).
        lo_column->set_long_text( 'Importe' ).

        lo_column ?= lo_cols->get_column( 'NAME1' ).
        lo_column->set_long_text( 'Nombre Proveedor' ).

        lo_column ?= lo_cols->get_column( 'FRGKE' ).
        lo_column->set_visible( space ).

      CATCH cx_salv_not_found.                      "#EC NO_HANDLER
    ENDTRY.

*/…
o_alv->refresh( ).
*/…

¿y si en lugar de o_alv->refresh() haces un o_alv->display() no funciona?

Si ya puse el o_alv->refresh() pero no me refresca la pantalla.

Por no contrario cuando pongo el o_alv->display() si me muestra todo bien, pero el problema es que cuando quiero salir de la transaccion, la primera vez que hago clip me lleva al anterior alv en que estaba sin los check, y tengo que dar clip otra vez para que salga de la transaccion. Al parecer si vuelvo a poner display es como si cargara nuevamente otro alv.

@harliza0 men tu problema esta es que estas creando el objeto nuevamente, debes llevar la referencia del objeto del alv del momento al user command donde haces la actualización de la tabla interna y luego refrescar el objeto

1 me gusta

Estimados,
Ya logré solucionar el tema, agregué la siguiente linea de codigo.

lo_report->o_alv->refresh( ).

Al parecer todo el alv estaba contenido en la variable lo_report

Gracias.

7 Me gusta