← Volver a tutoriales

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.

Also available in English →

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; fuzzinessThreshold tolera 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:

  1. Activa el binding.
  2. Pulsa Publish (publicación local del servicio).
  3. 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 binding Web API para 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.