该案例代码演示了如何通过 OOALV 创造一个可定制的,带有自定义行颜色、工具栏按钮和用户命令的表格。
1.定义数据
TYPES: BEGIN OF ty_sales,
sales_order TYPE vbeln_va, " 销售订单号
customer_id TYPE kunnr, " 客户 ID
order_date TYPE erdat, " 订单日期
net_amount TYPE bapivbapko-netwr, " 净金额
END OF ty_sales.
DATA: lt_sales TYPE TABLE OF ty_sales WITH HEADER LINE.
2.查询数据并生成字段目录
* 获取销售订单数据
SELECT a~vbeln a~kunnr a~erdat b~netwr
INTO TABLE lt_sales
FROM vbak AS a
JOIN vbap AS b ON a~vbeln = b~vbeln
WHERE a~auart EQ 'OR'
* 创建字段目录
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'TY_SALES'
CHANGING
ct_fieldcat = gt_fcat[].
3.创建 ALV 对象
* 创建 ALV 对象
DATA(lo_alv) = NEW cl_gui_alv_grid( ).
lo_alv->set_table_for_first_display(
EXPORTING
i_structure_name = 'TY_SALES'
is_layout = gs_layout
it_toolbar_excluding = it_toolbar_excl[]
CHANGING
it_outtab = lt_sales
it_fieldcatalog = gt_fcat[]
it_sort = gt_sort[]
it_alv_edit = gt_edited_cells[]
).
4.添加自定义行颜色
* 定义回调函数
METHODS:
row_color
FOR EVENT row_color_of_table OF cl_gui_alv_grid
IMPORTING
e_row_id
e_row_settings.
* 在 ALV 对象上注册回调函数
SET HANDLER me->row_color FOR lo_alv.
* 添加回调函数的实现
METHOD row_color.
DATA: lv_index TYPE i.
" 每隔两行一换色
IF odd(e_row_id) = abap_false.
READ TABLE me->mt_sales INDEX e_row_id / 2 ASSIGNING FIELD-SYMBOL(<item>).
lv_index = sy-tabix - ( e_row_id / 2 * 2 ) + 1.
CASE lv_index.
WHEN 1.
e_row_settings-row_style = cl_gui_alv_grid=>mc_style_hotspot_light.
WHEN 2.
e_row_settings-row_style = cl_gui_alv_grid=>mc_style_hotspot_dark.
ENDCASE.
ENDIF.
ENDMETHOD.
5.添加工具栏按钮和用户命令
* 定义回调函数
METHODS:
process_user_command
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING
e_ucomm, e_extab,
e_repid, e_selfield.
* 在 ALV 对象上注册回调函数
SET HANDLER me->process_user_command FOR lo_alv.
* 添加工具栏按钮
DATA(lo_toolbar) = lo_alv->get_toolbar( ).
lo_toolbar->add_function(
text = 'Export to Excel'
tooltip = 'Export the sales data to Excel file.'
aicon = cl_gui_alv_grid=>mc_button_export
function = 'EXPORT_TO_EXCEL'
).
* 添加用户命令的实现
METHOD process_user_command.
TYPES: BEGIN OF ty_cell,
row TYPE i,
col TYPE i,
END OF ty_cell.
DATA: lt_data TYPE TABLE OF ty_cell,
lv_row TYPE sytabix,
lv_column TYPE lvc_s_col.
CASE e_ucomm.
WHEN '&XL'.
*--- 导出数据到 Excel
EXPORT_DATA_TO_EXCEL( ).
WHEN '&FILTER'.
*--- 设置过滤条件
CALL SCREEN 1000.
WHEN OTHERS.
ENDCASE.
ENDMETHOD.