Questão Comentada – Check

ABAP101 finalmente de casa nova e agora é casa própria! Como toda mudança ainda estou com algumas caixas para desenbalar, armários para arrumar e pequenos ajustes para fazer. Mas agora ABAP101 tem seu próprio teto!

Para estrear, vou começar com um nova categoria, “questões comentadas”. Essa semana eu recebi uma pergunta de um aluno da minha última turma da academia ABAP sobre uma questão de certificação. No momento que estava respondendo a dúvida eu tive a idéia de criar essa nova categoria.

A idéia aqui é comentar a resposta das questões mais sacanas ou pegadinhas das provas de certificação. Então se você tiver alguma questão, mande para furlan_arroba_abap101.com.

Então, vamos a nossa primeira questão:

Qual é a lógica dessa questão?

What is the result of the following code. Assume there are 5 records in itab.

Loop at itab.
ctr = ctr + 1
write: sy-tabix.
check ctr = 3.
delete itab
endloop.

Resposta correta: 1 2 3 3 4

Como estamos dentro de um LOOP, o sy-tabix retorna o index atual da tabela, ou seja, qual a linha que o LOOP está na tabela. Assumindo que a variável ctr = 0 no início do LOOP, a chave da questão está no comando check ctr = 3 e delete itab.

O comando CHECK somente deixa o processamento do LOOP continuar se a expressão for verdadeira.

Assim, o código abaixo ficaria:

Loop at itab.
ctr = ctr + 1
write: sy-tabix.

if ctr = 3.
delete itab.
else.
continue.
endif.
endloop.

Ou seja, se a variável for ctr = 3, ele elimina a linha da tabela interna (no index 3) e continua o processamento até o ENDLOOP, caso contrário, pára o processamento e vai para a próxima iteração do LOOP.

Então, imagine isso no debug, no momento de cada iteração do LOOP, na linha do CHECK:

Iteração do LOOP 1: ctr = 1, sy-tabix = 1, Write = “1”, não passa pelo delete itab.
Iteração do LOOP 2: ctr = 2, sy-tabix = 2, Write = “1 2”, não passa pelo delete itab.
Iteração do LOOP 3: ctr = 3, sy-tabix = 3, Write = “1 2 3”, passa pelo delete itab.
Iteração do LOOP 4: ctr = 4, sy-tabix = 3, Write = “1 2 3 3”, não passa pelo delete itab. O 3 repete pq eliminamos uma linha da tabela interna itab no delete o “LOOP 3”
Iteração do LOOP 5: ctr = 5, sy-tabix = 4, Write = “1 2 3 3 4”, não passa pelo delete itab.

O pulo do gato está no CHECK ctr = 3, deletamos uma linha da itab e ai o sy-tabix fica no 3 em duas iterações do LOOP.

Consegui entender? Tente simular isso em um programa e acompanhe debugando o sy-tabix.

2 Resultados

  1. Gabriela disse:

    Booaa sorte na nova casa!!

    Ótima a explicação sobre a questão da prova de certificação!

    Att
    Gabriela

  2. furlan disse:

    Obrigado Gabriela. Como eu disse, ainda tenho algumas benfeitorias para fazer, mas com o tempo serão feitas.
    Abraços!