Как мне создать два поля, где одно из них будет заполнено первым, автоматически заполнит другое?
Я управляю объектами для большого комплекса и отвечаю за выдачу и отслеживание физических ключей для наших клиентов здесь. Ключи напечатаны с определенными кодами (которые соответствуют самому замку), и я также пронумеровал отдельные двери в отдельной системе, чтобы учесть тот факт, что замки часто меняют двери.
В моей базе данных я создаю в Microsoft Access (извините, очень похожий на SQL-нуб), у меня есть таблица для пробелов (которая включает номера зданий, номеров и дверей), а также отдельную таблицу для ключей (код ключа, код метки ключа, мастер-ключи и т. д.). Я также включил поле в таблицу пробелов, которое ссылается на таблицу ключей (через поле идентификатора), чтобы указать, какие замки связаны с какими дверями.
Наконец, у меня есть таблица журналов, в которую я записываю запросы от клиентов на ключи. Они могут запросить ключи по номеру двери или коду ключа. Я хочу иметь возможность вводить либо номер двери, либо код ключа в форме (привязанной к запросу, который извлекается из обеих таблиц) и позволяет ему автоматически заполнять другое поле соответствующим образом. В настоящее время я управлял конфигурацией, в которой ввод номера двери автоматически заполнял поле ключа, но я не могу заставить его работать наоборот.
Это может потребовать каких-то структурных изменений, но я готов даже углубиться в непосредственное написание кода SQL, если это необходимо. Я даже попробовал свои силы в написании кода INNER JOIN, но он уже выполнял двойное соединение, и я не уверен, что это что-то, что можно связать.
Halp!
2 ответа
У вас есть форма для записи в журнал? Это просто ввод данных в новую запись, верно? Какие данные вводятся - дата, keyID, userID? Таким образом, форма привязана к таблице Log и элементам управления с ControlSource, установленным для каждого поля, поэтому ввод сохраняется непосредственно для записи в таблицу?
Мое предложение состоит в том, чтобы иметь 2 комбинированных списка. Один из них настроен на отображение номера двери, а другой - на отображение кода ключа, но оба из них имеют ControlSource в поле ключа и сохранят keyID. Это нетрадиционный дизайн. Пользователи должны будут узнать, что если они делают выбор с помощью одного комбинированного списка, они могут игнорировать другой. Вы можете поставить метку над двумя выпадающими списками "Выберите номер двери или код ключа".
Дверная коробка со списком RowSource типа: SELECT keyID, DoorNum FROM ...;"
Ключевые поля со списком RowSource, такие как: SELECT keyID, KeyCode FROM ...;
Для обоих комбинированных списков задайте свойства:
ControlSource: ключевое поле в таблице журнала
ColumnCount: 2
ColumnWidths: 0 "; 1"
Вы можете сделать это, добавив несколько VBA в событие AfterUpdate полей текстового поля. Вы можете использовать один и тот же запрос в каждом случае.
Ради аргумента я назову текстовое поле номера двери "txtDoorNbr", а текстовое поле кода ключа - "txtKeyCode".
Сначала напишите запрос, который вытягивает все номера дверей и коды ключей. Я думаю, что вы заявили, что вы уже написали этот запрос.
Затем в событии AfterUpdate для txtDoorNbr вы должны написать что-то вроде этого:
Dim db as Database
Dim rec as Recordset
Set db = CurrentDB
Set rec = db.OpenRecordset("Select KeyCode from MyQuery where DoorNumber = " & Me.txtDoorNbr & "")
Me.txtKeyCode = Rec(0)
rec.Close
db.Close
В событии AfterUpdate txtKeyCode напишите нечто очень похожее:
Dim db as Database
Dim rec as Recordset
Set db = CurrentDB
Set rec = db.OpenRecordset("Select DoorNbr from MyQuery where KeyCode = " & Me.txtKeyCode & "")
Me.txtDoorNbr = Rec(0)
rec.Close
db.Close
Это должно сделать это. Возможно, потребуется немного изменить его, чтобы учесть определенные условия (например, сообщение об ошибке, если в запросе не найдено соответствующей записи и т. Д.), А также фактические имена полей, которые вы используете в своем запросе, но это в основном подход,