Creación y ejecución de consultas

Objective

After completing this lesson, you will be able to crear y ejecutar consultas de base de datos

Construyendo consultas

En la lección anterior, creamos la acción suborden para el servicio de catálogo. La implementación de esta acción aún no está completa, ya que seguimos sin saber cómo acceder a las tablas de bases de datos. Aprenderemos esto a continuación.

Para implementar la acción envío de pedido, necesitamos los dos accesos a la base de datos siguientes:

  1. Queremos asegurarnos de que el stock actual del libro pedido sea mayor o igual que la cantidad pedida. Para ello, es necesario seleccionar el stock actual de la base de datos.
  2. Si hay suficientes libros en stock y, por lo tanto, se lleva a cabo el pedido, debemos reducir el stock actual. Esto significa que tenemos que actualizar el stock en la base de datos en consecuencia.

API fluida

El módulo cds.ql proporciona una API similar a SQL para construir tales consultas de base de datos. Las consultas necesarias para nuestro escenario se muestran en la siguiente figura.

La API está disponible mediante los objetos globales SELECT, INSERT, UPSERT, UPDATE y DELETE.

Nota

Como alternativa, puede obtener estos objetos de cds.ql de la siguiente manera:
JavaScript
12
const cds = require('@sap/cds'); const { SELECT, INSERT, UPSERT, UPDATE, DELETE } = cds.ql;
Además, hay métodos de conveniencia disponibles para crear objetos de consulta cds.ql. Encontrará detalles sobre esta API de estilo CRUD con métodos como read(), insert(), upsert(), update() y delete() en la documentación de la PAC.

La API disponible a través de los objetos CRUD enumerados está diseñada como una API fluida. Esto significa que los métodos disponibles en estos objetos devuelven objetos del mismo tipo. Las propiedades disponibles (como la propiedad .one del objeto SELECT utilizado en el ejemplo mostrado) también tienen objetos del mismo tipo que su valor. Esto permite encadenar, lo que hace que la codificación sea intuitiva y legible.

Nota

Encontrará detalles sobre los métodos utilizados en el ejemplo mostrado y las variantes de sintaxis disponibles en la documentación de CAP.

Para identificar la tabla de base de datos a la que se va a acceder, utilizamos la definición CSN de la entidad Libros en el ejemplo que se muestra. Este es el enfoque recomendado.

API fluida con plantillas etiquetadas

Como alternativa a las llamadas de método clásicas mostradas anteriormente, la API fluida también se puede utilizar con plantillas etiquetadas. La siguiente figura muestra cómo se pueden crear las consultas construidas anteriormente utilizando llamadas de método clásicas utilizando plantillas etiquetadas. El resultado es el mismo en ambos casos.

Nota

Las plantillas etiquetadas son una función de JavaScript. Hace posible analizar y transformar literales de plantilla - es decir, literales delimitados con caracteres de retroceso (`) - utilizando una función. Una plantilla etiquetada parece una llamada de función en la que el nombre de la función se coloca directamente antes de un literal de plantilla sin corchetes (por ejemplo, .where`ID=${book}`).

Ejecutando consultas

En la sección anterior, hemos analizado cómo se crean los objetos query. Sin embargo, las consultas creadas no se ejecutan automáticamente. Aún deben enviarse explícitamente a la base de datos para su ejecución. Ahora exploraremos cómo se logra.

Nota

Aunque la API fluida de cds.ql se parece a la sintaxis SQL, los objetos de consulta construidos no están bloqueados en SQL. Esto significa que las consultas creadas se pueden enviar a cualquier tipo de servicio para su ejecución, es decir, no solo a bases de datos, sino también a otros servicios locales o remotos. Por ejemplo, si una consulta se envía a un servicio OData, se convierte en una solicitud OData enviada mediante HTTP.

A continuación, examinaremos cómo se pueden ejecutar las consultas en la base de datos. En este contexto, no importa si los objetos query se han creado mediante llamadas de método clásicas o mediante modelos etiquetados. En los siguientes ejemplos, utilizaremos llamadas de método clásicas para la construcción de consultas.

Consultas en ejecución en la base de datos

Las consultas se ejecutan en la base de datos pasándolas al método cds.db.run() (véase la siguiente figura). Esto se aplica no solo a las consultas SELECT, como se muestra en el ejemplo, sino también a la escritura de consultas de base de datos como una UPDATE.

En el ejemplo, el operador await se utiliza para esperar el resultado de la consulta SELECT.one. Este resultado se asigna a la constante b. En tiempo de ejecución, la constante es, por lo tanto, un objeto con una propiedad llamada stock. El valor de esta propiedad es el stock seleccionado en la base de datos para el libro que se especificó mediante el método where() . Si no se encuentra un libro con el ID especificado en la tabla de base de datos, a la constante b se le asigna el valor undefined.

Nota

El operador await solo se puede utilizar dentro de una función asíncrona o en el nivel superior de un módulo. Por lo tanto, hemos declarado el método reduceStock() como async.

Esperando consultas

Como alternativa al enfoque anterior, también puede simplemente await una consulta construida. Esto pasa la consulta al método cds.db.run() por defecto. Esto significa que lo siguiente y el ejemplo anterior son equivalentes con respecto a la consulta SELECT:

El ejemplo también muestra cómo se ejecuta la actualización en la base de datos.

Después de la actualización, se devuelve un objeto al programa de llamada de acuerdo con el tipo de respuesta de la acción envOrder. Este objeto tiene un stock de propiedad cuyo valor es el stock actualizado para el libro pedido.

En la parte del ejercicio de esta lección, encontrará la implementación completa del método reduceStock(). En esta implementación, se emite un mensaje de error si el ID de libro transferido no existe en la base de datos (es decir, si la constante b tiene el valor undefined). También se emite un mensaje de error si el stock del libro es menor que la cantidad pedida.

Demostración y ejercicio: Utilizar consultas en la implementación de servicios CAP

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 Definir e implementar una acción personalizada si la ha completado correctamente. Como alternativa, también puede utilizar la ramificación 13_custom_action 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 14_queries 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 utilizar las consultas en la implementación de CAP Services.