claude-skills/

Anthropic公式スキル・プラグインの日本語ディレクトリ

last sync 22h ago
スキルOfficialdevelopment

📊sap-fiori-analytical-chart

プラグイン
sap-fiori-mcp-server
引数
Entity, dimension, measure, aggregation

説明

集計データを使用して、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 アナリティカルチャート

目的

集計データを可視化するための**アナリティカルチャート+テーブル(ハイブリッドビュー)**を追加します。


必須: 最初に必要な入力情報を収集すること

以下の入力情報がプロンプトに一つでも不足している場合は、処理を中断してユーザーに確認してください:

  1. Entity - アナリティカルチャートを追加する対象のエンティティ
  2. ディメンションフィールド - グループ化に使用するフィールド(例: Category、Status、Destination)
  3. メジャーフィールド - 集計対象の数値フィールド(例: Amount、TotalPrice、ReservationPrice)
  4. 集計メソッド - 集計方法: sum、avg、min、max のいずれか
  5. チャートタイプ - Bar、Column、Line、Pie、HeatMap、Waterfall、HorizontalWaterfall のいずれか
  6. 表示モード - チャートの表示方法:
    • タブ分割表示(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)

エラーを防ぐため、以下の順序に従って実装してください:

  1. プロジェクションビュー(ZC_ENTITY)を修正

    • 先頭に @OData.applySupportedForAggregation: #FULL を追加
    • メジャーフィールドに @Aggregation.default: #AVG を追加
    • プロジェクションビューをアクティブ化
  2. メタデータエクステンションを修正

    • @UI.chart アノテーションを追加
    • @UI.presentationVariant アノテーションを追加
    • メタデータエクステンションをアクティブ化
  3. Fiori アプリ マニフェストを更新

    • views.paths の設定を追加
    • manifest.json を保存
  4. テスト

    • 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 を使用して、チャートとテーブルを別々のビュータブとして表示

参考リンク

原文(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:

  1. Entity - Which entity to add the analytical chart to
  2. Dimension field - The field to group by (e.g., Category, Status, Destination)
  3. Measure field - The numeric field to aggregate (e.g., Amount, TotalPrice, ReservationPrice)
  4. Aggregation method - How to aggregate: sum, avg, min, or max
  5. Chart type - Bar, Column, Line, Pie, HeatMap, Waterfall, HorizontalWaterfall
  6. 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: #FULL on projection view (ZC_*)
  • [ ] @Aggregation.default: #AVG (or #SUM, #MIN, #MAX) on measure field
  • [ ] @UI.chart annotation with correct qualifier in metadata extension
  • [ ] Manifest views.paths configuration
  • [ ] 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_QUERY contract
  • 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:

  1. Modify Projection View (ZC_ENTITY)

    • Add @OData.applySupportedForAggregation: #FULL at top
    • Add @Aggregation.default: #AVG to measure field
    • Activate projection view
  2. Modify Metadata Extension

    • Add @UI.chart annotation
    • Add @UI.presentationVariant annotations
    • Activate metadata extension
  3. Update Fiori App Manifest

    • Add views.paths configuration
    • Save manifest.json
  4. Test

    • Run npm start (fetches live metadata - no republishing needed)
    • Service binding does NOT need to be republished

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.default value (#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.default on 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 PresentationVariant for separate view tabs (chart or table)

References

原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。