2016-01-21 2 views
0

Фон: источник записи для моей формы - это запрос («BigQuery»), который объединяет только несколько связанных таблиц. Я настраиваю комбинированные поля для редактирования полей; Источник управления для этих комбинированных полей всегда является полем BigQuery. Одним из полей является UnitType, а другой - UnitSubType. Для UnitSubType существует около 100 различных записей, но многие из них не имеют контекстуального смысла в сочетании с определенным типом UnitType: если UnitType = «Car», то UnitSubType = «18 wheeler» не имеет смысла, и я бы так же скоро дать клиенту возможность совершить ошибки.MS Access 2007: список выбора фильтра для комбинированного поля

Вопрос: Часть A: Когда пользователь выбирает значение для UnitType в форме, я хотел бы ограничить поле со списком для UnitSubType теми значениями UnitSubType, которые уже соединены с значениями UnitType в базе данных. Как это делается?

Пример: Если в таблице уже есть 1 или более экземпляров записи, содержащей UnitType = "truck" и "UnitSubType =" 18 wheeler ", то при условии, что пользователь уже выбрал" грузовик "в поле со списком для UnitType: один из вариантов, представленных в комбинированном поле для UnitSubType, должен быть «18 wheeler».

Вопрос, часть B: Я хотел бы также, чтобы пользователь мог добавить новый UnitSubType, просто введя его в комбо box: если пользователь уже выбрал «грузовик» в поле со списком для UnitType и вручную вводит «планшет» в поле со списком для UnitSubType, тогда отредактированная запись должна иметь «планшет» в модуле UnitSubType, и в будущих операциях редактирования должны быть указаны «планшет» «в качестве выбора UnitSubType всякий раз, когда UnitType является« грузовиком ». В более простом месте иона «Разрешить редактирование списков значений» на «Да» позаботились об этом, но я хочу убедиться, что эта функциональность доступна в решении, предоставленном Вопросу Часть A.

Есть аналогичные темы вопросов уже в SO, но Я такой noob в Access, что не смог экстраполировать ответы, чтобы соответствовать моим потребностям. Я прошу прощения; пожалуйста, будьте как можно более конкретными.

Большое вам спасибо! Dave

ответ

0

Я пришел к одному решению, которое хотел разделить. Доступ трудно описать, но я перечислил исключения из нормы и попытаюсь сообщить решение таким образом.

Первый (основной) Combo Box для выбора типа блока:

  • Имя: CBUnitType
  • ControlSource: UnitType '' 'Поле в главной таблице: MainTbl
  • Row Источник:

    SELECT DISTINCT MainTbl.UnitType 
    FROM MainTbl 
    ORDER BY MainTbl.UnitType; 
    
  • Связанный Колонка: 1

  • Редактирование разрешенных значений: Да
  • Заблокировано:
  • После обновления: [Процедура проведения процедуры] '' 'См. Подпрограмму: ComboBoxUnitType_AfterUpdate(), показанный ниже.

Второй (зависимая) Combo Box для выбора блока Sub-Type:

  • Имя: CBUnitSubType
  • ControlSource: UnitSubType '' 'Поле в главной таблице: MainTbl
  • Row Источник: ComboQueryUnitSubType '' 'Создано Query Builder, подробно описанное ниже.
  • Bound Колонок: 1
  • Разрешить Value List редактирует: Да
  • Locked: Нет

Query Builder объект: ComboQueryUnitSubType

SELECT DISTINCT [MainTbl].UnitSubType 
FROM [MainTbl] 
WHERE ((([MainTbl].UnitType)=[Forms]![Unit Editor]![UnitType])) 
ORDER BY [MainTbl].UnitSubType; 

VBA подпрограммы создаются путем выбора «[Процедура обработки событий] для события After Update в комбинированном поле «CBUnitType», описанном выше. Подпрограмма VBA автоматически помещается в папку «Объекты класса Microsoft Office Access» в среде VBA в модуле n amed: «Редактор Form_Unit». Имя подпрограммы также предварительно выбирается так: «ComboBoxUnitType_AfterUpdate()« Почти наверняка, если вы измените какое-либо из этих имен, связи будут сильно нарушаться. Код VBA в модуле:

Option Compare Database 
Option Explicit 

Private Sub ComboBoxUnitType_AfterUpdate() 
    Forms![Unit Editor]![ComboBoxUnitSubType].Requery 
    Forms![Unit Editor]![ComboBoxUnitSubType].Value = "" 
End Sub 

Таким образом, эффект заключается в следующем: После того, как пользователь обновляет поле со списком для Unit Type, УВА рутинных выполняет и повторно запрашивает запрос для поля со списком для Unit SubType , а затем он произвольно принимает параметр .value в комбинированном поле Unit SubType и очищает его до пустой строки.

Я хотел бы с благодарностью признать щедрые учебные пособия, предоставленные Blue Claw Database Design. В частности, код VBA, который запрашивает запрос со списком, был экономичным с точки зрения жизни и подробно описан в их учебнике по адресу Dependent Drop Down List Box Почему запрос ComboQueryUnitSubType, указанный как Row Source, не запускается автоматически через Access каждый раз поле со списком выбрано пользователем.

Прошу прощения за вопрос и ответ. Надеюсь, что в ближайшем будущем я вернусь к хорошему, краткому коду! Dave

Смежные вопросы