Поле со списком access vba
Поле со списком access
Поле со списком access – составной элемент управления, объединяющий поле и раскрывающийся список, позволяющий не только выбирать (как в простом списке), но и вводить значения.
Поле со списком позволяет экономить место в объекте базы данных (форме, таблице и др.), так как по умолчанию оно отображает одну строку списка.
Открывается список нажатием на кнопке
(в правом углу элемента управления «Поле со списком access») или клавишами Alt+«стрелка вниз». При помощи простого макроса можно сделать так, чтобы поле со списком раскрывалось само при входе в него.
Чтобы ввести значение в поле со списком access, можно начать вводить значение в поле с клавиатуры или выбрать нужное значение в выпадающем списке. При вводе значений с клавиатуры помогает свойство «Автоподстановка». Если установить его как «да», то при вводе информации Access автоматически будет предлагать значения из списка, выделяя буквы предлагаемого значения после последнего введённого символа.
Обилие всяких кнопочек и настроек может постоянно сбивать вас с толку. Также может появиться страх при первом открытии программы.
Если значение подходит, для его ввода надо лишь нажать клавишу Enter или Tab. Свойство «Ограничиться списком» не разрешит ввести значения, которого нет в списке. Ограничивать списком вводимые значения стоит в первую очередь для снижения вероятности ввода ошибочной информации.
Например, слово «детектив» в поле «литературный жанр» можно написать «детиктив» или «дитиктив», или ещё как-нибудь (неважно, опечатка это или следствие неграмотности оператора. Любой человек может ошибаться и даже имеет на это право).
Поле, содержащее такие значения, уже нельзя правильно ни отсортировать, ни использовать в запросе. Мы зададим запрос с фильтром Like «детектив» и запрос найдёт нам, предположим, 120 книг этого жанра. Но вследствие неправильного ввода информации запрос «не увидел», к примеру, 8 книг.
Такая ситуация просто недопустима. Гораздо проще один раз и в одном месте (в базовой таблице подстановки) правильно ввести название жанра и связать эту запись с полем подстановки в таблице поставок книг отношением «один-ко-многим» (можно и не связывать. Но этот вопрос не представляется возможным обсудить в пределах одной статьи, так как слишком много завязано вопросов с типами полей, связями и др.).
Другой вопрос состоит в том, стоит ли разрешать оператору добавлять новые значения в базовую таблицу подстановки (со стороны «один»). Всё зависит от конкретных задач и типа информации. Не всегда можно предугадать все возможные варианты для значений поля подстановки. Например, поле подстановки для указания пола сотрудника может принимать два значения: «мужской» и «женский». А вот попробуйте создать поле подстановки мужских или женских имён (например, мужские имена: Андрей, Андриан, Андрон, Анджей и т. д.; женские имена: Наталья, Наталия, Наталея, Натали и т. д.).
Аксесс довольно сложная программа. Это подтверждает тот факт, что в интернете можно найти массу информации по ней. Однако, вы знаете что на самом деле достаточно знать лишь 20% инструментов, чтобы создавать и настраивать 80% баз данных в программе?
Во-первых, некоторые родители дают такие имена, которых не было раньше в природе (а это имя ещё надо ввести в базовую таблицу подстановки).
Во-вторых, схожие имена будут «рябить» перед глазами (могут быть десятки очень похожих имён, отличающихся только одной буквой).
В-третьих, быстрее ввести имя вручную побуквенно, чем искать в большом списке, в-четвёртых, вряд ли придётся включать поле имени в простой или составной ключ, так как одних Ивановых Иванов Ивановичей в России не сосчитать (обычно для этого используют числовой код, однозначно идентифицирующий запись в таблице), в-пятых, неправильно введённое имя, как правило, не даёт критических ошибок при фильтрации или сортировке (по причине своей неуникальности имя редко используется для таких случаев.
К тому же оно чаще всего используется в инициалах. Например, я ввёл значение «Иванов Андриан Иванович», хотя имя человека «Андрей». В поле «ФИО» получим «Иванов А. И.». Вроде как и ошибки нет.)
Создаётся поле со списком access, как правило, в режиме конструктора объекта базы данных:
— в таблицах – в области «Свойства поля» на вкладке «Подстановка» есть такой аргумент «Тип элемента управления» с выпадающим списком. Выбираем значение «Поле со списком» и выбираем следующие аргументы: тип источника строк, сам базовый источник строк, номер присоединённого столбца и другие необходимые элементы;
— в формах — при помощи кнопки «Поле со списком» на панели элементов. Если создаём новое поле со списком из базового поля со списком в таблице, то можно просто перенести это поле на форму (отчёт) из окошка «Список полей». Все базовые свойства будут унаследованы новым элементом управления.
Список в отличие от поля со списком всегда открыт и содержит все значения, которые можно выбрать. Если список отображается не полностью, с помощью полос прокрутки можно выбрать нужное значение. Поле, список и поле со списком можно взаимно преобразовывать друг в друга (когда мы ошибочно создали не тот элемент управления. Например, поле вместо поля со списком).
В приведённом ниже примере при выборе города в поле со списком автоматически загружаются в подчинённую форму записи, относящиеся к этому городу (т. е. мы видим, кто стоит на учёте в г. Щёлково).
При создании списка или поля со списком можно брать значения из таблицы или запроса (присоединённый элемент) либо ввести вручную как набор значений (свободный элемент).
Можно создать выражение, которое ссылается на отдельный столбец списка поля со списком или списка. Для этого используем свойство Столбец этого элемента управления:
forms![ИмяФормы]'[Имя поля со списком].[Column](x). Например: forms![Типы]![НазваниеТипа].[Column](1)
х – номер столбца. Столбцы начинают нумерацию с нуля.
При вычислении номера видимого столбца надо принимать в расчет и невидимые столбцы.
Archie Goodwin
Авторизация
Рубрики блога
- Public / Общие темы
- Новость + Мнение
- Размышления
- Уроки или советы
- Это интересно
- Юмор
- Креатив
- Рецензия
- Личность
- Притчи, истории
- Новости сайта
- Special / СпецРубрики
- Записки вебмастера
- Вопрос дизайна
- Мой ПК
- MS Office и VBA
- Прочие офисные программы
- Diary / Личный дневник
- Дневник
Рекомендуем
Последние комментарии
Облако тегов
Устами великих
Реклама
Форма входа (MS Access)
Суть в том, что бы создать форму выскакивающую при входе, в которой бы были поле выпадающего списка для выбора сотрудника, поле для ввода пароля и соответственно кнопка «ОК». Но это не просто форма для безопасности. Еще должна быть привязка к должности пользователя. Так, после подтверждения правильности ввода данных, должна открываться форма со множеством подчиненных форм и кнопок на отчеты и запросы, при чем эта форма должна быть разной для каждой должности. Таким образом, получается что будет создан пользовательский интерфейс при этом не закрывая, так сказать, исходный код, но по большому счету, любому пользователю будет незачем просматривать все отчеты, фомы и запросы базы в поисках непонятно чего, так как у него все будет нужно у него перед глазами.
Самое первое что нужно, так это таблица с сотрудниками (или пользователями) со столбцами где указаны их имя, должность и пароль.
Потом создаем новую форму с помощью конструктора. Внешне можно настраивать как угодно, но обязательно должно быть поле с выпадающим списком, текстовое поле для ввода пароля и кнопка подтверждения. Вот что получилось у меня
Чтобы форма открывалась сразу же при запуске базы данных, необходимо
Соответственно для поля выпадающего списка нужно сделать привязку «источника строк» к полям таблицы «Персонал» (ну или пользователи) и выбрать такие поля как ID (уникальный номер для каждого сотрудника), Имя (в нашем случае поле называется ФИО) и Должность
При желании можно также выставить сортировку по интересующему полю, либо по ID, тогда пользователи будут отображаться по мере поступления на работу, можно по Имени, а можно сделать сортировку по должностям.
Далее выделяем кнопку «ОК» в конструкторе и ищем поле в событиях «Нажатие кнопки», выбирая [Процедура обработки событий] переходим в Visual Basic и прописываем следующий сценарий для кнопки, который будет работать по клику:
PS код уже с комментариями относительно его содержания
Собственно как бы все, задумка реализована. Теперь чтобы создать действительно пользовательский интерфейс нужно создать актуальные и необходимые формы для каждой должности и вставить в необходимую часть кода указанного выше.
Не получается. Выдает ошибку, что операция не поддерживается для обьектов этого типа.
Проблемная строка:
.FindFirst («ID=» & Me.cboCurrentEmployee.Value)
Решение найдено!
в 5 строке добавляем dbOpenDynaSet
Private Sub cmdLogin_Click()
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset(«Сотрудники», dbOpenDynaSet )
With rst
If IsNull(Me.cboCurrentEmployee.Value) Then
MsgBox «Ошибка входа! Выберите пользователя.»
Exit Sub
О сайте
«Понемногу обо всем и все, о немногом» — именно такой слоган, по-видимому, является наилучшим определением тематики блога. Здесь пишу о том, что для меня интересно или важно, собственно, поэтому разброс тематик очень широк – от размышлений на философские темы и смешных историй, до конкретных инструкций или анализа событий.
Правда, помимо общих тематик, которые есть почти на каждом личном блоге, стоит выделить специализированные рубрики блога, которые будут полезны и интересны вебмастерам, программистам, дизайнерам, офисным работникам и пользователям ПК, желающим повысить свои навыки и уровень знаний. Подробнее о спецрубриках
Записки вебмастера – рубрика, которая призвана собрать коллекцию полезных скриптов и авторских решений, интересных особенностей и стандартов верстки, решение вопросов юзабилити и функционала, полезных ресурсов и программ.
Вопрос дизайна – это актуальные тренды, пошаговые и видео-уроки в фотошопе, необходимые плагины для фоторедакторов, векторные и PSD исходники, PNG иконки и GIF анимации, кириллические шрифты с засечками и без засечек, заливки (паттерны) и градиенты.
Мой ПК – каждая статья в этой рубрике направлена на то, чтобы узнать свой компьютер лучше. Здесь можно будет почитать о системных процессах и редактировании системного реестра, о способах защитить личные данные и компьютер в целом, о настройке локальной сети и подключениях к сети интернет, обзор ряда программ, которые делают работу за компьютером удобнее, быстрее и приятнее.
MS Office и VBA – эта рубрика содержит интересные решения, малоизвестные функции и возможности, надстройки и макросы, в общем, все то, что может сделать вашу работу в пакете программ MS Office (в первую очередь — Excel, Word, Access, PowerPoint) более эффективной.
Прочие офисные программы – рубрика о программах для ведения учета (конфигурации, платформы, внешние отчеты для 1C), сдачи отчетности (MeDoc, БестЗвіт) и статистического анализа данных (SPSS), также здесь можно найти обзоры программного обеспечения для работы с периферийными устройствами. Свернуть
Поле со списком access vba
Элемент управления Поле со списком
Элемент управления Поле со списком (ComboBox) во многом аналогичен элементу управления Список (ListBox). Применяется он в формах для той же самой цели, т. е. когда требуется, чтобы значение поля в таблице не вводилось вручную, а выбиралось из известного списка значений. Как правило, этими списками являются различного рода справочники. Отличий между этими типами элементов управления три:
- Поле со списком позволяет не только выбирать значение из списка, но и вводить его прямо в поле ввода;
- Поле со списком не накладывает таких ограничений на длину списка, как Список, т. к. в нем отображается только текущее значение, а остальные значения выводятся, когда пользователь щелкает мышью по стрелке вниз с правой стороны поля. Соответственно, элемент Поле со списком занимает на форме меньше места, чем элемент Список;
- Поле со списком позволяет выбрать только один элемент из списка.
Основные свойства для элемента управления Поле со списком (Combo Box) такие же, как и у элемента управления Список (List Box), однако есть дополнительные свойства, которые определяют формат вывода данных в текстовую часть поля: Формат поля (Format), Число десятичных знаков (Decimal Places), Маска ввода (Input Mask) (рис. 9.17).
Еще два дополнительных свойства определяют особенности работы поля со списком:
- Ограничиться списком (Limit To List). Это свойство может иметь значение Да (Yes), и тогда значение, которое вводится в поле, должно обязательно совпадать с одним из элементов списка, или Нет (No), и тогда список может дополняться значениями, вводимыми в текстовую часть поля со списком. Если значение этого поля Да, а вводимое значение не совпадает ни с одним из элементов списка, Access выдает сообщение об ошибке. Все ситуации, возникающие при вводе нового значения в поле, могут быть обработаны с помощью макроса или процедуры VBA, например, чтобы расширить список значений (см. также разд. «Применение макросов» гл. 11).
- Автоподстановка (Auto Expand). Это свойство обычно имеет значение Да, что обеспечивает удобный выбор значения из списка. Так как списки в данном случае могут быть длинными, например список клиентов, прокручивать их в поисках нужного значения неудобно. Однако можно просто ввести необходимое значение в текстовую часть поля. При этом Access автоматически подставит в поле то значение из списка, у которого первые буквы совпадают с введенными.
Рис. 9.17. Свойства элемента Поле со списком
Обычно поле со списком используется для.тех полей базовой таблицы, которые служат внешними ключами, т. е. содержат значения, соответствующие первичным ключам записей в какой-либо другой таблице. В таблице такие поля обычно определяют как поля подстановки, т. е. при отображении этих полей отображается не то значение, которое содержится в данном поле, а соответствующее значение из связанной таблицы (ведь ключом часто является ничем не примечательный код) (см. также разд. «Создание таблиц»гл. 2). В этом случае Мастер форм при создании формы автоматически создаст для таких полей поля со списком и задаст их свойства.
Если вы в режиме Конструктора хотите создать элемент управления Поле со списком (Combo Box) для поля таблицы, являющегося полем подстановки, лучше делать это путем перетаскивания поля из окна Список полей (Field List), т. к. в этом случае все свойства элемента будут заданы автоматически.
Поле со списком — элемент управления формы в EXCEL
Поле со списком представляет собой сочетание текстового поля и раскрывающегося списка. Поле со списком компактнее обычного списка, однако для того чтобы отобразить список элементов, пользователь должен щелкнуть стрелку. Поле со списком следует использовать, когда требуется обеспечить возможность ввести в список или выбрать в нем только один элемент. В этом элементе управления отображается текущее значение. Этот элемент имеет много общего с элементом Список .
Для вставки элементов управления на лист необходимо отобразить вкладку Разработчик.
- В MS EXCEL 2007 это можно сделать через меню Кнопка офис/ Параметры Excel/ Основные/ Показывать вкладку Разработчик на ленте .
- В MS EXCEL 2010 это можно сделать так: Откройте вкладку Файл ; Нажмите кнопку Параметры ; Нажмите кнопку Настроить ленту ; Выберите команду Настройка ленты и в разделе Основные вкладки установите флажок Разработчик .
Теперь вставить элемент управления можно через меню: Разработчик/ Элементы управления/ Вставить .
Обратите внимание, что в этом меню можно также вставить Элементы ActiveX, которые расположены ниже интересующих нас Элементов управления формы. У обоих типов есть одни и те же элементы Кнопка, Список , Флажок и т.п. Разница между ними следующая: чтобы использовать Элементы ActiveX необходимо использовать VBA, а Элементы управления формы можно напрямую привязать к ячейке на листе.
Поле со списком ( Combo box, Drop down ) как, впрочем и все другие Элементы управления формы, возвращает только 1 числовое значение. См. файл примера .
Обзорную статью обо всех элементах управления формы можно прочитать здесь .
Вставка Поля со списком
Через меню Разработчик/ Элементы управления/ Вставить выберем левой клавишей мыши элемент Поле со списком (см. рисунок ниже).
После этого выпадающее меню закроется, а курсор вместо обычного толстого крестика
превратится в тонкий крестик.
Удерживая левую клавишу мыши проведите курсором вправо и немного вниз, элемент Поле со списком будет помещен на лист.
Выделение Поля со списком
Чтобы выделить Поле со списком нажмите и удерживайте клавишу CTRL , затем кликните левой клавишей на Поле со списком .
Перемещение Поля со списком и изменение его размеров
Если навести курсор на выделенный элемент Поле со списком (курсор примет форму 4-х направленных в разные стороны стрелок), затем нажать и удерживать левую кнопку мыши, то можно его переместить. Удерживая клавишу ALT можно выровнять Поле со списком по границам ячеек. Выделенный элемент также можно перемещать стрелками с клавиатуры.
Если навести курсор на углы прямоугольника или на маленькие кружки на границе, то можно изменить его размер.
Заполняем Поле со списком элементами
Заполним наше Поле со списком названиями месяцев. Для начала разместим названия месяцев на листе в диапазоне F2:F13 .
Чтобы заполнить Поле со списком , кликните на него ПРАВОЙ клавишей мыши, в появившемся контекстном меню выберите Формат объекта. Появится диалоговое окно, выберите вкладку Элемент управления (если такая вкладка отсутствует, то Вы вставили Элемент ActiveX, а не Элемент управления формы, об этом см. выше).
Введите в поле Формировать список по диапазону ссылку на вышеуказанный диапазон.
Примечание . Вместо указания ссылку на диапазон можно указать Имя диапазона (т.е. ссылку на Именованный диапазон ). Подробнее можно посмотреть в статье Выпадающий список в MS EXCEL на основе элемента управления формы .
Нажмите ОК, Поле со списком заполнится элементами.
Теперь пользователь может выбрать требуемый месяц, но Поле со списком пока не способно вернуть выбранное значение в ячейку. О том, как связать Поле со списком с ячейкой читайте ниже.
Связываем Поле со списком с ячейкой
Как было сказано выше, все Элементы управления формы возвращают значение. Это значение помещается в ячейку определенную пользователем. Чтобы связать Элемент управления с ячейкой, кликните на него ПРАВОЙ клавишей мыши, в появившемся контекстном меню выберите Формат объекта. Появится диалоговое окно, выберите вкладку Элемент управления (если такая вкладка отсутствует, то Вы вставили Элемент ActiveX, а не Элемент управления формы, об этом см. выше).
В поле Связь с ячейкой нужно ввести ссылку на ячейку. Свяжем наше Поле со списком с ячейкой А1 .
Существует и другой способ связать Элемент управления и ячейку: выделите правой клавишей мыши Элемент управления, в Строке формул введите =, затем кликните левой клавишей мыши на нужную ячейку, нажмите клавишу ENTER . Чтобы изменить ячейку, с которой связан Элемент управления, достаточно перетащить эту ячейку в нужное место, взяв за ее границу.
Использование Поля со списком
Поле со списком удобно для выбора единственного значения из заранее подготовленного списка. Выбранное значение может быть использовано для вывода соответствующих значений из той же строки. Например, если в таблице продаж содержатся объемы продаж по месяцам (диапазон F2:G13 на рисунке ниже), то выбирая в Поле со списком месяц, можно вывести соответствующий объем продаж (см. ячейку В3 ).
Необходимо помнить, что Поле со списком возвращает в связанную ячейку не сам элемент, а его позицию в списке (для месяца Май на картинке выше Поле со списком вернуло значение 5). Поэтому, чтобы вывести выбранный месяц, потребуется формула =ИНДЕКС(F2:F13;B1) (ячейка В2 ).
Формула =ИНДЕКС(G2:G13;B1) позволяет вывести объем продаж для выбранного месяца (ячейка В3 ).
Условное форматирование использовано для отображения в таблице выбранного месяца и его продаж.
Имя Элемента управления
У каждого Элемента управления есть имя. Чтобы его узнать, нужно выделить Поле со списком , в Поле имя будет отображено его имя. Чтобы изменить имя Поля со списком — введите в Поле имя новое имя и нажмите клавишу ENTER . Также имя можно изменить в Области выделения ( Главная / Редактирование/ Найти и выделить/ Область выделения ).
Зачем нам знать имя элемента управления? Если Вы не планируете управлять Поля со списком из программы VBA, то имя может потребоваться только для настройки его отображения на листе. Об этом читайте ниже.
Прячем Поле со списком на листе
Включите Область выделения ( Главная / Редактирование/ Найти и выделить )
В Области выделения можно управлять отображением не только Элементов управления, но и других объектов на листе, например рисунков.
Нажмите на изображение глаза напротив имени объекта и объект исчезнет/ появится.
Поле со списком access vba
Pers.narod.ru. Обучение. Access VBA — редактируем связь многие-ко-многим и программно выполняем запрос с параметрами формы
Статья написана в учебных целях, хотя в ней есть и пара интересных неучебных нюансов.
Постановка проблемы: мы хотим динамически редактировать в Access связи между 2 таблицами, объединенными отношением «многие ко многим» (например, теги и слова, помеченные тегами, студенты и дисциплины, которые они посещают, или просто абстрактные «объекты» и «категории»). Думаю, понятно, что «многие ко многим» означает, что один объект может относиться к нескольким категориям и, наоборот, одной категории соответствует несколько объектов.
Классический способ реализации такой связи — промежуточная таблица, хранящая внешние ключи категорий и объектов и реализующая, таким образом, две связи «один ко многим», на которые мы разложили наше отношение:
Сама по себе реализация такого редактора в Access несложна, вот весь процесс.
1. Создаем новую базу данных и сохраняем ее.
2. В окне базы данных на вкладке «Таблицы» создаем в режиме конструктора 3 таблицы:
- таблица «Категории» будет включать поле «Код категории», имеющее тип «Счетчик» и текстовое поле «Категория», служащее для описания; щелкнув правой кнопкой на поле «код», сделаем его ключевым:
- таблица «Объекты» будет устроена аналогично: она включает ключевое поле-счетчик с именем «Код объекта» и текстовое поле «Объект», предназначенное для данных;
- наконец, таблица «Связи» состоит из двух числовых полей, показанных ниже:
Обратите внимание, что оба поля я сделал ключевыми — это поможет избежать дублирования связей — например, объект 1 не должен иметь две одинаковых связи с категорией 1. Чтобы сделать оба поля ключевыми, нужно при нажатой клавише Ctrl выделить их, щелкая по области ключа, а затем вызвать правой кнопкой пункт меню.
3. Идем Сервис, Схема данных. добавляем в окно схемы все 3 таблицы и связываем их, перетаскивая поля мышкой так, чтобы получились связи, показанные на первом рисунке. В появившемся окне «Изменение связей» нужно включить все флажки для обеспечения целостности данных при добавлении или удалении записей.
4. Закрыв и сохранив схему, вносим по несколько записей в таблицы «Категории» и «Объекты».
5. Формы для работы с категориями и объектами по отдельности или в связке «главная и подчиненная таблица» сделать легко. Для последнего, например, достаточно перейти на вкладку Формы, вызвать Мастер форм, добавить для формы все поля таблиц «Категории» и «Объекты», а на следующем шаге определить главную и починенную формы. Но нас интересует сейчас не это. Главное, что мы хотим сделать — спроектировать форму «Связи» для редактирования наших данных.
6. Вызываем Конструктор форм, получаем новую пустую форму. Если окна «Раздел: область данных» (на самом деле это окно свойств) нет на экране, вызываем его, выбрав в окне формы правой кнопкой мыши пункт меню Свойства.
7. В выпадающем списке окна свойств выбираем «Форма» и назначаем на вкладке Данные нашей форме источником данных таблицу «Связи».
8. С помощью меню Вид, Панель элементов убеждаемся, что панель с интерфейсными элементами доступна. Находим на ней элемент «Список» и добавляем его на форму, при этом должен вызваться мастер «Создание списков»:
Если мастера для этого или других элементов не вызываются, причин может быть 2: не нажата кнопка «Мастера» на Панели элементов или не установлены соответствующие компоненты Access.
Подтверждаем, что список использует данные из таблицы или запроса, на следующем шаге выбираем таблицу «Категории», затем включаем в список оба ее поля, на следующем шаге подтверждаем скрытие ключевого столбца, еще на одном шаге выбираем вариант «Сохранить в поле» и поле «Код категории», наконец, делаем разумную подпись, например, «Выбор категории». В окне свойств на закладке «Другие» дадим списку удобное название, например, СписокКатегории.
9. Аналогичным образом создаем список для отображения объектов из таблицы «Объекты», а называться он будет «СписокОбъекты».
10. В принципе, все готово. Наша форма работает, в чем можно убедиться, открыв ее кнопкой Вид
Проблема состоит в том, что при повторном добавлении связи Access начинает ругаться стандартными сообщениями («Изменения не были внесены из-за повторяющихся значений в индексе. «) и, более того, не дает сохранить последние внесенные изменения. Напишем небольшую процедуру на VBA для решения проблемы и лучшей обработки записей.
11. Вернувшись в режим конструктора, добавим на свободное место кнопку и с помощью мастера «Создание кнопок» назначим ей действие «добавить запись» из категории действий «Обработка записей». Все остальное можно настроить по вкусу.
12. При выбранной кнопке в окне свойств перейдем на вкладку События и обратимся к коду сгенерированного нами обработчика:
13. Мы перепишем код сгенерированной Access процедуры так, чтобы он отслеживал ситуацию, когда в списках категорий и объектов ничего не выбрано, а также не давал повторно добавить уже существующую связь. Для последнего действия нам понадобиться выполнить из кода на VBA дополнительный запрос по извлечению выбранных на форме кода категории и кода объекта из таблицы «Связи». Если этот запрос вернет пустой результат, значит, такой связи еще нет и следует добавить запись. Сгенерировать такой запрос на вкладке «Запросы» и потом просто вызвать его, к сожалению, не получится. Дело в том, что Access не видит взятых из формы параметров запроса, если запрос выполняется программно. Ошибка, как правило, возникает со следующим текстом «Too few parameters. Expected Число» («Слишком мало параметров. Ожидалось Число»). Эта ошибка возникает, если команда или один из нижележащих запросов содержит обращения к формам или собственные параметры, — все эти обращения будут восприняты как параметры, которым не передано значение.
Почему так происходит? По этому поводу в справке Microsoft MSDN написано примерно следующее:
NOTE: В DAO Вы должны явно присвоить значение параметру. При использовании DoCmd.OpenQuery Вы этого делать не должны, т.к. DAO использует операции низкого уровня, что даёт Вам большую свободу в использовании параметров (т.е. Вы можете сами присвоить параметру значение переменной, а не использовать ссылку на форму), но Вы должны выполнить служебные действия, которые Access делает «за кулисами» при исполнении DoCmd. С другой стороны, DoCmd работает на более высоком уровне, чем DAO. Выполняя DoCmd, Microsoft Access делает некоторые предположения о том, как поступить с параметрами, и не дает Вам никакой свободы в этом отношении.
Попросту говоря, при выполнении запроса непосредственно из окна Access он выполняется с помощью движка JET, который, будучи встроен в Access, «знает» о наличии форм и пытается найти их поля и подставить значения. При выполении запроса из кода методом Execute или иным, запрос выполняется с помощью библиотеки DAO, которая, будучи внешней, ничего «не знает» о формах ACCESS, поэтому все недостающие значения считает неопределенными.
В Интернете можно встретить советы предварительно обработать все параметры процедурой вида
Однако, для работы этого кода нужно, во-первых, иметь подключенную DAO (в окне редактора Visual Basic при остановленной программе вызвать Tools, References (или Сервис, Ссылки), найти и включить в списке библиотеку Microsoft DAO 3.6 Object Library), во-вторых, работа кода все-таки не гарантируется и в этом случае.
Мы хотим обойтись стандартным кодом
однако, едва избавившись от ошибок с недостающимим параметрами, получим сообщение о нессответствии типов (type mismatch, ошибка с кодом 13)!
Вся проблема состоит в том, что объект RecordSet есть и в библиотеке DAO, и в используемой Access по умолчанию библиотеке ADODb! Таким образом, наличие прямой ссылки на DAO, как в показанной выше процедуре, не гарантирует работоспособность кода — может возникать куча заморочек, связанных с тем, какая библиотека подключена в данный момент и у какой выше приоритет.
Поискав (и не найдя) ответ по всему Интернету я догадался, наконец, описать RecordSet как Variant, то есть, без указания типа:
Все остальное было уже делом техники — программно получить в переменные нужные свойства полей, раз Access не будет обрабатывать их из внешнего запроса, сделать запрос для проверки того, нет ли уже в базе такой связи, затем либо разрешить добавление записи, либо выдать сообщение об ошибке. Вот, наконец, код процедуры, стоившей мне нескольких проведенных в матерщине часов:
Нам остается отключить для формы встроенную навигацию (свойства «Область выделения» и «Кнопки перехода» со вкладки «Макет» окна свойств формы), добавить с помощью мастера свою навигацию и получить работающее приложение.
Кстати, стандартные сообщения для кнопок навигации, генерируемые Access, можно заменить на свои более осмысленные, например, код
Это пример можно скачать и доделать, ведь область применения отношений «многие-ко-многим» так же широка, как сами эти отношения.