Criação e execução de consultas

Objective

After completing this lesson, you will be able to criar e executar consultas de banco de dados

Construindo consultas

Na lição anterior, criamos a ação submitOrder para o CatalogService. A implementação desta ação ainda não está completa, uma vez que ainda falta o conhecimento de como acessar tabelas de banco de dados. Vamos aprender isso a seguir.

Para implementar a ação submitOrder, precisamos dos dois acessos ao banco de dados a seguir:

  1. Queremos garantir que o estoque atual para o livro pedido é superior ou igual à quantidade pedida. Para isso, é necessário selecionar o estoque atual do banco de dados.
  2. Se houver livros suficientes em estoque e a ordem for executada, reduzimos o estoque atual. Isso significa que temos que atualizar o estoque no banco de dados adequadamente.

API fluente

O módulo cds.ql fornece uma API do tipo SQL para a construção de tais consultas de banco de dados. As consultas necessárias para nosso cenário são mostradas na figura a seguir.

A API é disponibilizada por meio dos objetos globais SELECT, INSERT, UPSERT, UPDATE e DELETE.

Nota

Como alternativa, você pode obter esses objetos de cds.ql da seguinte forma:
JavaScript
12
const cds = require('@sap/cds'); const { SELECT, INSERT, UPSERT, UPDATE, DELETE } = cds.ql;
Além disso, métodos de conveniência estão disponíveis para criar objetos de consulta cds.ql. Detalhes sobre esta API estilo CRUD com métodos como read(), insert(), upsert(), update() e delete() podem ser encontrados na documentação CAP.

A API disponível por meio dos objetos CRUD listados é concebida como uma API fluente. Isso significa que os métodos disponíveis nesses objetos retornam objetos do mesmo tipo. As propriedades disponíveis - como a propriedade .one do objeto SELECT usado no exemplo mostrado - também têm objetos do mesmo tipo que seu valor. Isso permite o encadeamento, o que torna a codificação intuitiva e legível.

Nota

Detalhes sobre os métodos utilizados no exemplo exibido e as variantes de sintaxe disponíveis podem ser encontrados na documentação CAP.

Para identificar a tabela de banco de dados a ser acessada, usamos a definição CSN da entidade Livros no exemplo mostrado. Esta é a abordagem recomendada.

API fluente com modelos marcados

Como uma alternativa às chamadas de método clássicas mostradas acima, a API fluente também pode ser usada com modelos marcados. A figura a seguir mostra como as consultas construídas acima usando chamadas de método clássicas podem ser criadas usando modelos marcados. O resultado é o mesmo em ambos os casos.

Nota

Os modelos marcados são um recurso JavaScript. Isso torna possível analisar e transformar literais de modelo - ou seja, literais delimitados com caracteres backtick (`) - usando uma função. Um modelo marcado parece uma chamada de função na qual o nome da função é colocado diretamente antes de um literal de modelo sem parênteses - por exemplo, .where`ID=${book}`.

Executando consultas

Na seção anterior, discutimos como os objetos query são criados. No entanto, as queries estruturadas não são executadas automaticamente. Eles ainda precisam ser enviados explicitamente para o banco de dados para execução. Agora vamos explorar como isso é alcançado.

Nota

Embora a API fluente de cds.ql se assemelhe à sintaxe SQL, os objetos de consulta construídos não estão bloqueados no SQL. Isso significa que as consultas criadas podem ser enviadas para qualquer tipo de serviço para execução, ou seja, não só para bancos de dados, mas também para outros serviços locais ou remotos. Por exemplo, se uma consulta for enviada para um serviço OData, ela será convertida em uma solicitação OData enviada via HTTP.

A seguir, examinaremos como as consultas podem ser executadas no banco de dados. Neste contexto, não importa se os objetos query foram criados mediante chamadas de método clássicas ou mediante modelos marcados. Nos exemplos a seguir, usaremos chamadas de método clássicas para a construção de consultas.

Executando consultas no banco de dados

As consultas são executadas no banco de dados transferindo-as para o método cds.db.run() (consulte a figura a seguir). Isso se aplica não só a consultas SELECT, como mostrado no exemplo, mas também à escrita de consultas ao banco de dados, como um UPDATE.

No exemplo, o operador await é utilizado para esperar pelo resultado da consulta SELECT.one. Este resultado é atribuído à constante b. No momento da execução, a constante é um objeto com uma característica chamada estoque. O valor desta propriedade é o estoque selecionado no banco de dados para o livro que foi especificado usando o método where() . Se não for possível encontrar um livro com o ID indicado na tabela de banco de dados, a constante b recebe o valor undefined.

Nota

O operador await só pode ser usado dentro de uma função assíncrona ou no nível superior de um módulo. Declaramos, portanto, o método reduceStock() como async.

Aguardando consultas

Como alternativa à abordagem acima, você também pode simplesmente await uma consulta construída. Isso transfere a consulta para o método cds.db.run() por padrão. Isso significa que o exemplo seguinte e o anterior são equivalentes em relação à consulta SELECT:

O exemplo também mostra como a atualização é executada no banco de dados.

Após a atualização, um objeto é retornado ao chamador de acordo com o tipo de resposta da ação submitOrder. Este objeto tem um estoque de propriedade cujo valor é o estoque atualizado para o livro pedido.

Na parte do exercício desta lição, você encontrará a implementação completa para o método reduceStock(). Nesta implementação, é emitida uma mensagem de erro se o ID do livro transferido não existir no banco de dados (ou seja, se a constante b tiver o valor undefined). Uma mensagem de erro também é emitida se o estoque do registro for inferior à quantidade pedida.

Demonstração e Exercício: Utilizar Consultas na Implementação de Serviços CAP

Nota

Como exercício, execute as instruções passo a passo na demonstração a seguir no SAP Business Application Studio.

Como ponto de partida para o exercício, utilize o resultado do exercício anterior Definir e implementar uma ação personalizada se você a tiver concluído com êxito. Como alternativa, você também pode utilizar a ramificação 13_custom_action do seguinte repositório GitHub como ponto de partida:

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

A implementação completa da simulação pode ser encontrada no ramo 14_queries do repositório GitHub.

Informações detalhadas sobre o conteúdo do repositório e como usá-lo podem ser encontradas aqui.

Assista ao vídeo para ver como utilizar consultas na implementação de Serviços CAP.