SAP dialog 客制化容器中alv搜索帮助

在使用客制化容器的时候,在里面做alv展现的时候,同时可能对alv中的数据进行修改,然后再修改的时候还要进行搜索帮助来协助数据的填入

我这边就用一下之前的程序来做测试了,程序的构建看这个blog即可 https://www.cnblogs.com/pnj-owowa/p/17984569

结果展示

定义类型并实例化

TYPES: BEGIN OF ty_mara,
         matnr TYPE mara-matnr,
         mtart TYPE mara-mtart,

         zbox  TYPE char1,
       END OF ty_mara.

DATA: gt_mara_f4 TYPE STANDARD TABLE OF ty_mara,
      gs_mara_f4 TYPE ty_mara.

类构建

再类的包含文件中添加 类的定义和实施

CLASS lcl_event_receiverundo DEFINITION.
  PUBLIC SECTION.
    METHODS:
      handle_f4 FOR EVENT onf4 OF cl_gui_alv_grid
        IMPORTING e_fieldname   "列名
                  es_row_no     "行号
                  er_event_data
                  et_bad_cells.
ENDCLASS.               "LCL_EVENT_RECEIVER

DATA: event_receiverundo TYPE REF TO lcl_event_receiverundo.

CLASS lcl_event_receiverundo IMPLEMENTATION.

   METHOD  handle_f4.

*     窗口时间参数的自定义f4检索帮助
    CASE e_fieldname.
      WHEN 'MATNR'.   "内表字段名称
        PERFORM f4_help_matnr USING e_fieldname  "列名
                                       es_row_no  "行号
                                       er_event_data.
    ENDCASE.
  ENDMETHOD.

ENDCLASS.

设置fieldcat

设置 edit 和 f4availabl 属性

  DEFINE _set_fieldcat.
    APPEND VALUE #(
      fieldname = &1
      ref_table = &2
      ref_field = &3
      coltext = &4
      scrtext_l = &4
      scrtext_m = &4
      scrtext_s = &4
      edit = SWITCH #( &1 WHEN 'MATNR' THEN abap_on )
      f4availabl = SWITCH #( &1 WHEN 'MATNR' THEN abap_on )
    ) TO gt_fieldcat.
  END-OF-DEFINITION.

  _set_fieldcat 'MATNR' 'MARA' 'MATNR' '物料号'. "
  _set_fieldcat 'MTART' 'MARA' 'MTART' '物料类型'. "

frm_screen

在构建屏幕的例程中 需要增加触发事件

  PERFORM frm_set_layout.  "设置ALV输出格式
  PERFORM frm_set_fieldcat.  "设置ALV输出字段
  PERFORM frm_set_toolbar.   "设置alv状态栏

  IF wa_custom_container IS INITIAL .
    CREATE OBJECT wa_custom_container
      EXPORTING
        container_name = wa_container.

    CREATE OBJECT alv_grid
      EXPORTING
        i_parent = wa_custom_container.

    PERFORM frm_set_event USING alv_grid. "设置触发事件

    CALL METHOD alv_grid->set_table_for_first_display
      EXPORTING
        i_structure_name     = 'GS_MARA'
        is_layout            = gs_layout
        it_toolbar_excluding = gt_ui_func
      CHANGING
        it_outtab            = gt_mara
        it_fieldcatalog      = gt_fieldcat.
  ENDIF.

  PERFORM frm_refresh_alv USING alv_grid.

frm_set_event

FORM frm_set_event USING   pv_grid TYPE REF TO cl_gui_alv_grid.
  "事件响应
  DATA: gr_event_handler TYPE REF TO lcl_event_receiverundo .
  CREATE OBJECT gr_event_handler.

  DATA:lt_f4 TYPE lvc_t_f4,
       ls_f4 TYPE lvc_s_f4.

  CLEAR: lt_f4.

  "设置事件-回车
  CALL METHOD pv_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.

  " 单元格失去焦点触发
  CALL METHOD pv_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_modified
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.

    CLEAR ls_f4.
    ls_f4-fieldname = 'MATNR'.   "需要定义F4帮助按钮的字段
    ls_f4-register   = 'X'.
    ls_f4-getbefore  = 'X'.
    ls_f4-chngeafter = 'X'.
    INSERT ls_f4 INTO TABLE lt_f4.

  SET HANDLER gr_event_handler->handle_f4 FOR pv_grid.
  CALL METHOD pv_grid->register_f4_for_fields
    EXPORTING
      it_f4 = lt_f4.

ENDFORM.

f4_help_matnr

实施类中的例程

FORM frm_set_event USING   pv_grid TYPE REF TO cl_gui_alv_grid.
  "事件响应
  DATA: gr_event_handler TYPE REF TO lcl_event_receiverundo .
  CREATE OBJECT gr_event_handler.

  DATA:lt_f4 TYPE lvc_t_f4,
       ls_f4 TYPE lvc_s_f4.

  CLEAR: lt_f4.

  "设置事件-回车
  CALL METHOD pv_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.

  " 单元格失去焦点触发
  CALL METHOD pv_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_modified
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.


  CLEAR ls_f4.
  ls_f4-fieldname = 'MATNR'.   "需要定义F4帮助按钮的字段
  ls_f4-register   = 'X'.
  ls_f4-getbefore  = 'X'.
  ls_f4-chngeafter = 'X'.
  INSERT ls_f4 INTO TABLE lt_f4.


  SET HANDLER gr_event_handler->handle_f4 FOR pv_grid.
  CALL METHOD pv_grid->register_f4_for_fields
    EXPORTING
      it_f4 = lt_f4.

ENDFORM.

注意事项

在使用搜索帮助回填数据的时候,检查alv更改数据的方法会报错,这里我就注释了一下,如果放到实际生产情况,需要做一个标识来 控制不走这个方法
我这里是在刷新例程中注释的,如果跟着看下来的应该知道在哪里

*  CALL METHOD pv_grid->check_changed_data. "检查ALV更改数据
posted @ 2024-01-30 17:01  otowa  阅读(50)  评论(0编辑  收藏  举报