Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вычисление трудового стажа на Access 97

Автор: serjk
Дата сообщения: 29.03.2005 22:17
Уважаемые коллеги.
Подскажите, пожалуйста каким образом подсчитать в Access 97 стаж работы сотрудника, исходя из даты приема на работу в формате день/месяй/год (занесенной в таблицу) и вводимой оператором даты в такой же форме, т.е. трудовой стаж работника (с понятием "високосный год")?
Автор: matt
Дата сообщения: 29.03.2005 22:28
serjk
с какой точностью? до года? или количество дней?
Автор: serjk
Дата сообщения: 29.03.2005 23:18
Конечно, с точностью до дня.
Автор: matt
Дата сообщения: 30.03.2005 00:06
serjk
тогда так (с помощью макросов):

DateValue("30.03.05") - DateValue("30.03.04")

ну, естественно, свои даты подставишь.
Автор: dneprcomp
Дата сообщения: 30.03.2005 02:07
matt
Если я не путаю, то DateValue просто выполняет конверсию в формат Date.
serjk
Надо использовать функцию DateDiff
DateDiff("y", #вводимая оператором дата#, #датa приема на работу#)
или
DateDiff("d", #вводимая оператором дата#, #датa приема на работу#)
даст разницу в днях.
Високосные годы функция учтет автоматически сама.
Автор: matt
Дата сообщения: 30.03.2005 06:23
dneprcomp

Цитата:
Если я не путаю, то DateValue просто выполняет конверсию в формат Date

проверено экспериментально.
Автор: serjk
Дата сообщения: 30.03.2005 06:50
Будем пробовать.
Спасибо всем.
Автор: dneprcomp
Дата сообщения: 30.03.2005 19:06
matt

Цитата:
проверено экспериментально

Что проверено? Что не работает?
DateValue это встроенная функция, а не макрос. Если это действительно название макроса в твоей базе, то возможно кто-то написал такой макрос по пересчету дат в дни и он отрабатывает вместо встроенной функции. Но такого макроса больше ни у кого в базах нет.

Добавлено:
А собственно говоря, чему равно DateValue("30.03.05") ?
Автор: matt
Дата сообщения: 31.03.2005 06:51
dneprcomp
DateValue - встроенная функция.
Напиши процедуру с единственной строкой:

MsgBox(DateValue("30.03.05") - DateValue("30.03.04"))

ответ: 365
Автор: dneprcomp
Дата сообщения: 31.03.2005 09:23
matt
Написал. Получил error 13: "Type Mismatch".
Предлогаю посмотреть описание в хелпе для данной функции:
Returns a Variant (Date).
Пример использования:
MyDate = DateValue("February 12, 1969") ' Return a date
Как удается из даты вычесть дату в твоей базе?
Автор: matt
Дата сообщения: 02.04.2005 08:25
dneprcomp

Цитата:
аписал. Получил error 13: "Type Mismatch".


странно... а что за офис? у меня в хр все без ошибок выдает и с учетом высокосных годов.
Автор: dneprcomp
Дата сообщения: 02.04.2005 08:43
matt

Цитата:
а что за офис

97-й и 2002-й. А что в хелпе о DateValue написано?
Автор: matt
Дата сообщения: 02.04.2005 18:57
dneprcomp

Цитата:
А что в хелпе о DateValue написано?


написано:

Returns a Variant (Date).
Автор: dneprcomp
Дата сообщения: 02.04.2005 21:00
matt
Ну если Returns a Date, то каким образом получается 365?
Есть ли макрос DateValue?
Автор: matt
Дата сообщения: 02.04.2005 22:41
dneprcomp
ну, елки-палки! не я ж реализовывал функцию DateValue и преобразование типов!!! Не знаю, как оно работает, но работает 100 пудов!!! Я уже раза 3 проверял пока с тобой дискутировал. И макросов DateValue тоже нет - 100 пудов.
Автор: dneprcomp
Дата сообщения: 04.04.2005 09:04
matt
А у меня не работает, что является правильным
Во всяком случае, когда перестанет, будешь хоть знать почему
Автор: matt
Дата сообщения: 04.04.2005 14:57
dneprcomp
ок
Автор: serjk
Дата сообщения: 26.04.2005 14:20
Снова хочу вернуться к обсуждаемому вопросу.
Кол-во дней между двумя датами вычисляется при помощи ф-ции DateDiff.
Но для отдела кадров, бухгалтерии кол-во дней, к примеру, 4598 ничего не говорит. Нужно кол-во дней преобразовать в формат, как я писал выше, в кол-во #год/месяц/дней#, проработавшего сотрудником.
Есть ли в Access'е встроенная ф-ция реализующая это?
Если нет, то каким образом это можно реализовать?
Автор: dneprcomp
Дата сообщения: 26.04.2005 22:36
serjk
Date1 начальная дата
Date2 текущая дата
Date3=1-е число следующего месяца после Date2
пример: if Date2=1955/3/14 then Date3=1955/4/1

годы=DateDiff("yyyy", Date2, Date1)учитывая
Цитата:
When comparing December 31 to January 1 of the immediately succeeding year, DateDiff for Year ("yyyy") returns 1 even though only a day has elapsed.
месяцы=DateDiff("m", Date2, Date1) - годы*12
дни=DateDiff("d", Date3, Date2) + (quantity of Days from Date1)
пример: if Date1=1955/3/14 then (quantity of Days from Date1)=14
Автор: GrayElf
Дата сообщения: 27.04.2005 05:31
dneprcomp
Функция DateValue преобразует строку в формат Date, целая часть которого - количество дней, прошедших с какой-то даты (01.01.1900 что ли), поэтому по методу matt`а все работает правильно
Автор: dneprcomp
Дата сообщения: 27.04.2005 09:36
GrayElf

Цитата:
Функция DateValue преобразует строку в формат Date, целая часть которого - количество дней
Извини, но я просто не понимаю, что ты тут написал. Откуда в переменной формата Date возьмется целочисельная часть? Это же 2-а разных формата. Они по определению не могут находиться в одной переменной. Нельзя ли указать где об этом можно прочитать. В хелпе Access такого нет.
Автор: GrayElf
Дата сообщения: 27.04.2005 12:01
dneprcomp
Справка по Visual Basic в Access:

When other numeric types are converted to Date, values to the left of the decimal represent date information while values to the right of the decimal represent time. Midnight is 0 and midday is 0.5. Negative whole numbers represent dates before 30 December 1899.

При конверсии из других цифровых типов в тип Date, значения слева от запятой - информация о дате, слева - о времени. Полночь - 0, полдень - 0,5. Отрицательные числа представляют даты до 30 декабря 1899 г.

Примерно так переводится.

Обратное преобразование работает аналогично, т. е. когда цифровому типу присваивают разность дат, целая часть - количество дней
Автор: dneprcomp
Дата сообщения: 27.04.2005 21:41
GrayElf
Да, правильно. Теперь разобрался. Пример matt у меня по прежнему нигде не работает. По matt:
MsgBox DateValue("30.03.05") - DateValue("30.03.04")
А вот так работает
MsgBox DateValue("30/03/05") - DateValue("30/03/04")
Но все равно, я считаю, что лучше использовать DateDiff, чем пользоваться скрытыми, в какой-то мере не документированными, внутренними преобразованиями.
Автор: serjk
Дата сообщения: 24.05.2005 22:56
Привет всем.
Спасибо за предыдущие советы. Все сделано и работает.
Появился еще маленький вопрос. Натолкните на мысль, как сделать следующее:
Каждый человек имеет свое число проработавших дней. Надбавки к зарплате начисляются в засисимости от граничного числа отработанных лет.
Пример - проработал > 5лет , получаешь + 10%, >10, то +20%. Как привязать эти числа надбавок к кол-ву проработанного времени и вывести их в форму соответственно человеку.
Понимаю, что может вопрос и тупой, но пришлось с нуля осваивать Access и в сжатые сроки предоставить результаты.
Автор: dneprcomp
Дата сообщения: 25.05.2005 06:48
serjk
К примеру, создаешь таблицу на 2 поля: надбавка, срок. Можно конечно все сразу в код добавить, в массив. Но с таблицей потом легче менять. Если понадобиться. Из таблицы опять же загружаешь в массив. Как найти количество лет уже знаешь. По циклу сравниваешь со значением в массиве.
Автор: serjk
Дата сообщения: 25.05.2005 09:15

Цитата:
Из таблицы опять же загружаешь в массив. Как найти количество лет уже знаешь. По циклу сравниваешь со значением в массиве

Можно с этого места поподробнее, т.е. разжевать.
Автор: dneprcomp
Дата сообщения: 25.05.2005 23:48
serjk

Цитата:
Из таблицы опять же загружаешь в массив

Об'являешь динамический массив
Dim arAdd() As Integer
Dim i as Integer
Dim x as Integer
Dim s as Integer 'надбавка

Находишь RecordCount
i=CountRecords - 1
ReDim arAdd(1, i)
загоняешь в цикле в массив значения из table
x=0
Do while not .EOF
arAdd(0, x)="надбавка"
arAdd(1, x)="срок"
x=x+1
Loop

В цикле проверяешь на соответствие условию
For x=0 to i
Условия проверок накрутить по вкусу
if arAdd(1, х) => "количество лет " and arAdd(1, х+1) < "количество лет " then
s=arAdd(0, х)
Exit For
End If
Next


Function CountRecords() 'из хелпа
Dim dbs As Database, rst As Recordset

' Return reference to current database.
Set dbs = CurrentDb
' Open table-type Recordset object.
Set rst = dbs.OpenRecordset("Orders")
CountRecords=rst.RecordCount
'Debug.Print rst.RecordCount
rst.Close
Set dbs = Nothing
End function



Добавлено:
GrayElf
Только сейчас дошло, что работа DateValue - DateValue зависит от локальных настроек компьютера. Еще одно доказательство в пользу DateDiff
Автор: serjk
Дата сообщения: 26.05.2005 21:38
Посмотрите, правильно ли реализован пересчет стажа в формате "кол-во в днях" в формат "кол-во дней, месяцев, дней"?
=DateValue(Now())-DateValue([Дата прийома])-30
Волнует правильность числа -30. Но без этого отображается +1 месяц к стажу.
В региональных настройках компьютера ставлю краткий формат даты для скрытия 2-х сташих разрядов года.

Автор: dneprcomp
Дата сообщения: 27.05.2005 03:51
serjk
А ты не мог бы использовать нормальную функцию DateDiff вместо того, чтобы бороться с региональными сеттингами. А что будешь делать, если програму надо будет установить на нескольких компьютерах? Бегать менять сетинги? А если юзер будет менять регулярно?
Автор: serjk
Дата сообщения: 27.05.2005 07:24

Цитата:
А что будешь делать, если програму надо будет установить на нескольких компьютерах? Бегать менять сетинги? А если юзер будет менять регулярно?


Конечно, буду дорабатывать.
А база будет стоять только на одном, максимум двух компьютерах в отделе по работе с личным составом. Ну, как настройки поменяют, так и вернутся назад

Страницы: 12

Предыдущая тема: Какие программные продукты часто использует программист


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.