sexta-feira, 19 de fevereiro de 2016

ALV - Seleção de linhas pela linha agrupada (subtotal)

  Quando é feito o agrupamento no ALV de subtotal, como na imagem abaixo.



No meu caso eu tenho um botão q é executado dependendo dos itens selecionados, da forma normal eu teria q selecionar as linhas sem subtotal para que o método GET_SELECTED_ROWS selecionasse as linhas corretas. Mas existe uma forma de selecionar apenas a linhas de subtotal, dessa forma se as linhas estivessem comprimidas é possível selecionar somente as linhas de subtotal sem precisar expandí-las.

Para isso utilizar o método GET_SUBTOTALS em parceria com a GET_SELECTED_ROWS.

Quando é selecionado uma linha de subtotal o método GET_SELECTED_ROWS retorna 2 tabelas.
Na tabela ET_INDEX_ROWS o campo ROWTYPE vem preenchido, nos itens normais esse campo vem em branco.

Então tenho o seguinte, tem que pegar as linhas selecionadas que tem o campo ROWTYPE preenchido, nessas linhas o campo INDEX não se refere a linha da tabela interna do ALV da tela, esse INDEX é referente ao indice da tabela ET_GROUPLEVELS do método GET_SUBTOTALS.

Essa tabela  ET_GROUPLEVELS carregado.

 O INDEX é o indice da tabela interna.
O INDEX_FROM é a linha do ALV inicial do SUBTOTAL
O INDEX_TO é a linha do ALV final do SUBTOTAL.


a principio meu código ficou assim.

  DATAlo_c00 TYPE REF TO data,
        lo_c01 TYPE REF TO data,
        lo_c02 TYPE REF TO data,
        lo_c03 TYPE REF TO data,
        lo_c04 TYPE REF TO data,
        lo_c05 TYPE REF TO data,
        lo_c06 TYPE REF TO data,
        lo_c07 TYPE REF TO data,
        lo_c08 TYPE REF TO data,
        lo_c09 TYPE REF TO data.

  DATA lt_grp TYPE lvc_t_grpl.

  DATAlw_grp     TYPE lvc_s_grpl,
        lw_row     TYPE lvc_s_row,
        lw_row_aux TYPE lvc_s_row.

  CLEAR lt_grp.

  CALL METHOD o_alv->get_subtotals
    IMPORTING
      ep_collect00   lo_c00
      ep_collect01   lo_c01
      ep_collect02   lo_c02
      ep_collect03   lo_c03
      ep_collect04   lo_c04
      ep_collect05   lo_c05
      ep_collect06   lo_c06
      ep_collect07   lo_c07
      ep_collect08   lo_c08
      ep_collect09   lo_c09
      et_grouplevels lt_grp.

  LOOP AT ft_row INTO lw_row
                  WHERE rowtype IS NOT INITIAL.

    READ TABLE lt_grp INTO lw_grp INDEX lw_row-index.
    CHECK sy-subrc 0.
    DO.

      CLEAR lw_row_aux.
      lw_row_aux-index lw_grp-index_from.
      APPEND lw_row_aux TO ft_row.
      IF lw_grp-index_from >= lw_grp-index_to.
        EXIT.
      ENDIF.
      ADD TO lw_grp-index_from.

    ENDDO.

  ENDLOOP.

  DELETE ft_row
   WHERE rowtype IS NOT INITIAL.