Tipos de CDS views

Antes de entender los tipos, hay que entender qué es una CDS View. Una CDS View es una forma de definir modelos de datos directamente en la base de datos (HANA), usando SQL extendido y anotaciones.

Los tipos de CDS no son independientes, forman una arquitectura en capas:

Basic View → Composite View → Consumption View

Y cada capa tiene una responsabilidad distinta.

┌─────────────────────────────────────────────────────────┐
│ CONSUMPTION VIEW │
│ (Lo que ven las aplicaciones: Fiori, OData, Reports) │
├─────────────────────────────────────────────────────────┤
│ COMPOSITE VIEW │
│ (Lógica de negocio, combinación de Basic Views) │
├─────────────────────────────────────────────────────────┤
│ BASIC VIEW │
│ (Acceso directo a tablas, joins simples) │
├─────────────────────────────────────────────────────────┤
│ TABLAS DE BASE DE DATOS │
│ (MARA, VBAK, VBAP, KNA1, etc.) │
└─────────────────────────────────────────────────────────┘

Basic View (Vista básica)

Las Basic Views representan acceso directo a tablas base. Es la capa más cercana a las tablas de base de datos. Su función es exponer tablas de forma estructurada, aplicando joins simples y renombrando campos. Es la base sobre la que se construyen el resto de vistas.Características clave

Características:

CaracterísticaDescripción
PropósitoAcceso directo a tablas base
ComplejidadBaja
Anotación principal@VDM.viewType: #BASIC
¿Se consume directamente?❌ No recomendado para UI/APIs
¿Contiene lógica de negocio?❌ No (solo estructura de datos)

¿Para qué sirve exactamente?

  • Filtrar datos básicos → Ej. solo materiales activos
  • Centralizar el acceso a tablas → Si varias vistas necesitan los mismos campos de MARA, creas una Basic View y todas la reutilizan.
  • Aplicar joins simples → Unir tablas que siempre van juntas (ej. MARA + MAKT)
  • Renombrar campos → Dar nombres más legibles a campos técnicos

Ejemplo de Basic View:


@AbapCatalog.sqlViewName: 'ZBASIC01' 
@VDM.viewType: #BASIC 

define view Z_I_Product as select from mara 
{ 
  key matnr, 
      ersda, 
      mtart 
}

¿Cuándo usar una Basic View?

  • Cuando quieras reutilizar el acceso a una tabla en múltiples vistas
  • Para hacer joins simples que se repiten
  • Para centralizar filtros básicos (ej. excluir borrados lógicos)
  • No la uses directamente en Fiori o para exponer vía OData

¿Qué pasa si uso una Basic View directamente en Fiori?

Técnicamente se puede, pero es mala práctica porque:

  • Carece de las anotaciones que necesita Fiori (títulos, behaviors, etc.)
  • Mezcla la capa de acceso a datos con la capa de presentación
  • Si cambias la lógica de negocio, afectas a todas las aplicaciones

Composite View (Vista compuesta)

La Composite View es la capa intermedia. Su función es combinar Basic Views y aplicar lógica de negocio. Es el «cerebro» del modelo de datos.

Características

CaracterísticaDescripción
PropósitoCombinar Basic Views, aplicar lógica de negocio
ComplejidadMedia
Anotación principal@VDM.viewType: #COMPOSITE
¿Se consume directamente?❌ No recomendado para UI/APIs (sigue siendo capa interna)
¿Contiene lógica de negocio?✅ Sí (asociaciones, cálculos, etc.)

¿Para qué sirve exactamente?

  • Combinar múltiples Basic Views → Unir producto + texto + precios
  • Definir asociaciones → Relaciones entre entidades (ej. producto ↔ proveedor)
  • Calcular campos → Campos derivados (ej. importe con IVA)
  • Aplicar lógica de negocio → Filtros por organización, reglas de negocio

Ejemplo de Composite View


@AbapCatalog.sqlViewName: 'ZCOMP01' 
@VDM.viewType: #COMPOSITE

define view Z_I_SalesOrder as select from Z_I_Product as product
       association [1..*] to vbap as _items on product.matnr = _items.matnr
{ 
  key product.matnr,
      product.mtart,
      _items
}

¿Cuándo usar una Composite View?

  • Para combinar varias Basic Views
  • Para definir asociaciones entre entidades
  • Para calcular campos derivados
  • Para centralizar lógica de negocio reutilizable
  • No la uses directamente en Fiori (aunque tiene más anotaciones que Basic, sigue sin ser la capa de consumo)

Diferencia clave entre Basic y Composite

AspectoBasic ViewComposite View
Fuente de datosTablas directamenteBasic Views (principalmente)
JoinsSimples (pocas tablas)Complejos (múltiples vistas)
AsociacionesNo (o muy limitadas)✅ Sí
Lógica de negocio❌ No✅ Sí
ReutilizaciónPor múltiples vistasPor múltiples consumos

Consumption View (Vista de consumo)

La Consumption View es la capa final, la que ven las aplicaciones. Su función es exponer los datos de forma optimizada para su consumo por Fiori, OData, reports, etc.

Características

CaracterísticaDescripción
PropósitoExponer datos a aplicaciones (Fiori, OData, UI)
ComplejidadAlta (muchas anotaciones)
Anotación principal@VDM.viewType: #CONSUMPTION
¿Se consume directamente?✅ Sí (es su propósito)
¿Contiene lógica de negocio?❌ No (solo selecciona de Composite Views)

¿Para qué sirve exactamente?

  • Exponer datos a Fiori → Añadir anotaciones UI (títulos, íconos, comportamientos)
  • Publicar como OData → Anotación @OData.publish: true
  • Filtrar datos para un consumidor específico → Ej. una vista para móvil, otra para web
  • Formatear datos para presentación → Unidades, decimales, formatos de fecha

Ejemplo de Consumption View


@AbapCatalog.sqlViewName: 'ZCONS01' 
@VDM.viewType: #CONSUMPTION
@OData.publish: true

define view Z_C_Product as select from Z_I_Product
{ 
  @UI.lineItem: [{ position: 10, importance: #HIGH }]  " Mostrar en listas
  @UI.identification: [{ position: 10 }]                " Mostrar en detalle
  key matnr, 
      mtart 
}

¿Cuándo usar una Consumption View?

  • Para exponer datos a Fiori (apps list/report/detail)
  • Para publicar servicios OData con @OData.publish: true
  • Para definir la UI de tu aplicación (anotaciones UI)
  • Para adaptar los datos a un consumidor específico

¿Por qué no puedo usar Basic/Composite directamente en Fiori?

Porque Fiori necesita anotaciones específicas que no tienen las Basic/Composite Views:

  • @UI.lineItem → qué campos mostrar en una tabla
  • @UI.selectionField → campos de búsqueda
  • @UI.headerInfo → título de la app
  • @OData.publish → exponer como servicio

Si usas una Basic View directamente, Fiori no sabrá cómo mostrarla.

Transactional Views

Las Transactional CDS Views están diseñadas para procesamiento de datos con escritura (crear, actualizar, borrar). No solo leen datos, también permiten modificarlos.

Características

CaracterísticaDescripción
PropósitoPermitir operaciones de escritura (CRUD)
ComplejidadAlta
Anotaciones clave@ObjectModel.transactionalProcessingEnabled: true
¿Se consume directamente?✅ Sí (en RAP)
Framework principalRAP (RESTful ABAP Programming Model)

¿Para qué sirve exactamente?

  • Habilitar creación de datos → Nueva entidad desde Fiori
  • Habilitar actualización → Modificar datos existentes
  • Habilitar borrado → Eliminar datos (lógico o físico)
  • Definir comportamiento → Validaciones, determinaciones, acciones

Ejemplo de Transaccional View

@AbapCatalog.sqlViewName: 'ZVTRANSPROD'
@VDM.viewType: #CONSUMPTION
@OData.publish: true

@ObjectModel.transactionalProcessingEnabled: true
@ObjectModel.createEnabled
@ObjectModel.updateEnabled
@ObjectModel.deleteEnabled

define view Z_C_Product_Transactional as select from Z_I_Product_Composite
{
    key ProductId,
    ProductType,
    ProductDescription,
    MaintenanceStatus,
    
    @ObjectModel.readOnly: true                      " Campo de solo lectura
    CreatedOn,
    
    @ObjectModel.mandatory: true                     " Campo obligatorio
    LastChangedOn
}

¿Cuándo usar una Transactional View?

  • Cuando desarrolles aplicaciones Fiori con escritura (ej. crear pedidos)
  • Cuando uses el RAP (RESTful ABAP Programming Model)
  • Cuando necesites validaciones y determinaciones automáticas
  • No la uses para solo lectura (para eso está Consumption View)

Relación con RAP

Las Transactional Views son la base del RAP (RESTful ABAP Programming Model). En RAP:

  • La CDS View define la interfaz de datos
  • Se complementa con una clase de comportamiento (Behavior Definition)
  • Se añaden validaciones, determinaciones y acciones

Comparativa

TipoPropósitoComplejidadUso
BasicAcceso a tablasBajaBase
CompositeLógica y combinaciónMediaIntermedio
ConsumptionExposición a UI/APIAltaFinal
TransactionalProcesamiento de datosAltaApps modernas

Errores comunes

  • Meter toda la lógica en una sola vista. Al crear una única vista enorme que hace todo: joins complejos, cálculos, anotaciones UI, y encima se consume directamente, se pierde escalabilidad, es difícil de mantener, no es reutilizable y es lenta.
  • Usar Basic como consumo directo. Consumir una Basic View directamente en Fiori o exponerla vía OData Sin anotaciones UI, Fiori no sabe cómo mostrar los datos y se mezclan capas de acceso y presentación.
  • No usar asociaciones y hacer joins. Usa association en lugar de joins directos siempre que puedas, sino perderás la relacion que hay entre una tabla y otra, no se podrán navegar las relaciones en OData ($expand) y será más difícil de mantener.

Los distintos tipos de CDS Views no son solo una clasificación, son una forma de estructurar correctamente tu modelo de datos.

👉 Basic = datos
👉 Composite = lógica
👉 Consumption = consumo

Entender esta arquitectura te permite:

  • Crear soluciones escalables
  • Reutilizar lógica entre múltiples aplicaciones
  • Integrarte correctamente con SAP Fiori y OData

Es uno de los pilares del desarrollo moderno en ABAP sobre HANA.