在使用客制化容器的时候,在里面防止alv展现的时候,layout给了一个zbox,但是有时候不起效,后来找了很久也没解决,就换了一种方式实现,这里就记录一下,顺便展示一下失效的情况
我这边就用一下之前的程序来做测试了,程序的构建看这个blog即可 https://www.cnblogs.com/pnj-owowa/p/17984569
结构新增
新增一列zbox
TYPES: BEGIN OF ty_mara,
matnr TYPE mara-matnr,
mtart TYPE mara-mtart,
zbox TYPE char1,
END OF ty_mara.
layout修改
新增box_frame
gs_layout = VALUE #( zebra = abap_on
cwidth_opt = abap_on
box_fname = |ZBOX| ).
一般来说普通的alv报表 就已经可以进行选择了,但是在容器中的不行,试了几次都不知道为什么,于是就换了一种方案来实施
layout修改
gs_layout = VALUE #( zebra = abap_on
cwidth_opt = abap_on
* box_fname = |ZBOX|
sel_mode = |D| ).
展示
这样就可以看到可以有选择的地方了
但是这样还不够,因为这样选择后如果有按钮执行,系统并不知道你选择了哪一行,之后的按钮事件也会出问题
修改刷新例程
中间的就是新添加的代码,可以告诉系统这里我已经选择了那些行
CALL METHOD pv_grid->check_changed_data. "检查ALV更改数据
pv_grid->get_frontend_layout( IMPORTING es_layout = DATA(ls_layout) ).
ls_layout-cwidth_opt = abap_on.
pv_grid->set_frontend_layout( is_layout = ls_layout ).
*add
REFRESH it_rows.
CALL METHOD pv_grid->get_selected_rows(
IMPORTING
et_row_no = it_rows ).
LOOP AT gt_mara ASSIGNING FIELD-SYMBOL(<fs_mara>) WHERE zbox <> ''.
<fs_mara>-zbox = ''.
ENDLOOP.
LOOP AT it_rows INTO DATA(ls_rows).
READ TABLE gt_mara ASSIGNING <fs_mara> INDEX ls_rows-row_id.
<fs_mara>-zbox = 'X'.
ENDLOOP.
CALL METHOD cl_gui_control=>set_focus
EXPORTING
control = pv_grid.
"刷新变量
DATA: ls_stable TYPE lvc_s_stbl.
"刷新显示
CLEAR ls_stable.
ls_stable-row = 'X'."基于行刷新
ls_stable-col = 'X'."基于列刷新
CALL METHOD pv_grid->refresh_table_display
EXPORTING
is_stable = ls_stable
EXCEPTIONS
finished = 0.
标签:rows,layout,客制化,grid,ls,dialog,stable,pv,SAP
From: https://www.cnblogs.com/pnj-owowa/p/17988903