SAP technical topicObjectCDS view entities versus classic CDS DDIC viewsModuleRAP_CDS_ODATA

CDS View Entities vs Classic CDS DDIC Views

A classic CDS DDIC view is declared with 'define view' and generates a real ABAP Dictionary database view object you can find in the dictionary object list. A CDS view entity is declared with 'define view entity', is the current standard for new development including RAP, and does not create that classic DDIC view object, which changes how you find it, trace it, and use it as a RAP root entity.

This page covers the structural difference between the two DDL source types that both look like 'a CDS view' to a casual reader, why that difference breaks assumptions carried over from classic ABAP development, and how to decide which one a given piece of custom code should use. It focuses on the migration and diagnostic problems that show up in real projects, not on syntax comparison.

Published 16 Sept 2026· 1,497 words

What it is

Both are DDL sources compiled into database views at activation, and both carry CDS annotations, associations and exposure metadata. The structural fact that causes most confusion is that a classic CDS view (DDL source type 'view') always generates a corresponding object in the ABAP Dictionary, the same kind of object you get from SE11 view maintenance, with its own technical name visible in the dictionary object browser. A CDS view entity (DDL source type 'view entity') does not generate that dictionary object. It is compiled and executed directly by the CDS infrastructure as its own artifact type. This is not a cosmetic syntax change from 'define view' to 'define view entity'. It affects how the object is looked up, how associations redirect, how it is traced at the database layer, and whether it can serve as the persistence root of a RAP business object. Consultants who treat the rename as purely stylistic run into missing-object confusion the first time they go looking for it in the dictionary.

When to use it

Use a CDS view entity for anything new: RAP business objects of any kind, any Fiori-facing data model built from this point forward, and any place where association redirection, draft handling, or managed save logic will eventually sit on top of the model. It is the required persistence layer for RAP root and child entities. Use a classic CDS DDIC view only when there is a concrete reason to keep the classic dictionary view object around, for example a reporting layer or a legacy consumer that does native SQL or old-style dictionary tooling against the generated view name, or an existing SEGW-generated OData v2 service that already depends on the classic view and is not being rebuilt. Reaching for a classic CDS view on a brand new development is a mistake almost every time; it buys nothing and forecloses a clean path into RAP later.

How it fits the stack

Below both sits the same layer: database tables, CDS table functions, or AMDP-backed views providing the raw data. Above a classic CDS view sits whatever consumed the generated dictionary view: native SQL, older ABAP reports, or a SEGW project mapped onto it. Above a CDS view entity sits the RAP stack directly: behavior definitions attach to it as the underlying persistence, service definitions expose it through OData, and associations on it drive navigation in Fiori elements list reports and object pages. CDS view entities effectively supersede classic CDS views as the entry point into new custom data models; they are not a replacement for CDS table functions or AMDP, which remain the layer below when set-based logic cannot express the requirement. Classic CDS views are not being removed, but they are being pushed downward into a legacy or reporting-only role rather than sitting at the head of new service development.

A worked example

A team builds a custom approval object for internal purchase requests. The old approach, still present elsewhere in the same system, defined a classic CDS view named something like ZC_PURCHREQ_OLD with 'define view', exposed it through a SEGW project, and wired approval logic through a BOPF-based unmanaged implementation. For the new object the team defines ZI_PurchReqApproval with 'define view entity', selects from the base table, exposes header fields and an association to a line-item child view entity, and adds a composition annotation. A behavior definition is then written against ZI_PurchReqApproval as the managed root, with a create action for submission and a determination that sets the initial status. A service definition exposes both the root and the child through OData V4, and the Fiori elements list report renders directly off the root's annotations. No SEGW project is involved anywhere in this second path, and no classic dictionary view object is ever generated for ZI_PurchReqApproval, which is the detail that trips up anyone searching for it the old way.

How to choose

  • Is this new development or an extension of something already built on a classic CDS view. New development defaults to a view entity with no real debate; extending existing classic views usually means staying classic unless the extension itself is substantial enough to justify a rewrite.
  • Does the object need to be a RAP root or child entity. If yes, it must be a CDS view entity; classic CDS views cannot serve as the managed persistence root, so this criterion alone settles most cases.
  • Does anything outside ABAP, or any old tooling, depend on a real dictionary database view existing with a stable technical name. If so, a classic CDS view is the only option that guarantees that object exists to be pointed at.
  • How much association redirection does the model need. View entities have cleaner, more predictable redirection syntax; a model with several layers of to-parent and to-child redirection is noticeably easier to maintain as a view entity.
  • Is there budget to convert. Automated conversion tooling exists but does not guarantee semantic equivalence, particularly around outer joins and literal handling, so a converted view needs the same regression testing as a rewritten one, not a rubber stamp.
  • What does the authorization and tracing tooling in this landscape expect. Some older custom monitoring or authorization review scripts key off the classic dictionary view name; check before assuming a silent migration is safe.

Common pitfalls

  • Assuming 'define view' to 'define view entity' is a drop-in rename. Association syntax, redirection, and sometimes key definitions need rework, and code that compiles after a naive find-and-replace can still behave differently at runtime.
  • Searching the ABAP Dictionary object list for a CDS view entity and concluding it does not exist because no classic database view object with that name shows up there. It exists; it is just not a dictionary object in the classic sense.
  • Trying to use a classic CDS view as the root persistence entity of a managed RAP business object. It may activate and even generate a behavior definition, but service binding or draft handling fails or misbehaves at runtime because the root is not a view entity.
  • Running the automated conversion tool and treating a green activation as proof of correctness. Outer join null handling, implicit type casts, and literal behavior have been known to shift slightly on conversion, and this only shows up in edge-case test data, not in a quick smoke test.
  • Losing the correlation between an SQL trace entry and the source CDS view entity, because the generated runtime object name does not match the DDL source name the way a classic view's dictionary name did. Debugging performance issues without CDS-aware tooling becomes guesswork.
  • Forgetting that access control (DCL) attachment and buffering settings, where used, need to be re-verified after conversion rather than assumed to carry over unchanged.

ECC, S/4HANA and clean core

CDS view entities are the current standard for custom development on S/4HANA and are mandatory for RAP business objects, which is itself the recommended pattern under a clean core approach for anything that used to be a custom BOPF or function-module-driven object. Classic CDS DDIC views are still fully supported and are not being withdrawn, but new custom development that reaches for one instead of a view entity is working against the direction the platform and the tooling are both pushing. Existing classic views feeding stable reporting or legacy OData V2 services are reasonable to leave alone; the discouraged pattern is starting a brand new custom object on a classic CDS view when a view entity was available and no dependency forced the older choice.

Whose problem this is

This is a developer decision made at design time, but it belongs on the architect's standards checklist for any new custom development, since retrofitting a classic view into a view entity later is real rework, not a flag flip. Functional consultants are only affected indirectly, through what fields and associations end up exposed for extension.

Related SAP objects

Reviewed pages this object connects to in the ERPClimb knowledge graph.

Source: ERPClimb — https://erpclimb.com/sap-technical-topics/cds-view-entities-versus-classic-cds-ddic-viewsERPClimb is an independent platform and is not affiliated with SAP SE. Reference pages are written and reviewed by SAP consultants for learning and troubleshooting.