SAP Внутрішня таблиця ABAP: створення, читання, заповнення, копіювання та видалення

⚡ Розумний підсумок

SAP Внутрішні об'єкти таблиці ABAP зберігають дані з фіксованої структури для динамічного використання всередині програми. На цій сторінці пояснюються робочі області, рядки заголовків, чотири методи створення та оператори, які заповнюють, копіюють, читають та видаляють рядки таблиці.

  • 📋 Основне визначення: Внутрішня таблиця зберігає рядки ідентичної структури в основній пам'яті, найчастіше для форматування даних, що зчитуються з таблиці бази даних.
  • 🧾 Роль у робочій зоні: Робоча область — це один рядок того ж формату, що й таблиця, і вона обробляє таблицю по одному рядку за раз.
  • 🏷️ Рядок заголовка: Таблиця із заголовком отримує неявну робочу область, тому рядки можна вставляти або читати безпосередньо, не називаючи їх.
  • 🛠️ Чотири методи створення: Оператор TYPES, посилання на існуючу таблицю, посилання на існуючу структуру або нова структура, оголошена за допомогою OCCURS.
  • Заповнити: APPEND додає один рядок, COLLECT агрегує числові поля для дубліката ключа, а INSERT розміщує рядок за вибраним індексом.
  • 🔍 Читати та копіювати: LOOP AT зчитує кожен рядок, READ TABLE зчитує один рядок за індексом, а MOVE або знак рівності копіює всю таблицю.
  • 🗑️ Видалити: DELETE всередині циклу LOOP видаляє поточний рядок, а DELETE … INDEX видаляє рядок у відомій позиції.

SAP Внутрішні таблиці ABAP

Що таке внутрішня таблиця?

ВНУТРІШНЯ ТАБЛИЦЯ використовуються для отримання даних із фіксованої структури для динамічного використання в ABAP. Кожен рядок внутрішньої таблиці має однакову структуру полів. Основне використання внутрішніх таблиць — це зберігання та форматування даних із таблиці бази даних у програмі.

Внутрішній стіл завжди працює разом із робочою зоною, тому ця концепція є наступною.

Що таке робоча зона?

Робочі області – це окремі рядки даних. Вони повинні мати той самий формат, що й будь-яка з внутрішніх таблиць. Він використовується для обробки даних у внутрішній таблиці по одному рядку за раз.

Різниця між внутрішнім столом та робочою зоною?

Малюнок говорить тисячу слів

Різниця між внутрішньою таблицею та робочою областю

На діаграмі показано таблицю, яка містить багато рядків, тоді як робоча область містить лише рядок, який наразі обробляється. Чи створюється ця робоча область системою, чи розробником, залежить від типу таблиці, описаного нижче.

Типи внутрішніх таблиць

Існує два види внутрішніх таблиць.

  1. Внутрішні таблиці з рядком HEADER
  2. Внутрішні таблиці без рядка HEADER.

Внутрішні таблиці з рядком заголовка

  • Тут система автоматично створює робочу зону.
  • Робоча область має той самий тип даних, що й внутрішня таблиця.
  • Ця робоча область називається HEADER line.
  • Саме тут виконуються всі зміни або будь-які дії з вмістом таблиці. У результаті цього записи можна безпосередньо вставляти в таблицю або безпосередньо отримувати доступ із внутрішньої таблиці.

Внутрішні таблиці без рядка заголовка :

  • Тут немає робочої області, пов'язаної зі столом.
  • Робоча область повинна бути явно вказана, коли нам потрібно отримати доступ до таких таблиць.
  • Тому до цих таблиць неможливо отримати прямий доступ.

💡 Порада: Таблиця із рядком заголовка має однакову назву для таблиці та її робочої області, що робить код неоднозначним. Нові програми повинні оголошувати таблицю без рядка заголовка та передавати явну робочу область.

Стандартні, відсортовані та хешовані внутрішні таблиці

Окрім розрізнення за рядком заголовка, кожна внутрішня таблиця також має тип таблиці, який визначає, як знаходиться рядок. Тип вибирається за допомогою додавання TYPE STANDARD TABLE, TYPE SORTED TABLE або TYPE HASHED TABLE, і це безпосередньо впливає на час виконання.

Тип столу Метод доступу ключ Найкраще використовувати для
Standard Індекс та ключ, з лінійним пошуком по ключу Не унікальний Послідовна обробка та невеликі таблиці, що зчитуються з індексом
Сортований Індекс та ключ, з бінарним пошуком по ключу Унікальні чи неунікальні, сортуються автоматично Більші таблиці багаторазово зчитують провідні ключові поля
Хеш Тільки ключ, з алгоритмом хешування Унікальний Дуже великі таблиці, які завжди зчитуються повним ключем, такі як буфер записів бази даних

Стандартна таблиця є таблицею за замовчуванням і підходить для послідовної обробки. Хешована таблиця зберігає постійний час доступу незалежно від того, скільки рядків зберігається, тому правила продуктивності Відкрити SQL рекомендую його для буферизації записів.

Створення внутрішніх таблиць

Існує багато способів створення внутрішньої таблиці. Давайте подивимося на них один за одним -

1. За допомогою оператора типу

Давайте тепер створимо внутрішню таблицю 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].

Приклад

DATA itab TYPE line OCCURS 10 with header line.

Тут створюється внутрішня таблиця itab типу line з рядком заголовка. Зауважте, що «з рядком заголовка» необов’язковий.

3. Посилаючись на існуючу структуру

Синтаксис-

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

Приклад

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'

Початкові рядки додають до таблиці рядок, ініціалізований правильним значенням для свого типу. Тут стовпець 1 – це символ, а стовпець 2 – ціле число. Потім APPEND початковий рядок додає рядок, ініціалізований відповідно до типу даних стовпців, тобто пробіл для стовпця 1 та 0 для стовпця 2.

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 або ВСТАВИТИ LINEОператор S. Простіший спосіб — використовувати будь-який із наведених нижче синтаксисів.

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>.

Цей оператор працює лише в межах циклу. Він видаляє поточний рядок. Ви можете умовно видалити рядки в циклі, додавши ДЕ ЗАКЛАД.

2. Видалення рядків за допомогою індексу.

Це використовується для видалення рядка з внутрішньої таблиці за будь-яким відомим індексом.

синтаксис

DELETE <ITABLE> INDEX <IDX>.

Рядок з індексом видаляється. Індекс наступного рядка зменшено на 1.

3. Видалення дублікатів рядків.

Дублікати рядків видаляються після сортування таблиці за ключовими полями.

SORT itab BY col1.

DELETE ADJACENT DUPLICATES FROM itab COMPARING col1.

Порівнюються лише суміжні рядки, тому спочатку потрібно виконати оператор SORT. Щоб повністю очистити таблицю, використовуйте CLEAR itab[] або REFRESH itab.

Поширені запитання

CLEAR itab очищує лише рядок заголовка, а CLEAR itab[] очищує тіло. REFRESH завжди очищує тіло, але зберігає пам'ять зарезервованою. FREE очищує тіло та звільняє пам'ять також.

SY-TABIX містить номер рядка внутрішньої таблиці, яка наразі обробляється. SY-INDEX містить номер пропуску циклу DO або WHILE. Хешована таблиця залишає SY-TABIX на нулі, оскільки вона не має індексу.

ЦИКЛ У itab ПРИЗНАЧЕННЯ символу поля дозволяє уникнути копіювання кожного рядка в робочу область, тому воно працює швидше на великих таблицях і дозволяє змінювати рядок на місці без використання оператора MODIFY.

Так. Помічники ШІ в інструментах розробки ABAP переписують OCCURS та оголошення рядків заголовків у TYPE STANDARD TABLE OF з явною робочою областю та позначають оператори, які перериваються після зникнення рядка заголовка.

Консультанти з продуктивності ШІ перевіряють, як таблиця заповнюється та зчитується, а потім рекомендують відсортовану або хешовану таблицю, коли лінійний пошук домінує під час виконання. Рекомендація підтверджується за допомогою tracе в транзакції SAT.

Підсумуйте цей пост за допомогою: