Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Р. Кречмер, В. Вейс - Разработка приложений SAP R3 на языке АВАР4.pdf
Скачиваний:
532
Добавлен:
17.02.2016
Размер:
29.74 Mб
Скачать

142

Глава12

 

 

 

В данном случае рабочая область таблицы customers пересылается в строку заголовка foreign_customers_h, которая добавляется во внутреннюю таблицу.

Размер внутренней таблицы

Как упоминалось ранее, при разработке программы пользователю не нужно самостоятельно выделять память, поскольку АВАР/4 делает это автоматически. Например, заранее можно не определять максимальный размер внутренней таблицы. Единственное ограничение — размер виртуальной памяти компьютера, т.е. внутренняя таблица в действительности может содержать неограниченное число строк. Однако заданный в программе максимальный размер внутренней таблицы значительно ускорит ее выполнение. В АВАР/4 количество строк таблицы определяется по значению параметра счетчика Occurs Parameter (число, которое указывается после ключевого слова occurs в определении данных таблицы). Вычисленный размер таблицы (в байтах) является главным фактором, влияющим на скорость выполнения программы, и определяется как произведение длины строки на количество строк в таблице:

estimated_size = width * number_of_lines.

Длина строки определяется как сумма длин всех составляющих полей одной строки. Например, длина строки с 50 полями, каждое из которых имеет размер 4 байт, будет равна 200 байт.

Обычно при создании первого элемента таблицы система выделяет такой объем памяти, в котором можно разместить всю таблицу или по крайней мере блок размером 8-16 Кбайт. Таким образом, правильно задав Occurs Parameter, можно избежать выделения системой избыточного объема памяти. Число, задаваемое как параметр Occurs (точнее, правильное определение этого числа), играет особо важную роль, если в программе маленькие таблицы представляют собой части большой, имеющей много строк. Если Occurs Parameter установить слишком большим для мелких таблиц, входящих в большую, то память будет расходоваться напрасно, так как для каждой строки большой таблицы система должна выделить как минимум 8 Кбайт. Очень крупные таблицы нельзя разместить целиком в непрерывной области основной памяти, поэтому программа "перекидывает" некоторые части таблицы на диске в свои. Желательно не указывать Occurs Parameter для крупных таблиц, поскольку система всегда сама определяет свопинг, оптимальный с точки зрения использования памяти и времени центрального процессора.

Так как система выделяет память динамически (по мере необходимости), то при установке параметра счетчика Occurs Parameter следует помнить, что:

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

При невозможности определить размер таблицы установите значение параметра счетчика равным нулю. В этом случае система сама установит размер.

Если предполагаемый размер таблицы менее 8 Кбайт (например, пять строк длиной по 100 байт каждая, т.е. 500 байт), значение параметра счетчика задайте равным вычисленному количеству строк.

Если предполагаемый размер таблицы более 8 Кбайт, установите его равным нулю. В этом случае система сама установит размер таблицы.

Для очень больших внутренних таблиц (объемом, например, 10 Мбайт) лучше освободить необходимую память с помощью оператора free, который удаляет все строки, освобождая занимаемую ими память:

free all_customers .

Для удаления всех строк внутренней таблицы можно воспользоваться командой refresh, которая будет рассмотрена ниже. Память, отводимая для хранения локальных внутренних таблиц подпрограмм, освобождается автоматически при возврате управления в вызывающую программу.

Сортировка элементов внутренней таблицы

При заполнении внутренней таблицы одним из перечисленных ранее способов порядок элементов в ней не определен. Однако удобнее работать с таблицей, элементы которой упорядочены согласно какому-либо критерию сортировки. Легче всего это сделать, использовав команду sort (сортировать), простейшая синтаксическая форма которой приведена ниже:

data my_flights like a c t f l i occurs 10. sort my_f lights .

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

Использование внутренних таблиц

143

 

 

 

 

В таблице 12.4 приведено содержимое таблицы my_flights того же туристического агентства до применения к ней команды сортировки.

Таблица12.4

Неупорядоченнаятаблицаmy_flights

XYZ

0007

19990505

110

USD

133

ABC

1000

19991230

200

DEM

110

ABC

1234

19991231

300

DEM

020

XYZ

0006

19990606

100

USD 1

75

ABC

1234

19991230

500

DEM

010

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

Таблица12.5

Содержимое таблицы my_flights после обработки командой sort

ABC

1000

19991230

200

DEM

110

ABC

1234

19991230

500

DEM

010

ABC

1234

19991231

300

DEM

020

XYZ

0006

19990606

100

USD

175

XYZ

0007

19990505

110

USD

133

Кроме того, возможна сортировка таблицы по нескольким указанным полям: sort my_flights by fldate price.

В таблице 12.6 приведен вид той же таблицы my_flights после сортировки в соответствии с приведенным выше критерием. Приоритетным согласно порядку записи в операторе является поле fldate, a внутри этой отсортированной таблицы происходит сортировка по полю price.

Таблица 12.6

Содержимое таблицы my_flights после сортировки по полям fldate и price

XYZ

0007

19990505

110

USD

133

XYZ

0006

19990606

100

USD

175

ABC

1000

19991230

200

DEM

110

A8C

1234

19991230

500

DEM

010

ABC.

1234

19991231

300

OEM

020

Существует также возможность сортировки в обратном порядке с помощью ключевого слова descending (убывающий). По умолчанию порядок сортировки всегда возрастающий (ascending). Например, приведенные ниже строки позволяют упорядочить таблицу сначала в порядке возрастания номеров идентификаторов, а затем отсортировать в порядке убывания стоимости билета (т.е. наименьший номер идентификатора окажется первым, а внутри этой последовательности первой будет максимальная цена).

Глава13

Изменениетаблицбазы

данных

Вставка, изменение и удаление элементов в таблицах базы данных

Работа с одним или несколькими элементами

Статическое и динамическое задание имени таблицы