Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2010, 10:34   #1
Сергей089
Форумчанин
 
Регистрация: 22.09.2008
Сообщений: 214
По умолчанию Access ограничить значение поля таблицы значениями полей другой таблицы

Здравствуйте. У меня в бд есть две таблицы:
1) Дома. Поля: id, дата постройки, дата сноса;
2) Жильцы. Поля: id, id_дом, дата заселения.
Как в бд поставить такое ограничение, чтобы в поле дата заселения по выбранному дому можно было вводить только дату между датой постройки и датой сноса?
Сергей089 вне форума Ответить с цитированием
Старый 10.11.2010, 10:50   #2
Риндера
Delphi, учу С
Форумчанин
 
Аватар для Риндера
 
Регистрация: 20.10.2010
Сообщений: 178
По умолчанию

В конструкторе таблички Жильцы внизу есть куча всяких доп. параметров, среди них - маска ввода.
Риндера вне форума Ответить с цитированием
Старый 10.11.2010, 13:06   #3
Сергей089
Форумчанин
 
Регистрация: 22.09.2008
Сообщений: 214
По умолчанию

Нет, это не то. Мне не нужен ввод в определенном формате, мне нужно введенное значение проверить на условие:
(Жильцы.[дата заселения]>=Дома.[дата постройки]) and (Жильцы.[дата заселения]<Дома.[дата сноса])
и чтобы, если условие=false, access как-нибудь ругался бы, выдавал ошибку. Или такая проверка возможна лишь в приложении?
Сергей089 вне форума Ответить с цитированием
Старый 10.11.2010, 13:46   #4
Сергей089
Форумчанин
 
Регистрация: 22.09.2008
Сообщений: 214
По умолчанию

Попробовал для поля дата заселения ввести условие на значение >[Таблицы]![Дома]![дата_постройки], но при сохранении Access ругается, что не может найти поле Таблицы]![Дома]![дата_постройки.
Сергей089 вне форума Ответить с цитированием
Старый 10.11.2010, 15:00   #5
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте Сергей089.
Ответ на вопрос "..есть две таблицы .. Как .. поставить .. ограничение..?" в Вашем случае - никак.

"условие на значение" задается константой, динамически изменять его нельзя.
Да и потребности в этом нет, т.к. таблицы БД предназначены для хранения данных, ввод и обработка должны осуществляться с применением "Интерфейса" (форм),
в них и задаются все алгоритмы и условия выполнения работы с данными.
И Ваше желание "..две таблицы..поставить такое ограничение.." может реализоваться именно так - с формой.

Успехов Вам.
Евгений.
Teslenko_EA вне форума Ответить с цитированием
Старый 10.11.2010, 15:41   #6
Сергей089
Форумчанин
 
Регистрация: 22.09.2008
Сообщений: 214
По умолчанию

Спасибо Teslenko_EA, но с формой не интересно. А если человек полезет заполнять прямо в таблицу значения, то потом будут разные нестыковки. Нашел похожую тему Creating a Table with a Validation Rule Referencing a Column in Another Table и переписал под себя запрос:
Код:
create table Жильцы
(
id autoincrement primary key,
id_дом integer,
[дата заселения] date,
constraint svyaz foreign key (id_дом) references Дома on update cascade on delete cascade,
constraint moe_ogranichenie check(([дата заселения]>=(select [дата постройки] from Дома where id=Жильцы.id_дом)) and ([дата заселения]<(select [дата сноса] from Дома where id=Жильцы.id_дом)))
)
Условие moe_ogranichenie работает, только я его нигде найти не могу , и оно не дает удалить таблицы (но мне и не нужно ничего удалять).
Прикрепил то, что получилось.
Вложения
Тип файла: rar db2.rar (10.2 Кб, 29 просмотров)
Сергей089 вне форума Ответить с цитированием
Старый 10.11.2010, 22:20   #7
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Сергей089, Вы конечно правы предикат CONSTRAINT который можно применять для установления связи с другой таблицей,
и ограничения на одно или несколько полей, в MS Access существует.
Но то-ли потому что MS Jet не поддерживает использование инструкции CONSTRAINT вне Jet ядра,
то-ли потому что предложение CONSTRAINT используется только в инструкциях ALTER TABLE и CREATE TABLE,
т.е. не поддерживается мастером запросов MS Access, он почти не применяется.
(зря ведь на него можно возложить часть функций отсутствующего триггера)

При создании (CREATE) или изменении (ALTER) таблиц в SQL конструкцию
можно добавлять (или удалять) предложение CONSTRAINTэто хорошо,
есть надежда на возможность возвращения таблицы в разряд удаляемых.
"..нигде найти не могу.." - вот оно проявление отсутствия мастера,
(для многих пользователей MS Access это не преодолимая преграда)

"..с формой не интересно .. А если человек полезет заполнять прямо в таблицу..", для начала : люди обычно не лазят а ходят,
ну а если так случилось и кто-то "полез", барьером для него должен быть интерфейс (форма).
В некоторых случаях форма - "барьер", в некоторых "помощник".
По аналогии с банком, БД - тоже банк (данных), даже если Вы являетесь вкладчиком банка,
для обеспечения целостности данных Вас никогда не допустят в хранилище,
максимум к менеджеру/оператору. Банк беспокоится о целостности своих ресурсов,
а Вы заботитесь о целостности данных

Евгений.
Teslenko_EA вне форума Ответить с цитированием
Старый 11.11.2010, 01:53   #8
D.Shibanov
Пользователь
 
Регистрация: 01.09.2010
Сообщений: 28
По умолчанию

Здравствуйте Сергей089.

Абсолютно согласен с Евгением и готов подписаться под его словами.
Считаю "... лазить заполнять прямо в таблицу..." чрезвычайно неразумно!
В этом случае практически невозможен мониторинг и контроль действий пользователя и целостности данных!
И Ваш вопрос тому пример. Столько "телодвижений" для задачи, которая гораздо проще решается стандартными методами.
Разве только чисто из "спортивного" интереса...

Последний раз редактировалось D.Shibanov; 11.11.2010 в 01:56.
D.Shibanov вне форума Ответить с цитированием
Старый 07.12.2010, 00:05   #9
vasja_slvm
Новичок
Джуниор
 
Регистрация: 06.12.2010
Сообщений: 2
Печаль

Граждане умные! Помогите мне пожалуйста. Я учусь на первом курсе на редактора, мне надо сделать контрольную работу по информатике, в частности база данных. И одно из заданий
"В поле «Цена поставки» таблицы «Поставки» должно стоять условие, учитывающее, что цена поставляемой продукции не может быть ниже ее себестоимости в таблице «Продукция». " (таблицы связаны по товару один-ко многим)
Ответьте мне, пожалуйста: это мне надо сделать практически то, что здесь описал Сергей089? Или я не так поняла и от меня всё-таки требуется что-то намного проще?
просто в методичке все пояснения ограничены
"При этом, для задания значения поля по умолчанию либо Условия на ввод значений в поле таблицы при ее заполнении, можно использовать Построитель выражений, который активизируется кнопкой в этой строке с тремя точками либо одноименной кнопкой на панели пиктографического меню. "
Спасибо за внимание. Извините за беспокойство.

Последний раз редактировалось vasja_slvm; 07.12.2010 в 00:09.
vasja_slvm вне форума Ответить с цитированием
Старый 07.12.2010, 14:02   #10
Сергей089
Форумчанин
 
Регистрация: 22.09.2008
Сообщений: 214
По умолчанию

Это был SQL запрос. Как использовать использовать Построитель выражений я не знаю. Я сделал через запрос.
Таблицы такие:

Поставки
ключ id_поставки Счетчик
Цена поставки Числовой
код_продукции Числовой

Продукция
ключ id_продукции Счетчик
Себестоимость Числовой


Для этого нужно зайти в Сервис->Параметры на вкладку "Таблицы и запросы" и поставить галочку в "Синтаксис для SQL Server". Затем создать запрос в режиме конструктора, никаких таблиц добалять не нужно. На запросе вызвать контекстное меню и выбрать "режим SQL". Вставить код:
Код:
alter table Поставки
add constraint moe_ogranichenie
check
(
[Цена поставки]>=(select Себестоимость from Продукция where id_продукции=Поставки.код_продукции)
)
Сохранить и выполнить запрос. Теперь должно работать ограничение "moe_ogranichenie". Чтобы его удалить нужно выполнить запрос
Код:
alter table Поставки
drop constraint moe_ogranichenie
Сергей089 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос: обновление поля таблицы, данные из другой Blondy Microsoft Office Access 2 04.04.2010 15:38
присвоить переменной значение поля в последней записи таблицы KaimNotark БД в Delphi 1 03.02.2010 07:21
Как залпом исправить значение полей таблицы bullvinkle SQL, базы данных 10 18.11.2009 14:29
Данные из двух полей исх. таблицы в одно поле сводной таблицы Strelec79 Microsoft Office Excel 2 02.08.2009 13:59
Найти и подставить значение из другой таблицы ElenaTro Microsoft Office Excel 1 01.04.2009 13:01