SAP ABAP - заполнение внутренних таблиц
Во внутренних таблицах заполнение включает такие функции, как выбор, вставка и добавление. В этой главе основное внимание уделяется операторам INSERT и APPEND.
ВСТАВИТЬ заявление
Оператор INSERT используется для вставки одной строки или группы строк во внутреннюю таблицу.
Ниже приведен синтаксис для добавления одной строки во внутреннюю таблицу:
INSERT <work_area_itab> INTO <internal_tab> INDEX <index_num>.
В этом синтаксисе оператор INSERT вставляет новую строку во внутреннюю таблицу internal_tab. Новую строку можно вставить, используя выражение INTO work_area_itab перед параметром internal_tab. Когда используется выражение INTO work_area_itab, новая строка берется из рабочей области work_area_itab и вставляется в таблицу internal_tab. Однако, когда выражение work_area_itab INTO не используется для вставки строки, строка берется из строки заголовка таблицы internal_tab.
Когда новая строка вставляется во внутреннюю таблицу с помощью предложения INDEX, порядковый номер строк после вставленной строки увеличивается на 1. Если внутренняя таблица содержит <index_num> - 1 строк, новая строка добавляется в конец таблицы. Когда система SAP успешно добавляет строку во внутреннюю таблицу, переменная SY-SUBRC устанавливается в 0.
пример
Ниже приведен пример программы, в которой используется оператор вставки.
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.
Приведенный выше код дает следующий результат -
1
96-
2
3
4
1
96-
2
78-
3
78-
4
В приведенном выше примере цикл DO добавляет к нему 4 строки, содержащие числа от 1 до 4. Компоненту строки заголовка itable1-F1 присвоено значение -96. Оператор Insert вставляет строку заголовка как новую строку в тело перед строкой 3. Существующая строка 3 становится строкой 4 после вставки. Оператор LOOP AT извлекает из внутренней таблицы те строки, у которых значение F1 больше или равно 3. Перед каждой строкой оператор Insert вставляет новую строку из строки ее заголовка. Перед вставкой компонент F1 был изменен на -78.
После выполнения каждого оператора вставки система повторно индексирует все строки ниже вставленной. Это приводит к дополнительным расходам, когда вы вставляете строки в верхней части большой внутренней таблицы. Если вам нужно вставить блок строк в большую внутреннюю таблицу, подготовьте другую таблицу со строками, которые нужно вставить, и вместо этого используйте строки вставки.
При вставке новой строки внутри itable1 внутри цикла на itable1 это не влияет на внутреннюю таблицу мгновенно. Фактически он вступает в силу при следующем проходе цикла. При вставке строки после текущей, таблица повторно индексируется в ENDLOOP. Sy-tabix увеличивается, и следующий цикл обрабатывает строку, на которую указывает sy-tabix. Например, если вы находитесь на втором проходе цикла и вставляете запись перед строкой 3. При выполнении конечного цикла новая строка становится строкой 3, а старая строка 3 становится строкой 4 и так далее. Sy-tabix увеличивается на 1, и следующий проход цикла обрабатывает вновь вставленную запись.
ПРИЛОЖЕНИЕ Заявление
Оператор APPEND используется для добавления одной строки или строки в существующую внутреннюю таблицу. Этот оператор копирует одну строку из рабочей области и вставляет ее после последней существующей строки во внутренней таблице. Рабочая область может быть либо строкой заголовка, либо любой другой строкой поля с такой же структурой, как строка внутренней таблицы. Ниже приведен синтаксис оператора APPEND, который используется для добавления одной строки во внутреннюю таблицу.
APPEND <record_for_itab> TO <internal_tab>.
В этом синтаксисе выражение <record_for_itab> может быть представлено рабочей областью <work_area_itab>, которая может быть преобразована в тип линии, или предложением INITIAL LINE. Если пользователь использует рабочую область <work_area_itab>, система SAP добавляет новую строку во внутреннюю таблицу <internal_tab> и заполняет ее содержимым рабочей области. Предложение INITIAL LINE добавляет пустую строку, содержащую начальное значение для каждого поля структуры таблицы. После каждого оператора APPEND переменная SY-TABIX содержит порядковый номер добавленной строки.
Добавление строк к стандартным и отсортированным таблицам с неуникальным ключом работает независимо от того, существуют ли уже в таблице строки с таким же ключом. Другими словами, могут возникнуть повторяющиеся записи. Однако ошибка времени выполнения возникает, если пользователь пытается добавить повторяющуюся запись в отсортированную таблицу с уникальным ключом или если пользователь нарушает порядок сортировки отсортированной таблицы, добавляя к ней строки.
пример
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.
Приведенный выше код дает следующий вывод -
Melissa 105467