Objectives
After completing this lesson, you will be able to:
- Defina un tipo de tabla Dictionary.
- Defina un tipo de tabla anidada.
Tipos de tabla de Dictionary
Crear un tipo de tabla de diccionario
Reproduzca el vídeo para aprender a crear un tipo de tabla de diccionario.
Tipos de tabla de Dictionary ABAP
El editor para objetos de diccionario del tipo Tipo de tabla está basado en formulario y no en código, ya que los editores son para estructuras y tablas de base de datos. El editor consta de las cuatro secciones siguientes:
- Tipo de fila
Este marco contiene el origen y el nombre del tipo de fila. Cuando crea un nuevo tipo de tabla, utiliza el tipo de diccionario predefinido CHAR con una longitud de 1.
- Inicialización y acceso
Este marco contiene la definición de la categoría de acceso a la tabla (estándar/clasificado/con hash). Por defecto, la categoría de acceso se fija en Tabla estándar.
El número inicial de filas se puede utilizar para dar al tiempo de ejecución ABAP una sugerencia sobre el tamaño del requisito de memoria inicial. Con el valor predeterminado 0, el tiempo de ejecución ABAP asigna el área de memoria inicial completamente por sí mismo. Tenga en cuenta que, en la mayoría de los casos, es mejor mantener el valor predeterminado 0 sin modificar.
- Resumen clave
Este marco proporciona un resumen de las claves. Seleccione la clave para la que desea ver los detalles.
Cada tipo de tabla contiene la definición de una clave primaria. Las claves secundarias son opcionales. El tipo de tabla en el ejemplo no contiene ninguna clave secundaria.
- Detalles clave
Este marco muestra los detalles de la clave seleccionada. Esto puede ser para la categoría de clave, es decir, si la clave es unívoca o no, y la definición de clave. En el ejemplo, la clave primaria no es unívoca y consta de todo el tipo de fila.
Cuando comparamos la definición de un tipo de tabla de diccionario y un tipo de tabla que se define con la sentencia ABAP TYPES, puede identificar fácilmente las diferentes partes:
- El tipo de línea se especifica después de añadir OF.
Nota
La sintaxis de la sentencia TYPES solo permite una palabra aquí. Cuando se utiliza un tipo integrado ABAP que requiere una longitud (tipo ABAP incompleto), el tipo de fila debe definirse en una sentencia TYPES separada.
- La categoría de acceso a la tabla se especifica después del suplemento TYPE.
- La definición de clave primaria se especifica después del suplemento WITH. El valor de definición clave Tipo de fila corresponde a table_line en la sintaxis ABAP.
Opciones para definir el tipo de fila
Cuando define un tipo de tabla, tiene varias opciones para especificar el tipo de fila:
- Tipo de diccionario
- Esta es la categoría de tipo de fila más común. El tipo de fila se especifica a través de otro objeto de diccionario, la mayoría de las veces una estructura. Si el tipo de fila es un elemento de datos, la tabla interna solo tendrá una columna que no tenga un nombre.
- Tipo predefinido
- Técnicamente, el uso de un tipo predefinido como tipo de fila es idéntico al uso de un elemento de datos. Lo que falta es la semántica adicional de un elemento de datos.
- Referencia a
- Con una de estas opciones, el tipo de fila es un tipo de referencia. La tabla interna tendrá una columna sin nombre que contendrá una lista de referencias, ya sea a objetos de datos o a instancias de clases.
- Tabla de rangos en
- Con una de estas opciones, el tipo de tabla define el tipo de una tabla range. Aunque especifique solo un tipo predefinido o un elemento de datos, la tabla range tendrá cuatro columnas: OPTION, SIGN, LOW y HIGH. Para obtener más información sobre el uso de tablas range, consulte la documentación ABAP.
Al definir el tipo de fila de un nuevo tipo de tabla, puede buscar tipos de diccionario existentes. Encontrará elementos de datos, estructuras, pero también tablas de base de datos y tipos de tabla. Sitúe el cursor en el campo de entrada Nombre de tipo y pulse Ctrl + Espacio o seleccione Explorar.
Consejo
Si existe el tipo de diccionario especificado, al hacer clic con el botón izquierdo en Nombre de tipo, accederá a la definición.
Atención
Aunque aquí se ofrecen tipos de tabla, no tiene sentido utilizarlos como tipos de fila. La "Tabla de tablas" resultante es difícil de gestionar porque no hay una forma fácil de identificar las filas de la tabla externa. En su lugar, utilice estructuras con componentes en forma de tabla. Analizaremos esas tablas anidadas más tarde.
Categoría de acceso y claves
La categoría de tabla es una propiedad técnica del tipo de tabla que especifica el método de almacenamiento y de acceso primario. El valor predeterminado es Tabla estándar. Otros valores son:
- Sorted Table
- El contenido de la tabla interna se clasifica por su clave primaria en cualquier momento. El tiempo de ejecución ABAP optimiza el acceso mediante búsquedas binarias siempre que sea posible. Se aplican restricciones para los accesos de escritura.
- Hashed Table
- El contenido de la tabla interna se administra mediante una tabla de control. El tiempo de ejecución ABAP optimiza el acceso utilizando un algoritmo de control siempre que sea posible. Se aplican restricciones para los accesos de lectura y escritura.
- Tabla de índices y no especificada
- Con estas opciones, el tipo de tabla no se especifica completamente. Estos tipos genéricos no se pueden utilizar para tipificar objetos de datos. Su uso está restringido a parámetros y símbolos de campo. Para trabajar con tipos de datos genéricos, se requieren técnicas de programación dinámica que no cubrimos en esta capacitación de habilidades centrales de ABAP. Para obtener más detalles, consulte la documentación ABAP.
Para definir la clave primaria de un tipo de tabla existen las siguientes opciones:
- Clave estándar
La clave estándar (también conocida como clave por defecto) consta de todos los componentes no numéricos del tipo de fila.
- Tipo de fila
Con esta opción, la clave primaria consta de todos los componentes del tipo de fila. Si el tipo de fila no está estructurado, la columna es la columna clave.
- No especificado
Con esta opción no se define ninguna clave primaria. El tipo de tabla es genérico y no se puede utilizar para objetos de datos ABAP.
- Componentes clave
La clave primaria consta de los componentes especificados explícitamente. Al seleccionar esta opción, el editor muestra una nueva sección debajo de la sección Detalles de clave primaria. En esta sección debe introducir los componentes clave.
Nota
Pulse Ctrl + Espacio para elegir entre los componentes del tipo de fila.
Nota
Recuerde que la clave primaria de las tablas internas no es necesariamente unívoca. Para las tablas estándar y las tablas clasificadas, también se admiten claves primarias no unívocas. En realidad, para las tablas estándar es la única opción. Esto se opone a las tablas de base de datos en las que la clave primaria siempre es una clave unívoca.
Definición de clave secundaria
Reproduzca el video para obtener información sobre la definición de clave secundaria.
Cómo definir un tipo de tabla de Dictionary
Reproduzca el vídeo para ver cómo definir un tipo de tabla de Dictionary.
Tipos de tablas anidadas
Puede utilizar un tipo de tabla para tipificar el componente de un tipo de estructura. En el ejemplo, las direcciones de componente se tipifican con el tipo de tabla zs4d430T_address. El código ABAP de la derecha ilustra cómo se define exactamente el mismo tipo de estructura en ABAP.
Nota
Una estructura con un componente en forma de tabla a menudo se denomina estructura profunda. Lo contrario es una estructura plana. Esto tiene que ver con la disposición de memoria de un objeto de datos de este tipo en ABAP. Para obtener detalles sobre estructuras profundas y planas, consulte la documentación ABAP.
Cuando utiliza una estructura con un componente en forma de tabla como tipo de fila de otro tipo de tabla, este tipo de tabla se convierte en anidado. En el ejemplo, la estructura ZS4D430S_PERSON_DEEP se utiliza como tipo de fila del tipo de tabla ZS4D430T_NESTED. Las direcciones de columna de la tabla interna resultante contienen una tabla interna en cada fila.
Nota
En cada fila de la tabla externa, la tabla interna puede tener un número diferente de filas.
Definir y utilizar tipos de tabla de Dictionary
Necesita algunos tipos de tabla a los que puede acceder en varias clases globales. Decide definir tipos de tabla en el Dictionary ABAP.
Consejo
Antes de definir tipos de tabla en el Dictionary ABAP, debe investigar la opción de definir tipos de tabla públicos en una de las clases globales o en una interfaz global.
Tarea 1: Definir un tipo de tabla
Cree una copia de la clase global /LRN/CL_S4D430_TYT_TABLE_TYPE (nombre sugerido: ZCL_##_TABLE_TYPE, donde ## es su número de grupo). Sustituya el tipo de tabla pública tt_address por un tipo de tabla de diccionario (nombre sugerido: Z##T_ADDRESSES).
Pasos
Copie la clase /LRN/CL_S4D430_TYT_TABLE_TYPE en una clase de su propio paquete (nombre sugerido: ZCL_##_TABLE_TYPE, donde ## representa su número de grupo).
En la vista Explorador de proyectos, haga clic con el botón derecho en la clase /LRN/CL_S4D430_TYT_TABLE_TYPE para abrir el menú contextual.
En el menú contextual, seleccione Duplicar ....
Introduzca el nombre del paquete en el campo Paquete. En el campo Nombre, introduzca el nombre ZCL_##_TABLE_TYPE, donde ## representa su número de grupo.
Ajuste la descripción y seleccione Siguiente.
Confirme la orden de transporte y seleccione Finalizar.
En la PUBLIC SECTION de la definición de clase, analice la definición del tipo tt_address.
Realice este paso como antes.
Cree un nuevo objeto de diccionario del tipo Tipo de tabla (nombre sugerido: Z##T_ADDRESSES).
En la vista Explorador de proyectos, despliegue el paquete y abra el menú contextual en el subnodo Diccionario.
Seleccione Nuevo→tipo de tabla.
Confirme el paquete, introduzca el nombre Z##T_ADDRESSES y la descripción Direcciones y, a continuación, seleccione Siguiente.
Asigne el nuevo objeto a una orden de transporte y seleccione Finalizar.
Especifique el tipo de estructura Z##S_ADDRESS como tipo de fila.
Nota
Si no ha finalizado el ejercicio anterior, puede utilizar el tipo de estructura /LRN/S_ADDRESS en su lugar.
En la sección Tipo de fila, cambie la Categoría de Tipo predefinido a Diccionario.
En el campo Nombre de tipo, introduzca /LRN/S_ADDRESS o Z##S_ADDRESS.
Especifique el mismo tipo de tabla y definición de clave que en el tipo de tabla tt_address.
En la sección Inicialización y acceso, modifique el tipo de tabla de Tabla estándar a Tabla clasificada.
En la sección Resumen de claves, seleccione <Clave principal>.
En la sección Detalles de clave primaria, modifique la definición de clave de Clave estándar a Componentes clave.
En la sección Componentes clave, utilice la compleción de código para introducir PAÍS y CIUDAD como campos clave.
Active el tipo de tabla.
Pulse Ctrl + F3 para activar el objeto de desarrollo.
Vuelva al código fuente de su clase global. En la implementación del método IF_OO_ADT_CLASSRUN~MAIN, sustituya tt_address por su nuevo tipo de estructura de Dictionary. Asegúrese de que no haya errores de sintaxis.
Ajuste el código de la siguiente manera:
12345678910111213141516171819
* Task 1
**********************************************************************
* DATA addresses TYPE tt_addresses.
DATA addresses TYPE z##t_addresses.
addresses =
VALUE #(
( street = 'Dietmar-Hopp-Allee 16'
postal_code = '69190'
city = 'Walldorf'
country = 'DE'
)
( street = '3999 West Chester Pike'
postal_code = '19073'
city = 'Newtown Square, PA'
country = 'US'
)
).
Tarea 2: Definir una estructura profunda
En su clase global, elimine o comente el tipo de estructura pública st_person_deep y sustitúyalo por una estructura de diccionario (nombre sugerido: Z##S_PERSON_DEEP). Para las direcciones, reutilice el tipo de tabla que ya ha creado.
Pasos
Cree un nuevo objeto de diccionario del tipo Estructura.
En la vista Explorador de proyectos, despliegue el paquete y abra el menú contextual en el subnodo Diccionario.
Seleccione →Estructura nueva.
Confirme el paquete, introduzca el nombre Z##S_PERSON_DEEP y la descripción Persona (nombre y varias direcciones) y, a continuación, seleccione Siguiente.
Asigne el nuevo objeto a una orden de transporte y seleccione Finalizar.
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 first_name (nombre sugerido:first_name), el apellido (nombre sugerido: last_name).
Ajuste el código de la siguiente manera:
1234567
define structure z##s_person_deep {
first_name : /dmo/first_name;
last_name : /dmo/last_name;
}
Añada otro componente para las direcciones de la persona (nombre sugerido: direcciones). Como tipo, utilice el tipo de tabla que ha creado en la tarea anterior.
Ajuste el código de la siguiente manera:
12345678
define structure z##s_person_deep {
first_name : /dmo/first_name;
last_name : /dmo/last_name;
addresses : z##t_addresses;
}
Active el tipo de estructura.
Pulse Ctrl + F3 para activar el objeto de desarrollo.
Vuelva al código fuente de su clase global. En PUBLIC SECTION de la definición de clase, elimine o comente la definición del tipo st_person_deep.
Realice este paso como antes.
En la implementación del método IF_OO_ADT_CLASSRUN~MAIN, sustituya st_person_deep por su nuevo tipo de estructura de diccionario. Asegúrese de que no haya errores de sintaxis.
Ajuste el código de la siguiente manera:
12345678910
* Task 2
**********************************************************************
* DATA person TYPE st_person_deep.
DATA person TYPE /lrn/s_person_deep.
person-first_name = 'Dictionary'.
person-last_name = 'ABAP'.
person-addresses = addresses.
Tarea 3: Definir un tipo de tabla anidada
En su clase global, elimine o comente el tipo de tabla pública tt_people y sustitúyalo por un tipo de tabla de diccionario (nombre sugerido: Z##T_PERSONS). Como su tipo de fila, utilice el tipo de estructura profunda que ha creado en la tarea anterior.
Pasos
Cree un nuevo objeto de diccionario del tipo Tipo de tabla.
En la vista Explorador de proyectos, despliegue el paquete y abra el menú contextual en el subnodo Diccionario.
Seleccione Nuevo→tipo de tabla.
Confirme el paquete, introduzca el nombre Z##T_PERSONS y la descripción Personas (con nombre y direcciones) y, a continuación, seleccione Siguiente.
Asigne el nuevo objeto a una orden de transporte y seleccione Finalizar.
Especifique el tipo de estructura Z##S_PERSON_DEEP como el tipo de fila.
En la sección Tipo de fila, cambie la Categoría de Tipo predefinido a Diccionario.
En el campo Nombre de tipo, introduzca Z##S_PERSON_DEEP.
Especifique el mismo tipo de tabla y definición de clave que en el tipo de tabla tt_person.
En la sección Inicialización y acceso, modifique el tipo de tabla de Tabla estándar a Tabla de claves de control.
En la sección Resumen de claves, seleccione <Clave principal>.
En la sección Detalles de clave primaria, modifique la Definición de clave de Clave estándar a Componentes clave y la Categoría de clave de No unívoca a Única.
En la sección Componentes clave, especifique los campos clave LAST_NAME y FIRST_NAME.
Active el tipo de tabla.
Pulse Ctrl + F3 para activar el objeto de desarrollo.
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 tt_people.
Realice este paso como antes.
En la implementación del método IF_OO_ADT_CLASSRUN~MAIN, sustituya tt_person por su nuevo tipo de tabla de diccionario. Asegúrese de que no haya errores de sintaxis.
Ajuste el código de la siguiente manera:
123456789101112131415161718192021222324252627282930313233
* Task 3
**********************************************************************
* DATA persons TYPE tt_persons.
DATA persons TYPE /lrn/t_persons.
persons =
VALUE #(
( person )
(
first_name = 'CDS'
last_name = 'ABAP'
addresses =
VALUE #(
( street = 'SAP-Allee 29'
postal_code = '68789'
city = 'St.Leon-Rot'
country = 'DE'
)
( street = '35 rue d''Alsace'
postal_code = '92300'
city = 'Levallois-Perret'
country = 'FR'
)
( street = 'Bedfont Road'
postal_code = 'TW14 8HD'
city = 'Feltham'
country = 'GB'
)
)
)
).
Active y depure la clase como una aplicación de consola. Analice el contenido de las direcciones, la persona y las personas de los objetos de datos.
Pulse Ctrl + F3 para activar el objeto de desarrollo.
Pulse F9 para ejecutar la clase como aplicación de consola.