Перейти к содержимому


Табель учета рабочего времени


Сообщений в теме: 17

#1 dev77rus

    Активный участник

  • Пользователи
  • PipPipPip
  • 114 сообщений
  • Пол:Мужчина

Отправлено 04 Сентябрь 2012 - 16:18

Есть задача, не знаю как подступиться.
Необходимо ежемесячно составлять табель учета рабочего времени сотрудников.
Как я вижу, нужно каждый месяц в таблицу вносить всех сотрудников, чтобы сделать определенное количество записей за месяц.
Это неудобно и сложно, большая вероятность совершить ошибку, почти ручной труд, несмотря на богатые возможности программы.
Как такую задачу можно автоматизировать? Например выбираешь создание записи - /август/ /2012 год/, а в этой записи уже есть все строки с работающими на данный момент сотрудниками.

И второй вопрос - в табеле обычно проставляется период - год и месяц без числа, в КБ такого поля нет, а полную дату ставить - как-то неправильно.
Насколько правильным будет вариант создать два справочника "годы" и "месяцы" и использовать для идентификации два поля? Как однозначно прикрепить к такой таблице подчиненные записи, ведь в КБ нет двойных ключей? По ID самой записи тоже кажется не очень удобным.

Прошу прощения за сумбур.
Заранее спасибо.

Сообщение отредактировал dev77rus: 04 Сентябрь 2012 - 16:47


#2 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 05 Сентябрь 2012 - 11:03

Цитата

Как такую задачу можно автоматизировать?
С помощью доп.действия, к примеру.

Цитата

И второй вопрос - в табеле обычно проставляется период - год и месяц без числа, в КБ такого поля нет, а полную дату ставить - как-то неправильно.
В чем проблема использовать список? Справочники для этого излишни.

#3 dev77rus

    Активный участник

  • Пользователи
  • PipPipPip
  • 114 сообщений
  • Пол:Мужчина

Отправлено 06 Сентябрь 2012 - 13:42

Здравствуйте, проблема использовать список в том, что таких таблиц будет несколько, например штук десять и для каждой создавать поля со списками, а в случае чего и править их - довольно неудобно, возникает вероятность ошибок. Создавать список вида 01.2005 и далее - вообще не элегантно.
Если я не прав, поправьте пожалуйста меня.

Что касается допдействия, не могли бы вы подсказать алгоритм решения задачи?


#4 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 06 Сентябрь 2012 - 14:15

Цитата

проблема использовать список в том, что таких таблиц будет несколько, например штук десять и для каждой создавать поля со списками, а в случае чего и править их - довольно неудобно, возникает вероятность ошибок. Создавать список вида 01.2005 и далее - вообще не элегантно.

Не понял, зачем вам править список вида "январь февраль и т.д."? Он практически вечный. Список лет тоже можно с запасом сделать. Тем список и отличается, что он постоянен, как в данном случае. Про "01.2005" речь вообще не шла. Так что, одна у вас такая таблица или десять - это без разницы, поля в любом случае настраивать 1 раз.

Цитата

Что касается допдействия, не могли бы вы подсказать алгоритм решения задачи?

Я бы сделал так: для начала разделил табель на основную и подчиненные записи. В основной задается год и месяц. Затем жмете на доп.действие, которое добавляет к ней подчиненные записи в виде списка сотрудников.

#5 dev77rus

    Активный участник

  • Пользователи
  • PipPipPip
  • 114 сообщений
  • Пол:Мужчина

Отправлено 06 Сентябрь 2012 - 16:44

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

#6 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 06 Сентябрь 2012 - 17:12

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

#7 dev77rus

    Активный участник

  • Пользователи
  • PipPipPip
  • 114 сообщений
  • Пол:Мужчина

Отправлено 07 Сентябрь 2012 - 08:58

Я и не считаю что вы настаиваете :) Спасибо, что высказываете свое профессиональное мнение.
Скажите, как упорядочить (возрастание, убывание, сортировка) в таблице строки по полю со списоком типа "январь, февраль и т.д."?

#8 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 07 Сентябрь 2012 - 09:25

Сортировка по полю с типом "список" идет по алфавиту (а не порядку элементов списка), поэтому если вам нужна сортировка по порядку месяцев, то видимо придется использовать поле "связь" со справочником (в котором изначально задан нужный порядок). Хотя, честно говоря, не очень понял, зачем вам в данном случае нужна сортировка.

#9 dev77rus

    Активный участник

  • Пользователи
  • PipPipPip
  • 114 сообщений
  • Пол:Мужчина

Отправлено 07 Сентябрь 2012 - 09:38

Задача не ограничивается только табелем рабочего времени, да и в нем, если захочется посмотреть результат за год в таблице, сортировка месяцев по алфавиту будет выглядеть весьма странно. С любыми учетными данными, которые имеют привязку к периоду (неделя, месяц, квартал, год), удобнее работать и анализировать их по порядку этих периодов, а не по алфавиту.

Сообщение отредактировал dev77rus: 07 Сентябрь 2012 - 09:39


#10 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 07 Сентябрь 2012 - 10:09

Периоды, в том числе и в табеле, обычно уже заносятся по порядку (т.е. вначале я завел записи за январь, а потом уже за февраль), поэтому сортировка там как правило не нужна - меня именно это удивило. Но если уж действительно для вас это актуально - используйте справочники.

#11 dev77rus

    Активный участник

  • Пользователи
  • PipPipPip
  • 114 сообщений
  • Пол:Мужчина

Отправлено 03 Октябрь 2012 - 14:49

Просмотр сообщенияdev77rus (04 Сентябрь 2012 - 16:18) писал:

Есть задача, не знаю как подступиться.
Необходимо ежемесячно составлять табель учета рабочего времени сотрудников.
Как я вижу, нужно каждый месяц в таблицу вносить всех сотрудников, чтобы сделать определенное количество записей за месяц.
Это неудобно и сложно, большая вероятность совершить ошибку, почти ручной труд, несмотря на богатые возможности программы.
Как такую задачу можно автоматизировать? Например выбираешь создание записи - /август/ /2012 год/, а в этой записи уже есть все строки с работающими на данный момент сотрудниками.


Здравствуйте, хочу поднять вопрос в первой части - заполнение табеля по доп.действию. Это я осилил, получилось очень удобно, спасибо вам за программу!
Возник вопрос, как сделать так, чтобы записи в результате работы доп.действия не дублировались? Ну например нажал я два раза кнопку и дублирующие записи не добавились, а произошла проверка наличия таких записей в подчиненной таблице и в случае если есть расхожедния, добавились только новые записи из справочника сотрудников.
Попробовал поставить запрет на дублирующиеся значения в подчиненной таблице, не работает, т.к. там должны быть одинковые записи, но с разными ID. Все работало бы при некоем подобии primary key, как в Access. Далее я написал код проверки наличия записей, но что-то не работает.
Не могу найти ошибку.

$sqlQuery1 = "SELECT * FROM ".DATA_TABLE."89 WHERE status=0 AND f1099='да'"; //выбираем список "по умолчанию" из таблицы "задачи чеклиста"
$result1 = mysql_query($sqlQuery1) or die(mysql_error()."<br>".$sqlQuery1);
while ($row1 = mysql_fetch_array($result1)) //организуем цикл перебора записей, выбранных в таблице "задачи чеклиста"
{
    $data['Регистрационный знак'] = $ID; // пишем в массив ID текущей строки (машины) в поле таблицы чеклист
    $data['Название'] = $row1['id']; // пишем в массив id из таблицы "задачи чеклиста" в поле таблицы "чеклист", чтобы образовалась связь
    // ВАЖНО! Здесь id должно быть написано маленькими буквами

    // проверка дублирующихся записей в таблице "чеклист"

    $sqlQuery2 = "SELECT * FROM ".DATA_TABLE."85 WHERE status=0 AND f1067='$ID'"; //выбираем список задач таблицы "чеклист" где номер машины равен текущему
    $result2 = mysql_query($sqlQuery2) or die(mysql_error()."<br>".$sqlQuery2);
    while ($row2 = mysql_fetch_array($result2)) //организуем цикл перебора записей, выбраннх в таблице "задачи чеклиста"
    {
	    if ($row2['Название'] = $row1['id']) { //если запись с таким названием существует в таблице "чеклист"
		    // не делаем ничего
	    } else {
		    insert_query($data,"Чеклист"); //создаем новую запись в таблице "чеклист"
	    }
    }
}


#12 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 03 Октябрь 2012 - 15:10

Чтобы записи не дублировались, необходимо проверять, добавлялась ли такая запись уже ранее, по каким либо уникальным для нее признакам. В случае если запись есть - соответственно просто не добавлять.

#13 dev77rus

    Активный участник

  • Пользователи
  • PipPipPip
  • 114 сообщений
  • Пол:Мужчина

Отправлено 03 Октябрь 2012 - 15:17

Так вот я код и написал, отдельно добавление работает, а проверка не получается.. Может посмотрите синтаксис и логику беглым взглядом? :(

Сообщение отредактировал dev77rus: 03 Октябрь 2012 - 15:42


#14 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 03 Октябрь 2012 - 15:46

$row2['Название'] - такого поля не может быть в результатах запроса, т.к. там используется только внутренние имена полей. Основная ошибка в этом.

Во-вторых, можно сделать оптимальнее, задав второй запрос в формате:

$sqlQuery2 = "SELECT * FROM ".DATA_TABLE."85 WHERE status=0 AND f1067='$ID' AND f1111='".$row1['id']."'"; //вместо f1111 подставляем внутренее имя поля "Название"
$result2 = mysql_query($sqlQuery2) or die(mysql_error()."<br>".$sqlQuery2);
if ($row2 = mysql_fetch_array($result2)) { //если запись с таким названием существует в таблице "чеклист"
    // не делаем ничего
} else {
    insert_query($data,"Чеклист"); //создаем новую запись в таблице "чеклист"
}


#15 dev77rus

    Активный участник

  • Пользователи
  • PipPipPip
  • 114 сообщений
  • Пол:Мужчина

Отправлено 03 Октябрь 2012 - 16:11

По вашему примеру все работает волшебно, большое спасибо!
В своем коде я изменял $row2['Название'] на $row2['f1065'], но он все же так не заработал.
Наверное где-то ошибка в конструкции или во вложенности if-else в while....

#16 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 03 Октябрь 2012 - 16:20

Да, сам цикл перебора в том виде что у вас, является неверным, запись может быть добавлена все равно. Я сам это не сразу сообразил. В моем же варианте этого никак не произойдет.

#17 f-jeka

    Активный участник

  • Пользователи
  • PipPipPip
  • 196 сообщений

Отправлено 01 Март 2016 - 01:04

Возможно ли делать запросы к логам программы? Нужно организовать подсчет количества рабочего времени проведенного в программе. То есть нужно рассчитывать количество отработанного времени сотрудником с момента его входа в программу, и до момента последнего действия в программе в текущих сутках. Есть ли готовые решения подобной задачи?

#18 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 01 Март 2016 - 08:59

Готовых нет. К логам разумеется можно обращаться через запрос к таблице logs





Количество пользователей, читающих эту тему: 2

0 пользователей, 2 гостей, 0 анонимных