Sentencia IF en ABAP: Control condicional del flujo del programa

Kategorie
ABAP-Statements
Veröffentlicht
Autor
Johannes

La sentencia IF es la estructura de control central en ABAP para dirigir el flujo del programa basado en condiciones. Permite ejecutar uno o varios bloques de sentencias solo cuando una determinada condicion logica se cumple (es verdadera). Con ella puedes crear ramificaciones en el flujo del programa para reaccionar a diferentes situaciones o estados de datos.

Sintaxis

La sentencia IF existe en diferentes variantes:

1. Condicion IF simple (sin alternativa)

IF <expresion_logica>.
" Bloque de sentencias 1
" Este bloque solo se ejecuta si <expresion_logica> es verdadera.
[Sentencia1_1].
[Sentencia1_2].
...
ENDIF.
  • IF: Inicia la verificacion de condicion.
  • <expresion_logica>: Una condicion que se evalua como verdadera (abap_true) o falsa (abap_false).
  • ENDIF: Cierra el bloque IF.

2. Condicion IF con alternativa (ELSE)

IF <expresion_logica>.
" Bloque de sentencias 1 (Si es verdadero)
...
ELSE.
" Bloque de sentencias 2 (Si es falso)
...
ENDIF.
  • ELSE: Inicia el bloque que se ejecuta cuando la <expresion_logica> en la parte IF fue falsa.

3. Condicion IF con multiples alternativas (ELSEIF) y ELSE opcional

IF <expresion_logica_1>.
" Bloque de sentencias 1 (Si expresion 1 es verdadera)
...
ELSEIF <expresion_logica_2>.
" Bloque de sentencias 2 (Si expresion 1 ERA falsa y expresion 2 es verdadera)
...
ELSEIF <expresion_logica_3>.
" Bloque de sentencias 3 (Si expresiones 1 y 2 ERAN falsas y expresion 3 es verdadera)
...
[ELSE. " Bloque opcional para todos los otros casos
" Bloque de sentencias N (Si TODAS las expresiones anteriores eran falsas)
...]
ENDIF.
  • ELSEIF: Verifica otra condicion, pero solo si todas las condiciones IF y ELSEIF anteriores eran falsas.

Funcionamiento y flujo

  • Las condiciones se verifican estrictamente de arriba hacia abajo (IF primero, luego el primer ELSEIF, luego el segundo, etc.).
  • En cuanto una condicion se reconoce como verdadera (abap_true), se ejecuta el bloque de sentencias correspondiente.
  • Muy importante: Despues de ejecutar ese unico bloque, el programa salta directamente a la sentencia despues del ENDIF. No se verifican ni ejecutan mas condiciones ELSEIF ni el bloque ELSE dentro de la misma estructura IF...ENDIF.
  • Si todas las condiciones IF y ELSEIF son falsas (abap_false), se ejecuta el bloque ELSE (si existe).
  • Si todas las condiciones son falsas y no hay bloque ELSE, simplemente se continua con la sentencia despues de ENDIF, sin ejecutar ninguno de los bloques dentro de la estructura IF.

Expresiones logicas

La <expresion_logica> puede tomar diferentes formas:

  • Comparaciones: =, <>, <, >, <=, >= (ej. count > 0, text = 'Si')
  • Verificaciones de estado: var IS INITIAL, ref_var IS BOUND
  • Variables booleanas: is_ok = abap_true
  • Operadores logicos para combinacion:
    • AND: Ambas sub-expresiones deben ser verdaderas.
    • OR: Al menos una de las sub-expresiones debe ser verdadera.
    • NOT: Invierte el resultado de la expresion siguiente.
    • Ejemplo: IF count > 0 AND is_active = abap_true.
  • Funciones predicativas: Funciones que devuelven abap_true o abap_false (ej. line_exists(...)).

Anidamiento

Las sentencias IF pueden anidarse unas dentro de otras para construir arboles de decision mas complejos. Una buena indentacion es esencial aqui para la legibilidad.

IF condition1.
IF condition2.
" ... "
ENDIF.
ELSE.
" ... "
ENDIF.

Ejemplos

1. IF simple

DATA quantity TYPE i VALUE 15.
IF quantity > 10.
WRITE / 'Cantidad de pedido es mayor que 10.'.
ENDIF.

2. IF con ELSE

DATA user_input TYPE c LENGTH 1.
user_input = 'X'. " Entrada de ejemplo
IF user_input = 'S'.
WRITE / 'Usuario dijo Si.'.
ELSE.
WRITE / 'Usuario no dijo Si.'.
ENDIF.

3. IF con ELSEIF y ELSE

DATA score TYPE i VALUE 75.
DATA grade TYPE c LENGTH 1.
IF score >= 90.
grade = '1'.
ELSEIF score >= 70.
grade = '2'.
ELSEIF score >= 50.
grade = '3'.
ELSE.
grade = '4'.
ENDIF.
WRITE / 'La nota es:', grade. " Salida: La nota es: 2

4. Condicion combinada (AND)

DATA has_permission TYPE abap_bool VALUE abap_true.
DATA is_logged_in TYPE abap_bool VALUE abap_true.
IF has_permission = abap_true AND is_logged_in = abap_true.
WRITE / 'Acceso concedido.'.
ELSE.
WRITE / 'Acceso denegado.'.
ENDIF.

Diferenciacion con CASE

Cuando se quiere verificar la misma variable contra varios valores fijos diferentes, la sentencia CASE suele ser mas clara que una larga cadena de sentencias IF ... ELSEIF:

DATA transport_type TYPE c LENGTH 1. " B=Bicicleta, A=Auto, U=Autobus
transport_type = 'A'.
" Con IF/ELSEIF
IF transport_type = 'B'.
WRITE / 'Bicicleta seleccionada.'.
ELSEIF transport_type = 'A'.
WRITE / 'Auto seleccionado.'.
ELSEIF transport_type = 'U'.
WRITE / 'Autobus seleccionado.'.
ELSE.
WRITE / 'Desconocido.'.
ENDIF.
" Con CASE (a menudo mas legible)
CASE transport_type.
WHEN 'B'.
WRITE / 'Bicicleta seleccionada.'.
WHEN 'A'.
WRITE / 'Auto seleccionado.'.
WHEN 'U'.
WRITE / 'Autobus seleccionado.'.
WHEN OTHERS.
WRITE / 'Desconocido.'.
ENDCASE.

Notas importantes / Mejores practicas

  • La sentencia IF es fundamental para casi cualquier programa ABAP.
  • Presta atencion a expresiones logicas claras e inequivocas.
  • Usa indentacion consistentemente para hacer la estructura legible.
  • Nunca olvides el ENDIF de cierre.
  • Para asignaciones puramente basadas en valores, en ABAP moderno (>= 7.40) a menudo hay alternativas mas compactas como los operadores condicionales COND y SWITCH. Sin embargo, IF sigue siendo esencial para controlar bloques de sentencias.