Добрый день.
Никак не могу придумать (не хватает технических познаний) систему по связи таблиц.
Главная проблема. Можно ли связать 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х таблиц происходит изменение чтобы оно производилось и в соседней таблице.
В идеале хорошо бы использовать всего одну таблицу КОНФИГУРАЦИЯ и связать её сразу с двумя таблицами КОНТРАГЕНТЫ и ДОГОВОР. Но пока корректно этого сделать не получается. К тому же договор создается позже. Сперва заполняются поля контрагента, потом КОНФИГУРАЦИЯ и только потом добавляется договор и там приложения к договору. Первое приложение это как раз Единовременные услуги, второе приложение Ежемесячные.
Подскажите как в данной ситуации лучше решить данную проблему?
1
Как забирать данные из несвязанных таблиц
Автор etpu, 10 апр. 2012 10:25
Сообщений в теме: 6
#1
Отправлено 10 Апрель 2012 - 10:25
#2
Отправлено 10 Апрель 2012 - 11:03
На данный момент подтаблица не может быть подчинена двум основным одновременно, хотя этот вопрос уже поднимался, и скорее всего будет как-то реализован в будущем. Поэтому придется делать дублирование с автозаполнением после нажатия на кнопку Добавить договор (перенос данных из Контрагентов).
#3
Отправлено 10 Апрель 2012 - 12:29
При нажатии кнопки Добавить договор должна создаваться не одна запись, а 3 и более.
Что, в этом случае, нужно написать в вычислении чтобы сразу несколько строк из подТаблицы КОНФИГУРАЦИЯ (Контрагента) вносились в другую таблицу "КОНФИГУРАЦИЯ2" которая так же является ПодТаблицей - "Договор".
Данное вычисление работать не будет и это логично.
Может быть есть какой то код позволяющий сразу скопировать строки целиком в другую таблицу?
Что, в этом случае, нужно написать в вычислении чтобы сразу несколько строк из подТаблицы КОНФИГУРАЦИЯ (Контрагента) вносились в другую таблицу "КОНФИГУРАЦИЯ2" которая так же является ПодТаблицей - "Договор".
$data['Количество'] = $line['Количество']; $data['Разовая цена (руб)'] = $line['Разовая цена (руб)']; insert_query($data,"Конфигурация2");
Данное вычисление работать не будет и это логично.
Может быть есть какой то код позволяющий сразу скопировать строки целиком в другую таблицу?
Сообщение отредактировал etpu: 10 Апрель 2012 - 12:31
#4
Отправлено 10 Апрель 2012 - 13:24
etpu (10 Апрель 2012 - 12:29) писал:
Данное вычисление работать не будет и это логично
// 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
Отправлено 10 Апрель 2012 - 16:41
Огромное спасибо за развернутый ответ. Тут более менее понятно... Сегодня завтра попробую такую схему применить.
Но возник другой вопрос. Как связать 2 таблицы таким образом что при изменении значения в одной таблице (например количество) оно автоматически менялось и в другой. И не получится ли коллизий? Ведь когда изменяется значение во второй таблице срабатывает вычисление и оно меняет значение в первой и опять все по новой.
Как в этом случае сделать правильнее?
Но возник другой вопрос. Как связать 2 таблицы таким образом что при изменении значения в одной таблице (например количество) оно автоматически менялось и в другой. И не получится ли коллизий? Ведь когда изменяется значение во второй таблице срабатывает вычисление и оно меняет значение в первой и опять все по новой.
Как в этом случае сделать правильнее?
#6
Отправлено 11 Апрель 2012 - 08:59
Коллизий не будет, если предварительно проверять, равны ли значения, и производить изменение только в случае разности.
#7
Отправлено 11 Апрель 2012 - 09:30
спасибо.
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных