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


Как связать 3 таблицы


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

#1 kok

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

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

Отправлено 03 Сентябрь 2010 - 15:19

Всем привет!

Задача такая: есть 3 таблицы, 1 связана со 2, 2 связана с 3-й.
В 1-й таблице нужно сделать печатную форму RTF с данными из 1, 2-й и 3-й таблиц.
Как получить доступ к данным из з-й таблицы?

ps: если надо, опишу более подробно, пока главное понять суть.
*Свободный программер.

#2 Timur

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

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

Отправлено 03 Сентябрь 2010 - 15:44

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

#3 kok

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

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

Отправлено 03 Сентябрь 2010 - 16:01

Просмотр сообщенияТехподдержка (3.9.2010, 15:44) писал:

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

Это первая моя мысль была, спасибо за скорый ответ.
Только вот в чём дело, получается некое дублирование данных, я думал есть более элегантный способ.
Полей ведь может быть много...

И еще, у меня получилось вот что сделать в RTF отчёте: поле 1 табл. ссылается на поле 2-й табл., которое в свою очередь ссылается на поле 3-й табл. Так можно делать или вылезет потом бага?
*Свободный программер.

#4 CbCoder

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

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

Отправлено 03 Сентябрь 2010 - 16:51

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

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

#5 CbCoder

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

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

Отправлено 03 Сентябрь 2010 - 16:55

Просмотр сообщенияkok (3.9.2010, 17:01) писал:

И еще, у меня получилось вот что сделать в RTF отчёте: поле 1 табл. ссылается на поле 2-й табл., которое в свою очередь ссылается на поле 3-й табл. Так можно делать или вылезет потом бага?
Бага не будет, если шаблон поля вставлен в формате, о котором я писал выше ("Название поля связи.Название нужного вам поля из связанной таблицы")

#6 kok

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

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

Отправлено 03 Сентябрь 2010 - 17:42

Не знал, что поле типа связь может быть вычисляемым.
Итак, я создаю в 1-й таблице 'поле1' типа связь с 3-й таблицей (с её любым полем или нет?), прячу 'поле1' через Доступ.
И дальше незнаю. :)
Подскажите, как сделать вычисляемое поле для прямой связи с 3-й таблицей?
*Свободный программер.

#7 CbCoder

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

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

Отправлено 03 Сентябрь 2010 - 17:47

Вычисляемым может быть любое поле. Для поля связи нужно вычислить id связанной строки, т.к. именно они там и хранятся.

Просмотр сообщенияkok (3.9.2010, 18:42) писал:

Итак, я создаю в 1-й таблице 'поле1' типа связь с 3-й таблицей (с её любым полем или нет?), прячу 'поле1' через Доступ.
Да. И затем в вычислении через поле связи со 2-й таблицей находите id нужной строки из 3-й.

#8 kok

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

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

Отправлено 06 Сентябрь 2010 - 08:15

Просмотр сообщенияРазработчик (3.9.2010, 17:47) писал:

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

Запутался чего-то я.
Итак, есть 3 таблицы: Договор, Организация, Реквизиты.
"Договор.Организация" связан с "Организация.Название организации" (т.е. 1->2), а "Реквизиты.Организация" связана с "Организация.Полное название организации" (т.е. 3->2) .
В таблице Договор д.б. печатная форма с данными из всех этих трёх таблиц.

Я думал вот как надо делать: создаю служебное поле "Договор.Полное название организации", делаю связь с "Реквизиты.Организация" (т.е. 1->3) и автоматически заполняю поле "Договор.Полное название организации" значением из "Организация.Полное название организации". А оказалось не так!?

Ведь при создании Договора я бы хотел выбрать только организацию ("Организация.Название организации"), а полное её название само бы подставилось в поле "Договор.Полное название организации". А теперь я окончательно запутался :)
*Свободный программер.

#9 CbCoder

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

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

Отправлено 06 Сентябрь 2010 - 08:39

Просмотр сообщенияkok (6.9.2010, 9:15) писал:

Я думал вот как надо делать: создаю служебное поле "Договор.Полное название организации", делаю связь с "Реквизиты.Организация" (т.е. 1->3) и автоматически заполняю поле "Договор.Полное название организации" значением из "Организация.Полное название организации". А оказалось не так!?
Почему не так? Как раз об этом и идет речь. Иначе какой смысл говорить о вычислениях, если поле будет выбирается вручную.

Вот образец кода для вашего случая:
$dog = data_table("Договор", "id={ID}");  // массив текущей строки таблицы Договоры
$rekv = data_table("Реквизиты", "`Организация`=".$dog['Организация']);  // реквизиты выбранной организации
return $rekv['ID'];  // возвращаем id строки с реквизитами


#10 kok

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

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

Отправлено 06 Сентябрь 2010 - 09:01

Просмотр сообщенияРазработчик (6.9.2010, 8:39) писал:

Почему не так? Как раз об этом и идет речь. Иначе какой смысл говорить о вычислениях, если поле будет выбирается вручную.

Вот образец кода для вашего случая:
$dog = data_table("Договор", "id={ID}");  // массив текущей строки таблицы Договоры
$rekv = data_table("Реквизиты", "`Организация`=".$dog['Организация']);  // реквизиты выбранной организации
return $rekv['ID'];  // возвращаем id строки с реквизитами

Спасибо! Работает!!!
*Свободный программер.





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

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