直接上代码吧,copy过去就可以用:
*&---------------------------------------------------------------------*
*& Report ZLM_ALV_07
*& http://blog.sina.com.cn/sapliumeng
*&---------------------------------------------------------------------*
*1)在alv引用类型池定义时加入icon,如type-pools: slis, icon.
*
*2)给显示内表itab定义一字段statu存储状态灯;
*
*3)循环内表itab给字段statu值赋:
*绿灯:itab-statu = icon_led_green.
*红灯:itab-statu = icon_led_red.
*4)alv的fieldcat属性i_fieldcat-icon = 'X'.
*&---------------------------------------------------------------------*
REPORT zlm_alv_07.
*&---------------------------------------------------------------------*
*& 声明
*&---------------------------------------------------------------------*
TYPE-POOLS: slis, icon.
*&---------------------------------------------------------------------*
*&基本数据定义
*&---------------------------------------------------------------------*
DATA:
BEGIN OF str_data,
id TYPE int4,
age TYPE int4,
statu TYPE char10,
END OF str_data.
DATA:
g_it_data LIKE TABLE OF str_data,
g_wa_data LIKE str_data.
*&---------------------------------------------------------------------*
*& ALV相关定义
*&---------------------------------------------------------------------*
DATA: fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
*&---------------------------------------------------------------------*
*& 宏定义
*&---------------------------------------------------------------------*
DEFINE fill_fieldcat.
fieldcat-fieldname = &1.
fieldcat-seltext_l = &2.
fieldcat-icon = 'X'. "图标功能
append fieldcat.
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*& 主逻辑
*&---------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM zform_fill_data.
PERFORM zform_show.
*&---------------------------------------------------------------------*
*& form区
*&---------------------------------------------------------------------*
FORM zform_fill_data.
fill_fieldcat 'ID' '编号'.
fill_fieldcat 'AGE' '年龄'.
fill_fieldcat 'STATU' '灯饰'.
g_wa_data-id = 1.
g_wa_data-age = 12.
g_wa_data-statu = icon_led_red.
APPEND g_wa_data TO g_it_data.
g_wa_data-id = 2.
g_wa_data-age = 13.
g_wa_data-statu = icon_led_green.
APPEND g_wa_data TO g_it_data.
ENDFORM. "zform_fill_data
*&---------------------------------------------------------------------*
*& Form zform_show
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM zform_show.
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
it_fieldcat = fieldcat[]
TABLES
t_outtab = g_it_data[].
ENDFORM. "zform_show
OO 方式ALV 红绿灯
效果:
主要代码:
*&---------------------------------------------------------------------*
*& 全局变量
*&---------------------------------------------------------------------*
DATA:
BEGIN OF str_spfli,
checkbox TYPE char1,
status TYPE icon_d, "检查状态图标
carrid TYPE sflight-carrid , "航线承运人ID
connid TYPE sflight-connid , "航班连接 Id
fldate TYPE sflight-fldate , "航班日期
price TYPE sflight-price , "航空运费
cellstyle TYPE lvc_t_styl, "可编辑字段SORT表
END OF str_spfli.
DATA:
g_it_show LIKE TABLE OF str_spfli WITH KEY checkbox carrid connid,
g_wa_show LIKE str_spfli.
START-OF-SELECTION.
"获取数据
SELECT carrid
connid
fldate
price
FROM sflight INTO CORRESPONDING FIELDS OF TABLE g_it_show.
FIELD-SYMBOLS 《l_show》 LIKE LINE OF g_it_show. "英文单引号会被html误解析,特使用《》
DATA:l_dex TYPE int4.
LOOP AT g_it_show ASSIGNING 《l_show》.
l_dex = sy-tabix MOD 3.
CASE l_dex.
WHEN 1 .
《l_show》-status = icon_led_green.
WHEN 2.
《l_show》-status = icon_led_red.
WHEN OTHERS.
《l_show》-status = icon_led_yellow.
ENDCASE.
ENDLOOP.
"调用屏幕
CALL SCREEN 9001.
FORM zform_alv_show .
DATA: l_style TYPE i,
ls_layout TYPE lvc_s_layo,
is_stable TYPE lvc_s_stbl,
l_disvariant TYPE disvariant.
* 屏幕初始化
IF alv_ctner IS INITIAL.
CREATE OBJECT alv_ctner
EXPORTING
repid = sy-repid
dynnr = '9001'
* side = cl_gui_docking_container=>dock_at_right ”ALV贴屏幕右边,从屏幕右边开始算宽度
side = cl_gui_docking_container=>dock_at_left "ALV贴屏幕左边,从左边算屏幕宽度,
extension = 900 "屏幕宽度
* style = cl_gui_control=>ws_child "可选参数,设置ALV是否可用手动拖动大小
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 s001(00) WITH '屏幕初始化失败'.
LEAVE LIST-PROCESSING.
ENDIF.
*添加自定义工具条
PERFORM frm_set_alv_toolbar.
*
CREATE OBJECT g_alv_grid
EXPORTING
i_parent = alv_ctner.
*构建显示字段样式
PERFORM frm_build_fieldcat.
"Set/Reset Ready for Input Status
CALL METHOD g_alv_grid->set_ready_for_input
EXPORTING
i_ready_for_input = 1.
* layout 设定样式
CLEAR ls_layout.
ls_layout-cwidth_opt = 'X'. "优化列宽
CLEAR l_disvariant.
l_disvariant-report = sy-repid. "当前程序
* event 绑定事件
CREATE OBJECT g_event.
SET HANDLER g_event->toolbar FOR g_alv_grid.
SET HANDLER g_event->handle_data_changed FOR g_alv_grid.
* SET HANDLER g_event->handle_f4 FOR g_alv_grid.
SET HANDLER g_event->handle_cell_click FOR g_alv_grid.
SET HANDLER g_event->handle_user_command FOR g_alv_grid.
SET HANDLER g_event->handle_double_click FOR g_alv_grid.
SET HANDLER g_event->handle_onf1 FOR g_alv_grid.
"以下两个方法达到的效果是:光标离开正在编辑的单元格时,就触发了handle_data_changed
"如果不注释掉以下两个方法,则只有执行下一操作时才会触发handle_data_changed,比如点保存点删除
CALL METHOD g_alv_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
CALL METHOD g_alv_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter.
* "显示内表数据
CALL METHOD g_alv_grid->set_table_for_first_display
EXPORTING
is_layout = ls_layout
is_variant = l_disvariant
it_toolbar_excluding = gt_tools
CHANGING
it_fieldcatalog = it_fieldcatalog[]
it_outtab = g_it_show[].
ELSE.
"冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'RELOAD'.
"ALV 控制:刷新稳定性 按行刷新,可选参数
CLEAR is_stable.
is_stable-col = 'X'.
"刷新
CALL METHOD g_alv_grid->refresh_table_display
EXPORTING
is_stable = is_stable
i_soft_refresh = 'X'.
"提交
CALL METHOD cl_gui_cfw=>flush.
ENDIF.
ENDFORM. " ZFORM_ALV_SHOW