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


Вывод полей из других таблиц


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

#1 OlegSmirnov

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

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

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

Знаю, что можно установить связь между таблицами по определённому полю и выводить значения некоторых других полей из соответствующей строки привязанной таблицы. Но эти значения выводятся в том же поле, по которому происходит связь, как некоторые дополнительные данные. А можно ли выводить эти дополнительные поля из соответствующей строки связанной таблицы - именно как отдельные поля, а не дополнительные данные поля связи? Чтобы и сортировка по ним работали и выглядели именно как поля? Или этого можно добиться только копированием значений из одной таблицы в другую?

#2 CbCoder

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

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

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

Да, только копированием. Т.е. для этого придется создавать аналоги полей и заполнять их вычислением, например на событие изменения основного поля связи. Само вычисление простое, например:

$line['Телефон клиента'] = $line['Клиент']['Телефон'];

Здесь, 'Телефон клиента' - копия поля 'Телефон' из таблицы, связанной через поле связи 'Клиент'.

Можно даже обойтись без ручного написания вычислений, создав их через конструктор вычислений в настройках доп.поля, в данном примере - 'Телефон клиента'.

#3 OlegSmirnov

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

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

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

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

Сообщение отредактировал OlegSmirnov: 17 Март 2014 - 12:15


#4 CbCoder

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

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

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

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

#5 OlegSmirnov

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

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

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

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

Есть такой код в вычислении:

$dealId = (int) $line['Сделка']['ID'];
$res = data_select(271, "`f3701` = ", $dealId, " AND `status` = ", 0);
По идее он должен бы выбрать только активные записи (AND `status` = 0), однако в выборку почему-то попадают все строки.

И ещё - есть возможность повесить вычисление на удаление строки, но не вижу возможности как-то обрабатывать восстановление записи из удалённых обратно в активные.

#6 OlegSmirnov

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

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

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

Так, с первым вопросом разобрался. В выборку попадают не все удалённые записи, а только та, которую удаляю сейчас, а те, что были удалены ранее - их в выборке нет. То есть, на сколько я понимаю, на момент, когда выполняется код вычисления (обрабатывающий удаление записи) - статус этой записи в базе ещё не обновился, она ещё считается активной. И статус удалённой ей присваивается уже после завершения работы вычисления. Соответственно, в том вычислении можно при переборе результата выборки "вручную" исключить текущую (удаляемую) запись по $ID, например.

Остаётся второй вопрос. Если записи восстанавливаются из удалённых обратно в активные - как можно обработать это событие?

#7 CbCoder

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

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

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

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

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

#8 OlegSmirnov

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

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

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

Понятно, спасибо за подсказку!

Скажите, а можно ли как-то из кода одного вычисления принудительно запустить работу нужного вычисления из определённой таблицы? Как будто произошло событие в той, другой таблице?
Просто есть несколько таблиц с определёнными связями, и в одной из таблиц - довольно длинное вычисление, которое генерирует строки текста, основываясь на данных из этих таблиц. Потом эти строки вставляются ещё в другую таблицу. Вычисление срабатывает при добавлении, изменении, удалении или восстановлении записи в своей таблице. Однако если была отредактирована запись в одной из связанных таблиц и было изменено определённое поле - то нужно, чтобы то вычисление сработало по новой и сгенерировало новые строки с учётом изменений в связанной таблице. Сперва начал копировать код вычисления ещё в несколько таблиц, корректируя немного под них, а сейчас подумал - может можно не копировать его, а как-то "дёргать" из других вычислений, передавая $ID той строки, над которой нужно, чтобы оно отработало?

#9 CbCoder

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

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

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

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

#10 OlegSmirnov

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

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

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

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

#11 CbCoder

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

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

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

Можно искусственно вызвать событие через функцию popup_event. На форуме должно быть описание ее вызова.

#12 OlegSmirnov

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

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

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

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

Есть 4 таблицы с их полями:

Проекты:
- поле название (текст)

Услуги:
- поле проект (связь с проекты.название),
- поле название (текст),
- поле стоимость (число)

Позиции:
- поле сделка (связь с сделки.идентификация),
- поле проект (связь с проекты.название, невидимое при редактировании, заполняется вычислением - определяет проект по услуге),
- поле услуга (связь с услуги.название)
- поле стоимость (число, поле заполняется вычислением, значение берётся из соответствующей услуги)

Сделки:
- поле идентификация (текст)
- поле проекты (текст)
- поле услуги (текст)
- поле сумма (число)

И есть вычисление в таблице позиции, которое при изменении таблицы позиции (добавление, удаление, восстановление, редактирование записей):
1) получает все позиции, которые относятся к той же сделке, что и текущая позиция
2) перебирая полученные позиции, составляет список названий проектов (просто текст через запятую), к которым относятся эти позиции. Вообще, сперва набирает массив id проектов (из поля-связи проект), потом по этим id уже получает названия
3) аналогично, перебирая полученные позиции - составляет список названий услуг.
4) перебирая полученные позиции подсчитывает общую сумму
5) вносит список названий проектов, список названий услуг и общую сумму в соответствующую строку таблицы сделки.

И это работает. Но если, например, в таблице проекты изменить название - то в таблице сделки в списке проектов оно не изменится. Можно написать свои вычисления на таблицу проекты и на таблицу услуги, которые будут делать тоже самое, что вычисление на таблице позиции. Просто я подумал, что может можно при изменении названия проекта - определить список позиций, которые относятся к данному проекту и далее для этих позиций (можно предварительно отсеять позиции с одинаковыми сделками) - запустить то вычисление из таблицы позиции, которое уже готово, а не создавать ещё его клоны.

#13 OlegSmirnov

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

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

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

О, пока писал текст - вы уже ответили про функцию popup_event, сейчас буду искать





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

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