Во внутренних таблицах заполнение включает такие функции, как выделение, вставка и добавление. В этой главе рассматриваются операторы 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. Однако, когда выражение INTO work_area_itab не используется для вставки строки, строка берется из строки заголовка таблицы 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.
Приведенный выше код производит следующее outp —
1 96- 2 3 4 1 96- 2 78- 3 78- 4
В приведенном выше примере цикл DO добавляет к нему 4 строки, содержащие числа от 1 до 4. Компонент строки заголовка itable1-F1 получил значение -96. Оператор вставки вставляет строку заголовка как новую строку в тело перед строкой 3. Существующая строка 3 становится строкой 4 после вставки. Оператор LOOP AT извлекает те строки из внутренней таблицы, у которых значение F1 больше или равно 3. Перед каждой строкой оператор Insert вставляет новую строку из строки заголовка. До вставки компонент F1 был изменен, чтобы содержать -78.
После выполнения каждого оператора вставки система переиндексирует все строки ниже вставленной. Это приводит к дополнительным расходам при вставке строк в верхней части большой внутренней таблицы. Если вам нужно вставить блок строк в большую внутреннюю таблицу, подготовьте другую таблицу со строками для вставки и используйте вместо нее строки вставки.
При вставке новой строки внутри itable1 внутри цикла в itable1 это не влияет на внутреннюю таблицу мгновенно. Это фактически вступает в силу на следующем проходе цикла. При вставке строки после текущей строки таблица переиндексируется в ENDLOOP. Sy-tabix увеличивается, и следующий цикл обрабатывает строку, на которую указывает sy-tabix. Например, если вы находитесь на втором проходе цикла и вставляете запись перед строкой 3. Когда выполняется endloop, новая строка становится строкой 3, а старая строка 3 становится строкой 4 и так далее. Sy-tabix увеличивается на 1, и следующий проход цикла обрабатывает вновь вставленную запись.
APPEND Заявление
Оператор 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.
Приведенный выше код производит следующий вывод —