Definición de estructuras de diccionario

Objective

After completing this lesson, you will be able to definir estructuras de Dictionary.

Estructuras de diccionario

Las estructuras de Dictionary ABAP se pueden utilizar como tipos de datos en el Dictionary ABAP.

La estructura en la parte izquierda de nuestro ejemplo consta de cinco componentes. Los primeros cuatro componentes hacen referencia a varios elementos de datos. El último componente se tipifica directamente con el tipo de diccionario predefinido CHAR.

El código ABAP de la derecha define exactamente el mismo tipo de estructura mediante la sentencia TYPES. Este código puede encontrarse en un método, en la parte de definición de una clase o en una interfaz. Los primeros cuatro componentes utilizan los mismos elementos de datos que los componentes de la estructura Dictionary. El último componente utiliza el tipo ABAP integrado C.

Además de la ampliabilidad y la etiqueta, las dos estructuras son totalmente compatibles.

Estructuras anidadas

Tipos de estructuras anidadas en Dictionary ABAP

Reproduzca el vídeo para obtener información sobre los tipos de estructura anidada en el diccionario ABAP.

Nota

Cuando escribe un objeto de datos con un tipo de estructura anidada, debe acceder a sus componentes de la siguiente manera:

Code Snippet
1234
gs_struct-address-post_code = '69190'. gs_struct-address-city = 'Walldorf'.

No es posible acceder directamente a los subcomponentes de la dirección.

Cómo definir una estructura anidada

Reproduzca el vídeo para ver cómo definir una estructura anidada.

Estructuras Include

Las estructuras anidadas no deben confundirse con estructuras que incluyan otro tipo de estructura.

Anteriormente en este curso, aprendió a incluir una estructura en la lista de campos de una tabla de base de datos. La misma técnica está disponible al definir un tipo de estructura.

En el ejemplo, la estructura zs4d430s_person_include tiene un total de siete componentes: Components first_name y last_name se definen directamente en la estructura, mientras que los otros cinco componentes se añaden incluyendo el tipo de estructura zs4d430s_address.

El código ABAP de la derecha ilustra cómo puede definir el mismo tipo utilizando la sentencia TYPES en una clase o interfaz ABAP.

Nota

Para entender este código, debe tener en cuenta que INCLUDE TYPES es una sentencia propia y no un suplemento de la sentencia TYPES. La sentencia de cadena TYPES finaliza antes de la sentencia INCLUDE con un signo de período (.) y una nueva sentencia de cadena TYPES empieza después de la sentencia INCLUDE.

Nota

Cuando utiliza un tipo de estructura de este tipo en ABAP, el include no es visible. Puede acceder a los componentes adicionales como de costumbre:

Code Snippet
12345
gs_struct-first_name = 'John'. gs_struct-post_code = '69190'. gs_struct-city = 'Walldorf'.

Includes con nombre

Al incluir una estructura en otra estructura, puede asignarle un nombre. A continuación, este include se denomina include con nombre.

En el Dictionary ABAP, añada el nombre antes de la palabra clave INCLUDE y separe los dos con un signo de dos puntos (:). Cuando defina su tipo de estructura en ABAP, coloque el nombre después del nombre de la estructura de include, con la palabra clave AS delante de ella.

El include mencionado establece una especie de grupo de campos que le permite acceder a los campos no solo directamente, sino también mediante el nombre del include.

Consideremos una estructura de objeto de datos tipificada con el tipo de estructura zs4d430s_person_include. Puede acceder al campo ciudad de dos maneras: como struct-city como lo haría con un include normal, o como struct-address-city.

Nota

Los includes con nombre y los grupos de campos se utilizan mucho en los tipos de datos derivados del modelo de programación de aplicaciones ABAP RESTful.

Cómo incluir estructuras

Reproduzca el vídeo para ver cómo incluir estructuras.

Definir y utilizar estructuras de diccionario

Necesita algunos tipos de estructura a los que puede acceder en varias clases globales. Decide definir tipos de estructura en el Dictionary ABAP.

Consejo

Antes de definir tipos de estructura en el Dictionary ABAP, debe investigar la opción de definir tipos de estructura públicos en una de las clases globales o en una interfaz global.

Modelo:

  • /LRN/CL_S4D430_TYT_STRUCTURE (clase global)

Solución:

  • /LRN/CL_S4D430_TYS_STRUCTURE (clase global)
  • /LRN/S_ADDRESS (tipo de estructura)
  • /LRN/S_NAME (tipo de estructura)
  • /LRN/S_PERSON (tipo de estructura)

Tarea 1: Definir una estructura simple

Cree una copia de la clase global /LRN/CL_S4D430_TYT_STRUCTURE (nombre sugerido: ZCL_##_STRUCTURE, donde ## es su número de grupo). Sustituya el tipo de estructura st_address por una estructura de diccionario (nombre sugerido: Z##S_ADDRESS).

Pasos

  1. Copie la clase /LRN/CL_S4D430_TYT_STRUCTURE en una clase de su propio paquete (nombre sugerido: ZCL_##_STRUCTURE, donde ## es su número de grupo).

    1. En la vista Explorador de proyectos, haga clic con el botón derecho en la clase /LRN/CL_S4D430_TYT_STRUCTURE para abrir el menú contextual.

    2. En el menú contextual, seleccione Duplicar ....

    3. Introduzca el nombre del paquete en el campo Paquete. En el campo Nombre, introduzca el nombre ZCL_##_STRUCTURE, donde ## representa su número de grupo.

    4. Ajuste la descripción y seleccione Siguiente.

    5. Confirme la orden de transporte y seleccione Finalizar.

  2. En la PUBLIC SECTION de la definición de clase, analice la definición del tipo st_address.

    1. Realice este paso como lo ha hecho anteriormente.

  3. Cree un nuevo objeto de diccionario del tipo Estructura (nombre sugerido: Z##S_ADDRESS).

    1. En la vista Explorador de proyectos, despliegue el paquete y abra el menú contextual en el subnodo Diccionario.

    2. Seleccione →Estructura nueva.

    3. Confirme el paquete, introduzca el nombre Z##S_ADDRESS y la descripción Dirección y, a continuación, seleccione Siguiente.

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

  4. Elimine la reserva-espacio component_to_be_Changed : abap.string(0);de la lista de componentes de la estructura. A continuación, sustitúyalo por una calle de componente. Utilice el mismo elemento de datos que en el tipo st_address de su clase global.

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

      Code Snippet
      123456
      define structure z##s_address { street : /dmo/street; }
  5. Añada componentes para el código postal, la ciudad y el país. Utilice los mismos nombres de componente y elementos de datos que en el tipo st_address de su clase global.

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

      Code Snippet
      123456789
      define structure z##s_address { street : /dmo/street; postal_code : /dmo/postal_code; city : /dmo/city; country : land1; }
  6. Active el tipo de estructura.

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

  7. Vuelva al código fuente de su clase global. En la implementación del método IF_OO_ADT_CLASSRUN~MAIN, sustituya st_address por su nuevo tipo de estructura de diccionario. Asegúrese de que no haya errores de sintaxis.

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

      Code Snippet
      1234567891011
      * Task 1 ***************************************************************** * DATA address TYPE st_address. DATA address TYPE z##s_address. address-street = 'Dietmar-Hopp-Allee 16'. address-postal_code = '69190'. address-city = 'Walldorf'. address-country = 'DE'.

Tarea 2: Definir una estructura anidada

En su clase global, elimine o comente el tipo de estructura pública st_person y sustitúyalo por una estructura de diccionario (nombre sugerido: Z##S_PERSON). Para la dirección, reutilice el tipo de estructura que ya ha creado. Para el nombre, utilice una corrección rápida para crear una segunda estructura simple con dos componentes (nombre sugerido: Z##S_NAME).

Pasos

  1. Cree un nuevo objeto de Dictionary de la estructura de tipo.

    1. En la vista Explorador de proyectos, despliegue el paquete y abra el menú contextual en el subnodo Diccionario.

    2. Seleccione →Estructura nueva.

    3. Confirme el paquete, introduzca el nombre Z##S_PERSON y la descripción Persona (nombre y dirección) y, a continuación, seleccione Siguiente.

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

  2. Elimine la reserva-espacio component_to_be_Changed : abap.string(0); de la lista de componentes de la estructura y sustitúyala por un componente para la dirección (nombre sugerido: dirección). Escriba el nuevo componente con la estructura que creó en la tarea anterior (Z##S_ADDRESS).

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

      Code Snippet
      123456
      define structure z##s_person { address : z##s_address; }
  3. Añada otro componente para el nombre de la persona (nombre sugerido: Nombre). Introduzca Z##S_NAME como el nombre del tipo de componente.

    Nota

    Este tipo de estructura aún no existe. Se crea en el siguiente paso.
    1. Ajuste el código de la siguiente manera:

      Code Snippet
      1234567
      define structure z##s_person { name : z##s_name; address : z##s_address; }
  4. Grabe el tipo de estructura. A continuación, utilice una corrección rápida para crear el tipo de estructura Z##S_NAME.

    1. Pulse Ctrl + S para guardar el objeto de desarrollo.

    2. Haga clic con el botón izquierdo en el icono de error junto a la línea de código que acaba de añadir y seleccione Crear estructura de diccionario ....

    3. Introduzca la descripción Nombre y seleccione Siguiente.

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

  5. Elimine el marcador de posición component_to_be_Changed : abap.string(0);de la lista de componentes de la estructura y sustitúyalo por un componente para el nombre (nombre sugerido: first_name) y un componente para el apellido (nombre sugerido: last_name). Utilice elementos de datos adecuados del área de nombres /DMO/ como tipos de componentes.

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

      Code Snippet
      1234567
      define structure z##s_name { first_name : /dmo/first_name; last_name : /dmo/last_name; }
  6. Grabe el tipo de estructura. A continuación, active todos los objetos de desarrollo inactivos.

    1. Pulse Ctrl + S para guardar el objeto de desarrollo.

    2. En la barra de herramientas de eclipse, seleccione Activar objetos de desarrollo ABAP inactivos. Como alternativa, pulse Ctrl + Mayús + F3.

    3. Seleccione Seleccionar todo y Activar.

  7. Vuelva al código fuente de su clase global. En la PUBLIC SECTION de la definición de clase, elimine o comente la definición de los tipos st_name y st_person.

    1. Realice este paso como antes.

  8. En la implementación del método IF_OO_ADT_CLASSRUN~MAIN, sustituya st_person por su nuevo tipo de estructura de diccionario. Asegúrese de que no haya errores de sintaxis.

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

      Code Snippet
      12345678910111213
      * Task 2 *********************************************************** * DATA person TYPE st_person. DATA person TYPE z##s_person. person-name-first_name = 'Dictionary'. person-name-last_name = 'ABAP'. person-address-street = 'Dietmar-Hopp-Allee 16'. person-address-postal_code = '69190'. person-address-city = 'Walldorf'. person-address-country = 'DE'.

Tarea 3: Definir Includes con nombre

En su clase global, elimine o comente el tipo de estructura pública st_person_inc y sustitúyalo por una estructura de diccionario (nombre sugerido: Z##S_PERSON_INC). En lugar de los componentes estructurados NAME y ADDRESS, defina includes nombrados del mismo nombre.

Pasos

  1. Cree una copia de su estructura de diccionario anidada (nombre sugerido: Z##S_PERSON_INC, donde ## es su número de grupo).

    1. En la vista Explorador de proyectos, despliegue el paquete y el subnodo Estructura→de diccionario.

    2. Abra el menú contextual en el tipo de estructura Z##S_PERSON y seleccione Duplicar.

    3. Introduzca el nombre Z##S_PERSON_INC y seleccione Siguiente.

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

  2. Convierta el nombre del componente estructurado en un include con nombre.

    1. Después de los dos puntos que separan el nombre de componente y el tipo de componente, inserte la palabra clave INCLUDE.

  3. Repita esto para la dirección del componente estructurado.

    1. Asegúrese de que el tipo de estructura ahora tenga este aspecto:

      Code Snippet
      123456
      define structure z##s_person_inc { name : include z##s_name; address : include z##s_address; }
  4. Active el tipo de estructura.

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

  5. Vuelva al código fuente de su clase global. En la PUBLIC SECTION de la definición de clase, elimine o comente la definición del tipo st_person_inc.

    1. Realice este paso como antes.

  6. En la implementación del método IF_OO_ADT_CLASSRUN~MAIN, sustituya st_person_inc por su nuevo tipo de estructura de Dictionary. Asegúrese de que ambas alternativas para acceder a los componentes funcionen.

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

      Code Snippet
      123456789101112131415161718192021
      * Task 3 ********************************************************************** * DATA person2 TYPE st_person_inc. DATA person2 TYPE z##s_person_inc. person2-name-first_name = 'Dictionary'. person2-name-last_name = 'ABAP'. person2-address-street = 'Dietmar-Hopp-Allee 16'. person2-address-postal_code = '69190'. person2-address-city = 'Walldorf'. person2-address-country = 'DE'. * or ------------------------------------------------------- person2-first_name = 'Dictionary'. person2-last_name = 'ABAP'. person2-street = 'Dietmar-Hopp-Allee 16'. person2-postal_code = '69190'. person2-city = 'Walldorf'. person2-country = 'DE'.
  7. Active y depure la clase como una aplicación de consola. Analice el contenido de los objetos de datos dirección, persona y persona2.

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

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