Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебник по аксес.doc
Скачиваний:
27
Добавлен:
14.11.2018
Размер:
1.62 Mб
Скачать

8. Формирование справки о максимальной стоимости выпуска изделий.

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

Последние вычисления относятся к типу итоговых вычислений.

Для решения поставленной задачи создадим сначала новый общий модуль Modmax. Назначение этого модуля – вычислять максимальное значение из четырех имеющихся, а также номер или номера максимальных значений среди них. Для большей универсальности решим эту задачу, исходя из того, что количество значений, среди которых происходит выбор максимального, является переменным.

Для создания модуля переходим на вкладку Модули окна базы данных, затем выбираем команду Создать.

Новый модуль будет состоять из двух функций:

- вычисление максимума из массива;

- вычисление номеров максимальных элементов массива в виде строки символов.

Поскольку обе функции используют максимальный элемент, то переменная, принимающая значение максимального элемента, объявляется глобальной и описывается в общей для всех процедур области (Option compare database. Dim m as integer).

Функция, вычисляющая максимум из массива, называется Maxv. В качестве формального параметра функции указан ParamArray a() as variant.

Такой параметр эквивалентен заданию в качестве формального параметра динамического массива по имени а, количество элементов которого заранее не известно, но будет определено в момент запуска функции. Элементов массива будет столько, сколько фактических параметров будет присутствовать в обращении к функции.

В программе используется оператор цикла For each…next.

Синтаксис этого оператора следующий:

For each <элемент> in <группа>

Тело цикла

next. <элемент>

Группой может быть любое поименованное множество, например массив. Элемент - это параметр цикла, который принимает очередное значение из группы для каждой итерации цикла. Элемент может быть только типа Variant или любого объектного типа.

Алгоритм поиска максимального элемента:

- переменной для хранения максимального значения m присваивается начальное значение, зависящее от диапазона поиска. Если поиск ограничен положительными числами, то начальным значением может быть ноль;

- в цикле для каждого нового значения элемента осуществляется его сравнение со значением текущего максимума (m), и большее значение запоминается в m;

- результат присваивается имени функции.

Текст функции приведен ниже:

Public Function Maxv(ParamArray a() as Variant) as Variant ‘ заголовок функции

Dim b as Variant ‘параметр цикла

m = 0 ‘ начальное значение максимума

For each b in a ‘ заголовок цикла

If b > m Then m = b ‘сравнение текущего элемента

Next b

Maxv = m ‘обязательный оператор функции

End Function

Функция, вычисляющая номера максимальных элементов массива называется Nommax. Она использует уже найденное в предыдущей функции значение глобальной переменной m и передаваемый в функцию массив а. В этой функции можно использовать тот же оператор цикла, но для номеров элементов массива нужно организовать счетчик, переменную I целого типа, значение которой увеличивается на единицу при каждом повторении цикла (I= I+1). Номера элементов, имеющих максимальное значение, собираются в строковую переменную с помощью операции сцепления & (конкатенации) этих номеров, преобразованных в строки символов стандартной функцией преобразования Str().

Алгоритм функции следующий:

- строке результата присваивается начальное значение «пусто»;

- в цикле каждый элемент массива сравнивается со значение максимума m, и номера элементов, равных максимальному, накапливаются в строковой переменной s;

- результат присваивается имени функции.

Текст функции:

Public Function Nommax(ParamArray a() as Variant) as string ‘заголовок функции

Dim I as Integer ‘ номер элемента

Dim b as Variant ‘ элемент цикла (параметр)

Dim s as String ‘ номера максимальных элементов

I = 0 ‘ начальное значение

S = “”

For each b in a ‘ заголовок цикла

If b = m Then s = s & str(I + 1) ‘ формирование результата

I = I + 1

Next b

Nommax = s ‘ обязательный оператор

End Function

Полный вид модуля представлен на рисунке 11.

Рис. 11. Текст модуля Modmax.

Теперь можно сформировать запрос на выборку, в котором мы будем обращаться к функции Maxv для подсчета максимальной стоимости выпуска. В качестве параметров будем передавать в нее произведения цен на выпуски по каждому кварталу. Результат сохраним в поле запроса maxvip. Для получения номеров кварталов с максимальной стоимостью будем обращаться к функции Nommax с теми же параметрами, а результат сохраним в поле запроса vcledkvart. Запрос выводит названия предприятий и названия изделий из двух таблиц, связанных по ключевому полю kodp (код предприятия).

Запрос в режиме SQL имеет следующий вид:

SELECT Tabp.pred, Tabv.izd, maxv(zn1*vp1,zn2*vp2, zn3*vp3,zn4*vp4) as maxvip,

nommax(zn1*vp1,zn2*vp2, zn3*vp3,zn4*vp4) as vcledkvart

FROM Tabv INNER JOIN Tabp ON Tabv.kodp=Tabp.kodp;

Вид запроса в режиме конструктора представлен на рисунке 12.

Рис. 12. Запрос о максимальной стоимости в режиме конструктора.

Сохраним запрос, присвоив ему имя Zapmax. Результат выполнения запроса представлен на рисунке 13.

Рис. 13. Результат выполнения запроса о максимальной стоимости выпуска.

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

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

С помощью итоговой функции Avg(), позволяющей вычислять среднее арифметическое из значений аргумента в различных записях, можно вывести среднее арифметическое из максимальных стоимостей выпуска различных изделий на различных предприятиях.

Создадим сначала автоформу, использующую в качестве источника данных запрос zapmax. Затем откорректируем ее, изменив область заголовка и увеличив область примечаний.

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

=Max(maxvip).

Вторая метка соответствует надписи ко второму свободному полю, основным свойством которого будет свойство данные на вкладках данные или все. Значение этого свойства определим так:

=Avg(maxvip).

Вид созданной формы в режиме конструктора приведен на рисунке 14.

Сохраним форму с именем Zapmax.

.

Рис.14. Форма Zapmax в режиме конструктора.

Для того, чтобы увидеть результаты конструирования, откроем сохраненную форму в режиме формы.

Справка о максимальной квартальной стоимости выпуска, выведенная с помощью запроса и формы, приведена на рисунке 15.

Рис.15. Просмотр формы Zapmax в режиме формы.