# ABAP

ABAP (Advanced Business Application Programming) es un lenguaje de cuarta generación, propiedad de SAP, que se utiliza para programar la mayoría de sus productos (R/3, mySAP Business suite...). Utiliza sentencias de Open SQL para conectarse con prácticamente cualquier base de datos. Cuenta con miles de funciones para el manejo de archivos, bases de datos, fechas, etc. Permite conexiones RFC (Remote Function Calls) para conectar a los sistemas SAP con cualquier otro sistema o lenguaje de programación.
SAP suministra una instalación limitada de R/3 llamada MiniSAP para la práctica de la programación en ABAP. MiniSap ha sido reemplazado por SAP NetWeaver 7.03 Trial Versión

## Historia

ABAP fue desarrollado por SAP como lenguaje de informes para SAP R/2, en los años 80, una plataforma que permitía a las grandes corporaciones construir aplicaciones de negocios para gestión de materiales y finanzas. ABAP, muy parecido al COBOL en sus orígenes, originalmente significaba Allgemeiner Berichtsaufbereitungsprozessor, palabras alemanas para procesador genérico para la preparación de informes. En sus inicios ABAP incluía el concepto de Bases de datos lógicas, que suministraba un alto nivel de abstracción para el acceso a bases de datos.
ABAP fue pensado como un lenguaje de programación para que los usuarios finales pudieran manipular la información, pero el 4GL se fue volviendo demasiado complicado para usuarios normales, por lo que es necesario programadores experimentados para realizar desarrollos.
ABAP se mantuvo como el lenguaje de desarrollo para la siguiente versión cliente-servidor de SAP R/3, que fue lanzada al mercado en 1992, en el que casi todo el sistema, menos las llamadas al sistema básicas estaban escritas en ABAP. En 1999, con el lanzamiento de la versión 4.6 de R/3, SAP lanzó una extensión orientada a objetos denominada ABAP Objects. La versión más actual en estos momentos de SAP es la release 6.6.
La última plataforma de desarrollo de SAP, NetWeaver, soporta ABAP y Java como lenguajes de programación.

## Transacciones

Una transacción en terminología SAP es la ejecución de un programa. La forma normal de ejecutar código ABAP en el sistema SAP es ingresando un código de transacción (por ejemplo, VA01 es el código de transacción para “Crear Órdenes de Venta”). Las Transacciones pueden ser llamadas a través de menús definidos por el sistema, especificados por el usuario o basados en roles. También pueden ser invocados mediante el ingreso del código de transacción directamente en el campo de comandos, el cual está presente en todas las pantallas SAP. Las transacciones también pueden ser invocadas por código mediante las sentencias ABAP “CALL TRANSACTION” y “LEAVE TO TRANSACTION”. El término “transacción” no debe ser mal interpretado, en el contexto aquí descrito una transacción simplemente significa el llamado a la ejecución de un programa. En otros contextos de programación, “transacción” se refiere a menudo a una operación indivisible sobre datos. Este último concepto también existe en SAP y es llamado LUW (Logical Unit of Work) . En el transcurso de una transacción (ejecución de un programa), puede haber diferentes LUWs.
ABAP es un lenguaje de programación lógicamente sobre la plataforma de SAP. Se recomienda instalar SAP ECC, en la modalidad de tres capas, server-presentation-database. La academia ABAP es muy recomendada para aquellos que sean apasionados de la programación en SAP, ya que lo anteriormente comentando es sólo una pequeña parte de lo que puede abarcar el sistema SAP.

## Tipos de programas ABAP

Como en otros lenguajes de programación, un programa ABAP no es simplemente una unidad ejecutable o una biblioteca, sino que proporciona código ejecutable para otros programas no ejecutado independientemente.
ABAP distingue entre dos tipos de programas:
* Informes
* Module pool
Los informes siguen un modelos de programación relativamente simple, donde el usuario introduce una serie de parámetros y el programa los usa para producir un informe en forma de lista interactiva. El término informe puede llevar a equívoco puesto que los informes pueden ser diseñados para modificar datos, la razón por la que estos programas se llaman informes es la “lista-orientada” que estos producen como salida.
Los module pools definen unos patrones más complejos de interacción con el usuario a través de una colección de pantallas. El término “pantalla” se refiere a la actualidad, la imagen física que los usuarios pueden ver. Cada pantalla también tienen un “flujo lógico”, el cual se refiere a código implícito de ABAP invocado por las pantallas. Cada pantalla tiene su propio flujo lógico, el cual se divide en “PBO”(Process Before Output) y PAI (Process after Input). En la documentación de SAP el término “dynpro” (programa dinámico) se refiere a la combinación entre las pantallas y el flujo lógico.
Los tipos de programas no ejecutables son:
* INCLUDE modules
* Subroutine pools
* Function groups
* Object clases
* Interfaces
* Type pools
Un Include module incluye en tiempo de generación en la unidad de llamada; esto es usado en ocasiones para subdividir programas muy largos. Subroutine pools contienen subrutinas ABAP (bloques de código cerrados por FORM/ENDFORM e invocados por PERFORM). Las Functions groups son librerías de módulos de funciones(encerradas entre FUNCTION/ENDFUNCTION e invocadas por CALL FUNCTION). Los object clases e interfaces son similares a las clases e interfaces de java; las primeras definen una serie de métodos y atributos y las segundas contienen la definición de los métodos, para cada una de las clases implementadas se debe ofrecer el código de la misma. Las Type pools definen una colección de datos, tipos y constantes.

## Plataforma de trabajo de ABAP

La plataforma de trabajo de ABAP contiene diferentes herramientas para la edición de programas. La más importante son(Los códigos de transacción aparecen entre paréntesis):
* Editor para escribir informes, module pools, includes y subroutine pools (SE38)
* Diccionario de base de datos para el procesamiento de las definiciones de tabla y recuperar tipos globales.(SE11)
* Menú Painter para el diseño de la interfaz de usuario (barras de menú, de aplicaciones, asignación de teclas)(SE41)
* Screen Painter para diseñar pantallas y flujos lógicos(SE51)
* Constructor de funciones para los módulos de funciones(SE37)
* Constructor de clases para las clases de objetos de ABAP e interfaces(SE24)
El navegador de objetos(SE80) proporciona una interfaz integrada simple para todas estas herramientas.

## Diccionario ABAP

El diccionario ABAP contiene todos los metadatos acerca del sistema SAP. Está muy ligado con la plataforma de trabajo de ABAP en el que cualquier referencia a los datos se obtiene del diccionario (por ejemplo, tablas, vistas, tipos de datos ). Los desarrolladores usan el diccionario de transacciones de ABAP (directamente o a través del objeto navegador dentro de la plataforma de trabajo SE80) para mostrar y mantener los metadatos.
Cuando un objeto del diccionario es modificado, un programa que lo referencie automáticamente cambia su referencia al nuevo estado del objeto la próxima vez que se ejecute. Ya que ABAP es interpretado, no es necesario recompilar programas que referencien a objetos que se modifiquen dentro del diccionario
A continuación una breve descripción de los tipos de datos más importantes del diccionario:
* Tablas: son contenedores de datos que existen en la base de datos relacional subyacente. En la mayoría de los casos hay una relación 1 a 1 entre la definición de la tabla en el diccionario ABAP y la definición de la misma tabla en la base de datos(mismo nombre, mismas columnas…). Estas tablas se conocen como “transparentes”. Hay dos tipos de tablas no transparentes: “pooled”, que son las que existen como entidades independientes dentro del diccionario pero que se agrupan juntas en una largas tablas físicas (“pools”) a nivel de base de datos. Las tablas combinadas son normalmente pequeñas tablas que mantienen por ejemplo datos de configuración. Las tablas clustered están físicamente agrupadas en clusters, basados en claves primarias;.
* Índices, proporcionan accesos rápidos a los datos de las tablas para aquella selecciones usadas con mayor frecuencia. Todas las tablas de SAP tienen un índice primario, el cual se crea implícitamente a lo largo de que la tabla es usada forzando así que estos sean únicos, otros índices tienen que definirse y se llaman: “índices secundarios”
* Vistas: tienen el mismo propósito que en la base de datos subyacente: estas definen un subconjunto de columnas desde una o más tablas usando condiciones join. Una vista es una tabla virtual que no contiene ningún dato físicamente. Ocupan muy poco espacio puesto que solo contienen la definición del dato.
* Estructuras: son tipos de datos complejos que contienen varios campos(como los strutct en C/C++)
* Elementos de datos: proporcionan contenido semántico a una tabla o campo estructurado. Por ejemplo, una docena de tablas y estructuras pueden contener un campo que da un precio. Todos estos campos pueden tener el mismo elemento “PRECIO”.
* Dominios: definen las características estructurales de los elementos anteriormente mencionados. Por ejemplo, el elemento “precio” puede poseer un dominio que lo define como un campo numérico con dos decimales. Los dominios también pueden proporcionar contenido semántico proporcionando una posible lista de valores.
* Búsquedas de ayuda: proporciona una estrategia de búsqueda avanzada cuando un usuario quiere ver el posible valor que tiene un campo. El runtime de ABAP proporciona asistencia implícita pero dicha ayuda puede refinar esta funcionalidad
* Objetos bloqueados implementan bloqueos a nivel de aplicación cuando se modifican datos.

## Sintaxis

Una breve descripción acerca de la sintaxis de ABAP comienza inevitablemente por el conocido “Hola mundo”

### "Hola Mundo"

Este ejemplo contiene dos declaraciones: REPORT y WRITE. El programa muestra una lista en pantalla. En este caso, la lista consiste en una simple línea donde pondrá “Hola Mundo”. La declaración REPORT indica que este programa es un informe. Alternativamente se podría usar PROGRAM para los ‘module pool’

### Dando formato a las reglas

El formato básico de las reglas ABAP es simple:
* cada declaración ABAP debe terminar en un punto
* Los elementos dentro de cada declaración deben estar separados por lo menos por un espacio
* El final de línea es equivalente al espacio
* las declaraciones y palabras clave no distinguen entre mayúsculas y minúsculas
Para asegurar que un código sea legible, el editor de ABAP proporciona una pequeña función de edición, que se encarga de colocar correctamente el sangrado. Esta también ofrece la posibilidad de escoger entre algunos modelos estandarizados acerca de las mayúsculas (por ejemplo todo mayúsculas, todo minúsculas, mayúsculas para declaraciones y palabras clave… etc.).
Si un texto en una declaración ABAP ocupa más de una línea, podemos usar el carácter & para combinar la sucesión de las mismas como si fuera una sola.
La regla de que los elementos deben estar separados al menos por un espacio, incluye también a los paréntesis, operadores y otros símbolos, por ejemplo el siguiente código sería incorrecto:
Los nombres de las variables (A,B,C,X) son constantes numéricas, los operadores "=", "+" y "-" y el paréntesis deben estar delimitados por un espacio en blanco. La forma correcta sería:

### Declaraciones encadenadas

Declaraciones consecutivas que posean una idéntica primera parte, se pueden combinar en una declaración “encadenada” usando el operador de cadenas “:”. La parte común de las declaraciones se escribe a la izquierda de los dos puntos y las diferentes a la derecha separadas por comas. El operador dos puntos está unido directamente con el elemento anterior, sin un espacio. El encadenamiento se usa normalmente con WRITE. Este acepta solo un argumento, con el operador dos puntos podremos encadenar por ejemplo 3 campos.
Encadenar los campos hace que el código sea más legible y tenga una forma más intuitiva
En una declaración encadenada, la primera parte no se limita al nombre del comando sólo. Toda la parte común de las declaraciones se pueden colocar antes de los dos puntos. Por ejemplo:
Se puede reescribir como:

### Comentarios

ABAP posee dos formas de definir comentarios:
* Un asterisco a la izquierda de la línea hace que toda la línea sea un comentario
* Las doble comillas en cualquier lugar en una línea hace que el resto de la misma se convierta en un comentario

### Espacios

El lenguaje ABAP es sensible a los espacios en blanco.
La sentencia anterior asigna a x la subcadena de caracteres de la variable a, empezando desde la posición b hasta completar una subcadena de c caracteres, donde x y a son cadenas de caracteres, mientras que b y c son números enteros.
Sin embargo, si añadimos espacios de por medio a la misma expresión, hace algo completamente diferente, como podemos ver a continuación:
La sentencia anterior asigna a la variable x la suma de la variable a y el resultado de llamar al método b pasándole el parámetro c.

## Variables y tipos de datos

ABAP proporciona un conjunto de tipos de datos de serie. Además, cada estructura, tabla, vista o elemento definido en el diccionario de ABAP puede ser usado como tipo de variable. También las interfaces y las clases de objetos.
| Tipo | Descripción |
| I | Entero (4-bytes) |
| P | decimal |
| F | punto flotante |
| N | carácter numérico |
| C | carácter |
| D | fecha |
| T | tiempo |
| X | Hexadecimal (raw byte) |
| STRING | Cadena de caracteres |
| XSTRING | Variable-length raw byte array |
Las variables y constantes del tipo D contienen un número de días desde el 1 de enero de año 1. Las variables de tipo T contienen el número de segundos desde media noche. Una característica especial de estos tipo es que se puede acceder a ellos como enteros y como cadenas de caracteres(poseen el formato interno “YYYYMMDD” para los tipo fecha y “hhmmss” para las variables de tipo T) lo que hace que sea muy sencillo manejar fechas. Por ejemplo el código a continuación calcula el último día del mes anterior.
Todas las variables en ABAP tienen que declararse explícitamente para que puedan usarse. Normalmente todas las declaraciones se colocan en la parte superior del código antes de la primera sentencia de ejecución; este lugar es por convención no una regla de sintaxis. La declaración consiste en el nombre, tipo, longitud(cuando corresponda), modificadores adicionales (como número de decimales) y el valor inicial de la variable:
Recuerde usar los dos puntos para encadenar sentencias.

## Bibliografía recomendada

* Hijón Neira, Raquel (2005): Programación en ABAP/4 para SAP R/3. Editorial: Universidad Pontificia Comillas (ICAI-ICADE), Colección Ingeniería.
* Tejada Galindo, Álvaro (2006): El Arte de Programar SAP R/3. Editorial: Lulu Press.
* Tejada Galindo, Álvaro (2008): El Arte de Programar SAP NetWeaver. Editorial: Lulu Press.