"
Apoiado por

Lookup em tabela sem ter de lidar com a excepção CX_SY_ITAB_LINE_NOT_FOUND

Antes do 7.40 ter modernizado o ABAP, um lookup a uma tabela obrigava a declarar uma variável auxiliar e a pelo menos 4 linhas de código.

Temos a seguinte tabela interna:


DATA(itbl) = VALUE t_t001( ( bukrs = 'COCA' butxt = 'Coca-cola' )
                            ( bukrs = 'PEPS' butxt = 'Pepsi' ) ).

Antes da 7.40 tinha de ser assim:


DATA wa LIKE LINE OF itbl.
DATA butxt TYPE butxt.
READ TABLE itbl INTO wa WITH KEY bukrs = 'SPRI'.
IF SY-SUBRC = 0.
  butxt = wa-butxt.
ENDIF.

Com o 7.40 a coisa tornou-se muito mais elegante. Mas mesmo assim, se o lookup falhar salta a excepção CX_SY_ITAB_LINE_NOT_FOUND com a qual temos de lidar, o que torna o código feio:


TRY.
    DATA(butxt) = itbl[ bukrs = 'SPRI' ]-butxt.
  CATCH CX_SY_ITAB_LINE_NOT_FOUND.
    CLEAR butxt.
ENDTRY.

Mas agora descobri que podemos recorrer ao VALUE e à sua funcionalidade OPTIONAL para nos ajudar a tornar a coisa muito mais simples:


DATA(butxt) = VALUE #( itbl[ bukrs = 'SPRI' ]-butxt OPTIONAL ).

Mais legível e mais sintético e por isso muito mais bonito e elegante.

O Abapinho saúda-vos.

2 comentários a “Lookup em tabela sem ter de lidar com a excepção CX_SY_ITAB_LINE_NOT_FOUND”

  1. João TN Diz:

    Obrigado pela partilha Nuno!
    Só uma questão, precisas de indicar o campo que queres ler, certo?
    DATA(butxt) = VALUE #( itbl[ bukrs = ‘SPRI’ ]-butxt OPTIONAL ).

    Para evitar o TRY/CATCH fazia sempre uma verificação na tabela a ver se a linha existia.

    IF line_exists( itbl[ bukrs = ‘SPRI’ ] ).
    DATA(lv_butxt) = itbl[ bukrs = ‘SPRI’ ]-butxt.
    ENDIF.

    Evita o dump mas pode comprometer a performance.
    Desta maneira fica ainda mais prático.
    Valeu!

  2. Nuno Godinho Diz:

    Olá João, tens toda a razão. Não só faltava o -BUTXT em dois sítios como ainda tinha mais uns erros por distracção que também corrigi. Obrigado pelo aviso!

Deixe um comentário


Acerca do Abapinho
O Abapinho é suportado pelo WordPress
Artigos (RSS) e Comentários (RSS).