Ampliación de objetos del diccionario

Objective

After completing this lesson, you will be able to ampliar objetos de Dictionary mediante estructuras append.

Estructuras append

Ya ha aprendido que una definición de tabla de base de datos en el Dictionary ABAP corresponde a una tabla física en la base de datos. Las modificaciones en el objeto de Dictionary se transmiten al objeto de base de datos durante la activación (ALTER TABLE) o mediante el procedimiento de ajuste de base de datos.

Las estructuras append son una técnica que permite añadir campos a una tabla de base de datos sin modificar realmente la definición de tabla en el Dictionary ABAP.

Consideremos una tabla de base de datos definida por un proveedor de software, por ejemplo, SAP. Un cliente o socio desea añadir campos a esta tabla de base de datos.

En lugar de añadir los campos a la definición de la tabla de base de datos en el Dictionary ABAP, crean una estructura append. La estructura append es un objeto de diccionario separado, propiedad del cliente o interlocutor y actualizado por este. Técnicamente, es un tipo de estructura en el Dictionary ABAP. Sin embargo, está vinculado a la definición de tabla de base de datos y define campos adicionales para la tabla de base de datos relacionada. Cuando se activa la estructura append, sus componentes se añaden como campos a la tabla de la base de datos.

Puede decir que la tabla de la base de datos está definida por dos objetos de Dictionary: la definición de tabla de base de datos y la estructura append.

Nota

Una estructura append pertenece exactamente a una tabla de base de datos. Sin embargo, una tabla de base de datos puede tener varias estructuras append.

En ABAP Cloud, solo puede crear una estructura append si el proveedor de software ha liberado la definición de tabla para la ampliación.

Pero, ¿qué sucede si el proveedor de software envía una nueva versión de la definición de tabla de base de datos?

Tenga en cuenta que en una versión futura, la tabla de base de datos contendrá un campo adicional. La solución es sencilla: durante la actualización, el nuevo campo simplemente se añade al catálogo de campos de la tabla de base de datos mediante la sentencia ALTER TABLE. La secuencia de campos diferente en la base de datos y en el Dictionary ABAP no es un problema para el entorno ABAP.

Este es un ejemplo de una estructura append.

El código de la izquierda muestra la definición de la tabla de base de datos /DMO/AGENCY. El código de la derecha muestra la definición de la estructura append Z00_EXT_AGENCY. El enlace entre los dos objetos de diccionario se establece en la estructura append mencionando la tabla de base de datos después de la palabra clave EXTEND TYPE.

La estructura append tiene un componente zzcategory. Se añade a la lista de campos de la tabla de base de datos /DMO/AGENCY.

Existe un motivo por el que el componente de la estructura append empieza por "ZZ". Los campos de tabla y los componentes de estructura que empiezan por "ZZ" o "YY" se encuentran en el área de nombres de cliente. SAP garantiza que las tablas suministradas por SAP nunca contengan campos en el área de nombres de cliente. Al seleccionar nombres de campo en el área de nombres de cliente, los clientes pueden evitar conflictos de nombres de campo si SAP añade campos nuevos a la tabla de destino.

La técnica append no solo funciona para definiciones de tabla de base de datos. También puede utilizar estructuras append para añadir componentes a un tipo de estructura.

En este ejemplo, la estructura append de la derecha amplía la estructura del diccionario /DMO/S_EXT_INCL_AGENCY con un campo ZZCATEGORYZAG.

Control de ampliabilidad para objetos de Dictionary

Para evitar conflictos posteriores, el propietario de una definición de tabla de base de datos o un tipo de estructura puede restringir la ampliabilidad o incluso no permitirla.

El proveedor de software controla la ampliabilidad utilizando las siguientes subanotaciones de la anotación @ABAPCatalog.Enhancement:

categoría

Define la categoría de ampliación. Se pueden especificar los siguientes valores:

  • #NOT_CLASSIFIED - No clasificado
  • #NOT_EXTENSIBLE - No se puede ampliar
  • #EXTENSIBLE_CHARACTER - Ampliable (alfanumérico)
  • #EXTENSIBLE_CHARACTER_NUMERIC - Ampliable (alfanumérico o numérico)
  • #EXTENSIBLE_ANY - Se puede ampliar (profundo - solo para estructuras)
Sufijo de campo

Define un sufijo de elemento de 3 caracteres. Este sufijo se debe utilizar para todos los campos de una ampliación creada por clientes o socios. El objetivo es evitar conflictos de nombres de campo.

quotaMaximumFields

Define la cantidad máxima de campos que los clientes e interlocutores pueden añadir al objeto correspondiente. En otras palabras, reserva un recuento de campos para ampliaciones de cliente y socio.

quotaMaximumBytes

Define la capacidad máxima de bytes que los clientes e interlocutores pueden añadir al objeto correspondiente. En otras palabras, reserva una capacidad de bytes para ampliaciones de cliente y socio.

Nota

Para obtener la documentación completa de las anotaciones de ampliabilidad, consulte la documentación de palabras clave ABAP.

A menudo, SAP utiliza el control de ampliación para forzar el uso de includes de ampliación.

Los includes de ampliación son tipos de estructura específicos que se incluyen en una o varias definiciones de tabla de base de datos. Si los clientes o interlocutores desean añadir campos a la tabla, deben crear una estructura append para este include de ampliación en lugar de una append directa para la tabla de base de datos.

Los principales beneficios son los siguientes:

  • El proveedor de software puede utilizar el mismo include de extensión en varias definiciones de tabla de base de datos y tipos de estructura. Esto garantiza que los campos adicionales se añadan a varias tablas de forma consistente.
  • El proveedor de software puede decidir liberar solo el include de extensión y no la definición de tabla de base de datos en sí.

Veamos un ejemplo de una ampliación indirecta:

La estructura append de la derecha no amplía directamente la tabla de base de datos /DMO/AGENCY. En su lugar, amplía el tipo de estructura /DMO/S_EXT_INCL_AGENCY. Como la estructura se utiliza como estructura include en la tabla de base de datos /DMO/AGENCY, cualquier campo añadido a la estructura también se añade a la tabla de base de datos.

Creación de estructura append

Creación de una estructura append

Reproduzca el vídeo para ver cómo crear una estructura append.

Cómo ampliar una definición de tabla de base de datos

Reproduzca el vídeo para ver cómo ampliar una definición de tabla de base de datos.

Ampliar una definición de tabla de base de datos

Desea ampliar una tabla de base de datos con campos adicionales. En lugar de editar la definición de la tabla de base de datos directamente, cree una estructura APPEND.

Nota

En este ejercicio, amplía su propia tabla de base de datos para los datos de empleado (el nombre sugerido era: Z##EMPLOY, donde ## es su número de grupo). Esto se hace por simplicidad. Para motivar el uso de la técnica append, debe fingir que la tabla de base de datos se encuentra en un área de nombres diferente y que no tiene autorización para realizar modificaciones directas en ella.

Modelo:

  • n.a.

Solución:

  • /LRN/S_EXT_EMPLOYEE (tipo de estructura)

Prerrequisitos

Para este ejercicio, necesita la definición de la tabla de base de datos para los datos de empleado que creó en un ejercicio anterior (el nombre sugerido era: Z##EMPLOY, donde ## es su número de grupo). Si no ha creado esa tabla de base de datos, créela ahora como copia de la definición de tabla de base de datos /LRN/EMPLOY_REL.

Tarea 1: Habilitar extensibilidad

Ajuste las opciones de ampliabilidad de su tabla de base de datos para los datos de empleado (el nombre sugerido era: Z##EMPLOY, donde ## es su número de grupo). Permitir la ampliación con campos de tipos de datos planos, es decir, campos numéricos y de caracteres. Forzar que los nombres de los campos adicionales terminen con las mismas letras (valor sugerido: ZEM).

Pasos

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

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

  2. Ajuste la categoría de ampliación para permitir la ampliación con campos numéricos y de caracteres.

    1. Cambie el valor de la anotación @ABAPCatalog.enhancement.category de #NOT_EXTENSIBLE a #EXTENSIBLE_CHARACTER_NUMERIC.

  3. Defina un sufijo obligatorio para los campos adicionales (valor sugerido: ZEM).

    1. Añada la anotación @ABAPCatalog.enhancement.fieldSuffix.

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

      Code Snippet
      1234
      @AbapCatalog.enhancement.category : #EXTENSIBLE_CHARACTER_NUMERIC @AbapCatalog.enhancement.fieldSuffix : 'ZEM'
  4. Active la tabla de base de datos.

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

Tarea 2: Crear estructura append

Cree una estructura append (nombre sugerido: Z##_S_EXT_EMPLOYEE, donde ## es su número de grupo) para ampliar su tabla de base de datos para los datos de empleado (el nombre sugerido era: Z##EMPLOY). Añada un campo para el cargo del empleado (nombre sugerido: ZZTITLE_ZEM) y un campo para el país en el que se basa el empleado (nombre sugerido: ZZCOUNTRY_ZEM). Escriba los campos nuevos con los elementos de datos /DMO/TITLE y LAND1.

Pasos

  1. Utilice una corrección rápida para crear una estructura append para esta tabla (nombre sugerido: Z##_S_EXT_EMPLOYEE, donde ## es su número de grupo).

    1. Sitúe el cursor en el nombre de la tabla de base de datos y pulse Ctrl + 1 para invocar la corrección rápida.

    2. En la lista de correcciones rápidas disponibles, seleccione Crear estructura append para ....

    3. En Nombre, introduzca Z##_S_EXT_EMPLOYEE y en Descripción, introduzca Empleado (estructura append) y, a continuación, seleccione Siguiente.

    4. Asigne la estructura append a una orden de transporte y seleccione Finalizar.

  2. En la lista de componentes de la estructura append, defina un componente nuevo (nombre sugerido: zztitle) con el elemento de datos /DMO/TITLE como tipo de componente.

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

      Code Snippet
      12345
      extend type z##employ with z##_s_ext_employee { zztitle_zem : /dmo/title; }
  3. Defina un segundo componente (nombre sugerido: zzpaí_zem) con el elemento de datos LAND1 como tipo de componente.

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

      Code Snippet
      123456
      extend type z##employ with z##_s_ext_employee { zztitle_zem : /dmo/title; zzcountry_zem : land1; }
  4. Active la estructura append.

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

  5. Visualice la descripción de quick info para la tabla de base de datos ampliada para confirmar que la tabla contiene los campos nuevos.

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

Tarea 3: Rellenar campos de ampliación

En su tabla de empleados, rellene los campos de ampliación. Para ello, cree una copia de la clase ABAP /LRN/CL_S4D430_CHECK_AND_FILL y ajuste los valores de las constantes c_version y c_employ_table. A continuación, active y ejecute la clase como una aplicación de consola.

Pasos

  1. Cree una copia de la clase ABAP /LRN/CL_S4D430_CHECK_AND_FILL, denomínela Z##_S4D430_CHECK_AND_FILL y colóquela en el paquete ZS4D430_##.

    Nota

    Omita este paso si ha creado una copia de /LRN/CL_S4D430_CHECK_AND_FILL en un ejercicio anterior.
    1. En la vista Explorador de proyectos, localice la clase ABAP en el paquete /LRN/S4D430_EXERCISE y haga clic con el botón derecho para abrir el menú contextual.

    2. En el menú contextual, seleccione Duplicar.

    3. Introduzca el nombre del paquete, el nombre de la copia y una descripción. A continuación, seleccione Siguiente.

    4. Asigne el nuevo objeto a una orden de transporte y seleccione Finalizar.

  2. Cambie el valor de la constante c_version a lcl_generador=>with_extension.

    Consejo

    Puede añadir un signo de comentario delante de la definición actual y eliminar el signo de comentario de la segunda alternativa de definición.
    1. Ajuste el código de la siguiente manera:

      Code Snippet
      12345
      * CONSTANTS c_version TYPE t_version VALUE lcl_generator=>employee_table_only. * CONSTANTS c_version TYPE t_version VALUE lcl_generator=>with_relationships. CONSTANTS c_version TYPE t_version VALUE lcl_generator=>with_extensions.
  3. Si es necesario, modifique el valor de la constante c_employ_table al nombre de su tabla de base de datos.

    Nota

    La constante c_depment_table no es necesaria en esta versión del código.
    1. Desplácese hacia abajo hasta la fila de código que empieza por CONSTANTS c_employ_table.

    2. Si el literal después de VALUE aún contiene ##, sustitúyalo por su número de grupo.

  4. Active la clase ABAP y ejecútela como una aplicación de consola. Si la salida de la consola contiene errores, ajuste la definición de la tabla de base de datos para empleados hasta que sea compatible con la definición de tabla de base de datos /LRN/EMPLOY_EXT.

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

    2. Pulse F9 para ejecutar la clase ABAP como aplicación de consola.

    3. Asegúrese de que la salida de la consola contiene el texto Tabla rellenada ... para la tabla de base de datos.