SAP ABAP: lectura de tablas internas

Podemos leer las líneas de una tabla usando la siguiente sintaxis de la instrucción READ TABLE:

READ TABLE <internal_table> FROM <work_area_itab>.

En esta sintaxis, la expresión <work_area_itab> representa un área de trabajo que es compatible con el tipo de línea de la tabla <internal_table>. Podemos especificar una clave de búsqueda, pero no una clave de tabla, dentro de la instrucción READ usando la cláusula WITH KEY, como se muestra en la siguiente sintaxis:

READ TABLE <internal_table> WITH KEY = <internal_tab_field>.

Aquí toda la línea de la tabla interna se utiliza como search key. El contenido de toda la línea de la tabla se compara con el contenido del campo <internal_tab_field>. Si los valores del campo <internal_tab_field> no son compatibles con el tipo de línea de la tabla, estos valores se convierten de acuerdo con el tipo de línea de la tabla. La clave de búsqueda permite buscar entradas en tablas internas que no tienen un tipo de línea estructurada, es decir, donde la línea es un solo campo o un tipo de tabla interna.

La siguiente sintaxis de la instrucción READ se usa para especificar un área de trabajo o símbolo de campo usando la cláusula COMPARING:

READ TABLE <internal_table> <key> INTO <work_area_itab>
   [COMPARING <F1> <F2>...<Fn>].

Cuando se utiliza la cláusula COMPARING, los campos de tabla especificados <F1>, <F2> .... <Fn> del tipo de línea estructurada se comparan con los campos correspondientes del área de trabajo antes de ser transportados. Si se especifica la cláusula ALL FIELDS, el sistema SAP compara todos los componentes. Cuando el sistema SAP encuentra una entrada sobre la base de una clave, el valor de la variable SY-SUBRC se establece en 0. Además, el valor de la variable SY-SUBRC se establece en 2 o 4 si el contenido de la variable comparada campos no es el mismo o si el sistema SAP no puede encontrar una entrada. Sin embargo, el sistema SAP copia la entrada en el área de trabajo de destino siempre que encuentra una entrada, independientemente del resultado de la comparación.

Ejemplo

REPORT  ZREAD_DEMO. 
*/Creating an internal table 
DATA: BEGIN OF Record1, 
ColP TYPE I, 
ColQ TYPE I, 
END OF Record1. 

DATA mytable LIKE HASHED TABLE OF Record1 WITH UNIQUE KEY ColP. 
DO 6 Times.
Record1-ColP = SY-INDEX. 
Record1-ColQ = SY-INDEX + 5. 
INSERT Record1 INTO TABLE mytable. 
ENDDO. 

Record1-ColP = 4. 
Record1-ColQ = 12. 
READ TABLE mytable FROM Record1 INTO Record1 COMPARING ColQ. 

WRITE: 'SY-SUBRC =', SY-SUBRC. 
SKIP. 
WRITE: / Record1-ColP, Record1-ColQ.

El código anterior produce la siguiente salida:

SY-SUBRC =    2 

4         9

En el ejemplo anterior, mytable es una tabla interna del tipo de tabla hash, con Record1 como área de trabajo y ColP como clave única. Inicialmente, mytable se llena con seis líneas, donde el campo ColP contiene los valores de la variable SY-INDEX y el campo ColQ contiene valores (SY-INDEX + 5).

El área de trabajo Record1 se llena con 4 y 12 como valores para los campos ColP y ColQ respectivamente. La instrucción READ lee la línea de la tabla después de comparar el valor del campo de clave ColP con el valor en el área de trabajo Record1 usando la cláusula COMPARING, y luego copia el contenido de la línea de lectura en el área de trabajo. El valor de la variable SY-SUBRC se muestra como 2 porque cuando el valor en el campo ColP es 4, el valor en ColQ no es 12, sino 9.