En una asignación reciente, tuve la oportunidad de usar el modelo de programación de aplicaciones en la nube y los elementos de Fiori para diseñar y crear una aplicación lista para la empresa. Usé algunos conceptos como expresiones dinámicas, efectos secundarios y acciones personalizadas en páginas de objetos. Sin embargo, encontrar material apropiado o referencias con ejemplos y comprender los conceptos requirió mucho tiempo. Intentaré describir brevemente estas ideas en esta publicación de blog para que otros puedan beneficiarse y ahorrar tiempo.
Utilizaremos el proyecto de ejemplo «cap-fe-se-ca-de» que publiqué en GitHub aquí para explicar los temas. Repasemos rápidamente el proyecto y algunos de sus archivos clave.
Carpeta o Archivo | Objetivo | |
aplicación/ | Esto tiene 2 interfaces de interfaz de usuario, es decir, Clientes y Pedidos. | |
db/ | El modelo de datos se define en schema.cds | |
srv/ | Los servicios se definen en service.cds y la lógica se agrega a través de service.js. También capacidades.cds agrega/restringe diferentes capacidades de los servicios | |
aplicación/pedidos |
Aplicación de interfaz de usuario basada en Fiori Elements para pedidos anotaciones.cds: anotaciones_se.cds: anotaciones_ca_de.cds: |
Las aplicaciones «Clientes» y «Pedidos» en la carpeta de la aplicación se crearon con Fiori Elements. Para comprender mejor los temas antes mencionados, nos concentraremos en la aplicación Pedidos. La primera vista en la aplicación Pedidos es una Página de lista y la segunda vista, que es la vista de detalles, es una Página de objeto, como se ilustra a continuación:
Pedidos – Página de lista | Órdenes – Objeto Pagmi |
Si un usuario modifica el contenido de un campo o realiza una acción, esta modificación puede tener un impacto en otros campos de la interfaz de usuario. Este comportamiento del sistema se denomina efecto secundario.
ejemplo: en orden, si ingresa cantidad y precio, el valor total se actualiza automáticamente. Este comportamiento se denomina efecto secundario.
Hay diferentes variaciones de los efectos secundarios. Exploremos uno por uno usando el archivo annotations_se.cds en la aplicación Pedidos.
Efecto secundario con propiedad de origen único y entidades de destino: En la página de detalles del pedido, cuando el usuario elige al cliente, también se deben actualizar automáticamente los detalles del cliente, como el nombre, el apellido y su dirección. Para lograr esto, se agrega la siguiente anotación en annotations_se.cds
Según las anotaciones anteriores, cada vez que el usuario actualiza el campo ID_cliente, se activa este efecto secundario #CustomerChanged y se actualiza el campo relacionado con el cliente y la entidad de dirección del cliente. Técnicamente, este efecto secundario da como resultado una llamada de actualización para actualizar el campo ID_cliente y una llamada de obtención para obtener los datos del cliente y la dirección del cliente. En este ejemplo, vimos cómo podemos afectar los campos de la interfaz de usuario que hacen referencia a las entidades de navegación, es decir, el Cliente y sus direcciones. Efecto secundario con propiedad de fuente única y propiedades de destino: Cuando un usuario agrega un nuevo artículo a un pedido y proporciona la identificación del producto, el precio y la moneda deben obtenerse automáticamente del maestro del producto y completarse para la entidad del artículo. Además, cuando se completa tanto el producto como la cantidad, también se debe calcular el precio neto. Las anotaciones a continuación se utilizan para lograr esto:
Tenga en cuenta que el efecto secundario provoca una llamada de obtención adicional y actualiza la interfaz de usuario con el resultado de la llamada. Pero no hace ninguna adición lógica. Para completar la funcionalidad que necesitamos, agregaremos lógica adicional a la primera llamada de parche que
Consulte el siguiente código definido en service.js.
Efecto secundario en una entidad de origen: El monto total del pedido debe actualizarse automáticamente a medida que se agregan artículos. En otras palabras, cada vez que se actualizan los artículos del pedido, se debe iniciar un efecto secundario para recuperar el total del pedido. Para lograr esto, use las anotaciones a continuación:
Como se ve en el código a continuación, la cantidad total del pedido debe actualizarse en la llamada de parche inicial del efecto secundario.
|
Los valores predeterminados se pueden proporcionar utilizando una «Función de valor predeterminado» al crear una nueva entidad o elemento.
Por ejemplo, el estado inicial de un pedido siempre se establece en «Abierto» cuando se crea.
La anotación para proporcionar ‘DefaultValueFunction’ es como se muestra a continuación:
annotate service.Orders with @(
Common.DefaultValuesFunction : 'getOrderDefaults'
);
Aquí, ‘getOrderDefaults‘ es una función vinculada de la entidad de pedidos bajo el servicio de pedidos. Se define en el archivo service.cds y service.js.
//Definition [service.cds]
function getOrderDefaults() returns Orders;
//Implementation [service.js]
this.on('getOrderDefaults', async req => {
return {status: 'Open'};
});
El estado inicial de un pedido es ‘Abierto’. Podemos definir una acción personalizada para cambiar el estado de ‘Abierto’ a ‘En proceso’ y viceversa.
Se proporcionan dos acciones vinculadas y su lógica correspondiente en service.cds y service.js respectivamente, como se muestra a continuación:
//Definition [service.cds]
entity Orders as projection on db.Orders actions {
action setOrderProcessing();
action setOrderOpen();
};
//Implementation [service.js]
this.on('setOrderProcessing', Orders, async req => {
await cds.update(Orders, req.params[0].ID).set({status: 'In Process'});
});
this.on('setOrderOpen', Orders, async req => {
await cds.update(Orders, req.params[0].ID).set({status: 'Open'});
});
Estas 2 acciones se pueden agregar en la interfaz de usuario como botones usando anotaciones como se proporciona en el archivo annotations_ca_de.cds.
annotate service.Orders with @(UI.Identification : [
{
$Type : 'UI.DataFieldForAction',
Label : 'Set to In Process',
Action : 'orderservice.setOrderProcessing'
},
{
$Type : 'UI.DataFieldForAction',
Label : 'Set to Open',
Action : 'orderservice.setOrderOpen'
}
]);
Las expresiones dinámicas son pequeñas lógicas definidas en la anotación para controlar el comportamiento de la interfaz de usuario.
Ejemplo: si el estado del pedido es Abierto, entonces solo se ve el botón ‘Establecer en proceso’ y si el estado del pedido es En proceso, solo se ve el botón ‘Establecer en abierto’. Para lograr esto, podemos usar expresiones dinámicas.
Nota 1: OData admite expresiones dinámicas en las anotaciones. En CDS, estas expresiones dinámicas se proporcionan mediante representaciones JSON. Para obtener más información, consulte este documento.
annotate service.Orders with @(UI.Identification : [
{
$Type : 'UI.DataFieldForAction',
Label : 'Set to In Process',
Action : 'orderservice.setOrderProcessing',
![@UI.Hidden] : {$edmJson : {$Ne : [{$Path : 'status'}, 'Open']}}
},
{
$Type : 'UI.DataFieldForAction',
Label : 'Set to Open',
Action : 'orderservice.setOrderOpen',
![@UI.Hidden] : {$edmJson : {$Eq : [{$Path : 'status'},'Open']}}
}
]);
![@UI.Hidden] : {$edmJson: {$Ne: [{$Path : ‘status’}, ‘Open’]}}
$Path: Se refiere a la propiedad de la entidad
$Ne: no es igual al operador, otros valores son $Eq: igual a, $Le: menor o igual a, $Ge: mayor o igual a
La expresión dinámica anterior verifica si el estado no está abierto y luego devuelve verdadero.
Nota 2: Las expresiones dinámicas también pueden ser compuestas. Veamos un ejemplo:
Criticality: {$edmJson :{$If :[{$Eq :[{$Path : 'status'},'Open']}, 1, 3]}}
Una nueva expresión dinámica verifica si el estado está abierto y luego devuelve 1; de lo contrario, devuelve 3 para Criticidad.
Como se explicó en el concepto anterior, hemos utilizado dos acciones para cambiar el estado del pedido. Sin embargo, una vez que se ejecuta la acción, el campo de estado en la interfaz de usuario también debería cambiar instantáneamente. Para lograr esto, podemos definir efectos secundarios para acciones personalizadas como se muestra a continuación.
En este caso, las anotaciones de efectos secundarios se proporcionan en el archivo service.cds.
entity Orders as projection on db.Orders actions {
@( cds.odata.bindingparameter.name : '_it',
Common.SideEffects : {TargetProperties : ['_it/status']} )
action setOrderProcessing();
@( cds.odata.bindingparameter.name : '_it',
Common.SideEffects : {TargetProperties : ['_it/status']} )
action setOrderOpen();
};
Juntos, el modelo de programación de aplicaciones en la nube y los elementos Fiori mejoran la experiencia del desarrollador al mismo tiempo que aumentan la productividad y aceleran el desarrollo de aplicaciones listas para la empresa.
Se puede encontrar más información sobre Fiori Elements con el modelo de programación de aplicaciones en la nube aquí. Puede seguir mi perfil para recibir notificaciones de la próxima publicación de blog sobre CAP o Fiori Elements. Siéntase libre de proporcionar cualquier comentario que tenga en la sección de comentarios a continuación y haga sus preguntas sobre el tema en la comunidad de sap usando este Enlace.
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073