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


Расчет суммы из подтаблицы по событию в родительской


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

#1 user103

    Участник

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

Отправлено 31 Март 2016 - 15:19

Часто использую вычисление вида
if ($event['type']=='delete') $skip_current="`id`<>$ID AND "; 
$pre = data_select_field(1010,"SUM(`f15530`) as summ", $skip_current."`status`=0 AND`f15440`=",$line['Изделие']['raw']);
$res = sql_fetch_assoc($pre);
$line['Изделие']['Запечатано'] = $res['summ'];

записывается в подтаблицу, считается по изменению или отображению поля

как избежать следующей ошибки:
например мы копируем родительскую запись, без записей в подтаблице
в родительской записи поля, в которые считается сумма из подтаблицы - заполнены, хотя в подтаблице пусто
чтобы поля обновились, нужно заходить в запись

можно ли вышеуказанное вычисление запускать не "снизу вверх" а "сверху вниз" ?

#2 CbCoder

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

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

Отправлено 31 Март 2016 - 15:54

Можно, но лучше воспользоваться этим вариантом: https://clientbase.r...indpost&p=20995

#3 user103

    Участник

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

Отправлено 31 Март 2016 - 16:56

Т.е. обнулять поля при копировании ? я правильно понял?

#4 CbCoder

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

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

Отправлено 31 Март 2016 - 17:03

Да. Мне кажется это более оптимальный вариант. То о чем вы спрашивали, тоже возможно, если перенести вычисление в родительскую запись (естественно отредактировав при этом код под родительскую), и настроив его на событие отображения поля Запечатано. В этом случае в поле всегда будет актуальное значение, НО может снизится производительность из-за того что вычисление будет срабатывать при каждом открытии таблицы. Это одна из причин, почему вычисления сейчас как правило работают "снизу вверх", как вы говорите, хотя раньше было именно "сверху вниз".

#5 user103

    Участник

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

Отправлено 31 Март 2016 - 17:22

Отлично, все понял.
Еще вопрос, не буду отдельную ветку создавать.
Можно ли для таблицы сделать подтаблицей ее же саму, не вылезет ошибка?
поясню для чего
у меня есть таблица изделия, в ней обавляются изделия, задаются и рассчитываются характеристики
но иногда бывают составные изделия, состоящие из нескольких изделий
т.е. в этой же таблице добавляется новое изделие, со своими характеристиками и в его состав входят несколько изделий из этой же таблицы в виде подтаблицы, а ? 8)

#6 CbCoder

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

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

Отправлено 31 Март 2016 - 18:03

Да, подтаблицы могут как угодно сочетаться с таблицами. Никаких ограничений там нет.

#7 user103

    Участник

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

Отправлено 06 Апрель 2016 - 11:15

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

#8 CbCoder

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

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

Отправлено 06 Апрель 2016 - 11:34

В таком событии особого смысла нет, в случае необходимости можно создать вычисление в самой родительской таблице. Да, при этом код может быть чуть сложнее, но вполне рабочим.

#9 user103

    Участник

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

Отправлено 20 Апрель 2016 - 15:58

По поводу вычисления в самой родительской таблице.
Родительская таблица - верстка
Подчиненная - блок

вычисление сейчас в таблице блок
$line['Запечатано тут'] = $line['Верстка']['Запечатано листов'] * $line['На листе'];

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

все поля "на листе" в подтаблице - умножились на "запечатано листов"

есть где то примеры ?

Сообщение отредактировал user103: 20 Апрель 2016 - 15:59


#10 Timur

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

  • Техподдержка ООО "КБ"
  • PipPipPip
  • 854 сообщений
  • Пол:Мужчина

Отправлено 21 Апрель 2016 - 17:12

Просмотр сообщенияuser103 (20 Апрель 2016 - 15:58) писал:

По поводу вычисления в самой родительской таблице.
Родительская таблица - верстка
Подчиненная - блок

вычисление сейчас в таблице блок
$line['Запечатано тут'] = $line['Верстка']['Запечатано листов'] * $line['На листе'];

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

все поля "на листе" в подтаблице - умножились на "запечатано листов"

есть где то примеры ?

Пример вычисления будет выглядеть примерно так
$result = data_select(111, "f222=".$line['ID']); // выбираем из подчиненной таблицы все записи, подчиненные текущей родительской
while ($row = sql_fetch_assoc($result)) { // цикл по всем найденным записям
    $upd_line['f333'] = $line['Запечатано листов'] * $row['f444']; // вычисляем поле 'Запечатано тут'
    data_update(111, $upd_line, "id=".$row['id']); // обновляем текущую в цикле запись  
}
// 111 заменить на id таблицы 'блок'
// 222 заменить на id поля 'Верстка'
// 333 заменить на id поля 'Запечатано тут'
// 444 заменить на id поля 'На листе'






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

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