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


срабатывание вычисления после UPDATE

update sql вычисления

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

#1 serg499

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

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

Отправлено 19 Ноябрь 2013 - 00:40

Здравствуйте!
Столкнулся со следующим вопросом - а срабатывают ли вычисления по условию "изменение поля", если поле изменить SQL-запросом UPDATE?
К примеру:
Следующая строка изменила значение f4251:
$sqlQuery = "UPDATE ".DATA_TABLE."251 SET f4251='".$line['Оплачено']."' WHERE f4011='".$line['ID']."'";
$res = mysql_query($sqlQuery);
Значение f4251 по-факту изменилось и должно было сработать вычисление на изменение f4251, однако не сработало. Попробовал изменить условие на "Отображение поля", вот тогда все ОК. В связи с чем и возник вопрос про изменение через SQLи как сделать, чтобы вычисления все-таки сработали? Можно ли принудительно, вручную запустить вычисление?

#2 serg499

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

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

Отправлено 19 Ноябрь 2013 - 00:47

Тупанул... Наверное, для этого и сделано update_query? :D

#3 CbCoder

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

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

Отправлено 19 Ноябрь 2013 - 09:51

Да, либо data_update с параметром EVENTS_ENABLE.

#4 serg499

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

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

Отправлено 19 Ноябрь 2013 - 11:23

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

#5 CbCoder

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

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

Отправлено 19 Ноябрь 2013 - 14:49

Можно, вызовом функции popup_event ($table, $line, $event). Публичного описания функции я не нашел, но можно в качестве примера посмотреть на формирование события в update_query (файл include/functions2.php).

#6 OlegSmirnov

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

  • Пользователи
  • PipPipPip
  • 36 сообщений
  • Пол:Мужчина
  • Город:Дмитров, МО
  • Интересы:Собаки, путешествия, web-программирование.

Отправлено 17 Март 2014 - 17:11

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

#7 OlegSmirnov

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

  • Пользователи
  • PipPipPip
  • 36 сообщений
  • Пол:Мужчина
  • Город:Дмитров, МО
  • Интересы:Собаки, путешествия, web-программирование.

Отправлено 17 Март 2014 - 23:44

Покопался в include/functions2.php и вот написал такую функцию. Она не является полноценной обёрткой для popup_event и работает для вызова вычислений, которые привязаны к изменению поля. Есть некоторые моменты, о которых хочу предупредить. Эта функция при подготовке данных для запуска popup_event - записывает не настоящие данные в информацию об обновляемом поле. По идее, функция popup_event должна получить (помимо всего прочего) данные, которые были записаны в поле до редактирования и данные, которые оказались там после редактирования. Я не знаю, насколько это важно, чтобы при запуске вычисления была верная информация о старых и новых данных поля, но поскольку мне понадобилось запускать вычисление вообще без реального редактирования поля - я просто указал в качестве старых данных - пустую строку. Новые данные можно указать любые, передав их в качестве аргумента. Опять-таки не знаю, на сколько это важно - передавать верные новые данные. Функция не обновляет значение поля, только запускает вычисление, и эта информация, возможно, нужна для каких-то внутренних нужд popup_event - может сохранение в лог какой-нибудь. Есть ещё один момент, на который, наверно, следует обратить внимание: я вижу, что в той копии "Клиентской базы", с которой я работаю, внутренние названия полей выглядят как fXXX, где XXX - числовой id поля. Т.е. внутреннее название поля - это префикс в виде буквы f, после которого идёт число - идентификатор поля. Не исключаю, что в какой-то другой конфигурации, вместо буквы f префиксом может быть какая-то другая строка текста.

Получилась вот такая функция:

function run_update_event($table_id, $line_id, $field_id, $new_data) {
  $table = get_table($table_id);
  $table_fields = get_table_fields($table);
  $event = array(
	'type' => 'update_query',
	'table_id' => $table_id,
	'line_id' => $line_id,
	'changed' => array(
	  $field_id => array(
		'field_id' => $field_id,
		'int_name' => 'f' . $field_id,
		'old' => '',
		'new' => $new_data
	  )
	)
  );
  $sqlQuery = "SELECT * FROM `" . DATA_TABLE . $table_id . "` WHERE `id` = {$line_id}";
  $res = sql_query($sqlQuery);
  if($res and mysql_num_rows($res)) {
	$line = mysql_fetch_array($res);
	popup_event($table, $line, $event);
  }
}

Аргументы функции:
$table_id - это числовой id таблицы, с которой связано вычисление, которое нужно запустить. Это число можно узнать, например, открыв в браузере эту таблицу и посмотрев в строку адреса текущей страницы.
$line_id - это id той строки в таблице, для которой нужно запустить вычисление. Т.е. как будто строка с этим id была отредактирована.
$field_id - это числовой id столбца, для которого нужно запустить вычисление. Т.е. как будто поле с этим id (в строке $line_id таблицы $table_id) было отредактировано. Это id можно узнать, открыв в браузере нужную таблицу и щёлкнув на сортировку таблицы по интересуещему нас полю, после чего этот id также буден виден в адресной строке браузера (это значение переменной sort_by). Здесь нужно указать id того поля, к изменению которого привязан запуск вычисления.
$new_data - это новые данные, которые записаны в поле после его редактирования. Поскольку эта функция может быть полезна скорее в ситуации, когда данные в поле реально не менялись, но нужно запустить вычисление, как будто они поменялись - то в качестве $new_data я указываю текущее значение поля.

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

#8 CbCoder

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

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

Отправлено 18 Март 2014 - 09:10

Цитата

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

Насколько знаю, это важно только для двух вещей: во-первых, само вычисление может использовать данные старого значения из $event (но это уж конкретно от вашего кода зависит), во-вторых, старое и новое значения пишутся в лог, как реальное изменение с первого на второе. По идее в вашем случае ни то ни другое не нужно, как я понимаю. Но, с другой стороны, без заполнения $event['changed'] событие на поле вообще не вызовется.

Цитата

Есть ещё один момент, на который, наверно, следует обратить внимание: я вижу, что в той копии "Клиентской базы", с которой я работаю, внутренние названия полей выглядят как fXXX, где XXX - числовой id поля. Т.е. внутреннее название поля - это префикс в виде буквы f, после которого идёт число - идентификатор поля. Не исключаю, что в какой-то другой конфигурации, вместо буквы f префиксом может быть какая-то другая строка текста.

Нет, это постоянный префикс, он не меняется. Но есть исключения внутренних имен для служебных полей: id (ID), add_time (Время добавления), user_id (Кто добавил), status (Статус записи). Дело в том, что изначально это были скрытые поля, не отображаемые в конфигурации. Если заранее не известно, что это за поле, можно получить внутреннее имя через функцию form_int_name($field_id), или, в вашем случае, через $table_fields[$field_id]['int_name']





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

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