昨天讲解了如何使用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)


TABLESsflight.
TYPE-POOLSiconsliskkblo.
*   Define inernal table
DATAgs_sflight TYPE sflight.
DATAgt_sflight TYPE STANDARD TABLE OF sflight.

*   ALV components
DATAgt_fieldcat TYPE slis_t_fieldcat_alv.
DATAgs_fieldcat TYPE slis_fieldcat_alv.
DATAgt_sort TYPE slis_t_sortinfo_alv.
DATAgs_sort TYPE slis_sortinfo_alv.


*   Define flag
DATAg_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