Tablas en ABAP Cloud: Definición de tablas con DDL

Kategorie
ABAP-Statements
Veröffentlicht
Autor
Johannes

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: #RESTRICTED
define 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 sistema

Mantenimiento de datos

@AbapCatalog.dataMaintenance: #RESTRICTED
" Valores posibles:
" #ALLOWED - SM30/SE16 permitidos
" #RESTRICTED - Restringido
" #NOT_ALLOWED - No permitido

Tipos de datos

Tipos de datos elementales

Tipo DDLDescripciónEjemplo
abap.char(n)Cadena de caracteresabap.char(50)
abap.numc(n)Cadena numéricaabap.numc(10)
abap.int4Entero (4 bytes)abap.int4
abap.int8Entero (8 bytes)abap.int8
abap.dec(p,s)Número decimalabap.dec(15,2)
abap.fltpPunto flotanteabap.fltp
abap.datsFechaabap.dats
abap.timsHoraabap.tims
abap.utclongTimestamp UTCabap.utclong
abap.clntMandanteabap.clnt
abap.langIdiomaabap.lang
abap.cukyClave de monedaabap.cuky
abap.unitUnidad de medidaabap.unit
abap.quan(p,s)Cantidadabap.quan(13,3)
abap.curr(p,s)Importe de monedaabap.curr(15,2)
abap.rawstringDatos binariosabap.rawstring(0)
abap.stringCadena de textoabap.string(0)
abap.sstring(n)Cadena cortaabap.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ón
define 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: #RESTRICTED
define 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: #RESTRICTED
define 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.