SAP ABAP CDS Viewの作成方法:基礎から実践まで徹底解説
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へのアクセスと基本操作
- SAP GUIを起動し、トランザクションコード SE80 を入力して実行
- 左上のドロップダウンで「Package」または「Program」を選択
- 対象の開発パッケージ(例:
ZPACKAGE_CDS)を入力してEnter
3.2 新規DDLソース(CDS View)の作成
手順①:オブジェクトの新規作成
- SE80のオブジェクトナビゲーターで、作成先パッケージを右クリック
- コンテキストメニューから
Create→Other→DDL Sourceを選択 - 以下のダイアログが表示されます:
| 入力項目 | 説明 | 例 |
|---|---|---|
| DDL Source Name | CDS Viewのオブジェクト名(Z/Yで始める) | ZI_MATERIAL |
| Description | オブジェクトの説明 | 材料マスタView |
| Package | 格納パッケージ | ZDEV_PACKAGE |
- 入力後「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を開く:
- SE80のドロップダウンで「DDL Source」を選択
- CDS View名(例:
ZI_MATERIAL)を入力してEnter - エディタが開き、コードの参照・編集が可能
SE80でのデータプレビュー:
- DDLエディタを開いた状態で、上部メニューから
Execute(F8)を実行 - 選択画面が表示されたら条件を入力して再実行
- データが一覧表示されます(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のインストールと設定
- Eclipse IDEをインストール(https://www.eclipse.org/)
- Help → Install New Software からSAP ADTプラグインを追加
- URL:
https://tools.hana.ondemand.com/latest
- URL:
- ABAPサーバーへの接続を設定(ホスト・システム番号・クライアント番号を入力)
- プロジェクトエクスプローラーからABAPプロジェクトを作成
4.2 ADTでの新規CDS View作成
- プロジェクトエクスプローラーで対象パッケージを右クリック
New→Other ABAP Repository Object→Core Data Services→Data Definitionを選択- 名前・説明・テンプレートを選択して「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)を組み合わせたモダンな開発スタイルへの移行を進めることをお勧めします。