一个ALV(OO)的实例

个人感觉还是OO的方法较简单容易理解。这个实例,包含了grid形式全屏显示, list显示 和 grid在容器里显示的三种情况。

实例需要定义一个screen 0100 ,包含一个名为 ‘CONTAINER’的容器。第一种情况下实现了页眉页脚的显示,对列标题修改,选定行 列以及单元格。

Report  YY_ALV_TEST .
*变量定义
TYPES ty_spfli TYPE spfli OCCURS 0.
DATA: gr_table TYPE REF TO cl_salv_table,
      gr_funct TYPE REF TO cl_salv_functions,
      gr_columns type ref to cl_salv_columns_table,
      gr_column type ref to CL_SALV_COLUMN_table.
*选择屏幕设计
SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME.
PARAMETERS: p_full RADIOBUTTON GROUP gp,
            p_list RADIOBUTTON GROUP gp,
            p_grid RADIOBUTTON GROUP gp.
SELECTION-SCREEN END OF BLOCK blk.
*----------------------------------------------------------------------*
*       CLASS lcl_alv DEFINITION
*----------------------------------------------------------------------*
*       ALV操作类(定义)
*----------------------------------------------------------------------*
CLASS lcl_alv DEFINITION.
  PUBLIC SECTION.
    METHODS: getdata         "取得要显示的数据
               RETURNING value(lt_tab) TYPE ty_spfli,
             alv_full        "全屏Grid列表处理方法
               IMPORTING value(lt_tab) TYPE ty_spfli,
             alv_list        "普通List处理方法
               IMPORTING value(lt_tab) TYPE ty_spfli,
             alv_grid        "在自定义屏幕上显示的列表
               IMPORTING value(lt_tab) TYPE ty_spfli,
             main.           "主方法
ENDCLASS.                    "lcl_alv DEFINITION
*----------------------------------------------------------------------*
*       CLASS lcl_alv IMPLEMENTATION
*----------------------------------------------------------------------*
*       ALV操作类(实现)
*----------------------------------------------------------------------*
CLASS lcl_alv IMPLEMENTATION.
*取得要显示的数据
  METHOD getdata.
    SELECT * INTO TABLE lt_tab FROM spfli.
  ENDMETHOD.                    "getdata
*输出全屏网格列表的方法
  METHOD alv_full.
    DATA: lr_selections TYPE REF TO cl_salv_selections,
          lt_column     TYPE salv_t_column,
          lt_row        TYPE salv_t_row,
          lt_cell       TYPE salv_t_cell,
          ls_cell       TYPE salv_s_cell.
   DATA:  lr_grid       TYPE REF TO cl_salv_form_layout_grid,
          lr_grid2      TYPE REF TO cl_salv_form_layout_grid,
          lr_text       TYPE REF TO cl_salv_form_text,
          lr_action     TYPE REF TO cl_salv_form_action_info,
          lr_header     TYPE REF TO cl_salv_form_header_info,
          lr_label      TYPE REF TO cl_salv_form_label.
    "创建实例
    TRY.
        cl_salv_table=>factory(
          IMPORTING
            r_salv_table = gr_table
          CHANGING
            t_table      = lt_tab
        ).
      CATCH cx_salv_msg.
    ENDTRY.
    "显示列表
  gr_funct = gr_table->get_functions( )."<< 此行和下一行用來顯示標題的功能按鈕
  gr_funct->set_all( Abap_True ).       ">>
  gr_columns = gr_table->get_columns( ).
  gr_columns->set_optimize( 'X' ).
  gr_column ?= gr_columns->Get_Column( 'PERIOD' ). "<<此行和下一行來隱藏'PERIOD'欄位
  gr_column->SET_VISIBLE( abap_false ).            ">>
  gr_column ?= gr_columns->Get_Column( 'DISTANCE' ). "<<此行和下一行設置列標題顯示名
  gr_column->SET_LONG_TEXT('飛行距離' ).            ">>
    "取得类CL_SALV_SELECTIONS的实例
    lr_selections = gr_table->get_selections( ).
    "设置选择模式
    lr_selections->set_selection_mode( if_salv_c_selection_mode=>row_column ).
    "选择列
    APPEND 'FLTIME' TO lt_column.
    APPEND 'DISTANCE' TO lt_column.
    lr_selections->set_selected_columns( lt_column ).
    "选择行
    APPEND 3 TO lt_row.
    APPEND 4 TO lt_row.

   lr_selections->set_selected_rows( lt_row ).
    "选择一个单元格
    ls_cell-row = 7.
    ls_cell-columnname = 'CITYFROM'.
    lr_selections->set_current_cell( ls_cell ).
"页眉页脚
    CREATE OBJECT: lr_grid,lr_grid2.
    lr_header = lr_grid->create_header_information(
      row = 1
      column = 1
      text = 'Header Information'
    ).
    lr_label = lr_grid->create_label(
      row = 2
      column = 1
      text = 'Label'
    ).
    lr_action = lr_grid->create_action_information(
      row = 3
      column = 1
      text = 'Action Information'
    ).

    lr_text = lr_grid->create_text(
      text = 'text'
      row = 4
      column = 1
    ).
    gr_table->set_top_of_list( lr_grid ).
    lr_text = lr_grid2->create_text(
      text = 'end of page'
      row = 1
      column = 1
    ).
    gr_table->set_end_of_list( lr_grid2 ).
"  "弹出窗口设置
"    gr_table->set_screen_popup(
"      start_column = 1
"      end_column   = 120
"      start_line   = 1
"      end_line     = 20 ).
  gr_table->display( ).
  ENDMETHOD.                    "alv_ful
*输出全屏普通列表的方法
  METHOD alv_list.
     DATA:  lr_display   TYPE REF TO cl_salv_display_settings.
    "创建实例
    TRY.
        cl_salv_table=>factory(
          EXPORTING
            list_display = 'X'
          IMPORTING
            r_salv_table = gr_table
          CHANGING
            t_table      = lt_tab
        ).
      CATCH cx_salv_msg.
    ENDTRY.
    "显示列表
    gr_funct = gr_table->get_functions( ).
    gr_funct->set_all( 'X' ).
    gr_columns = gr_table->get_columns( ).
    gr_columns->set_optimize( 'X' ).
    "设置ALV的显示样式
    lr_display = gr_table->get_display_settings( ).
    lr_display->set_striped_pattern( 'X' ). "设置颜色间隔显示
    lr_display->set_list_header( 'Elliott''s ALV Test' ). "设置ALV的抬头
    lr_display->set_horizontal_lines( '' ).  "设置水平线是否显示
    lr_display->set_vertical_lines( '' ).    "设置垂直线是否显示
    gr_table->display( ).
  ENDMETHOD.                    "alv_list
*输出在自定义屏幕上的列表
  METHOD alv_grid.
    CALL SCREEN '0100'.
  ENDMETHOD.                    "alv_grid
*主方法,整合数据
  METHOD main.
    DATA: lt_tab TYPE TABLE OF spfli.
    "取得要显示的数据
    lt_tab = me->getdata( ).
    "判断选择屏幕的选择条件调用不同的方法
    CASE 'X'.
      WHEN p_full.
        me->alv_full( lt_tab ).
      WHEN p_list.
        me->alv_list( lt_tab ).
      WHEN p_grid.
        me->alv_grid( lt_tab ).
    ENDCASE.
  ENDMETHOD.                    "main
ENDCLASS.                    "lcl_alv IMPLEMENTATION
*----------------------------------------------------------------------*
*  MODULE status_0100
*----------------------------------------------------------------------*
*  PBO 屏幕输出前执行
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  "定义变量
  DATA: lr_container TYPE REF TO cl_gui_custom_container,
        lr_alv2       TYPE REF TO lcl_alv,
        lt_tab       TYPE TABLE OF spfli.
  "创建容器实例
  IF cl_salv_table=>is_offline( ) = ''.
    CREATE OBJECT lr_container
       EXPORTING
         container_name = 'CONTAINER'.
  ENDIF.
  "创建类LCL_ALV实例
  CREATE OBJECT lr_alv2.
  "取得列表数据
  lt_tab = lr_alv2->getdata( ).
  "创建ALV实例
  TRY.
      cl_salv_table=>factory(
        EXPORTING
          r_container    = lr_container
          container_name = 'CONTAINER'
        IMPORTING
          r_salv_table   = gr_table
        CHANGING
          t_table        = lt_tab
      ).
    CATCH cx_salv_msg.
  ENDTRY.
  "显示ALV列表
  gr_funct = gr_table->get_functions( ).
  gr_funct->set_all( Abap_True ).
  gr_columns = gr_table->get_columns( ).
  gr_columns->set_optimize( 'X' ).
  gr_table->display( ).
  "释放内存
  FREE lt_tab.
ENDMODULE.                    "status_0100
*----------------------------------------------------------------------*
*  MODULE user_command_0100
*----------------------------------------------------------------------*
*  PAI 屏幕输出后的动作
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
ENDMODULE.                    "user_command_0100
*报表执行
START-OF-SELECTION.
  DATA  lr_alv   TYPE REF TO lcl_alv.
  CREATE OBJECT lr_alv.
  lr_alv->main( ).

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值