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


Связывает таблицу и подтаблицу


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

#1 yKa3

    Участник

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

Отправлено 05 Август 2014 - 18:04

Есть таблица Заявки и Подтаблица Работа по Заявке. В подтаблице есть два поля: Действие, Дата. Необходимо сделать так чтобы эти два поля отображались в родительской таблице Заявки.

Создал в родительской таблице два новых поля: След.действие, Исполнить до: и создал связь в настройках полей с полями Действие и Дата подтаблицы Работа по заявке. Результата нет. Что делаю не так?

#2 CbCoder

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

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

Отправлено 06 Август 2014 - 10:48

Что не так:
  • То, что вы создали поле связи с некой таблицей (и полем в ней), отнюдь не означает, что это поле должно как-то автоматически, само по себе заполняться. Одна из причин этого - то что в связанной таблице может быть несколько записей, и как программа должна по вашему понять, из какой именно записи ей брать значение? К тому же, вы можете вообще захотеть вручную выбирать эту связь с нужной записью, как например контрагента в поле связи счета. Для программы все поля связи одинаковые, и она не в состоянии понять, какое нужно заполнять автоматом, а какое вручную. Для этого как раз служат вычисления - они определяют алгоритм автоматического заполнения поля, т.е. откуда и как именно брать нужное значение для поля. Если же вычисления нет - поле можно заполнить только ручками.
  • Соответственно, т.к. в любом случае необходимы вычисления, связь с подтаблицей у этих полей излишняя, она не играет никакой роли и только затрудняет работу с полем. Логичнее поставить типы полей такие же как у оригинальных полей, так проще будет их копировать.
Теперь собственно по вычислению. Как уже сказал, т.к. в подтаблице может быть несколько записей, для начала необходимо определиться, какую именно запись брать, например первую или последнюю?

#3 yKa3

    Участник

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

Отправлено 06 Август 2014 - 16:10

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

Пробовал вычисление:
$line['След.действие']=$line['Действие']; результата нет

#4 yKa3

    Участник

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

Отправлено 06 Август 2014 - 16:16

И если вы говорите что поле не должно как-то автоматически заполняться, то зачем тогда эта справка и вообще что это тогда?

[img][URL=http://hostingkartinok.com/show-image.php?id=830c3bb66de957448b9a7391701e7585][IMG]http://s7.hostingkartinok.com/uploads/thumbs/2014/08/830c3bb66de957448b9a7391701e7585.png[/IMG][/URL][/img]

#5 CbCoder

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

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

Отправлено 06 Август 2014 - 16:33

Просмотр сообщенияyKa3 (06 Август 2014 - 16:10) писал:

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

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

Просмотр сообщенияyKa3 (06 Август 2014 - 16:10) писал:

Пробовал вычисление:
$line['След.действие']=$line['Действие']; результата нет

Это вычисление бессмысленно по двум причинам: во-первых в $line лежат только поля текущей записи, а поле "Действие" расположено в другой. Во-вторых, как уже сказано выше, вначале необходимо определится, из какой именно записи (строки) берется поле. Это возможно сделать только запросом, где указаны условия отбора записей.

#6 CbCoder

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

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

Отправлено 06 Август 2014 - 16:49

Просмотр сообщенияyKa3 (06 Август 2014 - 16:16) писал:

И если вы говорите что поле не должно как-то автоматически заполняться, то зачем тогда эта справка и вообще что это тогда?

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

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

#7 yKa3

    Участник

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

Отправлено 08 Август 2014 - 07:41

Вы можете написать пример такого вычисления? К примеру есть в родительской таблице "main" поле "example" типа список. И есть в подтаблице "second" поле "ex" типа список. Каким вычислением связать этих два поля? Чтобы в родительской таблице "main" выводились данные из подтаблицы "second"

#8 CbCoder

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

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

Отправлено 08 Август 2014 - 08:14

Я же вам уже несколько раз задавал уточняющий вопрос: из какой именно записи (строки) подчиненной таблицы нужно брать значения? Из первой, последней, или по какому-то другому условию? Без этого нужный запрос не составить.

#9 yKa3

    Участник

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

Отправлено 08 Август 2014 - 09:57

Немного не понял. Там одно поле типа список и одна строка, в которую менеджер подставляет на выбор одно из нескольких действий: позвонить, отправить письмо, встретится.

#10 yKa3

    Участник

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

Отправлено 08 Август 2014 - 09:59

Само поле Действие в подтаблице является девятой строчкой сверху если вы про это

#11 CbCoder

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

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

Отправлено 08 Август 2014 - 10:07

Просмотр сообщенияyKa3 (08 Август 2014 - 09:57) писал:

Немного не понял. Там одно поле типа список и одна строка, в которую менеджер подставляет на выбор одно из нескольких действий: позвонить, отправить письмо, встретится.

Почему одна? В подтаблице к одной родительской записи может быть привязано несколько подчиненных. Например, у контрагента в подтаблице "История контактов" может несколько записей о контактах за разные даты. У вас в подтаблице "Работа с заявкой" наверняка тоже не одна запись будет по одной заявке, иначе смысл в подтаблице теряется - те же поля можно поместить в основную запись.


Просмотр сообщенияyKa3 (08 Август 2014 - 09:59) писал:

Само поле Действие в подтаблице является девятой строчкой сверху если вы про это

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

#12 yKa3

    Участник

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

Отправлено 08 Август 2014 - 10:18

У меня в подтаблице "Работа с заявками" всего 11 записей. Запись(поле) "Действие" является 7 с верху строкой, т.е. как я понимаю 7ой записью. Нужно сделать так, чтобы именно эта седьмая запись передавалась в родительскую таблицу "Заявки"

#13 CbCoder

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

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

Отправлено 08 Август 2014 - 10:32

Просмотр сообщенияyKa3 (08 Август 2014 - 10:18) писал:

Запись(поле) "Действие"

Просмотр сообщенияCbCoder (08 Август 2014 - 10:07) писал:

Повторюсь: записи - это СТРОКИ таблицы, А НЕ ПОЛЯ

:wacko:

Вы вообще читаете, что я пишу?

#14 CbCoder

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

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

Отправлено 08 Август 2014 - 10:42

Просмотр сообщенияCbCoder (08 Август 2014 - 10:07) писал:

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

На картинке ниже 3 записи (но может быть и одна и десять и сто и сколько угодно). От вас требуется уточнить, из какой записи (не конкретный номер разумеется, а УСЛОВИЕ отбора - т.е. например с первой или последней датой) необходимо брать значения полей.

Прикрепленные изображения

  • Прикрепленное изображение: screen.jpg


#15 yKa3

    Участник

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

Отправлено 08 Август 2014 - 11:19

То, что вы обвели это строки? Вы создали программу для владельцев бизнесов и по большей части это малый бизнес(без своих штатных it-сотрудников), а не для программистов которые будут разбираться в коде и понимать где тут строки, где поля и так далее. Я хочу элементарно сделать, чтобы поле одной таблицы, отображалось в поле другой таблицы и все. И если вам понятно, что пишите вы как человек в этом разбирающийся это не значит что это же понимают люди которые далеки от it-сферы.(А это 90% ваших клиентов)

Сообщение отредактировал yKa3: 08 Август 2014 - 11:20


#16 CbCoder

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

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

Отправлено 08 Август 2014 - 11:30

Тут программирование абсолютно не причем. Речь об элементарной логике. Невозможно взять значение поля из какой либо таблицы, не зная, из какой именно строки его брать.

Я могу привести полностью аналогичный пример из реальной жизни: представьте, что вы директор и у вас стоит очередь из неопределенного количества людей на прием. Допустим я - ваш секретарь, и вы мне говорите: "возьмите паспорт у посетителя в очереди". Разумеется, у меня сразу возникнет вопрос: "извините, а у какого именно посетителя, если их там может быть несколько?". У первого в очереди, у последнего, или может у самого старого, или самого молодого? Предоставьте мне параметр отбора, по какому я должен выбрать того посетителя, у которого я должен взять информацию.

Что вам конкретно непонятно из скриншота? Там несколько записей в подтаблице, чтобы перенести дату в родительскую запись, нужно вначале понять, из какой записи ее взять, т.к. там их 3, в данном случае.

#17 yKa3

    Участник

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

Отправлено 08 Август 2014 - 11:47

Пример ясен и логика ясна, но так как это реализовано в самой срм не так легко понять и разобраться. Запись нужна всегда самая последняя, т.е. например первое действие было позвонить 15.08.2014, дата должна подставляться 15.08.2014, допустим 15 августа было принято решение встретится 18 августа и была поставлена дата следующего дейтсвия 18.08.2014, следовательно дата в строке должна поменяться на 18.08.2014

#18 Дмитрий ЕСП

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

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

Отправлено 08 Август 2014 - 11:49

Предлагаю сделать раздел – троллинг. :D

#19 CbCoder

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

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

Отправлено 08 Август 2014 - 12:59

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

// извлекаем с помощью запроса нужную запись:
$data = data_table("Работа по заявке", "`Заявка №`=".$line['ID']." ORDER BY `Дата` DESC")
// копируем значения нужных полей:
$line['След.действие'] = $data['Действие'];
$line['Исполнить до'] = $data['Дата'];

Это вычисление должно быть в родительской записи на условие "отображение поля След.действие" или "отображение поля Исполнить до" .

#20 yKa3

    Участник

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

Отправлено 08 Август 2014 - 16:30

Добавил данное вычесление в родительскую таблицу, после сохранения при переходе в Заявки пишет:

Ошибка в вычислении.


Заявки.Отображение поля: След. действие
Заявки.Вычисление След. действие :

1: $data = data_table("Работа по заявке", "`Заявка №`=".$line['id']." ORDER BY `Дата` DESC")
2: $line['f3761'] = $data['Действие'];
3: $line['Исполнить до'] = $data['Дата'];
syntax error, unexpected T_VARIABLE






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

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