Значение Incorret Date передано в функцию Access VBA

Я пытаюсь рассчитать остаток отпуска в зависимости от типа контракта и статуса сотрудника. Функция проста, и формула работает нормально, но я не могу получить функцию для извлечения даты завершения из запроса. Дата завершения имеет значение 00:00:00, в то время как «Завершено» - ИСТИНА. Я попробовал функцию Dlookup для сбора данных, но не повезло, думаю, я нахожусь под знаменитым проклятием даты доступа. Заранее спасибо.

Мой запрос выглядит так: введите описание изображения здесь qryLeaveBalance

И моя функция:

Public Function LeaveBalanceCalc(EmployeeType As String, HiredDate As Date, Terminated As Boolean, Optional TerminatedDate As Date) As Double


Dim EarningRate As Double
Dim FirstMonthEarning As Double
Dim LastMonthEarning As Double
Dim enddate As Date

'First to determine the earning rate for the employee
    Select Case EmployeeType
        Case Is = "International"
            EarningRate = 4
        Case Else
            EarningRate = 1.25
    End Select

    enddate = Now()

    If Terminated = True Then

     enddate = TerminatedDate

    End If

            FirstMonthEarning = (DateDiff("d", HiredDate, LastOfMonth(HiredDate)) + 1) * (EarningRate / (DateDiff("d", FirstOfMonth(HiredDate), LastOfMonth(HiredDate)) + 1))

            LastMonthEarning = (DateDiff("d", FirstOfMonth(enddate), enddate) + 1) * (EarningRate / (DateDiff("d", FirstOfMonth(enddate), LastOfMonth(enddate)) + 1))

            LeaveBalanceCalc = FormatNumber((DateDiff("m", HiredDate, enddate) - 2) * EarningRate + FirstMonthEarning + LastMonthEarning, 2)

End Function

Привет всем,

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

Я пробовал некоторые другие способы; например, приведенный ниже код для функции вычисляет (правильно), только уволенные сотрудники и все остальные рассчитываются по дате 0 вместо Now () . Ниже альтернативная функция использует сам TerminationDate для определения и расчета баланса . Если для TerminationDate задано значение Nz, равное Now (), но выполняется повторная установка с датой 00:00:00.
Ниже приведена альтернативная функция;

Public Function LeaveBalanceCalc(EmployeeType As String, HiredDate As Date, TerminatedDate As Date) As Double

    '................................................................................................................................
    'Name:   LeaveBalanceCalc
    'Inputs: EmployeeType as string
    '        HiredDate as date
    '        TerminatedDate as date
    'Return: as Double
    'Date:   07/02/2020
    'Comment:This function is to calculate the earned leave days by longevity
    '.................................................................................................................................


    Dim EarningRate As Double
    Dim FirstMonthEarning As Double
    Dim LastMonthEarning As Double

    'First we need to determine the earning rate for the employee
        Select Case EmployeeType
            Case Is = "International"
                EarningRate = 4
            Case Else
                EarningRate = 1.25
        End Select


        If Nz(TerminatedDate) Then

            TerminatedDate = Now()

        End If

                FirstMonthEarning = (DateDiff("d", HiredDate, FirstOfMonth(HiredDate)) + 1) * (EarningRate / DateDiff("d", FirstOfMonth(HiredDate), LastOfMonth(HiredDate)))
                LastMonthEarning = (DateDiff("d", FirstOfMonth(TerminatedDate), TerminatedDate) + 1) * (EarningRate / (DateDiff("d", FirstOfMonth(TerminatedDate), LastOfMonth(TerminatedDate)) + 1))
                LeaveBalanceCalc = ((DateDiff("m", HiredDate, TerminatedDate)) * EarningRate) + FirstMonthEarning + LastMonthEarning

    End Function

Я был бы счастлив, если бы я мог заставить их работать.

Всего 1 ответ


Добро пожаловать в S / O. Хотя я не программирую с VB / Access, я могу предоставить это много ...

Дата - это дата, это дата ... Зачем пытаться преобразовать в DateSerial (). Тип данных «Дата» не заботится о визуальном выводе, основанном на международных предпочтениях месяц / день по сравнению с днем ​​/ месяцем, он хранится в формате даты. Дата такая, какая она есть.

Тем не менее, я бы упростил следующее (опять же, не будучи программистом на VB, меняйте синтаксис там, где это необходимо). Вы уже объявили переменную «enddate» в качестве поля даты, зачем запрашивать его DateSerial (). Это уже дата, просто примите значение Now (). После этого, если есть истекшая дата, укажите ее в дате окончания, чтобы занять ее место. Теперь вы ЗНАЕТЕ, что получаете правильную дату для целей расчета.

' no matter what, default the end date to whatever now is
enddate = Now()

' if terminated, use this to supersede
If Terminated = True
  enddate = TerminatedDate
End If

Теперь, после тестирования в Excel с Dates и DateDiff (), вам не нужно разбирать точные часы / минуты для вычислений, которые будут игнорироваться при тестировании для «d» ay (или любой другой части также)

a DateDiff() by day of 
ex : "2020-02-10 12:00:00AM" and "2020-02-11 12:00:00AM" will result in 1 DAY
AND: "2020-02-10 12:00:00AM" and "2020-02-11 11:47:32PM" will result in 1 DAY
AND: "2020-02-11 11:47:32PM" and "2020-02-12 12:00:00AM" and will result in 1 DAY
(even though it is only just over 12 minutes away, it still considers it as 1 day)

Затем у вас есть 2 даты для ваших вычислений ... endDate (через Now () или прекращено) и Hired Date. Завершить вычисления

FirstMonthEarning = (DateDiff("d", HiredDate, LastOfMonth(HiredDate)) + 1) * (EarningRate / (DateDiff("d", FirstOfMonth(HiredDate), LastOfMonth(HiredDate)) + 1))

LastMonthEarning = (DateDiff("d", FirstOfMonth(enddate), enddate) + 1) * (EarningRate / (DateDiff("d", FirstOfMonth(enddate), LastOfMonth(enddate)) + 1))

LeaveBalanceCalc = FormatNumber(((DateDiff("m", HiredDate, enddate ) - 2) * EarningRate) + FirstMonthEarning + LastMonthEarning, 2)

Есть идеи?

10000