Учебники

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. Однако, когда выражение 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.

Приведенный выше код производит следующий вывод —