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


Как забирать данные из несвязанных таблиц


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

#1 etpu

    Участник

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

Отправлено 10 Апрель 2012 - 10:25

Добрый день.

Никак не могу придумать (не хватает технических познаний) систему по связи таблиц.

Главная проблема. Можно ли связать 2 таблицы с помощью ещё одной.

Есть главная Таблица "КОНТРАГЕНТЫ" и "ДОГОВОР"
Есть подтаблица "КОНФИГУРАЦИЯ" связанная в данный момент с контрагентами. Этаже таблица связана с другой таблицей "НАИМЕНОВАНИЯ УСЛУГ" в которой хранятся наименования услуг (список) с 2 ценами по умолчанию и с 2 расширенными наименованиями.
Вот так выглядит более подробно:

Таблица НАИМЕНОВАНИЯ УСЛУГ:
Общее название текст
Название единоверменной услуги текст
Цена по умолчанию (руб) число
Услуга Ежемесячная? список
Название ежемесячной улсуги текст
Цена по умолчанию Ежемесячная (руб) число

Таблица КОНФИГУРАЦИЯ:
Организация ID связь
Название связь
Количество число
Группа: Разовые
Разовая цена (руб) число
СУММА Разовая (руб) число
Группа: Ежемесячные
Ежемесячная цена (руб) число
СУММА Ежемесячная (руб) число

Таблица наименования услуг ни с кем не связана, таблица конфигурация подчиненная и связана с таблицей КОНТРАГЕНТЫ по полю Организация ID и с таблицей НАИМЕНОВАНИЯ УСЛУГ по полю Название - Общее название.


Пока все работает хорошо. Добавляем нового контрагента. Внизу появляется таблица КОНФИГУРАЦИЯ. Мы выбираем из списка Название услуги (связанное поле). Ставим количество и в 4 полях Цены и суммы автоматически заполняются данные из таблицы НАИМЕНОВАНИЯ УСЛУГ.


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

А нужно чтобы в договоре появлялось что то типа этого:
Единоразовые услуги:
Номер / Наименование / кол-во / цена / сумма
1. Наименование первой услуги 1 шт 10 000р 10 000р.
2. Наименование второй услуги 3 шт 5 000р. 15 000р


Ежемесячные услуги:
Номер / Наименование / кол-во / цена / сумма
1. Ежемесячная поддержка первой услуги 1 шт 1 000р 1 000р.
2. Ежемесячная поддержка второй услуги 3 шт 500р. 1 500р


На данный момент в голову приходит продублировать таблицу КОНФИГУРАЦИЯ и связать её с таблицей ДОГОВОР. и когда в каком то из 2х таблиц происходит изменение чтобы оно производилось и в соседней таблице.

В идеале хорошо бы использовать всего одну таблицу КОНФИГУРАЦИЯ и связать её сразу с двумя таблицами КОНТРАГЕНТЫ и ДОГОВОР. Но пока корректно этого сделать не получается. К тому же договор создается позже. Сперва заполняются поля контрагента, потом КОНФИГУРАЦИЯ и только потом добавляется договор и там приложения к договору. Первое приложение это как раз Единовременные услуги, второе приложение Ежемесячные.

Подскажите как в данной ситуации лучше решить данную проблему?

#2 CbCoder

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

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

Отправлено 10 Апрель 2012 - 11:03

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

#3 etpu

    Участник

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

Отправлено 10 Апрель 2012 - 12:29

При нажатии кнопки Добавить договор должна создаваться не одна запись, а 3 и более.

Что, в этом случае, нужно написать в вычислении чтобы сразу несколько строк из подТаблицы КОНФИГУРАЦИЯ (Контрагента) вносились в другую таблицу "КОНФИГУРАЦИЯ2" которая так же является ПодТаблицей - "Договор".

$data['Количество'] = $line['Количество'];
$data['Разовая цена (руб)'] = $line['Разовая цена (руб)'];
insert_query($data,"Конфигурация2");

Данное вычисление работать не будет и это логично.

Может быть есть какой то код позволяющий сразу скопировать строки целиком в другую таблицу?

Сообщение отредактировал etpu: 10 Апрель 2012 - 12:31


#4 CbCoder

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

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

Отправлено 10 Апрель 2012 - 13:24

Просмотр сообщенияetpu (10 Апрель 2012 - 12:29) писал:

Данное вычисление работать не будет и это логично
Данное вычисление работать не будет, т.к. в переменной $line содержатся поля основной записи, в данном случае "контрагента" (т.к. кнопка создания Договора находится в ней), и полей из "конфигурации" там естественно нет. Их необходимо доставать отдельно, через функцию data_table. Причем, т.к. там может быть несколько записей, необходимо делать цикл, и добавлять записи в "конфигурацию 2" по очереди.

// 1. создаем сам договор
$dog['Поле1'] = "значение1"; // заполняем поля договора
$dog['Поле2'] = $line['Поле']; // в том числе, если нужно, и копированием данных из основной записи
......
$dog_id = insert_query($dog,"Договор"); // добавляем договор; возвращаем id добавленного договора
// 2. копируем конфигурацию
$conf_all = data_table("Конфигурация", "`Поле связи с контрагентом`=".$line['ID'], "all") // выбираем все строки из конфигурации с текущим контрагентом
foreach ($conf_all as $conf) // цикл по всем выбранным записям
{
  $conf2['Поле связи с договором'] = $dog_id; // заполняем поле связи с договором
  $conf2['Поле1'] = $conf['Поле1']; // копируем поля по очереди
  ......
  insert_query($conf2,"Конфигурация2"); // добавляем запись в Конфигурация2
}


#5 etpu

    Участник

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

Отправлено 10 Апрель 2012 - 16:41

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

Но возник другой вопрос. Как связать 2 таблицы таким образом что при изменении значения в одной таблице (например количество) оно автоматически менялось и в другой. И не получится ли коллизий? Ведь когда изменяется значение во второй таблице срабатывает вычисление и оно меняет значение в первой и опять все по новой.

Как в этом случае сделать правильнее?

#6 CbCoder

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

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

Отправлено 11 Апрель 2012 - 08:59

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

#7 etpu

    Участник

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

Отправлено 11 Апрель 2012 - 09:30

спасибо.





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

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