- •Содержание
- •Repository
- •Средства тестирования и анализа
- •Утилита Workbench Organizer
- •Резюме
- •Резюме
- •Резюме
- •Глава 6.Моделирование сущностей и связей
- •Глава 10. Подпрограммы и функции
- •Создание функций увеличения возможности многократного использования текстов
- •Функциональные группы и функции
- •Чтение единственного элемента таблицы
- •Извлечение единственного поля
- •Получение статистической информации
- •Упорядочение результатов запроса
- •Динамическая выборка данных
- •Использование составных критериев выборки Select-Options
- •Динамическое присвоение имен таблиц
- •Вложенные циклы select
- •Представления, определенные в АВАР/4 Dictionary
- •Размер внутренней таблицы
- •Сортировка элементов внутренней таблицы
- •Вставка нескольких строк
- •Изменение таблиц базы данных с помощью команды update
- •Изменение отдельного элемента
- •Изменение нескольких элементов
- •Удаление элементов таблицы базы данных с помощью команды delete
- •Динамическое задание имен таблиц
- •Резюме
- •Временное хранение
- •Пропуск объектов
- •Использование локальных имен для объектов памяти
- •Очистка содержимого объектов памяти
- •Создание отчета
- •Сравнение двух отчетов, разработанных с использованием разных средств
- •Создание программного текста
- •Обработка данных с помощью событий get
- •Что применять: команду select или Logical Databases
- •Задание составных критериев выборки
- •Порядок обработки событий get
- •Работа с несколькими таблицами
- •Глава 16. Пользовательский интерфейс для создания отчетов
- •Определение параметров для экрана выбора
- •События экрана выбора
- •Повышение производительности программы
- •Резюме
- •Детализация объектов
- •Двойной щелчок мышью: событие at line-selection
- •Определение статуса графического интерфейса
- •Проектирование инструментальной линейки приложения
- •Изменение стандартной инструментальной линейки
- •Положение курсора и скрытая информация
- •Команда hide
- •Команда get cursor
- •Фреймы (кадры)
- •Глава 18. Выполнение программы-отчета
- •Вычисление даты в варианте
- •Описание учебной задачи
- •Создание диалоговой программы
- •Создание экрана
- •Задание фрейма с заголовком
- •Работа с сообщениями
- •Вывод сообщения из программы
- •Логический рабочий блок (LUW)
- •Механизм блокировки системы R/3
- •Глава 22. Расширенные функции графического интерфейса
- •Глава 25. Автоматическая генерация программы
- •Связь между программами
- •Вызов удаленной функции
- •Резюме
- •Удаление связей объектов
- •Резюме
- •Приложения
- •Использование Logical Databases при работе с утилитой АВАР/4 Query
- •Простейшие запросы
- •Получение перечня программных элементов
- •Создание заданий (Tasks) и запросы на изменения (Change Requests)
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
Изменениетаблицбазы
данных
•Вставка, изменение и удаление элементов в таблицах базы данных
•Работа с одним или несколькими элементами
•Статическое и динамическое задание имени таблицы
