SAP Fiori Elements genera automaticamente interfaces modernas a partir de tu modelo de datos RAP. No se requiere programacion SAPUI5!
Que son los Fiori Elements?
Fiori Elements son plantillas de UI predefinidas que se renderizan automaticamente basandose en Annotations en CDS Views.
Ventajas
- Sin codigo UI: Solo Annotations
- Diseno consistente: Guias UX de SAP Fiori
- Bajo mantenimiento: Actualizaciones automaticas de SAP
- Desarrollo rapido: 80% mas rapido que UI personalizada
- Responsive: Movil y escritorio
Desventajas
- Personalizaciones limitadas: Solo lo que SAP prevee
- Curva de aprendizaje: Muchas Annotations
Cuando usar?
- Aplicaciones transaccionales (CRUD)
- Aplicaciones analiticas (Reports)
- Layouts estandar
- NO para UIs altamente personalizadas -> Custom SAPUI5
1. Tipos de Fiori Elements
| Tipo | Caso de uso | Ejemplo |
|---|---|---|
| List Report | Tabla + Filtro | Lista de clientes |
| Object Page | Vista de detalle | Detalles de cliente |
| Worklist | Listas de tareas | Workflow de aprobacion |
| Analytical List Page | Graficos + Tabla | Dashboard de ventas |
| Overview Page | Dashboard de tarjetas | Vista ejecutiva |
Combinacion mas frecuente: List Report + Object Page
2. Setup basico: List Report + Object Page
Paso 1: RAP Business Object
(Del Tutorial RAP Parte 1)
/* CDS Projection View */@EndUserText.label: 'Book - Projection'@Metadata.allowExtensions: true
define root view entity ZC_BOOK provider contract transactional_query as projection on ZI_BOOK{ key BookId, Title, Author, Publisher, Price, CurrencyCode, Status}Paso 2: Metadata Extension (Annotations)
Archivo: ZC_BOOK.ddlx
@Metadata.layer: #CORE
annotate view ZC_BOOK with{ /* ===== HEADER INFO ===== */ @UI.headerInfo: { typeName: 'Libro', typeNamePlural: 'Libros', title: { value: 'Title' }, description: { value: 'Author' } }
/* ===== FACETS (Secciones en Object Page) ===== */ @UI.facet: [ { id: 'BookDetails', purpose: #STANDARD, type: #IDENTIFICATION_REFERENCE, label: 'Detalles del libro', position: 10 } ]
/* ===== CAMPOS ===== */
/* List Report: Columna + Filtro */ @UI.lineItem: [{ position: 10, importance: #HIGH }] @UI.identification: [{ position: 10 }] @UI.selectionField: [{ position: 10 }] BookId;
@UI.lineItem: [{ position: 20, importance: #HIGH }] @UI.identification: [{ position: 20 }] @UI.selectionField: [{ position: 20 }] Title;
@UI.lineItem: [{ position: 30 }] @UI.identification: [{ position: 30 }] @UI.selectionField: [{ position: 30 }] Author;
@UI.lineItem: [{ position: 40 }] @UI.identification: [{ position: 40 }] Publisher;
@UI.lineItem: [{ position: 50 }] @UI.identification: [{ position: 50 }] Price;}Paso 3: Service Binding
- Crear OData V4 - UI Service Binding
- Publish
- Preview -> UI lista!
3. Annotations mas importantes
@UI.lineItem - Columnas en lista
@UI.lineItem: [ { position: 10, /* Orden */ importance: #HIGH, /* HIGH/MEDIUM/LOW */ label: 'ID Libro', /* Opcional: Etiqueta personalizada */ criticality: 'Status' /* Opcional: Color de semaforo */ }]BookId;Valores de Criticality:
0= Gris (Neutral)1= Rojo (Negativo)2= Amarillo (Critico)3= Verde (Positivo)
@UI.selectionField - Filtro
@UI.selectionField: [{ position: 10 }]Title; /* Se muestra como filtro arriba */@UI.identification - Campos de detalle
@UI.identification: [{ position: 10 }]BookId; /* Visible en Object Page */@UI.facet - Secciones
@UI.facet: [ /* Identification Facet */ { id: 'GeneralInfo', purpose: #STANDARD, type: #IDENTIFICATION_REFERENCE, label: 'Informacion general', position: 10 },
/* Reference Facet (incluir otra vista) */ { id: 'Orders', purpose: #STANDARD, type: #LINEITEM_REFERENCE, label: 'Pedidos', position: 20, targetElement: '_Orders' /* Association */ },
/* Field Group */ { id: 'PriceInfo', purpose: #STANDARD, type: #FIELDGROUP_REFERENCE, label: 'Informacion de precio', targetQualifier: 'PriceGroup', position: 30 }]@UI.fieldGroup - Campos agrupados
@UI.fieldGroup: [{ qualifier: 'PriceGroup', position: 10 }]Price;
@UI.fieldGroup: [{ qualifier: 'PriceGroup', position: 20 }]CurrencyCode;4. Actions en UI
En BDEF:
action markAsRead result [1] $self;En Metadata Extension:
@UI.lineItem: [ { position: 10 }, { type: #FOR_ACTION, dataAction: 'markAsRead', label: 'Marcar como leido' }]BookId;Resultado: Boton en la tabla!
5. Value Helps (Desplegables)
/* En CDS View */@Consumption.valueHelpDefinition: [{ entity: { name: 'I_Currency', element: 'Currency' }}]CurrencyCode;O: Value Help personalizado
define view Z_STATUS_VH as select from DDCDS_CUSTOMER_DOMAIN_VALUE_T{ key value_low as StatusCode, text as StatusText}where domain_name = 'ZBOOK_STATUS';@Consumption.valueHelpDefinition: [{ entity: { name: 'Z_STATUS_VH', element: 'StatusCode' }}]Status;6. Text Associations
Problema: El codigo de estado N debe mostrarse como “Nuevo”.
Solucion: Text Association
/* CDS View con Text */define view ZI_BOOK as select from zbook_tab association [0..1] to ZI_BOOK_STATUS_TEXT as _StatusText on $projection.Status = _StatusText.StatusCode{ key book_id as BookId, status as Status,
/* Elemento de texto */ _StatusText}
/* Vista de texto */define view ZI_BOOK_STATUS_TEXT as select from ...{ key status_code as StatusCode, @Semantics.text: true text as StatusText}En Projection:
@ObjectModel.text.element: ['StatusText']Status;
@UI.hidden: trueStatusText; /* No mostrar como campo separado */7. Formato condicional (Criticality)
Criticality estatica
/* Directamente en la Vista */case status when 'N' then 2 /* Amarillo */ when 'R' then 3 /* Verde */ when 'F' then 1 /* Rojo */ else 0end as StatusCriticality,Criticality dinamica
@UI.lineItem: [{ position: 40, criticality: 'StatusCriticality'}]Status;Resultado: Visualizacion con semaforos de colores!
8. Graficos (Analytics)
@UI.chart: [{ qualifier: 'SalesChart', title: 'Ventas por mes', chartType: #COLUMN, dimensions: [ 'Month' ], measures: [ 'Revenue' ]}]
@UI.presentationVariant: [{ qualifier: 'Default', visualizations: [{ type: #AS_CHART, qualifier: 'SalesChart' }]}]
define view Z_SalesAnalytics as select from ...{ @UI.lineItem: [{ position: 10 }] month as Month,
@Aggregation.default: #SUM revenue as Revenue}Tipos de graficos:
#COLUMN(Columnas)#BAR(Barras)#LINE(Linea)#PIE(Circular)#DONUT(Anillo)
9. Manejo de Draft
Guardado intermedio para formularios largos
Activar en BDEF
managed with draft;
define behavior for ZI_BOOKpersistent table zbook_tabdraft table zbook_draft{ create; update; delete;
draft action Edit; draft action Activate; draft action Discard; draft action Resume; draft determine action Prepare;}Resultado: Botones “Editar”, “Guardar borrador”, “Activar” automaticos!
10. Semantic Keys y Busqueda
/* Semantic Key (para URL de Object Page) */@ObjectModel.semanticKey: ['BookId']BookId;
/* Activar busqueda */@Search.searchable: truedefine view ZC_BOOK as projection on ZI_BOOK{ @Search.defaultSearchElement: true @Search.fuzzinessThreshold: 0.8 Title,
@Search.defaultSearchElement: true Author}Resultado: Campo de busqueda arriba, busca en Title y Author!
Resumen: Cheat Sheet de Annotations
| Annotation | Donde | Para que |
|---|---|---|
@UI.lineItem | Campo | Columna en tabla |
@UI.selectionField | Campo | Filtro arriba |
@UI.identification | Campo | Campo de detalle |
@UI.facet | Vista | Secciones |
@UI.fieldGroup | Campo | Campos agrupados |
@UI.headerInfo | Vista | Titulo/Breadcrumb |
@UI.chart | Vista | Graficos |
@ObjectModel.text.element | Campo | Mostrar texto |
@Consumption.valueHelpDefinition | Campo | Desplegable |
@Search.searchable | Vista | Activar busqueda |
Ver tambien:
Exito con Fiori Elements!