SAP ABAP - Lendo Tabelas Internas

Podemos ler as linhas de uma tabela usando a seguinte sintaxe da instrução READ TABLE -

READ TABLE <internal_table> FROM <work_area_itab>.

Nesta sintaxe, a expressão <work_area_itab> representa uma área de trabalho que é compatível com o tipo de linha da tabela <internal_table>. Podemos especificar uma chave de pesquisa, mas não uma chave de tabela, dentro da instrução READ usando a cláusula WITH KEY, conforme mostrado na seguinte sintaxe -

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

Aqui, toda a linha da tabela interna é usada como um search key. O conteúdo de toda a linha da tabela é comparado com o conteúdo do campo <internal_tab_field>. Se os valores do campo <internal_tab_field> não forem compatíveis com o tipo de linha da tabela, esses valores serão convertidos de acordo com o tipo de linha da tabela. A chave de pesquisa permite localizar entradas em tabelas internas que não possuem um tipo de linha estruturada, ou seja, onde a linha é um único campo ou um tipo de tabela interna.

A seguinte sintaxe da instrução READ é usada para especificar uma área de trabalho ou símbolo de campo usando a cláusula COMPARING -

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

Quando a cláusula COMPARING é usada, os campos especificados da tabela <F1>, <F2> .... <Fn> do tipo de linha estruturada são comparados com os campos correspondentes da área de trabalho antes de serem transportados. Se a cláusula ALL FIELDS for especificada, o sistema SAP compara todos os componentes. Quando o sistema SAP encontra uma entrada com base em uma chave, o valor da variável SY-SUBRC é definido como 0. Além disso, o valor da variável SY-SUBRC é definido como 2 ou 4 se o conteúdo do campos não é o mesmo ou se o sistema SAP não consegue encontrar uma entrada. No entanto, o sistema SAP copia a entrada na área de trabalho de destino sempre que encontra uma entrada, independentemente do resultado da comparação.

Exemplo

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.

O código acima produz a seguinte saída -

SY-SUBRC =    2 

4         9

No exemplo acima, mytable é uma tabela interna do tipo hash table, com Record1 como a área de trabalho e ColP como a chave exclusiva. Inicialmente, mytable é preenchida com seis linhas, onde o campo ColP contém os valores da variável SY-INDEX e o campo ColQ contém os valores (SY-INDEX + 5).

A área de trabalho do Registro1 é preenchida com 4 e 12 como valores para os campos ColP e ColQ, respectivamente. A instrução READ lê a linha da tabela após comparar o valor do campo-chave ColP com o valor na área de trabalho Record1 usando a cláusula COMPARING e, a seguir, copia o conteúdo da linha lida na área de trabalho. O valor da variável SY-SUBRC é exibido como 2 porque quando o valor no campo ColP é 4, o valor no ColQ não é 12, mas 9.