SAP Вътрешна таблица на ABAP: Създаване, четене, попълване, копиране и изтриване
⚡ Умно обобщение
SAP Вътрешните таблични обекти на ABAP съхраняват данни от фиксирана структура за динамична употреба в рамките на програмата. Тази страница обяснява работните области, заглавните редове, четирите метода за създаване и операторите, които попълват, копират, четат и изтриват редове от таблицата.
Какво е вътрешна таблица?
ВЪТРЕШНА МАСА се използват за получаване на данни от фиксирана структура за динамична употреба в ABAP. Всеки ред във вътрешната таблица има една и съща структура на полето. Основната употреба на вътрешните таблици е за съхраняване и форматиране на данни от таблица на база данни в рамките на програма.
Вътрешната маса винаги работи заедно с работна зона, така че тази концепция е следваща.
Какво е работна зона?
Работните области са единични редове данни. Те трябва да имат същия формат като всяка от вътрешните таблици. Използва се за обработка на данните във вътрешна таблица ред по ред.
Разлика между вътрешна маса и работна зона?
Една снимка казва хиляда думи
Диаграмата показва таблицата, съдържаща много редове, докато работната област съдържа само реда, който се обработва в момента. Дали тази работна област е създадена от системата или от разработчика, зависи от типа таблица, описан по-долу.
Видове вътрешни таблици
Има два вида вътрешни таблици.
- Вътрешни таблици с ред HEADER
- Вътрешни таблици без ред HEADER.
Вътрешни таблици със заглавен ред
- Тук системата автоматично създава работната зона.
- Работната област има същия тип данни като вътрешната таблица.
- Тази работна област се нарича линия HEADER.
- Тук се извършват всички промени или всяко действие върху съдържанието на таблицата. В резултат на това записите могат да бъдат директно вмъкнати в таблицата или директно достъпни от вътрешната таблица.
Вътрешни таблици без заглавен ред :
- Тук няма работна зона, свързана с масата.
- Работната област трябва да бъде изрично указана, когато имаме нужда от достъп до такива таблици.
- Следователно тези таблици не могат да бъдат достъпни директно.
💡 Съвет: Таблица със заглавен ред носи едно и също име за таблицата и нейната работна област, което прави кода двусмислен. Новите програми трябва да декларират таблица без заглавен ред и да подават изрично посочване на работна област.
Стандартни, сортирани и хеширани вътрешни таблици
Освен разграничението по заглавен ред, всяка вътрешна таблица има и вид таблица, който определя как се намира даден ред. Видът се избира с добавянето на TYPE STANDARD TABLE, TYPE SORTED TABLE или TYPE HASHED TABLE и има пряк ефект върху времето за изпълнение.
| Вид маса | Метод за достъп | ключ | Най-добре се използва за |
|---|---|---|---|
| Standard | Индекс и ключ, с линейно търсене по ключа | Не е уникален | Последователна обработка и малки таблици, четени с индекс |
| Сортирани | Индекс и ключ, с двоично търсене по ключа | Уникални или неуникални, сортирани автоматично | По-големите таблици четат многократно водещите ключови полета |
| хеширана | Само ключ, с хеш алгоритъм | Уникална | Много големи таблици, които винаги се четат от пълния ключ, като например буфер от записи в базата данни |
Стандартната таблица е таблицата по подразбиране и е подходяща за последователна обработка. Хешираната таблица поддържа времето за достъп постоянно, независимо от броя на съхранените редове, поради което правилата за производителност на Отворете SQL препоръчвам го за буфериране на записи.
Създаване на вътрешни таблици
Има много начини за създаване на вътрешна таблица. Нека ги разгледаме един по един-
1. Чрез използване на оператора Type
Нека сега създадем вътрешна таблица itab, използвайки оператора TYPE.
Синтаксисът е –
Types : begin of line, column1 type I, column2 type I, end of line.
Пример:
TYPES : begin of line, empno type I, empname(20) type c , end of line.
Изявлението TYPES създава структурна линия, както е дефинирана.
За действително създаване на вътрешна таблица itab използвайте следната команда-
Data itab type line occurs 10.
Създава се вътрешна таблица itab със структурата на line. Освен деклариране на структурата на вътрешна таблица, клаузата OCCURS също така определя колко записа в таблицата се поддържат в основното хранилище (в този случай 10). Допълнителните записи се записват в областта за страниране и могат да повлияят на производителността
2. Чрез позоваване на друга таблица
Можете да създадете вътрешна таблица, като се обърнете към съществуваща таблица. Съществуващата таблица може да бъде стандартна SAP таблица, Z таблица или друга вътрешна таблица.
Синтаксис-
Data <f> <type> [with header line].
Example-
DATA itab TYPE line OCCURS 10 with header line.
Тук се създава вътрешна таблица itab от типа ред със заглавен ред. Моля, имайте предвид, че „със заглавен ред“ не е задължително.
3. Чрез позоваване на съществуваща структура
Синтаксис-
Data <f> LIKE <struct> occurs n [with header line].
Example-
DATA itab LIKE sline OCCURS 10.
Тук е създадена таблица itab, която има същата структура като тази на sline
4. Чрез създаване на нова структура
Нека сега създадем вътрешна таблица със собствена структура. Тук таблицата е създадена със заглавен ред, по подразбиране.
Синтаксис –
Data : Begin of <f> occurs <n>, <component declaration>, ................................, End of <f>.
Пример -
Data : Begin of itab occurs 10, column1 type I, column2(4) type C, column3 like mara-ernam, End of itab.
Създава се вътрешна таблица itab
Празна таблица е от малка полза, така че следващият раздел я запълва с редове.
Попълване на вътрешни таблици
Сега, след като успешно създадохме някои вътрешни таблици, нека видим как да ги попълним с някои записи. Има различни методи за попълване на таблици
1. Добавяне на данни ред по ред
Първият наличен метод е използването на израза APPEND.
С помощта на оператора APPEND можем или да добавим един ред от друга работна област към вътрешната таблица, или можем да добавим един начален ред към вътрешната таблица.
Синтаксис –
APPEND [<wa> TO / INITIAL LINE TO] <itable>.
Ето работна зона или началният ред се добавя към вътрешната таблица .
Системната променлива SY-TABIX съдържа индекса на добавения ред.
Пример:
Data: Begin of itab occurs 10, col1 type C, col2 type I, end of itab. Append initial line to itab.
Резултати: ' '0'
Initial lines добавя към таблицата ред, инициализиран с правилната стойност за неговия тип. Тук col1 е символ, а col2 е цяло число. След това APPEND initial line добавя ред, инициализиран спрямо типа данни на колоните, т.е. място за col1 и 0 за col2.
2. Използване на оператор COLLECT
COLLECT е друга форма на израз, използван за попълване на вътрешните таблици. Обикновено COLLECT се използва при вмъкване на редове във вътрешна таблица с уникален стандартен ключ.
Синтаксис-
COLLECT [<wa> INTO] <itable>.
В случай на таблици със заглавен ред, опцията INTO е пропусната. Да предположим, че вече има запис със същия ключ като този, който се опитвате да добавите, тогава нов ред не се добавя към таблицата, но цифровите полета на двата записа се добавят и присъства само един запис, съответстващ на ключа . Стойността на SY-TABIX се променя на реда на оригиналния запис. В противен случай COLLECT действа подобно на APPEND и SY-TABIX съдържа индекса на обработения ред.
3. Използване на оператора INSERT
Операторът INSERT добавя ред/работна област към вътрешната таблица. Можете да укажете позицията, в която да се добави новият ред, като използвате клаузата INDEX с израза INSERT.
Синтаксис
INSERT [<wa> INTO / INITIAL LINE INTO] <itable> [index <idx>].
Тук, работната зона или ИНИЦИАЛ LINE се вмъква във вътрешна таблица при индекс .
Копиране на вътрешни таблици
Съдържанието на една вътрешна таблица може да бъде копирано в друга с помощта на командата APPEND. LINES или ВМЪКНЕТЕ LINES оператор. По-лесен начин е да използвате някой от следните синтаксиси.
MOVE <itab1> To <itab2>. OR <itab1> = <itab2>.
Те копират съдържанието на ITAB1 в ITAB2. В случай на вътрешни таблици със заглавен ред трябва да използваме [], за да разграничим от работната област. Така че, за да копирате съдържанието на вътрешни таблици със заглавен ред, синтаксисът става,
itab1[] = itab2[].
Прочетете вътрешните таблици
Вече сме запознати със създаването на вътрешни таблици и попълването им с данни. Сега ще видим как всъщност използваме данните или извличаме данни от вътрешните таблици.
1. Използване на Loop -Endloop
Един от начините за достъп или четене на вътрешната таблица е чрез използване на LOOP-ENDLOOP.
Синтаксис
LOOP AT <itable> [INTO <wa>] ................................... ENDLOOP.
Тук, когато кажете LOOP AT ITABLE, тогава вътрешната таблица ITABLE се чете ред по ред. Можете да получите достъп до стойностите на колоните за този ред по време на всяка част от структурата LOOP-ENDLOOP. Стойността на SY-SUBRC е зададена на 0, дори ако се прочете само един запис.
2. Използване на READ
Другият метод за четене на вътрешната таблица е чрез използване на израза READ.
Синтаксис-
READ TABLE <itable> [INTO <wa>] INDEX <idx>.
Това твърдение прочита текущия ред или ред, както е посочено от индекса Стойността на SY-TABIX е индексът на прочетения ред. Ако бъде намерен запис с посочения индекс, SY-SUBRC се задава на 0. Ако посоченият индекс е по-малък от 0, възниква грешка по време на изпълнение. Ако посоченият индекс надвишава размера на таблицата, SY-SUBRC се задава на 4.
⚠️ Предупреждение: READ TABLE … INDEX 0 поражда грешка по време на изпълнение, така че индекс, изчислен по време на изпълнение, трябва да се провери преди изпълнението на оператора.
Изтриване на вътрешни таблици
Има много начини за изтриване на редове от вътрешна таблица.
1.Изтриване на редове в цикъл.
Това е най-лесният начин за изтриване на редове.
Синтаксис
DELETE <ITABLE>.
Това изявление работи само в рамките на цикъл. Изтрива текущия ред. Можете да изтриете редовете в цикъл условно, като добавите WHERE клауза.
2.Изтриване на редове с помощта на индекса.
Това се използва за изтриване на ред от вътрешна таблица във всеки известен индекс.
Синтаксис
DELETE <ITABLE> INDEX <IDX>.
Редът с индекса се изтрива. Индексът на следващия ред се намалява с 1.
3. Изтриване на дублиращи се редове.
Дублиращите се редове се премахват, след като таблицата е сортирана по ключовите полета.
SORT itab BY col1. DELETE ADJACENT DUPLICATES FROM itab COMPARING col1.
Сравняват се само съседни редове, поради което командата SORT трябва да се изпълни първо. За да изпразните таблицата напълно, използвайте CLEAR itab[] или REFRESH itab.


