在GUI Status加入自定义按钮后,可以通过注册事件(event) ‘added_function’,并且在对应的handler method中写入相关逻辑,来实现点击按钮后的逻辑。
事件added_function是在类cl_salv_events中:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s9GbwRNG-1678760212879)(D:\学习计划笔记\SALV\IMAGE\image-20220418152142332.png)]](https://files.pic99.top/yuhaojiang/202406/05c6825082b444c.png)
事件注册代码:
*... §6 register to the events of cl_salv_tableDATA: lo_events TYPE REF TO cl_salv_events.lo_events = o_alv->get_event( ).CREATE OBJECT o_events.*... §6.1 register to the event USER_COMMANDSET HANDLER o_events->on_user_command FOR lo_events.
handler 方法的代码:
* 事件class
CLASS lcl_handle_events DEFINITION.PUBLIC SECTION.METHODS:on_user_command FOR EVENT added_function OF cl_salv_eventsIMPORTING e_salv_function.
ENDCLASS. "lcl_handle_events DEFINITIONCLASS lcl_handle_events IMPLEMENTATION.METHOD on_user_command.IF e_salv_function = '&DIS'.MESSAGE 'dipslay button' TYPE 'I'.ENDIF.ENDMETHOD. "on_user_commandENDCLASS.
完整代码如下:参考代码
*&---------------------------------------------------------------------*
*& 一个简单的通过类CL_SALV_TABLE生成SALV的例子
*&---------------------------------------------------------------------*
REPORT zabap_salv19.*
* 定义SALV输出内表
TYPES: BEGIN OF ty_vbak,vbeln TYPE vbak-vbeln,erdat TYPE erdat,auart TYPE auart,kunnr TYPE kunnr,END OF ty_vbak.
*
DATA: t_vbak TYPE STANDARD TABLE OF ty_vbak.
* 事件class
CLASS lcl_handle_events DEFINITION.PUBLIC SECTION.METHODS:on_user_command FOR EVENT added_function OF cl_salv_eventsIMPORTING e_salv_function.
ENDCLASS. "lcl_handle_events DEFINITIONCLASS lcl_handle_events IMPLEMENTATION.METHOD on_user_command.CASE e_salv_function.WHEN '&DIS'.PERFORM print_data.WHEN '&COL'.MESSAGE 'dipslay button COL' TYPE 'I'.WHEN OTHERS. MESSAGE 'dipslay button ALL' TYPE 'I'.ENDCASE.
* data lv_index type i.
* i = lines( o_alv ).
* BREAK-POINT.ENDMETHOD. "on_user_commandENDCLASS.
*----------------------------------------------------------------------*
* CLASS lcl_report DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_report DEFINITION.
*PUBLIC SECTION.
*
* ALV referenceDATA: o_alv TYPE REF TO cl_salv_table.
*DATA: o_events TYPE REF TO lcl_handle_events.METHODS:
* 抽取数据get_data,
*
* 生成输出内容generate_output.
*
*$*$*.....CODE_ADD_1 - Begin..................................1..*$*$*
*
* 定义private method来设定SALV不同特性PRIVATE SECTION.METHODS:set_pf_status CHANGING co_alv TYPE REF TO cl_salv_table.
*$*$*.....CODE_ADD_1 - End....................................1..*$*$*ENDCLASS. "lcl_report DEFINITION*----------------------------------------------------------------------*
* CLASS lcl_report IMPLEMENTATION
*----------------------------------------------------------------------*
* 类实现
CLASS lcl_report IMPLEMENTATION.
*METHOD get_data.
* 抽取数据SELECT vbelnerdatauartkunnrINTO TABLE t_vbakFROM vbakUP TO 70 ROWS.
*ENDMETHOD. "get_data*.......................................................................METHOD generate_output.
* New ALV instance
* We are calling the static Factory method which will give back
* the ALV object reference.
*
* exception classDATA: lx_msg TYPE REF TO cx_salv_msg.TRY.cl_salv_table=>factory(IMPORTINGr_salv_table = o_alvCHANGINGt_table = t_vbak ).CATCH cx_salv_msg INTO lx_msg.ENDTRY.
*
*$*$*.....CODE_ADD_2 - Begin..................................2..*$*$*
*
* In this area we will call the methods which will set the
* different properties to the ALV
* 调用status设置方法CALL METHOD set_pf_statusCHANGINGco_alv = o_alv.
*$*$*.....CODE_ADD_2 - End....................................2..*$*$*
*
*
*... §6 register to the events of cl_salv_tableDATA: lo_events TYPE REF TO cl_salv_events.lo_events = o_alv->get_event( ).CREATE OBJECT o_events.*... §6.1 register to the event USER_COMMANDSET HANDLER o_events->on_user_command FOR lo_events.* 调用Display方法将数据输出到屏幕上o_alv->display( ).
*ENDMETHOD. "generate_output
*
*$*$*.....CODE_ADD_3 - Begin..................................3..*$*$*
*
* In this area we will implement the methods which are defined in
* the class definition
* status设置方法实现METHOD set_pf_status.* 调用自定义pf statusco_alv->set_screen_status(pfstatus = 'STANDARD_FULLSCREEN'"Status名称report = 'ZABAP_SALV19'"程序名set_functions = co_alv->c_functions_all ).ENDMETHOD.
*$*$*.....CODE_ADD_3 - End....................................3..*$*$*
*
ENDCLASS. "lcl_report IMPLEMENTATIONSTART-OF-SELECTION.DATA: lo_report TYPE REF TO lcl_report.CREATE OBJECT lo_report.
* 抽取数据lo_report->get_data( ).
* 生成SALVlo_report->generate_output( ).
*&---------------------------------------------------------------------*
*& Form PRINT_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM print_data .data lv_index type i.lv_index = lines( t_vbak ).MESSAGE 'dipslay button COL' && lv_index TYPE 'I'.
ENDFORM.
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8S9qGceX-1678760212880)(D:\学习计划笔记\SALV\IMAGE\image-20220418162425373.png)]](https://files.pic99.top/yuhaojiang/202406/53c6660211797ea.png)