一、效果展示
二、dialog画屏
三、源代码
YXHRR513
REPORT YXHRR513.
INCLUDE YXHRR513_TOP.
INCLUDE YXHRR513_MAIN.
INCLUDE YXHRR513_FM01.
YXHRR513_TOP(9001子屏幕)
*&---------------------------------------------------------------------*
*& 包含 YXHRR513_TOP
*&---------------------------------------------------------------------*
TABLES:yshr_log.
DATA : wa_container TYPE scrfname VALUE 'CONTAIN',
alv_grid TYPE REF TO cl_gui_alv_grid,
wa_custom_container TYPE REF TO cl_gui_custom_container.
DATA: gt_fieldcat TYPE lvc_t_fcat,
gs_layout TYPE lvc_s_layo.
DATA: gt_ui_func TYPE ui_functions. "隐藏alv菜单控件
DATA: ok_code TYPE sy-ucomm, " 用于接收屏幕操作
save_ok TYPE sy-ucomm. " 接入屏幕操作 并清空ok_code
DATA: dynn_9001(4) VALUE '9001'.
TYPES: BEGIN OF ty_alv,
programm TYPE programm,
direc TYPE ye_direc,
sdate TYPE ye_hrdate,
stims TYPE ye_hrtims,
businessid TYPE ye_businessid,
remark TYPE ye_remark,
sjson TYPE ye_hrxml,
show TYPE char5,
field_style TYPE lvc_t_styl,
END OF ty_alv.
DATA: gt_alv TYPE STANDARD TABLE OF ty_alv,
gs_alv TYPE ty_alv.
CLASS lcl_event_handler DEFINITION DEFERRED.
* 事件处理类
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
METHODS:
* handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
* IMPORTING e_object e_interactive,
handle_button_click
FOR EVENT button_click OF cl_gui_alv_grid
IMPORTING es_col_id es_row_no,
handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
* handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid
* IMPORTING er_data_changed,
*
* handle_onf4_help FOR EVENT onf4 OF cl_gui_alv_grid
* IMPORTING e_fieldname
* es_row_no
* er_event_data.
ENDCLASS.
DATA: go_event_handler TYPE REF TO lcl_event_handler.
DATA: g_xml TYPE REF TO cl_xml_document.
"增加子程序
SELECTION-SCREEN BEGIN OF SCREEN 9001 AS SUBSCREEN.
SELECTION-SCREEN:BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:s_prog FOR yshr_log-programm,
s_direc FOR yshr_log-direc,
s_date FOR yshr_log-sdate,
s_tims FOR yshr_log-stims,
s_busin FOR yshr_log-businessid.
SELECTION-SCREEN:END OF BLOCK blk1.
SELECTION-SCREEN END OF SCREEN 9001.
YXHRR513_MAIN
*&---------------------------------------------------------------------*
*& 包含 YXHRR513_MAIN
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&INITIALIZATION/选择屏幕前初始化(选择屏幕展示之前执行)
*&---------------------------------------------------------------------*
INITIALIZATION .
*&---------------------------------------------------------------------*
*& AT SELECTION-SCREEN OUTPUT/选择屏幕控制(第二屏输出)
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT .
*&---------------------------------------------------------------------*
*& AT SELECTION-SCREEN/选择屏幕执行(参数输入检查)
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN .
*&---------------------------------------------------------------------*
*& START-OF-SELECTION/开始选择屏幕(点击执行按钮之后执行的语块)
*&---------------------------------------------------------------------*
START-OF-SELECTION .
CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& END-OF-SELECTION/结束选择屏幕(程序结束处理,输出等)
*&---------------------------------------------------------------------*
END-OF-SELECTION .
YXHRR513_FM01
*&---------------------------------------------------------------------*
*& 包含 YXHRR513_FM01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS '0100'.
SET TITLEBAR '0100'.
PERFORM init_alv.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
save_ok = ok_code.
CLEAR:ok_code.
CASE save_ok.
WHEN '&F03' OR '&F15' OR '&F12'.
LEAVE TO SCREEN 0.
WHEN 'ZSEARCH'.
PERFORM frm_get_data.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form init_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM init_alv .
PERFORM frm_set_layout. "设置ALV输出格式
PERFORM frm_set_fieldcat. "设置ALV输出字段
PERFORM frm_set_toolbar. "设置alv状态栏
IF wa_custom_container IS INITIAL .
CREATE OBJECT wa_custom_container
EXPORTING
container_name = wa_container.
CREATE OBJECT alv_grid
EXPORTING
i_parent = wa_custom_container.
"实例化方法
CREATE OBJECT go_event_handler.
"事件注入
* SET HANDLER event_receiverundo->handle_toolbar_prod FOR alv_grid_prod.
SET HANDLER go_event_handler->handle_user_command FOR alv_grid.
SET HANDLER go_event_handler->handle_button_click FOR alv_grid.
CREATE OBJECT g_xml.
ENDIF.
CALL METHOD alv_grid->set_table_for_first_display
EXPORTING
i_structure_name = 'GS_PROD'
is_layout = gs_layout
it_toolbar_excluding = gt_ui_func
CHANGING
it_outtab = gt_alv
it_fieldcatalog = gt_fieldcat.
PERFORM frm_refresh_alv USING alv_grid.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_layout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_layout .
gs_layout = VALUE #( zebra = abap_on
cwidth_opt = abap_on
stylefname = 'FIELD_STYLE' ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat .
REFRESH:gt_fieldcat.
DEFINE set_fieldcat.
APPEND VALUE #(
fieldname = &1
ref_table = &2
ref_field = &3
coltext = &4
scrtext_l = &4
scrtext_m = &4
scrtext_s = &4
) TO gt_fieldcat.
END-OF-DEFINITION.
set_fieldcat 'PROGRAMM' 'YTHR_ORGINF' 'PROGRAMM' '程序名字'. "
set_fieldcat 'DIREC' 'YTHR_ORGINF' 'DIREC' '数据方向'. "
set_fieldcat 'SDATE' 'YTHR_ORGINF' 'SDATE' '接口发送日期'. "
set_fieldcat 'STIMS' 'YTHR_ORGINF' 'STIMS' '接口发送时间'. "
set_fieldcat 'BUSINESSID' 'YTHR_ORGINF' 'BUSINESSID' '人才激发ID'. "
set_fieldcat 'REMARK' 'YTHR_ORGINF' 'REMARK' '备注'. "
set_fieldcat 'SHOW' 'YTHR_ORGINF' 'TYPE' '显示数据'. "
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_toolbar
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_toolbar .
DATA: ls_ui_func TYPE ui_func.
REFRESH: gt_ui_func.
ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_copy .
APPEND ls_ui_func TO gt_ui_func.
ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_copy_row .
APPEND ls_ui_func TO gt_ui_func.
ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_cut .
APPEND ls_ui_func TO gt_ui_func.
ls_ui_func = cl_gui_alv_grid=>mc_fc_refresh .
APPEND ls_ui_func TO gt_ui_func.
ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_move_row .
APPEND ls_ui_func TO gt_ui_func.
ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_paste .
APPEND ls_ui_func TO gt_ui_func.
ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_paste_new_row .
APPEND ls_ui_func TO gt_ui_func.
ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_undo .
APPEND ls_ui_func TO gt_ui_func.
ls_ui_func = cl_gui_alv_grid=>mc_fc_pc_file .
APPEND ls_ui_func TO gt_ui_func.
ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_delete_row .
APPEND ls_ui_func TO gt_ui_func.
ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_insert_row .
APPEND ls_ui_func TO gt_ui_func.
ls_ui_func = cl_gui_alv_grid=>mc_fc_loc_append_row.
APPEND ls_ui_func TO gt_ui_func.
ENDFORM.
FORM frm_refresh_alv USING pv_grid TYPE REF TO cl_gui_alv_grid.
CALL METHOD pv_grid->check_changed_data. "检查ALV更改数据
pv_grid->get_frontend_layout( IMPORTING es_layout = DATA(ls_layout) ).
ls_layout-cwidth_opt = abap_on.
pv_grid->set_frontend_layout( is_layout = ls_layout ).
CALL METHOD cl_gui_control=>set_focus
EXPORTING
control = pv_grid.
"刷新变量
DATA: ls_stable TYPE lvc_s_stbl.
"刷新显示
CLEAR ls_stable.
ls_stable-row = 'X'."基于行刷新
ls_stable-col = 'X'."基于列刷新
CALL METHOD pv_grid->refresh_table_display
EXPORTING
is_stable = ls_stable
EXCEPTIONS
finished = 0.
ENDFORM.
*&---------------------------------------------------------------------*
*& Module USER_EXIT_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_exit_0100 INPUT.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_data .
DATA:ls_stylelin TYPE lvc_s_styl.
REFRESH:gt_alv.
SELECT *
FROM ythr_orginf
WHERE programm IN @s_prog
AND direc IN @s_direc
AND sdate IN @s_date
AND stims IN @s_tims
AND businessid IN @s_busin
INTO TABLE @DATA(lt_orginf).
IF sy-subrc EQ 0.
LOOP AT lt_orginf INTO DATA(ls_orginf).
MOVE-CORRESPONDING ls_orginf TO gs_alv.
IF ls_orginf-sjson IS NOT INITIAL.
ls_stylelin-fieldname = 'SHOW'. " 需要编辑的列名
ls_stylelin-style = cl_gui_alv_grid=>mc_style_button. " 设置为BUTEN
INSERT ls_stylelin INTO TABLE gs_alv-field_style.
CLEAR ls_stylelin.
gs_alv-show = '显示'.
ENDIF.
APPEND gs_alv TO gt_alv.
CLEAR:gs_alv,ls_orginf.
ENDLOOP.
ELSE.
MESSAGE '没有满足条件的数据' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ENDFORM.
CLASS lcl_event_handler IMPLEMENTATION.
METHOD handle_user_command.
* CASE e_ucomm.
* WHEN 'ADD'.
* ENDCASE.
ENDMETHOD.
METHOD handle_button_click.
PERFORM sub_button_click USING es_col_id es_row_no.
ENDMETHOD.
"handle_double_click
ENDCLASS.
*&---------------------------------------------------------------------*
*& Form sub_button_click
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> ES_COL_ID
*& --> ES_ROW_NO
*&---------------------------------------------------------------------*
FORM sub_button_click USING p_col_id TYPE lvc_s_col
p_row_no TYPE lvc_s_roid.
DATA: lv_convert TYPE string,
lv_err_text TYPE string.
READ TABLE gt_alv INTO gs_alv INDEX p_row_no-row_id.
IF p_col_id-fieldname = 'SHOW'.
IF gs_alv-sjson IS INITIAL.
MESSAGE '无请求JSON数据' TYPE 'E'.
EXIT.
ENDIF.
TRY.
* 将JSON转换为HTML
CALL TRANSFORMATION sjson2html SOURCE XML gs_alv-sjson
RESULT XML DATA(lv_html).
CATCH cx_xslt_runtime_error INTO DATA(lo_err).
lv_err_text = lo_err->get_text( ).
MESSAGE lv_err_text TYPE 'E'.
RETURN.
ENDTRY.
* 显示HTML
lv_convert = cl_abap_codepage=>convert_from( lv_html ).
cl_abap_browser=>show_html( html_string = lv_convert ).
* CALL METHOD g_xml->parse_string
* EXPORTING
* stream = gs_alv-sjson.
*
* CALL METHOD g_xml->display.
ENDIF.
ENDFORM. "sub_button_click