February 17, 2020

ALVs Standard: Reutilizando o caos alemão

Queridos zumbis, alguma vez vocês já passaram pela seguinte situação: o seu programa precisa usar as informações de algum relatório ALV, porém o relatório não está escrito de uma forma que faz com que o código fosse facilmente reutilizável?
Frustrante, não é?! 🙁
Bom, dependendo do relatório, há sim uma chance de reutilizar a extração de dados e o código de processamento. Porém, meu amigo zumbi, infelizmente você vai descobrir que existem pouquíssimos relatórios standard que podem ser reutilizados com facilidade, principalmente quando começa os comentários em alemão e você tenta traduzi-los na esperança de entender alguma coisa (admita, você já fez isso!).

Então, e agora?
Se você encontrar um relatório que tem a lógica que você precisa, pode ter uma outra maneira de reutilizá-lo sem precisar clonar programas ou ficar copiando código. Você pode chamar o relatório dentro do seu programa e tratá-lo como uma rotina. Essa técnica pode te ajudar a reduzir o esforço do desenvolvimento e reutilizar objetos que já existem.

Mas como isso funciona?
Depois da extração e processamento, os relatórios ALV exportam os dados para uma área de memória global e isso permite que o seu programa possa importá-los depois.
Quando um relatório ALV é executado, as informações em tempo de execução (layout, fieldcat, tabelas e etc.) são armazenadas pelos métodos da classe CL_SALV_BS_RUNTIME_INFO. Aliás, essa classe usa o EXPORT TO MEMORY para armazenar as informações. A classe lida com tudo isso internamente e fornece métodos para acessar essas informações, ou seja, não precisamos nos preocupar como elas são armazenadas.

Exemplo:
Vou usar como exemplo o relatório IE05, informando o número do inventário e centro na tela de seleção. Essa é a saída do relatório:

saida_alv

Agora vou chamar o relatório dentro do meu programa, passando os mesmos valores para os parâmetros de seleção e importar os dados para uma tabela interna:

DATA: lt_selscreen TYPE TABLE OF rsparams,
      wa_selscreen TYPE rsparams.

FIELD-SYMBOLS <lt_data>   TYPE ANY TABLE.
DATA lr_data              TYPE REF TO data.

* Monta a tabela com os dados do parâmetro de seleção
wa_selscreen-selname = 'INVNR'.   "Nome do campo
wa_selscreen-kind    = 'S'.       "Tipo (P - parameter /S - select-options)
wa_selscreen-sign    = 'I'.
wa_selscreen-option  = 'BT'.
wa_selscreen-low     = '120000'.
wa_selscreen-high    = '161000'.
APPEND wa_selscreen TO lt_selscreen.
CLEAR wa_selscreen.

wa_selscreen-selname = 'SWERK'. "Nome do campo
wa_selscreen-kind    = 'S'.     "Tipo (P - parameter /S - select-options)
wa_selscreen-sign    = 'I'.
wa_selscreen-option  = 'EQ'.
wa_selscreen-low     = '331'.
APPEND wa_selscreen TO lt_selscreen.
CLEAR wa_selscreen.

cl_salv_bs_runtime_info=>set(
  EXPORTING display  = abap_false
            metadata = abap_false
            data     = abap_true ).

* Executa o relatório e importa a tabela de saida
SUBMIT riequi20
  WITH SELECTION-TABLE lt_selscreen
  AND RETURN.
TRY.
    cl_salv_bs_runtime_info=>get_data_ref(
      IMPORTING r_data = lr_data ).
    ASSIGN lr_data->* TO <lt_data>.
  CATCH cx_salv_bs_sc_runtime_info.
    MESSAGE 'Não é possível recuperar os dados ALV' TYPE 'E'.

ENDTRY.

cl_salv_bs_runtime_info=>clear_all( ).

Resultado da tabela preenchida:

alv_final

Simples, não é? Vou explicar os métodos e os parâmetros utilizados pela classe CL_SALV_BS_RUNTIME_INFO:

SET () – método que inicializa a classe.
• DISPLAY – Defina como “abap_false” para forçar o relatório ALV ser executado em “background”, ou seja, o ALV não será exibido.
• METADATA – Defina como “abap_false” para evitar que o layout, fieldcat, etc, sejam exportados para a memória… a gente não precisa deles neste cenário.
• DATA – Defina como “abap_true” para forçar a exportação da tabela de dados para a memória.

GET_DATA_REF () – Se você não conhece qual é a estrutura da tabela, ou prefere usar uma tabela dinâmica, este método pode ser usado para acessar a referência da tabela.
• R_DATA – parâmetro de exportação da tabela.

CLEAR_ALL () – este método limpa todas as áreas de memória, redefinindo os flags que foram definidos no método SET ().

Essa técnica pode ser utilizada para acessar os dados dos relatórios que usam qualquer tipo de ALV (ALV Grid, ALV List, ALV Tree), mas, obviamente, não vai funcionar para relatórios WRITE ou qualquer coisa que não seja SAPGUI ALV.
É isso aí, espero que isso possa ajudá-los algum dia! Até mais e que a força anti-zumbi esteja com vocês!!

Daiane Medeiros

Abapeira desde 2008, curte som underground, arte urbana, bobeiras geek, luta krav maga, fala gírias idosas e jura que é uma pessoa normal.

View all posts by Daiane Medeiros →

11 thoughts on “ALVs Standard: Reutilizando o caos alemão

  1. Amazing!!!

    Muito bom..
    Acabei de passar por tal situação, pena não ter lido este tópico antes… 🙁

    Na próxima vou lembrar do zombie.

    Obrigado

  2. Boa Noite,

    muito boa dica, eu já utilizo esta forma de obter dados de alv porém estou com uma dificuldade.

    Quando o relatório que utilizo este método já faz uso dele para outro alv o resultado passa a ser exibido em tela.

    Já passou por isso ?

Leave a Reply

Your email address will not be published. Required fields are marked *