自用ALV报表模板

自用的ALV开发模板程序,Mark一下,方便自取。

*&---------------------------------------------------------------------*
*& Report  ZTEST_ALV_DEMO
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ztest_alv_demo.

TYPES:
  tt_alv TYPE STANDARD TABLE OF ztest_struc,
  ty_alv TYPE ztest_struc.

DATA:
  gt_alv TYPE tt_alv,
  gs_alv TYPE ty_alv.

gs_alv-matnr = '12345'.
gs_alv-ebeln = '10000001'.
gs_alv-wrbtr = '100'.
gs_alv-waers = 'JPY'.
gs_alv-menge = '12'.
gs_alv-meins = 'ST'.
APPEND gs_alv TO gt_alv.

gs_alv-matnr = '23456'.
gs_alv-ebeln = '20000001'.
gs_alv-wrbtr = '100'.
gs_alv-waers = 'USD'.
gs_alv-menge = '12'.
gs_alv-meins = 'C38'.
APPEND gs_alv TO gt_alv.

PERFORM frm_display_alv.

*&---------------------------------------------------------------------*
*&      Form  FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_display_alv.

  DATA:
    ls_layout       TYPE lvc_s_layo,
    lt_fieldcat     TYPE lvc_t_fcat,
    lt_excluding    TYPE slis_t_extab,
    lt_event        TYPE slis_t_event,
    ls_event        TYPE slis_alv_event,
    lt_event_exit   TYPE slis_t_event_exit,
    ls_event_exit   TYPE slis_event_exit,
    ls_ddval        TYPE lvc_s_drop,
    ls_grid_setting TYPE lvc_s_glay.

  FIELD-SYMBOLS:
    <ls_fieldcat> TYPE lvc_s_fcat.

* 设置布局控制
  ls_layout-zebra      = 'X'.                     "颜色间隔
  ls_layout-sel_mode   = 'D'.                     "选择模式
  ls_layout-cwidth_opt = 'X'.                     "列宽自适应
  ls_layout-stylefname = 'STYLE'.                 "控制字段
  ls_layout-box_fname  = 'CBOX'.                  "选择框字段
*  ls_layout-no_rowmark = 'X'.                     "是否隐藏行选择按钮

* 设置字段控制
  CALL FUNCTION 'ZLVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name       = 'ZTEST_STRUC'
    CHANGING
      ct_fieldcat            = lt_fieldcat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

* 字段特殊设置
  READ TABLE lt_fieldcat ASSIGNING <ls_fieldcat>
    WITH KEY fieldname = 'CBOX'.
  IF sy-subrc = 0.
    <ls_fieldcat>-checkbox = 'X'.
    <ls_fieldcat>-edit = 'X'.
  ENDIF.

* 追加事件
  ls_event-name = 'DATA_CHANGED'.
  ls_event-form = 'FRM_ALV_DATA_CHANGED'.
  APPEND ls_event TO lt_event.

* 标准按钮出口事件
  ls_event_exit-ucomm = '&ALL'.
  ls_event_exit-after = 'X'.
  APPEND ls_event_exit TO lt_event_exit.

  ls_event_exit-ucomm = '&SAL'.
  ls_event_exit-after = 'X'.
  APPEND ls_event_exit TO lt_event_exit.

* 是否立即触发数据更改事件
  ls_grid_setting-edt_cll_cb = 'X'.

* 展示ALV
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'FRM_STATUS_SET'
      i_callback_user_command  = 'FRM_USER_COMMAND'
      is_layout_lvc            = ls_layout
      it_fieldcat_lvc          = lt_fieldcat
      it_excluding             = lt_excluding
      i_grid_settings          = ls_grid_setting
*     IT_SORT_LVC              =
      i_save                   = 'A'
*     IS_VARIANT               =
      it_events                = lt_event
      it_event_exit            = lt_event_exit
    TABLES
      t_outtab                 = gt_alv
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.

  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.                    "FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& Form FRM_ALV_DATA_CHANGED
*&---------------------------------------------------------------------*
*& 数据更改事件
*&---------------------------------------------------------------------*
*&      --> ER_DATA_CHANGED      数据更改监控实例对象
*&---------------------------------------------------------------------*
FORM frm_alv_data_changed USING er_data_changed TYPE REF TO cl_alv_changed_data_protocol.
  DATA:
    ls_mod_cells TYPE lvc_s_modi.

  LOOP AT er_data_changed->mt_mod_cells INTO ls_mod_cells.
    MESSAGE 'You changed data...' TYPE 'S'.
  ENDLOOP.

ENDFORM.                    "FRM_ALV_DATA_CHANGED
*&---------------------------------------------------------------------*
*& Form FRM_STATUS_SET
*&---------------------------------------------------------------------*
*& GUI状态栏设置
*&---------------------------------------------------------------------*
*&      --> RT_EXTAB      排除按钮
*&---------------------------------------------------------------------*
FORM frm_status_set USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STATUS'.
ENDFORM.                    "FRM_STATUS_SET
*&---------------------------------------------------------------------*
*& Form FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*& 用户按钮事件响应
*&---------------------------------------------------------------------*
*&      --> R_UCOMM      事件码
*&      --> RS_SELFIELD  操作数据字段信息
*&---------------------------------------------------------------------*
FORM frm_user_command USING r_ucomm LIKE sy-ucomm
                            rs_selfield TYPE slis_selfield.

  DATA:
    lo_grid    TYPE REF TO cl_gui_alv_grid,
    ls_stable  TYPE lvc_s_stbl,
    lv_valid   TYPE char1,
    ls_layout  TYPE lvc_s_layo,
    lv_refresh TYPE char1.

  ls_stable-row = 'X'.
  ls_stable-col = 'X'.

* 获取当前屏幕实例对象
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lo_grid.

* 将EDIT数据更新回内表GT_RESULT中.
  CALL METHOD lo_grid->check_changed_data
    IMPORTING
      e_valid   = lv_valid
    CHANGING
      c_refresh = lv_refresh.

  CASE r_ucomm.
    WHEN OTHERS.
  ENDCASE.

  CALL METHOD lo_grid->get_frontend_layout
    IMPORTING
      es_layout = ls_layout.

  ls_layout-cwidth_opt = 'X'.

* 设置列宽自适应
  CALL METHOD lo_grid->set_frontend_layout
    EXPORTING
      is_layout = ls_layout.

* 刷新ALV
  CALL METHOD lo_grid->refresh_table_display
    EXPORTING
      is_stable = ls_stable
    EXCEPTIONS
      finished  = 1
      OTHERS    = 2.

  IF sy-subrc <> 0.
  ENDIF.

ENDFORM.                    "FRM_USER_COMMAND

封装Fieldcat生成函数,用于自动获取内置类型描述:

FUNCTION zlvc_fieldcatalog_merge.
*"----------------------------------------------------------------------
*"*"局部接口:
*"  IMPORTING
*"     REFERENCE(I_STRUCTURE_NAME) TYPE  DD02L-TABNAME
*"  CHANGING
*"     REFERENCE(CT_FIELDCAT) TYPE  LVC_T_FCAT
*"  EXCEPTIONS
*"      INCONSISTENT_INTERFACE
*"      PROGRAM_ERROR
*"----------------------------------------------------------------------
  DATA:
    lt_dd03t TYPE STANDARD TABLE OF dd03t,
    ls_dd03t TYPE dd03t.

  FIELD-SYMBOLS:
    <ls_fieldcat> TYPE lvc_s_fcat.

  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
*     I_BUFFER_ACTIVE        =
      i_structure_name       = i_structure_name
*     I_CLIENT_NEVER_DISPLAY = 'X'
      i_bypassing_buffer     = 'X'
*     I_INTERNAL_TABNAME     =
    CHANGING
      ct_fieldcat            = ct_fieldcat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

  CASE sy-subrc.
    WHEN 0.
      SELECT *
        INTO TABLE lt_dd03t
        FROM dd03t
       WHERE tabname    = i_structure_name
         AND ddlanguage = sy-langu
         AND as4local   = 'A'.

      LOOP AT lt_dd03t INTO ls_dd03t.
        READ TABLE ct_fieldcat ASSIGNING <ls_fieldcat>
          WITH KEY fieldname = ls_dd03t-fieldname.
        IF sy-subrc = 0.
          <ls_fieldcat>-reptext = ls_dd03t-ddtext.
        ENDIF.
      ENDLOOP.
    WHEN 1.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
      RAISING inconsistent_interface.
    WHEN 2.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
      RAISING program_error.
    WHEN OTHERS.
  ENDCASE.
ENDFUNCTION.
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeveloperMrMeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值