Здравствуйте! Есть таблица Заказы с несколькими подчиненными таблицами (оплата, счета и т.д.). Несколько полей в основной таблице считаются на основании данных этих подтаблиц. Сейчас эти поля считаются вычислением с условием срабатывание "Отображение поля", что приводит к замедлению отображения таблицы. Можно ли как-то уйти от условия "Отображение поля" и пересчитывать значение нужного поля только при изменении данных в связанной подтаблице?
Пока из мыслей только в основной таблице сделать новое поле-список "Необходим пересчет данных" (Да/Нет), и при изменениях в подтаблице менять значение этого поля на "Да", делать пересчет и сбрасывать снова на "Нет" - что-то типа флага. Но, может, можно проще?
Автоматический пересчет данных при изменениях в подчиненной таблице
Автор serg499, 18 сент. 2013 20:37
подчиненные таблицы
Сообщений в теме: 6
#1
Отправлено 18 Сентябрь 2013 - 20:37
#2 Гость_Roman_*
Отправлено 19 Сентябрь 2013 - 09:08
Я так понимаю, сейчас вычисление у Вас в основной записи. Необходимо переписать немного код вычисления и перенести его в подтаблицу, настроив срабатывание на изменение поля. Пример из стандартной конфигурации - сумма счёта считается по изменению поля в строках подтаблицы "Позиции счёта".
#3
Отправлено 19 Сентябрь 2013 - 16:00
Посмотрел стандартную конфигурацию - там тоже часть полей (например, Сумма НДС) считаются при условии отображении поля (от которого я и пытаюсь уйти).
Попробовал у себя сделать при изменении значения или удаления записи или сохранения в таблицу, все ок за исключением удаления записи - при удалении строки значение не пересчитывается. Пока не могу понять, почему?
Попробовал у себя сделать при изменении значения или удаления записи или сохранения в таблицу, все ок за исключением удаления записи - при удалении строки значение не пересчитывается. Пока не могу понять, почему?
$ZakazID = $line['Заказ']['ID'];
if ($ZakazID > 0) // При удалении заказа чтобы не дал $ID = NULL ??? нужно вообще это делать??
{
$sqlQuery="SELECT * FROM ".DATA_TABLE."92 WHERE status=0 AND f1000=$ZakazID ORDER BY id asc LIMIT 1";
$result = mysql_query($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR);
$mrow = mysql_fetch_array($result);
$line['Заказ']['Оплата по заказу']="<a href='view_line.php?table=92&line=".$mrow["id"]."'>".$mrow["f1002"]." ".form_local_time($mrow["f1001"])." - ".form_local_number($mrow["f1003"],"10/2")." руб</a>";
$sqlQuery2 = "SELECT sum(f1003) as summa FROM ".DATA_TABLE."92 WHERE status=0 AND f1000=$ZakazID";
$result = mysql_query($sqlQuery2);
$row = mysql_fetch_array($result);
$line['Заказ']['Сумма оплаты по заказу']=$row['summa'];
}
Сообщение отредактировал serg499: 19 Сентябрь 2013 - 16:00
#4 Гость_Roman_*
Отправлено 19 Сентябрь 2013 - 16:11
Дело в том, что в момент срабатывания вычисления, удаляемая строка ещё существует в базе в активных записях. Необходимо исключать её в запросе условием WHERE `id`<>$ID - то есть запрос учитвает все строки, кроме текущей.
#5
Отправлено 19 Сентябрь 2013 - 16:56
Спасибо!
Я правильно понял, что в таком случае нужно делать 2 вычисления:
Я правильно понял, что в таком случае нужно делать 2 вычисления:
- При изменении полей или сохранения в таблицу
- При удалении записи с WHERE `id`<>$ID
#6 Гость_Roman_*
Отправлено 19 Сентябрь 2013 - 17:00
Да, всё верно.
#7
Отправлено 19 Сентябрь 2013 - 19:03
Вас понял, спасибо!
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных













