• Inicio
  • Novedades
  • Academia SAP
  • FAQ
  • Blog
  • Contacto
S4PCADEMY_Logo
Twitter Linkedin Instagram
S4PCADEMY_Logo
Twitter Linkedin Instagram
FORMACIÓN SAP

Modelos de objetos transaccionales en CDS para ABAP

By s4pcademy 


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.

Modelos de objetos

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.

Controles de acceso

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.




¿Qué es el modelo del doble diamante en proyectos de diseño?
Previo
Explorando un marco de documentos HTML simple
Siguiente

Madrid

Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010

México

Paseo de la Reforma 26
Colonia Juárez,  Cuauhtémoc
Ciudad de México 06600

Costa Rica

Real Cariari
Autopista General Cañas, 
San José, SJ 40104

Perú

Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073

Twitter Linkedin Instagram
Copyright 2022 | All Right Reserved.