Resume Taw10 3
Resume Taw10 3
Resume Taw10 3
TAW10_3
1
Unidad 1: INTRODUCTIÓN A
OBJECT-ORIENTED
Modelo de programación orietada a objetos
Un function group es una unidad de datos y funciones que gestiona esos datos. El
acceso encapsulado a datos y servicios puede ser soportado en la parte procedural de
ABAP objects. Esto significa que las BAPIs podrían ser implementadas como function
modules y los Business Objects podrían ser implementados como function groups.
2
Los objetos se comportan como sistemas cliente/servidor. Cuando un objeto envía
mensajes a otro objetos, el primer objeto puede ser un cliente y el el otro un servidor. En
principio, los objetos pueden interpretar ambos roles simultáneamente. En POO, los
servicios son distribuidos por los objetos para evitar redundancias y así cada objeto
ofrece exactamente los servicios que están en su área de responsabilidad. Si un objeto
necesita otros servicios, los pide a otros objetos (principio de delegación).
Componentes adicionales:
• Herencia: Consiste en que una clase (subclase) adopta la estructura y
comportamiento de otra clase (superclase), adaptándola y extendiéndola.
• Polimorfismo: Consiste en que instancias de diferentes clases responden de
manera diferente a los mismos mensajes.
• Event control: Los objetos pueden lanzar eventos también. Son mandados
cuando en el momento de desarrollo no se conoce todavía como van a reaccionar
los objetos.
Ventajas de POO:
• Mejor estructura de software y consistencia en el proceso de desarrollo.
• Reduce el esfuerzo de mantenimiento y disminuye la susceptibilidad de
errores.
• Mejor la integración del usuario en el analisis, diseño, y proceso de
mantenimiento.
• Las opciones de extensión del software son más simples y seguras.
Clasificación
Clase es una descripción de un conjunto de objetos con las mismas características y
el mismo comportamiento.
Modelando en UML
UML es un lenguaje global estándar. Es usado para especificación, construcción,
visualización y documentación de modelos de sistemas de software y permitir una
comunicación uniforme entres los usuarios.
3
Describe diferentes diagramas para representar varias vistas de un sistema:
• Class diagrams (Diagrama de clases): Muestra las clases y las relaciones entre
ellas. Describe todas las relaciones estáticas entre las clases, es decir, es una
visión estática de un modelo.
• Behavior diagrams (Diagramas de comportamiento): Ponen particular
atención a la secuencia en la cual los objetos se relacionan entre si.
• Component diagrams (Diagrama de componentes): Muestra la organización
y dependencias de los componentes.
Una clase es representada por un rectángulo con tres apartados: el nombre de la clase,
los atributos y los métodos. Las dos últimas partes pueden ser omitidas.
Los atributos describen los datos que pueden ser almacenados en el objeto de la clase.
Determinan el estado de un objeto.
Los métodos describen las funciones que un objeto puede llevar a cabo. Determinan el
comportamiento de un objeto.
Asociación
Una asociación describe una relación semántica entre clases. La relación específica
entre objetos en estas clases es conocida como object link. Los object links son las
instancias de la asociación.
Cada asociación tiene dos roles: uno para cada dirección de la asociación. Cada rol
puede ser descrito con un association name y tiene una cardinalidad que muestra
cuantas instancias participan en esa relación. El nombre de asociación es escrito en
italics sobre la línea y puede contener una flecha para indicar la dirección de lectura. La
relación puede ser representada más concretamente con una clase especial donde se
describe las características de esta con sus atributos. Se conecta a la línea de asociación
con una línea discontinua.
4
Agregación es una caso especial de asociación donde se muestra que un objeto esta
compuesto por otros objetos. Se representa con un rombo vacío junto a la clase
principal.
Generalización y especialización
Generalización y especialización son indicadas con una flecha triangular, la cual
apunta a la clase más general. Son relaciones bidireccionales.
Object Diagram
Un diagrama de objetos es una “foto” (“snapshot”) tomada durante la ejecución
del programa, que describe las instancias de las clases y las relaciones entre ellas (útil
solo para representar diagramas de clases complejos).
Secuence Diagram
Los diagramas de secuencia muestra los procesos o situaciones, centrándose en el
comportamiento durante el tiempo de secuencia: creación y eliminación de objetos así
como el intercambio de mensajes entre objetos. El object lifeline se representa con
una línea vertical discontinua. Una ‘X’ marca su final. El foco de control se representa
con un rectángulo vertical, y muestra los periodos activos de los objetos: un objeto esta
activa cuando ejecuta una acción, y un objeto esta indirectamente activo cuando esta
esperando al final de un procedimiento. Los mensajes se representan con una línea
horizontal y sobre ella se escribe este. La respuesta se puede representar de varias
maneras, entre ellas, con una línea discontinua.
5
Fundamental Object-Oriented Syntax Elements
La sentencia CLASS no puede ser anidada, eso es, porque no se puede definir una
clase dentro de otra clase.
Nota: sin embargo, si se puede definir una clase auxiliar para clases globales.
Atributos contienen la información que puede ser almacenada en los objetos de una
clase. Los atributos de una clase pueden ser de tres tipos: elementary, structered o
table-type. Estos pueden consistir de tipos de datos o referencias ya sean locales o
globales.
6
En clases, solo puedes usar el TYPE addition para hacer referencias tipos de datos.
Y solo puedes usar el LIKE para referenciar objetos de datos locales.
El READ-ONLY significa que un atributo público que fue declarado con DATA puede
ser leído desde afuera, pero puede ser cambiado por métodos en la misma clase.
Puedes usar solo READ-ONLY en la sección pública (PUBLIC SECTION) de la
declaración de una clase o en la definición de una interface.
Con TYPE REF TO, un atributo puede ser tipificado como cualquier referencia.
Puedes proteger atributos contra accesos desde fuera caracterizándolos como atributos
private. Los componentes private de la clase no pueden ser llamados directamente
desde fuera de la clase. Y no pueden estar visibles para los usuarios de fuera de la
clase.
Los atributos que un usuario puede acceder directamente son los atributos public. Los
componentes públicos de una clase son a veces conocidos colectivamente como class’s
interface.
7
Define los atributos privados en la PRIVATE SECTION de una clase. Y los
atributos públicos en la PUBLIC SECTION.
Por ejemplo, imagine que el MAKE y MODEL son atributos públicos. El riesgo sería
demasiado grande si a un usuario se le olvida rellenar uno de estos dos atributos o
especificar dos atributos inconsistentes. En cambio puedes usar un método público SET
TYPE para asegurarte que los valores son asignados correctamente a ambos
atributos. Un estricto control de sintaxis gobierna todas las llamadas que tienen
parámetros obligatorios de transferencia.
Instance attributes
Son los atributos que existen una sola vez por objeto, es decir, uno por cada
instancia de la clase ejecutada. Estos son definidos con la sintaxis DATA.
Statics attributes
Estos atributos existen una vez para cada clase y son visibles para todas las
instancias de la clase. Estos son definidos con la sintaxis CLASS-DATA.
Static attributes usualmente contienen información que aplica a todas las
instancias, tal como:
• Tipos y constantes
• Buffer de datos
• Información administrativa, tales como contadores
8
Methods son procedimientos internos en una clase que determina el comportamiento
de los objetos. Estos pueden acceder a todos los atributos en su clase y pueden cambiar
el estatus de otros elementos.
Los métodos tienen una signatura (interface de parámetros y excepciones) que los
habilita a recibir valores cuando son llamados y a pasar valores de vuelta a los
programas que los han llamado. Los métodos pueden tener cualquier cantidad de
parámetros IMPORTING, EXPORTING y CHANGING. Todos los parámetros
pueden ser pasados por valor o referencia.
9
Notación UML y secciones de visibilidad
En un diagrama UML se lista el nombre de la clase primero y luego los atributos y los
métodos debajo de ellos. La visibilidad de los componentes de una clase usando UML
es mostrada usando los caracteres + y -: alternativamente público y privado.
UML permite a los fabricantes de las herramientas de modelado crear sus propios
símbolos para visibilidad. Representaciones de características de visibilidad es opcional
y normalmente para modelos que serán implementados.
Independent references son referencias que no han sido definidas dentro de una clase.
Si deseas guardar varios objetos de la misma clase en un programa, puedes definir una
tabla interna que contenga una columna con la referencia de los objetos de esa
clase. Estos objetos pueden ser administrados en la tabla interna con las sentencias
usuales de APPEND, READ o LOOP.
10
Accediendo atributos y métodos.
Llamando métodos
Un objeto que requiere el servicio de otro objeto envía un mensaje a otro objeto
brindando los servicios. El mensaje nombre la operación a ser ejecutada. La
implementación de esta operación es conocida como método.
Por lo tanto, el comportamiento de un objeto es determinado por sus métodos. La firma
de un método también puede ser utilizada para el intercambio de valores.
NO debe haber espacio antes de los paréntesis, pero si debe haber al menos uno
después de ellos.
11
Cuando llamas a un método, y este solo tiene un parámetro de importación, puedes
especificar el parámetro dentro del paréntesis sin otras adiciones. Cuando llamas a un
método que solo importa parámetros, puedes omitir la palabra EXPORTING.
Static methods (también llamados class methods) son llamados usando CALL
METHOD classname=>method_name…
Como los atributos estáticos, los métodos estáticos son diseccionados con el nombre de
su clase, ellos no necesitan instan ciarse.
Functional Methods
Los métodos que tienen un parámetro de RETURNING son descritos como métodos
funcionales. Esto significa que pueden tener parámetros EXPORTING o
CHANGING. El parámetro de RETURNING debe siempre se pasado por la sintaxis
VALUE.
Se puede acceder a atributos externos desde fuera de una clase de la misma manera que
se llama a un método.
Constructores
Hay dos tipos de métodos en ABAP Objects. Estos no son generalmente llamados con
CALL METHOD, mas bien, son llamados implícitamente.
12
• El constructor debe ser definido en el área pública
• La firma del constructor solo puede tener parámetros de importing y
exceptions
• Cuando las exceptions son lanzadas en el constructor, las instancias no son
creadas.
Static Constructor
Self-Reference
Sin embargo, es requerido cuando quieras mostrar la diferencia entre objetos de datos
local y los atributos de instancias con el mismo nombre.
13
Unidad 2: CONCEPTOS DE OBJECT-
ORIENTED Y TÉCNICAS DE
PROGRAMACIÓN
Herencia y Casting
Crear Generalization/Specialization Relationship usando
herencia
Specialization es una relación en la cual una clase (subclass) hereda todas las
características de otra clase (superclass). La subclase puede añadir nuevos componentes
(atributos, métodos…) y reemplazar las implementaciones de métodos heredados.
Características de Generalization/Specialization:
• Los componentes comunes solo existen una vez en la superclase, porque deben
tener una gestión centralizada.
• Los componentes de las superclases están disponibles para las subclases, esto
evita implementaciones redundantes.
• Las subclases contienen extensiones/cambios (“programming by difference”).
• Las subclases son dependientes de la superclase (“white box reuse”).
14
La herencia debe ser usada para implementar generalization y specialization
relationship. Una superclase es una generalización de sus subclases. Las subclases
son especializaciones de sus superclases. En una subclase solo esta permitido
adiciones y cambios, no se puede eliminar nada de una superclase.
La herencia es una relación de uno a muchos, es decir, las subclases reconocen sus
superclases directas pero las superclases no reconocen sus subclases.
Redefining methods
Redefinition es cuando la implementación de un método heredado es cambiada por la
subclase sin cambiar la signatura. La redefinition no es posible sin la PRIVATE
SECTION (creo q public). Cuando se usa redefinition, se debe especificar una nueva
implementación para el método heredado. No es necesario definir los parámetros y
excepciones del método otra vez.
15
Herencia y visibilidad
La herencia provee una extensión del concepto de visibilidad: hay protected component
(PROTECTED SECTION). Se explica a continuación.
Cuando se define clases locales en ABAP Objects, se debe seguir la secuencia sintáctica
siguiente:
• Public section: Puede ser accedido desde fuera por todos los clientes.
• Protected section #: Solo puede ser accedido desde dentro de la clase y las
subclases.
• Private section: Solo puede ser accedido desde dentro, y los métodos no puede
ser accedidos directamente.
Las clases tienen componentes privados, a los que no se puede acceder desde la
subclase directamente aunque los hereden. Solo se puede acceder a los componentes
privados de las superclases indirectamente usando, desde la superclase, public o
protected methods.
Si se asigna una subclass reference a una superclass reference, esto asegura que todos
los componentes que pueden ser accedidos después del cast assignment están
actualmente disponibles en la instancia. La subclass siempre contiene al menos el
mismo número de componentes que la superclase.
16
El narrowing cast assignments se usa normalmente para prepara el acceso genérico.
Por ejemplo: da igual de que tipo sea el vehiculo (coche, camión), lo que importa es que
sea un vehiculo.
Polimorfismo
Cuando objetos de diferentes clases reaccionan de distinta forma con la llamada de
un mismo método, es conocido como polimorfismo. La posibilidad de polimorfismo
es una de las principales ventajas de la herencia.
17
La subclase contiene más componentes que la superclase.
Usando herencia
Se debe ver si hay una generalization/specialization relationship entre ciertas clases. Si
es así, se puede usar la herencia para representarlo.
Ventajas:
• Mantenimiento centralizado.
• Métodos genéricos de acceso.
18
Interfaces y casting
Areas de utilización para interfaces
Las interfaces difieren de la herencia normal en su área de uso. En términos de
programación existen unas grandes diferencias.
Desde un punto de vista técnico, las interfaces son superclases, que no se pueden
instanciar, no contienen una parte de implementación y solo tienen componentes
públicos. Sin embargo, se puede simular la herencia múltiple utilizando las
interfaces.
En ABAP Objects, las interfaces sirven principalmente para definir interfaces uniformes
(protocolos) para servicios. Varias clases pueden ofrecer estos servicios de diferente
manera, pero manteniendo la misma semántica. Las interfaces no contienen
implementación.
19
Comparándola con la herencia común, la distribución de roles es algunas veces
diferente: El usuario generalmente define la interfaces. En las interfaces, el usuario
(quien usa la interface) describe los servicios que quiere que el proveedor ofrezca. Cada
clase puede decidir ahora por si misma si sirve la interface que ofrece actualmente
los servicios definidos. Este caso es parecido a la especialización con subclase.
Como la herencia común, este acceso a servicios es genérico, se utiliza una referencia
que es tipificado en el interface. Se pueden construir polimorfismos con interfaces.
En UML, las interfaces se representan igual que las clases. Sin embargo, además de su
nombre, hay que poner el estereotipo <<interface>>. El uso de una interface se
expresa con una línea discontinua desde quien lo usa al interface. El estereotipo
<<user>> es opcional. Que una clase implementa una interface se representa con línea
discontinua de la clase a la interface.
20
Las clases implementan las interfaces de la siguiente manera:
-El nombre de la interface se lista en la parte de la definición de la clase con la sentencia
INTERFACES. Esto ha de ser en la parte pública, solo pueden ser implementados
públicamente.
-Los métodos de la interface deben ser implementados en la parte de implementación
de la clase.
-Los componentes definidos en la interface pueden ser llamados en la parte de
implementación de la clase.
21
A los componentes de las interfaces solo se pueden acceder usando una referencia de
objeto en la que su clase implementa la interface. Sintacticamente, esto se hace con el
operador ~, como en la implementación de la clase.
Si la clase tiene implementada una interface, es seguro que todos los componentes que
se pueden acceder sintacticamente después del casting, están disponibles en la instancia.
La interface siempre contiene como mínimo los mismos componentes que la clase de
implementación.
22
Un caso típico de uso de narrowing cast es la preparación para acceso genérico. En
el ejemplo de arriba (LCL_TRAVEL_AGENCY) necesita manejar varios tipos de
negocios en una sola lista. El tipo de linea de la tabla interna, tiene que ser tipificado
como una referencia a la interface LIF_PARTNER.
Objetos de diferentes clases(hotel, rental y carrier) pueden mantener una tabla interna,
tipificado con referencias a la interface (LIF_PARTNER). Los componentes definidos
en la interface pueden ser después accedidos uniformemente.
23
El tipo dinámico de la variable de referencia se utiliza para buscar la
implementación del método. En el ejemplo anterior, r_partner->display_partner() ,
utiliza la clase de la instancia en la que r_partner para buscar la implementación de
display_partner.
Cuando los objetos de diferentes clases reaccionan al mismo método, se conoce como
polimorfismo.
24
Jerarquía de interfaces
Se ha visto varias veces que una implementación de interface se parece mucho a la
herencia común.
Sin embargo, como hay varios tipos de negocios para los que la implementación sería
factible, el método necesita ser definido centralizadamente y no individualmente para
moteles y hoteles. Por otra parte, existe la opción de extender el modelo fácilmente.
25
Las interfaces pueden incluir interfaces. Puede existir por lo tanto una jerarquía de
interfaces. Representa una extensión de la interface incluida.
La interface que tiene otras interfaces se conoce como compbound interface. Una
interface incluida representa un componente de otra interface y se conoce como
component interface. Una interface que no tiene más interfaces incluidas es
elementary interface.
Ventajas
Si no hay posibilidad de enlazar clases en cuanto a su herencia, creando relaciones de
generalización o especialización mediante interfaces se puede tener las siguientes
ventajas:
-Separación de protocolo y servicio
-Posibilidad de simular herencia múltiple
-Accesos a métodos seguros y genéricos
26
Eventos
Aparte de los atributos y métodos, las clases pueden contener un tercer tipo de
componente: eventos. Instancias de eventos se pueden lanzar con las instancias de las
clases, mientras que las instancias estáticas de eventos se pueden lanzar con la propia
clase. Los eventos también se pueden definir como componentes de interface.
Dadas las circunstancias idóneas, los métodos del receptor o handler pueden
reaccionar al lanzamiento de este evento. Esto significa que el sistema de ejecución
puede llamar a estos métodos del receptor después de que el evento se lance. En otras
palabras el método del handler no se llama directamente por el cliente.
Cuando se está desarrollando la clase que lanza el evento, no hace falta saber nada
acerca de la clase que lo recepciona. La clase lanzadora (triggering) informa al resto
de clases que se encuentran en el programa de ejecución.
Un evento puede tener parámetros de exporting, lo que quiere decir que el programa
llamador determina el protocolo.
En este ejemplo, después de crearse una instancia de la clase vehicle, se lanza el evento
“vehicle created”. Este evento es recibido por diferentes instancias y es procesado por
cada una.
27
Triggering and handling events
Lo siguiente resume los pasos de programación necesarios para el control de eventos.
Hay que tener en cuenta que dependiendo del estado de la aplicación que se desarrolle,
no son necesarios todos los pasos de programación. La separación de la causa y el
efecto en la programación, debería verse reflejada a la hora de construir aplicaciones
complejas. Muchas veces, el evento ha sido lanzado y lo único que hay que hacer es
crear otro event handler.
Mediante una clase, las instancias de eventos, son definidas utilizando la sentencia
EVENTS, mientras que los eventos estáticos son definidos con CLASS-EVENTS.
Los eventos solo pueden exportar parámetros, los cuales se tienen que pasar por
valor, como una copia.
Una clase o una instancia puede lanzar un evento en tiempo de ejecución utilizando
RAISE EVENT. Tanto las instancias de eventos como los eventos estáticos se pueden
lanzar en métodos de instancia. Solo los eventos estáticos se pueden lanzar en métodos
estáticos.
Cuando ocurre un evento, los métodos del receptor que están registrados para este
evento, son llamados en secuencia. Por supuesto, estos métodos receptores, pueden
lanzar más eventos ellos mismos.
28
Todo este proceso se muestra abajo.
Las instancias de eventos o métodos estáticos se pueden definir en una clase para
lanzar los eventos. Para hacer eso, hay que especificar el evento (FOR EVENT) y la
clase o interface en el que el evento es definido (OF).
29
Registro de eventos
La definición de los métodos receptores solo especifican como y a que evento de
que clase el método va a reaccionar. En ejecución, se necesita determinar que posibles
reacciones se van a dar y cuando van a ocurrir.
30
Los eventos se registran usando SET HANDLER. El registro solo es activo en el
programa de ejecución.
Con las instancias de eventos, FOR esta siempre permitido por la referencia del
objeto que lanza el evento. Alternativamente, se puede utilizar ALL INSTANCES.
Así, se pueden registrar objetos que todavía no han sido creados.
La adición:
ACTIVATION ‘X’ es opcional durante el registro. Para deshacer el registro, utilizar
ACTIVATION space.
Set handler
Ref_handler->on_eventname_1
…..
Ref_handler->on_eventname_n
FOR….
Si varios métodos se han registrado para un evento, la secuencia en la que los métodos
receptores (handler) se llaman, no esta definida. No hay una secuencia garantizada
en la que los métodos receptores (handler) de un evento son llamados.
Todos los objetos o clases que tienen definido un evento, tienen una tabla interna:
handler table. Todos los handler method que se registran a los eventos están listados en
la tabla.
31
Los objetos que son registrados para un event handling, no se borran por el recolector
de basura si no quedan más referencias a ellos.
Los métodos capturadores (handler ) de eventos, tendrán que tener una visibilidad igual
o más restrictiva que la de los eventos a los que se refiere.
32
Unidad 3: Objetos de Repositorio de
orientación a objetos
Clases globales e interfaces
Creación de clases globales e interfaces
Como con las subrutinas, las clases locales o interfaces solo pueden ser usadas dentro del
programa en el que son definidas e implementados. La sentencia CLASS es una sentencia local,
declarativa en el programa. Como la declaración TYPES define tipos de datos locales la
sentencia CLASS define tipos de objetos locales.
En ambas casos, es irrelevante si el texto del código fuente este guardado separado en
programas incluidos.
Por otro lado las clases globales o interfaces globales son objetos individuales del Repository
con todos los atributos normales (la integración activa, la gestión de versiones de documentos,
sistema de transporte, etcétera). Convención de nombres (Y*, Z*, o un nombre especial del
cliente.) es el mismo que el usado para el nombre de otro objeto del Repository.
Una herramienta de mantenimiento especial está disponible para las clases globales en el ABAP
Workbech desde la versión 4.6A de R/3 de SAP: el class builder.
El área de navegación del Object Navigator hace que sea una herramienta de desarrollo ideal
para todos objetos del Repository. También soporta el Class Builder. Como con otros objetos de
Repository, la manera más fácil de crear una nueva clase global es usar el menú contextual en el
área de navegación. Seleccionar el nodo paquete o nodo de clase dentro de un paquete.
Un cuadro de diálogo pide crear los atributos adicionales para la nueva clase.
La clase global o la interfaz global son mostradas por la tabla del Class builder en la zona de
editor del Object Navegator.
Escoger la pestaña de Attributes para abrir la lista de todas definiciones de atributos en la clase.
Se pueden definir los nuevos atributos aquí.
Se pueden usar las input help cuando se está definiendo los tipos de atributos. Recordar usar
descripciones breves significativas.
33
Escoger la pestaña Methods para abrir la lista de todos los métodos definidos en las clases. Se
pueden definir los nuevos métodos aquí. Se puede usar los input help cuando se definen los
atributos. Recuerde usar descripciones breves significativas.
Escoger el botón Constructor para definir una instancia de constructor. El nombre de constructor
es escogido automáticamente y las posibilidades de selección en la ventana de editor para la
signatura están restringidas apropiadamente.
Si se quiere incluir una interfaz global en la clase global, se debe introducir el nombre de la
interfaz en la pestaña Interface. En cuanto se ha hecho eso, todos los componentes de la interfaz
aparecen automáticamente bajo las pestañas relevantes de acuerdo la convención de nombres y
el operador de resolución de interfaz
34
En lista de métodos, seleccionar el método y escoger el botón de Parameter para ir al
mantenimiento de la signatura. Se pueden definir los nuevos parámetros formales aquí.
Se puede usar el input help cuando se definen los atributos. Recordar usar descripciones breves
significativas.
Se puede desplazar entre las signaturas usando los botones Previous Method o Next Method.
Escoger el botón Methods para volver a la lista de metodos.
35
Escoger GotoMethod definition si se quieren cambiar los atributos del método
durante la implementación.
También se puede definir los atributos, los métodos, o eventos en el menú contextual en el area
de navegación del Object navigator. Las propiedades son mantenidas en un cuadro de diálogo, y
no en la tabla que hemos visto antes.
El sistema solamente lista los componentes públicos. Los métodos pueden ser evaluados usando
el icono call method.
36
El evento que se ha lanzado y todos de los parámetros exportados actuales son mostrados en
una lista.
Procedimiento
1. En el menú SAP easy acces, escoger Tools ABAP Workbench Development
Class Builder o usar la transaccion SE24
2. De la pantalla inicial de SE24, escoger Object type Import Local program classes.
3. Introducir el nombre del programa principal, si las clases locales e interfaces han sido
definidos con programas incluidos (include), seleccionar expand includes
4. Escoger Display Classes/Interfaces.
5. Introducir los nombres para las clases globales y las interfaces que se quieren crear.
Recordar la nomenclatura de nombres del cliente, si es aplicable.
6. Seleccionar las clases globales e interfaces que se quiere crear y escoger el botón de
Import.
37
Para redefinir un método heredado, seleccionar el método relevante en la lista y
seleccionar el botón Redefine. Alternativamente se puede utilizar el menú contextual en
el área de navegación.
Se pueden definir tipos locales en las clases globales. Esto incluye clases locales en
particular.
Técnicamente no se definen clases con clases dentro, pero si una clase que es local en el
repositorio de una clase global.
Todos componentes de la clase global tienen acceso a estos tipos locales, pero son
encapsulados si se trata de acceder a ellos desde fuera.
Para editar las partes de implementación de estas clases locales , escoger el Botón Impl. (para
las implementaciones de clases locales).
38
Para mejorar el conocimiento de herencia y componentes de interfaz, se puede poner Group by
classes and Interfaces señalado en el User –Specific Settings para el Class Builder. El sistema
mostrará los componentes de la clase global en una estructura.
También se pueden ordenar todos componentes por cinco criterios, en tres niveles. Para hacer
esto, mostrar la caja de diálogo apropiada escogiendo el botón de Sort.
Al igual que otros objetos de repositorio, las clases globales e interfaces se han añadido en el área
de la navegación del OBJECT-NAVIGATOR.
39
De esta manera las ventajas también se aplican a trabajar con clases globales e
interfaces.
En la área de navegación, hacer clic en un nombre de clase y arrastrarlo al área edición. Este
crea un instrucción CREATE OBJECT. Después se debe añadir la variable de referencia y los
parámetros actuales, si es aplicable, a la sentencia.
Alternativamente, se puede escoger el botón Patthern. La sentencia CALL- METHOD está bajo
el ABAP Object Patthern. Se puede generar la sentencia usando la input Help.
40
Por ejemplo, se puede usar el Refactoring Asistant para mover los componentes de una clase
dentro de la jerarquía de herencia. Consejo: para una lista completa de las funciones del
Refactoring Asistant, consulte la biblioteca de SAP.
Trabajando con las herramientas es simple, ya que es basado en diálogos arrastrar y soltar
(Drag&Drop).
El ALV Gris Control es una herramienta que se puede usar para mostrar listas no jerárquicas en
un formato estándar. La lista de datos es mostrada en tablas. Es muy fácil trabajar con, pocos
pasos de programación que tienen que ser realizados.
El ALV Grid Control contiene varias funciones estándar interactivas que los usuarios de las listas
a menudo necesitan, por ejemplo, imprimir, exportar, etcétera. Un desarrollador, tiene la opción de
ocultar estas funciones estándar. Cuando se requiera, se puede adaptar las implementaciones a las
necesidades de la aplicación. También se puede añadir funciones propias a la barra de
herramientas de la aplicación.
El enlace técnico entre la pantalla y el control de aplicación esta provista por container
controls. En general, los controles de aplicación (ALV Grid Control , Tree control, Picture
Control, etcétera) están siempre contenidos en este control , que está conectado con la pantalla.
Hay diferentes tipos de container controls. Sin embargo, todos ellos incorporan funciones de
control fundamentales, tales como barras de desplazamiento (scroll).
Se necesita para crear una instancia de cada una de las clases globales
CL_GUI_CUSTOM_CONTAINER y CL _GUI _ALV _GRID.
41
Para la visualización normal, los siguientes pasos de programación son suficientes:
1. Usar el editor de fullscreen del Screen Painter para definir una área de control sobre la
pantalla.
2. Crear una instancia de la clase CL_GUI_CUSTOM_CONTAINER y transferir el nombre del
área de control al constructor.
3. Crear un instancia de la clase CL_GUI_GUI_ALV_GRID y transferir el nombre del area de
control al constructor.
4. Llamar al método SET_TABLE_FOR_FIRST_DISPLAY de la instancia del grid control, y
transferir la tabla interna estándar a este.
Si esta tabla tiene un global row type, se puede transferir el nombre de esta estructura global al
mismo método. La instancia ALV grid Control crea automáticamente el field catalog.
Un ALV Grid Control puede reaccionar frente al doble clic del usuario. Como posible reacción,
se puede lanzar un proceso en el que se muestra información adicional. En el ejemplo que
aparece, la reserva de datos para vuelos individuales de clientes, o los datos sobre la aeronave,
también podrían mostrarse para los datos del vuelo. Técnicamente, esto es ejecutado capturando
el evento DOUBLE_CLICK con un manejador (handler) de método.
42
Un método handler puede ser un método de clase (método estático) o una instancia de método
de un objeto. Si un método de clase es definido como un método handler, ningún objeto de la
clase gestora (handled) necesita ser instanciado para usar el método.
Para crear un objeto handler para un evento, definir primero una clase. Esta clase tiene un
método público (en la PUBLIC SECTION) que puede reaccionar a un evento. Durante la
implementación del método handler, definir el código fuente que debe ejecutarse cuando el
evento es provocado. El método recibe la información lanzada por el evento desde la posición
de Mouse cuando se hace doble clic, y crea un mensaje de información, en el ejemplo se
muestra la fila y el campo del clic de ratón.
Con una (BAdI), un programa de aplicación de SAP provee una opción de mejora a través de
una interfaz y una clase adaptadora que implementa la interfaz.
La interfaz puede ser implementada por varios usuarios. Hay posibilidad de implementaciones
múltiples.
43
Cuando se define una BAdI, se debe especificar una interfaz (IF_EX _ < badi >) con los
correspondientes métodos definidos formalmente. La clase adapter que se genera
automáticamente durante la definición del interfaz (CL_EX _ < badi >) tiene la función de
llamar a todas las implementaciones activas de la BAdI. Esto no necesita ser codificado, pero
ocurre en la clase adapter en una secuencia indefinida. Cuando se tiene varias implementaciones
activas, no hay ninguna secuencia de procesamiento predeterminada.
Para crear una BAdI, se utiliza la herramienta BAdI builder (Tools ABAP Workbench
Utilities Business Add-Ins Definition) (SE18).
Una vez que el nombre se ha emitido para la BAdI, el sistema sugiere nombres para el BAdI
interface y el clase adapter. Para asegurarse de que se mantenga una clara visión general, se
recomienda que en asignar estos nombres.
Si se hace doble click sobre el nombre de interfaz, el sistema va al Class Builder, donde los
métodos de interfaz pueden ser definidos.
Después de que los métodos de interfaz son definidos, ¡la interfaz debe ser activada!
Primero, una variable de referencia debe ser definida del tipo "Referente to the Business Add-In
interface".
Los métodos de interfaz del BAdI pueden ser llamados a través de esta referencia de objeto.
44
Antes de que un BAdI pueda ser implementado por el cliente, su nombre debe ser definido de
antemano. Cuando se busca este nombre de BAdI, se puede usar uno de lo siguiente
mecanismos de búsqueda:
-La información de Repository del sistema (SE84)
-La jerarquía de aplicación (SE81)
-La guía de implementación a través de SPRO
-Navegando directamente vía F1 -> la información técnica del programa de aplicación y buscar
para la instanciación de la clase adapter de la BAdI usando la llamada CL_EX-ITHANDLER
= > GET_INSTANCE.
Si el nombre del BAdI ha sido determinado, el BAdI puede ser implementado después de que se
estudie la documentación sobre este tema. La implementacion es realizada mediante la
implementation maintenance (Tools ABAP Workbench Business Add-Ins
Implementation). Alternativamente, se también puede ir a la implementación navegando en el
menú de la BAdI definición.
Para implementar una BAdI, un nombre de BAdI implementation tiene que ser proporcionado.
La convención de nombres aquí, como de costumbre, es Z < impl >. Un cuadro de diálogo
aparece para seleccionar el correspondiente BAdI.
El código que debe ser implementado se almacena en un método de una clase cliente
automáticamente generada. Por esta razón, el nombre de la clase de implementación debe ser
45
introducido en el diálogo. El nombre: "Y o Z" (el prefijo de namespace), "CL" (para clases),
"IM _" (para implementaciones)” y "< impl >" (el nombre actual de la implementacion).
Después de hacer doble clic sobre uno de los métodos BAdI, se puede introducir el código del
método. Por supuesto, también se puede crear los métodos auxiliares en la implementación de
clase para mejorar la estructura del código requerido del método de BAdI.
Los usuarios ahora tienen la oportunidad de llamar los métodos por si mismos (a través de
opciones de menú, command field entries, etc.).
46
Unidad 4: ALV Grid Control
ALV Grid Control
ALV es una herramienta que permite visualizar listas no jerarquizadas en un formato
estandar. La lista de datos se muestra en la pantalla mediante una tabla y es muy user
friendly.
ALV tiene unas funciones estándar interactivas que se muestran arriba de la pantalla
como imprimir. Estas se pueden ocultar y también se pueden añadir nuevas
funcionalidades o modificar las existentes en la barra de herramientas de la aplicación.
Si el método tiene una row type global, se le puede dar el nombre de esta estructura
global. El field catalog se creará por la propia instancia de grid control.
47
Si el contenido de la tabla interna que se muestra se modifica basta con llamar al
método REFRESH_TABLE_DISPLAY.
Alternativamente, o como adición a esto, se puede proveer la instancia proxy con esta
información de visualización usnado una tabla interna adicional. El tipo global de la
tabla interna es LVC_T_FCAT cuya line type es LVC_S_FCAT.
Los field catalog se generan de maneras diferentes, y se pueden dar esto 3 casos:
-Caso 1:
Todos los campos de una estructura aparecen en la tabla de datos con el mismo nombre.
Estos son los campos a mostrar. En este caso se puede hacer que la instancia Proxy cree
el field catalog. Las columnas que no se definen en la estructura no son mostradas.
-Caso 2:
Todos los campos de la estructura global aparecen en la tabla de datos con el mismo
nombre. Sin embargo, los requerimientos del diccionario abap han de ser cambiados o
las columnas adicionales han de ser mostradas.
En este caso el field catalog se debe crear por el programa llamador.
-Caso 3:
La tabla de datos no contiene referencia alguna al diccionario ABAP o solo contiene
referencias a data elements o estructuras globales individuales. En este caso el field
content ha de ser creado enteramente por el programa que lo llama.
48
Descripción casos 2 y 3
• Se rellenan los campos de la work area para cada campo relevante en el la tabla
de datos para después insertarlos en la tabla interna del field catalog.
Se introduce la columan de la tabla para el campo fieldname. Este campo se utiliza para
asignar una columan field catalog a una columna de la tabla.
49
El field catalog se llena en el programa y se pasas con el nombre de la estructura del
dictionary durante la llamada al método. (Set_table_for_first_display)
50
Atributos de Formato del contenido de columna
Estos son los formatos que se les pueden asignar a los campos:
51
ALV Grid Control - Layout
Se puede cambiar el layout de un ALV haciendo que las filas salgan de diferentes
colores, cambiando el ancho de columna etc….
Para ello se debe crear un work area <wa_layout> en el programa referenciando a la
estructura lvc_s_layo y rellenar los campos correspondientes.
Después hay que pasar el work area al parámetro is_layout del método
set_table_for_first_display.
LVC_S_LAYO es una estructura de tipo global que incluye los siguientes campos:
52
Dependiendo del valor que se selecciona en el sel_mode field en la estructura layout, el
usuario puede seleccionar líneas individuales o múltiples.
Los datos en el layout pueden ser ordenados por los usuarios dinámicamente. Para ello
hay que introducir una tabla interna en it_sort del método set_table_for_first_display.
Hay que utilizr el tipo lvc_t_sort para esta tabla.
En esta tabla interna, se tiene que insertar una linea por cada campo que se va a utilizar
como criterio de ordenación
-Introducir el nombre de columna en fieldname.
-Si se usa mas de un criterio de selección, hay que introducir la secuencia en la
que se va a evaluar el criterio de selección en el campo spos en cada caso.
Alternativamente se pueden insertar en la secuencia deseada en la tabla interna.
-Introducir X en el campo, si se desea ordenar las entradas en orden ascendente.
53
Se puede modificar el color de las lineas y las columnas.
Dependiendo de la aplicación y los datos mostrados en el ALV Grid Control, solo unas
funciones se pueden utilizar.
Para ocultar funciones individuales, hay que definir una tabla interna ui_funcions. Hay
que llenar esta tabla interna con los nombres de las funciones que se quieren inactivar.
Estos posibles valores están disponibles como constantes de la clase cl_gui_alv_grid.
Todos los funtion codes tienen el prefijo MC_FC. El prefijo MC_MB representa un
menú enero en el toolbar.
54
ALV Grid Control - Eventos
Mediante alv se pueden capturar eventos, cuando se hace un doble clic sobre alguna de
las filas de la lista creada. El tratamiento es igual a los eventos donde habra un handler
que gestione el doble clic.
Un método handler puede ser también un método de clase o una instancia de metodo de
un objeto. Si un método de clase se define como método handler, no se necesita
instanciar el objeto de la clase handling, para usar el método.
Para crear un objeto handler para un evento, hay que definir la clase. Esta clase tiene un
método público, en la sección pública que puede reaccionar al evento. En la
implementación del método handler, se crea el código fuente que va a ejecutarse cuando
se lance el evento. El método recibe la información por el evento desde la posición del
ratón cuando un usuario hace doble clic y en el ejemplo se genera un mensaje de
información que muestra la línea y el campo en el que se ha hecho clic con el ratón.
55
Unidad 5: EXCEPTION HANDLING
(CONTROL DE EXCEPCIONES) AND
RTTS
Exception handling en ABAP Objects
Class-Based Exception Handling
Usamos el término excepción para referirnos a una situación que surge mientras un
programa se está ejecutado, y surge un error. Las excepciones y el control de la
excepción están ahora basadas en clases.
Las class-based exceptions son lanzadas por la sentencia RAISE EXCEPTION o por
el entorno en tiempo de ejecución. La división por cero, por ejemplo, sería un ejemplo
de una excepción lanzada por el entorno en tiempo de ejecución.
Cuando se controla una excepción, se puede lanzar nuevas excepciones y por tanto crear
una cadena de excepciones. En casos especiales, se puede capturar una excepción en
tiempo de ejecución y tener que lanzarla otra vez por su cuenta.
56
La manera en la que las clases de excepción son asignadas a una de estas tres clases en
la jerarquía define cómo las associated exceptions son propagadas.
En el sistema estándar de SAP, los nombres de todas clases de excepción empiezan con
CX _.
Se puede asignar varios textos a cada clase. Los IDs asignados son creados por el Class
Builder como el mismo nombre que las constantes estáticas. Se puede especificar qué
texto se usa cuando una excepción es lanzada pasando una de estas constantes al
parámetro TEXTID de la instance constructor.
Todas las exception class heredan el atributo KERNEL_ERRID de CX_ROOT. Este
atributo contiene el nombre del error en tiempo de ejecución si la excepción fuera
lanzada por el entorno en tiempo de ejecución.
El bloque TRY contiene el conjunto de sentencias que manejan las excepciones. Si una
excepción ocurre en el bloque TRY, el sistema busca primero una sentencia CATCH
en el mismo bloque TRY-ENDTRY, y si no lo encuentra busca en los demás bloques
TRY-ENDTRY.
57
Los bloques TRY, CATCH, y CLEANUP pueden contener a su vez bloques TRY-
ENDTRY.
Después de que ocurra una excepción, el sistema busca en una lista de exception
handlers en el orden especificado. Ejecuta el primer exception handler cuya sentencia
CATH contiene la exception class o uno de sus superclasses.
58
Éste es un ejemplo sencillo. Normalmente, se define con tipo numérico F para evitar un
error en tiempo de ejecución.
3. Guardar tantos exception text como se necesiten. Se puede insertar sus atributos
como parámetros en el static text de la forma &<attribute_name>&.
Para el primer texto que se crea, usar siempre una constante estática como un ID.
Si no hay texto especificado explícitamente cuando la excepción se lanza, el texto
con esta ID es usado en su lugar. Para todos los demás textos, defina otros ID. El
Class Builder genera las constantes estáticas nombrándolas automáticamente.
Cuando la excepción es lanzada, se pasa una de estas constantes al parámetro
TEXTID para especificar el texto apropiado para la excepción.
Para propagar una excepción desde un procedimiento, se usa RAISING cuando se está
definiendo la interfaz del procedimiento. En los métodos de clases locales y subrutinas,
especifique el RAISING directamente cuando se está definiendo el procedimiento:
Después del RAISING, ponga en una lista las exception class cuyas insntacinas van a
ser propagadas. En los métodos de las clases globales, las exception class cuyas
instancias son propagadas son introducidas en la exception table del metodo en el Class
Builder. Es necesario activar el flag Exception Class para cada exception table. Escoger
el Exceptions tab.
59
para esa excepción es lanzada. Después de que la excepción ha sido captada, se puede
visualizar el texto usando el método GET_TEXT.
Si el que llama no captura la excepción, puede ser pasado hacia arriba al siguiente nivel
llamador. Antes de que el control sea pasado al próximo llamador, el bloque opcional
CLEANUP puede ser ejecutado.
PUBLIC SECTION.
...
METHODS get_attributes
EXPORTING
ex_name TYPE t_name_15
value(ex_wa_plane) TYPE saplane
RAISING
cx_bc401_excd_planetype.
60
Class-Based Exceptions en Debugging Mode
Si una excepción es lanzada, el nombre de la exception class es mostrado en el campo
Exception Raised en el debuggin mode.
Aparecen dos botones. Esto botones permiten mostrar los valores de los atributos de la
excepción y navegar al punto del código fuente donde ocurrió la excepción.
61
propagadas hasta el nivel de llamada más alto. Si no es capturada allí tampoco, se
produce un error en tiempo de ejecución Algunas excepciones predefinidas con el
prefijo CX_SY _.... son subclases de CX_NO_CHECK.
Cuando se lanza la siguiente excepción, solo se debe pasar una referencia a la excepción
anterior a la nueva instancia. Esto se hace con el parámetro opcional PREVIOUS del
constructor. De este modo, la nueva excepción es mapeada a la anterior. Después de
que la excepción mapeada ha sido capturada, el atributo PREVIOUS contiene una
referencia a la instancia de excepción previa, etcétera. De este modo, se puede acceder a
cada instancia en la cadena de excepciones. Por lo tanto, se puede seguir la historia del
lanzamiento de las excepciones en el programa.
62
DATA:
l_ref_plane TYPE REF TO lcl_plane,
l_name TYPE t_name_15,
l_wa_plane TYPE saplane,
Hay una description class para cada tipo con atributos especiales.
Para obtener una referencia a un description object de un tipo, se debe usar los métodos
estáticos del class CL_ABAP_TYPEDESCR o los métodos de navegación de la
description class especial. Los description objects son creados de una de las subclases.
63
En tiempo de ejecución, un description object existe para cada tipo. Los atributos del
objeto de descripción contienen la información sobre los atributos del tipo.
Debido a que se necesita los atributos de una estructura, se debe definir una referencia
primero a la description class apropiada. Las instancias de esta clase tienen un atributo
COMPONENTS que se usa para describir los componentes individuales de la
estructura. Este atributo es una tabla interna. Por lo tanto, también tiene que definir una
work area con un line type compatible.
64
El método llamado devuelve la referencia para la description instance de la estructura
transferida.
65
Como ejemplo, se debe ampliar la aplicación existente con la agencia de viajes y su
socio comercial.
También se puede hacer lo mismo sin usar clases de RTTI. Por ejemplo, se puede usar
una asignación widening cast del SENDER a una variable de referencia que tenga un
tipo estático LCL_BUS. Esto daría un error en tiempo de ejecución para instancias de
vehículo que no son buses. El sistema podría capturar este error en tiempo de ejecución.
Por lo tanto, un error en tiempo de ejecución no se provoca siguiendo el criterio de
incluir un vehículo en la lista de vehículos.
Las propiedades de los tipos son implementadas por type-object attributes. Esto quiere
decir que cada tipo tiene uno type object cuyos atributos describen las propiedades del
tipo.
66
Un tipo es definido completamente por su type object.
• Hay un runtime type object para cada tipo.
• El runtime type object describe el data type totalmente.
• Un type object esta definido en un programa local y es transitorio y anonimo.
• No se puede eliminar o cambiar un type object.
Se puede usar RTTC para crear tipos de datos básicos. Sin embargo, también se puede
usar para crear tipos de datos más complejos como estructuras o tablas internas.
La pregunta que surge ahora qué debe hacerse con el tipo de tabla que acaba de ser
creado. Por ejemplo, se pude usar el codigo siguiente como ejemplo de creación de una
tabla interna en tiempo de ejecución:
...
DATA r_itab TYPE REF TO data,
r_tableType TYPE REF TO cl_abap_tabledescr.
...
* Creation of internal tabletype with static method
* CREATE of RTTS-class cl_abap_tabledescr
...
CREATE DATA r_itab TYPE HANDLE r_tabletype.
Usando HANDLE con la sentencia CREATE DATA se crea una tabla interna cuyos
tipos son descritos por un RTTS type objects. El type object puede ser creado usando
los métodos de RTTS o definiendo dinámicamente un nuevo data type.
67
Unidad 6: Objetos compartidos
Introducción
Desde la versión 6.40 se pueden guardar datos como objetos compartidos en la memoria
compartida, para diferentes programas y sesiones de usuario. Se pueden crear
aplicaciones en las que los usuarios escriben datos en este área. Otros usuarios pueden
después leer estos datos.
Se pueden imaginar muchos y diferentes usos potenciales para los objetos compartidos:
-Guardar catálogo: Un autor escribe el catálogo en el area de objetos compartidos y
otros usuarios lo leen.
-Guardar Shopping cart: El comprador llena el shopping cart y el vendedor lo lee
posteriormente.
Memoria compartida
Área de memoria que puede ser accedida por todos los programas ABAP ejecutándose
en ese servidor.
Antes de que existieran los objetos compartidos se usaban las sentencias IMPORT y
EXPORT con los parámetros SHARED BUFFER y SHARED MEMORY para acceder
a esta área de memoria. Las instancias de clases “vivían” exclusivamente en la internal
session de un programa ABAP. La memoria compartida se ha mejorado con la
memoria compartida de objetos, donde los objetos compartidos se pueden guardar. Los
objetos compartidos son almacenados en llamadas áreas de memoria compartida.
68
Propiedades de los objetos compartidos
Buffers compartidos por varias aplicaciones que se leen mucho y se escriben poco (la
escritura consume muchos recursos).
Accesos concurrentes de lectura son soportados.
El acceso es controlado por un mecanismo de bloqueo.
Los datos se guardan como atributos de los objetos.
Los cuellos de botella de la memoria provocan errores en tiempo de ejecución que
necesitan ser capturados (con un catch).
Un prerrequisito para guardar un objeto en la memoria compartida es que la clase de ese
objeto tiene que estar definida con el parámetro SHARED MEMORY ENABLED en la
definición de la clase o que el atributo Shared memory enabled está marcado en el Class
Builder.
Un área es una (template) plantilla para las instancias de area en una memoria
compartida. Un área puede contener varias instancias de áreas, las que difieren en el
nombre. Además una instancia de área puede tener varias versiones, los cuales difieren
en la ID de la versión. En el caso más simple, sin gestión de versiones, una instancia de
área consiste en una única versión de instancia de área.
En la transacción SHMA se define un área. Esto crea una clase de área global, final
que hereda de CL_SHM_AREA. Un área es accedido exclusivamente usando los
métodos de la clase de área generada.
69
Convención de nombres para clases → ZCL_*
Se pueden utilizar métodos estáticos de una clase de área para añadir un programa de
ABAP a una instancia de área en la memoria compartida.
En el diagrama de arriba se puede ver otra clase, que se llama area root class. Se puede
crear cualquier número de objetos en una instancia de área, dependiendo del programa
específico. Se accede a estos objetos uniformemente a través de la instacia de area root
class.
Aplicación de ejemplo
Crear una lista de fechas de vuelos, para que los usuarios seleccionen más rápido el
vuelo.
Crear un área
Los objetos compartidos son guardados en áreas de la memoria compartida. Usar la
transacción SHMA para crear y modificar áreas y sus atributos.
70
¡OJO!: la transacción SHMA no está en el árbol del menú → hay que teclearla arriba.
Se llama a la transacción SHMA y se introduce el nombre del área. El nombre del área
debe empezar por Z o por Y.
En programas ABAP, el area será accedido después utilizando exclusivamente los
métodos generados de la clase de área.
71
Cuando se crea un área, se crea también una clase global final del mismo nombre.
Necesitamos ahora una variable de referencia que esté declarada en esa clase. Esta
referencia sirve de handle para acceder al área.
72
Una vez que se ha creado la instancia, ya se puede crear objetos en la memoria
compartida → añadir el parámetro AREA HANDLE en la sentencia de declaración
CREATE OBJECT.
73
Para permitir llamar a los objetos creados en área de instancia, hay que asignar el objeto
root al atributo ROOT del area handle. Para hacer esto, se utiliza el metodo SET_ROOT
de la area handle.
Como consecuencia cualquier programa de la aplicación puede acceder a esta área.
74
El programa de lectura necesita una variable de referencia declarada con la clase ‘área’.
Este variable de referencia sirve como instancia del área al que se quiere acceder.
El programa también necesita el handle de esta instancia del área. Esto se hace con el
método ATTACH_FOR_READ de la clase CL_SHM_AREA. Así se establece un
bloqueo de lectura (‘read lock’) que evita escrituras durante el acceso.
Los objetos en esta área se pueden acceder ahora con el area handle. El seguro de
lectura se libera automáticamente al cerrar la sesión o con la instrucción DETACH.
75
Si el atributo number of versions del area está configurado apropiadamente, versiones
adicionales de la instancia del area pueden existir además de la versión activa.
Cuando un nuevo catalogo se esta configurando, varias versiones temporales de la
misma instancia de area existen concurrentemente. Tan pronto como una aplicación
pone un bloqueo de cambio para una instancia de área, se crea una “versión que se esta
configurando” y existe en paralelo a la versión activa.
Versión descatalogada (‘outdated’):
76
El seguro de lectura sobre el fichero descatalogado permanece hasta que todas las
operaciones de lectura han acabado. Si hay nuevas lecturas sobre la instancia ‘área’ se
producen sobre la versión activa. Pueden existir por tanto dos lecturas distintas al
mismo tiempo.
Versión caducada (‘expired’):
77
Nuevas protecciones de lectura (‘read locks’) se aplican solo a la versión activa. Solo
puede haber una versión activa de una instancia. Dependiendo del número máximo de
versiones, aún pueden existir versiones descatalogadas en la que queden todavía bloques
por leer.
78
Unidad 7: Caso de estudio
Caso de estudio (ejemplo)
Los programas que se van a crear deben dar al usuario una pantalla que controle a los
clientes que utilizan listas de vuelos. Debería ser posible mantener una lista de espera
para cada vuelo (fila de la tabla SFLIGHT con las claves CARRID, CONNID y
FLDATE).
Todas las listas se almacenan en un buffer llamado WAIT_LIST (una tabla interna).
Además de la información del vuelo las listas de espera deben contener todos los
clientes registrados para este vuelo.
Las funciones de la aplicación se muestran en la siguiente figura:
La pantalla y las funciones aquí mostradas deben ser creadas de acuerdo a las
especificaciones requeridas.
Los requisitos contienes funciones como:
Mostrar : waiting list para el vuelo señalado
Crear : crea una lista de espera para el vuelo señalado
Borrar (listas de espera)
Añadir : Añade el cliente seleccionado en la pantalla de la derecha al witing list del
vuelo de la derecha.
Borrar (clientes): Cliente de la derecha de la lista de vuelos del vuelo de la
izquierda.
Posición (en la lista de espera) : Muestra la posición cliente seleccionado en la lista
de espera.
79
Objetos compartidos
Se pueden utilizar desde la versión 6.40 de SAP Web AS.
Utilidades:
Cesta de la compra: el comprador rellena la cesta que la lee luego el dependiente.
Catálogo: muchos usuarios acceden simultáneamente a la misma información.
Para que un programa de ABAP pueda acceder hay que utilizar las sentencias EXPORT
e IMPORT con los parámetros SHARED BUFFER o SHARED MEMORY.
Con la introducción de objetos compartidos la memoria compartida pasa a ser una
memoria compartida de objetos.
80
Con adjuntos (programas de ABAP añadidos a la memoria compartida), se crea una
instancia de clase ‘área’ como area handle y se establece al mismo tiempo una
protección contra escritura. (‘read lock’).El programa en ABAP puede utilizar el area
handle para acceder a la instancia del área añadida y por tanto a los objetos compartidos
allí almacenados. El area handle también contiene los métodos para liberar el cierre de
lectura.
ABAP Unit
Es una herramienta para crear clases de prueba. Esta integrada en el entorno de
desarrollo de ABAP (‘ABAP runtime enviroment’). Comprueba la funcionalidad del
código de un programa (módulos de tests).
Los módulos de prueba son en ABAP y van integrados en el método que se va a testear
→ son locales por lo que no hay problemas de versiones o transporte.
Estos módulos de prueba no afectan al rendimiento del sistema de producción.
81
-Estos test se programan en ABAP Objects.
-La test function esta contenida en los test methods de las test clases.
-Estas test clases estan contenidas localmente en el programa que se quiere testear. Esto
quiere decir que no hay transportes o problemas de verisiones.
-Si ocurre un error, el resto del procedimiento de testeo se puede controlar.
-El código de test no tiene efecto en producción.
-ABAP Unit no afecta al sistema de producción.
82