自用的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.