Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как сделать обновляемой хитрую связь? / 12 сообщений из 12, страница 1 из 1
03.05.2004, 03:28
    #32505814
Dyadya Zed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обновляемой хитрую связь?
Есть 2 таблицы:

Dogovora:

Dog_id ID договора (ключевое)
N_dog Номер договора
поля атрибутов (не участвуют в связях)

Dog_to_Dop_soglash:

Dog_id ID договора
N_Dop_soglash Номер доп. соглашения

Связь 1:М осуществляется по полю N_dog. Каждый договор может быть как просто договором, так и дополнительным соглашением по договору. Атрибуты у доп. соглашения такие же как и у договора и, фактически доп. соглашение является тем же договором.

Хочу сделать связанные формы, чтоб к конкретному договору добавлять доп. соглашения. Вот как выглядит запрос:

SELECT Dog_to_Dop_soglash.Dog_id, Dogovora.Dog_id, Dog_to_Dop_soglash.N_dop_soglash, Dogovora.N_dog, Dogovora.*
FROM Dogovora INNER JOIN Dog_to_Dop_soglash ON Dogovora.Dog_id = Dog_to_Dop_soglash.N_dop_soglash;

Привязки работают, формы показываются корректно, но при удалении и добавлении данных возникают ошибки (такой индекс уже существует, не могу добавить данные, таблица Dogovora не содержит необходимого id и т.п.)
По всей видимости данные во вспомогательной таблице не добавляются и не удаляются (проверял).

Как сделать так, чтоб все-таки в доп. таблице данные обновлялись???
Спасибо!
...
Рейтинг: 0 / 0
03.05.2004, 10:24
    #32505847
Roma R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обновляемой хитрую связь?
Может лучше использовать подчиненные формы
В главной форме отображаете запись из таблицы Dogovora, а в подчиненной связазанные записи из таблицы Dog_to_Dop_soglash
...
Рейтинг: 0 / 0
03.05.2004, 12:35
    #32505914
Dyadya Zed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обновляемой хитрую связь?
Формы являются подчиненными. Проблема в том, что в таблице доп. соглашения хранятся только привязки доп. соглашений к договорам. И эта табличка не обновляется.. :(( Например у 10 договора есть доп.соглашения 20 и 21. Таблица доп. договора тогда выглядит так:

Dog_to_Dop_soglash:

Dog_id N_dop_soglash
10 20
10 21
...
Рейтинг: 0 / 0
03.05.2004, 12:39
    #32505915
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обновляемой хитрую связь?
А что является первичным ключом в каждой из таблиц?
...
Рейтинг: 0 / 0
05.05.2004, 00:18
    #32506708
Dyadya Zed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обновляемой хитрую связь?
Читаем внимательнее... В первой таблице Dog_id, во второй ключа нет, оба поля индексируемые
...
Рейтинг: 0 / 0
05.05.2004, 00:25
    #32506712
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обновляемой хитрую связь?
Что-то я запутался. По-моему, вот эти два утверждения противоречат друг другу:

авторСвязь 1:М осуществляется по полю N_dog.
Dogovora INNER JOIN Dog_to_Dop_soglash ON Dogovora.Dog_id = Dog_to_Dop_soglash.N_dop_soglash;
И еще:

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

Может, с примером данных станет понятнее...
...
Рейтинг: 0 / 0
06.05.2004, 23:37
    #32509917
Dyadya Zed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обновляемой хитрую связь?
Вот пример таблицы и тип связи. Галки стоят все.
...
Рейтинг: 0 / 0
06.05.2004, 23:51
    #32509919
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обновляемой хитрую связь?
Первое, что бросается в глаза. В запросе указана связь
Dogovora.Dog_id = Dog_to_Dop_soglash.N_dop_soglash
а на схеме такой связи между таблицами нет. То есть надо таблицу Dogovora поместить на схему еще раз (она получит название Dogovora_1) и привязать так, как в запросе.

Второе. Я не знаю, как сделаны форма и сабформа, какие RecordSource'ы у той и другой и как организована связь между ними, но я бы сделал так:

главная форма:
SELECT * FROM Dogovora WHERE Dog_id in
(SELECT Dog_id FROM Dog_to_Dop_soglash)

сабформа:
SELECT Dogovora.*, Dog_to_Dop_soglash.Dog_Id AS ParentId
FROM Dogovora INNER JOIN Dog_to_Dop_soglash ON Dogovora.Dog_id = Dog_to_Dop_soglash.N_dop_soglash;

поля для связи:
LinkMasterFields = Dog_id
LinkChildFields = ParentId
...
Рейтинг: 0 / 0
06.05.2004, 23:57
    #32509922
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обновляемой хитрую связь?
При этом новая связь, которую я предложил добавить, будет 1:1. Это не есть хорошо. Лучше было бы поле ParentId добавить прямо в таблицу Dogovora (и заполнить его из Dog_to_Dop_soglash.Dog_id), а таблицу Dog_to_Dop_soglash убрать как ненужную.

И тогда на схеме связей будет только одна связь между двумя экземплярами одной таблицы.
...
Рейтинг: 0 / 0
07.05.2004, 16:59
    #32511006
Dyadya Zed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обновляемой хитрую связь?
Тогда у каждого договора будет ParentId. Вполне возможен такой вариант, что доп. соглашение ссылается на доп. соглашение... а такого по бизнес-логике быть не может.. Как убрать такую нежелетельную возможность?
...
Рейтинг: 0 / 0
07.05.2004, 19:38
    #32511219
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обновляемой хитрую связь?
Просто при добавлении/изменении добавить проверку.
...
Рейтинг: 0 / 0
08.05.2004, 15:37
    #32511483
neal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обновляемой хитрую связь?
Первое, что бросается в глаза -
это проблема в некорректной связке в запросе:

SELECT Dog_to_Dop_soglash.Dog_id, Dogovora.Dog_id, Dog_to_Dop_soglash.N_dop_soglash, Dogovora.N_dog, Dogovora.*
FROM Dogovora INNER JOIN Dog_to_Dop_soglash ON Dogovora.Dog_id = Dog_to_Dop_soglash. N_dop_soglash ;

вместо выделенного наверно имелось ввиду Dog_id

Это если связь между таблицами по Dog_id

Если Вы хотите, чтобы было дерево договоров и доп.соглашений, то надо и те и другие хранить в одной таблице с ParentID, если нет, то Ваш вариант вполне нормален для того, чтобы доп.соглашение ссылалось только на какой нибудь договор.


Да и еще, наверно нужно подкорректировать:

главная форма:
SELECT * FROM Dogovora WHERE Dog_id in
(SELECT Dog_id FROM Dog_to_Dop_soglash)

- в главной форме нельзя увидеть договора без доп.соглашений

Если заменить просто на SELECT * FROM Dogovora, тогда все будет нормально.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как сделать обновляемой хитрую связь? / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]