ABAP學習(11):ALV顯示之OO ALV使用示例


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM