![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Вопрос такой: каким образом можно организовать связь таблиц (ADOTable) находящихся в отношении многие ко многим между собой через кросс таблицу в делфи.
Связать две таблицы в отношении один-ко-многим просто - я указывал mastersource и masterfield у подчиненной таблицы, но два mastersource не существует... ----------------------------------------------------- Чем пользуюсь: Delphi 7, MS SQL Server 2005 EE, ADO |
#2
|
|||
|
|||
![]() Связь реализуется на БД.
А в клиенте ты ее нормально все-равно не покажешь. Так что тут достаточно 2х компонентов. Подробнее задачу давай, т.к. не понятно что конкретно ты хочешь. Например, есть, ну не знаю... аренда машин. Есть табоица клиентов и таблица машин. Нам интересно знать какие машины клиент вообще брал в аренду. Задача чисто умозрительная. В реале такие задачи так не решаются. Соответсвенно, делаем таблицу Clients и таблицу Cars, ну и отношение между ними м-к-м в таблице ClientsCars. Так вот в приложении тебе все-равно надо показывать либо машины, ктоторые брал конкретный клиент, либо клиентов, кторые брали конкретную машину. Т.е. в обоих случаях отношение отображается на самом деле один-ко-многим. Ну а запрос будет примерно такой: Код:
SELECT C.* FROM Cars C LEFT JOIN ClientsCars CC ON C.ID = CC.CarID WHERE CC.ClientID = :ClientID Т.е. мы сотмрим какие машины брал клиент. Для этого склеиваем таблицу Машин и таблицу МашинКлиентов и фильтруем результат по клиенту (параметр в WHERE). |
#3
|
|||
|
|||
![]() ну это вроде понятно.. Меня интересует возможность редактирования информации и ввода новой информации, а с этим как я понимаю сложнее.
У меня есть такая связка таблиц "Сотрудник" <-> "СотрудникПриказ" <-> "Приказ". Таблица "СотрудникПриказ" содержит внеш.ключи на "Сотрудник" и на "Приказ". В своей программе я открываю сотрудников - они у меня отображены в dbgrid, а рядом кнопка "Создать приказ" по которой открывается новая форма, где вводятся данные приказа. Как сделать ввод и сохранение данных приказа? |
#4
|
|||
|
|||
![]() Так и делать. Работа с таблицей приказов.
Только при сохранении данных ты должен добавить еще запись в таблицу СотрудникПриказ. Вот и вся разница. |
#5
|
|||
|
|||
![]() Цитата:
Меня как раз интересуют технические моменты: каким образом следует добавлять запись в "СотрудникиПриказы"? Допустим у меня такой код на сохранение изменений в таблице "Приказы": if DataModuleUnit.OrdersTable.Modified then DataModuleUnit.OrdersTable.Post; Как теперь добавить запись в "СотрудникиПриказы"? |
#6
|
||||
|
||||
![]() 1. Прежде чем добавить, сделайте проверку на повтор данных.
2. Постарайтесь неиспользовать прямое обращение к таблице. Все через запрос. Примерно так можно организовать ввод сотрудника Код:
Q := TAdoQuery.Create(nil); Q.Connection := MyDB; Q.SQL.Text := 'select КодСотрудника from Сотрудники where Сотрудник=:Сотрудник'; Q.Parameters.ParamValues['Сотрудник'] := Edit1.Text; Q.Open; if Q.isEmpty then begin Q.SQL.Text := 'insert into Сотрудники (Сотрудник) values(:Сотрудник)'; Q.Parameters.ParamValues['Сотрудник'] := Edit1.Text; Q.ExecSql; Q.SQL.Text := 'select Max(КодСотрудника) as КодСотрудника from Сотрудники'; Q.Open; end; EmployeeKey := Q.FieldValues['КодСотрудника']; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#7
|
||||
|
||||
![]() Цитата:
Так как я писал ранее, прежде чем добавить в таблицу СотрудникиПриказы что-либо вам необходимо получить пару значений КодПриказа из Приказов и КодСотрудника из Сотруднков. Или вы незнаете комманды Append для таблицы? Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#8
|
||||
|
||||
![]() Вы как-то не тем путем пошли. Делайте так как это происходит в реале.
Сначала рождается приказ за каким-то номером, в котором перечислены сотрудники. 1. Вы заносите в таблицу приказов новую запись, получаете ее номер. 2. Затем в таблицу Сотрудников добавляете/выбираете запись на сотрудника получаете его код. 3. Наконец в таблицу СотрудникПриказ добавляете запись с кодом сотрудника и кодом приказа. 4. Повторяете п.2,3 для всех сотрудников перечисленых в приказе. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |