Страницы

суббота, 29 августа 2015 г.

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

Варианты 1- 4

В этом посте я вкратце опишу, как можно сделать другие варианты, при этом буду считать, что массив Prod() уже получен, и число его элементов равно arg-1.

1 вариант

Определяем динамику изменения выпуска.
Создаем функцию Динамика и в ней массив (или получаем его).
Public Function Динамика(ByVal arg As Integer, ParamArray Prod()) As String
    Dim d_up As Boolean             'логическая переменная - был ли рост
    Dim d_down As Boolean           'логическая переменная - было ли падение
    Dim i As Integer                'счетчик цикла
    Dim p As Integer                'переменная для сравнения значений массива
           
    'присваиваем начальные значения логическим переменным
    d_up = False
    d_down = False

    'первое значения для сравнения
    p = Prod(0)
        'в цикле сравниваем последовательно элементы массива
    'если следующий элемент массива больше, чем предыдущий, значит, был рост
    'если следующий элемент массива меньше, чем предыдущий, значит, было падение
    'если они равны, то значения постоянны
    For i = 1 To arg - 2
        If p < Prod(i) Then
            d_up = True
        ElseIf p > Prod(i) Then
            d_down = True
        End If
        p = Prod(i)
    Next i
    'если был рост и падение, то возвращаем Колебание
    If (d_up = True) And (d_down = True) Then
        Динамика = "Колебание"
        'если не было ни роста, ни падения, то возвращаем Постоянен
    ElseIf (d_down = False) And (d_up = False) Then
        Динамика = "Постоянен"
        'если не было падения, а только рост и постоянство (или только рост), то возвращаем Рост
    ElseIf d_down = False Then
        Динамика = "Рост"
        'Если не было роста, а только падение и постоянство (или только падение), то возвращаем Падение
    ElseIf d_up = False Then
        Динамика = "Падение"
    End If
End Function

Вариант 2

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

Вариант 3

Определить номера элементов, содержащих значения больше среднего по массиву. Вернуть строкой. В запросе вывести номера месяцев с  выпуском больше среднего.
Принцип выполнения тот же, что и в первом варианте, но сравниваем не с минимумом, а со средним значением:
Public Function sred1(ByVal arg As Integer, ParamArray Prod()) As String
    Dim str As String           'переменная для записи номеров месяцев
    Dim i As Integer            'счетчик цикла
    Dim sred As Double             'среднее значение выпуска
    Dim sum As Integer             'сумма всех значений
    sum = 0     'обнуляем сумму
    'находим сумму всех выпусков в цикле
    For i = 0 To arg - 2
        sum = sum + Prod(i)
    Next i
    sred = sum / (arg - 1)
    str = ""
     For i = 0 To arg - 2
        'если элемент массива больше среднего
        If Prod(i) > sred Then
            str = str + CStr(i + 1) + " " 'дополняем строку еще одним значением
        End If
    Next i
    sred1 = RTrim(str)   'убираем из строки последний пробел и возвращаем результат
End Function
Обратите внимание: если все значения равны, то строка будет пустой.

Вариант 4

Определить номера элементов, содержащих значения меньше среднего по массиву. Вернуть строкой. В запросе вывести номера месяцев с  выпуском меньше среднего.
Делаем так же, как во 2 варианте, только меняем знак > на < при сравнении в цикле.
Public Function sred2(ByVal arg As Integer, ParamArray Prod()) As String
    Dim str As String           'переменная для записи номеров месяцев
    Dim i As Integer            'счетчик цикла
    Dim sred As Double             'среднее значение выпуска
    Dim sum As Integer             'сумма всех значений
    sum = 0     'обнуляем сумму
    'находим сумму всех выпусков в цикле
    For i = 0 To arg - 2
        sum = sum + Prod(i)
    Next i
    sred = sum / (arg - 1)
    str = ""
     For i = 0 To arg - 2
        'если элемент массива больше среднего
        If Prod(i) < sred Then
            str = str + CStr(i + 1) + " " 'дополняем строку еще одним значением
        End If
    Next i
    sred2 = RTrim(str)   'убираем из строки последний пробел и возвращаем результат
End Function

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

Пользовательские функции Access (ППП) – общее описание
Пользовательские функции в Access - варианты 5-9

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