[SAP] Condicionais no ABAP
Fala galera!
Estou fazendo uma sequência de publicações sobre a linguagem de programação ABAP. Se quiser ver mais, dá uma olhada nesse agrupador aqui.
A última publicação um pouco mais técnica foi sobre como declarar variáveis no ABAP. Então agora daremos sequência falando um pouco sobre as estruturas condicionais na linguagem.
O que são estruturas condicionais?
De forma bem resumida e simplista, as estruturas condicionais são as perguntas que os algoritmos fazem para saber qual direção seguir. Como assim?
Softwares simples, como um "Hello World", não se questionam. Ou seja, você pede para o software escrever "Olá mundo!", ele entende essa instrução e escreve. Porém, se complicarmos um pouco o algoritmo, a brincadeira tende a ficar mais complexa.
Imagine que eu quero escrever um software que leia um input de um usuário e SE o usuário digitar "1", escreva: "Olá mundo!"; mas SE o usuário digitar "2", escreva: "Adeus mundo!" (dramático né?).
Perceba que eu marquei o SE em negrito, pois isto é uma condição. Ou seja, estou condicionando o meu software a questionar qual foi o input do usuário e, dependendo da resposta, seguir um caminho predeterminado.
Claro que como tudo no mundo da programação, não é só isso. Então se quiser se aprofundar no assunto, vai no Google (ou no ChatGPT, se for um pouco mais preguiçoso) e estude mais sobre o assunto, vale a pena!
Como trabalhar com condições no ABAP?
Legal! Então tendo entendido o que são os condicionais, vamos ver alguns exemplos no ABAP.
Quando pensamos no SE, nossa mente de programador nos leva direto para o IF
e no ABAP não é diferente.
Se quisermos comparar se duas variáveis são iguais, no ABAP ficaria assim:
IF variavel_1 = variavel_2.
WRITE 'As duas variáveis são iguais'.
ENDIF.
Ou então:
IF variavel_1 EQ variavel_2.
WRITE 'As duas variáveis são iguais'.
ENDIF.
Perceba que podemos usar o =
ou o EQ
(equal) para validar se as variáveis são iguais. Perceba também que tudo o que está entre o IF
e o ENDIF
é o que será executado no caso de a condição ser atendida.
Mas e se quisermos validar se as variáveis são diferentes? Ficaria assim:
IF variavel_1 <> variavel_2.
WRITE 'As duas variáveis são diferentes'.
ENDIF.
Ou então:
IF variavel_1 NE variavel_2.
WRITE 'As duas variáveis são diferentes'.
ENDIF.
Podemos usar o <>
ou o NE
(not equal).
Ok! Mas e se eu quiser ter uma validação, seguindo um caminho, mas se não der certo, seguindo outro caminho?
Excelente pergunta! Ficaria assim:
IF variavel_1 EQ variavel_2.
WRITE 'As duas variáveis são iguais'.
ELSE.
WRITE 'As duas variáveis são diferentes'.
ENDIF.
Viu? Nada muito diferente das demais linguagens de programação (nem faria sentido ser diferente).
Vamos complicar um pouco mais o nosso exemplo agora.
E se eu quiser validar se a minha variável 1 é maior do que a variável 2, ou se a minha variável 1 é igual a variável 2, ou se a minha variável 1 é menor do que a variável 2?
Para este exemplo, precisamos entender os conceitos de:
- Maior que
- Maior ou igual que
- Menor que
- Menor ou igual que
Ou seja, para validar se uma variável é maior do que a outra, eu posso usar o >
ou então o GT
(greater than). Mas se eu quiser validar se é maior ou igual a outra, eu posso usar o >=
ou o GE
(greater equal).
O mesmo vale para menor, podendo usar o <
ou o LT
(lower than), ou o menor igual, podendo usar o <=
ou o LE
(lower equal).
Na fonte desta publicação estou deixando um link muito útil da SAP para este tema.
Então, para concluir o nosso exemplo, o código ABAP seria:
IF variavel_1 > variavel_2.
WRITE 'A variável 1 é maior do que a variável 2'.
ELSEIF variavel_1 = variavel_2.
WRITE 'A variável 1 é igual a variável 2'.
ELSEIF variavel_1 < variavel_2.
WRITE 'A variável 1 é menor do que a variável 2'.
ENDIF.
Ou então:
IF variavel_1 GT variavel_2.
WRITE 'A variável 1 é maior do que a variável 2'.
ELSEIF variavel_1 EQ variavel_2.
WRITE 'A variável 1 é igual a variável 2'.
ELSEIF variavel_1 LT variavel_2.
WRITE 'A variável 1 é menor do que a variável 2'.
ENDIF.
No final dos ELSEIF
ainda poderíamos ter um ELSE
, que seria a negativa de todas as condições anteriores. Mas no nosso exemplo, matematicamente não faz sentido. Porém, um pouco mais abaixo teremos um exemplo para esse caso. Segue acompanhando.
É legal entender também que poderíamos trabalhar de uma outra forma, com IF
dentro de um outro IF
, por exemplo:
IF variavel_1 GT variavel_2.
WRITE 'A variável 1 é maior do que a variável 2'.
ELSE.
IF variavel_1 EQ variavel_2.
WRITE 'A variável 1 é igual a variável 2'.
ELSE.
IF variavel_1 LT variavel_2.
WRITE 'A variável 1 é menor do que a variável 2'.
ENDIF.
ENDIF.
ENDIF.
Mas na minha opinião, este último exemplo fica um pouco mais poluído.
Uma outra forma de criarmos condições, ao invés de usar o IF
, seria usar o CASE
(que em outras linguagens são conhecidas como switch case
).
O CASE
vai funcionar de forma muito parecida com o IF
, condicionando o algoritmo. Porém, conseguimos brincar de uma forma mais interessante (e organizada, para o meu gosto pessoal). Por exemplo:
Temos uma variável de um número inteiro.
- SE a minha variável tiver o valor '1', o software deve escrever: "A variável está preenchida com o número 1";
- SE a variável estiver preenchida com o número 2, o software deve escrever: "A variável está preenchida com o número 2";
- SE a variável estiver preenchida com o número 3, o software deve escrever: "A variável está preenchida com o número 3";
- SE a variável estiver preenchida com qualquer outro número, então o software deve escrever: "A variável está preenchida com qualquer outro número que não é o 1, 2 ou o 3".
Podemos resolver este exemplo com o IF
sem problema nenhum, por exemplo:
IF variavel EQ 1.
WRITE 'A variável está preenchida com o número 1'.
ELSEIF variavel EQ 2.
WRITE 'A variável está preenchida com o número 2'.
ELSEIF variavel EQ 3.
WRITE 'A variável está preenchida com o número 3'.
ELSE.
WRITE 'A variável está preenchida com qualquer outro número que não é o 1, 2 ou o 3'.
ENDIF.
Porém, podemos também escrever esta mesma lógica utilizando o CASE
, ficando assim:
CASE variavel.
WHEN 1.
WRITE 'A variável está preenchida com o número 1'.
WHEN 2.
WRITE 'A variável está preenchida com o número 2'.
WHEN 3.
WRITE 'A variável está preenchida com o número 3'.
WHEN OTHERS.
WRITE 'A variável está preenchida com qualquer outro número que não é o 1, 2 ou o 3'.
ENDCASE.
O CASE
é mais performático do que o IF
? NÃO! Mas eu gosto de usar o CASE
quando temos mais de uma possibilidade condicional e principalmente quando a condição é invertida. Como assim?
Temos 3 variáveis. Cada uma delas pode ou não ser preenchida com "X".
- SE a variável 1 estiver preenchida com "X", então o software deve escrever "A escolhida foi a variável 1";
- SE a variável 2 estiver preenchida com "X", então o software deve escrever "A escolhida foi a variável 2";
- SE a variável 3 estiver preenchida com "X", então o software deve escrever "A escolhida foi a variável 3".
Conseguimos resolver este exemplo com o IF
? Claro que sim! Veja:
IF variavel_1 EQ 'X'.
WRITE 'A escolhida foi a variável 1'.
ELSE.
IF variavel_2 EQ 'X'.
WRITE 'A escolhida foi a variável 2'.
ELSE.
IF variavel_3 EQ 'X'.
WRITE 'A escolhida foi a variável 2'.
ENDIF.
ENDIF.
ENDIF.
Mas olha a elegância de fazer este exemplo com o CASE
no modo invertido, que comentei acima:
CASE 'X'.
WHEN variavel_1.
WRITE 'A escolhida foi a variável 1'.
WHEN variavel_2.
WRITE 'A escolhida foi a variável 2'.
WHEN variavel_3.
WRITE 'A escolhida foi a variável 3'.
ENDCASE.
Perceba que agora o CASE
não foi na variável, mas no valor. E as condicionais estão no WHEN
, não o valor. Fofo né? Eu também acho!
Eu sinceramente nunca fiz este "CASE invertido" em outras linguagens. Sei que é possível, mas nunca experimentei. Se você, caro leitor, utiliza esta abordagem em outra linguagem, deixa um comentário aqui!
Conclusão
Não tem muito o que concluir aqui. As condicionais no ABAP funcionam exatamente igual às condicionais de outras linguagens, mas com algumas pequenas diferenças na sintaxe (o que já era esperado).
Na nova sintaxe do ABAP (se não sabe do que estou falando, veja a publicação de como declarar variáveis no ABAP) existe a possibilidade de fazer condicionais dentro de atribuições inline, mas isso fica para uma publicação futura.
Segue acompanhando aqui que na próxima publicação iremos desenvolver um programinha com os conceitos já apresentados.
Abraço!