Ampliación de vistas CDS

Objective

After completing this lesson, you will be able to amplíe las entidades CDS con ampliaciones de vista CDS.

Ampliaciones de vista CDS

Técnicamente, la ampliación de entidades CDS es muy similar a la ampliación de objetos de diccionario. Los clientes o interlocutores crean nuevos objetos de desarrollo que hacen referencia al objeto de desarrollo que desean ampliar. En el diccionario ABAP crean estructuras APPEND, en CDS definen ampliaciones de entidad CDS. Las entidades de vista CDS se amplían con ampliaciones de vista CDS. Las ampliaciones de vista CDS se definen en una definición de datos dedicada mediante la sentencia EXTEND VIEW ENTITY. Una vista CDS existente puede tener una o más ampliaciones de vista CDS.

En este ejemplo, la entidad de vista CDS /DMO/E_Agency a la izquierda contiene un elemento en la lista de elementos. La ampliación de vista de la derecha añade un elemento, ZZCategoryZAG, a esta lista. El enlace entre las dos definiciones de datos se establece mediante el nombre de entidad de vista CDS después de la palabra clave ENTIDAD DE VISTA AMPLIADA.

Nota

La ampliación de entidad de vista CDS debe especificar el nombre de la fuente de datos al abordar campos o elementos. En el ejemplo, utiliza Agency que está definido en la entidad de vista CDS /DMO/E_Agency como alias para la tabla de base de datos /DMO/AGENCY.

Las ampliaciones de vista CDS también pueden definir asociaciones adicionales. En función de las opciones de ampliabilidad (véase más abajo), pueden exponer estas asociaciones o utilizarlas en expresiones de vía de acceso en la lista de elementos.

En este ejemplo, la ampliación de vista CDS define la asociación _ZZTextZAG y la añade a la lista de elementos de la entidad de vista CDS /DMO/E_Agency.

Control de ampliabilidad para entidades CDS

El control de ampliabilidad para entidades CDS es muy similar al control de ampliabilidad para objetos de diccionario. La mayoría de las anotaciones tienen una sintaxis y significado similares. Para obtener una documentación completa, consulte la documentación de palabras clave ABAP.

Sin embargo, hay algunas diferencias menores, como se muestra aquí:

  • Las anotaciones empiezan por @ABAPCatalog.extensibility. En CDS, empiezan por @ABAPCatalog.Enhancement.
  • Hay una anotación simple de verdadero/falso para permitir o no la ampliabilidad.

    Nota

    La anotación AbapCatalog.viewEnhancementCategory especifica cómo se puede ampliar una vista CDS.

    AbapCatalog.viewEnhancementCategory y AbapCatalog.extensibility.extensible se pueden especificar conjuntamente en la misma vista CDS. En este caso, los valores de anotación deben ajustarse entre sí. Ambos deben permitir o prohibir extensiones.

  • No es posible distribuir la cuota compartida entre clientes e interlocutores.
  • Puede definir un elementSuffix y no un fieldSuffix, porque la lista de elementos de una entidad CDS puede constar de más de solo campos. Las asociaciones expuestas son un ejemplo.

La diferencia más importante son las subanotaciones allowNewDatasources y dataSources, que no tienen equivalente en el diccionario ABAP. Con estas anotaciones, el propietario de una entidad de vista CDS puede controlar desde dónde las ampliaciones pueden leer sus datos. Si allowNewDatasources está fijado en verdadero, el desarrollador de una ampliación puede leer de cualquier fuente de datos desde la que lea la vista original. Si se fija en falso, el desarrollador de la ampliación solo podrá leer de las fuentes de datos enumeradas en dataSources. Pueden ser las fuentes de datos directas de la vista original o los destinos de sus asociaciones.

SAP a menudo lo utiliza para forzar el uso de includes de ampliación, que son una práctica recomendada para las ampliaciones de vista CDS.

Los includes de ampliación son una práctica recomendada para las ampliaciones de vista CDS. El nombre es un poco engañoso porque ABAP CDS no admite una técnica de include como el diccionario ABAP. Lo que SAP utiliza en su lugar son entidades de vista CDS especiales, normalmente identificables por el prefijo "E_". La entidad de vista CDS estándar, por ejemplo, una vista con el prefijo "R_", se define con una asociación a una vista E de este tipo.

En la figura, la definición de vista CDS en la parte superior izquierda contiene una asociación a la vista de inclusión de ampliación en la parte inferior izquierda. Ambas vistas CDS son ampliables, pero para forzar el uso de la vista E, la vista principal restringe la ampliabilidad a elementos de la asociación a la vista E. Por otro lado, la vista E permite la ampliación con los elementos de la fuente de datos principal. Como consecuencia, los desarrolladores de extensiones deben añadir elementos nuevos a la vista E antes de poder añadirlos a la vista principal.

Veamos un ejemplo.

Este ejemplo ilustra cómo ampliar la entidad de vista CDS /DMO/R_AgencyTP (en la parte superior izquierda) con el campo ZZCATEGORYZAG de la tabla de base de datos /DMO/AGENCY.

No es posible realizar la ampliación directamente porque la entidad de vista CDS /DMO/R_AgencyTP restringe la ampliación a la asociación _Extension, que tiene la entidad de vista CDS /DMO/E_Agency como destino (parte inferior izquierda).

Por lo tanto, en un primer paso, el desarrollador amplía /DMO/E_Agency (abajo a la derecha) y solo entonces amplía el elemento de direccionamiento /DMO/R_AgencyTPZZCategoryZAG a través de una expresión de vía de acceso.

Creación de ampliación de vista CDS

Al igual que las vistas CDS, las ampliaciones de vista CDS se definen en definiciones de datos CDS.

Para definir una ampliación de vista CDS, proceda de la siguiente manera:

  1. En el explorador de proyectos, localice la definición de datos de la entidad CDS que desea ampliar.
  2. Haga clic con el botón derecho en la definición de datos y seleccione Nueva definición de datos.
  3. Ajuste el paquete, introduzca un nombre y una descripción para el objeto nuevo. A continuación, seleccione Siguiente.

    Nota

    Normalmente, la definición de datos con la extensión no se encuentra en el mismo paquete que el objeto base. Por lo tanto, es importante ajustar el paquete propuesto.

  4. Introduzca una orden de transporte y seleccione Siguiente.
  5. En la lista de plantillas, seleccione Ampliar entidad de vista y seleccione Finalizar.

    También hay una plantilla de Vista ampliada. Pertenece a una generación anterior de vistas CDS. Utilice este modelo solo cuando tenga que ampliar una vista definida con define view y no con define view entity.

Ampliar entidades de vista CDS

Desea ampliar entidades de vista CDS con elementos y asociaciones adicionales. En lugar de editar las definiciones de datos directamente, cree ampliaciones de vista CDS.

Nota

En este ejercicio, amplía sus propias entidades de vista CDS Z##_R_Employee y Z##_C_EmployeeQueryP, donde ## es su número de grupo. Esto se hace por simplicidad. Para motivar el uso de ampliaciones, debe fingir que las entidades de vista se encuentran en un área de nombres diferente y que no tiene autorización para realizar modificaciones directas en ellas.

Modelo:

  • n.a.

Solución:

  • /LRN/EXT_R_EMPLOYEE ( Definición de datos)
  • /LRN/EXT_C_EMPLOYEE ( Definición de datos)

Prerrequisitos

Para este ejercicio, necesita la entidad de vista base para los datos de empleado (el nombre sugerido era: Z##_R_Employee) que se desarrolló en ejercicios anteriores. Si no ha finalizado estos ejercicios, cree una copia de la definición de datos /LRN/R_EMPLOYEE_AUT.

Además, necesita la entidad de vista con parámetros para los datos de empleado (el nombre sugerido era: Z##_C_EmployeeQueryP). Si no ha finalizado los ejercicios relacionados, cree una copia de la definición de datos /LRN/C_EMPLOYEE_AUT y déjela leer de su entidad de vista base.

Tarea 1: Habilitar extensibilidad

Ajuste las opciones de ampliabilidad de su entidad de vista base para los datos de empleado (el nombre sugerido era: Z##_R_Employee, donde ## es su número de grupo). Permitir la ampliación de la lista de elementos con campos que provienen de su tabla de base de datos para datos de empleado (el nombre sugerido era Z##_EMPLOY).

Del mismo modo, ajuste las opciones de ampliabilidad de su entidad de vista con parámetros para los datos de empleado (el nombre sugerido era: Z##_C_EmployeeQueryP, donde ## es su número de grupo). Permita la ampliación de la lista de elementos con elementos que provienen de su entidad de vista base (el nombre sugerido era Z##_R_Employee).

Pasos

  1. Abra la definición de su entidad de vista base para datos de empleado.

    1. Pulse Ctrl + Mayús + A, introduzca el nombre de la definición de datos y seleccione OK.

  2. Ajuste el tipo de ampliación de vista para permitir la ampliación de la lista de elementos.

    1. Cambie el valor de la anotación @ABAPCatalog.viewEnhancementCategory de #NONE a #PROJECTION_LIST.

  3. Actualice la lista de fuentes de datos permitidas para la ampliación. Añada la tabla de base de datos desde la que lee la entidad de vista a esta lista.

    Nota

    Para agregar la tabla de base de datos a la lista, debe definir un nombre de alias para ella (nombre de alias sugerido: Empleado).
    1. Añada la anotación @ABAPCatalog.extensibility.dataSources de la siguiente manera:

      Code Snippet
      1234567
      @AbapCatalog: { dataMaintenance: #RESTRICTED, viewEnhancementCategory: [#PROJECTION_LIST], extensibility.dataSources: [ 'Employee' ] }
    2. Defina el alias para la fuente de datos de la siguiente manera:

      Code Snippet
      1234
      define view entity Z##_R_Employee as select from z##employ as Employee
  4. Defina un sufijo obligatorio para los campos adicionales (valor sugerido: ZEM).

    1. Añada la anotación @ABAPCatalog.extensibility.elementSuffix de la siguiente manera:

      Code Snippet
      12345678
      @AbapCatalog: { dataMaintenance: #RESTRICTED, viewEnhancementCategory: [#PROJECTION_LIST], extensibility.dataSources: [ 'Employee' ], extensibility.elementSuffix: 'ZEM' }
  5. Active la definición de datos.

    1. Pulse Ctrl + F3 para activar el objeto de desarrollo.

  6. Abra la definición de su entidad de vista con parámetros para datos de empleado.

    1. Pulse Ctrl + Mayús + A, introduzca el nombre de la definición de datos y seleccione OK.

  7. Como antes, ajuste la categoría de ampliación de vista, actualice las fuentes de datos permitidas y defina el sufijo de elemento.

    Nota

    Utilice el mismo alias de fuente de datos y el mismo sufijo de elemento que antes.
    1. Ajuste el código de la siguiente manera:

      Code Snippet
      12345678
      @AbapCatalog: { dataMaintenance: #RESTRICTED, viewEnhancementCategory: [#PROJECTION_LIST], extensibility.dataSources: [ 'Employee' ], extensibility.elementSuffix: 'ZEM' }
    2. Defina el alias para la fuente de datos de la siguiente manera:

      Code Snippet
      123456789
      define view entity Z##_C_EmployeeQueryP with parameters p_target_curr : /dmo/currency_code, @EndUserText.label: 'Date of evaluation' @Environment.systemField: #SYSTEM_DATE p_date : abap.dats as select from Z##_R_Employee as Employee
  8. Active la definición de datos.

    1. Pulse Ctrl + F3 para activar el objeto de desarrollo.

Tarea 2: Ampliar la entidad de vista base

Para su entidad de vista base, cree una ampliación de vista CDS (nombre sugerido: Z##EXT_R_EMPLOYEE) para añadir los campos para el título del empleado y el país a la lista de elementos (los nombres sugeridos eran: ZZTITLE_ZEM y ZZCOUNTRY_ZEM).

Pasos

  1. Cree una ampliación de vista CDS para su entidad de vista CDS Z##_R_Employee.

    1. En el Explorador de proyectos, localice la definición de datos Z##_R_EMPLOYEE, haga clic con el botón derecho y seleccione Nueva definición de datos.

    2. Asegúrese de que el campo Paquete contenga el nombre de su propio paquete.

    3. Introduzca Z##EXT_R_Employee en Nombre y Ampliación de Z##_R_Employee en Descripción. A continuación, seleccione Siguiente.

    4. Confirme la orden de transporte y seleccione Siguiente.

      Nota

      No seleccione Finalizar todavía o no podrá seleccionar la plantilla correcta.
    5. En la lista de plantillas, seleccione Ampliar entidad de vista y seleccione Finalizar.

  2. Edite la lista de elementos de la ampliación de vista. Elimine el marcador de posición y utilice la finalización de código para agregar el cargo y el país del empleado.

    1. En el código fuente, sustituya base_data_source_code.element_name. por zz y pulse Ctrl + Espacio para invocar la finalización del código.

    2. En la lista de sugerencias, seleccione zztitle_zem- z##emplear como empleado (columna) para añadir el campo append a la lista de elementos de la ampliación de vista CDS.

    3. Repita para ajustar el código de la siguiente manera:

      Code Snippet
      1234567
      extend view entity Z##_R_Employee with { employ.zztitle_zem, employ.zzcountry_zem }
  3. Defina nombres alias para los nuevos elementos de vista (nombres sugeridos: ZZTitleZem y ZZCoutryZem).

    1. Ajuste el código de la siguiente manera:

      Code Snippet
      1234567
      extend view entity Z##_R_Employee with { employ.zztitle_zem as ZZTitleZem, employ.zzcountry_zem as ZZCountryZem }
  4. Active la ampliación de vista.

    1. Pulse Ctrl + F3 para activar el objeto de desarrollo.

  5. Visualice la descripción de quick info para la entidad de vista ampliada para confirmar que contiene los nuevos elementos.

    1. En la línea de código que comienza con extend view entity, sitúe el cursor en z##_R_Employee y pulse F2.

Tarea 3: Ampliar la entidad de evaluación

Para su entidad de vista de consulta con parámetros, cree una ampliación de vista CDS (nombre sugerido: Z##EXT_C_EMPLOYEE) para añadir los elementos que ha añadido a la vista base (los nombres de elementos sugeridos eran: ZZTitleZem y ZZCountryZem). Añada también una función SQL para concatenar el nombre y apellido del empleado, separados por un solo espacio en blanco (nombre de elemento sugerido: ZZFullNameZem). Por último, amplíe la vista con un indicador que le indique si el empleado tiene su sede en la Unión Europea o no (nombre de elemento sugerido: ZZEUBasedZem).

Consejo

Los datos maestros de país contienen un indicador IsEuropeanUnionMember. Para acceder a este elemento, primero debe ampliar la vista con una asociación a la entidad de vista CDS I_Country (nombre de asociación sugerido: _ZZCountryZem). A continuación, añada una expresión de vía de acceso a la lista de elementos de la extensión de vista.

Pasos

  1. Cree una ampliación de vista CDS para su entidad de vista CDS Z##_C_EmployeeQueryP.

    1. En el Explorador de proyectos, localice la definición de datos Z##_C_EMPLOYEEQUERYP, haga clic con el botón derecho y seleccione Nueva definición de datos.

    2. Asegúrese de que el campo Paquete contenga el nombre de su propio paquete.

    3. Introduzca Z##EXT_C_Employee en Nombre y Ampliación de Z##_C_EmployeeQueryP en Descripción. A continuación, seleccione Siguiente.

    4. Confirme la orden de transporte y seleccione Siguiente.

      Nota

      No seleccione Finalizar todavía o no podrá seleccionar la plantilla correcta.
    5. En la lista de plantillas, seleccione Ampliar entidad de vista y seleccione Finalizar.

  2. Edite la lista de elementos de la ampliación de vista. Elimine el marcador de posición y utilice la finalización de código para agregar el cargo y el país del empleado.

    1. En el código fuente, sustituya base_data_source_code.element_name. por zz y pulse Ctrl + Espacio para invocar la finalización del código.

    2. En la lista de sugerencias, seleccione ZZTitleZem - Z##_R_Employ como empleado (columna) para añadir el campo de ampliación a la lista de elementos.

    3. Repita para ajustar el código de la siguiente manera:

      Code Snippet
      1234567
      extend view entity Z##_C_EmployeeQueryP with { Employee.ZZTitleZem, Employee.ZZContryZem }
  3. Utilice la función concat_with_space para concatenar el nombre y apellido del empleado, separados por un solo espacio en blanco.

    1. Ajuste el código de la siguiente manera:

      Code Snippet
      123456789
      extend view entity Z##_C_EmployeeQueryP with { Employee.ZZTitleZem, Employee.ZZContryZem, concat_with_space( Employee.FirstName, Employee.LastName, 1 ) }
  4. Añada un nombre para este nuevo elemento (nombre sugerido: ZZFullNameZem) y utilice la anotación relevante para proporcionar una etiqueta.

    1. Ajuste el código de la siguiente manera:

      Code Snippet
      12345678910
      extend view entity Z##_C_EmployeeQueryP with { Employee.ZZTitleZem, Employee.ZZContryZem, @endUserText.label: ' concat_with_space( Employee.FirstName, Employee.LastName, 1 ) as ZZFullNameZem }
  5. Amplíe la vista con una asociación a la entidad de vista CDS I_Country (nombre sugerido: _ZZCountryZem).

    Consejo

    En la condición ON, utilice el código de país de la lista de elementos y el elemento clave de la entidad de vista I_Country.
    1. Ajuste el código de la siguiente manera:

      Code Snippet
      12345678910111213
      extend view entity Z##_C_EmployeeQueryP with association [1..1] to I_Country as _ZZCountryZem on $projection.ZZCountryZem = _ZZCountryZem.Country { Employee.ZZTitleZem, Employee.ZZContryZem, concat_with_space( Employee.FirstName, Employee.LastName, 1 ) as ZZFullNameZem }
  6. En la lista de elementos, añada el elemento IsEuropeanUnionMember del destino de asociación (nombre sugerido: ZZEUBasedZem).

    1. Ajuste el código de la siguiente manera:

      Code Snippet
      123456789101112131415
      extend view entity Z##_C_EmployeeQueryP with association [1..1] to I_Country as _ZZCountryZem on $projection.ZZCountryZem = _ZZCountryZem.Country { Employee.ZZTitleZem, Employee.ZZContryZem, concat_with_space( Employee.FirstName, Employee.LastName, 1 ) as ZZFullNameZem, _ZZCountryZem.IsEuropeanUnionMember as ZZEUBasedZem }
  7. Active la ampliación de vista y visualice la descripción de quick info para la entidad de vista ampliada para confirmar que contiene los nuevos elementos.

    1. Pulse Ctrl + F3 para activar el objeto de desarrollo.

    2. En la línea de código que comienza con extend view entity, sitúe el cursor en z##_C_EmployeeQueryP y pulse F2.