Novidades no READ TABLE – ABAP RELEASE 7.4 – TABLE EXPRESSIONS

Vamos juntos destrinchar o ‘novo’ READ TABLE disponível a partir da versão 7.4.

Para alegria geral da nação ABAP, a SAP liberou uma série de novidades para facilitar os desenvolvimentos e customizações nessa versão. Eu particularmente adorei e adotei o ‘novo’ READ TABLE imediatamente assim que coloquei meus ‘dedos’ nele. Se liga só o que veremos nesse post

  1. Sintaxe e variações de uso;
  2. Vantagens e desvantagens;
  3. Tratando exceções;
  4. Comparativo entre o novo e o ‘velho’;
  5. Bônus;

Como utiliza-lo.

O READ TABLE é um comando utilizado a muuuuito tempo para efetuar a leitura de um único registro em uma tabela interna, seu resultado pode ser copiado para uma work-area ou seu endereço de memória pode ser atribuído a um field-symbol. 

Nessa nova versão podemos utiliza-lo para retornar uma unica coluna em uma variável ou field-symbol ou uma linha inteira em uma work-area ou field-symbol.

  • vl_matnr ti_mara[ matnr ‘1’ ]matnr. “Retornará o valor da coluna MATNR do material desejado, nesse caso o ‘1’, para a variável.

O exemplo acima é o equivale simplificado da seguinte leitura:

  • READ TABLE ti_mara INTO wl_mara TRANSPORTING matnr WITH KEY matnr ‘1’“Selecionamos o material e copiamos o valor das colunas desejadas para dentro da work-area.
  • MOVE wl_maramatnr TO vl_matnr. “E em um segundo momento atribuímos o valor desejado a variável.

Muito mais simples não é mesmo? Para o field-symbol é a mesma coisa só que muito mais produtivo para os casos em que seja necessário alterar o conteúdo da tabela interna.

  • ASSIGN  ti_mara[ matnr = ‘1’ ]matnr TO <fs_matnr>. OU
  • ASSIGN  ti_mara[ matnr = ‘1’ ] TO <fs_mara>.

Os exemplo acima são o equivale simplificado da seguinte leitura:

  • READ TABLE ti_mara ASSIGNING <fs_mara> WITH KEY matnr = ‘1’ . “Selecionamos a linha completa do material já que para esse caso não é possível usar o adicional TRANSPORTING.
  • ASSIGN COMPONENT ‘MATNR’ OF STRUCTURE <fs_mara> TO <fs_matnr>. “Em um segundo passo atribuímos o valor da coluna desejada.

Caso seja possível utilizar o índice ao invés de informar as condições diretamente como eu fiz nos exemplos, utilize a sintaxe abaixo.

  • work_area = tabela_interna[ var_indice_do_registro ].

É possível utilizar essa leitura também para tomar decisões dentro do programa sem a necessidade de declarar um objeto.

IF ti_mara[ matnr = ‘1’ ]matkl EQ vl_grupo.

WRITE: vl_msg_ok.

ELSE.

WRITE: vl_msg_nao_ok.

ENDIF.

E por fim, caso esteja utilizando uma tabela interna não tipificada, utilize a seguinte sintaxe.

  • tabela_interna[ table_line = vl_numero_da_linha ].

Vantagens e desvantagens do novo READ TABLE.

Como beneficio principal posso citar a praticidade e economia de processamento, de linhas de código e declaração de objetos dentro do código. Além disso o retorno pode ser somente uma coluna e não a linha toda. NOTA* Aliar o novo READ TABLE a declaração de variáveis on-line é uma excelente idéia. Veja como fazer no post Inline Declarations.

Como desvantagem principal posso citar o fato de que, se a condição especificada não for atendida o campo de sistema SUBRC não é atualizado com 4, mas sim ocorre um DUMP  do tipo CX_SY_ITAB_LINE_NOT_FOUND.

Além disso segundo a documentação da SAP, infelizmente não é possível forçar a busca binária(BINARY SEARCH) para essa expressões de tabela, a documentação indica que seja utilizada as ‘(Secondary) Table Keys’ e indica também o programa ‘DEMO_SECONDARY_KEYS’ para consulta.

Para evitar o DUMP temos as seguintes opções.

  • O bom e velho TRY… CATCH;

TRY.

vl_matkl = ti_mara[ matnr = vl_matnr ]-matkl.

CATCH CX_SY_ITAB_LINE_NOT_FOUND INTO vl_erro.

“Tratamento do erro

ENDTRY;

  • Utilizar a nova funcionalidade “LINE_EXISTS”, que também é excelente;

IF line_exists( ti_mara[ matnr = vl_matnr ] ) EQ abap_true.

wa_mara = ti_mara[ matnr = vl_matnr ].

ELSE.

” Tratamento de erro

ENDIF.

NOTA: Se por acaso já estiver no SP8, o abap_true pode ser emitido. 😉

  • Usar um valor DEFAULT;

CONSTANT c_matkl_default TYPE matnr DEFAULT ’01’.
vl_matkl = VALUE #( ti_mara[ matnr = vl_matnr ]-matkl DEFAULT c_matkl_default ). “Caso a condição não seja atendida ao invés de um DUMP o valor retornado é o da constante.

E o desempenho?

Não adiantaria nada os comandos serem extremamente práticos e possuir um desempenho horroroso… obvio rsrs… Por esse motivo fiz um comparativo entre as duas versões para nos assegurar de que o desempenho deste segundo é no minimo igual ao que já estamos acostumados a utilizar. Confere ai…

Comparativo entre versões READ TABLE.
Comparativo entre versões.

Com pode ver no comparativo acima, fiz o acesso 10 mil vezes utilizando as duas maneiras e temos uma diferença muito pequena, porém, o “novo” READ TABLE possui um desempenho superior.

Gostando do conteúdo? Quer conhecer mais novidades da versão 7.4? Inscreva-se e receba as novidades no seu e-mail

* Campo obrigatório



É como eu disse, ainda não vi uma funcionalidade liberada nessa versão de que eu não tenha gostado. Obrigado pela sugestão de conteúdo Will Girafa, se faltou algum detalhe deixe um comentário.

BÔNUS:

Para  saber se a versão em que trabalha já suporta essas facilidades faça o seguinte:

  1. Faça o LOGON no SAP e acesse o menu Sistema -> Status;
  2. Clique no botão com uma lupa denominado ‘Informações componentes’;
  3. Verifique o release do item ‘SAP_ABA – Componente válido para várias aplicações’ está 740 ou superior.

E ai curtiu? Me conte, quais funcionalidades já incorporou a sua rotina? Deixe um comentário!

Abraços,

LNunes

 

Ps. Não use valores fixos no seu código como eu fiz nos EXEMPLOS desse post (MATNR = ‘1’) .