我通过类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 status 将 F2 键重新分配给自定义功能代码非常好。它将从程序 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
:
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/