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.