昨天讲解了如何使用OO实现可编辑的ALV,今天继续研究如何通过call function的方式实现可编辑的ALV。
思路是这样的:
1,copy一个标准的status出来,因为标准的tool bar里面没有删除行,增加行,修改,显示的按钮,于是在标准的基础上我新增了这4个功能code.
2,定义一个subroutine去设置status,为什么要自定义一个subroutine呢? 为了排除status里面的某些不必要的button,比如display状态下没必要有新增行,删除行button。
3,定义一个subroutine去处理新增或修改了的button对应function code
以下是相关代码:(由于不便于贴图,请读者模仿的时候,自己根据程序需要,copy并修改标准的alv status)
TABLES: sflight.
TYPE-POOLS: icon, slis, kkblo.
* Define inernal table
DATA: gs_sflight TYPE sflight.
DATA: gt_sflight TYPE STANDARD TABLE OF sflight.
* ALV components
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv.
DATA: gs_fieldcat TYPE slis_fieldcat_alv.
DATA: gt_sort TYPE slis_t_sortinfo_alv.
DATA: gs_sort TYPE slis_sortinfo_alv.
* Define flag
DATA: g_flag TYPE c.
START-OF-SELECTION.
PERFORM sub_retrieve_data.
PERFORM sub_build_alv_components.
PERFORM sub_alv_display.
*&---------------------------------------------------------------------*
*& Form SUB_RETRIEVE_DATA
*&---------------------------------------------------------------------*
* Retrieve data
*----------------------------------------------------------------------*
FORM sub_retrieve_data .
SELECT *
INTO TABLE gt_sflight
FROM sflight
UP TO 20 ROWS.
ENDFORM. " SUB_RETRIEVE_DATA
*&---------------------------------------------------------------------*
*& Form SUB_ALV_DISPLAY
*&---------------------------------------------------------------------*
* Display data
*----------------------------------------------------------------------*
FORM sub_alv_display .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'SUB_SET_STATUS'
i_callback_user_command = 'SUB_USER_COMMAND'
it_fieldcat = gt_fieldcat
it_sort = gt_sort
i_save = 'X'
TABLES
t_outtab = gt_sflight.
ENDFORM. " SUB_ALV_DISPLAY
*&---------------------------------------------------------------------*
*& Form SUB_BUILD_ALV_COMPONENTS
*&---------------------------------------------------------------------*
* build field catelog
*----------------------------------------------------------------------*
FORM sub_build_alv_components .
* Build field catelog
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = sy-repid
i_structure_name = 'SFLIGHT'
CHANGING
ct_fieldcat = gt_fieldcat.
* Build sort table
gs_sort-spos = 1.
gs_sort-fieldname = 'CARRID'.
gs_sort-up = 'X'.
APPEND gs_sort TO gt_sort.
gs_sort-spos = 2.
gs_sort-fieldname = 'CONNID'.
gs_sort-up = 'X'.
APPEND gs_sort TO gt_sort.
gs_sort-spos = 3.
gs_sort-fieldname = 'FLDATE'.
gs_sort-up = 'X'.
APPEND gs_sort TO gt_sort.
ENDFORM. " SUB_SET_ALV_COMPONENTS
*&---------------------------------------------------------------------*
*& Form SUB_SET_STATUS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->RT_EXTAB text
*----------------------------------------------------------------------*
FORM sub_set_status USING rt_extab TYPE kkblo_t_extab.
FREE rt_extab.
IF g_flag IS INITIAL.
APPEND: '&DISPLAY' TO rt_extab,
'&INSERT' TO rt_extab,
'&DELETE' TO rt_extab.
ELSE.
APPEND: '&CHANGE' TO rt_extab.
ENDIF.
SET PF-STATUS 'STATUS9100' EXCLUDING rt_extab.
ENDFORM. "SUB_SET_STATUS
*&---------------------------------------------------------------------*
*& Form SUB_USER_COMMAND
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM sub_user_command USING r_ucomm TYPE sy-ucomm
rs_selfield TYPE slis_selfield.
CLEAR gs_fieldcat.
CASE r_ucomm.
WHEN '&CHANGE'.
g_flag = 'X'.
gs_fieldcat-edit = 'X'.
MODIFY gt_fieldcat FROM gs_fieldcat TRANSPORTING edit
WHERE edit IS INITIAL.
WHEN '&DISPLAY'.
g_flag = ''.
gs_fieldcat-edit = ''.
MODIFY gt_fieldcat FROM gs_fieldcat TRANSPORTING edit
WHERE edit = 'X'.
WHEN '&INSERT'.
CLEAR gs_sflight.
INSERT gs_sflight INTO gt_sflight INDEX rs_selfield-tabindex.
WHEN '&DELETE'.
DELETE gt_sflight INDEX rs_selfield-tabindex.
WHEN '&EXIT'.
LEAVE PROGRAM.
WHEN OTHERS.
ENDCASE.
* rs_selfield-refresh = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'SUB_SET_STATUS'
i_callback_user_command = 'SUB_USER_COMMAND'
it_fieldcat = gt_fieldcat
* it_sort = gt_sort
i_save = 'X'
TABLES
t_outtab = gt_sflight.
ENDFORM. "SUB_USER_COMMAND