今日の学習内容

今日は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 開発へのキャリアチェンジを目指しています。