SALV 封装

作者:ABAP三叔 约 5 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, 开发
SALV 封装 - 封面图
SALV 封装 - 封面图

前言

SALV使用起来虽然说已经非常的简便了,但是每次使用还是要写不少重复的代码,如调用FACTORY方法、设置启用所有功能、设置默认布局、设置列属性、设置GUI状态等等,于是我就琢磨着对这些通用方法进行一下封装,目标是减少代码量,简化使用,只需一句代码就能搞定SALV的显示。

封装类ZCL_SALV

整个代码只有区区几百行,上传在了我的GITHUB上,地址附在最后,需要的朋友欢迎下载、STAR.

示例代码一

示例代码在仓库中也有,接下来将通过几个示例代码来介绍下ZCL_SALV的使用。

示例一:隐藏列、修改列描述

*&---------------------------------------------------------------------**& Report ZDEMO_SALV01*&---------------------------------------------------------------------**& Basic usage*&---------------------------------------------------------------------*REPORT zdemo_salv01.

DATA: lt_sflight TYPE STANDARD TABLE OF sflight.

START-OF-SELECTION.

SELECT * UP TO 100 ROWS INTO CORRESPONDING FIELDS OF TABLE @lt_sflight FROM sflight. NEW zcl_salv( im_table = REF #( lt_sflight ) im_t_hide = VALUE #( ( fieldname = 'MANDT' ) ) im_t_text = VALUE #( ( fieldname = 'SEATSMAX_B' text = 'CHANGE TEXT' ) ) )->display( ).

简单的调用NEW方法和DISPLAY方法就可以了,隐藏了 MANDT 列,并修改了 SEATSM AX_B 列的描述

SALV 封装 - 封面图
SALV 封装 - 封面图

示例代码二

示例二:hostspot事件

*&---------------------------------------------------------------------**& Report ZDEMO_SALV02*&---------------------------------------------------------------------**& hostspot*&---------------------------------------------------------------------*REPORT zdemo_salv02.

DATA: gt_sflight TYPE STANDARD TABLE OF sflight.

START-OF-SELECTION.

SELECT * UP TO 100 ROWS INTO CORRESPONDING FIELDS OF TABLE @gt_sflight FROM sflight.

NEW zcl_salv( im_table = REF #( gt_sflight ) im_t_events = VALUE #( ( name = zcl_salv=>events-link_click form = 'FRM_LINK_CLICK' ) ) im_t_hide = VALUE #( ( fieldname = 'MANDT' ) ) im_t_hotspot = VALUE #( ( fieldname = 'CARRID' ) ) )->display( ).

FORM frm_link_click USING sender TYPE REF TO cl_salv_events_table row TYPE salv_de_row column TYPE salv_de_column. READ TABLE gt_sflight INTO DATA(ls_sflight) INDEX row. CHECK sy-subrc = 0. CASE column . WHEN 'CARRID' . MESSAGE |{ ls_sflight-carrid } { ls_sflight-connid } { ls_sflight-fldate }| TYPE 'I'. ENDCASE.ENDFORM.

同示例一有稍许的不同,多传了参数 im_t_hotspot,指定了需要设置热点事件的列名,另外参数

im_t_events指定了热点事件触发后回调的FORM名称。

SALV 封装 - 封面图
SALV 封装 - 封面图

示例代码三

示例三:设置GUI状态,自定义事件处理

*&---------------------------------------------------------------------**& Report ZDEMO_SALV03*&---------------------------------------------------------------------**& add gui status*&---------------------------------------------------------------------*REPORT zdemo_salv03.

DATA: gt_sflight TYPE STANDARD TABLE OF sflight.DATA: go_salv TYPE REF TO zcl_salv.

START-OF-SELECTION.

SELECT * UP TO 100 ROWS INTO CORRESPONDING FIELDS OF TABLE @gt_sflight FROM sflight.

go_salv = NEW zcl_salv( im_table = REF #( gt_sflight ) im_pfstatus = 'ZSALV_STATUS' im_t_events = VALUE #( ( name = zcl_salv=>events-link_click form = 'FRM_LINK_CLICK' ) ( name = zcl_salv=>events-added_function form = 'FRM_ADDED_FUNCTION' ) ) im_t_hide = VALUE #( ( fieldname = 'MANDT' ) ) im_t_hotspot = VALUE #( ( fieldname = 'CARRID' ) ) ). go_salv->display( ).

FORM frm_link_click USING sender TYPE REF TO cl_salv_events_table row TYPE salv_de_row column TYPE salv_de_column. READ TABLE gt_sflight INTO DATA(ls_sflight) INDEX row. CHECK sy-subrc = 0. CASE column . WHEN 'CARRID' . MESSAGE |{ ls_sflight-carrid } { ls_sflight-connid } { ls_sflight-fldate }| TYPE 'I'. ENDCASE.ENDFORM.

*&---------------------------------------------------------------------**& FORM HANDLE_USER_COMMAND*&---------------------------------------------------------------------** TEXT*----------------------------------------------------------------------*FORM frm_added_function USING p_sender TYPE REF TO cl_salv_events_table p_ucomm TYPE salv_de_function.

CASE p_ucomm. WHEN 'POST'. PERFORM frm_post. ENDCASE.

ENDFORM.

*&---------------------------------------------------------------------**& FORM FRM_SAVE*&---------------------------------------------------------------------**& TEXT*&---------------------------------------------------------------------**& --> P1 TEXT*& <-- P2 TEXT*&---------------------------------------------------------------------*FORM frm_post. DATA: lt_rows TYPE salv_t_row, l_row TYPE i.

DATA: lt_item LIKE gt_sflight. DATA: lv_msgty TYPE bapi_mtype, lv_msgtx TYPE bapi_msg. DATA: wl_answer TYPE c.* CALL FUNCTION 'POPUP_TO_CONFIRM'* EXPORTING* text_question = TEXT-003 "是否调整库存?* icon_button_1 = TEXT-004 "是* icon_button_2 = TEXT-005 "否* default_button = '2'* display_cancel_button = ''* start_column = 25* start_row = 6* IMPORTING* answer = wl_answer* EXCEPTIONS* text_not_found = 1* OTHERS = 2.** IF wl_answer = '1'.* ELSE.* RETURN.* ENDIF. * GET SELECTED ROWS lt_rows = go_salv->get_selected_rows( ). DATA(lv_line) = lines( lt_rows ). IF lv_line = 0. MESSAGE 'NO SELECTED ROWS' TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. LOOP AT lt_rows INTO l_row. " DO SOMETHING " UPDATE <fs_table> READ TABLE gt_sflight ASSIGNING FIELD-SYMBOL(<fs_sflight>) INDEX l_row. IF sy-subrc = 0. <fs_sflight>-seatsocc += 1. lv_msgtx = |POST { <fs_sflight>-carrid } { <fs_sflight>-connid } { <fs_sflight>-fldate }|. ENDIF. ENDLOOP. MESSAGE lv_msgtx TYPE 'I'. go_salv->refresh( ).ENDFORM.

同示例二有稍许的不同,多传了一个参数im_pfstatus,为GUI状态名 'ZSALV_STATUS' ,其中增加了一个POST按钮, 另外参数

im_t_events多增加了自定义事件触发后回调的FORM名称。

SALV 封装 - 封面图
SALV 封装 - 封面图

示例代码四

示例四:增加行号

*&---------------------------------------------------------------------**& Report ZDEMO_SALV04*&---------------------------------------------------------------------**& add a column:row_no*&---------------------------------------------------------------------*REPORT zdemo_salv04.

TYPES: BEGIN OF gty_sflight, row_no TYPE lineid. INCLUDE STRUCTURE sflight.TYPES: END OF gty_sflight. DATA: gt_sflight TYPE STANDARD TABLE OF gty_sflight.

START-OF-SELECTION.

SELECT * UP TO 100 ROWS INTO CORRESPONDING FIELDS OF TABLE @gt_sflight FROM sflight.

NEW zcl_salv( im_table = REF #( gt_sflight ) im_t_hide = VALUE #( ( fieldname = 'MANDT' ) ) im_t_hotspot = VALUE #( ( fieldname = 'CARRID' ) ) )->display( ).

定义的结构中只需要增加一个ROW_NO字段就可以显示每一行的行号了,而且在列表排序或过滤后,会重新编号。

SALV 封装 - 封面图
SALV 封装 - 封面图
SALV 封装 - 封面图
SALV 封装 - 封面图

示例代码五

示例五:行、列、单元格颜色设置

*&---------------------------------------------------------------------**& Report ZDEMO_SALV05*&---------------------------------------------------------------------**& SET COLUMN/ROW/CELL COLOR*&---------------------------------------------------------------------*REPORT zdemo_salv05.

TYPES: BEGIN OF gty_sflight, row_no TYPE lineid. INCLUDE STRUCTURE sflight.TYPES: t_color TYPE lvc_t_scol, END OF gty_sflight. DATA: gt_sflight TYPE STANDARD TABLE OF gty_sflight. DATA: lt_s_color TYPE lvc_t_scol, ls_s_color TYPE lvc_s_scol.

START-OF-SELECTION.

SELECT * UP TO 100 ROWS INTO CORRESPONDING FIELDS OF TABLE @gt_sflight FROM sflight.
LOOP AT gt_sflight ASSIGNING FIELD-SYMBOL(<fs_sflight>). REFRESH: lt_s_color. IF sy-tabix MOD 3 = 0.* set row color ls_s_color-color-col = 5. ls_s_color-color-int = 0. ls_s_color-color-inv = 0. APPEND ls_s_color TO lt_s_color. CLEAR ls_s_color. ENDIF. IF sy-tabix MOD 2 = 0.* set cell color ls_s_color-f

...

ABAP三叔

关于作者:ABAP三叔

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「SALV封装.md」整理生成,仅用于内部技术分享与学习交流。