SALV是一个用面向对象写出ALV简单报表的类

*&好处:
*&简单快捷,用来做个弹窗,或者作为明细的显示窗口,有很高的便捷性。
*&限制(缺点):
*&•列数限制为90。
*&•列的输出长度限制为128个字符。
*&•ALV的结构使用户可以在屏幕上操作您的表格。尽管ALV为打印表格提供了几个基本功能,但它并不用于配置缩小的打印布局。
*&•对于排序和小计,您最多使用九个级别或列。
*&•对于可聚合列,确保列的内部长度足够大,不仅适用于单个值,也适用于结果。
*&•输出列是面向列的。只能显示平面结构的表。不能显示嵌套的表和结构。
*&•使用ALV显示的表格不可用于输入。
*&•如果将表格用作容器中的网格,则不能使用批处理模式。
*&•总计和小计的输出由ALV单独处理。您既不能将结果传递给应用程序,也不能以任何方式操纵它们。

DATA:go_alv TYPE REF TO cl_salv_table. "ALV Table

DATA BEGIN OF ty_alv.
  INCLUDE TYPE mara.
DATA:del TYPE char10,
     z   TYPE i.
DATA END OF ty_alv.
DATA:gs_mara LIKE ty_alv,
     gt_mara LIKE TABLE OF ty_alv.

"事件类的定义
CLASS l_cl_handle_events DEFINITION.
  PUBLIC SECTION.
  "用户操作按钮
    METHODS: on_user_command FOR EVENT added_function OF cl_salv_events_table
            IMPORTING e_salv_function.
  "双击事件
    METHODS: on_double_click FOR EVENT double_click OF cl_salv_events_table
            IMPORTING row column.
ENDCLASS.

"方法实现
CLASS l_cl_handle_events IMPLEMENTATION.
  METHOD on_user_command.
    PERFORM handle_user_command USING e_salv_function.
  ENDMETHOD.

  METHOD on_double_click.
    PERFORM show_cell_info USING row column.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  SELECT * FROM mara
    INTO TABLE gt_mara UP TO 100 ROWS.

  TRY .
    cl_salv_table=>factory(
      IMPORTING
        r_salv_table = go_alv
      CHANGING
        t_table      = gt_mara ).
  CATCH cx_salv_msg.

  ENDTRY.

  "给列设置长文本
  go_alv->get_columns( )->get_column( 'DEL' )->set_long_text( '删除' ).
  go_alv->get_columns( )->get_column( 'Z' )->set_long_text( '自定义' ).
  "自动列宽
  go_alv->get_columns( )->set_optimize( 'X' ).
  "斑马线
  go_alv->get_display_settings( )->set_striped_pattern( 'X' ).
  "set selection mode 可以行列进行选择
  go_alv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).

*******标准按钮和自定义状态使用一个就好
  "标准按钮
*  go_alv->get_functions( )->set_all( abap_true ).  "将激活所以的ALV内置通用按钮

  "使用自己定义的PF状态
  go_alv->set_screen_status(
    pfstatus      = 'IT017_PF'    "SE41->状态按钮->程序:SAPLKKBL,状态:STANDARD   复制到知道程序和状态
    report        = sy-repid
    set_functions = go_alv->c_functions_all ).

  "设置屏幕大小,若是要全屏,就注释如下代码
  IF go_alv IS BOUND.
    go_alv->set_screen_popup(
      start_column = 30
      end_column   = 160
      start_line   = 5
      end_line     = 20 ).
  ENDIF.

  "获取事件对象
  DATA: lr_event TYPE REF TO cl_salv_events_table.
  lr_event = go_alv->get_event( ).
  "事件注册
  DATA: lr_handle_event TYPE REF TO l_cl_handle_events.
  CREATE OBJECT lr_handle_event.
  SET HANDLER lr_handle_event->on_user_command FOR lr_event.
  SET HANDLER lr_handle_event->on_double_click FOR lr_event.

  "显示
  go_alv->display( ).

FORM handle_user_command USING p_function TYPE salv_de_function.
  CASE p_function.
    WHEN 'ZB'.
      "获取选中的行/列
      DATA(lv_rows) = go_alv->get_selections( )->get_selected_rows( ).
      READ TABLE lv_rows INTO DATA(ls_row) INDEX 1.
      IF sy-subrc = 0.
        MODIFY gt_mara FROM VALUE #( Z = '7' ) INDEX ls_row TRANSPORTING Z.
      ENDIF.
      go_alv->refresh( ).
    WHEN OTHERS.
  ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form show_cell_info
*&---------------------------------------------------------------------*
FORM show_cell_info USING p_row TYPE i
                          p_column TYPE lvc_fname.
  MESSAGE '行:' && p_row && ',列:' && p_column TYPE 'I'.
ENDFORM.

结果:

固定窗口图:

 

浮窗图:

 

 动态设置列名

DATA:cl_descr TYPE REF TO cl_abap_structdescr,
       lv_fname TYPE lvc_fname,
       lv_short TYPE scrtext_s,
       lv_medium TYPE scrtext_m,
       lv_long  TYPE scrtext_l.
  cl_descr ?= cl_abap_typedescr=>describe_by_data( gs_mara ).
  LOOP AT cl_descr->components ASSIGNING FIELD-SYMBOL(<fs_comp>).
    CLEAR:lv_fname, lv_short, lv_long.
    lv_fname = <fs_comp>-name.
    lv_short = <fs_comp>-name.
    lv_medium = <fs_comp>-name.
    lv_long  = <fs_comp>-name.
    go_alv->get_columns( )->get_column( lv_fname )->set_short_text( lv_short ).
    go_alv->get_columns( )->get_column( lv_fname )->set_medium_text( lv_medium ).
    go_alv->get_columns( )->get_column( lv_fname )->set_long_text( lv_long ).
  ENDLOOP.

 

 

posted on 2021-10-18 09:09  seven1314pp  阅读(318)  评论(0)    收藏  举报