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 bloqueIF.
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 parteIFfue 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 condicionesIFyELSEIFanteriores eran falsas.
Funcionamiento y flujo
- Las condiciones se verifican estrictamente de arriba hacia abajo (
IFprimero, luego el primerELSEIF, 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 condicionesELSEIFni el bloqueELSEdentro de la misma estructuraIF...ENDIF. - Si todas las condiciones
IFyELSEIFson falsas (abap_false), se ejecuta el bloqueELSE(si existe). - Si todas las condiciones son falsas y no hay bloque
ELSE, simplemente se continua con la sentencia despues deENDIF, sin ejecutar ninguno de los bloques dentro de la estructuraIF.
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_trueoabap_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: 24. 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/ELSEIFIF 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
IFes 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
ENDIFde cierre. - Para asignaciones puramente basadas en valores, en ABAP moderno (>= 7.40) a menudo hay alternativas mas compactas como los operadores condicionales
CONDySWITCH. Sin embargo,IFsigue siendo esencial para controlar bloques de sentencias.