效果图
首先是实现ALV单元格按钮图标+事件响应:
ALV显示添加事件:
FORM frm_alv_output .
DATA: lt_events TYPE slis_t_event, "事件
ls_events LIKE LINE OF lt_events.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = lt_events
EXCEPTIONS
list_type_wrong = 1
OTHERS = 2.
ls_events-name = 'CALLER_EXIT'.
ls_events-form = 'FRM_CLICK_BUTTON'.
APPEND ls_events TO lt_events.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'FRM_SET_STATUS'
i_callback_user_command = 'FRM_USER_COMMAND'
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat
it_events = lt_events
i_save = 'A'
TABLES
t_outtab = gt_tab
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
在子例程FRM_CLICK_BUTTON里添加事件,
FORM frm_click_button USING e_grid TYPE slis_data_caller_exit.
DATA: lr_event_handler TYPE REF TO lcl_event_handler . "事件响应
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = gr_grid.
CREATE OBJECT lr_event_handler.
SET HANDLER lr_event_handler->handle_butten_click FOR gr_grid.
ENDFORM.
定义类
*----------------------------------------------------------------------*
* CLASS LCL_EVENT_HANDLER DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
METHODS:
* BUTTEN单元格
handle_butten_click FOR EVENT button_click OF cl_gui_alv_grid
IMPORTING
es_col_id
es_row_no.
ENDCLASS.
*----------------------------------------------------------------------*
* CLASS LCL_EVENT_HANDLER IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION.
* BUTTEN 单元格
METHOD handle_butten_click.
PERFORM frm_get_attachment USING es_col_id es_row_no.
ENDMETHOD.
ENDCLASS.
ALV格式设置
gs_layout-stylefname = 'FIELD_STYLE'.
设置ALV单元格图标和按钮
<fs_tab>-zbutton = icon_table_settings."按钮图标
* 把单元格变为按钮
IF <fs_tab>-field_style IS INITIAL.
ls_stylelin-fieldname = 'ZBUTTON'. " 需要编辑的列名
ls_stylelin-style = cl_gui_alv_grid=>mc_style_button." 设置为BUT
APPEND ls_stylelin TO <fs_tab>-field_style.
CLEAR ls_stylelin.
ENDIF.
判断是否存在凭证附件
"判断凭证是否有附件
lv_gos_objkey = <fs_tab>-vbeln1.
CLEAR:lt_gos_connections[].
CALL FUNCTION 'BDS_GOS_CONNECTIONS_GET'
EXPORTING
logical_system = lv_logical_system
classname = lv_classname "billing document
objkey = lv_gos_objkey
client = sy-mandt
TABLES
gos_connections = lt_gos_connections
EXCEPTIONS
no_objects_found = 1
internal_error = 2
internal_gos_error = 3
OTHERS = 4.
IF lt_gos_connections[] IS NOT INITIAL.
ENDIF.
接下来就是设置按钮对应事件,在子例程frm_get_attachment
FORM frm_get_attachment USING ps_col_id TYPE lvc_s_col
ps_row_no TYPE lvc_s_roid.
DATA:ls_object TYPE sibflporb,
lv_mode TYPE c VALUE 'D'.
READ TABLE gt_tab INTO DATA(ls_tab) INDEX ps_row_no-row_id.
"权限检查
AUTHORITY-CHECK OBJECT 'S_TCODE' ID 'TCD' FIELD 'VL02N'.
IF sy-subrc EQ 0.
lv_mode = 'C'.
ENDIF.
ls_object-instid = ls_tab-vbeln1.
ls_object-typeid = 'LIKP'.
ls_object-catid = 'BO'.
CALL FUNCTION 'GOS_ATTACHMENT_LIST_POPUP'
EXPORTING
is_object = ls_object
ip_check_arl = 'X'
ip_check_bds = 'X'
ip_notes = 'X'
ip_attachments = 'X'
ip_urls = 'X'
ip_mode = lv_mode.
*IP_MODE D :显示
* E :可更改不提交数据库更新,
* C :可更改可提交数据库更新
ENDFORM.
参考:https://blog.youkuaiyun.com/ABAP_NY/article/details/114525359
https://blog.youkuaiyun.com/qq_40977705/article/details/127688694