Страницы

воскресенье, 30 августа 2015 г.

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

Варианты 5-9

Составим примеры пользовательских функций для решения заданий 5-9 вариантов, при этом считаем, что массив Prod() уже получен, и число его элементов равно arg-1. Как получить этот массив, как использовать функцию в запросе, посмотрите в общем описании задания (ссылка внизу).

Вариант 5

Нужно создать функцию, которая возвращает количество элементов, содержащих значения больше среднего по массиву. В запросе нужно получить число месяцев с  выпуском больше среднего.
Текст функции
Public Function БольшеСреднего(ByVal arg As Integer, ParamArray Prod()) As Byte
Dim i As Integer        'счетчик цикла
Dim ChisloMes As Byte         'число месяцев с выпуском больше среднего
Dim sred As Double     'среднее значение
Dim sum As Long         'сумма выпусков

sum = 0
'расчет общей суммы выпуска
For i = 0 To arg - 2
    sum = sum + Prod(i)
Next i
'расчет среднего значения
sred = sum / (arg - 1)
'число месяцев с выпуском больше среднего
ChisloMes = 0
'если текущее значение больше среднего, то
'число месяцев увеличивается на 1
For i = 0 To arg - 2
    If Prod(i) > sred Then ChisloMes = ChisloMes + 1
Next i
'Функция возвращает число месяцев
БольшеСреднего = ChisloMes
End Function
Сначала в цикле находится общая сумма выпусков, затем она делится на число месяцев, чтобы найти среднее значение. Число месяцев возьмем из первого аргумента функции минус 1.
Затем в цикле перебираем все элементы массива и сравниваем со средним. Если элемент больше среднего, то увеличиваем счетчик.

Вариант 6

Находим максимальное и минимальное значение из массива элементов (в виде текста). Запрос - максимальный  и минимальный месячный выпуск.
Public Function MaxMin(ByVal arg As Integer, ParamArray Prod()) As String
    Dim i As Integer            'счетчик цикла
    Dim max As Integer             'максимальное значение выпуска
    Dim min As Integer             'минимальное значение выпуска
    'определяем максимум - 1 элемент массива
    max = Prod(0)
     'определяем минимум - 1 элемент массива
    min = Prod(0)
    For i = 1 To arg - 2
        'если элемент массива больше максимума
        If Prod(i) > max Then
            max = Prod(i)           'новое значение максимума
        End If
        'если элемент массива меньше минимума
        If Prod(i) < min Then
            min = Prod(i)           'новое значение минимума
        End If
    Next i
    'возвращаем результат - строку с двумя цифрами
    MaxMin = CStr(max) + " " + CStr(min)
End Function
Сначала принимаем за минимум и максимум первый элемент массива. Затем перебираем в цикле остальные элементы и сравниваем их с минимумом и максимумом. Если элемент больше максимума или меньше минимума, меняем значение экстремума на новое.

Вариант 7

Находим разность максимального и минимального значений из массива числовых переменных. В запросе выводим разность максимального и минимального выпусков.
Public Function MaxMin1(ByVal arg As Integer, ParamArray Prod()) As Integer
    Dim i As Integer            'счетчик цикла
    Dim max As Integer             'максимальное значение выпуска
    Dim min As Integer             'минимальное значение выпуска
    'определяем максимум - 1 элемент массива
    max = Prod(0)
     'определяем минимум - 1 элемент массива
    min = Prod(0)
    For i = 1 To arg - 2
        'если элемент массива больше максимума
        If Prod(i) > max Then
            max = Prod(i)           'новое значение максимума
        End If
        'если элемент массива меньше минимума
        If Prod(i) < min Then
            min = Prod(i)           'новое значение минимума
        End If
    Next i
    'возвращаем результат - строку с двумя цифрами
    MaxMin1 = max - min
End Function
Находим в цикле максимальный и минимальный элементы и возвращаем их разность. Если все значения одинаковые, то возвращается 0.

Вариант 8

Нужно получить количество максимальных значений в массиве (предполагается, что их несколько). В запросе выводится число месяцев с наибольшим выпуском.
Public Function MaxV3(ByVal arg As Integer, ParamArray Prod()) As Byte
    Dim i As Integer            'счетчик цикла
    Dim max As Integer             'максимальное значение выпуска
    Dim cntMax As Byte      'количество максимальных элементов
    'определяем максимум - 1 элемент массива
    max = Prod(0)
    cntMax = 1
     For i = 1 To arg - 2
        'если элемент массива больше максимума
        If Prod(i) > max Then
            max = Prod(i)           'новое значение максимума
            cntMax = 1 'начинаем новый отсчет максимальных элементов
        'если элемент массива равен максимуму
        ElseIf Prod(i) = max Then
            cntMax = cntMax + 1 'дополняем строку еще одним значением
        End If
    Next i
    'функция возвращает количество максимальных элементов
    MaxV3 = cntMax
End Function
Назначаем первый элемент массива максимумом, а затем в цикле сравниваем остальные элементы с ним. Если какой-то элемент больше текущего максимума, то назначаем новый максимум и снова начинаем счет максимальных элементов. Подсчитанное количество функция возвращает.
Если все значения равны, то возвращается число месяцев (то есть число всех элементов массива). Если такой результат не устраивает, то можно в конце функции сделать проверку на равенство найденного числа числу элементов массива:
    If cntMax = arg - 1 Then
        cntMax = 0
    End If
В этом случае вернется 0.

Вариант 9

Определить номера максимальных значений и вывести в запросе номера месяцев с максимальным выпуском.
Public Function MaxV4(ByVal arg As Integer, ParamArray Prod()) As String
    Dim str As String           'переменная для записи номеров месяцев
    Dim i As Integer            'счетчик цикла
    Dim max As Integer             'максимальное значение выпуска
    'определяем максимум - 1 элемент массива
    max = Prod(0)
    str = "1 "
     For i = 1 To arg - 2
        'если элемент массива больше максимума
        If Prod(i) > max Then
            max = Prod(i)           'новое значение максимума
            str = CStr(i + 1) + " "   'заполняем строку снова
        'если элемент массива равен максимуму
        ElseIf Prod(i) = max Then
            str = str + CStr(i + 1) + " " 'дополняем строку еще одним значением
        End If
    Next i
    MaxV4 = RTrim(str)   'убираем из строки последний пробел и возвращаем результат
End Function
Создаем переменную-максимум, приравниваем ее к первому элементу массива, в строку номеров добавляем число 1.
Затем в цикле перебираем элементы массива и сравниваем их с максимумом. Если элемент больше текущего максимума, значит, получаем новый максимум и начинаем заполнять строку снова – этим номером элемента (плюс 1, так как нумерация идет с 0).
Если все элементы равны, то функция вернет все номера месяцев. Если нужен другой результат, то следует добавить проверку равенства всех элементов или добавить счетчик максимальных номеров, а потом сравнить этот счетчик с количеством элементов массива.

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

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

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