![]() |
|
Модераторы: Akina |
![]()
|
|
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
При каких условиях MS Access разрешает добавлять записи прямо в запрос (открытый в виде таблицы), связывающий несколько таблиц?
|
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 30 Всего: 454 |
Только когда соблюдается правило однозначности для всех участвующих в запросе таблиц.
Ройте справку по словам "обновляемый рекордсет", "updatable recordset". -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Конкретизирую вопрос на примере.
Есть таблица (одна) для иерархического хранения территорий. Пример её заполнения показан в прикреплённом файле. В ней три поля: ID, Nam и UpID. UpID -- это идентификатор вышестоящей территории. Он не обязателен; в этом случае в данном поле стоит NULL и описываемая строкой территория является корневой. Далее делаем вот такой запрос: SELECT Land_1.Nam AS UpperNam, Land.Nam AS LowerNam FROM Land INNER JOIN Land AS Land_1 ON Land.UpID = Land_1.ID; Я хочу внести в него новую строку: Луна - Тихо. Почему не получается? Присоединённый файл ( Кол-во скачиваний: 2 )
landtablesample.jpg 11,04 Kb |
|||
|
||||
| bopoha |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1283 Регистрация: 10.5.2006 Где: Беларусь, Минск Репутация: 21 Всего: 21 |
Таблицы должны быть связаны один-к-одному. Также есть ситуации, когда MS Access разрешает редактирование один-ко-многим, со стороны один. Если попробовать ввести данные в несуществующую запись, то будет ругаться или запись уйдет "в никуда", т.е. связи не будет. Точно не помню.
Если вы создадите схему данных и укажите соблюдать целосность, то появится больше возмжоностей. Я же порекомендовал не играться с огнем и один-ко-многим не исользовать для редактирования и добавления. Для этого есть подчиненные формы. |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
По моим представлениям, системе вполне достаточно информации, чтобы добавить в таблицу Land две строки, одну для Луны, с UpID=NULL и с новым значением счётчика ID, а другую -- для кратера Тихо, придав ему UpID равный ID-у Луны.
Никакий неоднозначности я не вижу. Добавлено через 1 минуту и 58 секунд Этот подход мною широко используется Но всё же, интересно было бы понять, какие принципы управляют поведением MSAccess в данном случае. Добавлено через 9 минут и 45 секунд Если переформулировать запрос вот так: SELECT Land_1.Nam AS UpperNam, Land.UpID, Land.Nam AS LowerNam FROM Land INNER JOIN Land AS Land_1 ON Land.UpID = Land_1.ID; то есть, добавить в вывод поле UpID подчинённой таблицы, то всё начинает работать. При этом, при добавлении записи, поле UpID надо не заполнять -- тогда оно заполнится само, правильно. Почему так? Добавлено через 11 минут и 29 секунд Если пытаться редактировать поле UpID, то возникает сообщение об ошибке. |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 30 Всего: 454 |
Отлично, Вы проделали практически всю работу, необходимую, чтобы понять суть отличия обновляемого набора данных от необновляемого. Теперь сделайте маленький логический шажок вперед...
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| bopoha |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1283 Регистрация: 10.5.2006 Где: Беларусь, Минск Репутация: 21 Всего: 21 |
Dims, я рассматриваю использование не надежных способов очень сильным ударом по сопровождаемости продукта. Поэтому не рекомнедую это использовать.
Дальше я считаю необходимости использовать данную конструкцию нет, т.к. ввод будет осучществляться через GUI. А если и будете использвать запрос, то как вы избежите повторения значений со стороны многие? А эту проблему вам нужно будет решать. В моей практике такие запросы используются только для отчетов. Мне это не извесно, есть подозрение, что это реализация редактора. А редактировать UpID нельзя, т.к. он исопльзуется в связи. |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
||||
|
||||
![]()
|
| Правила форума "MS Access" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MS Access | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |