En ABAP Cloud las tablas de base de datos se definen mediante DDL (Data Definition Language) como objetos del diccionario. Esta guía muestra la sintaxis y las mejores prácticas.
Sintaxis básica
@EndUserText.label: 'Mi tabla'@AbapCatalog.enhancement.category: #NOT_EXTENSIBLE@AbapCatalog.tableCategory: #TRANSPARENT@AbapCatalog.deliveryClass: #A@AbapCatalog.dataMaintenance: #RESTRICTEDdefine table ztable { key client : abap.clnt not null; key id : abap.numc(10) not null; name : abap.char(100); amount : abap.dec(15,2); currency : abap.cuky; created_at : abap.utclong;}Anotaciones
Categoría de tabla
@AbapCatalog.tableCategory: #TRANSPARENT" Valores posibles:" #TRANSPARENT - Tabla transparente (estándar)" #STRUCTURE - Solo estructura (sin tabla DB)Clase de entrega
@AbapCatalog.deliveryClass: #A" Valores posibles:" #A - Tabla de aplicación (datos de cliente)" #C - Tabla de customizing" #L - Tabla temporal" #G - Tabla de sistema de cliente" #S - Tabla de sistemaMantenimiento de datos
@AbapCatalog.dataMaintenance: #RESTRICTED" Valores posibles:" #ALLOWED - SM30/SE16 permitidos" #RESTRICTED - Restringido" #NOT_ALLOWED - No permitidoTipos de datos
Tipos de datos elementales
| Tipo DDL | Descripción | Ejemplo |
|---|---|---|
abap.char(n) | Cadena de caracteres | abap.char(50) |
abap.numc(n) | Cadena numérica | abap.numc(10) |
abap.int4 | Entero (4 bytes) | abap.int4 |
abap.int8 | Entero (8 bytes) | abap.int8 |
abap.dec(p,s) | Número decimal | abap.dec(15,2) |
abap.fltp | Punto flotante | abap.fltp |
abap.dats | Fecha | abap.dats |
abap.tims | Hora | abap.tims |
abap.utclong | Timestamp UTC | abap.utclong |
abap.clnt | Mandante | abap.clnt |
abap.lang | Idioma | abap.lang |
abap.cuky | Clave de moneda | abap.cuky |
abap.unit | Unidad de medida | abap.unit |
abap.quan(p,s) | Cantidad | abap.quan(13,3) |
abap.curr(p,s) | Importe de moneda | abap.curr(15,2) |
abap.rawstring | Datos binarios | abap.rawstring(0) |
abap.string | Cadena de texto | abap.string(0) |
abap.sstring(n) | Cadena corta | abap.sstring(256) |
Referencia a elementos de datos
define table zorders { key client : abap.clnt not null; key order_id : /dmo/order_id not null; " Elemento de datos de referencia customer : /dmo/customer_id; amount : /dmo/total_amount;}Definiciones de clave
Clave simple
define table zsimple { key client : abap.clnt not null; key id : abap.numc(10) not null; name : abap.char(100);}Clave compuesta
define table zcomposite { key client : abap.clnt not null; key doc_type : abap.char(4) not null; key doc_year : abap.numc(4) not null; key doc_number: abap.numc(10) not null; description : abap.char(100);}Incluir estructuras
@EndUserText.label: 'Campos administrativos'define structure zadmin_fields { created_by : abap.uname; created_at : abap.utclong; changed_by : abap.uname; changed_at : abap.utclong;}
define table zorders { key client : abap.clnt not null; key order_id : abap.numc(10) not null; name : abap.char(100); include zadmin_fields; // Incluir campos}Moneda y cantidad
Para campos de moneda e importe, se debe especificar el campo de referencia:
define table zsales { key client : abap.clnt not null; key sale_id : abap.numc(10) not null;
// Campo de moneda como referencia currency_code : abap.cuky;
// Importe con referencia a la moneda @Semantics.amount.currencyCode: 'zsales.currency_code' amount : abap.curr(15,2);
// Unidad como referencia unit : abap.unit;
// Cantidad con referencia a la unidad @Semantics.quantity.unitOfMeasure: 'zsales.unit' quantity : abap.quan(13,3);}Asociaciones (desde ABAP 7.55)
define table zorder_items { key client : abap.clnt not null; key order_id : abap.numc(10) not null; key item_id : abap.numc(6) not null; product_id : abap.char(40); quantity : abap.quan(13,3); unit : abap.unit;}
// Tabla con asociacióndefine table zorders { key client : abap.clnt not null; key order_id : abap.numc(10) not null; customer_id : abap.numc(10); created_at : abap.utclong;
// Asociación a posiciones association [0..*] to zorder_items as _items on $self.client = _items.client and $self.order_id = _items.order_id;}Ejemplo completo
@EndUserText.label: 'Cabecera de pedidos'@AbapCatalog.enhancement.category: #NOT_EXTENSIBLE@AbapCatalog.tableCategory: #TRANSPARENT@AbapCatalog.deliveryClass: #A@AbapCatalog.dataMaintenance: #RESTRICTEDdefine table zrap_orders_h { key client : abap.clnt not null; key order_uuid : sysuuid_x16 not null;
order_id : abap.numc(10); customer_id : abap.numc(10);
// Campos de moneda currency_code : abap.cuky; @Semantics.amount.currencyCode: 'zrap_orders_h.currency_code' total_amount : abap.curr(15,2);
// Estado status : abap.char(1);
// Campos administrativos created_by : abap.uname; created_at : abap.utclong; last_changed_by : abap.uname; last_changed_at : abap.utclong; local_last_changed_at : abap.utclong;}
@EndUserText.label: 'Posiciones de pedidos'@AbapCatalog.enhancement.category: #NOT_EXTENSIBLE@AbapCatalog.tableCategory: #TRANSPARENT@AbapCatalog.deliveryClass: #A@AbapCatalog.dataMaintenance: #RESTRICTEDdefine table zrap_orders_i { key client : abap.clnt not null; key item_uuid : sysuuid_x16 not null;
parent_uuid : sysuuid_x16 not null; item_id : abap.numc(6); product_id : abap.char(40);
// Cantidad unit : abap.unit; @Semantics.quantity.unitOfMeasure: 'zrap_orders_i.unit' quantity : abap.quan(13,3);
// Precio currency_code : abap.cuky; @Semantics.amount.currencyCode: 'zrap_orders_i.currency_code' net_amount : abap.curr(15,2);
// Campos administrativos local_last_changed_at : abap.utclong;}Notas importantes / Mejores prácticas
- Usa siempre UUID como clave primaria técnica para aplicaciones RAP.
- Especifica referencias de moneda/unidad para campos semánticos.
- Usa abap.utclong para timestamps (independiente de zona horaria).
- Los campos administrativos son necesarios para Control de concurrencia RAP.
- Crea CDS Views apropiadas sobre las tablas para RAP.
- Usa elementos de datos para tipos de datos reutilizables.