SAP ABAP CDS Viewの作成方法:基礎から実践まで徹底解説

はじめに

CDS(Core Data Services)Viewは、SAP ABAP開発におけるデータモデリングの新標準です。従来のSE11(データディクショナリ)によるビュー定義と異なり、CDS Viewはデータベース層でのリッチな演算・集計・結合を宣言的に記述でき、SAP HANA最適化やODataサービス公開との親和性が非常に高い技術です。

本記事では、CDS Viewの基本概念から始まり、SE80とADT(Eclipse)それぞれの作成手順・アノテーション・各種ビュータイプ・実務でよく使うパターンまでを、実際のコードを交えながら体系的に解説します。


1. CDS Viewとは何か

1.1 概要

CDS(Core Data Services)は、ABAPおよびHANA SQLの上位に位置するデータ定義言語(DDL)です。CDS Viewを使うことで、複雑なデータ取得ロジックをABAPコードではなくデータベース層に落とし込み、処理のプッシュダウン(Code-to-Data)を実現できます。

1.2 従来のViewとの違い

比較項目 SE11 View CDS View
定義場所 ABAPワークベンチ ADT(Eclipse)またはSE80
処理場所 アプリケーション層 データベース層(HANA最適化)
アノテーション なし 豊富なアノテーション対応
OData連携 別途実装が必要 @OData.publish: trueで即公開可能
集計・演算 限定的 SUM/COUNT/CASE/WINDOWなど豊富
再利用性 低い 継承・Extensionで高い再利用性
S/4HANA対応 一部非推奨 推奨アーキテクチャ

1.3 CDS Viewの種類

  • Basic View(基底View):単一テーブルへのマッピングが中心。マスタテーブルや単純なトランザクションデータに使用
  • Composite View(複合View):複数のBasic Viewを結合してビジネスエンティティを構築
  • Consumption View(消費View):UI・OData・レポートなどフロントエンドに公開するView
  • Interface View:システム間インターフェース用の安定したデータ契約として機能
  • Projection View(S/4HANA専用):Consumption用の薄いラッパーとして機能

2. 開発環境の準備

2.1 ADT(ABAP Development Tools)とSE80の使い分け

比較項目 SE80 ADT(Eclipse)
環境 SAP GUI(既存環境で利用可能) Eclipse + ABAPプラグイン(別途インストール)
コード補完 限定的 高精度なインテリセンス対応
シンタックスチェック 保存時のみ リアルタイム
デバッグ 標準ABAPデバッガ ABAP Debugger(ADT強化版)
リファクタリング 手動 自動リネーム・Extract Methodなど
推奨度 入門・既存環境 現場標準・本番推奨

ADTが使える環境ではADTを強く推奨しますが、SE80でも問題なくCDS Viewの作成・編集が可能です。


3. SE80によるCDS Viewの作成手順

SE80はSAP GUIから直接アクセスできる従来のABAPワークベンチです。追加インストールなしで利用でき、既存のSAP開発者にとって馴染みのある環境です。

3.1 SE80へのアクセスと基本操作

  1. SAP GUIを起動し、トランザクションコード SE80 を入力して実行
  2. 左上のドロップダウンで「Package」または「Program」を選択
  3. 対象の開発パッケージ(例:ZPACKAGE_CDS)を入力してEnter

3.2 新規DDLソース(CDS View)の作成

手順①:オブジェクトの新規作成

  1. SE80のオブジェクトナビゲーターで、作成先パッケージを右クリック
  2. コンテキストメニューから CreateOtherDDL Source を選択
  3. 以下のダイアログが表示されます:
入力項目 説明
DDL Source Name CDS Viewのオブジェクト名(Z/Yで始める) ZI_MATERIAL
Description オブジェクトの説明 材料マスタView
Package 格納パッケージ ZDEV_PACKAGE
  1. 入力後「Continue」をクリック

手順②:トランスポート依頼の設定

  • 開発クライアントでは作業用トランスポート依頼を選択します
  • 初回作成の場合は「Create Request」で新規依頼を作成
  • 依頼番号(例:DEVK900123)を確認・記録しておく

手順③:テンプレート選択

テンプレート 用途
Define View 標準的なCDS View(ECC/S/4HANA共通)
Define View Entity S/4HANA 2020以降の新形式(RAP対応)
Define Abstract Entity RAP用の抽象エンティティ定義
Define Custom Entity カスタムエンティティ(独自ロジック実装)

初学者は「Define View」を選択することをおすすめします。

手順④:DDLソースエディタでコードを記述

テンプレートが自動挿入された状態でエディタが開きます:

@AbapCatalog.sqlViewName: 'ZV_MATERIAL'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserTexts.label: '材料マスタView'
@VDM.viewType: #BASIC

define view ZI_MATERIAL
  as select from mara
{
  key mara.matnr   as MaterialNumber,
      mara.mtart   as MaterialType,
      mara.mbrsh   as Industry,
      mara.matkl   as MaterialGroup,
      mara.meins   as BaseUnit,
      mara.ersda   as CreationDate,
      mara.ernam   as CreatedByUser
}

手順⑤:アクティブ化

  • Ctrl + F3 または上部メニューの「Activate」ボタンでアクティブ化
  • エラーがある場合、下部のコンソールにエラーメッセージが表示されます
  • アクティブ化が成功すると、SE11でもZV_MATERIALというSQL Viewが自動作成されます

3.3 SE80でのCDS View確認・編集方法

既存CDS Viewを開く:

  1. SE80のドロップダウンで「DDL Source」を選択
  2. CDS View名(例:ZI_MATERIAL)を入力してEnter
  3. エディタが開き、コードの参照・編集が可能

SE80でのデータプレビュー:

  1. DDLエディタを開いた状態で、上部メニューから Execute(F8)を実行
  2. 選択画面が表示されたら条件を入力して再実行
  3. データが一覧表示されます(ALVグリッド形式)

SE11との連携確認:

SE80でCDS Viewをアクティブ化すると、@AbapCatalog.sqlViewNameに指定した名前でSE11にSQL Viewが登録されます。SE11で該当View名を検索すると、テーブル構造(フィールド一覧)を確認できます。

3.4 SE80使用時のよくある注意点

  • sqlViewNameは最大16文字:SE11のView名になるため16文字以内に収める必要があります
  • アクティブ化エラー:SE80でのシンタックスチェックはADTより弱いため、アノテーションの記述ミスはアクティブ化時まで気づかないことがあります
  • 同時編集の注意:他の開発者が同一オブジェクトを開いている場合は読み取り専用になります
  • SE80でのAssociation:Associationのシンタックスはサポートされていますが、ADTに比べて補完が効かないため手動入力が多くなります

4. ADT(Eclipse)によるCDS Viewの作成手順

4.1 ADTのインストールと設定

  1. Eclipse IDEをインストール(https://www.eclipse.org/)
  2. Help → Install New Software からSAP ADTプラグインを追加
    • URL:https://tools.hana.ondemand.com/latest
  3. ABAPサーバーへの接続を設定(ホスト・システム番号・クライアント番号を入力)
  4. プロジェクトエクスプローラーからABAPプロジェクトを作成

4.2 ADTでの新規CDS View作成

  1. プロジェクトエクスプローラーで対象パッケージを右クリック
  2. NewOther ABAP Repository ObjectCore Data ServicesData Definition を選択
  3. 名前・説明・テンプレートを選択して「Finish」

ADTではリアルタイム補完・エラーハイライト・Ctrl+クリックによる定義ジャンプなど、SE80より高度な編集機能が利用できます。


5. 基本的なCDS Viewのコード構造

①アノテーション(@)

  • @AbapCatalog.sqlViewName:SE11で参照できるSQL Viewの名前(必須)
  • @AccessControl.authorizationCheck:アクセス制御の設定(#CHECK#NOT_REQUIRED#NOT_ALLOWED
  • @VDM.viewType:VDMにおけるViewの種別(#BASIC#COMPOSITE#CONSUMPTION

②define view

  • CDS Viewの定義宣言
  • as select from テーブル名 でベーステーブルを指定

③フィールドリスト

  • key キーワードでキーフィールドを指定
  • テーブル名.フィールド名 as エイリアス で別名を付ける

6. テーブル結合(JOIN)

6.1 INNER JOINの例

@AbapCatalog.sqlViewName: 'ZV_SALESORDER'
@AccessControl.authorizationCheck: #CHECK
@VDM.viewType: #BASIC

define view ZI_SalesOrderHeader
  as select from vbak
    inner join vbpa on  vbpa.vbeln = vbak.vbeln
                    and vbpa.posnr = '000000'
                    and vbpa.parvw = 'AG'
{
  key vbak.vbeln  as SalesOrder,
      vbak.erdat  as CreationDate,
      vbak.auart  as SalesDocumentType,
      vbak.vkorg  as SalesOrganization,
      vbak.kunnr  as SoldToParty,
      vbpa.kunnr  as Partner
}

6.2 LEFT OUTER JOINの例

define view ZI_MaterialWithText
  as select from mara
    left outer join makt on  makt.matnr  = mara.matnr
                          and makt.spras = $session.system_language
{
  key mara.matnr   as MaterialNumber,
      mara.mtart   as MaterialType,
      makt.maktx   as MaterialDescription
}

6.3 Associationによる遅延結合

Associationはアクセス時まで結合を遅延させる仕組みです。消費側から必要な場合のみ結合が発生するため、パフォーマンスに優れています。

define view ZI_MaterialWithAssoc
  as select from mara
  association [0..1] to makt as _Text
    on  _Text.matnr  = $projection.MaterialNumber
    and _Text.spras  = $session.system_language
  association [0..*] to marc as _Plant
    on _Plant.matnr  = $projection.MaterialNumber
{
  key mara.matnr   as MaterialNumber,
      mara.mtart   as MaterialType,
      _Text,
      _Plant
}

7. よく使うアノテーション一覧

7.1 AbapCatalogアノテーション

アノテーション 説明
@AbapCatalog.sqlViewName SE11 SQL Viewの名前(必須、最大16文字)
@AbapCatalog.preserveKey キーを維持して結合時のカーディナリティを保持
@AbapCatalog.compiler.compareFilter フィルター最適化の有効化
@AbapCatalog.buffering.status バッファリング設定

7.2 Semanticsアノテーション

define view ZI_InvoiceItem
  as select from vbrp
{
  key vbrp.vbeln                         as BillingDocument,
  key vbrp.posnr                         as BillingItem,
      @Semantics.amount.currencyCode: 'Currency'
      vbrp.netwr                         as NetAmount,
      @Semantics.currencyCode: true
      vbrp.waerk                         as Currency,
      @Semantics.quantity.unitOfMeasure: 'BaseUnit'
      vbrp.fkimg                         as BilledQuantity,
      @Semantics.unitOfMeasure: true
      vbrp.vrkme                         as BaseUnit
}

7.3 UI / Analyticsアノテーション

アノテーション 説明
@UI.lineItem Fiori ListレポートのListテーブルに表示
@UI.selectionField フィルター条件として使用
@Analytics.dataCategory #FACT / #DIMENSION
@Analytics.query: true Query Viewとして宣言

8. 集計・演算・CASE式

8.1 集計関数

define view ZI_SalesOrderSummary
  as select from vbap
{
  key vbap.matnr               as MaterialNumber,
      vbap.vkorg               as SalesOrganization,
      sum(vbap.netwr)          as TotalNetAmount,
      count(distinct vbap.vbeln) as OrderCount,
      avg(vbap.netwr)          as AvgNetAmount
}
group by vbap.matnr, vbap.vkorg

8.2 CASE式

define view ZI_MaterialCategory
  as select from mara
{
  key mara.matnr                          as MaterialNumber,
      case mara.mtart
        when 'FERT' then '完成品'
        when 'HALB' then '半製品'
        when 'ROH'  then '原材料'
        else 'その他'
      end                                 as MaterialTypeText,
      case
        when mara.brgew > 100 then '重量物'
        when mara.brgew > 10  then '中量物'
        else '軽量物'
      end                                 as WeightCategory
}

9. パラメータ付きCDS View

define view ZI_MaterialByType
  with parameters
    p_mtart : mara-mtart,
    p_matkl : mara-matkl
  as select from mara
{
  key mara.matnr   as MaterialNumber,
      mara.mtart   as MaterialType,
      mara.matkl   as MaterialGroup
}
where
  mara.mtart = :p_mtart
  and mara.matkl = :p_matkl

ABAPからの呼び出し方:

SELECT *
  FROM ZI_MaterialByType( p_mtart = 'FERT', p_matkl = '001' )
  INTO TABLE @DATA(lt_material).

10. アクセス制御(DCL)

@MappingRole: true
define role ZI_Material {
  grant select on ZI_MATERIAL
    where (mara.mandt) = aspect pfcg_auth(M_MATE_MAR, ACTVT, '03');
}
設定値 説明
#CHECK DCLによるアクセス制御を適用(本番推奨)
#NOT_REQUIRED アクセス制御不要(テスト用・内部View)
#NOT_ALLOWED 継承先のViewに制御を委ねる

11. ODataサービスとの連携

@OData.publish: true
@AbapCatalog.sqlViewName: 'ZV_MAT_ODATA'
@AccessControl.authorizationCheck: #CHECK

define view ZI_Material_OData
  as select from mara
{
  key mara.matnr   as MaterialNumber,
      mara.mtart   as MaterialType,
      mara.matkl   as MaterialGroup,
      mara.meins   as BaseUnit
}

公開後は /IWFND/MAINT_SERVICE からサービスを有効化します。


12. CDS View Entity(S/4HANA 2020以降)

@AccessControl.authorizationCheck: #CHECK
@EndUserTexts.label: '材料エンティティ'

define view entity ZI_Material_Entity
  as select from mara
{
  key mara.matnr   as MaterialNumber,
      mara.mtart   as MaterialType,
      mara.matkl   as MaterialGroup,
      mara.meins   as BaseUnit,
      mara.ersda   as CreationDate
}
項目 define view define view entity
@AbapCatalog.sqlViewName 必須 不要
RAP対応 低い 高い
S/4HANA推奨 旧形式 新標準

13. よくあるエラーと対処法

エラー内容 原因 対処法
sqlViewNameの重複 既存SE11 Viewと名前が衝突 別の名前を使用
CARDINALITYエラー JOIN条件が不完全 [0..1]等を明示する
アクセス制御エラー DCLが存在しない DCLを作成または#NOT_REQUIREDに変更
フィールド名の重複 複数テーブルに同名フィールド エイリアスで別名を付ける
パラメータ未指定エラー パラメータを渡さずに呼び出している 呼び出し時にパラメータを明示的に渡す
SE80でアクティブ化失敗 アノテーション記述ミス ADTで開き直してエラーを確認

14. 実務でよく使うパターン

パターン①:マスタ+テキストの結合

define view ZI_CustomerWithText
  as select from kna1
    left outer join kna1t on  kna1t.kunnr = kna1.kunnr
                           and kna1t.spras = $session.system_language
{
  key kna1.kunnr   as Customer,
      kna1.land1   as Country,
      kna1t.name1  as CustomerName
}

パターン②:ヘッダー+明細の集計

define view ZI_SalesOrderWithTotal
  as select from vbak
    inner join vbap on vbap.vbeln = vbak.vbeln
{
  key vbak.vbeln              as SalesOrder,
      vbak.kunnr              as SoldToParty,
      sum(vbap.netwr)         as TotalAmount,
      count(vbap.posnr)       as ItemCount
}
group by vbak.vbeln, vbak.kunnr, vbak.erdat

パターン③:期間フィルター付き

define view ZI_ActiveCondition
  as select from konp
    inner join konm on konm.knumh = konp.knumh
{
  key konp.knumh   as ConditionRecord,
      konp.kbetr   as ConditionRate,
      konm.datab   as ValidFrom,
      konm.datbi   as ValidTo
}
where konm.datbi >= $session.system_date

まとめ

CDS Viewは現代のSAP開発において避けては通れない技術です。

SE80でもADTでも作成できることを理解したうえで、入門段階ではSE80で基本的な構文に慣れ、慣れてきたらADTに移行するというステップが効果的です。SE80はインストール不要でSAP GUIから即座にアクセスでき、既存開発者にとって馴染みやすい環境です。一方ADTはリアルタイム補完・エラー検出・デバッグ機能が充実しており、チーム開発や複雑なView設計に向いています。

どちらの環境を使う場合も、VDMレイヤー設計(Basic→Composite→Consumption)を意識した3層構造でViewを設計することで、再利用性と保守性が大幅に向上します。またS/4HANAへの移行を見据えるなら、define view entityとRAP(RESTful Application Programming Model)を組み合わせたモダンな開発スタイルへの移行を進めることをお勧めします。