Я пытаюсь рассчитать остаток отпуска в зависимости от типа контракта и статуса сотрудника. Функция проста, и формула работает нормально, но я не могу получить функцию для извлечения даты завершения из запроса. Дата завершения имеет значение 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)