SAP dialog 客制化容器选择问题处理

在使用客制化容器的时候,在里面防止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.
posted @ 2024-01-29 16:53  otowa  阅读(23)  评论(0编辑  收藏  举报