问题:当用户在ALV上使用“过滤”功能,ALV界面的数据和内表的数据就会不一致,内表还是全量数据,而ALV界面只保留了用户想要的部分数据,这时如果批量操作内表,就把把数据全部处理,而不是用户想要的只处理ALV界面上的数据。

解决:通过系统提供的过滤表功能,得到真正过滤掉的数据,批量操作的时候判断一下是否处理。

一、这是ALV没有过滤条件的数据内表:

二、设置过滤条件为保留单号181047后

ALV界面:

过滤表的数据(看来,过滤内表放的是真正过滤掉的数据):

 三、Function ALV 中得到过滤数据的代码(用户回调函数中):

  DATA: lo_grid  TYPE REF TO cl_gui_alv_grid,
        filt_table TYPE lvc_t_fidx,
        l_filt_table TYPE int4 .

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lo_grid.

  CALL METHOD lo_grid->get_filtered_entries
    IMPORTING
      et_filtered_entries = filt_table."被过滤的内表数据行

四、完整的代码实现,一般出现在用户的回调函数的批量操作中:

FORM frm_user_command USING iv_ucom TYPE sy-ucomm
                            iv_selfield TYPE slis_selfield.
  PERFORM frm_check_change.
  CASE iv_ucom.


  DATA: lo_grid  TYPE REF TO cl_gui_alv_grid,
        filt_table TYPE lvc_t_fidx,
        ls_filt_table TYPE int4 .

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lo_grid.

  CALL METHOD lo_grid->get_filtered_entries
    IMPORTING
      et_filtered_entries = filt_table."被过滤的内表数据行



  WHEN 'ALL'.


    LOOP AT gt_output INTO data(gs_output_tmp).

        gs_output_tmp-sel = 'X'.
        MODIFY gt_output FROM gs_output_tmp.

    ENDLOOP.

    iv_selfield-refresh = 'X'.

  WHEN 'SAL'.


    LOOP AT gt_output INTO gs_output_tmp.

        gs_output_tmp-sel = ''.
        MODIFY gt_output FROM gs_output_tmp.

    ENDLOOP.

    iv_selfield-refresh = 'X'.



    WHEN 'DEL'.
      READ TABLE gt_output INTO gs_output WITH KEY sel = 'X' bdel = ''.
      IF sy-subrc EQ 0.
        DATA lv_answer TYPE c.
        PERFORM frm_del_confirm CHANGING lv_answer.
        IF lv_answer EQ '1'.
          LOOP AT gt_output INTO gs_output WHERE sel = 'X' AND bdel = ''.

            READ TABLE filt_table INTO ls_filt_table WITH KEY table_line = sy-tabix. "看该行是否在被过滤掉的内表行中

            IF sy-subrc <> 0."如果不是被过滤掉的数据,才真正处理

                   UPDATE ztppu0043 SET bdel = 'X' euser = sy-uname edate = sy-datum etime = sy-uzeit
                    WHERE uuid = gs_output-uuid  AND
                          plant = gs_output-plant AND
                          kdauf = gs_output-kdauf AND
                          kdpos = gs_output-kdpos AND
                          ordernr = gs_output-ordernr AND
                          omatnr = gs_output-omatnr AND
                          matnr = gs_output-matnr AND
                          bomid = gs_output-bomid.
                   COMMIT WORK.
                   CHECK sy-subrc EQ 0.
                   gs_output-bdel = 'X'.
                   MODIFY gt_output FROM gs_output.


            ENDIF.

          ENDLOOP.
          IF p_del IS INITIAL.
            DELETE gt_output WHERE bdel = 'X'.
          ENDIF.
          MESSAGE '数据删除成功' TYPE c_s .
          gv_refresh = 'X'.
        ENDIF.
      ELSE.
        MESSAGE '请选择一行进行删除。' TYPE c_s  DISPLAY LIKE c_e.
      ENDIF.



ENDFORM.

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐