segunda-feira, 25 de outubro de 2021

Roubando alv's Standard para o nosso programa

*  Fala pessoal, hoje vou mostrar uma dica que pode facilitar muito seu
* desenvolvimento ou no minimo diminir o tempo para entregar....
*  Sabe quando o funcional te chama falando que está afim de fazer um relatorio
* muito parecido com o um relatorio standard mas cheio de 'Fru Fru',
* neste momento você já começa a pensar que terá que 'debugar' o standard
* pra saber como chegar nos dados principais do relatorio antes mesmo de
* incluir as 'Melhorias', pois seus problemas acabaram.... rs ( Sempre quis
* falar isso). Com esse post podemos processar o relatorio standard e pegar
* os dados que seriam exibidos na tela, e depois disso, com todos os dados
* base, podemos fazer os adicionais sem problema nenhum. Bora pro codigo.

*  Abaixo temos um exemplo, aonde o funcional me pediu para trazer os dados
* referente a documentos financeiros usando apenas o 'Conta Razão', 'Empresa'
* e 'Data de lançamento'... Conversamos sobre os acessos na tabela e
* mostrei que não tinhamos esse Indice na tabela e que talvez sofreriamos
* com a performance do programa, teriamos que ter mais parametros para
* conseguir acessar as tabelas com as chaves e assim entregar conforme
* esperado, o funcional insastifeito depois de ter feito uma documentação
* da demanda tudo baseada nessa seleção sem chaves faz o seguinte comentario,
* - Ahhhhh, mas no standard funciona rápido quando eu coloco somente essas
* informações !!!
* Eu em choque, sem entender, pergunto. - Rápido ?!! Standard ?!!
* Depois disso o funcional complementa. - Sim, quando rodo a FBL3N
* ( Relatorio de partidas individuais - Contas do razão ) me mostra um
* relatorio no final que aparece relativamente rapido.
*  Com essas informações lembrei que conversando com um amigo do trabalho,
* o mesmo me falou sobre uma classe que deixa o retorno do processo em
* memoria e assim podemos buscar essa informação e depois tratar como
* quiser.
* Segue codigo comentado abaixo como exemplo.

REPORT  zrtts.
*--------------------------------------------------------------------*

TABLES :
  bkpfbseg.

TYPES :
  BEGIN OF ty_bkpf,
    bukrs TYPE bkpf-bukrs,
    belnr TYPE bkpf-belnr,
    gjahr TYPE bkpf-gjahr,
    budat TYPE bkpf-budat,
  END OF ty_bkpf.

DATA :
  t_bkpf TYPE TABLE OF ty_bkpf,
  s_bkpf TYPE ty_bkpf.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
SELECT-OPTIONS :
  r_saknr FOR bseg-saknr,
  r_bukrs FOR bseg-bukrs,
  r_budat FOR bkpf-budat.

SELECTION-SCREEN END OF BLOCK   b1.

* Definir para não mostrar ALV, Metadata
cl_salv_bs_runtime_info=>set(
  EXPORTING display  abap_false
            metadata abap_false
            data     abap_true ).

* Chamado do programa do FBL3N e passando os parametros de tela.
SUBMIT rfitemgl
  WITH sd_saknr IN r_saknr
  WITH sd_bukrs IN r_bukrs
  WITH so_budat IN r_budat

  WITH x_opsel  EQ abap_false
  WITH x_clsel  EQ abap_false
  WITH x_aisel  EQ abap_true

  WITH x_norm   EQ abap_true
*  WITH pa_vari  EQ '/OES_EXT'
  AND RETURN.


TRY.
    DATA ol_pay_data TYPE REF TO data.
    FIELD-SYMBOLS<fs_pay_data> TYPE ANY TABLE,
                   <pay_data> TYPE ANY.

* Busca tabela do ALV em processamento do Submit
    cl_salv_bs_runtime_info=>get_data_ref(
      IMPORTING r_data ol_pay_data ).

* Atribui para tabela dinâmica
    ASSIGN ol_pay_data->TO <fs_pay_data>.

  CATCH cx_salv_bs_sc_runtime_info.
*        #ec no_handler
ENDTRY.

* Limpa runtime
cl_salv_bs_runtime_info=>clear_all).

*--------------------------------------------------------------------*
* No ambiente atual que estou não consigo usar comando 'Inline' mas
* segue abaixo eu pegando o retorno e colocando na minha tabela interna.

FIELD-SYMBOLS :
  <bukrs> TYPE bkpf-bukrs,
  <belnr> TYPE bkpf-belnr,
  <gjahr> TYPE bkpf-gjahr,
  <budat> TYPE bkpf-budat.


LOOP AT <fs_pay_data> ASSIGNING <pay_data>.
  ASSIGN COMPONENT 'BUKRS' OF STRUCTURE <pay_data> TO <bukrs>.
  ASSIGN COMPONENT 'BELNR' OF STRUCTURE <pay_data> TO <belnr>.
  ASSIGN COMPONENT 'GJAHR' OF STRUCTURE <pay_data> TO <gjahr>.
  ASSIGN COMPONENT 'BUDAT' OF STRUCTURE <pay_data> TO <budat>.

  s_bkpf-bukrs <bukrs>.
  s_bkpf-belnr <belnr>.
  s_bkpf-gjahr <gjahr>.
  s_bkpf-budat <budat>.

  APPEND s_bkpf TO t_bkpf.
  CLEAR s_bkpf.
ENDLOOP.

*--------------------------------------------------------------------*
* Gostaria que vocês percebecem que mesmo colocando layout no relatorio
* standard quando darmos o 'Get' dos dados, ele vira toda a tabela de
* saida que seria usada no ALV da transação Standard.
*  Espero ter ajudado e qualquer coisa tamo aeeeee. Vlw.