导语:最近开发了一个修改商品主数据的OOALV报表,毕竟用户不能使用SE16N,但是MM42又只能一条一条修改,很麻烦,这里就涉及到了指定列可编辑,以及优化列宽,业务顾问希望人性化一点,进来的时候优化列宽,然后输入完再优化列宽,我直呼,好家伙。
一、OOALV编辑后自动优化列宽
ALV的优化列宽是在layout里边控制的,实现在首次进入的时候优化列宽,需要设置gs_layout-cwidth_opt = ‘X’,不知道是我设置有问题还是咋回事,结果并不理想,商品编码没有全部展示出来。
在【输入之后自动优化列宽】需要一段代码,因为我这里需要输入编码带出描述,我就把这段代码放在了【changed_finished】事件的最后面,等所有的都处理完成,刷新一下LAYOUT和ALV就好了
"刷新LAYOUT
gs_layout-cwidth_opt = 'X'.
CALL METHOD g_grid->set_frontend_layout
EXPORTING
is_layout = gs_layout.
"刷新ALV
CALL METHOD g_grid->refresh_table_display .
效果如下:
二、FUNCTION ALV,在按钮点击后自动优化列宽
在按钮事件里写如下
FORM user_command USING u_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
DATA: lo_grid TYPE REF TO cl_gui_alv_grid,
lv_code LIKE sy-ucomm.
DATA: ls_stable TYPE lvc_s_stbl.
" 刷新alv屏幕数据
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lo_grid.
CALL METHOD lo_grid->check_changed_data.
CASE u_ucomm.
WHEN '&IC1' .
IF rs_selfield-fieldname = 'VBELN'."跳转的语法
SET PARAMETER ID 'AUN' FIELD rs_selfield-value.
CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
ENDIF.
ENDCASE.
DATA : ls_layout TYPE lvc_s_layo."也可以用原来的gs_layout
CALL METHOD lo_grid->get_frontend_layout
IMPORTING
es_layout = ls_layout.
ls_layout-cwidth_opt = 'X'.
CALL METHOD lo_grid->set_frontend_layout
EXPORTING
is_layout = ls_layout.
rs_selfield-refresh = 'X'.
ENDFORM.
注意:
在实践过程中这种操作是对用户的交互进行便捷,但是会增加代码风险,不建议进行这样的操作。
在实际的使用中发现,我们在usercommod中的选中行判断和这一步操作有冲突,使得无法获取选中行。
解决办法是在【changed_finished】事件刷新的时候判断一下,et_good_cells的值是为空,为空就不要进行刷新。
if et_good_cells[] is not initial.
"刷新LAYOUT
gs_layout-cwidth_opt = 'X'.
CALL METHOD g_grid->set_frontend_layout
EXPORTING
is_layout = gs_layout.
"刷新ALV
CALL METHOD g_grid->refresh_table_display .
endif.
作者:小飞猪猪猪猪猪猪猪–CSDN
注意:转发请注明作者