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


Поиск вычисляемых значений


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

#1 Bob_chemist

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

  • Пользователи
  • PipPipPip
  • 56 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 23 Март 2012 - 12:41

Есть таблица с исполнителями (поле связь), на каждого исполнителя выдается какое-то количество нормо-часов работы (по несколько рабочих дней выходит). Зная дату начала работ можно рассчитать дату окончания:

$f = data_table("Учет работ","id=$ID");
$days = $line['Общее количество часов'] / 8; //восьмичасовой рабочий день
$sum = strtotime(date("Y-m-d", strtotime($f["Дата распределения"])) . "$days days");
$dateto = date('Y-m-d',$sum);
$line['Занят до'] = $dateto;

Чего нужно: чтобы при добавлении следующей работы тому же исполнителю, вычисление проверяло таблицу на наличие в ней записи окончания предыдущей работы. И, соответственно, если дата окончания > даты распределения, то дни прибавлялись бы к дате окончания, а если меньше, то к дате распределения.
Условия if-else прописать смогу, а вот как искать значения не понимаю.

#2 CbCoder

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

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

Отправлено 23 Март 2012 - 14:30

А в чем сложность поиска значений?

#3 Bob_chemist

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

  • Пользователи
  • PipPipPip
  • 56 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 23 Март 2012 - 15:15

Я не программист, к сожалению, а только учусь.
Код рабочий, будет потом являться частью конечного кода

исполнитель Иванов - 40 часов работы - начало 23.03.2012 - окончание 28.03.2012
исполнитель Петров - 50 - начало 25.03.2012 - окончание 31.03.2012
-// -- Иванов - 10 - начало 25.03.2012 - ???
Как заставить программу выловить данные Иванова? Мне бы хоть кусочек кода, где переменной присваивается 28.03.2012 :)

#4 CbCoder

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

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

Отправлено 23 Март 2012 - 15:50

Поиск записей в базе данных осуществляется путем составления запросов. Можно составить прямой запрос к БД (см. документацию по MySQL), а можно воспользоваться нашей функцией data_table. Она не обладает той же функциональностью, но упрощает синтаксис. В вашем коде уже есть пример ее использования для доступа к текущей записи, для излечения данных из других записей необходимо вместо строки "id=$ID" использовать иной критерий отбора, например "`Занят до`>'".$line['Дата распределения']."'". Надеюсь суть понятна.

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

#5 Bob_chemist

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

  • Пользователи
  • PipPipPip
  • 56 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 23 Март 2012 - 22:39

спасибо, именно то, что надо

#6 Bob_chemist

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

  • Пользователи
  • PipPipPip
  • 56 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 24 Март 2012 - 10:07

Просмотр сообщенияРазработчик (23 Март 2012 - 15:50) писал:

для излечения данных из других записей необходимо вместо строки "id=$ID" использовать иной критерий отбора, например "`Занят до`>'".$line['Дата распределения']."'".
возможно ли использование 2 и более критериев отбора?
Кстати, описание некоторых функций нашел в разделе "Вычисления в версиях до 1.9.5"

#7 CbCoder

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

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

Отправлено 24 Март 2012 - 11:00

Возможно любое выражение в формате SQL условия, в том числе и сочетание нескольких полей через связки and или or, использование скобок и т.д.

#8 Bob_chemist

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

  • Пользователи
  • PipPipPip
  • 56 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 24 Март 2012 - 23:12

в общем решил сделать так, может кому пригодится:
$a1 = $line['Дата распределения'];
$in = $line['Исполнитель']['ID'];
$sqlQuery = "SELECT * FROM ".DATA_TABLE."29 WHERE status=0 AND f295!=$ID AND f300=".$in." ORDER BY f303 desc LIMIT 0,1"; //где f295 - ID текущей записи 
//(иначе, если редактировать первую же запись, она будет прибавляться сама к себе), f300 - исполнитель и f303 - дата, до которой он занят
$result = mysql_query($sqlQuery);
$row = mysql_fetch_array($result);
$zan = $row['f303'];
if ($a1 > $zan) {
$f = data_table("Учет работ","id=$ID");
$days = round($line['Общее количество часов'] / 8);
$sum = strtotime(date("Y-m-d", strtotime($f["Дата распределения"])) . "$days days");
$dateto = date('Y-m-d',$sum);
$line['Занят до'] = $dateto;
}
else {
$days = round($line['Общее количество часов'] / 8);
$sum = strtotime(date("Y-m-d", strtotime($zan)) . "$days days");
$dateto = date('Y-m-d',$sum);
$line['Занят до'] = $dateto;
}

Сообщение отредактировал Bob_chemist: 25 Март 2012 - 11:57






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

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