abap - 在 cl_salv_hierseq_table 中捕获 EXPAND 按钮

标签 abap alv

我通过类cl_salv_hierseq_table显示一个分层顺序列表,默认情况下所有行都被压缩,用户可以在任意行上单击按钮+来展开第二层的线条。

当用户单击按钮 + 展开行时,我尝试执行自定义代码。

默认情况下,无法捕获它,它由 SAP 内部处理。如果我设置自定义 GUI 状态并为 F2 按钮定义自定义功能代码,则会触发事件 added_function,但我无法确定涉及哪一行。

我还尝试拦截事件 link_click 但它无论如何都没有触发。

这是我的代码:

report salv_hierseq.
tables: vbrp.
select-options:
werks for vbrp-werks default 'R001',
lgort for vbrp-lgort default 'NORS',
charg for vbrp-charg.

class lcl_report definition.
  public section.
    types:
      begin of ty_kp,
        exidv          type vekpvb-exidv,
        exida          type vekpvb-exida,
        ernam          type vekpvb-ernam,
        erdat          type vekpvb-erdat,
        aenam          type vekpvb-aenam,
        aedat          type vekpvb-aedat,
        vhilm          type vekpvb-vhilm,
        vhart          type vekpvb-vhart,
        vpobjkey       type vekpvb-vpobjkey,
        packvorschr_st type vekpvb-packvorschr_st,
        exidv2         type vekpvb-exidv2,
        venum          type vekpvb-venum,
        expand         type char01,
      end of ty_kp,
      begin of ty_po,
        matnr      type vepovb-matnr,
        velin      type vepovb-velin,
        vemng      type vepovb-vemng,
        vemeh      type vepovb-vemeh,
        werks      type vepovb-werks,
        lgort      type vepovb-lgort,
        sobkz      type vepovb-sobkz,
        qplos      type vepovb-qplos,
        /cwm/vemng type vepovb-/cwm/vemng,
        hu_lgort   type vepovb-hu_lgort,
        venum      type vepovb-venum,
        vepos      type vepovb-vepos,
      end of ty_po.

    data:
      w_vekp   type ty_kp,
      t_vekp   type standard table of ty_kp,
      w_vepo   type ty_po,
      t_vepo   type standard table of ty_po,
      o_hs_alv type ref to cl_salv_hierseq_table.
    methods:
      get_data,
      generate_output.
  private section.
    methods:
      set_pf_status      changing co_hs_alv type ref to cl_salv_hierseq_table,
      set_expand_option  changing co_hs_alv type ref to cl_salv_hierseq_table,
      set_event_handlers changing co_hs_alv type ref to cl_salv_hierseq_table,
      on_link_click      for event link_click        of cl_salv_events_hierseq importing row column level sender,
      on_added_function  for event added_function    of cl_salv_events_hierseq importing e_salv_function sender.
endclass.

start-of-selection.
  data: lo_report type ref to lcl_report.
  create object lo_report.
  lo_report->get_data( ).
  lo_report->generate_output( ).

class lcl_report implementation.
  method get_data.
    select * into corresponding fields of table @t_vepo from vepo where werks in @werks and lgort in @lgort and charg in @charg.
    select * into corresponding fields of table @t_vekp from vekp for all entries in @t_vepo where venum = @t_vepo-venum.
    if not t_vekp is initial.
      sort t_vekp by venum.
      select * from vepo into corresponding fields of table t_vepo for all entries in t_vekp where venum = t_vekp-venum.
      sort t_vepo by venum vepos.
      delete t_vepo where velin = '2' or velin = '3'.
    endif.
  endmethod.                    "get_data

  method generate_output.
    data: lt_bind type salv_t_hierseq_binding,
          la_bind like line of lt_bind.

    la_bind-master = 'VENUM'.
    la_bind-slave  = 'VENUM'.
    append la_bind to lt_bind.

    try.
        call method cl_salv_hierseq_table=>factory
          exporting
            t_binding_level1_level2 = lt_bind
          importing
            r_hierseq               = o_hs_alv
          changing
            t_table_level1          = t_vekp
            t_table_level2          = t_vepo.
      catch cx_root.
    endtry.

    me->set_event_handlers( changing co_hs_alv = o_hs_alv ).
    me->set_pf_status( changing co_hs_alv = o_hs_alv ).
    me->set_expand_option( changing co_hs_alv = o_hs_alv ).
    o_hs_alv->display( ).
  endmethod.                    "generate_output

  method set_event_handlers.
    data: lo_events type ref to cl_salv_events_hierseq.
    try .
        lo_events = co_hs_alv->get_event( ).
        set handler on_link_click for lo_events.
        set handler on_added_function for lo_events.
      catch cx_root.
    endtry.
  endmethod.

  method set_pf_status.
    data: lo_functions type ref to cl_salv_functions_list.
    lo_functions = co_hs_alv->get_functions(  ).
    lo_functions->set_all( abap_true ).

    co_hs_alv->set_screen_status( pfstatus = 'ZMM18VE' report = sy-repid set_functions = cl_salv_model_base=>c_functions_all ).
  endmethod.                    "set_pf_status

  method set_expand_option.
    data:
      lo_columns type ref to cl_salv_columns_hierseq,
      lo_column  type ref to cl_salv_column_hierseq.
    try.
        lo_columns = co_hs_alv->get_columns( 1 ).
        lo_columns->set_expand_column( 'EXPAND' ).
      catch cx_salv_data_error cx_root.                 "#EC NO_HANDLER
    endtry.
  endmethod.                    "set_expand_option


  method on_link_click.
        data lo_event type ref to cl_salv_events_hierseq.

        lo_event = o_hs_alv->get_event( ).
        field-symbols: <lfa_data> like line of lo_report->t_vekp.

        read table lo_report->t_vekp assigning <lfa_data> index row.
        check sy-subrc is initial.
        if <lfa_data>-expand is initial.
          <lfa_data>-expand = 'X'.
        else.
          clear <lfa_data>-expand.
        endif.

        lo_report->o_hs_alv->refresh( ).

  endmethod.

  method on_added_function.

  endmethod.
endclass.                    "lcl_report IMPLEMENTATION

最佳答案

如果我很好地理解这个问题,您希望在展开/折叠按钮(+-)时捕获该事件,并确定在哪一行请求该事件。

首先,这个功能根本不支持,否则会有专门的事件。

我知道您正在尝试找出非标准解决方法,所以让我继续您开始的工作。

SAP 不支持我此后提出的解决方法

您注意到,单击此按钮相当于将光标定位在 +/- 按钮上(实际上,该按钮被视为带有“热点”的字段)并按F2 按钮。

F2 按钮通常对应于双击(在该行的文本字段上完成时会触发事件 DOUBLE_CLICK),但在以下情况下+/- 按钮,这是内部处理的,并且不会触发此事件。

您最初的想法是通过自定义 GUI statusF2 键重新分配给自定义功能代码非常好。它将从程序 SAPLSALV_METADATA_STATUS 的 GUI 状态 SALV_TABLE_STANDARD 复制,并在功能键中输入 F2 的任何功能代码,例如 ZZ&IC1 (而不是建议的, &IC1)。

剩下的唯一事情就是确定涉及哪一行。您需要模仿检索所选行的标准方法,该方法基于在每个程序 SAPLKKBL 的全局变量 GS_HIDE-INDEX 中隐藏行号。 ABAP 列表的显示行,其值是通过确定光标所在位置并在按下按钮或按键时读取该行来获取的,通过语句 READ CURRENT LINE or READ LINE currentline (currentline 本身由 GET CURSOR LINE currentline 确定)。

希望可以通过语句 ASSIGN ('(programname)globalvariablename') 从任何程序读取全局变量,尽管这是 SAP 不支持的内部声明(如果在未来版本中删除它,请不要提示)。

在下面的程序中,单击第五行上的 + 按钮会显示自定义消息“请求展开第 5 行”,然后通过模拟标准功能代码&IC1(记住,它对应于原始的F2键),通过方法SET_FUNCTION:

enter image description here

enter image description here

CLASS lcl_report DEFINITION.
  PUBLIC SECTION.
    TYPES: BEGIN OF ty_scarr.
        INCLUDE TYPE scarr.
    TYPES: expand TYPE flag,
           END OF ty_scarr.
    DATA:
      t_scarr  TYPE STANDARD TABLE OF ty_scarr,
      t_spfli  TYPE STANDARD TABLE OF spfli,
      o_hs_alv TYPE REF TO cl_salv_hierseq_table.
    METHODS:
      get_data,
      generate_output.

  PRIVATE SECTION.
    METHODS:
      on_added_function FOR EVENT added_function OF cl_salv_events_hierseq
        IMPORTING e_salv_function sender.
ENDCLASS.

CLASS lcl_report IMPLEMENTATION.

  METHOD get_data.
    SELECT * FROM spfli INTO TABLE @t_spfli.
    SELECT * FROM scarr INTO TABLE @t_scarr.
    SORT t_scarr BY carrid.
    SORT t_spfli BY carrid connid.
  ENDMETHOD.

  METHOD generate_output.

    cl_salv_hierseq_table=>factory(
      EXPORTING
        t_binding_level1_level2 = VALUE #( ( master = 'CARRID' slave = 'CARRID' ) )
      IMPORTING
        r_hierseq               = o_hs_alv
      CHANGING
        t_table_level1          = t_scarr
        t_table_level2          = t_spfli ).

    SET HANDLER on_added_function FOR o_hs_alv->get_event( ).

    " ZMM18VE GUI status was created by copying the SALV_TABLE_STANDARD
    " from program SAPLSALV_METADATA_STATUS, and reassigning the
    " function key F2 to the new function code ZZ&IC1 (instead of &IC1).
    o_hs_alv->set_screen_status( pfstatus = 'ZMM18VE' report = sy-repid set_functions = cl_salv_model_base=>c_functions_all ).

    o_hs_alv->get_functions(  )->set_all( abap_true ).

    o_hs_alv->get_columns( 1 )->set_expand_column( 'EXPAND' ).

    o_hs_alv->display( ).

  ENDMETHOD.                    "generate_output

  METHOD on_added_function.
    DATA: cursor_field TYPE string.

    CASE e_salv_function.
      WHEN 'ZZ&IC1'.
        ASSIGN ('(SAPLKKBL)GS_HIDE-INDEX') TO FIELD-SYMBOL(<index>).
        CHECK sy-subrc = 0.
        GET CURSOR FIELD cursor_field.
        CASE cursor_field.
          WHEN 'SYM_MINUS_FOLDER'.
            MESSAGE |Request to collapse line { <index> }| TYPE 'I'.
          WHEN 'SYM_PLUS_FOLDER'.
            MESSAGE |Request to expand line { <index> }| TYPE 'I'.
        ENDCASE.
        " Execute standard Expand/Collapse
        o_hs_alv->set_function( '&IC1' ).
    ENDCASE.

  ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.
  DATA: lo_report TYPE REF TO lcl_report.
  CREATE OBJECT lo_report.
  lo_report->get_data( ).
  lo_report->generate_output( ).

关于abap - 在 cl_salv_hierseq_table 中捕获 EXPAND 按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60460499/

相关文章:

abap - 双击 ALV 网格中的行和列

abap - "List elements that take up more than one line are not permitted"复杂 IF 语句错误

persistence - 返回abap中持久化类的所有属性列表

abap - ABAP 中的冒烟测试和猴子测试

drag-and-drop - ABAP 在 ALV GRID 上拖放对象

abap - 检查报告是否使用分层 ALV。如何?

search - 我可以以编程方式调用搜索帮助,其中一些参数已经填写且不可编辑吗?

abap - 当前 CLASS POOL 中 PUBLIC 类的名称必须是 "..."而不是 "..."

header - ALV 或任何其他网格布局中的两级列标题?