SAP Tabella interna ABAP: crea, leggi, popola, copia ed elimina

โšก Riepilogo intelligente

SAP Gli oggetti Tabella Interna ABAP contengono dati da una struttura fissa per un utilizzo dinamico all'interno di un programma. Questa pagina illustra le aree di lavoro, le righe di intestazione, i quattro metodi di creazione e le istruzioni per popolare, copiare, leggere ed eliminare le righe di una tabella.

  • ๐Ÿ“‹ Definizione di base: Una tabella interna memorizza righe con struttura identica nella memoria principale, il piรน delle volte per formattare i dati letti da una tabella di database.
  • ๐Ÿงพ Ruolo nell'area di lavoro: Un'area di lavoro รจ una singola riga con lo stesso formato della tabella e elabora la tabella una riga alla volta.
  • ๐Ÿท๏ธ Titolo: Una tabella con una riga di intestazione riceve un'area di lavoro implicita, quindi le righe possono essere inserite o lette direttamente senza specificarne una.
  • ๏ธ Quattro metodi di creazione: Istruzione TYPES, riferimento a una tabella esistente, riferimento a una struttura esistente o una nuova struttura dichiarata con OCCURS.
  • โž• Popolare: APPEND aggiunge una riga, COLLECT aggrega i campi numerici per una chiave duplicata e INSERT inserisce una riga in un indice scelto.
  • ๐Ÿ” Leggi e copia: LOOP AT legge ogni riga, READ TABLE legge una riga tramite indice e MOVE o il segno di uguale copiano un'intera tabella.
  • ๐Ÿ—‘๏ธ Elimina: L'istruzione DELETE all'interno di un ciclo LOOP rimuove la riga corrente, mentre DELETE โ€ฆ INDEX rimuove la riga in una posizione nota.

SAP Tabelle interne ABAP

Cos'รจ una tabella interna?

TAVOLO INTERNO vengono utilizzati per ottenere dati da una struttura fissa per l'uso dinamico in ABAP. Ogni riga nella tabella interna ha la stessa struttura di campo. L'utilizzo principale delle tabelle interne รจ per l'archiviazione e la formattazione dei dati da una tabella di database all'interno di un programma.

Un tavolo interno funziona sempre in sinergia con un'area di lavoro, quindi questo concetto verrร  trattato in seguito.

Che cos'รจ un'area di lavoro?

Le aree di lavoro sono singole righe di dati. Devono avere lo stesso formato di qualsiasi tabella interna. Vengono utilizzate per elaborare i dati di una tabella interna una riga alla volta.

Qual รจ la differenza tra un tavolo interno e un'area di lavoro?

Una foto dice piรน di mille parole

Differenza tra tavolo interno e area di lavoro

Il diagramma mostra una tabella contenente numerose righe, mentre l'area di lavoro contiene solo la riga attualmente in fase di elaborazione. La creazione dell'area di lavoro, sia da parte del sistema che dello sviluppatore, dipende dal tipo di tabella descritto di seguito.

Tipi di tabelle interne

Esistono due tipi di tabelle interne.

  1. Tavoli interni con linea HEADER
  2. Tabelle interne senza riga HEADER.

Tabelle interne con riga di intestazione

  • Qui il sistema crea automaticamente l'area di lavoro.
  • L'area di lavoro ha lo stesso tipo di dati della tabella interna.
  • Questa area di lavoro รจ chiamata riga HEADER.
  • รˆ qui che vengono eseguite tutte le modifiche o qualsiasi azione sul contenuto della tabella. Di conseguenza, i record possono essere inseriti direttamente nella tabella o accessibili direttamente dalla tabella interna.

Tabelle interne senza riga di intestazione :

  • Qui non รจ presente alcuna area di lavoro associata alla tabella.
  • L'area di lavoro deve essere specificata esplicitamente quando dobbiamo accedere a tali tabelle.
  • Pertanto non รจ possibile accedere direttamente a queste tabelle.

Suggerimento: Una tabella con riga di intestazione mantiene lo stesso nome sia per la tabella stessa che per la sua area di lavoro, il che rende il codice ambiguo. I nuovi programmi dovrebbero dichiarare una tabella senza riga di intestazione e specificare esplicitamente l'area di lavoro.

Tabelle interne standard, ordinate e con hashing

Oltre alla distinzione nella riga di intestazione, ogni tabella interna ha anche un tipo di tabella che determina come viene trovata una riga. Il tipo viene scelto tramite l'aggiunta TYPE STANDARD TABLE, TYPE SORTED TABLE o TYPE HASHED TABLE e ha un effetto diretto sull'esecuzione.

Tipo di tavolo Metodo di accesso Le qui utilizzati per
Standard Indice e chiave, con ricerca lineare sulla chiave Non unico Elaborazione sequenziale e piccole tabelle lette con un indice
ordinato Indice e chiave, con ricerca binaria sulla chiave Unico o non unico, mantenuto ordinato automaticamente Le tabelle piรน grandi leggono ripetutamente i campi chiave principali
hash Solo chiave, con un algoritmo di hash Unico Tabelle molto grandi che vengono sempre lette tramite la chiave completa, come ad esempio un buffer di record di database.

Una tabella standard รจ quella predefinita e si adatta all'elaborazione sequenziale. Una tabella hash mantiene costante il tempo di accesso indipendentemente dal numero di righe memorizzate, motivo per cui le regole di prestazione di Open SQL Lo consiglio per il buffering dei record.

Creazione di tabelle interne

Esistono molti modi per creare una tabella interna. Vediamoli uno per uno-

1.Utilizzando la dichiarazione Type

Creiamo ora una tabella interna itab utilizzando l'istruzione TYPE.

La sintassi รจ โ€“

Types : begin of line,

column1 type I,

column2 type I,

end of line.

Esempio:

TYPES : begin of line,

empno		type I,

empname(20)   	type c	,

end of line.

L'istruzione TYPES crea una linea di struttura come definito.

Per creare effettivamente una tabella interna itab utilizzare il seguente comando:

Data itab type line occurs 10.

Viene creata una tabella interna itab con la struttura di line. Oltre a dichiarare la struttura di una tabella interna, la clausola OCCURS definisce anche quante voci della tabella vengono mantenute nella memoria principale (in questo caso 10). I record aggiuntivi vengono scritti nell'area di paginazione e possono influire sulle prestazioni

2. Facendo riferimento ad un'altra Tabella

รˆ possibile creare una tabella interna facendo riferimento a una tabella esistente. La tabella esistente potrebbe essere una tabella standard. SAP tavolo, un tavolo Z o un altro tavolo interno.

Sintassi-

Data <f> <type> [with header line].

Esempio-

DATA itab TYPE line OCCURS 10 with header line.

Qui viene creata una tabella interna itab del tipo riga con una riga di intestazione. Tieni presente che "con riga di intestazione" รจ facoltativo.

3. Facendo riferimento alla Struttura esistente

Sintassi-

Data	<f> LIKE <struct> occurs n [with header line].

Esempio-

DATA itab LIKE sline OCCURS 10.

Qui viene creata una tabella itab avente una struttura identica a quella di sline

4.Creando una nuova struttura

Creiamo ora una tabella interna con una struttura tutta nostra. Qui la tabella viene creata con una riga di intestazione, per impostazione predefinita,.

Sintassi โ€“

Data : Begin of <f> occurs <n>,

<component declaration>,

................................,

End of <f>.

Esempio -

Data : Begin of itab occurs 10,

column1       type I,

column2(4)  type C,

column3      like  mara-ernam,

End of itab.

Viene creata la tabella interna itab

Una tabella vuota รจ di scarsa utilitร , quindi la sezione successiva la riempie di righe.

Popolamento di tabelle interne

Ora che abbiamo creato con successo alcune tabelle interne, vediamo come popolarle con alcuni record. Sono disponibili vari metodi per popolare le tabelle

1.Aggiungi dati riga per riga

Il primo metodo disponibile รจ l'utilizzo dell'istruzione APPEND.

Utilizzando l'istruzione APPEND possiamo aggiungere una riga da un'altra area di lavoro alla tabella interna oppure possiamo aggiungere una riga iniziale alla tabella interna.

Sintassi โ€“

APPEND [<wa> TO / INITIAL LINE TO] <itable>.

Qui l'area di lavoro oppure la riga iniziale viene aggiunta alla tabella interna .

La variabile di sistema SY-TABIX contiene l'indice della riga aggiunta.

Esempio:

Data: Begin of itab occurs 10,

col1 type C,

col2 type I,

end of itab.

Append initial line to itab.

Risultati: ' ' '0'

L'istruzione APPEND initial line aggiunge alla tabella una riga inizializzata con il valore corretto per il suo tipo. In questo caso, col1 รจ un carattere e col2 รจ un numero intero. L'istruzione APPEND initial line aggiunge quindi una riga inizializzata in base al tipo di dati delle colonne, ovvero uno spazio per col1 e 0 per col2.

2.Utilizzo dell'istruzione COLLECT

COLLECT รจ un'altra forma di istruzione utilizzata per popolare le tabelle interne. Generalmente COLLECT viene utilizzato durante l'inserimento di righe in una tabella interna con chiave standard univoca.

Sintassi-

COLLECT [<wa> INTO] <itable>.

In caso di tabelle con riga di intestazione, l'opzione INTO viene omessa. Supponiamo che ci sia giร  una voce con una chiave uguale a quella che stai tentando di aggiungere, quindi non viene aggiunta una nuova riga alla tabella, ma vengono aggiunti i campi numerici di entrambe le voci ed รจ presente solo una voce corrispondente alla chiave . Il valore di SY-TABIX viene modificato nella riga della voce originale. Altrimenti COLLECT agisce in modo simile ad APPEND e SY-TABIX contiene l'indice della riga elaborata.

3. Utilizzo dell'istruzione INSERT

L'istruzione INSERT aggiunge un'area di riga/lavoro alla tabella interna. รˆ possibile specificare la posizione in cui deve essere aggiunta la nuova riga utilizzando la clausola INDEX con l'istruzione INSERT.

Sintassi

INSERT [<wa> INTO / INITIAL LINE INTO] <itable> [index <idx>].

Qui, l'area di lavoro o INIZIALE LINE viene inserito nella tabella interna all'indice .

Copia di tabelle interne

Il contenuto di una tabella interna puรฒ essere copiato in un'altra utilizzando APPEND LINES o INSERISCI LINEIstruzione S. Un modo piรน semplice รจ utilizzare una delle seguenti sintassi.

MOVE  <itab1> To <itab2>.

OR

<itab1> = <itab2>.

Questi copiano il contenuto di ITAB1 in ITAB2. In caso di tabelle interne con riga di intestazione dobbiamo utilizzare [] per distinguerle dall'area di lavoro. Quindi, per copiare il contenuto delle tabelle interne con la riga di intestazione la sintassi diventa,

itab1[] = itab2[].

Leggi le tabelle interne

Ora che abbiamo familiarizzato con la creazione di tabelle interne e il loro popolamento con i dati, vedremo come utilizzare effettivamente i dati o come recuperarli dalle tabelle interne.

1. Utilizzo di Loop -Endloop

Uno dei modi per accedere o leggere la tabella interna รจ utilizzare LOOP-ENDLOOP.

Sintassi

LOOP AT <itable> [INTO <wa>]

...................................

ENDLOOP.

Qui quando dici LOOP AT ITABLE, la tabella interna ITABLE viene letta riga per riga. รˆ possibile accedere ai valori delle colonne per quella riga durante qualsiasi parte della struttura LOOP-ENDLOOP. Il valore di SY-SUBRC รจ impostato su 0, anche se viene letto un solo record.

2. Utilizzando LEGGI

L'altro metodo per leggere la tabella interna consiste nell'utilizzare l'istruzione READ.

Sintassi-

READ TABLE <itable> [INTO <wa>] INDEX <idx>.

Questa istruzione legge la riga corrente o la riga specificata dall'indice Il valore di SY-TABIX รจ l'indice della riga letta. Se viene trovata una voce con l'indice specificato, SY-SUBRC viene impostato a 0. Se l'indice specificato รจ inferiore a 0, si verifica un errore di runtime. Se l'indice specificato supera la dimensione della tabella, SY-SUBRC viene impostato a 4.

โš ๏ธ Attenzione: L'istruzione READ TABLE โ€ฆ INDEX 0 genera un errore di runtime, pertanto รจ necessario verificare l'indice calcolato in fase di runtime prima dell'esecuzione dell'istruzione.

Eliminazione di tabelle interne

Esistono molti modi per eliminare righe da una tabella interna.

1.Eliminazione di righe in un ciclo.

Questo รจ il modo piรน semplice per eliminare le righe.

Sintassi

DELETE <ITABLE>.

Questa istruzione funziona solo all'interno di un ciclo. Cancella la riga corrente. รˆ possibile eliminare le righe in un ciclo in modo condizionale aggiungendo il file Dove la clausola.

2.Eliminazione di righe utilizzando l'indice.

Viene utilizzato per eliminare una riga dalla tabella interna in qualsiasi indice conosciuto.

Sintassi

DELETE <ITABLE> INDEX <IDX>.

La linea con l'indice viene eliminato. L'indice della riga seguente viene decrementato di 1.

3. Eliminazione delle righe duplicate.

Le righe duplicate vengono rimosse dopo che la tabella รจ stata ordinata in base ai campi chiave.

SORT itab BY col1.

DELETE ADJACENT DUPLICATES FROM itab COMPARING col1.

Vengono confrontate solo le righe adiacenti, motivo per cui l'istruzione SORT deve essere eseguita per prima. Per svuotare completamente la tabella, utilizzare CLEAR itab[] o REFRESH itab.

DOMANDE FREQUENTI

CLEAR itab svuota solo la riga di intestazione, mentre CLEAR itab[] svuota il corpo. REFRESH svuota sempre il corpo ma mantiene la memoria riservata. FREE svuota il corpo e rilascia anche la memoria.

SY-TABIX contiene il numero di riga della tabella interna attualmente in fase di elaborazione. SY-INDEX contiene il numero di iterazioni di un ciclo DO o WHILE. Una tabella hash lascia SY-TABIX a zero, perchรฉ non ha un indice.

L'istruzione LOOP AT itab ASSIGNING a field symbol evita di copiare ogni riga in un'area di lavoro, quindi รจ piรน veloce su tabelle di grandi dimensioni e consente di modificare la riga direttamente senza un'istruzione MODIFY.

Sรฌ. Gli assistenti IA negli strumenti di sviluppo ABAP riscrivono le dichiarazioni OCCURS e della riga di intestazione in TYPE STANDARD TABLE OF con un'area di lavoro esplicita e segnalano le istruzioni che si interrompono quando la riga di intestazione scompare.

I consulenti di prestazioni AI esaminano come viene riempita e letta una tabella, quindi raccomandano una tabella ordinata o con hash quando una ricerca lineare domina il tempo di esecuzione. La raccomandazione viene confermata con un trace nella transazione SAT.

Riassumi questo post con: