Proporcionar acciones y funciones

Objective

After completing this lesson, you will be able to declarar e implementar operaciones personalizadas específicas de dominio

Acciones y funciones de modelado en CDS

Anteriormente, discutimos ejemplos de programas de control de eventos anteriores y posteriores. Ahora veamos un caso de uso de controladores.

Un gestor on cumple realmente las solicitudes, por ejemplo, leyendo o escribiendo datos desde o hacia bases de datos. En nuestro ejemplo, queremos utilizar un programa de control on para implementar una operación personalizada específica de dominio.

Vea el vídeo para ver cómo CAP admite la implementación de operaciones personalizadas específicas de dominio.

Nota

SAP recomienda preferir acciones/funciones no vinculadas, ya que son mucho más fáciles de implementar e invocar.

A modo de ejemplo, queremos implementar una acción no vinculada llamada envío de pedido para el servicio de catálogo. Se utiliza para realizar pedidos (de una manera muy simplificada). Declaramos esta acción dentro de la definición de servicio como se muestra en la siguiente figura.

La acción Submit Order tiene dos parámetros de entrada. El primer parámetro llamado libro se utiliza para identificar el libro que se va a ordenar. El parámetro se escribe utilizando el tipo de datos del elemento de ID de la entidad Libros definida en el modelo de dominio importado.

El segundo parámetro cantidad es del tipo Integer y especifica el número de artículos que se pedirán.

Un objeto con una propiedad llamada stock se define como el tipo de respuesta. Esta propiedad se escribe utilizando el tipo de datos del elemento de stock de la entidad Modelo de dominio Libros. El valor de la propiedad debe ser la nueva acción para el libro después de que se haya ejecutado la orden.

Nota

En la documentación de la PAC se pueden encontrar otros ejemplos para definir las acciones y funciones no vinculadas y vinculadas en los modelos CDS.

A continuación, veamos cómo implementar la acción transp.orden declarada.

Implementación de acciones/funciones

Las acciones y funciones se pueden implementar como en los programas de control de eventos. Los programas de control para acciones y funciones son muy similares a los programas de control de eventos que ya hemos utilizado para eventos CRUD.

Registramos el programa de control en para nuestra acción de envío de pedido no vinculado en el método init() de la clase de implementación para el servicio de catálogo (véase la siguiente figura). Para ello, llamamos el método heredado on() a través de this.on().

En el ejemplo que se muestra, registramos la función nombrada this.reduceStock como la implementación para la acción envOrder. Para ello, el nombre de la acción se transfiere al método on() como el primer parámetro y la función como el segundo parámetro. Trataremos la implementación de la función reduceStock con más detalle en la siguiente sección.

Nota

Consulte la documentación de la PAC para obtener información sobre cómo registrar programas de control para acciones/funciones vinculadas.

Implementación de método preliminar

La idea para implementar el método reduceStock es la siguiente.

Actualizamos el stock del libro pedido según la cantidad transferida en la base de datos y devolvemos el stock actualizado mediante el parámetro de devolución de la acción.

Se deben realizar las siguientes validaciones:

  • La cantidad transferida debe ser mayor o igual que 1.
  • El ID de libro transferido debe existir en la base de datos.
  • El stock del libro debe ser mayor o igual que la cantidad pedida.

Si una de estas validaciones falla, debería emitirse un mensaje de error.

Para implementar esta lógica, necesitamos acceder a la base de datos. Sin embargo, no aprenderemos a hacerlo hasta la próxima lección. Por lo tanto, nos limitaremos aquí a una implementación preliminar incompleta del método reduceStock (véase la siguiente figura).

En primer lugar, asignamos la definición CSN de la entidad Libros a la constante Libros mediante una asignación de destrucción. Utilizaremos esta constante más adelante para acceder a la base de datos.

En handlers reciben, entre otras cosas, una instancia de cds.Request como argumento. En el ejemplo mostrado, hemos llamado a este argumento req. La propiedad de datos del objeto req se utiliza para acceder a los valores del libro de parámetros y la cantidad de la acción. Aquí se utiliza una asignación de desestructuración para asignar los valores transferidos al libro de constantes y a la cantidad.

Si la cantidad transferida es inferior a 1, emitimos un mensaje de error correspondiente utilizando el método req.error() .

Por ahora, simplemente devolvemos 10 como stock actualizado. Lo ajustaremos en consecuencia más adelante.

Nota

Como alternativa al registro de un programa de control on, las acciones y funciones también se pueden implementar como métodos JavaScript convencionales en una clase de implementación de servicio. El nombre del método debe coincidir con el nombre de la acción/función. La implementación de nuestra acción envío de pedido tendría el siguiente aspecto:

JavaScript
1234567891011121314
class CatalogService extends cds.ApplicationService { submitOrder(book, quantity) { const { Books } = this.entities; if (quantity < 1) { return req.error('The quantity must be at least 1.'); } let stock = 10; return { stock }; } }

Tal implementación de estilo de método de una acción/función no está registrada en el método init() .

Llamada de acciones/funciones

Uso programático a través de API

Las acciones y funciones se pueden llamar dentro de la codificación. CAP proporciona dos opciones diferentes para este uso programático: una API genérica y una API tipificada. Para este último, Node.js equipa instancias de servicio generadas con métodos específicos cuyos nombres y parámetros corresponden a la declaración de las acciones/funciones en el modelo de servicio. Estos métodos generados automáticamente proporcionan una forma conveniente de invocar acciones/funciones.

Nota

En la documentación de la PAC se pueden encontrar ejemplos de la utilización programática de acciones/funciones.

Solicitudes HTTP

También se puede acceder a las acciones y funciones directamente a través de solicitudes HTTP. Las funciones se llaman mediante solicitudes GET, mientras que las acciones se abordan mediante solicitudes POST.

Por ejemplo, una solicitud HTTP para llamar nuestra acción envío no vinculado podría tener el siguiente aspecto:

Code Snippet
1234567
POST <service_url>/submitOrder Content-Type: application/json { "book": "0ec991dc-95c5-4d8f-91e6-f81a92744781", "quantity": 2 }

Nota

Otros ejemplos de solicitudes HTTP para llamar acciones/funciones no vinculadas y vinculadas se pueden encontrar en la documentación de CAP.

Demostración y ejercicio: Definir e implementar una acción personalizada

Nota

Como ejercicio, lleve a cabo las instrucciones paso a paso en la siguiente demostración en SAP Business Application Studio.

Como punto de partida para el ejercicio, utilice el resultado del ejercicio anterior Proporcione un programa de control de eventos .after si lo ha completado correctamente. Como alternativa, también puede utilizar la ramificación 12_.after_event_handler del siguiente repositorio GitHub como punto de partida:

https://github.com/SAP-samples/cap-development-learning-journey

La implementación completa de la simulación se puede encontrar en la rama 13_custom_action del repositorio GitHub.

Puede encontrar información detallada sobre el contenido del repositorio y cómo utilizarlo aquí.

Vea el vídeo para ver cómo definir e implementar una acción personalizada.