Страницы

четверг, 27 августа 2015 г.

Пользовательские функции в Access Часть 1

Пакеты прикладных программ офисного назначения и программирование – задание 1
В этом посте, мои дорогие читатели, я дам вам несколько советов, как создавать и применять пользовательские функции в Access, а также как передавать разное число аргументов в функцию и использовать массивы. Язык VBA.
Задание
- Создать новую базу данных, а в ней – таблицу с записями приведенной структуры:


Предприятие – название предприятия, Продукция – название продукции, Вып_1, … Вып_6 – данные о выпуске продукции (целые числа) по месяцам полугодия, выраженные в одной и той же единице измерения.
- Заполнить таблицу данными (примерно 15 – 20 записей). Данные выбирать произвольно. Данные должны демонстрировать различные варианты выполнения последующего запроса, для чего их в процессе работы нужно корректировать.
- Создать общий модуль, а в нем – пользовательскую функцию для вычисления -**** Варианты задания ****- из массива числовых переменных. В функции использовать массив и цикл.
- Создать запрос для получения справки следующего вида:


В запросе должно присутствовать обращение к созданной пользовательской функции.
- Выполнить запрос.
Варианты:

0. Максимальное значение. Запрос - максимальный месячный выпуск
1. Характер изменения значений в массиве переменных (от первого к последнему). Возможные варианты : «Рост», «Падение», «Колебание», «Постоянен». Запрос – Динамика изменения выпуска.
2. Номера минимальных значений. Если их несколько, вернуть строкой через пробел. Запрос – номера месяцев  с минимальным выпуском.
3. Номера элементов, содержащих значения больше среднего по массиву. Вернуть строкой. Запрос - Номера месяцев с  выпуском больше среднего.
4. Номера элементов, содержащих значения меньше среднего по массиву. Вернуть строкой. Запрос - Номера месяцев с  выпуском меньше среднего.
5. Количество элементов, содержащих значения больше среднего по массиву. Запрос - Число месяцев с  выпуском больше среднего.
6. Максимальное и минимальное значение из массива элементов (в виде текста). Запрос - Максим-й  и миним-й месячный выпуск.
7. Разность максимального и минимального значений из массива числовых переменных. Запрос - Разность максим-го и миним-го выпусков.
8. Количество максимальных значений в массиве (предполагается, что их несколько). Запрос - Число месяцев с наибольшим выпуском.
9. Номера максимальных значений. Запрос - Номера месяцев с максимальным выпуском.
Нам нужно создать функцию, которая принимала бы список аргументов, обрабатывала их и возвращала результат. Список параметров функции может быть постоянным и переменным.
Постоянное число параметров – когда функция принимает определенное число, которое прописано в программе. То есть в нашем случае - это шесть значений выпуска. Семь значений, или пять, или все выпуски за год уже будет не посчитать. Думаю, что в этом задании как раз и предусматривается подобный вариант.
Но на всякий случай рассмотрим функцию с переменным числом параметром. Она гораздо удобнее в работе и позволяет расширить возможности программы. В этом случае в функцию передается число аргументов, указанное пользователем, и массив значений. То есть можно посчитать и за квартал, и за полугодие.
Сделаем оба способа, и вы поймете разницу.
Итак, создаем базу данных в Access. Создаем в ней таблицу на восемь полей. Два поля – текстовые, остальные можно сделать целыми. Придумываем предприятия и продукцию, заполняем числовые данные. Я не описываю все подробно. Если уж с вас спрашивают программирование VBA, то создание баз не является трудностью, скорее всего.
Для создания функции переходим в редактор Visual Basic. На вкладке «Создание» в разделе «Другие» из раскрывающегося списка «Макрос» выбираем пункт «Модуль». Открывается редактор кода VBA. Или Alt+F11.
Функцию можно вставить с помощью меню Insert->Procedure или написать прямо в модуле.

Создание функции в редакторе VBA

Обратите внимание, выбираем именно функцию (Function), а не процедуру, так как нужно получить возвращаемое значение.
Создаем функцию для расчета максимального выпуска (0 вариант).
1 способ
Принимаем шесть аргументов, заполняем массив и ищем максимум.
Текст функции:
Public Function MaxV(v1 As Integer, v2 As Integer, v3 As Integer, v4 As Integer, v5 As Integer, v6 As Integer) As Integer
    Dim prod(1 To 6) As Integer    'массив значений выпуска за 6 месяцев
    Dim i As Integer            'счетчик цикла
    Dim max As Integer             'максимальное значение выпуска
    'заполняем массив
    prod(1) = v1
    prod(2) = v2
    prod(3) = v3
    prod(4) = v4
    prod(5) = v5
    prod(6) = v6
    'определяем максимум - 1 элемент массива
    max = prod(1)
    For i = 2 To 6
        'если элемент массива больше максимума
        If prod(i) > max Then
            max = prod(i)           'новое значение максимума
        End If
    Next i
    MaxV = max   'возвращаем результат
End Function
Теперь идем в конструктор запросов и создаем там запрос, добавляем в него поля Предприятие и Продукция. На третьем поле нажимаем правую кнопку мыши и выбираем пункт меню «Построить». Открывается Построитель выражений. Слева, в разделе «Элементы выражений» раскрываем список функций и выбираем название нашей базы данных – тест. Появляются доступные модули и созданные пользовательские функции. Выбираем нашу функцию – MaxV, два раза щелкаем на ней.

Пользовательская функция в запросе Access

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

Пользовательская функция в запросе Access

Нажимаем ОК, меняем название поля с «Выражение1» на что-нибудь подходящее и запускаем запрос.
Второй способ
Сейчас создадим второй вариант этой функции, назовем его MaxV1.
Public Function MaxV1(ByVal arg As Integer, ParamArray Prod()) As Integer
    Dim i As Integer            'счетчик цикла
    Dim max As Integer             'максимальное значение выпуска
    'определяем максимум - 1 элемент массива
    max = Prod(0)
    For i = 1 To arg - 2
        'если элемент массива больше максимума
        If Prod(i) > max Then
            max = Prod(i)           'новое значение максимума
        End If
    Next i
    MaxV1 = max   'возвращаем результат
End Function
Функция получает аргументы – число аргументов (в данном случае, это 6 значений выпуска плюс первый аргумент – всего 7) и массив аргументов ParamArray.
Нужно иметь в виду, что нумерация элементов в этом массиве начинается с 0, поэтому первый элемент у нас Prod(0), а последний – Prod(arg-2).
Преимущества этого способа - мы не заполняем вручную массив, он передается по ссылке, а также можно рассчитывать не только выпуски за 6 месяцев, но и за другое число. Но при этом при создании запроса необходимо менять первый аргумент функции, зато код функции остается прежним.
Вот как выглядит в данном случае выражение в третьем поле запроса:

Пользовательская функция в запросе Access

Пользовательская функция в запросе Access

Можете выбрать вариант, который вам понятней или больше нравится.

Еще по этому заданию

Пользовательские функции в Access - варианты 1-4
Пользовательские функции в Access - варианты 5-9

Общий список всех сообщений по этой работе