![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Учет времени [D6, Win2k]
Pashkerton © (2004-10-13 13:11:00)Добрый день.
На SQL Server-e есть следующая таблица:
| cardcode | action | date | time |
где: cardcode - код сотрудника
action - событие (0-сотрудник ушел, 1-сотрудник пришел)
date - дата событи action
time - время события action
За один день сотрудник может несколько раз прийти на работу и уйти. Число приходов и уходов должно быть одинаковым. Отсюда вопрос - каким алгоритмом организовать поиск 'коллизий', если человек допустим лишний раз отметился, или вообще забыл отментится.
Ega23 (2004-10-13 16:00:00) [1]2 Pashkerton (13.10.04 15:46) [34]
date - дата
time - время
и
time_stamp - тут всё ясно
IMHO, для данной таблицы лишнее.
Вот наша структура аналогичной таблицы:
unid
PersId
datin
PointUID
ZoneFromUID
ZoneToUID
CardId
Pincode
CardNr
actFl
TraceTypCod
jack128 (2004-10-13 15:49:00) [2]Johnmen © (13.10.04 15:39) [31]
Не придираюсь я.. Я так... ;-)
Pashkerton (2004-10-13 15:46:00) [3]Да я же кусочек таблицы выдал на рассмотрение (и об этом я писал чуть выше). Вот 'полная версия':
|rkey|cardcode|date|time|tdatetime|terminalid|action|time_stamp|
rkey - это ясно
cardcode - код карты
date - дата
time - время
tdatetime - оно самое про что Вы писали
terminalid - идентификатор терминала с которого получена запись
action - событие
time_stamp - тут всё ясно
Reindeer Moss Eater (2004-10-13 15:43:00) [4]нету у нас datetime. У нас только DATE
Date тоже можно выкинуть.
И использовать числовой первичный ключ.
Система вполне эффективна для малых предприятий
Система вполне эффективна, если можно доверять её данным.
Если же их надо править руками, то это игра в систему.
Pashkerton (2004-10-13 15:40:00) [5]Система вполне эффективна для малых предприятий (у нас 52 человека). В помещении находится 2 терминала которые считывают штрихкоды с карточек (проходной нет, они просто висят на стеночке и глаза не мазолят). На сервере стоит SQL Server с работает сервис который постоянно опрашивает терминалы. В любой момент я могу узнать кто находится в помещении (если он не забыл отметится). Благодаря ей у человека получается 'свободный' график, 'чем больше работаешь - тем больше плучишь'.
Johnmen (2004-10-13 15:39:00) [6]>jack128 © (13.10.04 15:37) [30]
Ну зачем придираться. Это общая схема. Ничто не мешает подправить под раздельное хранение. Но я Пашкертону уже говорил, что такое разделение не только неудобно, но и вредно...
:)
jack128 (2004-10-13 15:37:00) [7]Johnmen © (13.10.04 15:27) [26]
Коллизии примерно так (при условии, что две соседние отметки не могут иметь одинаковое datetime):нету у нас datetime. У нас только DATE
Pashkerton (13.10.04 13:11)
date - датасобыти action
Reindeer Moss Eater (2004-10-13 15:32:00) [8]Коллизии такого рода можно обнаружить если чел забыл отметить приход или уход.
Если же он забудет и то и другое подряд, то коллизий не будет.
Зато будет фигня в табеле.
Reindeer Moss Eater (2004-10-13 15:30:00) [9]Я тебе не про таблицу и её структуру (Вполне корректную кстати).
А про системуучета рабочего времени.
Pashkerton (2004-10-13 15:28:00) [10]Спорить ни с кем не собираюсь. Как можно судить о чем то (в рамках существующей структуры...) по одной таблице. Предложил на рассмотрение вопрос в поисках интересных решений. Вывел на рассмотрение только те поля таблицы, которые вписывались imho в суть вопроса.
Johnmen (2004-10-13 15:27:00) [11]>jack128 © (13.10.04 15:19) [24]
Конечно.
>Pashkerton
Коллизии примерно так (при условии, что две соседние отметки не могут иметь одинаковое datetime):
SELECT * FROM Table T1
JOIN Table T2 ON (T1.cardcode=T2.cardcode) AND
(T1.datetime<T2.datetime) AND (T1.action =T2.action) AND
(T2.datetime-T1.datetime=(SELECT MIN(T3.datetime-T1.datetime)
FROM Table T3
WHERE (T3.cardcode=T1.cardcode) AND
(T3.datetime>T1.datetime))
Reindeer Moss Eater (2004-10-13 15:27:00) [12]Конечно возможно
jack128 (2004-10-13 15:19:00) [13]Johnmen © (13.10.04 14:38) [13]
в рамках существующей структуры таблицы это возможно ? ;-)
Reindeer Moss Eater (2004-10-13 15:09:00) [14]Сначала найти и уничтожить коллизии, а потом подсчитать время.
И как же посчитать время, если сытый чел пришел с обеда на час позже чем надо и забыл шоркнуть карточкой?
Для детского сада такая система учета времени.
Reindeer Moss Eater (2004-10-13 15:08:00) [15]Искать коллизии :
Строим курсор по регистрациям работника в хронологическом порядке.
Коллизии есть, если существует регистрация с таким же типом "x" и временем регистрации меньшим, чем ближайшая более поздняя регистрация противоположного типа (к регистрации из курсора)
Pashkerton (2004-10-13 15:07:00) [16]Сначала найти и уничтожить коллизии, а потом подсчитать время.
Johnmen (2004-10-13 14:58:00) [17]>Pashkerton
Уточни. Тебе надо считать "рабочее" время или искать коллизии ?
Reindeer Moss Eater (2004-10-13 14:56:00) [18]Я что-то полета мысли понять не могу.
Ставим систему. (Что бы иметь некие данные)
После чего зачем-то пытаемся найти софтварное подтверждение такой естественной особенности человека - "один раз пришел - один раз ушел (а не два)"
Потом ищем ошибки.
Потом их правим руками.
Потом на основе данных введенных руками делаем выводы о рабочем времени человека.
По моему сама система учета времени в этой изящной архитектуре - вещь лишняя.
Pashkerton (2004-10-13 14:51:00) [19]
> Reindeer Moss Eater
Утром пришел - отметился. 8.00
Пошел на обед - отметился - 13,00
Пришел сытый -не отметился - ~ 14.00
Поше домой - отметился - 17,00
А вообще я таких кадров насмотрелся. По секрету, есть такие сотрудники которым карточки вообще в руки давать не следует )
Reindeer Moss Eater (2004-10-13 14:44:00) [20]Если хотим узнать сколько времени чел был на работе, то надо при регистрации "выхода" искать последний вход и считать время.
Расчитав его, складывать в таблицу - табель.
Вот и все.