Ir al contenido
Programación ABAP

SAPUI5 y OpenUI5

El framework de JavaScript con el que se construyen las aplicaciones Fiori: controles, vistas, enlace de datos y conexión con OData.

Apartados
10
Revisado
Octubre de 2026
Fuentes
4 enlaces

SAPUI5 y OpenUI5

SAPUI5OpenUI5
LicenciaDe SAP, incluida en sus productosCódigo abierto (Apache 2.0)
ControlesTodos, incluidos gráficos y Smart ControlsLos principales (sap.m, sap.f, sap.ui.table…)
Uso típicoApps Fiori sobre sistemas SAPCualquier proyecto web

La versión 1.136 es la base de la futura UI5 2.x, que elimina el código obsoleto. SAP publica versiones «legacy-free» de prueba para comprobar si tu app está preparada.

Estructura de un proyecto

Carpetas
mi-app/
├─ package.json
├─ ui5.yaml              configuración de UI5 Tooling
└─ webapp/
   ├─ manifest.json      descriptor: modelos, rutas, dependencias
   ├─ Component.js       punto de entrada
   ├─ index.html
   ├─ i18n/
   │  └─ i18n.properties textos traducibles
   ├─ view/
   │  └─ Main.view.xml
   └─ controller/
      └─ Main.controller.js

Vista XML y controlador

XML
<mvc:View controllerName="abapes.demo.controller.Main"
  xmlns="sap.m" xmlns:mvc="sap.ui.core.mvc">
  <Page title="{i18n>titulo}">
    <List items="{/Viaje}">
      <StandardListItem title="{ViajeId}" description="{Estado}" />
    </List>
    <Button text="Saludar" press=".onSaludar" />
  </Page>
</mvc:View>
JavaScript
sap.ui.define([
  "sap/ui/core/mvc/Controller",
  "sap/m/MessageToast"
], (Controller, MessageToast) => {
  "use strict";

  return Controller.extend("abapes.demo.controller.Main", {
    onSaludar() {
      MessageToast.show("Hola desde UI5");
    }
  });
});

Las llaves { } enlazan los controles con el modelo de datos: si el modelo es OData V4, la lista lee la entidad Viaje del servicio RAP.

VistaMain.view.xmlControladorMain.controller.jsModeloOData V4, JSON, i18nServicio OData de RAPeventos: press, change…actualiza la vistaenlace de datos {…}lee y modifica
UI5 sigue el patrón modelo-vista-controlador. La vista se enlaza con el modelo y se actualiza sola cuando cambian los datos; el controlador responde a lo que hace el usuario.

Cómo arranca una app UI5

  1. index.html carga UI5
  2. Component.js
  3. manifest.json
  4. Modelos e i18n
  5. Router
  6. Vista raíz

Casi toda la configuración está en el manifest.json: de qué servicio salen los datos, qué modelos hay y qué vista se abre con cada URL.

manifest.json (extracto)
"sap.ui5": {
  "models": {
    "": {
      "dataSource": "mainService",
      "settings": { "autoExpandSelect": true }
    },
    "i18n": {
      "type": "sap.ui.model.resource.ResourceModel",
      "settings": { "bundleName": "abapes.demo.i18n.i18n" }
    }
  },
  "routing": {
    "config": {
      "routerClass": "sap.m.routing.Router",
      "type": "View",
      "viewType": "XML",
      "path": "abapes.demo.view",
      "controlId": "app",
      "controlAggregation": "pages"
    },
    "routes": [
      { "pattern": "", "name": "lista", "target": "lista" },
      { "pattern": "viaje/{id}", "name": "detalle", "target": "detalle" }
    ],
    "targets": {
      "lista": { "name": "Main" },
      "detalle": { "name": "Detalle" }
    }
  }
}

Para ir de la lista al detalle, el controlador llama al router con el identificador del viaje pulsado:

JavaScript
onPulsarViaje(oEvent) {
  const oContexto = oEvent.getSource().getBindingContext();
  this.getOwnerComponent().getRouter().navTo("detalle", {
    id: oContexto.getProperty("ViajeId")
  });
}

Tipos de enlace de datos

EnlaceEjemploPara qué
De propiedadtext="{Estado}"Un valor en una propiedad del control
De agregaciónitems="{/Viaje}"Una lista: crea una línea por registro
De elementobinding="{/Viaje('00000001')}"Un formulario de detalle sobre un registro
Con expresiónvisible="{= ${Estado} === 'A' }"Cálculos y condiciones sencillas en la propia vista
Con formateadortext="{ path: 'Estado', formatter: '.textoEstado' }"Lógica de presentación en el controlador
De textostitle="{i18n>titulo}"Textos traducibles del fichero i18n

Crear y ejecutar con UI5 Tooling

  1. Instala Node.js (versión LTS).
  2. Instala la línea de comandos de UI5 y genera un proyecto con el asistente Easy UI5.
  3. Arranca el servidor local y abre la app en el navegador.
Terminal
npm install --global @ui5/cli
npm init easy-ui5
cd mi-app
npm start

UI5 Web Components

Los mismos controles con aspecto Fiori, como etiquetas HTML que funcionan con cualquier framework (React, Angular, Vue) o sin ninguno. Son ligeros y adecuados para webs públicas.

Terminal
npm install @ui5/webcomponents
HTML + JavaScript
<script type="module">
  import "@ui5/webcomponents/dist/Button.js";
</script>

<ui5-button design="Emphasized">Guardar</ui5-button>

Código moderno: TypeScript y UI5 linter

  • TypeScript: UI5 tiene tipos oficiales y el generador Easy UI5 crea proyectos en TypeScript. Detecta errores al escribir y el autocompletado es mucho mejor.
  • UI5 linter: revisa tu app y avisa de todo lo obsoleto que no funcionará en UI5 2.x (APIs antiguas, carga síncrona, variables globales).
Terminal
# Revisar la app desde su carpeta
npx @ui5/linter

# Ver el detalle de cada aviso
npx @ui5/linter --details
Antes
// Obsoleto: variables globales y carga síncrona
var oBoton = new sap.m.Button({ text: "Guardar" });
jQuery.sap.require("sap.m.MessageBox");
Ahora
// Moderno: dependencias con sap.ui.define
sap.ui.define([
  "sap/m/Button",
  "sap/m/MessageBox"
], (Button, MessageBox) => {
  const oBoton = new Button({ text: "Guardar" });
});

Pruebas automáticas

HerramientaQué prueba
QUnitPruebas unitarias de funciones y formateadores
OPA5Pruebas de integración: simula clics y comprueba la pantalla, con datos simulados
wdi5Pruebas de extremo a extremo en un navegador real (basado en WebdriverIO)
Servidor simulado (mockserver)Devuelve datos de prueba sin conectarse al sistema SAP

Desplegar la app en el sistema SAP

  1. Instala las herramientas de despliegue si el proyecto no las tiene: npm install --save-dev @sap/ux-ui5-tooling.
  2. Ejecuta npx fiori add deploy-config y elige ABAP: sistema, nombre de la aplicación BSP, paquete y orden de transporte.
  3. Despliega con npm run deploy. La app queda en el repositorio de UI5 del sistema (transacción SE80, aplicaciones BSP).
  4. Para BTP, elige Cloud Foundry en el paso 2: se genera un archivo mta.yaml y se despliega con npm run deploy igualmente.

En sistemas sin estas herramientas, el informe /UI5/UI5_REPOSITORY_LOAD sube una carpeta comprimida con la app.

Fuentes