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