はじめに
このODataシリーズの最終回では、Fioriアプリが裏側でODataをどのように使っているかを解説します。Fioriは「綺麗な画面」だけでなく、ODataを通じてSAPのデータにアクセスする一貫したアーキテクチャを持っています。
本記事で扱う内容は以下の3つです。
- FioriアプリのアーキテクチャとOData — 画面の裏側で何が起きているか
- SAPUI5のODataモデル — データバインディングの仕組み
- Fiori Elements — CDS Viewのアノテーションから自動生成されるUI
なぜこの知識が必要か(why so):Fiori アプリのカスタマイズや新規開発では、「画面に表示されるデータがどこから来るか」を理解する必要があります。答えはすべて OData です。OData サービスの構造を知っていれば、Fiori の動作原理が理解でき、問題発生時の原因切り分けも格段に速くなります。
Fiori アプリのアーキテクチャと OData
Fiori アプリの構成要素
SAP Fiori アプリは、大きく3つの層で構成されています。
flowchart LR
subgraph "ブラウザ(**クライアント**側)"
A["SAPUI5\n(JavaScriptフレームワーク)"]
B["ODataモデル\n(データ管理)"]
A --> B
end
subgraph "SAP **Gateway**"
C["ODataサービス\n(HTTPエンドポイント)"]
end
subgraph "SAP**バックエンド**"
D["CDS View / DPC\n(データ取得・更新)"]
E["ビジネスデータ\n(テーブル)"]
D --> E
end
B -->|"HTTP/OData\nGET/POST/PUT/DELETE"| C
C --> D| 層 | 技術 | 役割 |
|---|---|---|
| クライアント | SAPUI5(JavaScript) | UI の描画、ユーザー操作の処理、OData リクエストの送信 |
| Gateway | SAP Gateway | OData プロトコルの処理、認証、ルーティング |
| バックエンド | CDS View / DPC(Data Provider Class:ODataのバックエンドロジックを実装するABAPクラス) | データの取得・更新、ビジネスロジックの実行 |
Fiori アプリのすべてのデータ操作は OData を経由するのが基本原則です。画面に表示されるデータの取得、ユーザーが入力したデータの保存、検索条件によるフィルタリング――すべてが OData リクエストとして実行されます。
ユーザー操作と OData リクエストの対応
ユーザーが Fiori アプリ上で行う操作は、裏側で以下の OData リクエストに変換されています。
| ユーザー操作 | OData リクエスト | クエリオプション |
|---|---|---|
| 一覧画面を開く | GET /EntitySet | $top, $skip(ページング) |
| 検索条件を入力して検索 | GET /EntitySet?$filter=... | $filter |
| 一覧から1件を選択して詳細表示 | GET /EntitySet('key') | $expand(関連データ) |
| 新規作成して保存 | POST /EntitySet | — |
| 編集して保存 | PUT / MERGE(V2)/ PATCH(V4) /EntitySet('key') | — |
| 削除 | DELETE /EntitySet('key') | — |
| ソート | GET /EntitySet?$orderby=... | $orderby |
| 項目の値ヘルプ(ドロップダウン) | GET /ValueHelpSet | $filter(入力中の文字でフィルタ) |
補足:Fioriアプリの実際の動作ではMERGE(V2)やPATCH(V4)による部分更新が一般的です。PUTはエンティティ全体の置き換えを意味するため、変更したフィールドだけを送信するMERGE/PATCHの方が効率的で、SAPUI5のODataモデルもデフォルトでこの方式を採用しています。
読者への示唆(so what):Fiori アプリが「遅い」「データが表示されない」といった問題は、ブラウザの開発者ツール(F12)の Network タブで OData リクエストを確認することで原因を特定できます。どの URL にリクエストが飛んでいるか、レスポンスのステータスコードは何か、レスポンス時間はどれくらいか――これらを確認するだけで、問題の層(フロントエンド/Gateway/バックエンド)を切り分けられます。OData のエラーパターンと切り分け方法についてはODataサービスのテスト・デバッグで解説しています。
SAPUI5 の OData モデル
OData モデルとは
SAPUI5 では、OData モデルがアプリケーションとバックエンドの間のデータ管理層として機能します。UI のコントロール(テーブル、フォーム、入力フィールドなど)は OData モデルにデータバインドされており、モデルのデータが変わるとUIが自動的に更新されます。
flowchart LR
subgraph "SAPUI5 アプリ"
UI["UIコントロール\n(テーブル・フォーム)"] -->|"データバインディング\n{PropertyName}"| M["ODataモデル\n(データキャッシュ)"]
end
M -->|"GETリクエスト\n(自動送信)"| S["ODataサービス"]
S -->|"JSONレスポンス"| M読者への示唆(so what):ODataモデルの仕組みを理解していると、データが画面に反映されない問題のデバッグ時に、モデルのキャッシュ状態やバインディングパスの誤りを効率的に特定できます。
OData V2 モデルと V4 モデル
SAPUI5 では OData のバージョンに応じて異なるモデルクラスを使います。
| モデル | クラス名 | 特徴 |
|---|---|---|
| V2 モデル | sap.ui.model.odata.v2.ODataModel | 現在最も広く使われている。バッチリクエスト対応 |
| V4 モデル | sap.ui.model.odata.v4.ODataModel | 新しい標準。より効率的なデータ取得 |
S/4HANA Cloudの新規開発ではV4モデルが推奨されます。既存のSEGWベースのサービスを利用する場合はV2モデルを使います。プロジェクトで使用するODataバージョンはバックエンドのサービス実装方式に依存するため、先にサービス側の方針を確認してください。
バッチリクエスト
SAPUI5 の OData モデルは、複数のリクエストを1つの HTTP リクエストにまとめて送信する「バッチリクエスト」をサポートしています。
flowchart LR
subgraph "バッチなし(3回のHTTPリクエスト)"
A1["GET /HeaderSet"] --> A2["GET /ItemSet"] --> A3["GET /StatusSet"]
end
subgraph "バッチあり(1回のHTTPリクエスト)"
B1["POST /$batch\n中身:\nGET /HeaderSet\nGET /ItemSet\nGET /StatusSet"]
endなぜバッチが重要か(why so):Fiori アプリの1画面には複数のデータソースが表示されることが多く(ヘッダ情報、明細一覧、ステータスなど)、それぞれ別の OData リクエストが必要です。バッチリクエストにより、これらを1回のHTTP通信にまとめることで、ネットワークのラウンドトリップを削減しパフォーマンスを向上させます。
パフォーマンス問題の調査では、ブラウザのNetworkタブで$batchリクエストの中身を展開し、不要なリクエストが含まれていないかを確認することが第一歩です。
Fiori Elements
Fiori Elements とは
Fiori Elements は、CDS View のアノテーションを基にFiori の UIを自動生成する仕組みです。開発者が HTML や JavaScript を書かなくても、CDS View のアノテーション(@UI.*)を定義するだけで標準的な画面が生成されます。
従来の Freestyle Fiori との違い
| 項目 | Freestyle Fiori | Fiori Elements |
|---|---|---|
| UI の実装 | 開発者が SAPUI5 のコードを手書き | CDS View のアノテーションから自動生成 |
| 開発工数 | 高い(HTML/JS/CSS を書く) | 低い(アノテーション定義のみ) |
| カスタマイズ性 | 完全に自由 | テンプレートの範囲内(拡張は可能) |
| UX の一貫性 | 開発者のスキルに依存 | SAP のデザインガイドラインに自動準拠 |
| メンテナンス | UIコード+バックエンドの両方 | アノテーション変更のみで済むことが多い |
Fiori Elements のテンプレート
Fiori Elements には、業務パターンに応じた**テンプレート(フロアプラン)**が用意されています。
| テンプレート | 用途 | 画面構成 |
|---|---|---|
| List Report | データの検索・一覧表示 | フィルタバー + テーブル |
| Object Page | 1件のデータの詳細表示・編集 | ヘッダー + セクション |
| Worklist | シンプルな作業一覧 | テーブル(フィルタバーなし) |
| Overview Page | ダッシュボード的な概要表示 | カード形式の複数ビュー |
| Analytical List Page | 分析+一覧の統合 | グラフ + テーブル |
flowchart LR
subgraph "よくある画面遷移"
A["List Report\n(検索・一覧)"] -->|"1件選択"| B["Object Page\n(詳細・編集)"]
end
subgraph "ODataリクエスト"
C["GET /EntitySet\n?$filter=...\n(一覧取得)"]
D["GET /EntitySet('key')\n?$expand=...\n(詳細取得)"]
end
A --> C
B --> DCDS View アノテーションと Fiori Elements の対応
Fiori Elements は CDS View の @UI アノテーションを読み取って画面を構成します。CDS View のアノテーション体系についてはCDS Viewとは何か?S/4HANAのデータモデリングを支える新しい基盤で解説しています。
| アノテーション | Fiori Elements での効果 |
|---|---|
@UI.lineItem: [{position: 10}] | List Report のテーブルに列として表示(position で表示順を制御) |
@UI.selectionField: [{position: 10}] | List Report のフィルタバーに検索条件として表示 |
@UI.identification: [{position: 10}] | Object Page のフィールドとして表示 |
@UI.headerInfo | Object Page のヘッダー部分(タイトル、サブタイトル、画像)を定義 |
@UI.facet | Object Page のセクション構成を定義 |
@UI.hidden: true | 画面に表示しない(内部データとして使用) |
具体例:CDS View アノテーションから List Report が生成されるまで
define view entity Z_C_PurchaseOrder
as projection on Z_I_PurchaseOrderHeader
{
@UI.selectionField: [{ position: 10 }]
@UI.lineItem: [{ position: 10, label: '発注番号' }]
key PurchaseOrder,
@UI.selectionField: [{ position: 20 }]
@UI.lineItem: [{ position: 20, label: '会社コード' }]
CompanyCode,
@UI.lineItem: [{ position: 30, label: '仕入先' }]
Supplier,
@UI.lineItem: [{ position: 40, label: '作成日' }]
CreatedAt,
_Item
}
この CDS View から生成される List Report は以下のような構成になります。
| 画面要素 | 生成元 |
|---|---|
| フィルタバーに「発注番号」「会社コード」の入力欄 | @UI.selectionField |
| テーブルに「発注番号」「会社コード」「仕入先」「作成日」の4列 | @UI.lineItem |
| テーブルの列順序 | position の値で制御 |
HTML/JavaScript を1行も書かずに、CDS View のアノテーションだけで検索画面が完成するのが Fiori Elements の強みです。
OData シリーズ全体の振り返り
本シリーズ全5回で扱った内容を整理します。
flowchart LR
subgraph "第1回:ODataの基礎"
A1["エンティティ設計\nクエリオプション"]
end
subgraph "第2回:SAP×OData"
A2["SAP Gateway\nFES/BES構成"]
end
subgraph "第3回:サービスの作り方"
A3["SEGW方式\nRAP方式"]
end
subgraph "第4回:テスト・デバッグ"
A4["Gateway Client\nエラーログ"]
end
subgraph "第5回:Fiori×OData"
A5["SAPUI5モデル\nFiori Elements"]
end
A1 --> A2 --> A3 --> A4 --> A5各回の詳細トピック(Navigation Property、処理フロー、使い分け判断基準、頻出エラーパターン、アノテーション体系など)は下表を参照してください。
| 回 | 記事 | 主要トピック |
|---|---|---|
| 1 | ODataとは何か | エンティティ設計、Navigation Property、クエリオプション |
| 2 | SAP×OData | SAP Gateway、FES/BES構成、ODataリクエスト処理フロー |
| 3 | ODataサービスの作り方 | SEGW方式とRAP方式の比較、使い分けの判断基準 |
| 4 | テスト・デバッグ | Gateway Client、エラーログ、頻出エラーパターン |
| 5 | Fiori×OData(本記事) | SAPUI5のODataモデル、Fiori Elements、アノテーション |
よくある疑問
Q1. Fiori Elements と Freestyle Fiori はどちらを選ぶべきですか?
原則として Fiori Elements を第一候補とし、Elements のテンプレートでは実現できない要件がある場合にのみ Freestyle を選びます。
| 選択基準 | Fiori Elements | Freestyle |
|---|---|---|
| 標準的な一覧・詳細画面 | ✅ 最適 | 不要 |
| 高度にカスタマイズされたUI | テンプレート拡張で対応 | ✅ 必要な場合のみ |
| 開発スピード重視 | ✅ 圧倒的に速い | 工数が大きい |
| SAP の推奨 | ✅ 標準推奨(Clean Core戦略に沿った開発方式) | 限定的な場面のみ |
Q2. Fiori アプリから直接 ABAP を呼ぶことはできますか?
Fiori(SAPUI5)はブラウザ上で動く JavaScript アプリのため、ABAP を直接呼ぶことはできません。すべてのバックエンドアクセスは OData サービスを経由します。ABAP のロジックを実行したい場合は、OData サービスの Function Import(V2)や Action(V4)として公開し、Fiori 側からHTTPリクエストで呼び出します。Function Import(V2)やAction(V4)は、ODataサービスに独自の操作(例:発注の承認、在庫の払出など)を追加する仕組みです。
Q3. Fiori Launchpad とは何ですか?
Fiori Launchpad は、複数の Fiori アプリを統合的に管理・起動するポータル画面です。ユーザーはブラウザから Fiori Launchpad にログインし、タイルをクリックして各アプリを起動します。各タイルの裏側で、対応する OData サービスが呼び出されます。
Q4. OData 以外のデータアクセス方法は Fiori にありますか?
SAPUI5 は OData モデル以外にも JSON モデルや XML モデルをサポートしていますが、これらはクライアント側のローカルデータ用です。SAP バックエンドのデータにアクセスする場合は、OData が標準的かつ推奨される手段です。
まとめ
- Fiori アプリのすべてのデータ操作は OData サービスを経由しており、ユーザーの画面操作は裏側で GET / POST / PUT / DELETE に変換されている
- SAPUI5 の OData モデルがアプリとバックエンドの間のデータ管理層として機能し、データバインディングにより UI が自動更新される
- バッチリクエストにより、複数の OData リクエストを1回の HTTP 通信にまとめてパフォーマンスを向上させている
- Fiori Elements は CDS View の
@UIアノテーションから UI を自動生成する仕組みであり、HTML/JavaScript を書かずに標準的な画面を構築できる - 新規開発では Fiori Elements を第一候補とし、テンプレートで実現できない要件がある場合のみ Freestyle を選択する
- 問題発生時はブラウザの開発者ツール(Network タブ)で OData リクエストを確認することで、フロントエンド/Gateway/バックエンドの切り分けが可能
FioriとODataの連携をさらに深く理解するには、SAPUI5のデータバインディングやFiori Elementsの実装を実際に手を動かして学ぶのが効果的です。ABAP・OData・RAP・UI5 Fioriまで一貫して学べる実践講座で、Fiori開発の全体像を体系的に身につけられます。