gpt4 book ai didi

abap - 在 cl_salv_hierseq_table 中捕获 EXPAND 按钮

转载 作者:行者123 更新时间:2023-12-04 10:29:58 28 4
gpt4 key购买 nike

我通过类 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 )。
剩下的唯一事情就是确定关注哪条线。您需要模仿检索所选行的标准方式,该方式基于行号在全局变量 GS_HIDE-INDEX 中的隐藏。程序SAPLKKBL在ABAP列表的每个显示行中,通过语句 READ CURRENT LINE or READ LINE currentline 确定光标所在位置并在按下按钮或键时读取该行来获得其值。 ( currentline 本身由 GET CURSOR LINE currentline 决定)。
希望可以通过语句 ASSIGN ('(programname)globalvariablename') 从任何程序中读取全局变量。 ,尽管它是 SAP 不支持的内部声明(如果它在 future 版本中被删除,请不要提示)。
在下面的程序中,点击第五行的+按钮显示自定义消息“请求扩展第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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com