RAP desde cero · Lección 3 de 6
Tu primer servicio OData en RAP: proyección, Service Definition y Service Binding
Expón la biblioteca como servicio OData V4 y ábrela en una aplicación Fiori Elements de vista previa, sin escribir UI5.
Ya tenemos el modelo de datos (ZR_LibBook). Ahora lo publicamos para que una aplicación Fiori lo consuma. Son cuatro objetos, siempre en el mismo orden:
ZR_LibBook Root View Entity (lección 2)
└─ ZC_LibBook Proyección: qué campos ve esta app
├─ ZC_LibBook Metadata Extension: cómo se muestran
└─ ZUI_LIB_BOOK Service Definition: qué entidades expone el servicio
└─ ZUI_LIB_BOOK_O4 Service Binding: con qué protocolo (OData V4 UI)
1. La proyección (C_)
La proyección es la vista para un consumidor concreto. La Root View Entity queda genérica; cada app (o API) tiene su propia proyección con lo que necesita.
@AccessControl.authorizationCheck: #NOT_REQUIRED
@Metadata.allowExtensions: true
@EndUserText.label: 'Biblioteca: libros (app)'
@Search.searchable: true
define root view entity ZC_LibBook
provider contract transactional_query
as projection on ZR_LibBook
{
key BookUuid,
@Search.defaultSearchElement: true
BookId,
@Search.defaultSearchElement: true
@Search.fuzzinessThreshold: 0.8
Title,
AuthorId,
_Author.Name as AuthorName,
Pages,
Isbn,
Rating,
Price,
CurrencyCode,
LocalLastChangedAt
}
as projection on ZR_LibBook: no lee tablas; se apoya en la entidad raíz.provider contract transactional_query: indica que esta proyección sirve a una app transaccional. En la lección 4 le añadiremos comportamiento (crear, modificar, borrar)._Author.Name as AuthorName: usa la asociación de la lección 2 para traer el nombre del autor. Es de solo lectura.@Search.*: activa el buscador de la app sobre el identificador y el título;fuzzinessThresholdtolera pequeñas erratas.
2. La Metadata Extension: cómo se ve
Las anotaciones @UI podrían ir en la proyección, pero separarlas en una Metadata Extension (MDE) deja la vista limpia. Es lo que permite @Metadata.allowExtensions: true.
En ADT: clic derecho en ZC_LibBook → New Metadata Extension.
@Metadata.layer: #CUSTOMER
@UI.headerInfo: {
typeName: 'Libro',
typeNamePlural: 'Libros',
title: { type: #STANDARD, value: 'Title' },
description: { value: 'AuthorName' }
}
annotate entity ZC_LibBook with
{
@UI.facet: [ {
id: 'Book',
purpose: #STANDARD,
type: #IDENTIFICATION_REFERENCE,
label: 'Libro',
position: 10
} ]
@UI.hidden: true
BookUuid;
@UI: { lineItem: [ { position: 10 } ], identification: [ { position: 10 } ], selectionField: [ { position: 10 } ] }
BookId;
@UI: { lineItem: [ { position: 20 } ], identification: [ { position: 20 } ] }
Title;
@UI: { lineItem: [ { position: 30 } ], identification: [ { position: 30 } ], selectionField: [ { position: 20 } ] }
AuthorId;
@UI: { lineItem: [ { position: 40 } ], identification: [ { position: 40 } ] }
AuthorName;
@UI: { lineItem: [ { position: 50 } ], identification: [ { position: 50 } ] }
Pages;
@UI: { lineItem: [ { position: 60 } ], identification: [ { position: 60 } ] }
Rating;
@UI: { lineItem: [ { position: 70 } ], identification: [ { position: 70 } ] }
Price;
@UI.hidden: true
LocalLastChangedAt;
}
| Anotación | Dónde aparece |
|---|---|
lineItem |
Columna en la tabla de la lista |
selectionField |
Filtro en la barra superior de la lista |
identification + facet |
Campo en la página de detalle (Object Page) |
headerInfo |
Título y subtítulo de la página de detalle |
hidden |
No se muestra |
La moneda no necesita anotación propia: como Price tiene @Semantics.amount.currencyCode, Fiori la muestra junto al importe.
3. Service Definition: qué se expone
New → Other ABAP Repository Object → Business Services → Service Definition:
@EndUserText.label: 'Biblioteca: servicio de libros'
define service ZUI_LIB_BOOK {
expose ZC_LibBook as Book;
}
as Book es el nombre del entity set en el servicio: así se llamará en la URL OData y en la vista previa.
4. Service Binding: con qué protocolo
New → Other ABAP Repository Object → Business Services → Service Binding:
- Name:
ZUI_LIB_BOOK_O4 - Binding Type:
OData V4 - UI - Service Definition:
ZUI_LIB_BOOK
Después:
- Activa el binding.
- Pulsa Publish (publicación local del servicio).
- En la lista de entidades, selecciona Book y pulsa Preview.
Se abre en el navegador una app Fiori Elements (List Report y Object Page) generada a partir de tus anotaciones. Pulsa Go para ver los libros y entra en uno para ver el detalle.
El sufijo
_O4(OData V4) y el tipo UI son una convención útil: el mismo Service Definition puede tener otro bindingWeb APIpara integraciones, sin anotaciones de interfaz.
Si algo no aparece
| Síntoma | Causa habitual |
|---|---|
| La lista sale vacía o sin columnas | Falta @Metadata.allowExtensions: true en la proyección, o la MDE no está activada |
Error de activación en _Author.Name |
La asociación _Author no está listada al final de ZR_LibBook |
| El botón Preview está desactivado | El binding no está publicado o no hay ninguna entidad seleccionada |
| No se puede crear ni editar | Correcto: todavía no hay comportamiento. Lo añadimos en la lección 4 |
Resumen
Con cuatro objetos y ninguna línea de JavaScript tienes una app de consulta con filtros, búsqueda y página de detalle. En la próxima lección le damos comportamiento: crear y modificar libros, con validaciones que rechacen datos incorrectos.
Recibe los nuevos tutoriales
Un correo cuando publique algo nuevo. Sin spam; te das de baja cuando quieras.
Te enviaré un correo para confirmar la suscripción. Datos tratados según la política de privacidad.