SAP ABAP - Lettura di tabelle interne

Possiamo leggere le righe di una tabella utilizzando la seguente sintassi dell'istruzione READ TABLE:

READ TABLE <internal_table> FROM <work_area_itab>.

In questa sintassi, l'espressione <work_area_itab> rappresenta un'area di lavoro compatibile con il tipo di riga della tabella <internal_table>. Possiamo specificare una chiave di ricerca, ma non una chiave di tabella, all'interno dell'istruzione READ utilizzando la clausola WITH KEY, come mostrato nella sintassi seguente:

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

Qui l'intera riga della tabella interna viene utilizzata come file search key. Il contenuto dell'intera riga della tabella viene confrontato con il contenuto del campo <internal_tab_field>. Se i valori del campo <internal_tab_field> non sono compatibili con il tipo di riga della tabella, questi valori vengono convertiti in base al tipo di riga della tabella. La chiave di ricerca consente di trovare voci nelle tabelle interne che non hanno un tipo di linea strutturata, cioè dove la linea è un singolo campo o un tipo di tabella interna.

La seguente sintassi dell'istruzione READ viene utilizzata per specificare un'area di lavoro o un simbolo di campo utilizzando la clausola COMPARING:

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

Quando viene utilizzata la clausola COMPARING, i campi della tabella specificati <F1>, <F2> .... <Fn> del tipo di linea strutturata vengono confrontati con i campi corrispondenti dell'area di lavoro prima di essere trasportati. Se viene specificata la clausola ALL FIELDS, il sistema SAP confronta tutti i componenti. Quando il sistema SAP trova una voce sulla base di una chiave, il valore della variabile SY-SUBRC è impostato a 0. Inoltre, il valore della variabile SY-SUBRC è impostato a 2 o 4 se il contenuto della variabile confrontata i campi non sono uguali o se il sistema SAP non riesce a trovare una voce. Tuttavia, il sistema SAP copia la voce nell'area di lavoro di destinazione ogni volta che trova una voce, indipendentemente dal risultato del confronto.

Esempio

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.

Il codice precedente produce il seguente output:

SY-SUBRC =    2 

4         9

Nell'esempio sopra, mytable è una tabella interna del tipo di tabella con hash, con Record1 come area di lavoro e ColP come chiave univoca. Inizialmente, mytable è popolato con sei righe, dove il campo ColP contiene i valori della variabile SY-INDEX e il campo ColQ contiene i valori (SY-INDEX + 5).

L'area di lavoro Record1 viene popolata con 4 e 12 come valori rispettivamente per i campi ColP e ColQ. L'istruzione READ legge la riga della tabella dopo aver confrontato il valore del campo chiave ColP con il valore nell'area di lavoro Record1 utilizzando la clausola COMPARING e quindi copia il contenuto della riga di lettura nell'area di lavoro. Il valore della variabile SY-SUBRC viene visualizzato come 2 perché quando il valore nel campo ColP è 4, il valore in ColQ non è 12, ma 9.