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

7. Формирование справки о динамике цен и выпуска изделий.

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

Формировать справку будем с помощью запроса на выборку. Источником данных для запроса является таблица данных о выпуске изделий TABV и связанная с ней таблица данных о предприятиях – TABP. Таблица TABP нужна только для того, чтобы взять из нее название предприятия.

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

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

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

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

Таким образом, необходимо:

-создать модуль-функцию, обрабатывающий одномерный массив с любым количеством элементов;

-в запросе о динамике при обращении к этой функции передавать в нее значение цен в каждом квартале для получения ответа о динамике цен, а второй раз использовать эту функцию , передавая в нее значения выпусков в каждом квартале для получения ответа о динамике выпуска. Назовем эту функцию Dinam.

Для написания функции из окна базы данных выберем объект Модули и режим Создать. Попадаем в окно редактора модуля, где можно написать код функции Dinam.

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

Синтаксис описания функции следующий:

[область видимости] Function имя_функции [ ( список_формальных_параметров ) ] [As тип_возвращаемого_значения]

<тело функции>

End Function

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

Список-формальных_параметров содержит список параметров, которые передаются функции при ее вызове и используются в теле функции как известные переменные, не требующие дополнительного объявления и ввода. Параметры отделяются друг от друга запятой. Возможно объявление функции без параметров.

Параметр ParamArray заменяет передачу в качестве параметра массива аргументов с переменным числом. Параметр должен иметь тип Variant.

Алгоритм функции решает задачу определения : является ли массив возрастающим, убывающим, постоянным или неупорядоченным. Для этого в алгоритме используются две логические переменные: Flr as Boolean и Flp as Boolean, так называемые флажки.

Присваивая этим флажкам истинные значения( Flr = true: Flp = true), мы предполагаем, что массив является возрастающим и убывающим одновременно, что невозможно и , следовательно , состояния флажков непременно изменятся. Так, если есть хоть одна пара элементов, в которой текущий элемент меньше предыдущего, то флажок Flr должен быть сброшен в состояние false, так как его утверждение, что массив возрастающий, неверно.

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

Если оба флажка останутся в истинном состоянии, это означает, что все элементы массива одинаковые, нет ни возрастающих пар, ни убывающих. Текст функции приведен ниже.

Public Function Dinam(ParamArray a() as variant) as string

Dim flr as Boolean ' флажок на постоянное возрастание элементов массива

Dim flp as Boolean ' флажок на постоянное убывание элементов массива

Dim i as integer ' параметр цикла и номер элемента массива

Dim st as string ' переменная для запоминания состояния массива

Flr = true ' элементы массива постоянно растут

Flp = true ‘ элементы массива постоянно убывают

For i=1 to 3 ‘ цикл просмотра соседних элементов массива

If a(i) > a(i-1 ) then flp = False ‘ i номер текущего элемента, i-1 - номер предыдущего

If a(i) < a(i-1 ) then flr = False ‘ в массиве 4 элемента с номерами от 0 до 3

Next i

If flr And flp Then st = “ Отсутствует” ‘ если оба флажка истинны , все элементы одинаковые

If flr And Not flp Then st = “ Рост“ ‘ если второй флажок ложен, элементы возрастают

If flp And Not flr Then st = “ Падение” ‘ если первый флажок ложен, элементы убывают

If Not flr And Not flp Then st= “ Колебание” ‘ если оба флажка ложны, наблюдается и

‘ возрастающие пары и убывающие

Dinam=st результат вычисления присваивается функции

End Function конец функции

Сохраним модуль с именем Dinamic (рис. 6).

Рис. 6. Вкладка «Модули» окна базы данных.

Создадим запрос по имени Zap1, обращающийся к функции Dinam. Запрос в режиме конструктора представлен на рисунке 7.

На языке SQL запрос формулируется следующим образом:

SELECT Tabv.Izd, Tabp.Pred, Dinam([zn1],[zn2],[zn3],[zn4]) AS [Динамика цен], Dinam([vp1],[vp2],[vp3],[vp4]) AS [ Динамика выпуска]

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

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

Рис. 7. Запрос для вывода динамики цен и выпуска в режиме конструктора.

.

Результат выполнения запроса представлен на рисунке 8.

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

Другим вариантом вывода справки может быть вывод результатов запроса в форму.

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

Из окна базы данных перейдем к объектам Формы в режим Создать. Выберем способ автоформа и тип формы ленточная, чтобы одновременно видеть все записи запроса. Источником данных для формы выберем запрос Zap1. На экране получим результат запроса, размещающийся в форме, но мало отличающийся от предыдущего.

Для корректировки формы перейдем в режим конструктора формы и отредактируем ее.

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

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

Область примечаний можно увеличить (ее не было видно в автоформе) и создать в ней два свободных поля и к ним по две метки (надписи).

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

В правой части расположим другую такую же группу из одного поля и двух меток. В верхнюю метку второй группы впишем текст « непрерывное падение выпуска по», в нижнюю метку второй группы - «изделиям».

Теперь надо определить значения свободных полей. Для этого выделим первое (левое) свободное поле (щелкнув по нему мышкой) и в окне свойств на вкладке «данные» в строке «данные» запишем следующее выражение:

=Dcount(“Izd”;”Zap1”;”[Динамика цен]=’Рост’”)

Можно также эту формулу вписать непосредственно в область созданного свободного поля.

В запросе Zap1 динамику цен мы сохранили в поле «Динамика цен», и теперь можем использовать его как условие вычисления количества записей, в которых это поле имеет значение ’Рост’.

Так как аргументы функции Dcount должны быть заключены в кавычки, а текстовая константа «Рост» тоже требует кавычек, то приходится использовать внутри двойных кавычек одинарные кавычки (апострофы).

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

Затем выделим второе (правое) свободное поле (щелкнув по нему мышкой) и в окне свойств на вкладке «данные» в строке «данные» запишем следующее выражение:

=Dcount(“*”;”Zap1”;”[Динамика выпуска]=’Падение’”)

«Динамика выпуска» - это созданное нами поле запроса Zap1, в котором мы сохранили динамику выпуска изделий. Так как нам нужно подсчитать количество записей, удовлетворяющим условию, то не имеет принципиального значения имя поля, указанного в первом аргументе функции, лишь бы оно было не пустое. Поэтому один раз мы указали в качестве аргумента поле Izd, а второй раз – символ “*”.

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

Вид конструктора формы представлен на рисунке 9.

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

Свойство «Данные» показывает источник данных для этого поля. В качестве источника используется формула, по которой подсчитывается это количество.

Рис. 9. Форма для вывода динамики цен и выпуска в режиме конструктора.

Результат проделанной работы можно наблюдать, открыв форму Formzap1 в режиме формы. Он представлен на рисунке 10.

Рис.10. Вывод сведений о динамике цен и выпуска с помощью формы.