SAP Fiori Elements のリスト画面(List Report)に、集計データを使った分析チャート(グラフとテーブルの組み合わせ)を追加できます。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).
集計データを可視化するための**アナリティカルチャート+テーブル(ハイブリッドビュー)**を追加します。
以下の入力情報がプロンプトに一つでも不足している場合は、処理を中断してユーザーに確認してください:
すべての入力情報が確認できるまで実装に進まないこと。
@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 を使用
以下のいずれかが欠けていると、アプリが起動しない、またはロードに失敗します:
@OData.applySupportedForAggregation: #FULL を付与@Aggregation.default: #AVG(または #SUM、#MIN、#MAX)を付与@UI.chart アノテーションを定義views.paths を設定⚠️ 重要: @OData.applySupportedForAggregation アノテーションは必須です
このアノテーションがない場合:
配置場所:
TRANSACTIONAL_QUERY コントラクトを持つ プロジェクションビュー(ZC_* または ZZZC_*)に配置すること正しい例:
@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
@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;
}
マニフェスト:
"views": {
"paths": [
{
"primary": [
{ "annotationPath": "com.sap.vocabularies.UI.v1.Chart#AnalyticalChart" }
],
"secondary": [
{ "annotationPath": "com.sap.vocabularies.UI.v1.LineItem" }
],
"defaultPath": "both"
}
]
}
マニフェスト:
"views": {
"paths": [
{
"key": "ChartView",
"annotationPath": "com.sap.vocabularies.UI.v1.PresentationVariant#ChartView"
},
{
"key": "TableView",
"annotationPath": "com.sap.vocabularies.UI.v1.PresentationVariant#TableView"
}
]
}
npm run watch-<app-name> # 例: npm run watch-manage-travel
# または汎用 watch スクリプトが利用可能な場合
cds watch
npm run start-mock # メタデータの更新が必要
npm start # 更新不要 — 実行時にライブバックエンドからメタデータを取得
エラーを防ぐため、以下の順序に従って実装してください:
プロジェクションビュー(ZC_ENTITY)を修正
@OData.applySupportedForAggregation: #FULL を追加@Aggregation.default: #AVG を追加メタデータエクステンションを修正
@UI.chart アノテーションを追加@UI.presentationVariant アノテーションを追加Fiori アプリ マニフェストを更新
views.paths の設定を追加テスト
npm start を実行(ライブメタデータを取得 — 再パブリッシュ不要)原因 1: @OData.applySupportedForAggregation: #FULL が未設定
原因 2: アノテーションが誤ったビューに配置されている
原因 3: メジャーフィールドが数値型でない
原因 4: マニフェスト内の qualifier が一致していない
@UI.chart: [{ qualifier: 'AnalyticalChart' }] と一致していることを確認原因 5: メジャーに @Aggregation.default が未設定
@Aggregation.default: #AVG(または #SUM、#MIN、#MAX)を追加原因: 集計メソッドが誤っている
@Aggregation.default の値(#AVG、#SUM、#MIN、#MAX)を変更CAP:
RAP:
共通:
RAP 固有:
@OData.applySupportedForAggregation: #FULL の未設定 → アプリが起動しない@Aggregation.default が未設定TRANSACTIONAL_QUERY でなければならない)"defaultPath": "both" を使用して、同一ビュー内にチャートとテーブルを並べて表示PresentationVariant を使用して、チャートとテーブルを別々のビュータブとして表示Add analytical chart + table (hybrid view) to visualize aggregated data.
STOP and ASK the user for ALL of these inputs if ANY are missing from the prompt:
DO NOT proceed with implementation until all inputs are confirmed.
@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']
}
✅ Uses DynamicMeasures
Missing ANY of these will cause the app to fail/not load:
@OData.applySupportedForAggregation: #FULL on projection view (ZC_*)@Aggregation.default: #AVG (or #SUM, #MIN, #MAX) on measure field@UI.chart annotation with correct qualifier in metadata extensionviews.paths configuration⚠️ CRITICAL: @OData.applySupportedForAggregation annotation is MANDATORY
WITHOUT this annotation:
Placement:
TRANSACTIONAL_QUERY contractCORRECT 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
@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:
"views": {
"paths": [
{
"primary": [
{ "annotationPath": "com.sap.vocabularies.UI.v1.Chart#AnalyticalChart" }
],
"secondary": [
{ "annotationPath": "com.sap.vocabularies.UI.v1.LineItem" }
],
"defaultPath": "both"
}
]
}
Manifest:
"views": {
"paths": [
{
"key": "ChartView",
"annotationPath": "com.sap.vocabularies.UI.v1.PresentationVariant#ChartView"
},
{
"key": "TableView",
"annotationPath": "com.sap.vocabularies.UI.v1.PresentationVariant#TableView"
}
]
}
npm run watch-<app-name> # e.g., npm run watch-manage-travel
# or use generic watch script if available
cds watch
npm run start-mock # Needs metadata refresh
npm start # No refresh needed - fetches metadata from live backend at runtime
Follow this sequence to avoid errors:
Modify Projection View (ZC_ENTITY)
@OData.applySupportedForAggregation: #FULL at top@Aggregation.default: #AVG to measure fieldModify Metadata Extension
@UI.chart annotation@UI.presentationVariant annotationsUpdate Fiori App Manifest
views.paths configurationTest
npm start (fetches live metadata - no republishing needed)Cause 1: Missing @OData.applySupportedForAggregation: #FULL
Cause 2: Annotation on wrong view
Cause 3: Measure field not numeric
Cause 4: Wrong qualifier in manifest
@UI.chart: [{ qualifier: 'AnalyticalChart' }]Cause 5: Missing @Aggregation.default on measure
@Aggregation.default: #AVG (or #SUM, #MIN, #MAX) to measure fieldCause: Wrong aggregation method
@Aggregation.default value (#AVG, #SUM, #MIN, #MAX)CAP:
RAP:
General:
RAP-Specific:
@OData.applySupportedForAggregation: #FULL → App won't load@Aggregation.default on measure fieldTRANSACTIONAL_QUERY)PresentationVariant for separate view tabs (chart or table)原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。