SAP ABAP intern tabell: Skapa, läs, fyll i, kopiera och ta bort

⚡ Smart sammanfattning

SAP ABAP Internal Table-objekt lagrar data från en fast struktur för dynamisk användning inuti ett program. Den här sidan förklarar arbetsområden, rubrikrader, de fyra skapandemetoderna och de satser som fyller i, kopierar, läser och tar bort tabellrader.

  • 📋 Kärndefinition: En intern tabell lagrar rader med identisk struktur i huvudminnet, oftast för att formatera data som läses från en databastabell.
  • 🧾 Arbetsområdesroll: Ett arbetsområde är en enda rad med samma format som tabellen, och den bearbetar tabellen en rad i taget.
  • 🏷️ Rubrikrad: En tabell med en rubrikrad får ett implicit arbetsområde, så rader kan infogas eller läsas direkt utan att namnge någon.
  • 🛠️ Fyra skapandemetoder: TYPES-sats, referens till en befintlig tabell, referens till en befintlig struktur eller en ny struktur deklarerad med OCCURS.
  • ➕ Befolka: APPEND lägger till en rad, COLLECT aggregerar numeriska fält för en duplicerad nyckel och INSERT placerar en rad vid ett valt index.
  • 🔍 Läs och kopiera: LOOP AT läser varje rad, READ TABLE läser en rad efter index och MOVE eller likhetstecknet kopierar en hel tabell.
  • 🗑️ Radera: DELETE inuti en LOOP tar bort den aktuella raden, och DELETE … INDEX tar bort raden vid en känd position.

SAP ABAP interna tabeller

Vad är ett internt bord?

INRE BORD används för att hämta data från en fast struktur för dynamisk användning i ABAP. Varje rad i den interna tabellen har samma fältstruktur. Den huvudsakliga användningen för interna tabeller är för att lagra och formatera data från en databastabell i ett program.

Ett internt bord fungerar alltid tillsammans med en arbetsyta, så det konceptet kommer härnäst.

Vad är ett arbetsområde?

Arbetsområden är enstaka rader med data. De ska ha samma format som alla interna tabeller. Det används för att bearbeta data i en intern tabell en rad i taget.

Skillnaden mellan ett internt bord och ett arbetsområde?

En bild säger mer än tusen ord

Skillnaden mellan internt bord och ett arbetsområde

Diagrammet visar tabellen som innehåller många rader medan arbetsområdet bara innehåller den rad som för närvarande bearbetas. Huruvida arbetsområdet skapas av systemet eller av utvecklaren beror på tabelltypen som beskrivs nedan.

Typer av interna tabeller

Det finns två typer av interna tabeller.

  1. Interna tabeller med HEADER-linje
  2. Interna tabeller utan HEADER-rad.

Interna tabeller med rubriklinje

  • Här skapar systemet automatiskt arbetsområdet.
  • Arbetsområdet har samma datatyp som intern tabell.
  • Detta arbetsområde kallas HEADER-raden.
  • Det är här som alla ändringar eller någon av åtgärderna på innehållet i tabellen görs. Som ett resultat av detta kan poster infogas direkt i tabellen eller nås direkt från den interna tabellen.

Interna tabeller utan rubriklinje :

  • Här finns inget arbetsområde kopplat till bordet.
  • Arbetsområdet ska uttryckligen anges när vi behöver komma åt sådana tabeller.
  • Dessa tabeller kan därför inte nås direkt.

💡 Tips: En tabell med en rubrikrad har samma namn för tabellen och dess arbetsområde, vilket gör koden tvetydig. Nya program bör deklarera en tabell utan rubrikrad och skicka ett explicit arbetsområde.

Standard-, sorterade och hashade interna tabeller

Förutom skillnaden mellan rubrikraderna har varje intern tabell också en tabelltyp som avgör hur en rad hittas. Typen väljs med tillägget TYPE STANDARD TABLE, TYPE SORTED TABLE eller TYPE HASHED TABLE, och den har en direkt effekt på körtiden.

Bordstyp Åtkomstmetod Nyckel Används bäst till
Standard Index och nyckel, med linjär sökning på nyckeln Icke unik Sekventiell bearbetning och små tabeller som läses med ett index
Sorterad Index och nyckel, med en binär sökning på nyckeln Unikt eller icke-unikt, sorteras automatiskt Större tabeller läses upprepade gånger genom de inledande nyckelfälten
hashed Endast nyckel, med en hashalgoritm Unik Mycket stora tabeller som alltid läses av den fullständiga nyckeln, till exempel en buffert med databasposter

En standardtabell är standard och passar sekventiell bearbetning. En hashad tabell håller åtkomsttiden konstant oavsett hur många rader som lagras, vilket är anledningen till att prestandareglerna för Öppna SQL rekommenderar det för buffring av poster.

Skapa interna tabeller

Det finns många sätt att skapa en intern tabell. Låt oss titta på dem en efter en-

1.Genom att använda typintyget

Låt oss nu skapa en intern tabell (itab) med hjälp av TYPE-satsen.

Syntaxen är -

Types : begin of line,

column1 type I,

column2 type I,

end of line.

Exempel:

TYPES : begin of line,

empno		type I,

empname(20)   	type c	,

end of line.

TYPES-satsen skapar en strukturlinje enligt definitionen.

För att faktiskt skapa en intern tabell, använd följande kommando-

Data itab type line occurs 10.

En intern tabell-itab skapas med strukturen för linje. Förutom att deklarera strukturen för en intern tabell, definierar OCCURS-satsen också hur många tabellposter som underhålls i huvudminnet (i detta fall 10). Extra poster skrivs ut till personsökningsområdet och kan påverka prestandan

2.Genom att hänvisa till en annan tabell

Du kan skapa en intern tabell genom att referera till en befintlig tabell. Den befintliga tabellen kan vara en standardtabell. SAP bord, ett Z-bord eller annat internt bord.

Syntax-

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

Exempel-

DATA itab TYPE line OCCURS 10 with header line.

Här skapas en intern tabell-itab av typen rad med en rubrikrad. Observera att "med rubrikrad" är valfritt.

3.Genom att hänvisa till befintlig struktur

Syntax-

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

Exempel-

DATA itab LIKE sline OCCURS 10.

Här skapas en tabell itab med samma struktur som sline

4.Genom att skapa en ny struktur

Låt oss nu skapa en intern tabell med en egen struktur. Här skapas tabellen med en rubrikrad, som standard.

Syntax –

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

<component declaration>,

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

End of <f>.

Exempel -

Data : Begin of itab occurs 10,

column1       type I,

column2(4)  type C,

column3      like  mara-ernam,

End of itab.

Intern tabell itab skapas

En tom tabell är till liten nytta, så nästa avsnitt fyller den med rader.

Fylla i interna tabeller

Nu när vi har skapat några interna tabeller, låt oss se hur vi fyller dem med några poster. Det finns olika metoder tillgängliga för att fylla i tabeller

1. Lägg till data rad för rad

Den första tillgängliga metoden är användningen av APPEND-satsen.

Med hjälp av APPEND-satsen kan vi antingen lägga till en rad från ett annat arbetsområde till den interna tabellen eller så kan vi lägga till en initial rad till den interna tabellen.

Syntax –

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

Här arbetsområde eller den initiala raden läggs till den interna tabellen .

Systemvariabeln SY-TABIX innehåller indexet för den bifogade raden.

Exempel:

Data: Begin of itab occurs 10,

col1 type C,

col2 type I,

end of itab.

Append initial line to itab.

Resultat: ' ' '0'

Initial lines lägger till en rad som initialiserats med rätt värde för sin typ i tabellen. Här är kolumn1 ett tecken och kolumn2 ett heltal. APPEND initial line lägger sedan till en rad som initialiserats med avseende på kolumnernas datatyp, dvs. mellanslag för kolumn1 och 0 för kolumn2.

2.Använda COLLECT-satsen

COLLECT är en annan form av uttalande som används för att fylla i de interna tabellerna. I allmänhet används COLLECT när rader infogas i en intern tabell med unik standardnyckel.

Syntax-

COLLECT [<wa> INTO] <itable>.

Om tabeller med rubrikrad, INTO-alternativet utelämnas. Anta att det redan finns en post med samma nyckel som den du försöker lägga till, då läggs inte en ny rad till i tabellen, utan de numeriska fälten för båda posterna läggs till och endast en post som motsvarar nyckeln finns närvarande . Värdet på SY-TABIX ändras till raden för den ursprungliga posten. Annars fungerar COLLECT liknande APPEND och SY-TABIX innehåller indexet för den bearbetade raden.

3. Använda INSERT-satsen

INSERT-satsen lägger till en rad/arbetsområde till den interna tabellen. Du kan ange var den nya raden ska läggas till genom att använda INDEX-satsen med INSERT-satsen.

syntax

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

Här, arbetsområdet eller INITIALER LINE infogas i den interna tabellen vid index .

Kopiera interna tabeller

Innehållet i en intern tabell kan kopieras till en annan med hjälp av APPEND LINES eller INSERT LINES-sats. Ett enklare sätt är att använda någon av följande syntaxer.

MOVE  <itab1> To <itab2>.

OR

<itab1> = <itab2>.

Dessa kopierar innehållet i ITAB1 till ITAB2. Om det finns interna tabeller med rubrikrad måste vi använda [] för att skilja från arbetsområdet. Så för att kopiera innehållet i interna tabeller med rubrikrad blir syntaxen,

itab1[] = itab2[].

Läs interna tabeller

Vi är nu bekanta med att skapa interna tabeller och fylla dem med data. Vi ska nu se hur vi faktiskt använder data eller hämtar data från de interna tabellerna.

1. Använda Loop -Endloop

Ett av sätten att komma åt eller läsa den interna tabellen är att använda LOOP-ENDLOOP.

syntax

LOOP AT <itable> [INTO <wa>]

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

ENDLOOP.

Här när du säger LOOP AT ITABLE, så läses den interna tabellen ITABLE rad för rad. Du kan komma åt värdena för kolumnerna för den raden under vilken del som helst av LOOP-ENDLOOP-strukturen. Värdet på SY-SUBRC är satt till 0även om endast en post läses.

2. Använd READ

Den andra metoden för att läsa den interna tabellen är att använda READ-satsen.

Syntax-

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

Denna sats läser den aktuella raden eller raden enligt index Värdet för SY-TABIX är indexet för den lästa raden. Om en post med det angivna indexet hittas sätts SY-SUBRC till 0. Om det angivna indexet är mindre än 0 uppstår ett körtidsfel. Om det angivna indexet överskrider tabellstorleken sätts SY-SUBRC till 4.

⚠️ Varning: LÄS TABELL … INDEX 0 genererar ett körtidsfel, så ett index som beräknas vid körning bör kontrolleras innan satsen körs.

Ta bort interna tabeller

Det finns många sätt att ta bort rader från en intern tabell.

1.Ta bort rader i en slinga.

Detta är det enklaste sättet att ta bort rader.

syntax

DELETE <ITABLE>.

Detta uttalande fungerar bara inom en loop. Den tar bort den aktuella raden. Du kan ta bort raderna i en loop villkorligt genom att lägga till VAR klausul.

2.Ta bort rader med hjälp av indexet.

Detta används för att ta bort en rad från den interna tabellen vid alla kända index.

syntax

DELETE <ITABLE> INDEX <IDX>.

Linjen med indexet är raderad. Indexet för följande rad minskas med 1.

3. Ta bort dubbletter av rader.

Dubbletter av rader tas bort efter att tabellen har sorterats efter nyckelfält.

SORT itab BY col1.

DELETE ADJACENT DUPLICATES FROM itab COMPARING col1.

Endast intilliggande rader jämförs, vilket är anledningen till att SORT-satsen måste köras först. För att tömma tabellen helt, använd CLEAR itab[] eller REFRESH itab.

Vanliga frågor

CLEAR itab tömmer endast rubrikraden, och CLEAR itab[] tömmer brödtexten. REFRESH tömmer alltid brödtexten men behåller minnet reserverat. FREE tömmer brödtexten och frigör även minnet.

SY-TABIX innehåller radnumret för den interna tabell som för närvarande bearbetas. SY-INDEX innehåller överföringsnumret för en DO- eller WHILE-slinga. En hashad tabell lämnar SY-TABIX på noll eftersom den inte har något index.

LOOP VID itab ATT TILLDELA en fältsymbol undviker att kopiera varje rad till ett arbetsområde, så det körs snabbare på stora tabeller och gör att raden kan ändras på plats utan en MODIFY-sats.

Ja. AI-assistenter i ABAP-utvecklingsverktyg skriver om OCCURS- och headerradsdeklarationer till TYPE STANDARD TABLE OF med ett explicit arbetsområde, och de flaggar de satser som inte fungerar när headerraden försvinner.

AI-prestandarådgivare inspekterar hur en tabell fylls och läses, och rekommenderar sedan en sorterad eller hashad tabell när en linjär sökning dominerar körtiden. Rekommendationen bekräftas med en trace i transaktionen SAT.

Sammanfatta detta inlägg med: