Access 2003 - Поле из другой базы данных в форме

Я исправляю старую базу данных Access, и клиент запросил, чтобы поле DATE было добавлено в форму. Проблема в том, что я НИКОГДА не использовал Access раньше. Я парень SQL, и я создаю свой собственный пользовательский интерфейс. Эта штука с формами становится лучше меня.

Итак, у меня есть две таблицы: tblQuestionairre QuestionairreID EventID бла-бла-бла

tblEvent EventID DateTime бла-бла-бла

Сейчас я редактирую frmQuestionairre (форму вопросника). Вся информация из таблицы Questionairre (tblQuestionairre) находится здесь. Проблема в том, что мне нужно добавить поле DateTime где-нибудь в эту форму, чтобы клиент мог видеть, когда был введен вопросник. Как видите, мой элемент связи — это EventID.

Как бы я ни старался, я не могу просто «добавить» DateTime из таблицы событий, используя «построитель выражений». Мне нужно загрузить правильную дату и время для текущей загруженной анкеты. Каждый вопросник связан с событием.

Как я могу добавить это поле в форму Questionairre? Я продолжаю получать #Имя? ошибка, которая, очевидно, связана с тем, что он не знает, как связать две таблицы по EventID. Идеи?

Редактировать: Да, это простое отношение 1 к 1. Да, поле должно быть редактируемым.

ОТВЕТ: =DLookUp("[DateEntered]","tblEvent","EventID=" & Forms!frmQuestionnaire!EventID)

Редактировать: теперь, когда он отображается, я не могу его редактировать!?


person Kolten    schedule 04.02.2009    source источник
comment
Если вы хотите, чтобы его можно было редактировать, я предлагаю подход подчиненной формы, о котором я упоминал. Данные как родительской, так и дочерней формы можно редактировать (или нет, если вы установите свойства только для чтения). В качестве альтернативы вы можете создать запрос (представление), который выполняет соединение: пока есть все первичные ключи, вы можете сохранить.   -  person Godeke    schedule 05.02.2009
comment
Кроме того, ответ Dlookup работоспособен, но неверен. Посмотрите на некоторые ответы, которые предлагают изменить основной источник записи. Они будут редактируемыми и отображать данные.   -  person JohnFx    schedule 05.02.2009
comment
Существует ли отношение 1:1 между tblQuestionairre и tblEvent? Если это так, ответ на изменение источника записи формы для объединения двух таблиц является правильным. Если это 1:N, вам нужна подчиненная форма для отображения данных из tblEvent.   -  person David-W-Fenton    schedule 06.02.2009


Ответы (3)


Если я правильно понимаю вопрос, у вас есть отношения 1-1 по EventID между tblQuestionairre и tblEvent?

Если это так, просто откройте окно свойств формы и отредактируйте свойство «источник записи» на вкладке «Данные», чтобы оно основывалось на запросе, объединяющем две таблицы, а не только на tblQuestionairre. Вы даже можете использовать построитель прямо из листа свойств для построения запроса.

После того, как у вас есть этот набор, вы сможете просто поместить новое текстовое поле в форму и установить его источник управления (опять же на вкладке данных листа свойств) в поле «DateTime».

person JohnFx    schedule 04.02.2009

Самый быстрый способ — использовать функцию DLookup в событии OnCurrent для формы. OnCurrent срабатывает, когда загружается новая запись, и DLookup выполняет простой поиск в базе данных, возвращая одно значение.

person Cruachan    schedule 04.02.2009
comment
Да, элемент управления действительно нуждается в редактировании... Что делает событие OnCurrent? - person Kolten; 05.02.2009
comment
Он срабатывает, когда в форму загружается новая запись — полезно, когда форма может прокручивать записи. Если форма фактически является диалоговым окном, которое открывается только для отображения одной записи, тогда подойдет OnLoad. Если данные необходимо отредактировать, вам нужно будет явно сохранить их обратно в базу данных (ExecSQL). - person Cruachan; 05.02.2009
comment
Это не самый быстрый способ, и это ненужный хак. - person JohnFx; 05.02.2009

Вам нужно изменить RecordSource формы, чтобы он был связан с запросом, соединяющим две таблицы, а не только одну.

В вашем случае отредактируйте свойство RecordSource и либо используйте конструктор для создания запроса, либо нажмите кнопку SQL, чтобы ввести что-то вроде этого:

SELECT tblQuestionaire.QuestionaireID, 
       tblQuestionaire.EventID,
       tblQuestionaire.blahblah,
       tblEvent.DateTime,
       tblEvent.blahblahblah
FROM tblQuestionaire 
INNER JOIN tblEvent 
      ON tblQuestionaire.EventID=tblEvent.EnventID;

Это предполагает, что у вас есть строгое отношение 1 к 1 между таблицами, в противном случае используйте LEFT JOIN, если это отношение 1 к [0,1].

person Renaud Bompuis    schedule 19.02.2009