2、OO ALV
OOALV主要通過CL_GUI_ALV_GRID這個類來控制alv的顯示。
ALV顯示需要屏幕容器,容器對應類:
1、cl_gui_custom_container,默認容器alv自動占滿整個容器;
2、cl_gui_docking_container,docking容器alv寬度可以直接調整;
3、cl_gui_splitter_contianer,splitter容器,可以將屏幕划分區域顯示多個alv;
2.1、cl_gui_custom_container容器
示例1:OO ALV使用cl_gui_custom_container容器
TABLES:spfli. CLASS cl_event_handle DEFINITION."事件處理類定義 PUBLIC SECTION. "初始化ALV工具欄對象事件,如增加按鈕並設定屬性 METHODS handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid IMPORTING e_object e_interactive. "該事件用於在下ALV工具欄的下拉菜單按鈕中增加選項 METHODS handle_menu_button FOR EVENT menu_button OF cl_gui_alv_grid IMPORTING e_object e_ucomm. "ALV工具欄按鈕的點擊事件 METHODS handle_user_command FOR EVENT user_command OF cl_gui_alv_grid IMPORTING e_ucomm. "ALV表格雙擊事件 METHODS handle_double_click FOR EVENT double_click OF cl_gui_alv_grid IMPORTING e_row "作廢 e_column "通過e_column-fieldname 獲取點擊字段名,點擊列 es_row_no. "通過es_row_no-row_id 返回當前行號 "字段的字段目錄HOTSPOT設置為"X",熱點單擊事件 METHODS handle_hotspot_click FOR EVENT HOTSPOT_CLICK of cl_gui_alv_grid IMPORTING E_ROW_ID "作廢 E_COLUMN_ID "通過e_column_id-fieldname 獲取點擊字段名,點擊列 ES_ROW_NO. "通過es_row_no-row_id 返回當前行號 ENDCLASS. DATA: gs_toolbar TYPE stb_button. DATA:t_sflight LIKE TABLE OF sflight WITH HEADER LINE. CLASS cl_event_handle IMPLEMENTATION."事件處理類實現部分 METHOD handle_toolbar. gs_toolbar-function = 'B_SUM'."按鈕的FunctionCode gs_toolbar-icon = icon_display."按鈕圖標,通過Tcode:ICON可以查看 gs_toolbar-text = '總行數'."按鈕標簽 gs_toolbar-butn_type = '0'."定義按鈕類型,0為標准按鈕,具體取值可參考這里 APPEND gs_toolbar TO e_object->mt_toolbar."添加按鈕到工具欄中 gs_toolbar-function = 'B_LIST'."按鈕的FunctionCode gs_toolbar-quickinfo = '自定義下拉菜單按鈕'."按鈕的冒泡提示 gs_toolbar-icon = icon_biw_report_view."按鈕圖標 gs_toolbar-text = '下拉菜單按鈕'."按鈕標簽 gs_toolbar-butn_type = '1'."定義按鈕類型,1為下拉菜單按鈕 APPEND gs_toolbar TO e_object->mt_toolbar."添加下拉菜單按鈕到工具欄中 ENDMETHOD. METHOD handle_menu_button. IF e_ucomm = 'B_LIST'."給下拉菜單按鈕增加選項,可以多次調用該方法以增加多行 CALL METHOD e_object->add_function EXPORTING icon = icon_display fcode = 'B_SUM'"字菜單按鈕的FunCode text = '顯示ALV總行數'. ENDIF. ENDMETHOD. METHOD handle_user_command. DATA: sum TYPE i . IF e_ucomm = 'B_SUM'. DESCRIBE TABLE t_sflight[] LINES sum. MESSAGE i001(00) WITH '當前ALV表格中的數據總行數為:' sum. ENDIF. ENDMETHOD. "雙擊事件 METHOD handle_double_click. DATA:temp_message TYPE String. READ TABLE t_sflight INTO t_sflight INDEX es_row_no-row_id. temp_message = '點擊列:' && e_column-fieldname && ',行號:' && es_row_no-row_id. MESSAGE i001(00) WITH temp_message. ENDMETHOD. "字段的字段目錄HOTSPOT設置為"X",熱點單擊事件 METHOD handle_hotspot_click. DATA:temp_message TYPE String. temp_message = '點擊列:' && e_column_id-fieldname && ',行號:' && es_row_no-row_id. MESSAGE i001(00) WITH temp_message. ENDMETHOD. ENDCLASS. "定義cl_gui_alv_grid 類引用 DATA:alv_grid TYPE REF TO cl_gui_alv_grid. "定義cl_gui_custom_container 容器 DATA:alv_container TYPE REF TO cl_gui_custom_container. "alv顯示參數 "字段目錄HOTSPOT,熱點單擊 DATA:fieldcat TYPE lvc_t_fcat. DATA:s_fieldcat TYPE lvc_s_fcat. DATA:layout TYPE lvc_s_layo. "事件 DATA: event_handle TYPE REF TO cl_event_handle."定義類對象的引用 SELECTION-SCREEN BEGIN OF SCREEN 101 as SUBSCREEN. SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE title. SELECT-OPTIONS: s_carrid FOR spfli-carrid, s_connid FOR spfli-connid. SELECTION-SCREEN END OF BLOCK blk1. SELECTION-SCREEN END OF SCREEN 101. *初始化 INITIALIZATION. title = '查詢條件'. START-OF-SELECTION. CALL SCREEN 100. MODULE STATUS_0100 OUTPUT. SET PF-STATUS 'STA_0100'. * SET TITLEBAR 'xxx'. ENDMODULE. " STATUS_0100 OUTPUT MODULE USER_COMMAND_0100 INPUT. CASE sy-ucomm. WHEN 'EXEC'. "查詢數據 SELECT * FROM sflight INTO CORRESPONDING FIELDS OF TABLE t_sflight WHERE carrid IN s_carrid AND connid IN s_connid. IF alv_container IS INITIAL. CREATE OBJECT alv_container"創建ALV容器對象 EXPORTING container_name = 'CONTAINER1'. CREATE OBJECT alv_grid"創建ALV控件 EXPORTING i_parent = alv_container. CALL METHOD alv_grid->set_table_for_first_display EXPORTING i_structure_name = 'sflight' is_layout = layout i_save = 'X'"可以保存變式 CHANGING it_outtab = t_sflight[] it_fieldcatalog = fieldcat[]."如果fieldcat內表為空,則相當於沒有配置,采用默認方式顯示 CREATE OBJECT :event_handle. "為ALV按鈕注冊監聽事件 SET HANDLER :event_handle->handle_toolbar FOR alv_grid, event_handle->handle_menu_button FOR alv_grid, event_handle->handle_user_command FOR alv_grid, event_handle->handle_double_click FOR alv_grid, event_handle->handle_hotspot_click FOR alv_grid. "調用此方法才能激活工具欄上增加的自定義按鈕 CALL METHOD alv_grid->set_toolbar_interactive. ELSE. CALL METHOD alv_grid->refresh_table_display. ENDIF. WHEN 'BACK' or 'EXIT' or 'QUIT'. LEAVE TO SCREEN 0. ENDCASE. ENDMODULE. " USER_COMMAND_0100 INPUT
創建屏幕100邏輯代碼:
PROCESS BEFORE OUTPUT. "屏幕輸出前操作 MODULE STATUS_0100. "調用子屏幕 CALL SUBSCREEN sub1 INCLUDING sy-repid '101'. * PROCESS AFTER INPUT. "先調用子屏幕,后面module使用到子屏幕數據 CALL SUBSCREEN sub1. "屏幕輸入后操作 MODULE USER_COMMAND_0100.
2.2、cl_gui_docking_container容器
示例2:使用cl_gui_docking_container容器:
TABLES:sflight. "alv顯示設置 DATA:fieldcat TYPE lvc_t_fcat. DATA:layout TYPE lvc_s_layo. "cl_gui_alv_grid類引用 DATA:alv_grid TYPE REF TO cl_gui_alv_grid. DATA:alv_container TYPE REF TO cl_gui_docking_container. DATA:t_sflight LIKE TABLE OF sflight WITH HEADER LINE. START-OF-SELECTION. CALL SCREEN 100. MODULE USER_COMMAND_0100 INPUT. CASE sy-ucomm. WHEN 'BACK' or 'QUIT' or 'EXIT'. LEAVE TO SCREEN 0. ENDCASE. ENDMODULE. " USER_COMMAND_0100 INPUT MODULE STATUS_0100 OUTPUT. SET PF-STATUS 'STA_0100'. * SET TITLEBAR 'xxx'. ENDMODULE. " STATUS_0100 OUTPUT *&---------------------------------------------------------------------* *& Module OUT_SCREEN OUTPUT *&---------------------------------------------------------------------* * 查詢數據,生成docking container對象,顯示alv *----------------------------------------------------------------------* MODULE OUT_SCREEN OUTPUT. "查詢數據 SELECT * FROM sflight INTO CORRESPONDING FIELDS OF TABLE t_sflight WHERE carrid = 'AA'. "創建container對象 CREATE OBJECT alv_container EXPORTING repid = sy-repid dynnr = sy-dynnr extension = 300."alv寬度 "創建alv對象 CREATE OBJECT alv_grid EXPORTING i_parent = alv_container. "調用顯示方法 CALL METHOD alv_grid->set_table_for_first_display EXPORTING i_structure_name = 'sflight' is_layout = layout i_save = 'X'"可以保存變式 CHANGING it_outtab = t_sflight[] it_fieldcatalog = fieldcat[]."如果fieldcat內表為空,則相當於沒有配置,采用默認方式顯示 ENDMODULE. " OUT_SCREEN OUTPUT
2.3、cl_gui_splitter_container容器
示例3:使用cl_gui_splitter_container容器
TABLES:sflight. "alv顯示設置 DATA:fieldcat TYPE lvc_t_fcat. DATA:layout TYPE lvc_s_layo. "cl_gui_alv_grid類引用 DATA:alv_grid TYPE REF TO cl_gui_alv_grid. DATA:alv_grid1 TYPE REF TO cl_gui_alv_grid. DATA:alv_container TYPE REF TO cl_gui_docking_container. "spillter container 對象引用 DATA:alv_splitter_container TYPE REF TO cl_gui_splitter_container. "屏幕容器 DATA:ref_container TYPE REF TO cl_gui_container. DATA:t_sflight LIKE TABLE OF sflight WITH HEADER LINE. START-OF-SELECTION. CALL SCREEN 100. *&---------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE USER_COMMAND_0100 INPUT. CASE sy-ucomm. WHEN 'BACK' or 'QUIT' or 'EXIT'. LEAVE TO SCREEN 0. ENDCASE. ENDMODULE. " USER_COMMAND_0100 INPUT *&---------------------------------------------------------------------* *& Module STATUS_0100 OUTPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE STATUS_0100 OUTPUT. SET PF-STATUS 'STA_0100'. * SET TITLEBAR 'xxx'. ENDMODULE. " STATUS_0100 OUTPUT *&---------------------------------------------------------------------* *& Module OUT_SCREEN OUTPUT *&---------------------------------------------------------------------* * 查詢數據,生成docking container對象,顯示alv *----------------------------------------------------------------------* MODULE OUT_SCREEN OUTPUT. "查詢數據 SELECT * FROM sflight INTO CORRESPONDING FIELDS OF TABLE t_sflight WHERE carrid = 'AA'. "創建container對象 CREATE OBJECT alv_container EXPORTING repid = sy-repid dynnr = sy-dynnr extension = 1200."alv寬度 "創建spillter container對象 CREATE OBJECT alv_splitter_container EXPORTING parent = alv_container rows = 1 columns = 2. "將父容器分為1行兩列,兩個容器 "調用cl_splitter_container對象方法,獲取容器 CALL METHOD alv_splitter_container->get_container EXPORTING row = 1 column = 1 RECEIVING container = ref_container. "創建左邊容器alv對象 "創建alv對象 CREATE OBJECT alv_grid EXPORTING i_parent = ref_container. "調用顯示方法 CALL METHOD alv_grid->set_table_for_first_display EXPORTING i_structure_name = 'sflight' is_layout = layout i_save = 'X'"可以保存變式 CHANGING it_outtab = t_sflight[] it_fieldcatalog = fieldcat[]."如果fieldcat內表為空,則相當於沒有配置,采用默認方式顯示 "調用cl_splitter_container對象方法,獲取容器 CALL METHOD alv_splitter_container->get_container EXPORTING row = 1 column = 2 RECEIVING container = ref_container. "創建右邊容器alv對象 "創建alv對象 CREATE OBJECT alv_grid1 EXPORTING i_parent = ref_container. "調用顯示方法 CALL METHOD alv_grid1->set_table_for_first_display EXPORTING i_structure_name = 'sflight' is_layout = layout i_save = 'X'"可以保存變式 CHANGING it_outtab = t_sflight[] it_fieldcatalog = fieldcat[]."如果fieldcat內表為空,則相當於沒有配置,采用默認方式顯示 ENDMODULE. " OUT_SCREEN OUTPUT