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


Вопрос по вычислениям


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

#1 vvknet

    Участник

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

Отправлено 07 Август 2015 - 14:35

Есть таблица с полем "состояние гарантии", значение которого устанавливается выбором из списка :
1. на гарантии
2. гарантия истекла
и есть поле "Дата окончания гарантии".

Как сделать так : когда "Дата окончания гарантии" становится меньше текущей даты, значение поля "состояние гарантии" меняется на значение "гарантия истекла".

Благодарю всех откликнувшихся.

#2 Tony999

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

  • Пользователи
  • PipPipPip
  • 412 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 11 Август 2015 - 03:30

$dat = date("Y-m-d 00:00:00"); // Получаем текущую дату

// Ищем запись, где дата совпадает с текущей. (269 - это номер таблицы, f4681 - это поле даты, подставьте свои значения)
$res1=data_select_field(261,"`id` as ids", "`status`=0 and left(f4681, 10) ='",$dat,"'");
while ($row = sql_fetch_assoc($res1)) // цикл прохода по полученным записям
{
$ids=$row['ids'];
data_update(269, array('status'=>'0', 'f441'=>'гарантия истекла'), "`id`=$ids" ); // f441 - номер поля "состояние гарантии", подставьте свое значение.
}

И весь этот код надо поместить в Cron (Дополнительно-Настройки Cron), скажем, на 3 часа ночи.
В итоге, в 3 часа ночи все записи будут проверяться на истечение гарантии, а совпадающие по дате буду изменены в части поля "состояние гарантии".

Сообщение отредактировал Tony999: 11 Август 2015 - 03:33

Умные сайты на заказ
https://info.crm-master.info

#3 vvknet

    Участник

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

Отправлено 13 Август 2015 - 14:45

Просмотр сообщенияTony999 (11 Август 2015 - 03:30) писал:

$dat = date("Y-m-d 00:00:00"); // Получаем текущую дату

// Ищем запись, где дата совпадает с текущей. (269 - это номер таблицы, f4681 - это поле даты, подставьте свои значения)
$res1=data_select_field(261,"`id` as ids", "`status`=0 and left(f4681, 10) ='",$dat,"'");
while ($row = sql_fetch_assoc($res1)) // цикл прохода по полученным записям
{
$ids=$row['ids'];
data_update(269, array('status'=>'0', 'f441'=>'гарантия истекла'), "`id`=$ids" ); // f441 - номер поля "состояние гарантии", подставьте свое значение.
}

И весь этот код надо поместить в Cron (Дополнительно-Настройки Cron), скажем, на 3 часа ночи.
В итоге, в 3 часа ночи все записи будут проверяться на истечение гарантии, а совпадающие по дате буду изменены в части поля "состояние гарантии".



Спасибо за ответ ! Но указанный код работает не совсем корректно. При выполнении кода прописывает в другие поля (не содержащие данных) какое-то текстовое значение :-(
В выделенной красным строке что означает число "261" ?
Спасибо !

#4 Tony999

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

  • Пользователи
  • PipPipPip
  • 412 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 14 Август 2015 - 00:30

261 или 269 - это номер Вашей таблицы, поменяйте на свой.
Умные сайты на заказ
https://info.crm-master.info

#5 vvknet

    Участник

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

Отправлено 25 Август 2015 - 10:28

Спасибо за ответы ! Но как я говорил, при выполнении кода происходят изменения в других полях :-( может есть способ типа " if $line " ?

#6 CbCoder

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

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

Отправлено 25 Август 2015 - 10:45

Откуда там изменения то? В коде выше вроде никак не меняются другие поля. Хотя, он все равно какой-то избыточный и с недочетами. Попробуйте такой вариант:

// ищем записи, где дата совпадает с текущей (111 - это номер таблицы, f222 - это поле даты, подставьте свои значения)
$result = data_select_field(111, "id", "status=0 and left(f222, 10)='",date("Y-m-d"),"'");
while ($row = sql_fetch_assoc($result)) // цикл прохода по полученным записям
{
    // обновляем запись новым значением
    data_update(111, array('f333'=>'гарантия истекла'), "id=",$row['id']); // f333 - поле "состояние гарантии", подставьте свое значение.
}


#7 vvknet

    Участник

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

Отправлено 25 Август 2015 - 11:04

Спасибо ! Обязательно попробую Ваш вариант и отпишусь .

#8 vvknet

    Участник

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

Отправлено 25 Август 2015 - 11:22

попробовал, что-то ничего не изменяет :-(

#9 CbCoder

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

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

Отправлено 25 Август 2015 - 12:06

Просмотр сообщенияvvknet (25 Август 2015 - 11:22) писал:

попробовал, что-то ничего не изменяет :-(

Не понял вас, код вообще не работает что ли? Т.е. раньше менял лишнее, а теперь вообще ничего не меняет?

#10 vvknet

    Участник

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

Отправлено 25 Август 2015 - 12:09

похоже,что не работает
т.е. данные в строках не изменяются
в cron пишет

Лог задания "Отслеживание гарантии" на время 25.08.2015 11:42:01.
2015-08-25 11:42:01 - OneTime -
2015-08-25 11:29:01 - OneTime -

#11 vvknet

    Участник

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

Отправлено 25 Август 2015 - 13:28

УРА ! Заработало !
в строке
$result = data_select_field(111, "id", "status=0 and left(f222, 10)='",date("Y-m-d"),"'");


надо использовать `status`

СПАСИБО ВСЕМ !!!

#12 CbCoder

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

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

Отправлено 25 Август 2015 - 13:39

Цитата

в строке
$result = data_select_field(111, "id", "status=0 and left(f222, 10)='",date("Y-m-d"),"'");
надо использовать `status`

Это не должно никак влиять. Обрамление обратными апострофами нужно только в случае совпадения имени поля с ключевыми словами MySQL, но здесь такого нет (а если бы и было, это привело бы к фатальной ошибке в логе крона, что не видно по вашему сообщению). Так что причина думаю не в этом, скорее всего "заодно" что-то еще исправили.

#13 vvknet

    Участник

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

Отправлено 25 Август 2015 - 14:18

Да,согласен.
попробовал без апострофов - ок
предполагаю ,что не хотело работать из-за того,что в списке значение "гарантия истекла" начиналось с заглавной буквы

#14 vvknet

    Участник

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

Отправлено 26 Август 2015 - 10:36

А можно ли модифицировать данный код,чтобы условие выполнялось ,если текущая дата больше "Даты в поле таблицы" на один год ?

#15 CbCoder

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

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

Отправлено 26 Август 2015 - 18:02

Если ничего не путаю, то

$result = data_select_field(111, "id", "status=0 and left(f222, 10)<'",date("Y-m-d",mktime(0,0,0,date('n'),date('j'),date('Y')-1)),"'");


#16 vvknet

    Участник

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

Отправлено 27 Август 2015 - 12:09

ОК,вроде работает.
Спасибо !





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

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