Esta publicación de blog presenta los modelos de objetos transaccionales en Core Data Services (CDS).
Aprenderá cómo definir e implementar un objeto comercial y su lógica comercial. Primero, definirá el modelo de datos e introducirá una estructura de objetos. En el mundo transaccional, en consecuencia, utilizamos los tipos de entidades CDS más nuevos (también conocidos como modelos CDS V2). Luego mejorará el objeto comercial definido de esta manera para admitir cambios transaccionales.
Los objetos comerciales se definen como estructuras de árbol o de composición de entidades. Para describir los objetos de negocio en la red de entidades y asociaciones CDS, se define como tal la raíz del árbol de composición y los correspondientes asociaciones se definen como composiciones.
Capa de vista transaccional: Le recomendamos que defina vistas CDS dedicadas para su aplicación transaccional que se basen en las vistas de su interfaz básica. Esto hace que el modelo y su uso sean más claros y, al mismo tiempo, lo deja abierto a futuros desarrollos y nuevas características. Le recomendamos además que agregue el sufijo »TP« a los nombres de vistas CDS subyacentes como una convención de nomenclatura para este tipo de vistas CDS.
En el lenguaje hablado, normalmente no se hace distinción entre el objeto comercial (en nuestro ejemplo, el pedido de ventas) y su entidad raíz (en nuestro ejemplo, el encabezado del pedido de ventas), y el nombre del objeto comercial se usa como sinónimo para ambos. a ellos. En el siguiente ejemplo, conservamos las definiciones y términos correctos para evitar confusión conceptual, dejando claro cuándo se hace referencia al objeto de negocio o a la entidad raíz del objeto de negocio.
Definamos el modelo del objeto de negocio para el pedido de cliente. Debido a que las vistas CDS transaccionales se basan en las vistas de interfaz básica ya definidas, las anotaciones conocidas y disponibles de los campos subyacentes, como su semántica, están disponibles automáticamente mediante la lógica de propagación de anotaciones. Además, los nombres de los campos ya tienen un alias semántico y legible.
Heredar anotaciones: En parte de nuestro ejemplo, todavía agregamos algunas anotaciones al modelo CDS que también pueden heredarse para aumentar la legibilidad y comprensión de los ejemplos.
Defina el encabezado del pedido de ventas como se muestra a continuación.
@AccessControl.authorizationCheck: #MANDATORY
@EndUserText.label: 'Sales Order'
define root view entity ZR_SalesOrderTP
as select from ZI_SalesOrder
composition [0..*] of ZR_SalesOrderItemTP as _Item
association [0..1] to ZI_Customer as _SoldToParty
on $projection.SoldToParty = _SoldToParty.Customer
association [1] to I_User as _CreatedByUser
on $projection.CreatedByUser = _CreatedByUser.UserID
association [1] to I_User as _LastChangedByUser
on $projection.LastChangedByUser = _LastChangedByUser.UserID
{
key ZI_SalesOrder.SalesOrder,
ZI_SalesOrder.SalesOrderType,
ZI_SalesOrder.SalesOrganization,
ZI_SalesOrder.SoldToParty,
ZI_SalesOrder.DistributionChannel,
ZI_SalesOrder.OrganizationDivision,
@Semantics.amount.currencyCode: 'TransactionCurrency'
ZI_SalesOrder.NetAmount,
ZI_SalesOrder.TransactionCurrency,
ZI_SalesOrder.DeliveryStatus,
@Semantics.booleanIndicator: true
ZI_SalesOrder.DeletionIndicator,
@Semantics.user.createdBy: true
ZI_SalesOrder.CreatedByUser,
@Semantics.systemDateTime.createdAt: true
ZI_SalesOrder.CreationDateTime,
@Semantics.user.lastChangedBy: true
ZI_SalesOrder.LastChangedByUser,
@Semantics.systemDateTime.lastChangedAt: true
ZI_SalesOrder.LastChangeDateTime,
_Item,
_SoldToParty,
_CreatedByUser,
_LastChangedByUser
}
Ya contiene una asociación secundaria con el artículo del pedido de ventas, que se define en el siguiente listado.
@AccessControl.authorizationCheck: #MANDATORY
@EndUserText.label: 'Sales Order Item'
define view entity ZR_SalesOrderItemTP
as select from ZI_SalesOrderItem
association to parent ZR_SalesOrderTP as _SalesOrder
on $projection.SalesOrder = _SalesOrder.SalesOrder
composition [0..*] of ZR_SalesOrderScheduleLineTP
as _ScheduleLine
association [0..1] to ZI_Product as _Product
on $projection.Product = _Product.Product
association [1] to I_User as _CreatedByUser
on $projection.CreatedByUser = _CreatedByUser.UserID
association [1] to I_User as _LastChangedByUser
on $projection.LastChangedByUser = _LastChangedByUser.UserID
{
@ObjectModel.foreignKey.association: '_SalesOrder'
key ZI_SalesOrderItem.SalesOrder,
key ZI_SalesOrderItem.SalesOrderItem,
ZI_SalesOrderItem.Product,
@Semantics.quantity.unitOfMeasure: 'OrderQuantityUnit'
ZI_SalesOrderItem.OrderQuantity,
ZI_SalesOrderItem.OrderQuantityUnit,
@Semantics.amount.currencyCode: 'TransactionCurrency'
ZI_SalesOrderItem.NetAmount,
ZI_SalesOrderItem.TransactionCurrency,
@Semantics.user.createdBy: true
ZI_SalesOrderItem.CreatedByUser,
@Semantics.systemDateTime.createdAt: true
ZI_SalesOrderItem.CreationDateTime,
@Semantics.user.lastChangedBy: true
ZI_SalesOrderItem.LastChangedByUser,
@Semantics.systemDateTime.lastChangedAt: true
ZI_SalesOrderItem.LastChangeDateTime,
_SalesOrder,
_ScheduleLine,
_Product,
_CreatedByUser,
_LastChangedByUser
}
Este listado muestra el artículo del pedido de ventas que tiene asociaciones tanto con el encabezado del pedido de ventas como con las líneas de programación definidas en el listado siguiente. Ese listado muestra la línea de programación de pedidos de ventas que tiene asociaciones con el encabezado del pedido de ventas como entidad raíz y con los artículos del pedido de ventas como entidad principal.
@AccessControl.authorizationCheck: #MANDATORY
@EndUserText.label: 'Sales Order Schedule Line'
define view entity ZR_SalesOrderScheduleLineTP
as select from ZI_SalesOrderScheduleLine
association [1..1] to ZR_SalesOrderTP as _SalesOrder
on $projection.SalesOrder = _SalesOrder.SalesOrder
association to parent ZR_SalesOrderItemTP
as _SalesOrderItem
on $projection.SalesOrder = _SalesOrderItem.SalesOrder and
$projection.SalesOrderItem = _SalesOrderItem.SalesOrderItem
association [1] to I_User as _CreatedByUser
on $projection.CreatedByUser = _CreatedByUser.UserID
association [1] to I_User as _LastChangedByUser
on $projection.LastChangedByUser = _LastChangedByUser.UserID
{
key ZI_SalesOrderScheduleLine.SalesOrder,
key ZI_SalesOrderScheduleLine.SalesOrderItem,
key ZI_SalesOrderScheduleLine.SalesOrderScheduleLine,
ZI_SalesOrderScheduleLine.DeliveryDate,
@Semantics.quantity.unitOfMeasure: 'OrderQuantityUnit'
ZI_SalesOrderScheduleLine.OrderQuantity,
ZI_SalesOrderScheduleLine.OrderQuantityUnit,
ZI_SalesOrderScheduleLine.SalesOrderScheduleLineType,
@Semantics.user.createdBy: true
ZI_SalesOrderScheduleLine.CreatedByUser,
@Semantics.systemDateTime.createdAt: true
ZI_SalesOrderScheduleLine.CreationDateTime,
@Semantics.user.lastChangedBy: true
ZI_SalesOrderScheduleLine.LastChangedByUser,
@Semantics.systemDateTime.lastChangedAt: true
ZI_SalesOrderScheduleLine.LastChangeDateTime,
_SalesOrder,
_SalesOrderItem,
_CreatedByUser,
_LastChangedByUser
}
Activación de vista CDS: Para evitar problemas con la activación de la vista CDS, le recomendamos que primero defina y active las vistas CDS sin asociaciones y agregue las asociaciones en el segundo paso. La definición de las asociaciones con entidades matrices debe realizarse antes de la definición de las composiciones relacionadas.
El acceso de lectura se controla mediante el conocido control de acceso. Como definimos la capa transaccional sobre nuestra capa básica, podemos simplemente heredar el control de acceso de las entidades CDS subyacentes. El siguiente listado muestra el control de acceso heredado del encabezado de la orden de venta.
11
@EndUserText.label: 'Sales Order'
@MappingRole: true
define role ZR_SalesOrderTP {
grant
select
on
ZR_SalesOrderTP
where
inheriting conditions from entity
ZI_SalesOrder;
}
Aquí se muestra el control de acceso para el artículo del pedido de cliente.
@EndUserText.label: 'Sales Order Item'
@MappingRole: true
define role ZR_SalesOrderItemTP {
grant
select
on
ZR_SalesOrderItemTP
where
inheriting conditions from entity
ZI_SalesOrderItem;
}
El control de acceso de la línea de programación de pedidos de ventas se muestra en el siguiente listado.
@EndUserText.label: 'Sales Order Schedule Line'
@MappingRole: true
define role ZR_SalesOrderScheduleLineTP {
grant
select
on
ZR_SalesOrderScheduleLineTP
where
inheriting conditions from entity
ZI_SalesOrderScheduleLine;
}
Nota del editor: esta publicación ha sido adaptada de una sección del libro. Servicios de datos básicos para ABAP de Renzo Colle, Ralf Dentzer y Jan Hrastnik.
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073
