クエリの構築と実行

Objective

After completing this lesson, you will be able to データベースクエリの作成および実行

クエリの構築

前のレッスンでは、CatalogServicesubmitOrder アクションを作成しました。データベーステーブルのアクセス方法に関する知識がまだ不足しているため、このアクションの実装はまだ完了していません。次はこれを学びます。

submitOrder アクションを実装するには、以下の 2 つのデータベースアクセスが必要です。

  1. 発注済帳簿の現在の在庫が発注済数量以上であることを確認する必要があります。これを行うには、データベースから現在在庫を選択する必要があります。
  2. 在庫に十分な帳簿があり、したがって受注が実行される場合、現在在庫を減らす必要があります。つまり、データベースの在庫を適宜更新する必要があります。

流暢な API

cds.ql モジュールは、このようなデータベースクエリを構築するための SQL のような API を提供します。以下の図は、シナリオに必要なクエリを示しています。

API は、グローバルオブジェクト SELECT、INSERT、UPSERT、UPDATE、および DELETE を介して利用可能になります。

注記

または、以下のように cds.ql からこれらのオブジェクトを取得することもできます。
JavaScript
12
const cds = require('@sap/cds'); const { SELECT, INSERT, UPSERT, UPDATE, DELETE } = cds.ql;
また、cds.ql クエリオブジェクトを作成するための便利なメソッドも用意されています。read()insert()upsert()update()delete() などのメソッドを含むこの CRUD スタイルの API の詳細については、CAP 文書を参照してください

一覧表示された CRUD オブジェクトを介して利用可能な API は、流暢な API として設計されています。つまり、これらのオブジェクトで使用可能なメソッドは、同じタイプのオブジェクトを返します。例で使用されている SELECT オブジェクトの .one プロパティなど、使用可能なプロパティにも、値と同じタイプのオブジェクトがあります。これにより、コーディングを直感的かつ読みやすくする連鎖が可能になります。

注記

表示されている例で使用されるメソッド、および利用可能な構文バリアントの詳細については、CAP 文書を参照してください

アクセスするデータベーステーブルを識別するために、この例では Books エンティティの CSN 定義を使用します。これが推奨されるアプローチです。

タグ付きテンプレートを含む流暢な API

上記の従来のメソッド呼出の代わりに、fluent API をタグ付けされたテンプレートとともに使用することもできます。以下の図は、タグ付けされたテンプレートを使用して、上記の従来のメソッドコールを使用して構築されたクエリを登録する方法を示しています。どちらの場合も、結果は同じです。

注記

タグ付けされたテンプレートは JavaScript 機能です。関数を使用して、テンプレートリテラル (つまり、バックティック文字 (`) で区切られたリテラル) を解析および変換することができます。タグ付けされたテンプレートは、関数名が括弧なしのテンプレートリテラルの直前に配置される関数呼出のようになります (例: .where`ID=${book}`)。

クエリの実行

前のセクションでは、クエリオブジェクトの登録方法について説明します。ただし、構築されたクエリは自動的に実行されません。これらは、実行のためにデータベースに明示的に送信する必要があります。ここでは、これがどのように実現されるかについて考察します。

注記

cds.ql の fluent API は SQL 構文に似ていますが、構築されたクエリオブジェクトは SQL にロックインされません。つまり、作成されたクエリは、任意のタイプのサービスに送信して実行することができます。つまり、データベースだけでなく、他のローカルサービスまたはリモートサービスにも送信できます。たとえば、クエリが OData サービスに送信されると、HTTP を介して送信される OData 要求に変換されます。

以下では、データベースでのクエリの実行方法について説明します。このコンテキストでは、クエリオブジェクトが従来のメソッドコールとタグ付けされたテンプレートのどちらを使用して登録されたかは関係ありません。以下の例では、クエリ構築に従来のメソッドコールを使用します。

データベースでのクエリの実行

クエリは、cds.db.run() メソッドに渡すことによってデータベースで実行されます (以下の図を参照)。これは、例に示すように SELECT クエリだけでなく、UPDATE などのデータベースクエリの作成にも適用されます。

この例では、await 演算子を使用して SELECT.one クエリの結果を待機します。この結果は定数 b に割り当てられます。したがって、実行時には、この定数は stock というプロパティを持つオブジェクトです。このプロパティの値は、where() メソッドを使用して指定されたブックのデータベースで選択された在庫です。指定した ID のブックがデータベーステーブルで見つからない場合、定数 b には値 undefined が割り当てられます。

注記

await 演算子は、async 関数の内部、またはモジュールの最上位レベルでのみ使用できます。そのため、reduceStock() メソッドは async として宣言されています。

クエリ待ち

上記のアプローチの代わりに、単純に構築したクエリを await することもできます。デフォルトでは、クエリが cds.db.run() メソッドに渡されます。これは、SELECT クエリに関して、以下と前の例が同等であることを意味します。

この例は、データベースでの更新の実行方法も示しています。

更新後、オブジェクトは submitOrder アクションの応答タイプに従って呼出元に返されます。このオブジェクトにはプロパティストックがあり、その値はオーダー済帳簿の更新済在庫です。

このレッスンの演習問題部分では、reduceStock() メソッドの完全な実装について説明します。この実装では、渡されたブック ID がデータベースに存在しない場合 (つまり、定数 b の値が undefined の場合)、エラーメッセージが表示されます。また、帳簿の在庫が発注数量より少ない場合にも、エラーメッセージが表示されます。

デモおよび演習:CAP サービスの導入におけるクエリの使用

注記

演習問題として、SAP Business Application Studio で、以下のデモのステップバイステップの手順を実行します。

演習の開始点として、前の演習問題カスタムアクションの定義と実装の結果を使用します (正常に完了した場合)。または、以下の GitHub リポジトリのブランチ 13_custom_action を開始点として使用することもできます。

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

シミュレーションの完全な実装は、GitHub リポジトリの 14_queries ブランチにあります。

リポジトリのコンテンツとその使用方法の詳細については、ここを参照してください。

CAP サービスの実装でクエリを使用する方法については、ビデオを視聴してください。