ABAP

ABAP
Información sobre la plantilla
50*50
Lenguaje de programación especializado en la gestión de los sistemas de planificación de recursos de las empresas.
CreadorSAP
Fecha de CreaciónAño 1980
Última versión estableABAP OO
Sistemas Operativos compatiblesHP-UX, AIX, Citrix, Linux,OpenVMS, MPE/iX,Windows Server/95/98/NT, IBM OS/400, IBM S/900, Mac OSX/2
LicenciaLicencia SAP
Sitio web
http://abap.es/ Sitio oficial de ABAP

ABAP (Advanced Business Application Programming o Procesador Genérico para la Preparación de Informes). Es un leguaje de programación de cuarta generación. Se utiliza para programar los Sistemas de Planificación de Recursos de una empresa.

Es un lenguaje de programación especializado en la gestión de los sistemas de planificación de recursos de las empresas. Utiliza sentencias de otro lenguaje de programación, el Open SQL para conectar bases de datos. Es un lenguaje 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.

Historia

El ABAP se inventó en los años 80, con este lenguaje se quería conseguir una especie de plataforma que permitiera a las grandes empresas crear aplicaciones para mejorar la gestión de sus negocios.

El ABAP se parecía mucho al Cobol en sus orígenes, se creó para que los usuarios finales lo pudiesen utilizar sin problemas, pero con el tiempo se fue volviendo cada vez más complejo para los usuarios normales, y actualmente solo los programadores expertos pueden usarlo.

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 última plataforma de desarrollo de SAP, NetWeaver, soporta ABAP y Java como lenguajes de programación.

ABAP objects

Extensión orientada a objetos de ABAP, ABAP Objects es un conjunto de sentencias orientadas a objetos que han sido introducidas dentro del lenguaje ABAP. Esta extensión se cementa en el lenguaje ya existente, siendo compatible con él. Se pueden usar objetos en programas existentes, de la misma manera que se pueden usar sentencias ABAP convencionales en programas ABAP orientados a objetos. El resto del lenguaje ABAP está creado desde un principio orientado a una programación estructurada, en la cual los datos se almacenan de manera estructurada en tablas en la base de datos y los programas mediante funciones acceden a estos.

De las funciones a los objetos

ABAP Objects permite definir datos y funciones en clases en lugar de en grupos de funciones. Usando clases, un programa ABAP puede trabajar con cualquier número de instancias (objetos) basados en la misma plantilla. En lugar de cargar en la memoria una única instancia de un grupo de un grupo de funciones implícitamente cuando se llama al módulo de funciones, el programa ABAP ahora puede generar las instancias de la clase explícitamente usando la nueva sentencia ABAP CREATE OBJECT. Cada instancia representa a un único objeto, y se puede acceder a cada una mediante su referencia. La referencia del objeto es lo que permite a un programa ABAP acceder a las interfaces de la instancia.

Clases locales y globales

Las clases en ABAP Objects se pueden declarar bien globalmente o bien localmente. Las clases globales se definen en el generador de clases (transacción SE24) en el ABAP Workbench. Estas clases son almacenadas en class pools en la librería de clases en el Repository R/3. Todos los programas ABAP en un sistema R/3 pueden acceder a las clases globales. Las clases locales se definen en un programa ABAP. Las clases locales y sus interfaces sólo pueden ser invocadas desde el programa en el que se han definido.

Cuando se usa una clase en un programa ABAP el sistema busca primero una clase local con el nombre especificado. Si no encuentra ninguna entonces busca una clase global. A parte de la cuestión de la visibilidad, no hay ninguna diferencia entre usar una clase global o una clase local. Lo que si cambia sensiblemente es la manera en la que una clase local y una clase global son creadas. Si se define una clase que se va a usar en un único programa, normalmente es suficiente con definir aparentemente los componentes visibles de manera que la clase se ajuste al programa. Por otro lado, las clases globales deben estar preparadas para ser usadas en cualquier parte. Esto quiere decir que se tienen que aplicar ciertas restricciones cuando se define la interfaz de una clase global, ya que la clase debe estar preparada para garantizar que cualquier programa que use un objeto de esa clase reconozca el tipo de datos de cada parámetro de la interfaz.

Definición de las clases locales

Las clases locales son el conjunto de sentencias que están entre las sentencias CLASS… y ENDCLASS.

Una definición completa de una clase constará de una parte declarativa en la que se definen los componentes, y si es necesario una parte de implementación en la que se implementan estos componentes. La parte declarativa de una clase está comprendida entre las sentencias:

CLASS <class> DEFINITION. … ENDCLASS.

Componentes de las clases

En ABAP Obejcts, las clases pueden definir los siguientes componentes (debido a que todos los componentes que se pueden declarar en las clases también pueden ser declarados en las interfaces, las siguientes descripciones se aplican de la misma manera a las interfaces:

Atributos

Los atributos son los campos de datos internos de una clase y pueden tener cualquier tipo de datos ABAP. El estado de un objeto viene determinado por el contenido de sus atributos. Un tipo de atributos son las variables referenciadas. Estas variables permiten crear y acceder a los objetos, de manera que si se definen en una clase permiten acceder a otros objetos desde dentro de la clase.

  • Atributos dependientes de instancia: El contenido de estos atributos es específico de cada objeto. Se declaran usando la sentencia DATA.
  • Atributos estáticos: El contenido de los atributos estáticos define el estado de la clase y es válido para todas las instancias la clase. Los atributos estáticos existen sólo una vez para la clase. Se declaran usando la sentencia CLASS-DATA. Son accesibles desde todo el entorno de ejecución de la clase. Todos los objetos de una clase pueden acceder a sus atributos estáticos. Si se cambia un atributo estático en un objeto, el cambio es visible en todos los demás objetos de la clase.

Métodos

Los métodos son procedimientos internos de una clase que definen el comportamiento de un objeto. Los métodos pueden acceder a todos los atributos de una clase. Esto les permite cambiar el contenido de los atributos de un objeto. Los métodos poseen también una interfaz con parámetros que les permite recibir valores cuando son invocados y devolver valores después de la llamada. Los atributos privados de una clase sólo pueden ser cambiados por métodos de la misma clase.

La definición y la interfaz de un método son similares a las de los módulos de funciones. Un método se define en la parte declarativa de la clase y se implementa en la parte de implementación usando las sentencias:

METHOD<meth>. ....... ENDMETHOD.

Eventos

Los objetos o las clases pueden usar eventos para desencadenar un tipo de métodos en otros objetos o clases. Estos métodos se llaman métodos que manejan eventos (event handler methods)

En una llamada normal a un método, el método puede ser llamado por cualquier número de usuarios. Cuando un evento es desencadenado, cualquier número de estos métodos puede ser llamado. La unión ente el disparador del evento (trigger) y el manejador del evento (handler) no es establecida de antemano, si no en el entorno de ejecución. En las llamadas normales a métodos, el programa que llama determina los métodos a los que quiere llamar. Estos métodos tienen que existir. El manejador de eventos determina los eventos a los cuales tiene que reaccionar. No tiene porque existir un método manejador de eventos registrado para cada evento. Los eventos de una clase pueden ser desencadenados en los métodos de la misma clase usando la sentencia RAISE EVENT.

Un método de la misma o de diferente clase, se declara como método manejador de eventos utilizando la adición FOR EVENT <evt> OF <class>. Los eventos tienen una interfaz de parámetros similar a la de los métodos, pero sólo tienen parámetros de salida. Los parámetros son pasados por el disparador (sentencia RAISE EVENT) al método manejador de eventos el cual los recibe como parámetros de entrada.

El vínculo de unión entre el disparador y el manejador (trigger y handler) es establecido dinámicamente en el programa usando la sentencia SET HANDLER. El disparador y el manejador pueden ser objetos o clases, dependiendo de si tenemos eventos dependientes de instancia o eventos estáticos y métodos manejadores de eventos. Cuando un evento es disparado, el correspondiente método manejador de eventos es ejecutado en todas las clases registradas para ese manejador.

Existen dos tipos de eventos:

  • Eventos dependientes de instancia: Se declaran con la sentencia EVENTS. Sólo pueden ser desencadenados en un método dependiente de instancia.
  • Eventos estáticos o independientes de instancia: Se declaran con la sentencia CLASS-EVENTS.

Todos los métodos (dependientes de instancia y estáticos) pueden desencadenar eventos estáticos.Los eventos estáticos son el único tipo de eventos que puede ser desencadenado por un método estático.

Tipos

Se pueden definir tipos de datos ABAP dentro de una clase con la sentencia TYPES. Los tipos de datos no son específicos de cada instancia y existen una sola vez para todos los objetos de la clase.

  • Constantes

Las constantes son un tipo especial de atributos estáticos. Su valor se fija cuando son declaradas y no puede ser cambiado. Se declaran usando la sentencia CONSTANTS. Las constantes existen sólo una vez para todos los objetos de la clase.

  • Encapsulación

Las tres áreas de visibilidad son la base de una de las más importantes características de la orientación a objetos, la encapsulación. Cuando se define una clase hay que tener mucho cuidado en el diseño de los componentes públicos, intentando declarar tan pocos como sea posible. Los componentes públicos de las clases globales no pueden ser cambiados una vez que se ha liberado la clase.

Por ejemplo, los atributos públicos son visibles externamente, y forman parte de la interfaz entre un objeto y sus usuarios. Si se quiere encapsular el estado de un objeto completamente no se tiene que declarar ningún atributo público. Además de definir la visibilidad de un atributo, se puede proteger también de los cambios usando la adición READ-ONLY.

Utilización de los objetos

Objetos

Los objetos son instancias de las clases. Cada objeto tiene una identidad propia y tiene sus propios atributos. Todos los objetos transitorios residen en el contexto de una sesión interna (área de memoria de un programa ABAP). Una clase puede tener un número indefinido de objetos (instancias).

Referencias a objeto

Las referencias a objeto se usan para acceder a un objeto desde un programa ABAP. Las referencias a objeto son punteros a los objetos. En ABAP los objetos están siempre contenidos en variables referenciadas.

Las variables referenciadas o bien contienen el valor ‘initial’ o bien contienen la referencia a un objeto ya existente. La identidad de un objeto depende de su referencia. Una variable referenciada que apunta a un objeto es la que conoce la identidad del objeto. Los usuarios no pueden acceder a la identidad del objeto directamente. Las variables referenciadas en ABAP son tratadas como cualquier otro objeto de datos elemental. Esto quiere decir que una variable referenciada puede contener una tabla interna o una estructura.

ABAP contiene un tipo de datos predefinido para las referencias, comparable a los tipos de datos para las estructuras o para las tablas internas. El tipo de datos completo no está definido hasta la declaración en el programa ABAP. El tipo de datos de la variable referenciada determina como el programa actúa con su valor, o sea, con la referencia al objeto. Hay dos tipos principales de referencias, la referencia a clases y la referencia a interfaces (se verá mas adelante).

Las referencias a clases se definen usando la siguiente adición: TYPE REF TO <class>.: Esta adición se usa en las sentencias TYPES o DATA. Una variable referenciada de este tipo se llama variable referenciada a clase o referencia a clase simplemente. Una referencia a clase <cref> permite al usuario crear una instancia, o sea un objeto, de la clase y acceder a un componente visible de la siguiente manera: cref->comp

Herencia

La herencia permite crear una nueva clase a partir de una nueva existente heredando la nueva clase sus propiedades. Esto se realiza añadiendo la adición INHERITING FROM a la sentencia de definición de la clase:

CLASS <subclass> DEFINITION INHERITING FROM <superclass>.

La nueva clase <subclass> hereda todos los componentes de la clase ya existente <superclase>.

La nueva clase se conoce como la subclase de la clase de la que procede. La clase original se conoce como la superclase de la nueva clase. Si no se añade ninguna declaración a la subclase, esta contiene los mismos componentes que la superclase. De cualquier manera, sólo los componentes públicos y privados de la superclase son visibles en la subclase. Aunque los componentes privados de la superclase existen en la subclase, no son visibles.

Se pueden declarar componentes privados en una subclase que tengan los mismos nombres que componentes privados de la superclase. Cada clase trabaja con sus propios componentes privados. Los métodos que una subclase hereda de una superclase usan los atributos privados de la superclase y no ningún componente privado de la subclase con el mismo nombre.

Si la superclase no tiene una sección privada, la subclase es una réplica exacta de la superclase. De todos modos se puede añadir nuevos componentes a la subclase. Esto permite convertir a la subclase en una versión especializada de la superclase. Si una subclase es ella misma una superclase de otras clases, se está introduciendo un nuevo nivel de especialización.

Una clase puede tener más de una subclase de las cuales es superclase, pero sólo puede tener una superclase de la cual es subclase. Esto se conoce como herencia simple, en contraposición con la herencia múltiple donde una clase hereda de varias superclases. Cuando una subclase hereda de una superclase que a su vez hereda de otra superclase de la cual es subclase, se forma una estructura de árbol en la cual el grado de especialización aumenta con cada nivel jerárquico que se añada. A la inversa, las clases se hacen más generales hasta que se alcanza el nodo raíz del árbol de herencia. El nodo raíz de todos los árboles de herencia en ABAP Objects es la clase predefinida vacía OBJECT.

Esta es la más general de todas las clases posibles ya que no contiene ni atributos ni métodos. Cuando se define una nueva clase no se tiene que especificar explícitamente esta clase como superclase, esta relación está definida implícitamente. Dentro de un árbol de herencia, dos nodos adyacentes son la superclase y la subclase directamente uno de otro. Las declaraciones de componentes en una subclase están distribuidas a través de todos los niveles superiores en el árbol de herencia.

Clases y métodos abstractos

Las adiciones ABSTRACT y FINAL en las sentencias METHODS y CLASS permiten definir métodos o clases abstractos y finales. Un método abstracto se define en una clase abstracta y no puede ser implementado en esa clase, tiene que ser implementado en una subclase de la clase. Las clases abstractas no pueden ser instanciadas. Un método final no puede ser redefinido en una subclase. Las clases finales no pueden tener subclases, son las que finalizan el árbol de herencia.

Interfaces

Las clases, sus instancias (los objetos) y el acceso a los objetos usando variables referenciadas son la base de la programación orientada a objetos en ABAP. Además, hay veces en las que es necesario para clases similares proporcionar funcionalidades similares pero que están codificadas diferentes en cada clase, las cuales dan un punto de contacto común con el usuario.

En ABAP Objects las interfaces son estructuras independientes que se pueden implementar en una clase para extender el ámbito de esa clase. El ámbito específico de una clase viene definido por sus componentes y sus secciones de visibilidad. Por ejemplo, los componentes públicos de una clase definen su ámbito público, ya que todos sus atributos y los parámetros de los métodos pueden ser utilizados por todos los usuarios. Los componentes protegidos de una clase definen su ámbito en lo que se refiere a sus subclases.

Las interfaces extienden el ámbito de una clase añadiendo sus propios componentes a la sección pública. Esto permite a los usuarios acceder a diferentes clases por medio de un punto de contacto común. Las interfaces junto con la herencia proporcionan uno de los pilares básicos del polimorfismo, ya que permiten que un sólo método con una interfaz se comporte distinto en diferentes clases.

Definición de interfaces

Al igual que las clases, las interfaces se pueden definir o bien globalmente en el Repository R/3 o localmente en un programa ABAP. La definición de una interfaz local es el código existente entre las sentencias:

INTERFACE<intf> ....... ENDINTERFACE.

La definición contiene la declaración de todos los componentes (atributos, métodos, eventos) de la interfaz. Se pueden definir los mismos componentes en una interfaz que en una clase. Los componentes de las interfaces no tienen que ser asiganados a ninguna sección de visibilidad ya que automáticamente pertenecen a la sección pública de la clase en la que la interfaz es implementada. Las interfaces no tienen una parte de implementación ya que sus métodos son implementados en la clase que implementa la interfaz.

Implementación de interfaces

A diferencia de las clases, las interfaces no tienen instancias, en vez de eso, las interfaces son implementadas por las clases. Para implementar una interfaz en una clase se usa la sentencia INTERFACES <intf>. en la parte declarativa de la clase. Esta sentencia sólo puede aparecer en la sección pública de la clase.

Cuando se implementa una interfaz en una clase, los componentes de la interface se añaden al resto de componentes de la sección pública. Un componente <icomp> de una interface <intf> puede ser direccionado como si fuese un miembro de la clase bajo el nombre <intf~icomp>. La clase tiene que implementar los métodos de todas las interfaces implementadas en ella. La parte de implementación de la clase debe contener la implementación de cada método de la interface <imeth>:

METHOD<intf~imeth>. .......... ENDMETHOD.

Las interfaces pueden ser implementadas por diferentes clases. Cada una de las clases es ampliada con el mismo conjunto de componentes, aunque los métodos de la interfaz pueden ser implementados de manera distinta en cada clase. Las interfaces permiten usar diferentes clases de una manera uniforme aprovechando las referencias a las interfaces (polimorfismo). Por ejemplo, las interfaces implementadas en diferentes clases amplían el ámbito público de cada clase en el mismo conjunto de componentes. Si la clase no tiene ningún componente público específico de ella misma entonces la interfaz describe completamente el ámbito público de la clase.

Disparar y manejar eventos

En ABAP Objects hay ciertos métodos que se conocen como disparadores (triggers) y otros que se conocen como manejadores (handlers). Los triggers son los métodos que disparan un evento, mientras que los handlers son los métodos que se ejecutan cuando ocurre un evento.

  • Eventos disparadores

Para disparar un evento una clase tiene que: − declarar el evento en la parte declarativa. − disparar el evento en uno de sus métodos.

  • Declaración de eventos

Los eventos se declaran en la parte declarativa de una clase o en una interface. Para declarar eventos dependientes de instancia se usa la sentencia: EVENTS <evt> EXPORTING... VALUE(<ei>) TYPE type [OPTIONAL].. Para declarar eventos estáticos se usa la sentencia: CLASS-EVENTS <evt>...

Ambas sentencias tienen la misma sintaxis.

Cuando se declara un evento se puede usar la adición EXPORTING para especificar parámetros que se pasan al manejador del evento. Los parámetros se pasan siempre por valor. Los eventos dependientes de instancia siempre contienen el parámetro implícito SENDER, el cual tiene el tipo de una referencia al tipo o a la interface en la cual el evento es declarado.

ABAP OO

La última versión, ABAP OO, es programación Orientada a Objetos. SAP ejecuta aplicaciones programadas tanto en ABAP como en ABAP OO.

El modelo de negocio de SAP R/3 fue desarrollado antes de que el concepto de programación orientada a objetos estuviera extendido. La transición al modelo orientado a objetos refleja un aumento de la demanda de este modelo por parte de los clientes. ABAP OO usa un modelo único de herencia y soporte completo para características de objetos como encapsulación, polimorfismo y persistencia.

Fuentes

  • Artículo ABAP. Disponible en: “lenguaje-programacion-abap.blogspot.com”. Consultado el 27 de noviembre del 2011
  • Documentación (inglés) Ayuda SAP. Disponible en: “help.sap.com”. Consultado el 28 de noviembre del 2011

Veáse también

  • Artículo Desarrollo ABAP. Disponible en: “sdn.sap.com”. Consultado el 28 de noviembre del 2011
  • Artículo SAP . Disponible en: “mundosap.com”. Consultado el 28 de noviembre del 2011
  • Mundo SAP.Disponible en: “cvosoft.com”. Consultado el 28 de noviembre del 2011
  • Documentación SAP-ABAP castellanoDisponible en: “sap4.com”. Consultado el 28 de noviembre del 2011