📊sap-fiori-analytical-chart
- プラグイン
- sap-fiori-mcp-server
- 引数
- Entity, dimension, measure, aggregation
- ソース
- GitHub で見る ↗
説明
集計データを使用して、SAP Fiori Elements のリストレポートに分析チャート(チャートとテーブルのハイブリッド)を追加します。 CAP および ABAP RAP(OData V4)をサポートしています。
原文を表示
Add analytical chart (chart + table hybrid) to SAP Fiori Elements List Report using aggregated data. Supports CAP and ABAP RAP (OData V4).
ユースケース
- ✓集計データを可視化したい
- ✓SAP Fiori Elements のリストレポートを拡張する
- ✓チャートとテーブルを組み合わせて表示する
本文(日本語訳)
SAP Fiori アナリティカルチャート
目的
集計データを可視化するための**アナリティカルチャート+テーブル(ハイブリッドビュー)**を追加します。
必須: 最初に必要な入力情報を収集すること
以下の入力情報がプロンプトに一つでも不足している場合は、処理を中断してユーザーに確認してください:
- Entity - アナリティカルチャートを追加する対象のエンティティ
- ディメンションフィールド - グループ化に使用するフィールド(例: Category、Status、Destination)
- メジャーフィールド - 集計対象の数値フィールド(例: Amount、TotalPrice、ReservationPrice)
- 集計メソッド - 集計方法: sum、avg、min、max のいずれか
- チャートタイプ - Bar、Column、Line、Pie、HeatMap、Waterfall、HorizontalWaterfall のいずれか
- 表示モード - チャートの表示方法:
- タブ分割表示(Approach 2)
- ハイブリッドビュー(Approach 1)
すべての入力情報が確認できるまで実装に進まないこと。
CAP 実装
集計の有効化
@Aggregation.ApplySupported: {
Transformations: ['aggregate','groupby'],
AggregatableProperties: [{Property: Amount}],
GroupableProperties: [Category]
}
集計プロパティ
Analytics.AggregatedProperty #Amount_avg: {
AggregatableProperty: Amount,
AggregationMethod: 'average'
}
チャート
UI.Chart #AnalyticalChart: {
$Type: 'UI.ChartDefinitionType',
Title: 'Chart Title',
ChartType: #Column,
Dimensions: [Category],
DynamicMeasures: ['@Analytics.AggregatedProperty#Amount_avg'],
MeasureAttributes: [{
$Type: 'UI.ChartMeasureAttributeType',
DynamicMeasure: '@Analytics.AggregatedProperty#Amount_avg',
Role: #Axis1
}],
DimensionAttributes: [{
$Type: 'UI.ChartDimensionAttributeType',
Dimension: Category,
Role: #Category
}]
},
UI.PresentationVariant #ChartView: {
$Type: 'UI.PresentationVariantType',
Text: 'Chart View',
Visualizations: ['@UI.Chart#AnalyticalChart']
},
UI.PresentationVariant #TableView: {
$Type: 'UI.PresentationVariantType',
Text: 'Table View',
Visualizations: ['@UI.LineItem']
}
✅ DynamicMeasures を使用
ABAP RAP 実装(2ステップ+マニフェスト設定)
重要: metadata.xml は絶対に編集しないこと — 読み取り専用です!
⚠️ 実装前チェックリスト — 実装前に必ず確認すること
以下のいずれかが欠けていると、アプリが起動しない、またはロードに失敗します:
- [ ] プロジェクションビュー(ZC_*)に
@OData.applySupportedForAggregation: #FULLを付与 - [ ] メジャーフィールドに
@Aggregation.default: #AVG(または #SUM、#MIN、#MAX)を付与 - [ ] メタデータエクステンションに正しい qualifier を持つ
@UI.chartアノテーションを定義 - [ ] マニフェストの
views.pathsを設定 - [ ] すべての CDS オブジェクトをアクティブ化済み
1. バックエンド プロジェクションビュー(必須)— 集計サポートの有効化
⚠️ 重要: @OData.applySupportedForAggregation アノテーションは必須です
このアノテーションがない場合:
- OData サービスが集計をサポートしません
- アプリがロードに失敗します(空白画面またはエラー)
- チャートアノテーションが無視されます
配置場所:
- ✅
TRANSACTIONAL_QUERYコントラクトを持つ プロジェクションビュー(ZC_* または ZZZC_*)に配置すること - ❌ インターフェースビュー(ZR_* または ZZZR_*)には配置しないこと
正しい例:
@OData.applySupportedForAggregation: #FULL ← 必須!必ず記述すること!
define root view entity ZC_ENTITY
provider contract TRANSACTIONAL_QUERY
as projection on ZR_ENTITY
{
@Aggregation.default: #AVG ← メジャーの集計メソッドを指定
Amount;
Category; ← ディメンションフィールド(集計アノテーション不要)
}
誤った例:
// ❌ 誤り — インターフェースビューには配置しないこと
@OData.applySupportedForAggregation: #FULL ← 配置場所が誤り!
define root view entity ZR_ENTITY
as select from TABLE
2. バックエンド メタデータエクステンション(必須)— チャート・PresentationVariant アノテーションの追加
@UI.chart: [{
qualifier: 'AnalyticalChart',
title: 'Chart Title',
description: 'Chart description',
chartType: #COLUMN,
dimensions: ['Category'],
measures: ['Amount'],
dimensionAttributes: [{
dimension: 'Category',
role: #CATEGORY
}],
measureAttributes: [{
measure: 'Amount',
role: #AXIS_1
}]
}]
@UI.presentationVariant: [{
qualifier: 'ChartView',
text: 'Chart View',
visualizations: [{
type: #AS_CHART,
qualifier: 'AnalyticalChart'
}]
},
{
qualifier: 'TableView',
text: 'Table View',
visualizations: [{
type: #AS_LINEITEM
}]
}]
annotate view ZC_ENTITY with
{
// その他のフィールドアノテーション...
@EndUserText.label: 'Amount'
Amount;
@EndUserText.label: 'Category'
Category;
}
マニフェスト設定(CAP・RAP 共通)
Approach 1: ハイブリッドビュー(チャート+テーブルを同時表示)
マニフェスト:
"views": {
"paths": [
{
"primary": [
{ "annotationPath": "com.sap.vocabularies.UI.v1.Chart#AnalyticalChart" }
],
"secondary": [
{ "annotationPath": "com.sap.vocabularies.UI.v1.LineItem" }
],
"defaultPath": "both"
}
]
}
Approach 2: PresentationVariant を使用した複数ビュータブ
マニフェスト:
"views": {
"paths": [
{
"key": "ChartView",
"annotationPath": "com.sap.vocabularies.UI.v1.PresentationVariant#ChartView"
},
{
"key": "TableView",
"annotationPath": "com.sap.vocabularies.UI.v1.PresentationVariant#TableView"
}
]
}
テスト
CAP プロジェクト
npm run watch-<app-name> # 例: npm run watch-manage-travel
# または汎用 watch スクリプトが利用可能な場合
cds watch
RAP プロジェクト
npm run start-mock # メタデータの更新が必要
npm start # 更新不要 — 実行時にライブバックエンドからメタデータを取得
- RAP の場合、SAP/クラウドシステムでのメタデータ更新方法については、利用可能であれば Fiori MCP サーバーを参照してください。
実装順序(RAP)
エラーを防ぐため、以下の順序に従って実装してください:
-
プロジェクションビュー(ZC_ENTITY)を修正
- 先頭に
@OData.applySupportedForAggregation: #FULLを追加 - メジャーフィールドに
@Aggregation.default: #AVGを追加 - プロジェクションビューをアクティブ化
- 先頭に
-
メタデータエクステンションを修正
@UI.chartアノテーションを追加@UI.presentationVariantアノテーションを追加- メタデータエクステンションをアクティブ化
-
Fiori アプリ マニフェストを更新
views.pathsの設定を追加- manifest.json を保存
-
テスト
npm startを実行(ライブメタデータを取得 — 再パブリッシュ不要)- サービスバインディングの再パブリッシュは不要
トラブルシューティング
症状: アプリが起動しない / 空白画面 / チャートが表示されない
原因 1: @OData.applySupportedForAggregation: #FULL が未設定
- 解決策: プロジェクションビュー(ZC_*)に追加し、アクティブ化後にアプリを再起動
原因 2: アノテーションが誤ったビューに配置されている
- 解決策: インターフェースビュー(ZR_)からプロジェクションビュー(ZC_)に移動
原因 3: メジャーフィールドが数値型でない
- 解決策: フィールドが数値型(Amount、Quantity、Decimal、Integer)であることを確認
原因 4: マニフェスト内の qualifier が一致していない
- 解決策: マニフェストの qualifier が
@UI.chart: [{ qualifier: 'AnalyticalChart' }]と一致していることを確認
原因 5: メジャーに @Aggregation.default が未設定
- 解決策: メジャーフィールドに
@Aggregation.default: #AVG(または #SUM、#MIN、#MAX)を追加
症状: チャートは表示されるがデータが正しくない
原因: 集計メソッドが誤っている
- 解決策:
@Aggregation.defaultの値(#AVG、#SUM、#MIN、#MAX)を変更
CAP と RAP の主な違い
CAP:
- 集計とメジャーは CDS 内で定義
- DynamicMeasures を使用
RAP:
- 集計はバックエンド CDS のみで定義
- Measures を使用
よくある間違い
共通:
- マニフェスト設定の誤り
- Approach 1 と Approach 2 の設定が混在している
- メジャーフィールドが数値型でない
- qualifier の不一致(マニフェストとアノテーションが一致していない)
RAP 固有:
- ❌ 最も多い:
@OData.applySupportedForAggregation: #FULLの未設定 → アプリが起動しない - ❌ 集計アノテーションをプロジェクションビューではなくインターフェースビューに配置している
- ❌ メジャーフィールドに
@Aggregation.defaultが未設定 - ❌ 変更後に CDS オブジェクトのアクティブ化を忘れている
- ❌ 誤ったビューコントラクトを使用している(
TRANSACTIONAL_QUERYでなければならない)
ベストプラクティス
- ディメンション 1 つ+メジャー 1〜2 つの構成を推奨
- Column / Bar チャートを優先して使用
- Approach 1:
"defaultPath": "both"を使用して、同一ビュー内にチャートとテーブルを並べて表示 - Approach 2:
PresentationVariantを使用して、チャートとテーブルを別々のビュータブとして表示
参考リンク
- ABAP RAP 集計サポート: https://help.sap.com/docs/abap-cloud/abap-rap/projection-view
原文(English)を表示
SAP Fiori Analytical Chart
Purpose
Add analytical chart + table (hybrid view) to visualize aggregated data.
MANDATORY: Gather Required Inputs First
STOP and ASK the user for ALL of these inputs if ANY are missing from the prompt:
- Entity - Which entity to add the analytical chart to
- Dimension field - The field to group by (e.g., Category, Status, Destination)
- Measure field - The numeric field to aggregate (e.g., Amount, TotalPrice, ReservationPrice)
- Aggregation method - How to aggregate: sum, avg, min, or max
- Chart type - Bar, Column, Line, Pie, HeatMap, Waterfall, HorizontalWaterfall
- Display mode - How the chart should be shown:
- Separate tabs (Approach 2)
- Hybrid view (Approach 1)
DO NOT proceed with implementation until all inputs are confirmed.
CAP Implementation
Enable Aggregation
@Aggregation.ApplySupported: {
Transformations: ['aggregate','groupby'],
AggregatableProperties: [{Property: Amount}],
GroupableProperties: [Category]
}
Aggregated Property
Analytics.AggregatedProperty #Amount_avg: {
AggregatableProperty: Amount,
AggregationMethod: 'average'
}
Chart
UI.Chart #AnalyticalChart: {
$Type: 'UI.ChartDefinitionType',
Title: 'Chart Title',
ChartType: #Column,
Dimensions: [Category],
DynamicMeasures: ['@Analytics.AggregatedProperty#Amount_avg'],
MeasureAttributes: [{
$Type: 'UI.ChartMeasureAttributeType',
DynamicMeasure: '@Analytics.AggregatedProperty#Amount_avg',
Role: #Axis1
}],
DimensionAttributes: [{
$Type: 'UI.ChartDimensionAttributeType',
Dimension: Category,
Role: #Category
}]
},
UI.PresentationVariant #ChartView: {
$Type: 'UI.PresentationVariantType',
Text: 'Chart View',
Visualizations: ['@UI.Chart#AnalyticalChart']
},
UI.PresentationVariant #TableView: {
$Type: 'UI.PresentationVariantType',
Text: 'Table View',
Visualizations: ['@UI.LineItem']
}
✅ Uses DynamicMeasures
ABAP RAP Implementation (2 Steps + Manifest Configuration)
CRITICAL: NEVER EDIT metadata.xml - IT IS READ-ONLY!
⚠️ PRE-FLIGHT CHECKLIST - Verify BEFORE Implementation
Missing ANY of these will cause the app to fail/not load:
- [ ]
@OData.applySupportedForAggregation: #FULLon projection view (ZC_*) - [ ]
@Aggregation.default: #AVG(or #SUM, #MIN, #MAX) on measure field - [ ]
@UI.chartannotation with correct qualifier in metadata extension - [ ] Manifest
views.pathsconfiguration - [ ] All CDS objects activated
1. Backend Projection View (MANDATORY) - Enable Aggregation Support
⚠️ CRITICAL: @OData.applySupportedForAggregation annotation is MANDATORY
WITHOUT this annotation:
- OData service will NOT support aggregation
- App will FAIL TO LOAD (blank screen/errors)
- Chart annotations will be ignored
Placement:
- ✅ MUST be on PROJECTION view (ZC_* or ZZZC_*) with
TRANSACTIONAL_QUERYcontract - ❌ NOT on interface view (ZR_* or ZZZR_*)
CORRECT Example:
@OData.applySupportedForAggregation: #FULL ← MANDATORY! Must be present!
define root view entity ZC_ENTITY
provider contract TRANSACTIONAL_QUERY
as projection on ZR_ENTITY
{
@Aggregation.default: #AVG ← Specify aggregation method for measure
Amount;
Category; ← Dimension field (no aggregation annotation needed)
}
WRONG Example:
// ❌ WRONG - Don't put on interface view
@OData.applySupportedForAggregation: #FULL ← WRONG PLACE!
define root view entity ZR_ENTITY
as select from TABLE
2. Backend Metadata Extension (MANDATORY) - Add Chart, PresentationVariant Annotations
@UI.chart: [{
qualifier: 'AnalyticalChart',
title: 'Chart Title',
description: 'Chart description',
chartType: #COLUMN,
dimensions: ['Category'],
measures: ['Amount'],
dimensionAttributes: [{
dimension: 'Category',
role: #CATEGORY
}],
measureAttributes: [{
measure: 'Amount',
role: #AXIS_1
}]
}]
@UI.presentationVariant: [{
qualifier: 'ChartView',
text: 'Chart View',
visualizations: [{
type: #AS_CHART,
qualifier: 'AnalyticalChart'
}]
},
{
qualifier: 'TableView',
text: 'Table View',
visualizations: [{
type: #AS_LINEITEM
}]
}]
annotate view ZC_ENTITY with
{
// Other field annotations...
@EndUserText.label: 'Amount'
Amount;
@EndUserText.label: 'Category'
Category;
}
Manifest Configuration (Common for CAP and RAP)
Approach 1: Hybrid View (Chart + Table Together)
Manifest:
"views": {
"paths": [
{
"primary": [
{ "annotationPath": "com.sap.vocabularies.UI.v1.Chart#AnalyticalChart" }
],
"secondary": [
{ "annotationPath": "com.sap.vocabularies.UI.v1.LineItem" }
],
"defaultPath": "both"
}
]
}
Approach 2: Multiple View Tabs with PresentationVariant
Manifest:
"views": {
"paths": [
{
"key": "ChartView",
"annotationPath": "com.sap.vocabularies.UI.v1.PresentationVariant#ChartView"
},
{
"key": "TableView",
"annotationPath": "com.sap.vocabularies.UI.v1.PresentationVariant#TableView"
}
]
}
Testing
CAP Projects
npm run watch-<app-name> # e.g., npm run watch-manage-travel
# or use generic watch script if available
cds watch
RAP Projects
npm run start-mock # Needs metadata refresh
npm start # No refresh needed - fetches metadata from live backend at runtime
- Consult fiori mcp server if available on how to refresh metadata for sap/cloud systems in case of RAP
Implementation Order (RAP)
Follow this sequence to avoid errors:
-
Modify Projection View (ZC_ENTITY)
- Add
@OData.applySupportedForAggregation: #FULLat top - Add
@Aggregation.default: #AVGto measure field - Activate projection view
- Add
-
Modify Metadata Extension
- Add
@UI.chartannotation - Add
@UI.presentationVariantannotations - Activate metadata extension
- Add
-
Update Fiori App Manifest
- Add
views.pathsconfiguration - Save manifest.json
- Add
-
Test
- Run
npm start(fetches live metadata - no republishing needed) - Service binding does NOT need to be republished
- Run
Troubleshooting
Symptom: App doesn't load / Blank screen / Chart not visible
Cause 1: Missing @OData.applySupportedForAggregation: #FULL
- Solution: Add to projection view (ZC_*), activate, restart app
Cause 2: Annotation on wrong view
- Solution: Move from interface view (ZR_) to projection view (ZC_)
Cause 3: Measure field not numeric
- Solution: Verify field is numeric type (Amount, Quantity, Decimal, Integer)
Cause 4: Wrong qualifier in manifest
- Solution: Verify qualifier in manifest matches
@UI.chart: [{ qualifier: 'AnalyticalChart' }]
Cause 5: Missing @Aggregation.default on measure
- Solution: Add
@Aggregation.default: #AVG(or #SUM, #MIN, #MAX) to measure field
Symptom: Chart shows but with wrong data
Cause: Wrong aggregation method
- Solution: Change
@Aggregation.defaultvalue (#AVG, #SUM, #MIN, #MAX)
Key Differences
CAP:
- Aggregation + measures defined in CDS
- Uses DynamicMeasures
RAP:
- Aggregation defined in backend CDS only
- Uses Measures
Common Mistakes
General:
- Wrong manifest config
- Mixing Approach 1 and Approach 2 configurations
- Non-numeric measure field
- Wrong qualifier (manifest doesn't match annotation)
RAP-Specific:
- ❌ MOST COMMON: Missing
@OData.applySupportedForAggregation: #FULL→ App won't load - ❌ Placing aggregation annotation on interface view instead of projection view
- ❌ Missing
@Aggregation.defaulton measure field - ❌ Forgetting to activate CDS objects after changes
- ❌ Using wrong view contract (must be
TRANSACTIONAL_QUERY)
Best Practices
- Use 1 dimension + 1–2 measures
- Prefer Column/Bar charts
- Approach 1: Use "defaultPath": "both" for chart + table side-by-side in same view
- Approach 2: Use
PresentationVariantfor separate view tabs (chart or table)
References
- ABAP RAP Aggregation support: https://help.sap.com/docs/abap-cloud/abap-rap/projection-view
原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。