Значение Incorret Date передано в функцию Access VBA - PullRequest
0 голосов
/ 10 февраля 2020

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

Мой запрос выглядит следующим образом: enter image description here 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

Привет всем,

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

Я пробовал другие способы; Например, приведенный ниже код для функции вычисляет (правильно), только Прекращено Сотрудники и все остальные рассчитываются по дате 0 вместо Now () . Ниже альтернативная функция использует TerminationDate для определения и вычисления Balance . Если для 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 Ответ

0 голосов
/ 10 февраля 2020

Добро пожаловать в 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 (), или прекращено ) и Дата приема на работу. Фини sh вычисления

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)
...