2011-07-04 115 views
5

我創建在SAP簡單ALV格。到目前爲止,我已經能夠使用我的數據填充網格,並在選擇屏幕後顯示網格沒有問題。我沒有將網格添加到自定義屏幕上的自定義容器中。只需查看網格全屏。ALV網格缺少工具欄

我的問題是 - 有我需要爲了查看工具欄通常是在與過濾器按鈕網格的頂部,排序等設置ALV網格對象的屬性?

到目前爲止,這是我:

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(). 

的SAP小白任何幫助,將不勝感激。

回答

7

每個ALV功能被實現爲簡單的ALV一個單獨的類,所以你必須單獨處理它們。您不需要自定義控件。

爲了添加工具欄:

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

完全ALV顯示:

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爲你的全面例子 – mydoghasworms

+0

感謝您的詳細迴應,完美的作品! – digibit

+0

值得注意的是,如果您不想要所有導出選項,則還有其他方法可用於設置較小的工具欄功能集。 **所有排序選項的SET_GROUP_SORT **,**打印的SET_PRINT **。大多是不言自明的。 – nath

2

看來你需要做的是從你的網格對象獲得CL_SALV_FUNCTIONS_LIST的一個實例,像這樣:

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

但是,從那裏,看來你需要做一些和工作。我的建議:查看類CL_SALV_TABLE和CL_SALV_FUNCTIONS_LIST的文檔(即在事務SE24中顯示類時單擊文檔按鈕)。後者告訴你到底你需要做什麼。 (另外,有一點提示:把你的處理邏輯放在try-catch塊內,因爲如果初始化失敗,你可能會捕獲該異常,但繼續嘗試在未被實例化或未初始化的類上調用方法)。

+0

你只是想念我想的lr_func-> set_all方法調用。不幸的是,誰標記你沒有做一些自己的研究:D。 – Esti

+0

謝謝。我自己並沒有使用CL_SALV函數,一直依賴於CL_GUI_ALV_GRID,所以我的信息可能有點欠缺。但無論如何,這些文檔在CL_SALV類中相當不錯。 – mydoghasworms

1
  • 添加客戶容器到GUI
  • 創建類cl_gui_custom_container的對象,並提供你的容器
  • 的名稱創建類cl_gui_alv_grid的實例,並提供定製的容器對象
  • 使用方法set_table_for_first_display

這將顯示一個包含所有按鈕的工具欄。您可以使用IT_TOOLBAR_​​EXCLUDING參數控制工具欄中您想要的那些按鈕到set_table_for_first_display方法。

2

這是在第一混亂,當你使用ALV對象模型。如果以全屏模式使用ALV,則必須在程序中引用GUI狀態,並在網格實例上使用方法SET_SCREEN_STATUS。這在SAP幫助here中有解釋。

它有助於從函數組SALV_METADATA_STATUS中將GUI狀態SALV_TABLE_STANDARD複製到報表中作爲起點,然後可以刪除不需要的任何函數。例如,如果您複製的狀態到你的程序作爲ALV_STATUS,你可以這樣寫:

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

如果你想使用設置ALV功能的基於類的模型,你必須嵌入在一個網格對象自定義容器在屏幕上。

+0

我相信set_screen_status只有當你想將自己的命令添加到工具欄時才需要。默認的ALV函數由類CL_SALV_FUNCTIONS_LIST提供 – Esti

+0

可以使用SET_SCREEN_STATUS,但要小心,如果調用「Grid Output」 - >「CL_SALV_TABLE類,CL_SALV_TABLE不支持方法SET_SCREEN_STATUS在網格輸出中」(CX_SALV_METHOD_NOT_SUPPORTED) –