Abap cl_salv_hierseq_表中的捕捉展开按钮

Abap cl_salv_hierseq_表中的捕捉展开按钮,abap,alv,Abap,Alv,我通过classcl_salv_hierseq_表显示一个分层顺序列表,默认情况下所有行都被压缩,用户可以单击任意行上的+按钮展开第二级行 当用户单击按钮+展开行时,我尝试执行自定义代码 默认情况下,无法捕获它,它由SAP内部处理。如果我设置自定义GUI状态并为F2按钮定义自定义功能代码,则会触发事件added_function,但我无法确定涉及哪一行 我还试图拦截事件链接\u单击,但无论如何都没有触发 这是我的密码: report salv_hierseq. tables: vbrp. sel

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

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

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

我还试图拦截事件
链接\u单击
,但无论如何都没有触发

这是我的密码:

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
报告salv\u hierseq。
表:vbrp。
选择选项:
vbrp werks的werks默认值为“R001”,
vbrp lgort的lgort默认值为“NORS”,
vbrp费用。
类lcl_报告定义。
公共部分。
类型:
泰九的开始,
exidv类型vekpvb exidv,
exida型vekpvb exida,
ernam型vekpvb ernam,
erdat型vekpvb erdat,
aenam类型vekpvb aenam,
aedat型vekpvb aedat,
vhilm类型vekpvb vhilm,
vhart类型vekpvb vhart,
vpobjkey类型vekpvb vpobjkey,
packvorschr st型vekpvb-packvorschr st,
exidv2型vekpvb-exidv2,
静脉型vekpvb静脉,
展开类型char01,
蒂尤kp的结束,
天宝之始,
材料类型vepovb材料,
velin型vepovb velin,
vemng型vepovb vemng,
vemeh型vepovb vemeh,
werks型vepovb werks,
lgort类型vepovb lgort,
sobkz型vepovb sobkz,
QPLO型vepovb QPLO,
/cwm/vemng型vepovb-/cwm/vemng,
hu_lgort型vepovb-hu_lgort,
静脉型vepovb静脉,
vepos类型vepovb vepos,
天宝街的尽头。
数据:
w_vekp类型ty_kp,
ty_kp的t_vekp类型标准表,
w_-vepo类型ty_-po,
t_-vepo型泰_-po标准表,
o_hs_alv类型参考cl_salv_hierseq_表。
方法:
获取数据,
生成输出。
私人部分。
方法:
将状态更改co hs alv type ref设置为cl salv hierseq表格,
设置扩展选项,将co hs alv type ref更改为cl salv hierseq表格,
设置事件处理程序,将co hs alv type ref更改为cl salv hierseq表格,
在链接上,单击事件链接,单击cl\u salv\u events\u hierseq导入行-列级发送器,
在cl_salv_events_hierseq导入e_salv_函数发送器的事件添加_函数上。
末级。
开始选择。
数据:lo_报告类型参考lcl_报告。
创建对象lo_报告。
lo_报告->获取_数据()。
lo_报告->生成_输出()。
类lcl_报告实现。
方法获取数据。
从vepo中选择*进入表格@t_vepo的相应字段,其中@werks中的werks和@lgort中的lgort以及@charg中的charg。
对于@t_vepo中的所有条目,从vekp中选择*进入表格@t_vekp的相应字段,其中venum=@t_vepo-venum。
如果不是,则t_vekp为初始值。
按静脉对静脉进行分类。
对于t_vekp中的所有条目,将*从vepo选择到表t_vepo的相应字段中,其中venum=t_vekp-venum。
按静脉对静脉进行分类。
删除velin='2'或velin='3'的t_vepo。
恩迪夫。
endmethod。“获取数据
方法生成输出。
数据:lt_bind类型salv_t_hierseq_binding,
拉乌结就像拉乌结一样。
la_bind-master='VENUM'。
la_bind-slave='VENUM'。
将la_绑定附加到lt_绑定。
尝试
调用方法cl\u salv\u hierseq\u table=>factory
出口
t_binding_level1_level2=lt_bind
进口
r_hierseq=o_hs_alv
改变
t_表_level1=t_vekp
t_table_level2=t_vepo。
抓住你的根。
结束。
me->设置事件处理程序(更改co\u hs\u alv=o\u hs\u alv)。
me->set_pf_status(更改co_hs_alv=o_hs_alv)。
me->设置扩展选项(更改co\U hs\U alv=o\U hs\U alv)。
o_hs_alv->显示()。
endmethod.“生成输出”
方法集\事件\处理程序。
数据:lo_事件类型参考cl_salv_事件等级。
尝试
lo_events=co_hs_alv->get_event()。
在链接上设置处理程序\u单击以查找lo\u事件。
为lo_事件在函数上添加设置处理程序。
抓住你的根。
结束。
endmethod。
方法设置\u pf\u状态。
数据:lo_函数类型参考cl_salv_函数列表。
lo_functions=co_hs_alv->get_functions()。
lo_函数->全部设置(abap_真)。
co\U hs\U alv->设置屏幕状态(pfstatus='ZMM18VE'报告=sy repid set\u functions=cl\U salv\u model\u base=>c\u functions\u all)。
endmethod。“设置_pf_状态
方法集\扩展\选项。
数据:
lo_柱类型参考cl_salv_柱等级,
lo_柱类型参考cl_salv_柱等级。
尝试
lo_columns=co_hs_alv->get_columns(1)。
lo_columns->set_expand_column('expand')。
捕获残存数据错误残存根。“#EC无处理程序
结束。
endmethod。“设置\扩展\选项
方法单击链接。
数据lo_事件类型参考cl_salv_事件层次结构。
lo_事件=o_hs_alv->get_事件()。
字段符号:如lo_report->t_vekp的行。
读取表LOU report->t\U vekp分配索引行。
检查sy subrc是否为首字母。
if-expand是初始值。
-expand='X'。
其他的
清除-扩展。
恩迪夫。
lo_报告->o_hs_alv->刷新()。
endmethod。
方法添加了函数。
endmethod。
endclass.“lcl_报告实施”

如果我能很好地理解这个问题,你想要t
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( ).