回顾OO ALV

 这是一个OO ALV的例子,在S4可以执行,下一个测试一下FUNCTION在S4的修改功能


*Alv grid有两个事件:data_changed和ata_changed_finished.第一个事件在可编辑字段的数据发生变化时触发,可用来检查数据的输入正确性,第二个事件是当数据修改完成后触发
*如果数据没有被修改,当失去焦点或回车时,那么它不会走data change,而是直接触发data change finish事件
*可以通过CL_GUI_ALV_GRID类的REGISTER_EDIT_EVENT方法来设置在失去焦点或回车时,触发数据改变事件:
*2  按回车触发:    i_event_id = cl_gui_alv_grid=>mc_event_enter
*2  单元格失去焦点: i_event_id = cl_gui_alv_grid=>mc_event_modifies
*必须设置一种方式,要不然数据变化事件不会被触发事件
*然后注册CL_GUI_ALV_GRID的data_changed、data_changed_finished事件,实现事件处理器方法,在数据发生改变时就会触发这两上事件
* 3个字段可改,但是代码只限定MAKTX修改才会有ACTION
*SAPLKKBL  STANDARD


TYPE-POOLS: slis.
DATA:l_flag_modify TYPE c VALUE 'X'.
DATA: col_pos TYPE i.
TYPES: BEGIN OF itype,
         sel         TYPE char1,  "行选择
         icon        TYPE char4, "检查结果
         stype       TYPE char1,
         msg(200),
         matnr       LIKE mara-matnr,
         matkx       LIKE makt-maktx,
         vbeln       LIKE vbak-vbeln,
         chk(10),

         field_style TYPE lvc_t_styl, "可设定这一单元格的输入,输出属性
       END OF itype.


DATA itab TYPE TABLE OF itype WITH HEADER LINE.
DATA:gs_data  TYPE   itype.

DATA: gt_fieldcat TYPE lvc_t_fcat WITH HEADER LINE,
      fieldcat_ln LIKE LINE OF gt_fieldcat,
      gs_layout   TYPE  lvc_s_layo,
      gs_print    TYPE lvc_s_prnt , "occurs 0 with header line,    "ALV打印格式
      g_repid     LIKE sy-repid.
DATA: v_stru_disvar  TYPE disvariant,    "ALV 显示格式
      it_sort        TYPE lvc_t_sort WITH HEADER LINE, "ALV 排序内表
      git_events     TYPE slis_t_event,     "ALV 事件
      git_listheader TYPE slis_t_listheader. "ALV 表头
DATA l_tmp TYPE lvc_title.

CONSTANTS cns_pf_status    TYPE slis_formname VALUE 'FRM_PF_STATUS'.
CONSTANTS cns_user_command TYPE slis_formname VALUE 'FRM_USER_COMMAND'.



DATA: gt_filtter TYPE lvc_t_fcat WITH HEADER LINE.
DATA  tem_grid        TYPE REF TO cl_gui_alv_grid.
*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.
  PUBLIC SECTION.
    METHODS handle_modify
                FOR EVENT data_changed_finished OF cl_gui_alv_grid
      IMPORTING e_modified et_good_cells.

    METHODS    handle_data_changed
                FOR EVENT data_changed OF cl_gui_alv_grid
      IMPORTING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm.
ENDCLASS.                    "LCL_EVENT_RECEIVER DEFINITION

*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
  METHOD handle_modify.
    DATA stbl TYPE lvc_s_stbl.

    PERFORM frm_refresh_data  USING et_good_cells..
*   稳定刷新
    stbl-row = 'X'." 基于行的稳定刷新
    stbl-col = 'X'." 基于列稳定刷新
    CALL METHOD tem_grid->refresh_table_display
      EXPORTING
        is_stable = stbl.
  ENDMETHOD.                    "HANDLE_MODIFY

  METHOD handle_data_changed.
    DATA stbl TYPE lvc_s_stbl.
    PERFORM handle_data_changed  USING er_data_changed.  "处理受变化的数据

*   稳定刷新
    stbl-row = 'X'." 基于行的稳定刷新
    stbl-col = 'X'." 基于列稳定刷新
    CALL METHOD tem_grid->refresh_table_display
      EXPORTING
        is_stable = stbl.
  ENDMETHOD.                    "HANDLE_MODIFY
ENDCLASS.                    "LCL_EVENT_RECEIVER IMPLEMENTATION
DATA gt_event_receiver TYPE REF TO lcl_event_receiver .


*&---------------------------------------------------------------------*
*&      宏定义
*&---------------------------------------------------------------------*
DEFINE frm_fieldcat.      "  ALV Fieldcat设置
  gt_fieldcat-fieldname = &1.
  gt_fieldcat-reptext = &2.
  gt_fieldcat-outputlen = &3.
  IF &4 = 'X'.
    gt_fieldcat-no_zero = 'X'.
  ENDIF.
  gt_fieldcat-checkbox = &5.
  IF l_flag_modify IS INITIAL.
    gt_fieldcat-edit = ''.
*    gt_fieldcat-key = 'X'.
  ELSE.
    gt_fieldcat-edit = &6.
  ENDIF.
*  if &6 is initial.
*    gt_fieldcat-key = 'X'.
*  endif.
  gt_fieldcat-fix_column = &7.
  gt_fieldcat-icon = &8.
  gt_fieldcat-lowercase = &9.
  APPEND gt_fieldcat.
  CLEAR gt_fieldcat.
END-OF-DEFINITION.


*&---------------------------------------------------------------------*
*&     start of selection
*&---------------------------------------------------------------------*
START-OF-SELECTION.
  PERFORM frm_get_data.

*&---------------------------------------------------------------------*
*&     end-of-selection
*&---------------------------------------------------------------------*
END-OF-SELECTION.
  PERFORM frm_comment_build.       "设置表头
  PERFORM frm_get_event.           "设置自定义事件处理程序
  PERFORM frm_layout.             "设置输出格式
  PERFORM frm_fieldcat.           "设置输出字段
  PERFORM frm_sort.               "设置排序、合计
  PERFORM frm_print.              "设置打印
  PERFORM frm_output.              "输出

*&---------------------------------------------------------------------*
*&      Form  FRM_COMMENT_BUILD
*&---------------------------------------------------------------------*
FORM frm_fieldcat .
* fieldname/reptext/outputlen/no_zero/checkbox/edit/fix_column/Icon
  frm_fieldcat 'ICON'  'LIGHT'       4   ''   ''   ''   'X' 'X' ''.
  frm_fieldcat 'STYPE'  'MTYPE'      12  ''    ''   ''    '' '' ''.
  frm_fieldcat 'MSG'  'MESSAGE'      12  ''    ''   ''    '' '' ''.
  frm_fieldcat 'MATNR'  '料号'        4   ''   ''   'X'   'X' '' ''.
  frm_fieldcat 'CHK'  'CHECKBOX'     13  'X'   'X'   'X'   'X' '' ''.
  frm_fieldcat 'MATKX'  '料号说明'    13  'X'   ''   'X'   'X' '' 'X'.
  frm_fieldcat 'VBELN'  '号码'        12  ''    ''   'X'    '' '' ''.

ENDFORM.                    " frm_FIELDCAT
*&---------------------------------------------------------------------*
*&      Form  frm_comment_build
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_comment_build .
*ALV表头
  DATA l_listheader TYPE slis_listheader.
  DATA: v_title(60).
  CLEAR: git_listheader, l_listheader.
  l_listheader-typ  = 'H'.
  v_title = 'ALV功能测试程式'.
  l_listheader-info = v_title.
  APPEND l_listheader TO git_listheader.
ENDFORM.                    " FRM_COMMENT_BUILD

*&---------------------------------------------------------------------*
*&      Form  FRM_GET_EVENT
*&---------------------------------------------------------------------*
FORM frm_get_event .
  DATA formname_top_of_page TYPE slis_formname VALUE 'FRM_TOP_OF_PAGE'.
  DATA l_events TYPE LINE OF slis_t_event.

  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
    EXPORTING
      i_list_type     = 0
    IMPORTING
      et_events       = git_events
    EXCEPTIONS
      list_type_wrong = 1
      OTHERS          = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

* 修改TOP_OF_PAGE以加入表头,设置处理子程序为'FRM_TOP_OF_PAGE'
  CLEAR l_events.
  READ TABLE git_events
    WITH KEY name = slis_ev_top_of_page INTO l_events.
  IF sy-subrc = 0.
    MOVE 'FRM_TOP_OF_PAGE' TO l_events-form.
    MODIFY git_events FROM l_events INDEX sy-tabix.
  ELSE.
    l_events-form = 'FRM_TOP_OF_PAGE'.
    l_events-name = slis_ev_top_of_page.
    APPEND l_events TO git_events.
  ENDIF.

*
  l_events-name = 'CALLER_EXIT'.
  l_events-form = 'FM_BUTTON'.
  APPEND l_events TO git_events.
ENDFORM.                    " FRM_GET_EVENT

*&---------------------------------------------------------------------*
*&      Form  FRM_TOP_OF_PAGE  表头
*&---------------------------------------------------------------------*
FORM  frm_top_of_page.
  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      it_list_commentary = git_listheader.
ENDFORM.                    "FRM_TOP_OF_PAGE
*&---------------------------------------------------------------------*
*&      Form  frm_LAYOUT
*&---------------------------------------------------------------------*
FORM frm_layout .
  gs_layout-box_fname  = 'SEL'.
  gs_layout-zebra      = 'X'.
  gs_layout-sel_mode   = 'A'.
  gs_layout-cwidth_opt = 'X'.
  gs_layout-edit       = ''.
  gs_layout-stylefname = 'FIELD_STYLE'.
ENDFORM.                    " frm_LAYOUT

*&---------------------------------------------------------------------*
*&      Form  frm_FIELDCAT
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  frm_fieldcat
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&      Form  frm_SORT
*&---------------------------------------------------------------------*
*       ALV 排序
*----------------------------------------------------------------------*
FORM frm_sort .
  CLEAR it_sort.
  it_sort-fieldname = 'MATNR'.  "排序字段
  it_sort-spos = 1.
  it_sort-up = 'X'.             "升序
*  it_sort-subtot = 'X'.         "小计依据
  APPEND it_sort .
ENDFORM.                    " frm_SORT
*&---------------------------------------------------------------------*
*&      Form  frm_PRINT
*&---------------------------------------------------------------------*
*       ALV 打印
*----------------------------------------------------------------------*
FORM frm_print .
*  gs_print-no_print_listinfos = 'X'. "不打印汇总页
*  gs_print-prnt_info = 'X'.          "打印日期,程序标题和页号
ENDFORM.                    " frm_PRINT
*&---------------------------------------------------------------------*
*&      Form  FRM_OUTPUT
*&---------------------------------------------------------------------*
FORM frm_output .
*  ALV输出
  g_repid = sy-repid.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = g_repid
      is_layout_lvc            = gs_layout
      it_fieldcat_lvc          = gt_fieldcat[]
      i_save                   = 'X'
      i_callback_pf_status_set = cns_pf_status
      i_callback_user_command  = 'FRM_USER_COMMAND'
      is_variant               = v_stru_disvar
      it_events                = git_events
      it_sort_lvc              = it_sort[]
      is_print_lvc             = gs_print
    TABLES
      t_outtab                 = itab[]
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.                    " FRM_OUTPUT

*&---------------------------------------------------------------------*
*&      Form  ALV_PF_STATUS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RT_EXTAB   text
*----------------------------------------------------------------------*
FORM frm_pf_status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'ZSTANDARD'  .
*  SET PF-STATUS 'STANDARD' OF PROGRAM 'SAPLKKBL' .
ENDFORM.                    "ALV_PF_STATUS

*&---------------------------------------------------------------------*
*&      Form  ALV_USER_COMMAND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->R_UCOMM      text
*      -->RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM frm_user_command USING r_ucomm LIKE sy-ucomm  rs_selfield TYPE slis_selfield.
  DATA: s_str   TYPE string,
        l_num_a TYPE string,
        l_num_s TYPE string.


* 修改字段状态,
  LOOP AT itab INTO gs_data.
    IF gs_data-chk IS NOT INITIAL.
      PERFORM frm_set_field_layout USING gs_data 'MATNR' '0'.
    ELSE.
      PERFORM frm_set_field_layout USING gs_data 'MATNR' '1'.
    ENDIF.

    MODIFY itab FROM gs_data.
  ENDLOOP.
  CASE r_ucomm.

    WHEN '&DATA_SAVE'.

    WHEN '&IC1'.

    WHEN OTHERS.
  ENDCASE.
* Refresh output
  rs_selfield-refresh = 'X'.
ENDFORM.                    "ALV_USER_COMMAND


*end of add.

FORM frm_refresh_alv .
  DATA: ref_grid TYPE REF TO cl_gui_alv_grid.
* 取得当前alv的grid和fieldcat
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = ref_grid.
*      et_fieldcat_lvc = gt_fieldcat
  CALL METHOD ref_grid->check_changed_data.
  CALL METHOD ref_grid->refresh_table_display.
ENDFORM.                    " FRM_REFRESH_ALV

*&---------------------------------------------------------------------*
*&      Form  frm_get_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_data .

  SELECT * INTO CORRESPONDING FIELDS OF TABLE   itab FROM vbap UP TO 10 ROWS.
  MOVE '10014072598' TO gs_data-matnr.
  MOVE 'TEST MATNR' TO gs_data-matkx.
  MOVE '10009999' TO gs_data-vbeln .
  APPEND  gs_data TO itab.
  LOOP AT itab INTO gs_data.
*    PERFORM frm_set_field_layout USING gs_data.
    IF gs_data-stype = 'E'.
      gs_data-icon = '@0A@'.
    ELSE.
      gs_data-icon = '@08@'.
    ENDIF.



    MODIFY itab FROM gs_data.
  ENDLOOP.
ENDFORM.                    " frm_save_data


*&---------------------------------------------------------------------*
*&      Form  fm_button
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->E_GRID     text
*----------------------------------------------------------------------*
FORM fm_button USING e_grid TYPE slis_data_caller_exit.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = tem_grid.

* 设置enter事件
  CALL METHOD tem_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.
* 设置 单光标焦点移开被修改单元格后既触发事件
  CALL METHOD tem_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_modified
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.

  CREATE OBJECT gt_event_receiver.
  SET HANDLER gt_event_receiver->handle_modify FOR tem_grid.
  SET HANDLER gt_event_receiver->handle_data_changed FOR tem_grid.
ENDFORM.                    "FM_BUTTON
*&---------------------------------------------------------------------*
*&      Form  FRM_REFRESH_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_refresh_data  USING et_good_cells TYPE lvc_t_modi. .
* 重新设置ALV显示格式
  DATA: l_tabix     LIKE sy-tabix,
        wa_mod_data TYPE lvc_s_modi.

  DATA ls_stylerow TYPE lvc_s_styl .
*  修改单元格状态
  LOOP AT et_good_cells INTO wa_mod_data .
    l_tabix = wa_mod_data-row_id.
    READ TABLE itab INTO gs_data INDEX l_tabix.
    IF  wa_mod_data-fieldname EQ 'MATKX' AND wa_mod_data-value = 'DIS'.
      PERFORM frm_set_field_layout USING gs_data 'VBELN' '0'.

      MODIFY itab FROM gs_data INDEX l_tabix.
    ELSEIF wa_mod_data-fieldname EQ 'MATKX' AND wa_mod_data-value =  'ENA'.
      PERFORM frm_set_field_layout USING gs_data 'VBELN' '1'.
      MODIFY itab FROM gs_data INDEX l_tabix.
    ENDIF.


  ENDLOOP.
ENDFORM.                    " FRM_REFRESH_DATA

*&---------------------------------------------------------------------*
*&      Form  handle_data_changed
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_ER_DATA_CHANGED  text
*----------------------------------------------------------------------*
FORM handle_data_changed  USING p_data_changed TYPE REF TO cl_alv_changed_data_protocol.
*单元格数据发生变化时事件,在此可以进行数据检查
  DATA:mod_data    TYPE lvc_t_modi,
       l_tabix     LIKE sy-tabix,
       wa_mod_data TYPE lvc_s_modi.
  mod_data = p_data_changed->mt_mod_cells.

  LOOP AT   mod_data INTO wa_mod_data .
    l_tabix = wa_mod_data-row_id.
    READ TABLE itab INTO gs_data INDEX l_tabix.
    IF  wa_mod_data-fieldname EQ 'MATKX' AND wa_mod_data-value =  'DIS'.
*检查一个字段必变为某值时如:DIS,联动修改其他字段值如:vbeln
      gs_data-vbeln = '999'.
      MODIFY itab FROM gs_data INDEX l_tabix.
    ELSEIF wa_mod_data-fieldname EQ 'MATKX' AND wa_mod_data-value =  'ENA'.

    ENDIF.

    MODIFY itab FROM gs_data INDEX l_tabix.
  ENDLOOP.

ENDFORM.                    "handle_data_changed

*&---------------------------------------------------------------------*
*&      Form  frm_data_modify
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PT_MOD_DATA  text
*----------------------------------------------------------------------*
*FORM frm_data_modify  TABLES   pt_mod_data STRUCTURE lvc_s_modi.
*  DATA: ls_zput212 LIKE  zput212,
*        wa_mod_data TYPE lvc_s_modi,
*        l_tabix TYPE i.
*
*  LOOP AT  pt_mod_data INTO wa_mod_data .
*
*    l_tabix = wa_mod_data-row_id.
*  ENDLOOP.
*ENDFORM.                    "frm_data_modify
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_FIELD_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GS_DATA  text
*----------------------------------------------------------------------*
FORM frm_set_field_layout USING ls_data TYPE  itype p_field  p_value.
  DATA: ls_stylerow TYPE lvc_s_styl.
*  修改字段显示状态
  IF p_value =  '1'.
    ls_stylerow-fieldname = p_field.
    ls_stylerow-style = cl_gui_alv_grid=>mc_style_enabled.
    READ TABLE ls_data-field_style WITH KEY fieldname = p_field TRANSPORTING NO FIELDS.
    IF sy-subrc  = 0.
      MODIFY TABLE ls_data-field_style FROM ls_stylerow.
    ELSE.
      INSERT ls_stylerow INTO TABLE ls_data-field_style.
    ENDIF.

  ELSE.
    ls_stylerow-fieldname = p_field.
    ls_stylerow-style = cl_gui_alv_grid=>mc_style_disabled.
    READ TABLE ls_data-field_style WITH KEY fieldname = p_field TRANSPORTING NO FIELDS..
    IF sy-subrc  = 0.
      MODIFY TABLE ls_data-field_style FROM ls_stylerow.
    ELSE.
      INSERT ls_stylerow INTO TABLE ls_data-field_style.
    ENDIF.
  ENDIF.


ENDFORM.                    " FRM_SET_FIELD_LAYOUT

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值