SAP ABAP - Popolamento di tabelle interne
Nelle tabelle interne, il popolamento include funzionalità quali selezione, inserimento e aggiunta. Questo capitolo si concentra sulle istruzioni INSERT e APPEND.
Istruzione INSERT
L'istruzione INSERT viene utilizzata per inserire una singola riga o un gruppo di righe in una tabella interna.
Di seguito è riportata la sintassi per aggiungere una singola riga a una tabella interna:
INSERT <work_area_itab> INTO <internal_tab> INDEX <index_num>.
In questa sintassi, l'istruzione INSERT inserisce una nuova riga nella tabella interna internal_tab. È possibile inserire una nuova riga utilizzando l'espressione work_area_itab INTO prima del parametro internal_tab. Quando viene utilizzata l'espressione work_area_itab INTO, la nuova riga viene presa dall'area di lavoro work_area_itab e inserita nella tabella internal_tab. Tuttavia, quando l'espressione work_area_itab INTO non viene utilizzata per inserire una riga, la riga viene presa dalla riga di intestazione della tabella internal_tab.
Quando una nuova riga viene inserita in una tabella interna utilizzando la clausola INDEX, il numero di indice delle righe dopo la riga inserita viene incrementato di 1. Se una tabella interna contiene <index_num> - 1 righe, la nuova riga viene aggiunta al fine del tavolo. Quando il sistema SAP aggiunge correttamente una riga a una tabella interna, la variabile SY-SUBRC è impostata su 0.
Esempio
Di seguito è riportato un programma di esempio che utilizza l'istruzione insert.
REPORT ZCUSLIST1.
DATA: BEGIN OF itable1 OCCURS 4,
F1 LIKE SY-INDEX,
END OF itable1.
DO 4 TIMES.
itable1-F1 = sy-index.
APPEND itable1.
ENDDO.
itable1-F1 = -96.
INSERT itable1 INDEX 2.
LOOP AT itable1.
Write / itable1-F1.
ENDLOOP.
LOOP AT itable1 Where F1 ≥ 3.
itable1-F1 = -78.
INSERT itable1.
ENDLOOP.
Skip.
LOOP AT itable1.
Write / itable1-F1.
ENDLOOP.
Il codice precedente produce il seguente output:
1
96-
2
3
4
1
96-
2
78-
3
78-
4
Nell'esempio sopra, il ciclo DO aggiunge 4 righe contenenti i numeri da 1 a 4. Al componente della riga di intestazione itable1-F1 è stato assegnato un valore di -96. L'istruzione Insert inserisce la riga di intestazione come nuova riga nel corpo prima della riga 3. La riga 3 esistente diventa la riga 4 dopo l'inserimento. L'istruzione LOOP AT recupera quelle righe dalla tabella interna che hanno un valore F1 maggiore o uguale a 3. Prima di ogni riga, l'istruzione Insert inserisce una nuova riga dalla riga di intestazione di essa. Prima dell'inserimento, il componente F1 è stato modificato per contenere -78.
Dopo l'esecuzione di ogni istruzione insert, il sistema reindicizza tutte le righe sotto quella inserita. Ciò introduce un sovraccarico quando si inseriscono righe vicino alla parte superiore di una tabella interna di grandi dimensioni. Se devi inserire un blocco di righe in una grande tabella interna, prepara un'altra tabella con le righe da inserire e utilizza invece le righe di inserimento.
Quando si inserisce una nuova riga all'interno di itable1 all'interno di un ciclo in itable1, non influisce immediatamente sulla tabella interna. Diventa effettivamente effettivo al passaggio successivo del loop. Durante l'inserimento di una riga dopo la riga corrente, la tabella viene reindicizzata in ENDLOOP. Il sy-tabix viene incrementato e il ciclo successivo elabora la riga puntata da sy-tabix. Ad esempio, se ci si trova nel secondo passaggio di loop e si inserisce un record prima della riga 3. Quando viene eseguito l'endloop, la nuova riga diventa la riga 3 e la vecchia riga 3 diventa la riga 4 e così via. Sy-tabix viene incrementato di 1 e il passaggio del ciclo successivo elabora il record appena inserito.
Dichiarazione APPEND
L'istruzione APPEND viene utilizzata per aggiungere una singola riga o riga a una tabella interna esistente. Questa istruzione copia una singola riga da un'area di lavoro e la inserisce dopo l'ultima riga esistente in una tabella interna. L'area di lavoro può essere una riga di intestazione o qualsiasi altra stringa di campo con la stessa struttura di una riga di una tabella interna. Di seguito è riportata la sintassi dell'istruzione APPEND utilizzata per aggiungere una singola riga in una tabella interna:
APPEND <record_for_itab> TO <internal_tab>.
In questa sintassi, l'espressione <record_for_itab> può essere rappresentata dall'area di lavoro <work_area_itab>, che è convertibile in un tipo di linea o dalla clausola INITIAL LINE. Se l'utente utilizza un'area di lavoro <work_area_itab>, il sistema SAP aggiunge una nuova riga alla tabella interna <internal_tab> e la popola con il contenuto dell'area di lavoro. La clausola INITIAL LINE aggiunge una riga vuota che contiene il valore iniziale per ogni campo della struttura della tabella. Dopo ogni istruzione APPEND, la variabile SY-TABIX contiene il numero di indice della riga aggiunta.
L'aggiunta di righe a tabelle standard e ordinate con una chiave non univoca funziona indipendentemente dal fatto che le righe con la stessa chiave esistano già nella tabella. In altre parole, potrebbero verificarsi voci duplicate. Tuttavia, si verifica un errore di runtime se l'utente tenta di aggiungere una voce duplicata a una tabella ordinata con una chiave univoca o se l'utente viola l'ordinamento di una tabella ordinata aggiungendovi le righe.
Esempio
REPORT ZCUSLIST1.
DATA: BEGIN OF linv Occurs 0,
Name(20) TYPE C,
ID_Number TYPE I,
END OF linv.
DATA table1 LIKE TABLE OF linv.
linv-Name = 'Melissa'.
linv-ID_Number = 105467.
APPEND linv TO table1.
LOOP AT table1 INTO linv.
Write: / linv-name, linv-ID_Number.
ENDLOOP.
Il codice precedente produce il seguente output:
Melissa 105467