Function ALV 是实现最简单,使用频率最高的报表
使用Function ALV的关键就是调用SAP标准的程序
REUSE_ALV_LIST_DISPLAY (仅查看) REUSE_ALV_GRID_DISPLAY(可编辑)
简单实现: 生成报表
使用函数:REUSE_ALV_LIST_DISPLAY
示例代码:
REPORT ZABAP_FUNCTION_ALV.
DATA gt_itab TYPE TABLE OF SFLIGHT.
SELECT * FROM SFLIGHT INTO TABLE gt_itab UP TO 25 ROWS.
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
i_structure_name = 'SFLIGHT'
TABLES
t_outtab = gt_itab.
运行程序结果如图:
可以看到简单几行代码就实现了一个报表,但是目前的报表只能查看不能编辑后保存数据到数据库
添加工具栏按钮和绑定点击事件
首先创建一个GUI Status
其次回到编辑器后引入类型池SLIS和绑定事件所需的变量
SLIS类型池中定义了 Function ALV 所需的类型
REPORT ZABAP_FUNCTION_ALV.
TYPE-POOLS:SLIS.
DATA lt_events TYPE SLIS_T_EVENT.
DATA ls_event TYPE SLIS_ALV_EVENT.
DATA gt_itab TYPE TABLE OF SFLIGHT.
SELECT * FROM SFLIGHT INTO TABLE gt_itab UP TO 25 ROWS.
*设置 GUI Status 显示到画面上
MOVE 'PF_STATUS_SET' TO ls_event-NAME.
MOVE 'ALV_STATUS_SET' TO ls_event-FORM.
APPEND ls_event TO lt_events.
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
i_callback_program = sy-repid
it_events = lt_events
i_structure_name = 'SFLIGHT'
i_callback_user_command = 'ALV_USER_COMMAND'
TABLES
t_outtab = gt_itab.
*设置GUI Status 子程序
FORM ALV_STATUS_SET USING PT_EXTAB TYPE SLIS_T_EXTAB.
CLEAR PT_EXTAB[].
SET PF-STATUS 'ALV_STATUS'.
ENDFORM.
*设置点击事件 p_ucomm 表示 GUI Status 的 Function Code
FORM ALV_USER_COMMAND USING p_ucomm LIKE sy-ucomm p_selfield TYPE slis_selfield.
CASE p_ucomm.
WHEN 'CLOSE'.
LEAVE PROGRAM.
WHEN OTHERS.
ENDCASE.
ENDFORM.
程序运行后显示如图
此时点击关闭按钮会关闭当前程序
参数 :i_callback_user_command 用于设置点击事件
参数 :i_callback_program 以及 it_events 用于设置 工具栏按钮GUI Status
进阶模式:查看报表并按需修改保存报表
使用函数:REUSE_ALV_GRID_DISPLAY
下面演示下进阶的Function ALV 报表,也就是开启Function ALV的Edit模式,做到既能查看又能修改后保存到数据库
首先:设置监听事件并绑定处理子程序
*设置 监听修改事件
*要监听的事件
MOVE 'DATA_CHANGED' TO ls_event-NAME.
*事件触发时执行的子程序
MOVE 'ALV_DATA_CHANGED' TO ls_event-FORM.
APPEND ls_event TO lt_events.
其次:开启编辑模式
DATA: gs_layout TYPE slis_layout_alv.
gs_layout-edit = 'X'.
DATA: gs_layout TYPE slis_layout_alv.
gs_layout-edit = 'X'.
*开启编辑模式的关键就是设置is_layout参数并将edit赋值为X
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-cprog
it_events = lt_events
i_structure_name = 'SFLIGHT'
i_callback_user_command = 'ALV_USER_COMMAND'
is_layout = gs_layout
TABLES
t_outtab = gt_itab.
最后:实现数据保存的事件子程序ALV_DATA_CHANGED
FORM ALV_DATA_CHANGED USING pchanged_data TYPE REF TO cl_alv_changed_data_protocol.
DATA lv_name(20).
DATA ls_cells TYPE lvc_s_modi.
FIELD-SYMBOLS: <fs_value>.
CLEAR gt_itab.
LOOP AT pchanged_data->mt_mod_cells INTO ls_cells.
READ TABLE gt_itab INDEX ls_cells-row_id.
CONCATENATE 'GT_ITAB-' ls_cells-fieldname INTO lv_name.
ASSIGN (lv_name) TO <fs_value>.
<fs_value> = ls_cells-value.
MODIFY gt_itab INDEX ls_cells-row_id.
ENDLOOP.
MODIFY SFLIGHT FROM gt_itab.
ENDFORM.
编辑
将 SFLIGHT-Capacity 值 385 修改为 385555 后按Enter键保存
结果查看数据中发现已保存
完整的报表编辑保存代码
*&---------------------------------------------------------------------*
*& Report ZABAP_FUNCTION_ALV
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZABAP_FUNCTION_ALV.
TYPE-POOLS:SLIS.
DATA lt_events TYPE SLIS_T_EVENT.
DATA ls_event TYPE SLIS_ALV_EVENT.
DATA gt_itab TYPE TABLE OF SFLIGHT WITH HEADER LINE.
SELECT * FROM SFLIGHT INTO TABLE gt_itab UP TO 25 ROWS.
*设置 GUI Status 显示到画面上
MOVE 'PF_STATUS_SET' TO ls_event-NAME.
MOVE 'ALV_STATUS_SET' TO ls_event-FORM.
APPEND ls_event TO lt_events.
*设置 监听修改修改事件
*要监听的事件
MOVE 'DATA_CHANGED' TO ls_event-NAME.
*事件触发时执行的子程序
MOVE 'ALV_DATA_CHANGED' TO ls_event-FORM.
APPEND ls_event TO lt_events.
DATA: gs_layout TYPE slis_layout_alv.
gs_layout-edit = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-cprog
it_events = lt_events
i_structure_name = 'SFLIGHT'
i_callback_user_command = 'ALV_USER_COMMAND'
is_layout = gs_layout
TABLES
t_outtab = gt_itab.
*设置GUI Status 子程序
FORM ALV_STATUS_SET USING PT_EXTAB TYPE SLIS_T_EXTAB.
CLEAR PT_EXTAB[].
SET PF-STATUS 'ALV_STATUS'.
ENDFORM.
*设置点击事件 p_ucomm 表示 GUI Status 的 Function Code
FORM ALV_USER_COMMAND USING p_ucomm LIKE sy-ucomm p_selfield TYPE slis_selfield.
CASE p_ucomm.
WHEN 'CLOSE'.
LEAVE PROGRAM.
WHEN OTHERS.
ENDCASE.
ENDFORM.
FORM ALV_DATA_CHANGED USING pchanged_data TYPE REF TO cl_alv_changed_data_protocol.
DATA lv_name(20).
DATA ls_cells TYPE lvc_s_modi.
FIELD-SYMBOLS: <fs_value>.
CLEAR gt_itab.
LOOP AT pchanged_data->mt_mod_cells INTO ls_cells.
READ TABLE gt_itab INDEX ls_cells-row_id.
CONCATENATE 'GT_ITAB-' ls_cells-fieldname INTO lv_name.
ASSIGN (lv_name) TO <fs_value>.
<fs_value> = ls_cells-value.
MODIFY gt_itab INDEX ls_cells-row_id.
ENDLOOP.
MODIFY SFLIGHT FROM gt_itab.
ENDFORM.