SAP Tabla interna ABAP: crear, leer, completar, copiar y eliminar

⚡ Resumen inteligente

SAP Los objetos de tabla interna de ABAP almacenan datos de una estructura fija para su uso dinámico dentro de un programa. Esta página explica las áreas de trabajo, las líneas de cabecera, los cuatro métodos de creación y las instrucciones para rellenar, copiar, leer y eliminar filas de la tabla.

  • 📋 Definición básica: Una tabla interna almacena filas con una estructura idéntica en la memoria principal, generalmente para dar formato a los datos leídos de una tabla de base de datos.
  • 🧾 Área de trabajo: Un área de trabajo es una sola fila con el mismo formato que la tabla, y procesa la tabla línea por línea.
  • 🏷️ Línea de encabezado: Una tabla con una línea de cabecera recibe un área de trabajo implícita, por lo que las filas se pueden insertar o leer directamente sin necesidad de especificar una.
  • 🛠️ Cuatro métodos de creación: Declaración TYPES, referencia a una tabla existente, referencia a una estructura existente o una nueva estructura declarada con OCCURS.
  • Poblar: APPEND agrega una fila, COLLECT agrupa campos numéricos para una clave duplicada e INSERT coloca una fila en un índice elegido.
  • 🔍 Lee y copia: LOOP AT lee todas las filas, READ TABLE lee una fila por índice y MOVE o el signo igual copia una tabla completa.
  • 🗑️ Borrar: La instrucción DELETE dentro de un LOOP elimina la fila actual, y DELETE … INDEX elimina la fila en una posición conocida.

SAP Tablas internas ABAP

¿Qué es una tabla interna?

MESA INTERNA se utilizan para obtener datos de una estructura fija para uso dinámico en ABAP. Cada línea de la tabla interna tiene la misma estructura de campos. El uso principal de las tablas internas es almacenar y formatear datos de una tabla de base de datos dentro de un programa.

Una mesa interior siempre funciona en conjunto con un área de trabajo, por lo que ese concepto se abordará a continuación.

¿Qué es un área de trabajo?

Las áreas de trabajo son filas de datos individuales. Deben tener el mismo formato que cualquiera de las tablas internas. Se utilizan para procesar los datos de una tabla interna línea por línea.

¿Cuál es la diferencia entre una mesa interna y un área de trabajo?

Una imagen dice mil palabras

Diferencia entre mesa interna y área de trabajo

El diagrama muestra la tabla con muchas filas, mientras que el área de trabajo solo contiene la fila que se está procesando. El tipo de área de trabajo, ya sea creada por el sistema o por el desarrollador, depende del tipo de tabla que se describe a continuación.

Tipos de tablas internas

Hay dos tipos de tablas internas.

  1. Mesas internas con línea HEADER
  2. Mesas internas sin línea HEADER.

Tablas internas con línea de encabezado

  • Aquí el sistema crea automáticamente el área de trabajo.
  • El área de trabajo tiene el mismo tipo de datos que la tabla interna.
  • Esta área de trabajo se llama línea HEADER.
  • Es aquí donde se realizan todos los cambios o cualquiera de las acciones sobre el contenido de la tabla. Como resultado de esto, los registros se pueden insertar directamente en la tabla o se puede acceder a ellos directamente desde la tabla interna.

Tablas internas sin línea de encabezado :

  • Aquí no hay ningún área de trabajo asociada a la mesa.
  • El área de trabajo debe especificarse explícitamente cuando necesitemos acceder a dichas tablas.
  • Por lo tanto, no se puede acceder a estas tablas directamente.

💡 Consejo: Una tabla con una línea de encabezado conserva el mismo nombre tanto para la tabla como para su área de trabajo, lo que genera ambigüedad en el código. Los programas nuevos deben declarar una tabla sin línea de encabezado y especificar explícitamente el área de trabajo.

Tablas internas estándar, ordenadas y con hash

Además de la distinción en la línea de encabezado, cada tabla interna también tiene un tipo de tabla que determina cómo se encuentra una fila. El tipo se elige con la adición de TYPE STANDARD TABLE, TYPE SORTED TABLE o TYPE HASHED TABLE, y tiene un efecto directo en el tiempo de ejecución.

Tipo de mesa Método de acceso Clave Mejores usados ​​para
Estándar Índice y clave, con búsqueda lineal en la clave. No único Procesamiento secuencial y lectura de tablas pequeñas con un índice.
Ordenado Índice y clave, con una búsqueda binaria en la clave. Únicos o no únicos, se mantienen ordenados automáticamente. Las tablas más grandes leen repetidamente los campos clave principales.
Hash Solo clave, con un algoritmo hash Unico Tablas muy grandes que siempre se leen mediante la clave completa, como un búfer de registros de base de datos.

Una tabla estándar es la predeterminada y se adapta al procesamiento secuencial. Una tabla hash mantiene el tiempo de acceso constante sin importar cuántas filas se almacenen, razón por la cual las reglas de rendimiento de Open SQL Lo recomiendo para almacenar registros en búfer.

Crear tablas internas

Hay muchas formas de crear una tabla interna. Veámoslos uno por uno.

1.Utilizando la declaración de tipo

Ahora vamos a crear una tabla interna itab utilizando la instrucción TYPE.

La sintaxis es -

Types : begin of line,

column1 type I,

column2 type I,

end of line.

Ejemplo:

TYPES : begin of line,

empno		type I,

empname(20)   	type c	,

end of line.

La instrucción TYPES crea una línea de estructura tal como se define.

Para crear realmente una tabla interna itab utilice el siguiente comando:

Data itab type line occurs 10.

Se crea una tabla interna itab con la estructura de línea. Además de declarar la estructura de una tabla interna, la cláusula OCCURS también define cuántas entradas de la tabla se mantienen en el almacenamiento principal (en este caso, 10). Los registros adicionales se escriben en el área de paginación y pueden afectar el rendimiento.

2.Refiriéndose a otra Tabla

Puedes crear una tabla interna haciendo referencia a una tabla existente. La tabla existente podría ser una tabla estándar. SAP mesa, una mesa Z u otra mesa interna.

Sintaxis-

Data <f> <type> [with header line].

Ejemplo-

DATA itab TYPE line OCCURS 10 with header line.

Aquí se crea una tabla interna itab del tipo línea con una línea de encabezado. Tenga en cuenta que "con línea de encabezado" es opcional.

3.Refiriéndose a la estructura existente

Sintaxis-

Data	<f> LIKE <struct> occurs n [with header line].

Ejemplo-

DATA itab LIKE sline OCCURS 10.

Aquí se crea una tabla itab con la misma estructura que la de sline.

4.Creando una nueva Estructura

Creemos ahora una tabla interna con una estructura propia. Aquí la tabla se crea con una línea de encabezado, por defecto.

Sintaxis -

Data : Begin of <f> occurs <n>,

<component declaration>,

................................,

End of <f>.

Ejemplo

Data : Begin of itab occurs 10,

column1       type I,

column2(4)  type C,

column3      like  mara-ernam,

End of itab.

Se crea la tabla interna itab

Una tabla vacía es de poca utilidad, por lo que la siguiente sección la llena con filas.

Llenar tablas internas

Ahora que hemos creado con éxito algunas tablas internas, veamos cómo las llenamos con algunos registros. Hay varios métodos disponibles para completar tablas.

1.Agregar datos línea por línea

El primer método disponible es el uso de la declaración APPEND.

Usando la declaración APPEND podemos agregar una línea de otra área de trabajo a la tabla interna o podemos agregar una línea inicial a la tabla interna.

Sintaxis -

APPEND [<wa> TO / INITIAL LINE TO] <itable>.

Aquí el área de trabajo o la línea inicial se agrega a la tabla interna .

La variable del sistema SY-TABIX contiene el índice de la línea adjunta.

Ejemplo:

Data: Begin of itab occurs 10,

col1 type C,

col2 type I,

end of itab.

Append initial line to itab.

Resultados: ' ' '0'

La instrucción `initial lines` agrega una línea inicializada con el valor correcto para su tipo a la tabla. Aquí, `col1` es un carácter y `col2` es un número entero. Luego, `APPEND initial line` agrega una línea inicializada con respecto al tipo de datos de las columnas, es decir, espacio en blanco para `col1` y cero para `col2`.

2.Usar la declaración COLLECT

COLLECT es otra forma de declaración utilizada para completar las tablas internas. Generalmente, COLLECT se usa al insertar líneas en una tabla interna con una clave estándar única.

Sintaxis-

COLLECT [<wa> INTO] <itable>.

En el caso de tablas con línea de encabezado, se omite la opción INTO. Supongamos que ya hay una entrada que tiene la misma clave que la que está intentando agregar, entonces no se agrega una nueva línea a la tabla, pero se agregan los campos numéricos de ambas entradas y solo está presente una entrada correspondiente a la clave. . El valor de SY-TABIX se cambia a la fila de la entrada original. De lo contrario, COLLECT actúa de manera similar a APPEND y SY-TABIX contiene el índice de la línea procesada.

3. Usando la instrucción INSERT

La instrucción INSERT agrega una línea/área de trabajo a la tabla interna. Puede especificar la posición en la que se agregará la nueva línea utilizando la cláusula INDEX con la instrucción INSERT.

Sintaxis

INSERT [<wa> INTO / INITIAL LINE INTO] <itable> [index <idx>].

Aquí, el área de trabajo o INICIAL LINE se inserta en la tabla interna en el índice .

Copiar tablas internas

El contenido de una tabla interna se puede copiar a otra mediante la función APPEND. LINES o INSERTAR LINEDeclaración S. Una forma más sencilla es utilizar cualquiera de las siguientes sintaxis.

MOVE  <itab1> To <itab2>.

OR

<itab1> = <itab2>.

Estos copian el contenido de ITAB1 a ITAB2. En el caso de tablas internas con línea de encabezado, tenemos que usar [] para distinguirlas del área de trabajo. Entonces, para copiar el contenido de las tablas internas con la línea de encabezado, la sintaxis es:

itab1[] = itab2[].

Leer tablas internas

Ahora ya sabemos cómo crear tablas internas y cómo rellenarlas con datos. A continuación, veremos cómo utilizar o recuperar esos datos de las tablas internas.

1. Usando Bucle -Endloop

Una de las formas de acceder o leer la tabla interna es mediante LOOP-ENDLOOP.

Sintaxis

LOOP AT <itable> [INTO <wa>]

...................................

ENDLOOP.

Aquí, cuando dice LOOP AT ITABLE, la tabla interna ITABLE se lee línea por línea. Puede acceder a los valores de las columnas para esa línea durante cualquier parte de la estructura LOOP-ENDLOOP. El valor de SY-SUBRC se establece en 0, incluso si solo se lee un registro.

2. Usando LEER

El otro método para leer la tabla interna es mediante la instrucción READ.

Sintaxis-

READ TABLE <itable> [INTO <wa>] INDEX <idx>.

Esta instrucción lee la línea actual o la línea especificada por índice. El valor de SY-TABIX corresponde al índice de la línea leída. Si se encuentra una entrada con el índice especificado, SY-SUBRC se establece en 0. Si el índice especificado es menor que 0, se produce un error en tiempo de ejecución. Si el índice especificado excede el tamaño de la tabla, SY-SUBRC se establece en 4.

⚠️ Advertencia: La instrucción READ TABLE … INDEX 0 genera un error en tiempo de ejecución, por lo que se debe verificar un índice calculado en tiempo de ejecución antes de que se ejecute la instrucción.

Eliminar tablas internas

Hay muchas formas de eliminar líneas de una tabla interna.

1.Eliminar líneas en un bucle.

Esta es la forma más sencilla de eliminar líneas.

Sintaxis

DELETE <ITABLE>.

Esta declaración sólo funciona dentro de un bucle. Elimina la línea actual. Puede eliminar las líneas en un bucle condicionalmente agregando el Dónde cláusula.

2.Eliminar líneas usando el índice.

Esto se utiliza para eliminar una línea de la tabla interna en cualquier índice conocido.

Sintaxis

DELETE <ITABLE> INDEX <IDX>.

La línea con el índice se elimina. El índice de la siguiente línea se decrementa en 1.

3. Eliminar líneas duplicadas.

Las filas duplicadas se eliminan después de que la tabla se haya ordenado por los campos clave.

SORT itab BY col1.

DELETE ADJACENT DUPLICATES FROM itab COMPARING col1.

Solo se comparan las filas adyacentes, por lo que la instrucción SORT debe ejecutarse primero. Para vaciar la tabla por completo, utilice CLEAR itab[] o REFRESH itab.

Preguntas Frecuentes

CLEAR itab vacía solo la línea de encabezado, y CLEAR itab[] vacía el cuerpo. REFRESH siempre vacía el cuerpo, pero mantiene la memoria reservada. FREE vacía el cuerpo y también libera la memoria.

SY-TABIX almacena el número de fila de la tabla interna que se está procesando. SY-INDEX almacena el número de iteración de un bucle DO o WHILE. Una tabla hash deja SY-TABIX en cero, ya que no tiene índice.

La operación LOOP AT itab ASIGNAR un símbolo de campo evita copiar cada fila en un área de trabajo, por lo que se ejecuta más rápido en tablas grandes y permite modificar la fila directamente sin una instrucción MODIFY.

Sí. Los asistentes de IA en las herramientas de desarrollo ABAP reescriben las declaraciones OCCURS y de la línea de encabezado en TYPE STANDARD TABLE OF con un área de trabajo explícita, y señalan las instrucciones que fallan una vez que desaparece la línea de encabezado.

Los asesores de rendimiento de IA inspeccionan cómo se llena y se lee una tabla, y luego recomiendan una tabla ordenada o hash cuando una búsqueda lineal domina el tiempo de ejecución. La recomendación se confirma con un trace en la transacción SAT.

Resumir este post con: