Objective
After completing this lesson, you will be able to declare una tabla interna compleja.
Propiedades de tablas internas complejas
Las tablas internas que hemos utilizado hasta ahora tenían un tipo de datos escalar como su tipo de fila. En el ejemplo que se muestra en las figuras, el tipo de fila de los números de tabla internos es el tipo integrado ABAP I.
Nos referimos a estos tipos de tablas internas como tablas internas simples.
Hablamos de una tabla interna compleja si el tipo de fila es un tipo de datos estructurado.
Mientras que una tabla interna simple solo tiene una columna sin nombre, una tabla interna compleja consta de varias columnas, cada una de ellas con el nombre y el tipo del componente correspondiente del tipo de fila estructurada. En el ejemplo, el tipo de fila de la tabla interna connections es un tipo estructurado con cinco componentes: carrier_id, connection_id, airport_from_id, airport_to_id y carrier_name. En consecuencia, la tabla interna connections tiene cinco columnas con esos nombres.
Nota
Las columnas de los ejemplos de las figuras Recordatorio: tablas internas simples y tablas internas con tipo de fila estructurada tienen tipos escalares. De forma más general, una columna de una tabla interna también podría ser de tipo estructurado o incluso tener un tipo de tabla. En este último caso, hablamos de una tabla interna anidada.
Hasta ahora, hemos abordado las filas de una tabla interna por su posición. Esto se denomina acceso mediante índice.
Con las columnas nombradas de una tabla interna compleja, el acceso mediante clave se vuelve más importante. El acceso clave significa direccionar una fila de la tabla interna buscando determinados valores en determinadas columnas. Las columnas en las que busca pueden ser cualquier columna de la tabla interna.
El acceso mediante índice a una tabla interna siempre es muy rápido, incluso si la tabla interna contiene muchas filas. Sin embargo, el acceso mediante clave puede ser muy lento si la tabla contiene muchas filas. Seleccionar el tipo de acceso correcto para la tabla interna puede mejorar el rendimiento de un acceso clave.
Cada tabla interna cuenta con una de estas tres clases de acceso. El tipo de acceso determina cómo se almacenan los datos en la tabla y, en función de eso, cómo el sistema lee la tabla para recuperar los datos.
Los diferentes tipos de tablas son los siguientes:
- Tabla estándar
- En una tabla estándar, el contenido no se almacena en un determinado orden de clasificación. De manera predeterminada, los registros nuevos se agregan al final de la tabla. Para recuperar datos por clave, el sistema debe leerlos secuencialmente, lo que puede provocar tiempos de recuperación largos si la tabla es muy grande. Las tablas internas simples que hemos utilizado hasta ahora eran tablas estándar.
- Sorted Table
- En una tabla clasificada, el contenido de la tabla siempre se clasifica según los campos clave en orden ascendente. Cuando inserta un nuevo registro en la tabla, el sistema se asegura de que se coloca en la posición correcta. Puesto que los datos se clasifican siempre, el sistema puede recuperar registros de manera más eficiente que a partir de una tabla estándar (mientras se sigan unas reglas determinadas).
- Hashed Table
- Las tablas hashed se gestionan mediante un algoritmo de control. De esta forma, se garantiza que el sistema pueda recuperar registros con rapidez aunque la tabla sea muy grande. Sin embargo, este aumento del rendimiento solo funciona en casos muy concretos.
Cada tabla interna tiene una clave. En las tablas estándar, la clave no desempeña un papel particularmente significativo. En las tablas clasificadas y las tablas hashed. la clave es muy importante porque determina el modo en que los datos se gestionan dentro de la tabla. Crucialmente, las tablas clasificadas y de claves de control solo son más rápidas para el acceso clave que aborda todos o al menos un subconjunto de los campos clave.
Otro atributo de la clave de tabla es su unicidad. A veces, deseará permitir las entradas duplicadas en una tabla interna y, en ocasiones, deseará asegurarse de que la clave sea única. En este momento, se aplican las siguientes reglas:
- Los duplicados siempre están permitidos en las tablas estándar
- Los duplicados nunca se permiten en las tablas de claves de control
- Para una tabla clasificada, seleccione en la definición si la clave debe ser unívoca o no unívoca.
Nota
Las tablas internas también pueden tener claves secundarias. Las claves secundarias son una forma de mejorar el rendimiento de los accesos mediante clave a tablas internas que utilizan diferentes combinaciones de campos. Encontrará más información sobre las claves secundarias en la documentación de sintaxis ABAP.
Tipos de tablas complejas
Vea este vídeo para ver algunos ejemplos de la declaración de tablas internas complejas.
Además, es un buen estilo de programación definir primero el tipo de datos y luego crear una variable que haga referencia al tipo.
En lugar de especificar el tipo de acceso y la clave de una tabla interna en la sentencia DATA, debe utilizar un tipo de tabla con nombre. Si necesita el tipo de tabla solo localmente en un método o en conexión con una clase determinada, puede definirlo mediante la sentencia TYPES.
El ejemplo define primero un tipo estructurado st_connection. Con este tipo estructurado como tipo de fila, define el tipo de tabla tt_connection. Finalmente, la declaración de la tabla interna connections_5 hace referencia al tipo de tabla.
Si necesita el tipo de tabla globalmente, puede utilizar un tipo de tabla global.
Un tipo de tabla global es un objeto de repository que se puede utilizar como tipo de datos en cualquier lugar del sistema. ADT proporciona un editor dedicado para este tipo de objeto de repositorio. La herramienta consta de los siguientes marcos:
El siguiente vídeo muestra cómo definir tipos de tabla localmente.
Pruébelo: tipos de tablas complejas
- Como en el primer ejercicio de este curso, cree una nueva clase global que implemente la interfaz IF_OO_ADT_CLASSRUN.
- Copie el siguiente fragmento de código en la parte de implementación del método, if_oo_adt_classrun~main( ):
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
TYPES: BEGIN OF st_connection,
carrier_id TYPE /dmo/carrier_id,
connection_id TYPE /dmo/connection_id,
airport_from_id TYPE /dmo/airport_from_id,
airport_to_id TYPE /dmo/airport_to_id,
carrier_name TYPE /dmo/carrier_name,
END OF st_connection.
* Example 1 : Simple and Complex Internal Table
**********************************************************************
" simple table (scalar row type)
DATA numbers TYPE TABLE OF i.
" complex table (structured row type)
DATA connections TYPE TABLE OF st_connection.
out->write( `--------------------------------------------` ).
out->write( `Example 1: Simple and Complex Internal Table` ).
out->write( data = numbers
name = `Simple Table NUMBERS:`).
out->write( data = connections
name = `Complex Table CONNECTIONS:`).
* Example 2 : Complex Internal Tables
**********************************************************************
" standard table with non-unique standard key (short form)
DATA connections_1 TYPE TABLE OF st_connection.
" standard table with non-unique standard key (explicit form)
DATA connections_2 TYPE STANDARD TABLE OF st_connection
WITH NON-UNIQUE DEFAULT KEY.
" sorted table with non-unique explicit key
DATA connections_3 TYPE SORTED TABLE OF st_connection
WITH NON-UNIQUE KEY airport_from_id
airport_to_id.
" sorted hashed with unique explicit key
DATA connections_4 TYPE HASHED TABLE OF st_connection
WITH UNIQUE KEY carrier_id
connection_id.
* Example 3 : Local Table Type
**********************************************************************
TYPES tt_connections TYPE SORTED TABLE OF st_connection
WITH UNIQUE KEY carrier_id
connection_id.
DATA connections_5 TYPE tt_connections.
* Example 4 : Global Table Type
**********************************************************************
DATA flights TYPE /dmo/t_flight.
out->write( `------------------------------------------` ).
out->write( `Example 4: Global Table TYpe /DMO/T_FLIGHT` ).
out->write( data = flights
name = `Internal Table FLIGHTS:` ).
- Pulse CTRL + F3 en el teclado para activar la clase y F9 para ejecutar la aplicación de consola.
- Analice la salida de la consola. Depurar el programa, jugar con el código fuente para familiarizarse con los conceptos.