Me gusta la programación orientada a objetos porque a través de ella podemos modelar objetos del mundo real y controlarlos mediante software. Si quisiéramos controlar el funcionamiento de una máquina de café, por ejemplo, tendríamos un objeto máquina de café, con otros objetos como atributos de la máquina, como café o agua, podríamos ejecutar acciones (métodos) como “preparar café”, asegurándonos primero de que la máquina esté llena (los atributos agua y café no están vacíos), incluso podríamos disparar eventos como “Café listo”. En SAP no tenemos objetos como máquinas de café, evidentemente, pero sí lidiamos con el “mundo real” de procesos de negocio, órdenes de venta, órdenes de compra, facturas, entregas, apuntes contables, etc.
El concepto de business objects no es nuevo, SAP ya ha intentado previamente crear otros frameworks que permitan facilitar el modelado de objetos como órdenes de venta y órdenes de compra dentro del sistema. El más reciente de ellos es el Business Objects Processing Framework, que se ha usado para crear módulos como Transportation Management - TM. BOPF nos permite modelar objetos, definir su persistencia en base de datos (por lo tanto también puede crear tablas de BD), realizar validaciones de integridad de los datos, definir cómo se relacionan unos objetos con otros, y muchas más.
Intentaré mostrar a través de una serie de posts sobre cómo funciona este framework. Cabe destacar que no soy para nada experto en este tema, así que cualquier aporte será beneficioso para enriquecer el conocimiento colectivo . El ejemplo que voy a usar puede parecer tonto, pero considero que ayuda bastante a entender los conceptos: Se trata del propietario de una tienda de instrumentos musicales que cambió su sistema manual para controlar su inventario por SAP, imaginemos también que el estándar no existe y vamos a crear esto con business objects.
Nota: Para estos ejemplos estoy usando la developer edition de SAP Netweaver AS ABAP 7.51 como server (disponible para descarga gratuita a través de la página h_tps://tools.hana.ondemand.com/#abap
), y Eclipse Neon en el frontend.
Pues bien, abrimos Eclipse. Seleccionamos File - New - Other y filtramos por bopf, como en la imagen
(Si estáis usando el SAPGui, la transacción es la BOBX).
La primera ventana nos pide que seleccionemos un paquete, un nombre y una descripción para nuestro BO. A este BO le puse un nombre que termina en MANUAL, más adelante veremos que también podemos crear business objects a partir de vistas CDS mediante uso de anotaciones. Evidentemente crearé luego un BO que acabe en CDS y compararemos resultados.
Ahora el wizard te pide definir una estructura persistente y una transiente. La estructura persistente será la definición de la tabla de base de datos que se creará, por lo tanto crearemos una estructura con los campos que sabemos que estarán fijos en la base de datos. La estructura transiente es para definir campos que son calculados y que no queremos duplicar, por lo tanto no formarán parte de nuestra tabla, un ejemplo sería descripciones de datos maestros. En este caso no pienso tener campos transientes, por simplitud. Así que defino una estructura persistente solamente.
Un feature muy bueno de ABAP 7.50 es que ahora permite crear estructuras, elementos de datos y dominios desde Eclipse, sin necesidad de usar el SAPGui, lo cual me parece genial . En Eclipse definimos una estructura así:
@EndUserText.label : 'Structure'
@AbapCatalog.enhancementCategory : #NOT_EXTENSIBLE
define type zinstruments_ps {
@EndUserText.label : 'Serial number of the instrument'
serialnumber : abap.char(10);
@EndUserText.label : 'Company name of the instrument'
builder : abap.char(35);
@EndUserText.label : 'Type of instrument'
type : abap.char(30);
@EndUserText.label : 'Image of instrument'
picture_url : abap.char(255);
@EndUserText.label : 'Price of the instrument'
@Semantics.amount.currencyCode : 'zinstruments_ps.currency_code'
price : abap.curr(15,3);
@EndUserText.label : 'Currency code'
currency_code : abap.cuky;
}
Por cierto, estas anotaciones no tienes que saberlas de antemano, hay code completion en Eclipse para cada una de ellas.
La estructura se ve así en la SE11 clásica:
Bien, el último paso es crear una interfaz de constantes. Esta es una interfaz autogenerada por el framework, porque como ya veremos en seguida, cuando BOPF crea una tabla de base de datos, utiliza como campos claves unos identificadores hexadecimales de 32 caracteres, o 256 bits, con lo cual estaremos seguro de que será imposible repetir la misma clave. Esta interfaz nos permite referirnos al BO como ZIF_BO_INSTRUMENTS_MANUAL_C=>INSTRUMENTS_TEXTS
en lugar de 0800279DF3981ED7B2D40D91B7A0EBD3
Bien, seguimos el enlace “Go to the ROOT node”, y veremos la pantalla resumen con el contenido de nuestro BOPF. Le podemos poner un nombre a la estructura combinada, que no es más que los campos de la estructura persistente y la transiente combinados, y finalmente a la tabla de base de datos que se va a crear.
Activamos el BO y listo, ya podemos empezar a operar con él. Si seguimos el enlace Database Table, navegamos hacia la definición de la tabla de base de datos. Como podemos ver, en la descripción de la tabla pone que es generada, y el único campo clave es uno DB_KEY de tipo /BOBF/CONF_KEY, es el código hexadecimal del que hablé anteriormente
En el siguiente post, describiré cómo podemos crear operaciones CRUD (Create, Read, Update, Delete) desde ABAP.