Blog
Sintaxis e instrucciones básicas del lenguaje de programación ABAP
- 13/05/2022
- Escrito por: Grazia Masulli
- Categoría: SAP ABAP
Hemos tratado en otros artículos de la web qué es el lenguaje ABAP/4 y algunas preguntas frecuentes. Veamos ahora cuáles son las reglas básicas de la sintaxis ABAP y sus instrucciones básicas.
Como este artículo es más largo de lo habitual, he añadido un índice para ayudarte a encontrar el tema que te interesa. Algunos ejemplos contienen palabras en italiano (este artículo se publicó originalmente en mi sitio web en italiano). Ya que estamos hablando de código, estoy seguro de que se entenderá perfectamente 🙂
Índice
Conceptos fundamentales
Tipos de datos por defecto y la instrucción DATA
El comando WRITE
Construcciones lógicas IF, ELSE, WHILE, DO, CASE
Manipulación de cadenas de caracteres (strings)
Comentarios sobre el código
Conceptos fundamentales
Un programa en ABAP consiste en un conjunto de “instrucciones” o “sentencias” (en inglés, statements). Cada instrucción representa una acción a realizar.
En ABAP, cada instrucción termina con un punto (.), mientras que la primera palabra de la instrucción se conoce como palabra clave (keyword).
Por ejemplo, en esta línea la palabra clave es WRITE, que hará que el texto se escriba en la pantalla entre comillas:
WRITE 'Trabajar con SAP es genial'.
Cada palabra de la instrucción debe estar separada por al menos un espacio. El código en ABAP no distingue entre mayúsculas y minúsculas: estos dos comandos son equivalentes:
DATA variabile_1 TYPE c.
data variabile_1 type c.
Aunque el lenguaje no distingue entre mayúsculas y minúsculas, es una buena práctica escribir las palabras clave en mayúsculas (por ejemplo, WRITE y no Write o write).
Una instrucción ABAP se compone de operadores (operators), operandos (operands) y adiciones de palabras clave (additions). La primera palabra de una instrucción ABAP es siempre una palabra clave, mientras que las demás pueden ser operandos, operadores o adiciones.
Hay varios tipos de operadores, por ejemplo: operadores de asignación (= o ?=), operadores aritméticos (+, -, *, /) y operadores relacionales (=, <, >, <=, >=, <>), entre otros.
Los operandos son objetos como datos, tipos de datos, procedimientos, etc. Las palabras clave ABAP son términos como REPORT, PARAMETERS, WRITE, DATA, etc. Muchas instrucciones admiten además adiciones que modifican su comportamiento.
Veamos un ejemplo práctico:
DELETE itab
WHERE ( col1 = op1 AND ( col2 > op2 OR col3 < op3 ) ).
En este comando la palabra clave es DELETE, la adición es WHERE, los operadores son =, <, >, AND, OR, y los operandos son itab, col1, op1, col2, op2, col3, op3.
En teoría, una instrucción puede abarcar varias líneas. Sin embargo, para mantener el código legible, es una buena práctica escribir una instrucción por línea.
Por ejemplo, este código:
REPORT ztest.
WRITE 'Este es un ejemplo'.
También podría escribirse así (aunque es menos legible):
REPORT ztest. WRITE 'Este es un ejemplo'.
Tipos de datos por defecto y la instrucción DATA
Como en la mayoría de los lenguajes, en ABAP hay varios tipos de datos predefinidos.
Se declaran con TYPE seguido de un tipo. Por ejemplo, i es un número entero, c es texto (caracteres), d se utiliza para fechas y t para hora, etc.
Las variables en ABAP se declaran con el comando DATA.
Veamos cómo funciona esto en la práctica. Creamos una variable para el nombre del empleado y otra para la fecha en la que empezó a trabajar:
DATA nombre_empleado TYPE c LENGTH 25.
DATA fecha_incorporacion TYPE d.
Aquí LENGTH 25 indica la longitud máxima en caracteres. Si no especificáramos la longitud en un tipo c, el valor por defecto sería 1 carácter.
La palabra clave VALUE se utiliza para asignar un valor directamente al declarar la variable:
DATA mi_nombre TYPE c LENGTH 25 VALUE 'Grazia'.
Para los nombres de variables, podemos utilizar lo que consideremos oportuno. La longitud máxima suele ser de 30 caracteres (dependiendo del contexto), y obviamente no podemos utilizar palabras reservadas por el sistema (por ejemplo, no podemos llamar a una variable WRITE).
Si tenemos una lista de variables, podemos condensar el código evitando repetir la instrucción DATA utilizando dos puntos y comas:
DATA: nombre_empleado TYPE c LENGTH 25,
apellido_empleado TYPE c LENGTH 25,
fecha_incorporacion TYPE d.
Otro atajo útil cuando varias variables comparten la misma estructura es utilizar LIKE, que crea una variable con el mismo tipo técnico que otra ya existente:
DATA: variable_1 TYPE c LENGTH 25,
variable_2 LIKE variable_1.
El comando WRITE
Veamos ahora con más detalle el comando WRITE, que devuelve a la pantalla el valor de constantes, variables, resultados de operaciones, mensajes, etc.
ABAP también muestra los espacios en blanco contenidos en una variable de tipo carácter cuando la imprime.
Por ejemplo, definamos dos variables de 25 caracteres cada una. Observa que en la segunda usamos LIKE:
DATA: variabile_1 TYPE c LENGTH 25 VALUE 'Test',
variabile_2 LIKE variabile_1 VALUE 'Prueba'.
WRITE variabile_1.
WRITE variabile_2.
Este sería el resultado en pantalla (además de los caracteres visibles, se consideran los espacios hasta completar la longitud):
Test Prueba
¿Qué pasa si el texto es más largo que la longitud asignada? Se truncará:
DATA: variabile_1 TYPE c LENGTH 25 VALUE 'Precipitadamentisimisimamente',
variabile_2 LIKE variabile_1 VALUE 'aprendo a utilizar SAP'.
WRITE variabile_1.
WRITE variabile_2.
En este caso, la primera variable se corta porque supera la longitud máxima.
ABAP no pasa a la siguiente línea por sí mismo. Por ejemplo, este código:
DATA: variabile_1 TYPE c LENGTH 20 VALUE 'Si sta come',
variabile_2 TYPE c LENGTH 20 VALUE 'di autunno',
variabile_3 TYPE c LENGTH 20 VALUE 'sugli alberi',
variabile_4 TYPE c LENGTH 20 VALUE 'le foglie'.
WRITE: variabile_1,
variabile_2,
variabile_3,
variabile_4.
Devuelve todo en la misma línea.
Para pasar a la siguiente línea, puedes usar la adición /:
WRITE: variabile_1, /,
variabile_2, /,
variabile_3, /,
variabile_4.
Si necesitas que el texto destaque, puedes utilizar colores con la adición COLOR:
WRITE: variabile_1 COLOR COL_TOTAL, /,
variabile_2 COLOR COL_HEADING, /,
variabile_3 COLOR COL_POSITIVE, /,
variabile_4 COLOR COL_NEGATIVE.
También es posible incluir símbolos e iconos en salidas de lista (dependiendo del sistema/entorno ABAP):
INCLUDE <symbol>.
WRITE:
/ 'www.corsoSAP.com',
/ sym_phone AS SYMBOL, '348 3762371',
/ sym_note AS SYMBOL, 'I migliori corsi online',
/ sym_document AS SYMBOL, 'Impara SAP oggi'.
Construcciones lógicas IF, ELSE, WHILE, DO, CASE
ABAP permite trabajar con construcciones condicionales y bucles utilizando instrucciones como IF, ELSE, WHILE, DO, CASE, etc.
Empecemos por la expresión condicional IF. La estructura es:
IF <condicion>.
" operaciones
ENDIF.
La condición suele ser una comparación. Además de operadores matemáticos, existen operadores para trabajar con texto. Por ejemplo, CS (contains string) comprueba si una cadena está contenida en otra. Si quieres que la búsqueda no dependa de mayúsculas/minúsculas, lo más seguro es normalizar el texto con TRANSLATE.
Ejemplo práctico:
DATA str_curso_sap TYPE c LENGTH 100
VALUE 'FormacionSAP - los mejores cursos de SAP en internet!!!'.
DATA str_busqueda TYPE c LENGTH 20 VALUE 'curso'.
DATA str_aux TYPE c LENGTH 100.
str_aux = str_curso_sap.
TRANSLATE str_aux TO LOWER CASE.
TRANSLATE str_busqueda TO LOWER CASE.
IF str_aux CS str_busqueda.
WRITE str_curso_sap.
ENDIF.
La construcción IF puede ampliarse con ELSE y ELSEIF.
Con ELSE añadimos comandos a ejecutar si la condición es falsa:
DATA str_corso_sap TYPE c LENGTH 100
VALUE 'CorsoSAP - i migliori corsi SAP in Italiano!!!'.
IF str_corso_sap CS 'banana'.
WRITE str_corso_sap.
ELSE.
WRITE 'Ciao, sono Grazia'.
ENDIF.
Con ELSEIF podemos comprobar varias condiciones en orden:
DATA str_corso_sap TYPE c LENGTH 100
VALUE 'CorsoSAP - i migliori corsi SAP in Italiano!!!'.
IF str_corso_sap CS 'Mela'.
WRITE 'Mela'.
ELSEIF str_corso_sap CS 'Pera'.
WRITE 'Pera'.
ELSEIF str_corso_sap CS 'SAP'.
WRITE 'Banana'.
ENDIF.
Por supuesto, también se pueden utilizar operadores matemáticos. Los más comunes son =, <>, <, >, <=, >=.
Ejemplo práctico:
DATA: va_test_1 TYPE i VALUE 10,
va_test_2 TYPE i VALUE 10,
va_test_3 TYPE i VALUE 50.
IF va_test_1 = va_test_2.
WRITE 'Uguali'.
ELSE.
WRITE 'Diversi'.
ENDIF.
Ahora añadimos una segunda condición con AND. Ambas condiciones deben ser verdaderas:
IF va_test_1 = va_test_2 AND va_test_2 > va_test_3.
WRITE 'Vero'.
ELSE.
WRITE 'Falso'.
ENDIF.
El comando WHILE ejecuta un bloque mientras la condición sea verdadera. Veamos un ejemplo con la serie de Fibonacci, devolviendo números menores de 1000:
DATA: variabile_1 TYPE i VALUE 1,
variabile_2 TYPE i VALUE 1,
variabile_3 TYPE i VALUE 0.
WRITE: / 'Numero de Fibonacci=', variabile_1.
WHILE variabile_3 < 1000.
variabile_3 = variabile_1 + variabile_2.
variabile_1 = variabile_2.
variabile_2 = variabile_3.
WRITE: / 'Numero de Fibonacci=', variabile_1.
ENDWHILE.
Con DO, en cambio, repetimos un bloque un número fijo de veces. Por ejemplo, 21 iteraciones:
DATA: variabile_1 TYPE i VALUE 1,
variabile_2 TYPE i VALUE 1,
fibonacci TYPE i.
WRITE: / 'Numero de Fibonacci=', variabile_1.
DO 21 TIMES.
fibonacci = variabile_1 + variabile_2.
variabile_1 = variabile_2.
variabile_2 = fibonacci.
WRITE: / 'Numero de Fibonacci=', variabile_1.
ENDDO.
Por último, CASE permite gestionar varios casos posibles. En cuanto ABAP encuentra un caso verdadero, ejecuta ese bloque y sale del CASE (cerrado por ENDCASE):
DATA altezza TYPE i VALUE 165.
CASE altezza.
WHEN 150.
WRITE 'Mido 150 cm'.
WHEN 155.
WRITE 'Mido 155 cm'.
WHEN 160.
WRITE 'Mido 160 cm'.
WHEN 165.
WRITE 'Mido 165 cm'.
WHEN 170.
WRITE 'Mido 170 cm'.
WHEN OTHERS.
WRITE 'Altura incorrecta'.
ENDCASE.
Recuerda que ABAP lee los casos de arriba abajo y ejecuta el primero que encaje. Por eso, si repites el mismo WHEN, solo se ejecutará el primero (en código real, no se repite):
DATA altezza TYPE i VALUE 165.
CASE altezza.
WHEN 160.
WRITE 'Mido 160 cm'.
WHEN 165.
WRITE 'Mido 165 cm'.
WHEN 165.
WRITE 'ABAP ignorará esta línea'.
WHEN OTHERS.
WRITE 'Altura incorrecta'.
ENDCASE.
Manipulación de cadenas de caracteres (strings)
Veamos ahora algunos comandos útiles para manipular cadenas alfanuméricas.
En el código de abajo, definimos tres cadenas: una con mayúsculas/minúsculas mezcladas, otra en minúsculas que queremos en mayúsculas, y otra con muchos espacios que queremos “limpiar”.
Usamos TRANSLATE ... TO UPPER/LOWER CASE para cambiar el caso, y CONDENSE para reducir espacios.
DATA: str_testo_scritto_male TYPE c LENGTH 100 VALUE 'TesTo ScriTTo MAle',
str_testo_minuscolo TYPE c LENGTH 100 VALUE 'ero tutto minuscolo',
str_parole_staccate TYPE c LENGTH 100 VALUE 'Parole molto staccate'.
TRANSLATE str_testo_scritto_male TO LOWER CASE.
TRANSLATE str_testo_minuscolo TO UPPER CASE.
CONDENSE str_parole_staccate.
WRITE: str_testo_scritto_male,
/ str_testo_minuscolo,
/ str_parole_staccate.
Si quieres unir palabras eliminando todos los espacios, puedes usar NO-GAPS:
CONDENSE str_parole_staccate NO-GAPS.
Para contar caracteres, puedes usar strlen( ):
DATA: str_contami TYPE c LENGTH 100 VALUE 'Quanti caratteri ci sono in questa frase?',
va_caratteri_contati TYPE i.
va_caratteri_contati = strlen( str_contami ).
WRITE: / va_caratteri_contati.
Para buscar una palabra dentro de una cadena puedes usar SEARCH ... FOR ... y comprobar sy-subrc:
DATA: str_stringa_di_testo TYPE c LENGTH 100 VALUE 'La parola che cerco è CORSOSAP',
str_parola_cercata TYPE c LENGTH 10 VALUE 'CORSOSAP'.
SEARCH str_stringa_di_testo FOR str_parola_cercata.
IF sy-subrc = 0.
WRITE / 'Ho trovato la parola che cercavi'.
ELSE.
WRITE / 'Mi dispiace, parola non trovata'.
ENDIF.
Y para concatenar cadenas, usamos CONCATENATE ... INTO ... SEPARATED BY ...:
DATA: stringa_1 TYPE c LENGTH 100 VALUE 'CorsoSAP: formazione',
stringa_2 TYPE c LENGTH 100 VALUE 'online in Italiano.',
stringa_3 TYPE c LENGTH 100 VALUE 'Visita il nostro sito www.CorsoSAP.com',
stringa_concatenata TYPE c LENGTH 300.
CONCATENATE stringa_1 stringa_2 stringa_3
INTO stringa_concatenata
SEPARATED BY space.
WRITE stringa_concatenata.
Comentarios sobre el código
Los comentarios sirven para explicar a otras personas qué pretendíamos hacer con el código y por qué tomamos ciertas decisiones. Son especialmente útiles cuando varias personas trabajan juntas en el mismo programa.
Hay dos formas habituales de añadir comentarios.
La primera es insertar un asterisco * al principio de una línea para convertir toda la línea en un comentario:
****************************************************************
*&-------------------------------------------------------------*
*& Algunas líneas de código en ABAP para explicar comandos *
*& *
*& Autor : www.FormacionSAP.com *
*& SAP explicado fácilmente *
*&-------------------------------------------------------------*
****************************************************************
La segunda es insertar una comilla doble " en medio de la línea para que lo que sigue sea un comentario en línea:
WRITE 'Trabajar con SAP es genial'. "aunque a veces sea complicado entender su funcionamiento
Esta línea solo devolverá el texto Trabajar con SAP es genial.