zoukankan      html  css  js  c++  java
  • ABAP:ALV中自定义搜索帮助

    ABAP:ALV中自定义搜索帮助

    如果希望ALV中某字段具有搜索帮助,第一种办法当然是对表中某字段的引用,设置ref_table、ref_field,将自动触发该字段所带的搜索帮助。

    可不可以直接设置Searh Help呢?应该不可以,找遍了field catalog的结构也没发现有可以设置的字段。

    第二种办法就是利用自定义代码来实现ALV的搜索帮助,显然它的功能更强大、更灵活。针对在OO ALV中实现搜索帮助,其主要步骤有:

    1,在ALV的事件处理类中添加个Method,其DEFINITION如下:

        handle_onf4 FOR EVENT onf4 OF cl_gui_alv_grid
          IMPORTING e_fieldname es_row_no er_event_data.

    其IMPLEMENTATION中就是我们希望执行的代码,用来弹出可选择对话框。e_fieldname代表用户点击了ALV的哪个字段来触发搜索帮助,es_row_no代表了当前行信息,

    es_row_no-row_id就是ALV中内表记录的INDEX。er_event_data代表了当前用户对ALV进行了哪些编辑的信息。在Method的最后,记得加上

        er_event_data->m_event_handled = 'X'.

    通知系统搜索事件处理完毕,这样就不会调用系统标准的Search Help。

    2,那就是对需要自定义搜索帮助的字段,设置其field catalog时:

        ls_fieldcat-f4availabl = 'X'.

    这一步往往容易被忽略。

    3,在创建ALV对象之后,要对需要自定义搜索帮助的字段进行注册。

        DATA: lt_f4 TYPE lvc_t_f4 WITH HEADER LINE.

        CLEAR lt_f4.
        lt_f4-fieldname = 'FIELD_NAME'.
        lt_f4-register = 'X'.
        lt_f4-chngeafter = 'X'.
        APPEND lt_f4.
        CALL METHOD mygrid->register_f4_for_fields
          EXPORTING
            it_f4 = lt_f4[].

    lvc_s_f4中的字段getbefore和changeafter应该代表是否触发data_changed事件。

    然后我们为其指定事件处理类(假设go_evt_receiver是自定义事件处理类的一个对象):

        CREATE OBJECT go_evt_receiver.

        SET HANDLER go_evt_receiver->handle_onf4 FOR go_alv_grid.

    至此,主要的设置步骤都介绍完毕。

    下面贴一段Handle_onf4的代码供参考:

      METHOD handle_onf4.
        DATA: ls_modi TYPE lvc_s_modi,

              lt_ret_tab TYPE TABLE OF ddshretval WITH HEADER LINE.

        FIELD-SYMBOLS <modtab> TYPE lvc_t_modi.

        IF e_fieldname = 'FIELD_NAME'. "我们自定义搜索的字段名
          READ TABLE gt_alv_data INDEX es_row_no-row_id.
          CHECK sy-subrc = 0.
    **  这里可以添加代码以对lt_hitlist内表进行填充
          CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
            EXPORTING
              retfield        = 'HIT_FIELD'
              value_org       = 'S'
            TABLES
              value_tab       = lt_hitlist
              return_tab      = lt_ret_tab
            EXCEPTIONS
              parameter_error = 1
              no_values_found = 2
              OTHERS          = 3.
          IF sy-subrc = 0.
    **  Update the value in ALV cell
            READ TABLE lt_ret_tab INDEX 1.
            IF sy-subrc = 0. " User didn't cancel
              ls_modi-row_id = es_row_no-row_id.
              ls_modi-fieldname = e_fieldname.
              ls_modi-value = lt_ret_tab-fieldval.
              ASSIGN er_event_data->m_data->* TO <modtab>.
              APPEND ls_modi TO <modtab>.
            ENDIF.
          ENDIF.

    **  Inform ALV Grid that event 'onf4' has been processed
          er_event_data->m_event_handled = 'X'.
        ENDIF.
      ENDMETHOD.                    "handle_onf4

  • 相关阅读:
    C#中的WebBrowser控件的使用
    xshell5 可用注册码
    一次多数据源 配置问题记录
    org.springframework.data.mongodb.core.MongoTemplate]: Constructor threw exception; nested exception is java.lang.NoSuchMethodError: org.springframework.core.convert.support.ConversionServiceFactory.cr
    关于 <mvc:argument-resolvers> 的一次使用记录
    补码、反码、原码 ~ ^ 运算
    mysql中int、bigint、smallint 和 tinyint的区别与长度的含义【转】
    tomcat优化记录
    判读40亿数字中是否有某个数字
    LinkedList源码疑问记录
  • 原文地址:https://www.cnblogs.com/Nirvanacafe/p/3650637.html
Copyright © 2011-2022 走看看