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


Вычисление при удалении


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

#1 nk

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

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

Отправлено 07 Октябрь 2012 - 23:31

Есть таблица "заказы", есть подчиненная таблица "позиции заказа". Во второй при изменении полей "количество" или "цена" мое вычисление пересчитывает "итого" в подчиненной таблице и "итого" в родительской. Все прекрасно.

Но при удалении строки подчиненной таблицы "итого" в родительской не пересчитывается, что очень печально. Как быть? В вычислении проверяю на 'status' = '0', пробовал на вычисление добавить событие "удаление в таблице" и изменение поля status. Не пересчитывает. В стандартной конфигурации у вас та же ситуация.

#2 Гость_Roman_*

  • Гости

Отправлено 08 Октябрь 2012 - 09:56

Дело в том, что на момент срабатывания вычисления при удалении удаляемая строка всё ещё присутствует в базе. Чтобы корректно вычислить сумму или количество, необходимо исключить удаляемую строку из результатов запроса.
WHERE `id`<>$ID


#3 nk

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

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

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

это учтено, делал по аналогии со стандартной конфигурацией (проверьте на демке - там такая же проблема):

$line['Итого'] = $line['Количество'] * $line['Стоимость'];
$sqlQuery = "SELECT SUM(`f187`) AS `materials_amount` FROM `".DATA_TABLE."23` WHERE `status`='0' AND `f161`='".$line['Заказ']['raw']."' AND `id`<>'$ID'";
$result = sql_query($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR);
$row = mysql_fetch_assoc($result);
if ($row['materials_amount'] == NULL) $materials_amount = $line['Итого'];
else $materials_amount = $row['materials_amount'] + $line['Итого'];
$line['Заказ']['Стоимость материалов'] = $materials_amount;

я имел ввиду, что при удалении вообще ничего не пересчитывается, а, судя по вашему ответу, вы поняли, что пересчитывается с учетом удаляемой строки.

Сообщение отредактировал nk: 08 Октябрь 2012 - 12:11


#4 nk

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

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

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

ответ будет?

#5 Гость_Roman_*

  • Гости

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

Это была недоработка в ревизии. Сегодня выйдет новая ревизия, где этот момент будет исправлен.

#6 nk

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

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

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

понятно, и все-таки какое событие надо будет использовать?

"Сохранение в таблице" + "Удаление в таблице" ?

#7 Гость_Roman_*

  • Гости

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

Только удаление, если хотите, чтоб пересчёт был при удалении с исключением удаляемой строки.

#8 nk

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

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

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

исправление уже вышло?

так и не срабатывает пересчет при удалении записи подчиненной таблицы (из формы записи родительской)

Сообщение отредактировал nk: 14 Октябрь 2012 - 17:12


#9 Гость_Roman_*

  • Гости

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

Исправление вышло. Если вычисление при удалении так и не срабатывает, оставьте заявку в техподдержку с доступом к программе или бэкапом.

#10 nk

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

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

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

Все равно вопросы остались.

Проверил на вашей демке. Событие "Удаление в таблице" обрабатывается при полном удалении (из удаленных), при нажатии крестика в подчиненной таблице вычисление не срабатывает. Но срабатывает оно, если повесить его на событие "Изменение поля статус" (пусть так, ведь подчиненные таблицы обычно скрыты и удалить из удаленных не получится, т.к. таблицы не видно). При этом (обработка изменения поля статус) через phpmyadmin видно, что вычисление отработало и сумма в родительской пересчиталась, но на самой форме подчиненная строка пропала, а в родительской отображение не поменялось. F5 не катит, ведь при ДОБАВЛЕНИИ подчиненной строки в родительской все пересчитывается и тут же обновляется на форме без F5. Надеюсь, понятно объяснил.

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

Сообщение отредактировал nk: 15 Октябрь 2012 - 09:59


#11 Гость_Roman_*

  • Гости

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

Теперь понятно. Была недоработка. Этот момент будет исправлен в сегодняшней ревизии.

#12 Institor

    Новичок

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

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

Проблема:
Вычисление при удалении не срабатывает, если удалять из подчиненной таблице (нажимая на красный крестик). Раньше работало. При удалении из таблицы (обычной) вычисление срабатывает. Код такой:

if (time() - strtotime(($line['Время добавления'])) > 3600) {
global $cancel_delete;
$cancel_delete=1;
}
if ($line['Кто добавил'] != $user[id]) {
  global $cancel_delete;
  $cancel_delete=1;
}
Хочу сделать, чтобы по прошествии определенного времени после создания нельзя было удалять записи.

#13 arsenal

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

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

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

Подскажите пожалуйста. Уже не первый раз встречаю упоминание про "phpmyadmin". Что это такое и как этим пользоваться?

#14 Гость_Roman_*

  • Гости

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

Просмотр сообщенияInstitor (16 Октябрь 2012 - 02:26) писал:

Проблема:
Вычисление при удалении не срабатывает, если удалять из подчиненной таблице (нажимая на красный крестик). Раньше работало. При удалении из таблицы (обычной) вычисление срабатывает. Код такой:

if (time() - strtotime(($line['Время добавления'])) > 3600) {
global $cancel_delete;
$cancel_delete=1;
}
if ($line['Кто добавил'] != $user[id]) {
  global $cancel_delete;
  $cancel_delete=1;
}
Хочу сделать, чтобы по прошествии определенного времени после создания нельзя было удалять записи.

Проверим Вашу проблему в ближайшее время.

Просмотр сообщенияarsenal (16 Октябрь 2012 - 06:51) писал:

Подскажите пожалуйста. Уже не первый раз встречаю упоминание про "phpmyadmin". Что это такое и как этим пользоваться?
Phpmyadmin - утилита, позволяющая управлять базами данных на сервере. Практически, тоже самое, что скрипт edit_sql.php в КБ (он же Adminer), только мощнее.

#15 Гость_Roman_*

  • Гости

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

Просмотр сообщенияInstitor (16 Октябрь 2012 - 02:26) писал:

Проблема:
Вычисление при удалении не срабатывает, если удалять из подчиненной таблице (нажимая на красный крестик). Раньше работало. При удалении из таблицы (обычной) вычисление срабатывает. Код такой:

if (time() - strtotime(($line['Время добавления'])) > 3600) {
global $cancel_delete;
$cancel_delete=1;
}
if ($line['Кто добавил'] != $user[id]) {
  global $cancel_delete;
  $cancel_delete=1;
}
Хочу сделать, чтобы по прошествии определенного времени после создания нельзя было удалять записи.

Отмена удаления исправлена. Ревизия выйдет сегодня.

#16 Institor

    Новичок

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

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

Спасибо!

#17 nk

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

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

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

Просмотр сообщенияRoman (16 Октябрь 2012 - 09:15) писал:

Отмена удаления исправлена. Ревизия выйдет сегодня.

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

На demo.clientbase.ru открываю счет, добавляю позицию, и тут же "на лету" обновляются поля в родительской таблице.
Затем удаляю эту строку, а поля родительской остаются как есть. Обновляю страницу - пересчет происходит. Но этот пересчет происходит другим вычислением - при отображении "Всего" в родительской.

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


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

Сообщение отредактировал nk: 17 Октябрь 2012 - 10:20


#18 Гость_Roman_*

  • Гости

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

Просмотр сообщенияnk (17 Октябрь 2012 - 10:08) писал:

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

На demo.clientbase.ru открываю счет, добавляю позицию, и тут же "на лету" обновляются поля в родительской таблице.
Затем удаляю эту строку, а поля родительской остаются как есть. Обновляю страницу - пересчет происходит. Но этот пересчет происходит другим вычислением - при отображении "Всего" в родительской.

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


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

Исправление было, пересчёт в родительской записи происходит "на лету" при удалении строки в подтаблице. Если у Вас это не работает, значит что-то было сделано не так.

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

#19 nk

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

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

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

все ОК :)

#20 arsenal

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

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

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

Просмотр сообщенияRoman (16 Октябрь 2012 - 08:22) писал:

Phpmyadmin - утилита, позволяющая управлять базами данных на сервере. Практически, тоже самое, что скрипт edit_sql.php в КБ (он же Adminer), только мощнее.
В локальной версии она работает? Как ее запустить? Что конкретно она позволяет делать с базой данных?





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

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