效果如下:

注意事项:通过屏幕点击事件的类不能直接获取屏幕数据,仅仅能获取行列信息,需要根据行列数据从内表中获取对应数据。
创建屏幕控件。一个放表一个放二维码。



屏幕逻辑代码
PROCESS BEFORE OUTPUT. MODULE STATUS_0100. MODULE INIT_CON. PROCESS AFTER INPUT. MODULE USER_EXIT_0100 AT EXIT-COMMAND.
功能代码
REPORT zr_test_502. DATA: gs_data TYPE zppcu. DATA: gt_data LIKE TABLE OF gs_data. DATA: g_con01 TYPE REF TO cl_gui_custom_container. DATA: g_grid01 TYPE REF TO cl_gui_alv_grid. DATA: gs_fieldcat TYPE lvc_s_fcat. DATA: gt_fieldcat TYPE lvc_t_fcat. CONSTANTS: g_cus01 TYPE scrfname VALUE 'CUS01'. DATA: lcl_obj TYPE REF TO cl_gui_html_viewer, lcl_parent TYPE REF TO cl_gui_custom_container. DATA url(255) TYPE c. *----------------------------------------------------------------------* * CLASS cl_event_receiver DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS cl_event_receiver DEFINITION. PUBLIC SECTION. " 声明单击事件的方法 METHODS handle_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid IMPORTING e_row_id e_column_id. " 声明双击事件方法 METHODS handle_double_click FOR EVENT double_click OF cl_gui_alv_grid IMPORTING e_row e_column. " 声明Toolbar事件方法 METHODS handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid IMPORTING e_object e_interactive. " 声明USER-COMMAND 事件方法 METHODS handle_command FOR EVENT user_command OF cl_gui_alv_grid IMPORTING e_ucomm. ENDCLASS. "cl_event_receiver DEFINITION *----------------------------------------------------------------------* * CLASS cl_event_receiver IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS cl_event_receiver IMPLEMENTATION. " 单击事件方法的实现 METHOD handle_hotspot_click. CONDENSE e_row_id NO-GAPS. CONDENSE e_column_id NO-GAPS. * MODIFY SCREEN 100. * MESSAGE i001(00) WITH '单击事件->行号:' e_row_id '、列名:' e_column_id. FIELD-SYMBOLS: <fs> TYPE zppcu. READ TABLE gt_data ASSIGNING <fs> INDEX e_row_id. CONCATENATE 'https://www.kuaizhan.com/common/encode-png?large=true&data=' <FS>-VBELN INTO url. CALL METHOD lcl_obj->show_url EXPORTING url = url * FRAME = * IN_PLACE = ' X' EXCEPTIONS cntl_error = 1 cnht_error_not_allowed = 2 cnht_error_parameter = 3 dp_error_general = 4 OTHERS = 5. IF sy-subrc = 0. * Implement suitable error handling here ENDIF. ENDMETHOD. "handle_HOTSPOT_CLICK " 双击事件方法的实现 METHOD handle_double_click. CONDENSE e_row NO-GAPS. CONDENSE e_column NO-GAPS. MESSAGE i001(00) WITH '双击事件->行号:' e_row '、列名:' e_column. ENDMETHOD. "handle_double_click " 实现Toolbar事件方法 METHOD handle_toolbar. DATA: ls_toolbar TYPE stb_button. CLEAR: ls_toolbar. ls_toolbar-butn_type = 3. " 分隔符 APPEND ls_toolbar TO e_object->mt_toolbar. CLEAR: ls_toolbar. ls_toolbar-function = 'DISP'. " 功能码 ls_toolbar-icon = icon_display. " 图标名称 ls_toolbar-quickinfo = '退出'. " 图标的提示信息 ls_toolbar-butn_type = 0. " 0表示正常按钮 ls_toolbar-disabled = ''. " X表示灰色,不可用 ls_toolbar-text = '退出'. " 按钮上显示的文本 APPEND ls_toolbar TO e_object->mt_toolbar. ENDMETHOD. "handle_toolbar " 实现USER-COMMAND 事件方法 METHOD handle_command. CASE e_ucomm. WHEN 'DISP'. * MESSAGE i001(00) WITH 'Toolbar事件 + USER-COMMAND事件 '. LEAVE PROGRAM. ENDCASE. ENDMETHOD. "HANDLE_COMMAND ENDCLASS. "cl_event_receiver IMPLEMENTATION DATA: event_receiver TYPE REF TO cl_event_receiver. START-OF-SELECTION. PERFORM get_data. END-OF-SELECTION. IF lcl_parent IS INITIAL. CREATE OBJECT lcl_parent EXPORTING * PARENT = container_name = 'BQCONTAINER' * STYLE = * LIFETIME = lifetime_default * REPID = * DYNNR = * NO_AUTODEF_PROGID_DYNNR = EXCEPTIONS cntl_error = 1 cntl_system_error = 2 create_error = 3 lifetime_error = 4 lifetime_dynpro_dynpro_link = 5 OTHERS = 6. IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. CREATE OBJECT lcl_obj EXPORTING * SHELLSTYLE = parent = lcl_parent * LIFETIME = LIFETIME_DEFAULT * SAPHTMLP = * UIFLAG = * END_SESSION_WITH_BROWSER = 0 * NAME = * SAPHTTP = * QUERY_TABLE_DISABLED = '' EXCEPTIONS cntl_error = 1 cntl_install_error = 2 dp_install_error = 3 dp_error = 4 OTHERS = 5. IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDIF. CALL SCREEN 100. *&---------------------------------------------------------------------* *& Form GET_DATA *&---------------------------------------------------------------------* * text 获取数据 *----------------------------------------------------------------------* FORM get_data. SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_data UP TO 30 ROWS FROM zppcu. ENDFORM. "GET_DATA *&---------------------------------------------------------------------* *& Form SET_FIELDCAT *&---------------------------------------------------------------------* * text ALV显示字段文本 *----------------------------------------------------------------------* FORM set_fieldcat. CLEAR: gt_fieldcat[]. DEFINE macro_fieldcat. clear gs_fieldcat. gs_fieldcat-fieldname = &1. gs_fieldcat-coltext = &2. gs_fieldcat-hotspot = &3. append gs_fieldcat to gt_fieldcat. END-OF-DEFINITION. macro_fieldcat 'VBELN' '销售凭证' 'X'. macro_fieldcat 'XLOEK' '删除的项目' ''. macro_fieldcat 'ERDAT' '创建日期' ''. macro_fieldcat 'ERZET' '时间' ''. macro_fieldcat 'ERNAM' '创建者' ''. macro_fieldcat 'ZGBRQ' '关闭日期' ''. macro_fieldcat 'ZGBSJ' '关闭时间' ''. macro_fieldcat 'ZGBR' '关闭人' ''. ENDFORM. "SET_FIELDCAT *&---------------------------------------------------------------------* *& Form SET_LAYOUT *&---------------------------------------------------------------------* * text 布局 *----------------------------------------------------------------------* * -->P_LAYOUT text *----------------------------------------------------------------------* FORM set_layout CHANGING p_layout TYPE lvc_s_layo. p_layout-cwidth_opt = 'X'. " 自动调节字段长度 p_layout-sel_mode = 'D'. " 选择模式,可选择多行 p_layout-zebra = 'X'. " 颜色交替显示 ENDFORM. "SET_LAYOUT *&---------------------------------------------------------------------* *& Module INIT_CON OUTPUT *&---------------------------------------------------------------------* * text 创建ALV *----------------------------------------------------------------------* MODULE init_con OUTPUT. DATA: ls_layout TYPE lvc_s_layo. IF g_con01 IS INITIAL. PERFORM set_fieldcat. PERFORM set_layout CHANGING ls_layout. " 创建SAP容器实例 CREATE OBJECT g_con01 EXPORTING container_name = g_cus01 " 自定义控件名称 EXCEPTIONS cntl_error = 1 cntl_system_error = 2 create_error = 3 lifetime_error = 4 lifetime_dynpro_dynpro_link = 5 OTHERS = 6. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. " 创建GRID实例 CREATE OBJECT g_grid01 EXPORTING i_parent = g_con01 EXCEPTIONS error_cntl_create = 1 error_cntl_init = 2 error_cntl_link = 3 error_dp_create = 4 OTHERS = 5. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. CREATE OBJECT event_receiver. " 注册事件handler方法 SET HANDLER event_receiver->handle_hotspot_click FOR g_grid01. SET HANDLER event_receiver->handle_double_click FOR g_grid01. SET HANDLER event_receiver->handle_toolbar FOR g_grid01. SET HANDLER event_receiver->handle_command FOR g_grid01. " 调用ALV 显示方法 CALL METHOD g_grid01->set_table_for_first_display EXPORTING * i_structure_name = 'SPFLI' " 参照表结构字段显示 is_layout = ls_layout " 布局 CHANGING it_fieldcatalog = gt_fieldcat " 显示字段 it_outtab = gt_data[] EXCEPTIONS invalid_parameter_combination = 1 program_error = 2 too_many_lines = 3 OTHERS = 4. IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. ENDIF. ENDMODULE. " INIT_CON OUTPUT *&---------------------------------------------------------------------* *& Module STATUS_0100 OUTPUT *&---------------------------------------------------------------------* * text 工具条 *----------------------------------------------------------------------* MODULE status_0100 OUTPUT. SET PF-STATUS 'STATUS_BAR'. ENDMODULE. " STATUS_0100 OUTPUT *&---------------------------------------------------------------------* *& Module USER_EXIT_0100 INPUT *&---------------------------------------------------------------------* * text 取消事件 *----------------------------------------------------------------------* MODULE user_exit_0100 INPUT. CASE sy-ucomm. WHEN 'BACK' OR '%EX' OR 'RW'. LEAVE PROGRAM. WHEN OTHERS. ENDCASE. ENDMODULE. " USER_EXIT_0100 INPUT
网友评论