2011-07-04 68 views
5

Estoy creando una cuadrícula ALV simple en SAP. Hasta ahora he podido poblar la grilla con mis datos y mostrar la cuadrícula después de la pantalla de selección sin ningún problema. No agrego la cuadrícula a un contenedor personalizado en una pantalla personalizada. Solo viendo la cuadrícula a pantalla completa.ALV Grid missing toolbar

Mi pregunta es: ¿hay alguna propiedad del objeto de malla alv que deba establecerse para ver la barra de herramientas que normalmente está en la parte superior de la cuadrícula con botones para filtrar, ordenar, etc.?

Hasta el momento esto es lo que tengo:

TRY. 
    cl_salv_table=>factory(
    IMPORTING 
     r_salv_table = gr_alv 
    CHANGING 
     t_table  = tbl_data 
    ). 
CATCH cx_salv_msg. 
ENDTRY. 

* initialize the alv settings - nothing done here for the moment. 
PERFORM define_settings USING gr_alv. 

* Display the ALV 
gr_alv->display(). 

Cualquier ayuda para un novato SAP sería apreciada.

Respuesta

7

Cada función ALV se implementa como una CLASE separada en ALV simple, por lo que debe manejarlas por separado. No necesita un control personalizado.

Para agregar la barra de herramientas:

data: lr_func TYPE REF TO CL_SALV_FUNCTIONS_LIST. 
"Functions 
lr_func = gr_alv->get_functions(). 
lr_func->set_all(). 

completa visualización de LVA:

form display_results. 

    data: ls_key  type salv_s_layout_key, 

     lo_table  type ref to cl_salv_table, 
     lo_cols  type ref to cl_salv_columns_table, 
     lo_events  type ref to cl_salv_events_table, 
     lo_funcs  type ref to cl_salv_functions_list, 
     lo_layout  type ref to cl_salv_layout, 
     lo_display type ref to cl_salv_display_settings, 
     lo_selections type ref to cl_salv_selections. 

    try. 
     call method cl_salv_table=>factory 
     exporting 
      list_display = abap_false 
     importing 
      r_salv_table = lo_table 
     changing 
      t_table  = gt_list. 
    catch cx_salv_msg .         "#EC NO_HANDLER 
    endtry. 
    "Events 
    create object go_events. 
    lo_events = lo_table->get_event(). 
    set handler go_events->double_click for lo_events. 

    "Layouts 
    ls_key-report = sy-repid. 
    lo_layout = lo_table->get_layout(). 
    lo_layout->set_key(ls_key). 
    lo_layout->set_default(abap_true). 
    lo_layout->set_save_restriction(). 
    lo_layout->set_initial_layout(p_var). 

    lo_cols = lo_table->get_columns(). 
    perform change_columns changing lo_cols. 

    "Functions 
    lo_funcs = lo_table->get_functions(). 
    lo_funcs->set_all(). 

    "Display Settings 
    lo_display = lo_table->get_display_settings(). 
    lo_display->set_striped_pattern(abap_true). 

    "Selections 
    lo_selections = lo_table->get_selections(). 
    lo_selections->set_selection_mode(if_salv_c_selection_mode=>row_column). 

    lo_table->display(). 
endform.     " DISPLAY_RESULTS 
+0

+1 para su ejemplo completo – mydoghasworms

+0

¡Gracias por la respuesta detallada, funciona perfectamente! – digibit

+0

Vale la pena señalar que hay otros métodos para establecer conjuntos más pequeños de funciones de la barra de herramientas si no desea todas las opciones de exportación, por ejemplo. ** SET_GROUP_SORT ** para todas las opciones de clasificación, ** SET_PRINT ** para imprimir. En su mayoría se explica por sí mismo. – nath

2

Parece lo que hay que hacer es obtener una instancia de CL_SALV_FUNCTIONS_LIST de su objeto de cuadrícula, así:

data: lr_func TYPE REF TO CL_SALV_FUNCTIONS_LIST. 
lr_func = gr_alv->get_functions(). 
lr_func->set_all(). 

Pero, a partir de ahí, parece que hay que hacer un poco o trabajo. Mi consejo: mira la documentación de las clases CL_SALV_TABLE y CL_SALV_FUNCTIONS_LIST (es decir, haz clic en el botón de documentación cuando visualices la clase en la transacción SE24). Este último te dice exactamente lo que tienes que hacer.

(También, una pequeña sugerencia: coloque su lógica de procesamiento dentro del bloque try-catch, porque si la inicialización falla, puede atrapar esa excepción pero continuar para intentar invocar un método en una clase no iniciada o no iniciada).

+0

Te estás perdiendo la llamada al método lr_func-> set_all, creo. Es desafortunado que quien te marcó no haya investigado un poco: D. – Esti

+0

Gracias. No he usado las funciones CL_SALV yo mismo, siempre me he basado en CL_GUI_ALV_GRID, por lo que mi información podría faltar. Pero de todos modos, la documentación es bastante buena en las clases CL_SALV. – mydoghasworms

1
  • agregar un contenedor de cliente a su interfaz gráfica de usuario
  • crear un objeto de la cl_gui_custom_container clase y proporcionar el nombre de su contenedor
  • crear una instancia de la cl_gui_alv_grid clase y suministrar el objeto de contenedor personalizado
  • uso el método set_table_for_first_display

Esto mostrará una barra de herramientas con todos los botones. puede controlar qué botones desea en la barra de herramientas con el parámetro IT_TOOLBAR_EXCLUDING al método set_table_for_first_display.

2

Esto es confuso al principio, cuando se utiliza el modelo de objetos de ALV. Si usa ALV en modo de pantalla completa, debe hacer referencia al estado de la GUI en su programa y usar el método SET_SCREEN_STATUS en su instancia de grid. Se explica en la Ayuda de SAP here.

Ayuda copiar el estado de la GUI SALV_TABLE_STANDARD del grupo de funciones SALV_METADATA_STATUS en su informe como punto de partida, y luego puede eliminar las funciones que no necesite.Por ejemplo, si ha copiado el estado en su programa como ALV_STATUS, podría escribir:

gr_alv->set_screen_status(report = sy-repid 
          pfstatus = 'ALV_STATUS'). 

Si desea utilizar el modelo basado en la clase de creación de funciones ALV, hay que incrustar el objeto de cuadrícula en una contenedor personalizado en una pantalla.

+0

Creo que set_screen_status solo es necesario si desea agregar sus propios comandos a la barra de herramientas. Las funciones ALV predeterminadas son suministradas por la clase CL_SALV_FUNCTIONS_LIST – Esti

+0

SET_SCREEN_STATUS se puede usar pero tenga cuidado, se cancela si se solicita "Salida de cuadrícula" -> "Clase CL_SALV_TABLE, método SET_SCREEN_STATUS no compatible con CL_SALV_TABLE en la salida de cuadrícula" (CX_SALV_METHOD_NOT_SUPPORTED) –