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 ayudarle 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 🙂
Indice
Conceptos fundamentales
Un programa en ABAP consiste en un conjunto de “instrucciones” o “sentencias” individuales (en inglés, Statement).
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.
Por ejemplo, en esta línea, la palabra clave es WRITE, que por supuesto 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 para ABAP son idénticos:
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 todas en mayúsculas (por ejemplo, WRITE y no Write o write).
Una instrucción ABAP se compone de operadores (“operators”), operandos (“operands”) o adiciones de palabras clave. La primera palabra de una instrucción ABAP es siempre una palabra clave, mientras que las demás pueden ser operandos, operadores o sumas.
Hay varios tipos de operadores, como:
- Operadores de asignación, que asocian los campos de origen y destino de una asignación (por ejemplo, = o ?=)
- Operadores aritméticos, que asignan dos o más operandos numéricos con una expresión aritmética (por ejemplo, +, -, *)
- Operadores relacionales, que asocian dos operandos con una expresión lógica (por ejemplo, =, <, >), etc.
Los operandos son objetos como datos, tipos de datos, procedimientos, etc.
Las palabras clave son términos ingleses como REPORT, PARAMETERS y WRITE.
Cada palabra clave ABAP tendrá también un número de adiciones (“additions”) que podemos utilizar para modificar la instrucción.
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 suma 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 el código:
PROGRAM test.
WRITE ‘Este es un ejemplo’.
También podría escribirse así:
PROGRAM test. WRITE ‘Este es un ejemplo’ .
O incluso así:
PROGRAM
test.
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 llaman con el comando TYPE seguido de una letra. Por ejemplo, un tipo de datos I es un número entero, un C es una serie de caracteres (es decir, texto), D se utiliza para las fechas, T para la hora, etc. Por ejemplo, si quisiéramos registrar información sobre los empleados, utilizaríamos el TYPE C para el nombre y el TYPE D para la fecha en que empezaron a trabajar en la empresa.
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 una segunda variable para la fecha en la que empezó a trabajar en la empresa:
DATA nombre_empleado(25) TYPE C.
DATA fecha_incorporacion TYPE D.
El 25 entre paréntesis indica la longitud que queremos dar a la variable (hasta 25 caracteres, después será truncada por el sistema). Si no hubiera especificado esto, la longitud estándar habría sido de un carácter.
El comando VALOR se utiliza para asignar un valor a la variable. la sintaxis es
DATA mi_nombre(25) TYPE C VALUE 'Grazia'.
Para el nombre de las variables, podemos utilizar lo que consideremos oportuno. La longitud máxima es de 30 caracteres, y obviamente no podemos utilizar palabras ‘reservadas’ por el sistema (es decir, no podemos llamar a una variable WRITE, por ejemplo).
Si tenemos una lista de variables podemos condensar el código evitando la repetición de la instrucción DATA utilizando dos puntos y comas. Por ejemplo
DATA : nombre_empleado(25) TYPE C,
apellido_empleado(25) TYPE C,
fecha_incorporacion TYPE D.
Otro atajo para escribir código más rápidamente cuando se trabaja con muchas variables que tienen las mismas características es utilizar el comando LIKE.
DATA: variable_1(25) TYPE C ,
variable_2 LIKE variabile_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 considera los caracteres vacíos contenidos en una variable cuando devuelve valores a la pantalla.
Por ejemplo, definamos dos variables de veinticinco caracteres cada una. Observe que para la definición de la segunda variable he utilizado el comando LIKE.
DATA: variabile_1(25) TYPE C VALUE 'Test',
variabile_2 LIKE variabile_1 VALUE 'Prueba'' .
WRITE variabile_1 .
WRITE variabile_2 .
Este es el resultado en la pantalla – ABAP además de los 4 caracteres de la palabra Test también incluyó los 21 caracteres vacíos (es decir, los 25 utilizados para la variabile_1 menos los 4 realmente utilizados):
Test Prueba
¿Qué habría pasado si la variable hubiera sido más larga?
DATA: variabile_1(25) TYPE C VALUE 'Precipitadamentisimisimamente',
variabile_2 LIKE variabile_1 VALUE 'aprendo a utilizar SAP' .
WRITE variabile_1 .
WRITE variabile_2 .
En este caso, la primera variable (que tiene 29 caracteres, 4 más que los 25 que tiene asignados) se corta, es decir, falta un trozo de la frase:
Precipitadamentisimisimament aprendo a utilizar SAP
ABAP no pasa a la siguiente línea por sí mismo. Por ejemplo, este código
DATA: variabile_1(20) TYPE C VALUE 'Si sta come',
variabile_2(20) TYPE C VALUE 'di autunno',
variabile_3(20) TYPE C VALUE 'sugli alberi',
variabile_4(20) TYPE C VALUE 'le foglie'.
WRITE: variabile_1 ,
variabile_2 ,
variabile_3 ,
variabile_4 .
Devuelve
Si sta come di autunno sugli alberi le foglie
(si tienes curiosidad por saber de qué se trata, es un famoso poema italiano)
Para pasar a la siguiente línea, utilice el comando /
DATA: variabile_1(20) TYPE C VALUE 'Si sta come',
variabile_2(20) TYPE C VALUE 'di autunno',
variabile_3(20) TYPE C VALUE 'sugli alberi',
variabile_4(20) TYPE C VALUE 'le foglie'.
WRITE: variabile_1 , /
variabile_2 , /
variabile_3 , /
variabile_4 .
Si sta come
di autunno
sugli alberi
le foglie
Si necesita que el texto destaque, puede utilizar colores con el comando COLOR. Veamos algunos ejemplos:
DATA: variabile_1(20) TYPE C VALUE 'Si sta come',
variabile_2(20) TYPE C VALUE 'di autunno',
variabile_3(20) TYPE C VALUE 'sugli alberi',
variabile_4(20) TYPE C VALUE 'le foglie'.
WRITE: variabile_1 COLOR COL_TOTAL , /
variabile_2 COLOR COL_HEADING , /
variabile_3 COLOR COL_POSITIVE , /
variabile_4 COLOR COL_NEGATIVE.
El poema aparecerá ahora en color en la pantalla:
Si es necesario, también es posible incluir diversos símbolos e iconos en los mensajes. Algunos ejemplos prácticos:
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' .
Resultado en pantalla:
Construcciones lógicas IF, ELSE, WHILE, DO, CASE
ABAP nos permite trabajar con varios tipos de construcciones condicionales y bucles utilizando instrucciones como IF, ELSE, WHILE, etc.
Empecemos por la más clásica, la expresión condicional IF.
La estructura es la siguiente:
IF (condición que debe darse) .
(operaciones a realizar) .
ENDIF .
Si la condición dentro del IF no se produce, el programa pasa al final del bloque y continúa con la siguiente instrucción.
La condición es normalmente una comparación entre caracteres y cadenas. Algunos operadores que se pueden utilizar son:
- CS (Contains String, contiene una cadena). Busca si una cadena está presente. No distingue entre mayúsculas y minúsculas.
- CO (Contains Only, sólo contiene). Es verdadero si los caracteres coinciden (este operador distingue entre mayúsculas y minúsculas).
- CA (Contains Any, contiene cualquiera). Es verdadero si al menos un valor coincide al comparar los dos operandos. Este operando también distingue entre mayúsculas y minúsculas.
Un ejemplo práctico de código sería
DATA str_curso_sap(100) VALUE 'FormacionSAP - los mejores cursos de SAP en internet!!!'.
IF 'str_curso_sap' CS 'curso' .
WRITE: str_curso_sap.
ENDIF .
En la primera línea con el comando DATA defino una variable, que llamo str_curso_sap. He utilizado “str” (“string”) en el nombre para recordar que se trata de una cadena de caracteres y no de un número.
A esta variable con el comando VALUE le di el valor FormacionSAP – los mejores cursos de SAP en internet!!!
El número entre paréntesis (100) es la longitud permitida. Si hubiera utilizado por ejemplo str_curso_sap(7) el programa habría cortado el valor Formaci
A continuación, el programa comprueba si la cadena de signos “curso” aparece en la variable. Al aparecer, el programa devolverá el valor de la variable (comando WRITE: str_corso_sap).
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(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 .
Ahora, como la cadena ‘banana’ no aparece en la variable, SAP devolverá la frase “Ciao, sono Grazia”
Puede utilizar varios bucles IF utilizando el comando ELSEIF. Por ejemplo, con el siguiente código ABAP buscará primero la palabra Mela, luego Pera y finalmente SAP (encontrándola, y devolviendo así ‘Banana’.
DATA str_corso_sap(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:
- = Igual
- <> Diferente
- < Menor
- > Mayor
- <= Menor o igual
- >= Mayor o igual
Veamos un 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_1 .
WRITE: 'Uguali'.
ELSE .
WRITE: 'Diversi'.
ENDIF .
En este fragmento de código, hemos definido tres variables, todas ellas enteras (comando TYPE I). Los dos primeros valen 10 y el tercero 50. El programa comprueba si son idénticos (en cuyo caso escribe “Igual”, como en este ejemplo) o diferentes.
Veamos un segundo ejemplo. Ahora añadimos una segunda condición con el comando AND. Ahora ambas condiciones dentro del comando IF deben ser verdaderas.
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 AND va_test_2 > va_test_3 .
WRITE: 'Vero'.
ELSE .
WRITE: 'Falso'.
ENDIF .
Ahora pedimos que se compruebe que las dos primeras variables son iguales (lo que es cierto) y que la segunda es mayor que la tercera (lo que es falso).
El programa escribirá entonces Falso.
El comando WHILE ejecutará un bloque de comandos hasta que la condición especificada sea verdadera.
Veamos un ejemplo práctico con la serie de Fibonacci (también llamada sección áurea). En esta serie, cada número es la suma de los dos anteriores. Obviamente, la serie es infinita. Por lo tanto, queremos que ABAP devuelva todos los números de Fibonacci menores de 1000.
DATA :
variabile_1 TYPE I VALUE 1,
variabile_2 TYPE I VALUE 1,
variabile_3 TYPE I.
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.
El comando WHILE nos permite ejecutar una serie de operaciones hasta que la variable_3 sea menor que 1000. Después, el programa saldrá del bucle (ENDWHILE).
Resultado en la pantalla:
Número de Fibonacci= 1 Número de Fibonacci= 1
Número de Fibonacci= 2 Número de Fibonacci= 3
Número de Fibonacci= 5 Número de Fibonacci= 8
Número de Fibonacci= 13 Número de Fibonacci= 21
Número de Fibonacci= 34 Número de Fibonacci= 55
Número de Fibonacci= 89 Número de Fibonacci= 144
Número de Fibonacci= 233 Número de Fibonacci= 377
Número Fibonacci= 610 Número Fibonacci= 987
Con el comando DO, en cambio, pedimos a ABAP que repita una serie de instrucciones un determinado número de veces. Podemos adaptar el código del ejemplo anterior haciendo que el programa realice los cálculos 21 veces seguidas (DO 21 TIMES), sin comprobar ninguna condición.
Salimos del bucle con el comando ENDDO.
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.
El resultado será este
Número de Fibonacci= 1 Número de Fibonacci= 1
Número Fibonacci= 2 Número Fibonacci= 3
Número de Fibonacci= 5 Número de Fibonacci= 8
Número de Fibonacci= 13 Número de Fibonacci= 21
Número de Fibonacci= 34 Número de Fibonacci= 55
Número de Fibonacci= 89 Número de Fibonacci= 144
Número de Fibonacci= 233 Número de Fibonacci= 377
Número de Fibonacci= 610 Número de Fibonacci= 987
Número de Fibonacci= 1.597 Número de Fibonacci= 2.584
Número de Fibonacci= 4.181 Número de Fibonacci= 6.765
Número Fibonacci= 10,946 Número Fibonacci= 17,711
Por último, el comando CASE nos permitirá predecir varios casos posibles en el código. En cuanto ABAP ve que se da uno de los casos, ejecuta la instrucción y sale del comando (cerrado por la palabra clave ENDCASE).
En el ejemplo, vemos que se ha declarado la altura (165) en la variable. A ABAP se le ofrecen varias alturas posibles y cadenas para escribir cuando una de las condiciones se hace realidad (WHEN…WRITE).
Si ninguno de los casos es verdadero tenemos el comando WHEN OTHERS.
El código, obviamente, devolverá que mido 165 cm.
DATA :
altezza TYPE I VALUE 165 .
CASE altura .
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.
Recuerde que ABAP leerá las líneas de una en una, y en cuanto se cumpla una condición saldrá del comando. En el siguiente ejemplo seguirá escribiendo “Mido 165 cm”, ignorando todos los comandos posteriores.
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 165.
WRITE 'Y esta también, porque sólo ejecutó el primer WHEN y salió del comando' .
WHEN OTHERS.
WRITE 'Altura incorrecta' .
ENDCASE.
Manipulación de cadenas de caracteres (strings)
Veamos ahora algunos ejemplos de comandos con los que podemos manipular cadenas de caracteres alfanuméricos.
En el código de abajo en las tres primeras líneas hemos definido tres cadenas con varios problemas: la primera está mal escrita (con caracteres en mayúsculas mezclados con minúsculas), la segunda está toda en minúsculas y nos gustaría que estuviera toda en mayúsculas, y la tercera tiene las palabras muy separadas y queremos unirlas.
La solución es el comando TRANSLATE TO UPPER CASE, que cambia todo a mayúsculas, o TRANSLATE TO LOWER CASE, que cambiará todo el texto a minúsculas.
El comando CONDENSE, en cambio, adjuntará las palabras, dejando un espacio entre cada una. Si, por el contrario, quieres que se unan (sin espacios entre palabras) el comando es CONDENSE (la que quieres unir) NO-GAPS.
DATA : str_testo_scritto_male(100) VALUE 'TesTo ScriTTo MAle',
str_testo_minuscolo(100) VALUE 'ero tutto minuscolo' ,
str_parole_staccate(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 .
Este fragmento de código devolverá entonces
testo scritto male
ERO TUTTO MINUSCOLO
Parole molto staccate
Incluso si quiere contar los caracteres, esto se puede hacer rápidamente. En las siguientes líneas puedes ver cómo he definido una cadena y luego una variable auxiliar que utilizaré para poner el número de caracteres de la cadena (que obviamente es un entero, por lo que se define como TYPE I).
En el siguiente paso, finalmente utilicé el comando STRLEN (“string lenght”, o sea longitud de la cadena de caracteres) para contar cuántos caracteres hay y poner este valor en la variable va_characters_counted.
DATA: str_contami(100) VALUE 'Quanti caratteri ci sono in questa frase?' ,
va_caratteri_contati TYPE I .
va_caratteri_contati = STRLEN( str_contami ) .
WRITE: / va_caratteri_contati .
El programa devuelve 41 (por supuesto, contará los espacios en blanco). Cuando utilice el comando STRLEN, recuerde poner los dos espacios en blanco (después del paréntesis de apertura y antes del paréntesis de cierre) o el sistema devolverá un error.
Para buscar una palabra, frase o caracteres dentro de las cadenas de texto puede utilizar este código:
DATA: str_stringa_di_testo(100) VALUE 'La parola che cerco è CORSOSAP' ,
str_parola_cercata(10) VALUE 'CORSOSAP' .
SEARCH str_stringa_di_testo FOR str_parola_cercata .
IF sy-subrc IS 0 .
WRITE / 'Ho trovato la parola che cercavi' .
ELSE.
WRITE / 'Mi dispiace, parola non trovata' .
ENDIF.
Veamos cómo funciona todo junto. Buscamos la palabra CORSOSAP dentro de la cadena de texto. Lo hacemos con el comando SEARCH … FOR … (primero definimos lo que buscamos y luego dónde lo buscamos).
Para que el sistema nos diga si se ha encontrado la palabra utilizamos un bucle IF… ELSE.
La novedad es que introducimos una variable del sistema, sy-subrc. Se trata de un código que será devuelto a ABAP y tendrá un valor de cero si el programa se ejecutó con éxito (y en nuestro caso se encontró la palabra) mientras que tendrá un valor de 4 si no se encuentra la palabra buscada. También podríamos haber escrito el código como IF sy-subrc IS INITIAL (es decir, si tiene el valor inicial, es decir, cero).
La búsqueda en la cadena no distingue entre mayúsculas y minúsculas.
Otro comando que utilizo con mucha frecuencia (no sólo con SAP, sino también con otros programas como Excel) es el comando CONCATENATE, que se utiliza para fusionar varias cadenas en una sola. Aquí también vemos que el código es muy claro y legible: definimos tres variables con textos, una cuarta en la que las fusionamos y utilizamos CONCATENATE…INTO…SEPARATED BY.
SEPARADO POR es una parte opcional del comando. Permite separar las distintas partes, que de otro modo estarían unidas sin espacio. El mismo comando también podría haberse escrito como SEPARATED BY SPACE, ya que SPACE (‘espacio’) es una palabra clave reconocida por ABAP.
Por supuesto, puedes utilizar otros separadores: si quisieras utilizar un guión horizontal, por ejemplo, el comando sería SEPARATED POR ‘-‘ .
DATA : stringa_1(100) VALUE 'CorsoSAP: formazione',
stringa_2(100) VALUE 'online in Italiano.',
stringa_3(100) VALUE 'Visita il nostro sito www.CorsoSAP.com' ,
stringa_concatenata(100) .
CONCATENATE stringa_1 stringa_2 stringa_3 INTO stringa_concatenata SEPARATED BY ' ' .
WRITE stringa_concatenata(100) .
Comentarios sobre el código
Los comentarios del código sirven para explicar a las personas que van a leer nuestro programa cuáles fueron nuestras intenciones al escribirlo y la lógica de ciertos pasos.
Aunque a menudo se dice que “el buen código no necesita comentarios”, yo diría que es una buena idea incluir comentarios, especialmente en situaciones en las que hay varias personas trabajando juntas.
Hay dos formas de añadir comentarios al código. La primera es insertar un asterisco (*) al principio de una línea para convertir toda la línea en un comentario.
Ejemplo práctico:
****************************************************************
*&-------------------------------------------------------------*
*& Algunas líneas de código en ABAP para explicar los comandos*
*& *
*& Autor : www.FormacionSAP.com *
*& SAP explicado fácilmente *
*&-------------------------------------------------------------*
****************************************************************
Este bloque será ignorado por el programa y no será considerado – puedes escribir lo que quieras entre los asteriscos y no será leído.
También puede insertar una doble coma (“) en medio de la línea para que la parte de la línea que sigue a la coma sea un comentario (en este caso, un comentario en línea).
Ejemplo:
WRITE ‘Trabajar con SAP es genial’ . "aunque a veces sea complicado entender su funcionamiento
Esta línea sólo devolverá la frase Trabajar con SAP es genial.