Руководство для участников курса Версия курса 2й квартал 2005 г. Продолжительность курса 5 Дн. Номер материала 50072594
Скачать 38.91 Mb.
|
Глава 4: Основные языковые элементы ABAP BC400 Рисунок 74: Независимое определение внутренних таблиц Этот способ позволяет внедрить таблицы любой структуры без необходимости обращения к существующим структурам словаря. На следующем рисунке представлен обзор возможных определений внутренних таблиц. Рисунок 75: Возможные определения внутренних таблиц В приведенном выше кратком тексте для определения таблицы неявно используются следующие значения по умолчанию: тип таблицы: стандартная (по умолчанию); 126 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 06-04-2006 BC400 Урок: Работа с внутренними таблицами уникальность ключа: не уникальный (единственный вариант для стандартной таблицы); табличный ключ: ключ по умолчанию (все нечисловые поля таблицы являются ключевыми полями). Рекомендация: Поскольку, как правило, использование ключа по умолчанию не является целесообразным, его можно применять для определения внутренней таблицы только в том случае, если ключ не требуется для обработки таблицы. Внимание: Наиболее типичная синтаксическая ошибка начинающего пользователя заключается в следующем: DATA itab TYPE TABLE OF <тип_таблицы> . В этом случае будет определена внутренняя таблица, строки которой также будут являться внутренними таблицами (указанного типа)! Рисунок 76: Определение структурированных объектов данных: обзор 06-04-2006 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 127 Глава 4: Основные языковые элементы ABAP BC400 Рисунок 77: Доступ к отдельным записям (обзор) Для обработки отдельной записи внутренней таблицы, как правило, требуется рабочая область, тип структурной переменной которой должен совпадать с типом строки внутренней таблицы. На вышеприведенном рисунке представлена обработка внутренней таблицы с использованием соответствующей рабочей области. APPEND Добавление содержимого структуры к внутренней таблице. Эта операция может использоваться только со стандартными таблицами. INSERT Вставка содержимого структуры во внутреннюю таблицу. В случае стандартной таблицы это содержимое просто добавляется к таблице, в случае отсортированной таблицы содержимое вставляется в таблицу в требуемом месте согласно ключу, а в случае хеш-таблицы вставка производится в соответствии с хеш-алгоритмом. READ Копирование содержимого записи таблицы в структуру. MODIFY Перезапись строки внутренней таблицы с использованием содержимого структуры. 128 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 06-04-2006 BC400 Урок: Работа с внутренними таблицами DELETE Удаление строки внутренней таблицы. COLLECT Суммирование содержимого структуры в строке внутренней таблицы, имеющей тот же самый ключ. При этом добавляются только неключевые поля. Следовательно, этот оператор может использоваться только для тех таблиц, все неключевые поля которых являются числовыми. Для получения подробной информации относительно описанных здесь ABAP-операторов см. соответствующую документацию по ключевым словам. Рисунок 78: Обработка наборов записей (обзор) LOOP . . . ENDLOOP Оператор LOOP по очереди размещает строки внутренней таблицы в структуру, указанную в выражении INTO. В пределах оператора LOOP существует возможность вывода или изменения текущего содержимого структуры с последующей записью обратно в таблицу. DELETE Удаление строк внутренней таблицы, удовлетворяющих определенному <условию>. 06-04-2006 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 129 Глава 4: Основные языковые элементы ABAP BC400 INSERT Копирование содержимого нескольких строк внутренней таблицы в другую внутреннюю таблицу. APPEND Добавление содержимого нескольких строк внутренней таблицы к другой стандартной таблице. Для получения подробной информации относительно описанных здесь ABAP-операторов см. соответствующую документацию по ключевым словам. Рисунок 79: Пример синтаксиса: вставка строки Существует возможность вставки строки во внутреннюю таблицу путем записи требуемых данных в подготовленную рабочую область с последующей вставкой во внутреннюю таблицу посредством оператора INSERT. В случае стандартных и хеш-таблиц происходит добавление строки. В случае отсортированной таблицы строка вставляется согласно ключу. 130 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 06-04-2006 BC400 Урок: Работа с внутренними таблицами Рисунок 80: Пример синтаксиса: построчный вывод внутренней таблицы Существует возможность построчного считывания и обработки содержимого внутренней таблицы с использованием оператора LOOP. При выполнении поиска в системном поле sy-tabix содержится номер строки текущей записи таблицы. Приведенный выше пример показывает вывод соответствующей текущей записи с использованием оператора WRITE при обработке. Если требуется изменить содержимое текущей записи таблицы во время прогона цикла, сначала следует внести изменения в копию строки в рабочей области, а затем с помощью оператора MODIFY записать измененную строку обратно в текущую запись таблицы. Для этого используется следующий синтаксис: MODIFY itab FROM wa. 06-04-2006 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 131 Глава 4: Основные языковые элементы ABAP BC400 Рисунок 81: Пример синтаксиса: считывание с помощью индекса В цикле предусмотрена возможность ограничения доступа к определенным строкам при помощи дополнения FROM-TO. В приведенном выше примере последовательно просматриваются только первые пять строк внутренней таблицы. Для считывания отдельной записи можно использовать оператор READ TABLE. В целях указания номера строки, содержащей требуемую запись, используется дополнение INDEX. Обратите внимание на то, что в обоих приведенных выше примерах используется индекс, что возможно только в случае индексных таблиц (т. е. стандартных и отсортированных таблиц). 132 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 06-04-2006 BC400 Урок: Работа с внутренними таблицами Рисунок 82: Пример синтаксиса: считывание с помощью ключа В цикле можно ограничить доступ к определенным строкам при помощи дополнения WHERE. В приведенном выше примере обрабатываются только те строки внутренней таблицы, поле CARRID которых имеет значение LH. Рекомендация: С точки зрения времени, затрачиваемого на выполнение, наиболее подходящей для этого вида обработки таблицей является отсортированная таблица, поле CARRID которой представляет собой ее первое ключевое поле. Существует возможность использования синтаксиса READ TABLE, представленного на приведенном выше рисунке, для считывания определенной строки внутренней таблицы. В этом случае всем ключевым полям после дополнения WITH TABLE KEY необходимо присвоить соответствующие значения. Если соответствующая строка находится во внутренней таблице, для кода возврата sy-subrc устанавливается значение "0". Рекомендация: С точки зрения времени, затрачиваемого на выполнение, в случае большого объема данных наиболее подходящей для этого вида единичного доступа является хеш-таблица. 06-04-2006 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 133 Глава 4: Основные языковые элементы ABAP BC400 Обратите внимание на то, что в случае использования дополнения WITH TABLE KEY во всех ключевых полях должны содержаться данные. При необходимости ограничения полей следует использовать дополнение WITH KEY Рисунок 83: Пример синтаксиса: сортировка и удаление содержимого С помощью оператора SORT можно выполнить сортировку стандартных и хеш-таблиц в порядке возрастания или убывания по табличному ключу или столбцам. Если порядок сортировки (ASCENDING или DESCENDING) не определен, то по умолчанию используется первый вариант. При необходимости могут использоваться правила сортировки, принятые в конкретной компании. Для внедрения лексикографической сортировки можно использовать необязательное дополнение AS TEXT . В немецко-говорящих странах это означает, что “ä” предшествует “b”, а не следует за “z”, что имело бы место в случае нелексикографической сортировки. В случае добавления STABLE, которое также является необязательным, относительный порядок записей данных, имеющих идентичные ключи сортировки, при сортировке остается неизменным. Для получения дополнительной информации см. документацию по ключевым словам оператора SORT. Для удаления содержимого таблицы можно использовать следующие операторы: 134 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 06-04-2006 BC400 Урок: Работа с внутренними таблицами REFRESH В этом случае удаляется все содержимое внутренней таблицы. Однако часть ранее используемой памяти остается доступной для будущих вставок. CLEAR Для внутренних таблиц без строки заголовка (всех тех, что были ранее описаны в курсе) оператор CLEAR имеет ту же функцию, что и оператор REFRESH. Однако для внутренних таблиц со строкой заголовка (см. ниже) использование этого оператора приводит только к инициализации строки заголовка. FREE Этот оператор используется для удаления всего содержимого внутренней таблицы, а также для освобождения ранее используемой памяти. Оператор FREE используется для внутренних таблиц, которые уже были проанализированы и больше не требуются в процессе выполнения программы. В результате ранее присвоенная, но больше не являющаяся необходимой память становится доступной для последующего использования. Рисунок 84: Внутренние таблицы в режиме отладки 06-04-2006 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 135 Глава 4: Основные языковые элементы ABAP BC400 При использовании отладчика существует возможность контроля содержимого внутренней таблицы путем ввода имени таблицы в область Имя поля с последующим переходом путем двойного щелчка к окну таблицы. В качестве альтернативы можно воспользоваться кнопкой Таблица и указать имя таблицы в поле Внутренняя таблица. Затем можно перейти к просмотру содержимого таблицы путем нажатия клавиши Enter. Рисунок 85: Сравнение внутренних таблиц со строками заголовка и без строк заголовка Дополнение WITH HEADER LINE в определении внутренней таблицы предоставляет возможность создания таблицы со строкой заголовка. В этом случае соответствующая таблице рабочая область (строка заголовка) создается автоматически, и необходимость в ее дополнительном определении отсутствует. Это также упрощает синтаксис команд таблицы, поскольку система всегда обращается к автоматически созданной рабочей области, 136 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 06-04-2006 BC400 Урок: Работа с внутренними таблицами явное указание которой, таким образом, больше не требуется. Несмотря на упомянутые преимущества, дальнейшее использование таблицы со строками заголовка не представляется целесообразным по указанным ниже причинам. • Автоматически созданная рабочая область имеет то же самое имя, что и внутренняя таблица, что затрудняет восприятие программы. • Таблицы со строками заголовка не допускается использовать в следующих случаях: – для комплексных объектов данных (структур и внутренних таблиц, компонентами которых также являются внутренние таблицы); – для ABAP-объектов (объектно-ориентированных расширений ABAP). Внутренние таблицы со строками заголовка упоминаются на этом уроке только потому, что они используются в некоторых ранних программах, с которыми периодически требуется работать. С этой целью ниже перечислены некоторые особенности строк заголовка: В случае внутренней таблицы со строкой заголовка под названием itab для адресации к соответствующему полю в рабочей области используется itab- Поле таблицы. Для адресации к телу таблицы можно использовать itab[] . В следующем примере поясняется описанная выше ситуация. DATA itab1 TYPE TABLE OF scarr WITH HEADER LINE. DATA itab2 LIKE itab1. itab1 = itab2 . Только операции со строками заголовка ! itab1[] = itab2[] . Операции с телом таблицы Следующий устаревший синтаксис также определяет внутреннюю таблицу со строкой заголовка даже с учетом того, что непосредственное указание на это отсутствует. DATA: BEGIN OF itab OCCURS n, field1 TYPE ... , field2 TYPE ... , ... , END OF itab. 06-04-2006 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 137 Глава 4: Основные языковые элементы ABAP BC400 138 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 06-04-2006 BC400 Урок: Работа с внутренними таблицами Упражнение 7: Работа с внутренними таблицами Цели упражнения Выполнив это упражнение, вы сможете • выполнять поиск подходящих типов таблиц в ABAP-словаре • определять внутренние таблицы на основе глобального типа таблицы • заполнять внутренние таблицы с использованием выборки массива • обрабатывать содержимое внутренних таблиц с использованием цикла Практический пример На экран должны выводиться даты рейсов, хранящиеся в таблице базы данных SPFLI, в виде списка с использованием внутренней таблицы в качестве места временного сохранения. Задание 1: Определение внутренней таблицы 1. Создайте исполняемую программу ZBC400_##_ITAB_LOOP без “TOP-INCLUDE”. 2. Определите внутреннюю таблицу в качестве буфера для данных из таблицы базы данных SPFLI. Для этого следует определить для внутренней таблицы тип строки, который является совместимым со структурой строк таблицы SPFLI. В ABAP-словаре выполните поиск всех типов таблиц, удовлетворяющих этому условию. Рекомендация: Необходимо вывести прозрачную таблицу SPFLI в ABAP-словаре. Затем воспользуйтесь соответствующей кнопкой для вызова ведомости использования SPFLI в виде списка. (Обратите внимание на правильность выбора при создании ведомости использования.) 3. Определите внутреннюю таблицу (рекомендуемое имя: it_spfli) на основе одного из найденных глобальных типов таблиц. 4. Определите соответствующую рабочую область для внутренней таблицы (рекомендуемое имя: wa_spfli). Продолжение на следующей странице 06-04-2006 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 139 Глава 4: Основные языковые элементы ABAP BC400 Задание 2: Заполнение и вывод внутренней таблицы 1. Запрограммируйте доступ с выборкой массива ко всем записям данных в таблице базы данных SPFLI следующим образом: SELECT * FROM spfli INTO TABLE it_spfli. 2. Для вывода списка буферизированных данных во внутренней таблице используйте оператор LOOP. 140 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 06-04-2006 BC400 Урок: Работа с внутренними таблицами Решение 7: Работа с внутренними таблицами Задание 1: Определение внутренней таблицы 1. Создайте исполняемую программу ZBC400_##_ITAB_LOOP без “TOP-INCLUDE”. a) Этот шаг выполняется в соответствии с обычной процедурой. 2. Определите внутреннюю таблицу в качестве буфера для данных из таблицы базы данных SPFLI. Для этого следует определить для внутренней таблицы тип строки, который является совместимым со структурой строк таблицы SPFLI. В ABAP-словаре выполните поиск всех типов таблиц, удовлетворяющих этому условию. Рекомендация: Необходимо вывести прозрачную таблицу SPFLI в ABAP-словаре. Затем воспользуйтесь соответствующей кнопкой для вызова ведомости использования SPFLI в виде списка. (Обратите внимание на правильность выбора при создании ведомости использования.) a) Этот шаг выполняется в соответствии с описанием. 3. Определите внутреннюю таблицу (рекомендуемое имя: it_spfli) на основе одного из найденных глобальных типов таблиц. a) См. выдержку из исходного текста в примере решения. 4. Определите соответствующую рабочую область для внутренней таблицы (рекомендуемое имя: wa_spfli). a) См. выдержку из исходного текста в примере решения. Задание 2: Заполнение и вывод внутренней таблицы 1. Запрограммируйте доступ с выборкой массива ко всем записям данных в таблице базы данных SPFLI следующим образом: SELECT * FROM spfli INTO TABLE it_spfli. a) См. выдержку из исходного текста в примере решения. Продолжение на следующей странице 06-04-2006 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 141 Глава 4: Основные языковые элементы ABAP BC400 2. Для вывода списка буферизированных данных во внутренней таблице используйте оператор LOOP. a) См. выдержку из исходного текста в примере решения. Результат Выдержка из исходного текста: SAPBC400TSS_ITAB_LOOP REPORT sapbc400tss_itab_loop. DATA it_spfli TYPE sbc400_t_spfli. DATA wa_spfli LIKE LINE OF it_spfli. SELECT * FROM spfli INTO TABLE it_spfli. * at least one dataset selected IF sy-subrc = 0. LOOP AT it_spfli INTO wa_spfli. WRITE: / wa_spfli-carrid, wa_spfli-connid, wa_spfli-cityfrom, wa_spfli-cityto, wa_spfli-deptime, wa_spfli-arrtime. ENDLOOP. ENDIF. 142 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 06-04-2006 BC400 Урок: Работа с внутренними таблицами Резюме по уроку Теперь вы сможете: • определять внутренние таблицы • использовать базисные ABAP-операторы с внутренними таблицами • анализировать внутренние таблицы в режиме отладки 06-04-2006 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 143 Резюме по главе BC400 Резюме по главе Теперь вы сможете: • определять элементарные объекты данных (простые переменные) • использовать базовые ABAP-операторы с элементарными объектами данных • выполнять и анализировать программы в режиме отладки • определять структурированные объекты данных (переменные структуры) • использовать базовые ABAP-операторы для структурированных объектов данных • анализировать структурированные объекты данных в режиме отладки • определять внутренние таблицы • использовать базисные ABAP-операторы с внутренними таблицами • анализировать внутренние таблицы в режиме отладки Дополнительная информация ... См. онлайн-документацию к соответствующим ABAP-операторам. 144 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 06-04-2006 |