Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 11 День 11 Внутренние таблицы 2011.doc
Скачиваний:
3
Добавлен:
20.11.2019
Размер:
379.39 Кб
Скачать

17

Internal Tables (Внутренние таблицы)

Основные вопросы:

  • Определение внутренней таблицы с или без строки заголовка, используя data и оператор include structure.

  • Заполнение внутренней таблицы, используя append через строку заголовка или явную рабочую область.

  • Использование циклов loop at и loop at...where для чтения содержимого внутренней таблицы, использование sy-tabix для определения текущего индекса строки.

  • Использование read table для нахождения единственной записи внутренней таблицы и ее изменений.

  • Сортировка внутренней таблицы, используя дополнение as text.

Основные понятия

Внутренняя таблица (internal table) – временная таблица, сохраненная в оперативной памяти на сервере приложений. Она создается и заполняется программой во время выполнения и уничтожается, когда программа выполнилась. Как и таблица базы данных, внутренняя таблица состоит из одной или более строк с идентичной структурой, но в отличие от таблицы базы данных, она не может использоваться после завершения программы. Она используется как временная память для обработки данных или как временный буфер.

Определение Внутренней Таблицы

Внутренняя таблица состоит из тела и дополнительной строки заголовка (см рисунок).

Тело (body) держит строки внутренней таблицы. Все строки имеют одинаковую структуру. Термин «внутренняя таблица» обычно относится к телу внутренней таблицы.

Строка заголовка (header line) – field string с той же самой структурой как и содержимое таблицы (тела), но она может содержать только единственную строку. Это – буфер, используемый изменения содержимого внутренней таблицы.

Определение внутренней таблицы it (internal table) из трех строк.

Для задания внутренней таблицы будет использоваться имя внутренней таблицы – it (Internal Table).

Чтобы определить тело внутренней таблицы, необходимо определить Field String с дополнением occurs n. Дополнение occurs создает тело внутренней таблицы. Память для тела внутренней таблицы выделяется не при её описании, а при добавлении первой строки во внутреннюю таблицу. Без occurs, у Вас есть только field string.

Чтобы определить внутреннюю таблицу со строкой заголовка необходимо использовать оператор begin of или with header line в определении. При определении внутренней таблицы с помощью begin of автоматически создается строка заголовка. Если Вы используете like вместо begin of, у внутренней таблицы не будет строки заголовка, если Вы не добавите with header line после выражения occurs.

Внутренняя таблица используется без строки заголовка, в случае вложенной внутренней таблицы. У вложенной внутренней таблицы не может быть строки заголовка.

Способы определения внутренней таблицы с и без строки заголовка

report ztx1101.

data: begin of it1 occurs 10, "has a header line

f1,

f2,

f3,

end of it1.

data it2 like ztxlfa1 occurs 100. "doesn't have a header line

data it3 like ztxlfa1 occurs 100 with header line. "it does now

Замечание: На рисунке представлено определение внутренней таблицы со строкой заголовка. При этом есть одна особенность: и тело и строку заголовка называются it. it – название тела, и it – также название строки заголовка. В зависимости от того, куда Вы помещаете имя it в Вашем коде система автоматически определяет, к чему Вы обращаетесь.

Использование в операторе присваивания it всегда обращается к строке заголовка. Например, it-f1 = 'A' обращаться к компоненту f1 строки заголовка it.

Примеры определения внутренних Таблиц

report ztx1102.

data: begin of it1 occurs 10, "has a header line

f1,

f2,

f3,

end of it1.

data it2 like ztxlfa1 occurs 100. "doesn't have a header line

data it3 like ztxlfa1 occurs 100 with header line. "it does now

data it4 like it3 occurs 100. "doesn't have a header line

data begin of it5 occurs 100. "has a header line

include structure ztxlfa1.

data end of it5.

data begin of it6 occurs 100. "this is why you might use

include structure ztxlfa1. "the include statement

data: delflag,

rowtotal,

end of it6.

data: begin of it7 occurs 100, "don't do it this way

s like ztxlfa1, "component names will be

end of it7. "prefixed with it7-s-

data it8 like sy-index occurs 10

with header line.

data: begin of it9 occurs 10,

f1 like sy-index,

end of it9.

Добавление данных во внутреннюю таблицу, используя оператор append

Чтобы добавить только одну строку к внутренней таблице, Вы можете использовать оператор append. append копирует одну строку из рабочей области и помещает её в конец внутренней таблицы. Рабочая область может быть строкой заголовка, или это может быть любая другая Field String, имеющая ту же самую структуру как строка в теле внутренней таблицы.

Синтаксис оператора append

append [wa to] [initial line to] it.

  • wa – название рабочей области.

  • it название ранее определенной внутренней таблицы.

Особенности оператора:

  • wa должна иметь ту же структуру как строка тела.

  • wa может быть строкой заголовка, или это может быть любой Field String, имеющий ту же самую структуру как строка в теле.

  • Если Вы не определяете рабочую область, по умолчанию система использует строку заголовка. Строка заголовка – заданная по умолчанию рабочая область.

  • После выполнения оператора append, системная переменная sy-tabix устанавливается в относительный номер строки, добавленной во внутреннюю таблицу. Например, после добавления первой строки, sy-tabix будет установлен в 1. После добавления второй строки sy-tabix будет 2, и так далее.

Оператор append it to it добавляет строку заголовка, названную it к телу с именем it.

Оператор append it делает то же самое, потому что заданная по умолчанию рабочая область – строка заголовка. Именно в этом формате оператор append обычно используется.

Рабочая область, заданная явно в операторе append, называется явной рабочей областью (explicit work area). Любой Field String, имеющая ту же самую структуру как строка внутренней таблицы, может использоваться как явная рабочая область. Если рабочая область не задана, неявная рабочая область (строка заголовка) используется по умолчанию.

Оператор append initial line to it добавляет строку, содержащую начальные значения (пробелы и нули) к внутренней таблице. Этот оператор аналогичен последовательному выполнению двух операторов: clear it и append it.

Программа добавляет три строки к внутренней таблице через строку заголовка

report ztx1103.

data: begin of it occurs 3,

f1(1),

f2(2),

end of it.

it-f1 = 'A'.

it-f2 = 'XX'.

append it to it. "appends header line IT to body IT

write: / 'sy-tabix =', sy-tabix.

it-f1 = 'B'.

it-f2 = 'YY'.

append it. "same as line 8

write: / 'sy-tabix =', sy-tabix.

it-f1 = 'C'.

append it. "the internal table now contains three rows.

write: / 'sy-tabix =', sy-tabix.

sy-tabix = 1

sy-tabix = 2

sy-tabix = 3

Порядок добавления строк во внутреннюю таблицу

Использование дополнения occurs

occurs не ограничивает число строк, которые могут быть добавлены к внутренней таблице. Например, если Вы определяете occurs 10, Вы можете поместить больше чем 10 строк во внутреннюю таблицу. Число строк, которые Вы можете поместить во внутреннюю таблицу, ограничено только количеством виртуальной памяти, доступной на сервере приложений.

Число, заданное в occurs определяет объем памяти, который будет выделяться при добавлении данных в таблицу. Например, при записи occurs 3 при добавлении первой записи будет выделена память для трех записей. При добавлении четвертой строки будет выделена память еще для трех записей и т.д.

При задании occurs 0, система распределяет по 8 КБ страниц памяти за один раз. Нет никаких преимуществ для использования occurs 0 кроме того факта, что проще записать occurs 0, чем оценить размер внутренней таблицы.

При определении внутренней таблицы, рекомендуется выбирать значение occurs, равное среднему максимальному числу строк в таблице.

Чтение данных из внутренней таблицы

Для чтения данных из внутренней таблицы используются следующие операторы:

  • loop at

  • read table

Цикл loop at используется для чтения множества строк внутренней таблицы. read table – для чтения только одной строки.

Чтение множества строк используя оператор loop at

Оператор loop at используется, чтобы прочитать несколько или все строки внутренней таблицы. Оператор loop at при чтении данных из внутренней таблицы, размещает их по одной записи в рабочую область.

loop at it [into wa] [from m] [to n] [where exp].

---

endloop.

  • it название внутренней таблицы.

  • wa – название рабочей области.

  • m и n – целочисленные литералы, константы, или переменные, представляющие относительный номер ряда. Например, 1 определят первую строку в таблице, 2 – вторую, и так далее.

  • exp – логическое выражение, ограничивающее строки, которые читаются.

  • --- представляет любое число строк программы.

Строки читаются из внутренней таблицы по одной и помещаются последовательно в рабочую область. Строки программы между loop и endloop выполняются для каждой прочитанной строки. Цикл заканчивается автоматически, когда последняя строка была почитана, затем выполняется оператор после endloop.

Особенности оператора:

  • у wa должна быть та же структура как и строка тела.

  • wa может быть строкой заголовка, или это может быть любой Field String , имеющий ту же самую структуру как строка в теле.

  • Если Вы не определяете рабочую область, по умолчанию система использует строку заголовка. Например, loop at it into it читает строки из внутренней таблицы it размещая их по одной в заголовок it . Эквивалентный оператор – loop at it.

  • Если from не определен, значение по умолчанию – читать с первой строки.

  • Если to не определен, значение по умолчанию – читать до последней строки.

  • Компонентам it определенным в логическом выражении не должно предшествовать название внутренний таблицы. Например, where f1 = 'X' правильно, но where it-f1 = 'X' вызовет синтаксическую ошибку.

  • exp может быть любым логическим выражением. Однако, первый операнд каждого сравнения должен быть компонентом внутренней таблицы. Например, если it содержит компонент f1, то where f1 = 'X' правильная запись; where 'X' = f1 неправильная запись и вызывает синтаксическую ошибку.

Дополнения from, to, и where не обязательны.

Внутри цикла loop, системная переменная sy-tabix содержит относительный номер текущей записи. Например, обрабатывая первую запись в внутренней таблице, значение sy-tabix будет 1. Обрабатывая вторую, sy-tabix будет 2. После выхода из цикла значение sy-tabix сброшено к значению, которое имела эта системная переменная до начала цикла. Если циклы вложены, значение в sy-tabix определяется текущим циклом.

После endloop, sy-subrc будет иметь значение нуль, если какие-нибудь строки были прочитаны, и принимать ненулевое значение, если никакие строки не читались из внутренней таблицы.