- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我通过类 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
:
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/
我通过类 cl_salv_hierseq_table 显示一个分层顺序列表,所有行默认压缩,用户可以点击任意一行的+号按钮展开第二级行。 当用户单击按钮 + 以展开行时,我试图执行自定义代码。 默认情
我是一名优秀的程序员,十分优秀!