SAP BTP 学習日記 Day4 —— CDS Projection・SQLite 永続化・Bruno テスト・Fiori アノテーション
今日の学習内容
今日は4つのテーマを学習しました。CDS Projection の応用、SQLite 永続化、Bruno を使った API テスト、Fiori アノテーションです。それぞれ実際にコードを書きながら動作確認しました。
① CDS Projection の深掘り
今まで projection on で全フィールドをそのまま公開していましたが、今日は3つの応用パターンを学びました。
フィールドを絞る
外部に公開したくないフィールドを除外できます。
entity Books as projection on my.Books {
ID,
title,
author,
stock,
price,
publishedAt
// description は除外 → API に出てこない
}計算フィールドを追加する
DB に列を追加せず、Projection の中で計算フィールドを定義できます。
entity Books as select from my.Books {
ID,
title,
stock,
price,
stock * price as totalValue : Decimal(10, 2) // 在庫金額を自動計算
}where 条件でフィルタ
公開するデータに条件をつけられます。在庫が 0 の本は API に出てこなくなります。
entity Books as select from my.Books {
ID,
title,
stock,
price,
stock * price as totalValue : Decimal(10, 2)
} where stock > 0;💡 ポイント:DB を変えずに API の見せ方だけを柔軟にコントロールできるのが CDS Projection の強みです。
② cds deploy --to sqlite(永続化)
今まで --in-memory で起動していたため、サーバーを再起動するたびにデータが消えていました。SQLite ファイルに永続化することで再起動してもデータが残ります。
手順
# SQLite ファイルにデプロイ(db.sqlite が作成される)
cds deploy --to sqlite
# 以降は cds watch で起動するだけで db.sqlite を使うpackage.json の設定変更
"cds": {
"requires": {
"db": {
"kind": "sqlite",
"credentials": {
"url": "db.sqlite" // ← ":memory:" から変更
}
}
}
}| 設定 | 動作 | 用途 |
|---|---|---|
:memory: | 再起動でデータが消える | クイックテスト向け |
db.sqlite | 再起動してもデータが残る | ローカル開発向け |
③ Bruno で OData CRUD テスト
Postman の代わりに Bruno を使って OData V4 の CRUD 操作をすべてテストしました。
| 操作 | メソッド | URL |
|---|---|---|
| 全件取得 | GET | /odata/v4/catalog/Books |
| 1件取得 | GET | /odata/v4/catalog/Books(1) |
| 新規登録 | POST | /odata/v4/catalog/Books |
| 部分更新 | PATCH | /odata/v4/catalog/Books(99) |
| 削除 | DELETE | /odata/v4/catalog/Books(99) |
CAP は Handler を1行も書いていないのに、CRUD 全操作が自動で動きました。これが CAP の最大の強みです。
④ Fiori アノテーション(@UI)
アノテーションを使うと、Fiori Elements の画面表示をコードで制御できます。
annotate CatalogService.Books with @(
// 一覧画面に表示するカラムと順番を指定
UI.lineItem: [
{ $Type: 'UI.DataField', Value: title, Label: 'タイトル' },
{ $Type: 'UI.DataField', Value: author, Label: '著者' },
{ $Type: 'UI.DataField', Value: price, Label: '価格' },
{ $Type: 'UI.DataField', Value: stock, Label: '在庫' },
{ $Type: 'UI.DataField', Value: totalValue, Label: '在庫金額' }
],
// 検索バーに表示するフィールドを指定
UI.selectionFields: [ author, price ]
);アノテーションは OData の $metadata に正しく反映されており、Fiori Elements がこれを読み込んで画面を自動生成します。
⚠️ 注意点:Fiori Elements は UI5 フレームワークのキャッシュが非常に強いため、アノテーション変更後は別ブラウザや SAP Business Application Studio(BAS)を使うとキャッシュ問題を回避できます。
今日のトラブルシューティング
| 問題 | 原因 | 解決方法 |
|---|---|---|
| Entity is read-only エラー | @readonly アノテーションが設定されていた |
@readonly を削除 |
| 再起動するとデータが消える | package.json で :memory: が設定されていた |
url: "db.sqlite" に変更 |
| where 句の書き方エラー | where の位置が間違っていた |
{} の後ろに where を書く |
この記事は「SAP BTP 学習」シリーズの第4回です。6ヶ月間の独学で SAP BTP 開発へのキャリアチェンジを目指しています。