Green-sell.info

Новые технологии
16 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Access vba обращение к подчиненной форме

Ссылка на элемент управления подчиненной формы в другом модуле MS Access VBA

Попытка ссылаться на элемент управления подчиненной формы в VBA. У меня есть основная форма, которая с помощью кнопок открывает подчиненную форму. В этой подформе есть несколько кнопок, которые открывают другую подформу. В основном сценарий русской куклы с кнопками.

Конечная цель состоит в том, чтобы одна функция вызывалась с помощью подформы, используемой в качестве переменной в функции с именем GetFile. Обходной путь прямо сейчас заключается в том, что у меня есть разные версии функции GetFile в каждой подформе VBA.

Кнопка вот под-подчиненную форму, нажмите кнопку код:

Который затем вызывает этот модуль:

В настоящее время я получаю эту ошибку: Runtime Error ‘2465’.

1 Ответ

так что вы, наверное, хотите

хотя ваш вопрос немного запутан («открыть подчиненную форму»? Подчиненная форма встроена в родительскую форму).

Может быть проще передать объект формы вместо его имени в качестве параметра:

тогда не имеет значения, где в иерархии находится форма, просто используйте ее напрямую:

Похожие вопросы:

Я ищу некоторую команду, которая отключит все элементы управления, присутствующие в разделе ‘details’ формы MS Access. Один из способов-отключить каждый элемент управления самостоятельно. Я ищу.

У меня есть основная форма, которая содержит две другие дочерние подформы. Когда textbox изменения стоимости на подчиненной форме (a) я хотел бы установить значение textbox на подчиненной формы (Б).

У меня есть простая форма в Access 2003. Форма имеет элемент управления списком и кнопку. Я хотел сделать список для изменения размера с помощью формы (только по вертикали), в то время как кнопка.

У нас есть большой проект MS Access, который требует функциональности GUI, что трудно / невозможно сделать в среде форм VBA / access. Со временем мы хотим переписать/перенести в управляемую среду C#.

У меня есть база данных Access с огромным количеством форм (300+) и кодом VBA. Бэкэнд этой базы данных Access находится в MS SQL. Когда я нахожусь на элементе управления в форме (в formview), я хочу.

У меня есть форма с подформой. Субформа-это непрерывная форма, поэтому я могу использовать условное форматирование. С помощью элементов управления в элементе управления вкладки изменяются значения.

Моя форма Access 2007 имеет две кнопки под элементом управления tab (с подчиненной формой на каждой странице). С помощью вкладки или кнопки фокусируется, я могу tab в подчиненной форме на этой.

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

У меня есть форма, frmResults , которая содержит элемент управления subform, frmResultsSub . frmResultsSub — это элемент управления подчиненной формы, который содержит запрос вместо формы. Другими.

Я создал таблицу в MS-Access 2010, запустив следующий скрипт на SQL server 2008 SELECT * into qryInstrumentInterfacelog FROM tblInstrumentInterfaceLog qryInstrumentInterface используется для.

Обращение к подчиненной форме из VBA

Как правильно обратиться к подчиненной форме, а именно, отфильтровать подчиненную форму по значению в выпадающем списке. Форма: Find_form, Cписок: Имя транзистора (NameTr) Поле в подчиненной форме для фильтрации name_of_tr

Написал для события «после обновления»(в выпадающем списке) следующее:

Обращение к подчиненной форме
И это снова я.. к сожалению мои вопросы еще не исчерпаны(( Теперь мне не понятно вот чего: Как.

VBA открыть запрос в подчиненной форме
Есть форма f_seach , на ней расположены: множество полей и выпадающих списков, подчиненная форма.

Фильтрация записей в подчиненной форме через VBA
Здравствуйте! Подскажите пожалуйста, как в данном случае в коде прописать применение фильтра в.

Access + VBA: итоговая сумма по подчиненной форме
Привет всем форумчанам и гуру в VBA + Access, кто сможет подсказать и помочь много тем не охота.

Решение

где tempVar1 — временная переменная хронящая значение условия отбора для данного поля (разумеется для каждого поля свое имя tempVar)
3. при загрузке установите значение всех tempVar`s в значение NULL (эта конструкция даст возможность загрузить все записи подчиненной формы)
4. на событие После обновления, всех контролов фильтра, достаточно просто обновить подчиненную форму, а значения сами передатутся в запрос через tempVar`s и отфильтруют его.

Внимательно прочитайте пост с описанием tempVar`s там есть примеры как для VBA так и для SQL, но модуль написать (скопировать) прийдется )), какой из вариантов выбирать Вам.
Вроде все! Удачи!

Посмотрите этот вариант!

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

P/S: но при помощи этой функции, 3-5 контролов для ввода условий и возможно 1 дополнительной таблицы можно организовать фильтрацию на любое количество полей

вы путается в понятиях области видимости переменных и времени их существования. Функция, несмотря на ваши декларации, никаких глобальных переменных не создает, она лищь работает с компонентами коллекции, которые никаким образом не причастны к глобальным переменным. Объектная переменная MyTempVarsCol, объявленная в функции, как Static, является локальной, имеющей областью видимости только эту функцию и время существования от первого вызова функции и до завершения работы приложения.

Функция MyTempVars в выложенном примере притянута за уши, чтобы выдать желаемое (см.рекомендации по ссылке) за действительное. Достаточно изменить запрос qryTBL1 таким образом

чтобы получить тот же результат без использования функции.

Создание элемента управления, ссылающегося на элемент управления в другой форме

В данной статье описано, как добавить текстовое поле в форму Access и настроить его свойства так, чтобы в нем отображалось значение из элемента управления в другой форме. Это полезно в указанных ниже случаях.

Существует главная форма, в которой есть подчиненная форма. В подчиненной форме есть вычисляемое текстовое поле (например, суммарная стоимость товаров), результаты которого требуется отобразить в главной форме.

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

Создание элемента управления

В области навигации щелкните правой кнопкой мыши форму, которую нужно изменить, и выберите пункт Конструктор или Режим макета.

На вкладке Конструктор в коллекции Элементы управления нажмите кнопку Поле.

Щелкните форму там, где требуется создать текстовое поле.

Выберите только текстовое поле. Если требуется, щелкните другой элемент управления, а затем снова щелкните текстовое поле.

Если окно свойств еще не отображается, щелкните правой кнопкой мыши текстовое поле и выберите пункт Свойства.

Читать еще:  Access recordset не является обновляемым

В области задач Страница свойств откройте вкладку Все.

Введите для свойства Данные значение, используя следующий синтаксис:

=[Формы]![имя формы]![имя элемента]

Здесь имя формы — это имя формы, содержащей элемент, значение которого требуется отобразить, а имя элемента — имя этого элемента управления.

Сослаться на элемент управления в подчиненной форме немного сложнее. Для этого используется следующий синтаксис:

=[Формы]![имя основной формы]![имя элемента управления подчиненной формы в основной форме].[Форма]![имя элемента управления в подчиненной форме]

Здесь имя основной формы — это имя основной формы, имя элемента управления подчиненной формы в основной форме — имя элемента управления, который является контейнером подчиненной формы, в основной форме, а имя элемента управления в подчиненной форме — имя элемента управления со значением, которое нужно отобразить, в подчиненной форме.

Примечание: Форма, на которую вы хотите сослаться, должна быть открыта, чтобы приложение Access могло считать ее значение, однако может быть не видна.

Примеры

Пример 1. Ссылка на другую форму

Предположим, у вас есть основная форма «Заказы», в которой вы хотите отобразить значение элемента управления «Имя» из формы «Сведения о сотруднике». Для этого следует добавить в форму «Заказы» текстовое поле и назначить его свойству Данные следующее выражение:

=[Формы]![Сведения о сотруднике]![Имя]

Пример 2. Ссылка с основной формы на элемент управления в подчиненной форме

Предположим, в основной форме «Заказы» есть элемент управления подчиненной формы с именем «Подчиненная форма заказов», а сама подчиненная форма содержит вычисляемое текстовое поле «Промежуточный_итог_заказа». Чтобы отобразить значение из элемента управления «Промежуточный_итог_заказа» в основной форме «Заказы», следует добавить в последнюю текстовое поле и присвоить его свойству Данные следующее выражение:

=[Формы]![Заказы]![Подчиненная форма заказов].[Форма]![Промежуточный_итог_заказа]

Примечание: Форма, на которую вы хотите сослаться, должна быть открыта, чтобы приложение Access могло считать ее значение, однако может быть не видна.

12.5 Работа с формами Access из VBA (объект Form )

Объект Access.Form, работа с формами Access средствами VBA, открытие формы Access, работа с элементами управления на форме Access

Один из важнейших элементов Access, который широко используется в приложениях — это формы. Формы Access предназначены для того же, для чего и обычные формы VBA — это прежде всего контейнеры для графических элементов управления. Но устройство форм Access, их функциональные возможности, приемы работы с ними и даже наборы элементов управления, которые на них можно размещать, сильно отличаются от привычных нам форм VBA, которые можно использовать в Word и Excel.

Формы Access используются:

  • Для редактирования записей в таблицах базы данных Access и внешних источников данных. Для того, чтобы создать такие формы, вообще не нужно никакого программирования — достаточно создать форму в режиме конструктора или воспользоваться мастером создания форм. Подключиться к внешнему источнику данных (например, базе данных SQL Server или Oracle) можно, воспользовавшись в Access меню Файл ->Внешние данные ->Связь с таблицами.
  • Как панели управления вашего приложения. Очень часто в приложении на основе Access создается начальная форма, которая открывается при запуске этого приложения. На этой формы предусмотрены кнопки и другие элементы управления для вызова других форм, отчетов, макросов, выхода из приложения и выполнения прочих операций. После закрытия других форм управления опять передается начальной форме.
  • Просто для предоставления пользователю возможности выполнения любых действий. Например, форму можно использовать для выбора пользователем параметров отчета, выгрузки данных во внешнее приложение (например, Excel) и т.п.

Как работать с формами Access из VBA?

Первое, что необходимо сказать — для работы с формами во многих ситуациях нам придется использовать общий объект AccessObject, который представляет в Access не только формы, но и таблицы, макросы, модули, отчеты и множество других элементов. Поскольку этот объект — универсальный, то, конечно, большой помощи от Intellisense — подсказки в редакторе VBA у нас не будет. Обратиться к объекту формы можно через коллекцию AllForms, которая доступна через объекты CodeProject и CurrentProject. Например, получить информацию о всех формах в базе данных Access можно так:

Dim oA As AccessObject

For Each oA In CurrentProject.AllForms

Если вы будете обращаться к формам в коллекции AllForms по индексу, обратите внимание, что нумерация форм в этой коллекции начинается с 0. Обращаться к элементам в этой коллекции можно и по имени:

Специальное свойство IsLoaded определяет, открыта ли эта форма (то есть загружена ли она в оперативную память).

Программным образом формы можно найти и другим способом. Все открытые формы Access автоматически помещаются в коллекцию Application.Forms и представляются в виде объекта Form. Это — уже нормальный объект, свойства которого соответствуют свойствам формы, доступным через графический интерфейс. Например, если форма Форма1 открыта, получить информацию о ее ширине можно так:

Debug.Print Application.Forms(«Форма 1»).Width

Это свойство можно использовать и для изменения ширины формы, но для этой цели рекомендуется использовать метод DoCmd.MoveSize(), который изменяет размеры активного объекта (например, нашей формы, если она активна):

DoCmd.MoveSize Width :=10000

Еще одна возможность: если вы работаете с кодом самой формы или ее элементов управления (например, события Click кнопки, которая расположена на форме), то обратиться к объекту самой этой формы можно совсем просто. Для этого используется ключевое слово Form.

Как можно открыть форму?

Первое, что нужно сказать — если в Word или Excel нам обязательно потребуется открыть форму программным способом, то в Access это совсем необязательно. Можно открыть форму и вручную из окна базы данных (см. рис. 12.1). Из этого же окна обычно производится создание новых форм или изменение существующих.

Рис. 12.1 Окно для работы с формами в Access

Еще один часто используемый способ — просто запускать форму при открытии базы данных Access. Для этого в меню Сервис нужно выбрать Параметры запуска и выбрать нужную форму в списке Вывод формы/страницы. Если при этом вы уберете все остальные флажки, то приложение при открытии приложение может выглядеть так, как показано на рис. 12.2:

Рис. 12.2 Все лишние возможности Access спрятаны от пользователя

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

Если все-таки нужно открыть форму программным способом (например, из другой формы), то для этой цели можно использовать метод DoCmd.OpenForm(). В самом простом варианте этот метод просто принимает параметр с именем формы:

Читать еще:  C access db

Если же форма уже открыта, то этот метод, конечно, не открывает форму заново, а просто активизирует ее. Метод DoCmd.OpenForm() принимает также несколько необязательных параметров, при помощи которых вы можете настроить фильтр на отображение записей в форме, режим открытия формы (например, модальность) и т.п. Закрытие формы производится при помощи метода DoCmd.Close(). Если же вам нужно просто спрятать форму, чтобы сохранить введенные на ней пользователем значения и отобразить их при следующем показе, можно просто сделать форму невидимой, назначив ее свойству Visible значение False.

Форма нам обычно нужна не сама по себе, а как контейнер для расположенных на ней элементов управления. Обычно элементы управления программным способом создавать не требуется — намного проще и удобнее поместить их на форму в режиме конструктора для формы. В наборе элементов управления для формы предусмотрены как знакомые нам элементы управления — текстовые поля, надписи, кнопки, флажки и переключатели, так и новые элементы — свободная и присоединенная рамки объектов, разрывы страниц, подчиненные формы/отчеты и т.п. В верхнем правом углу Toolbox в конструкторе формы Microsoft Access находится специальная кнопка Мастера. Если она нажата, то добавление на форму привычных элементов управления (например, кнопки) приведет к появлению окна мастера, который попытается помочь вам автоматически сгенерировать нужный код VBA для этого элемента управления (см. рис. 12.3)

Рис. 12.3 Мастер создания кнопок

Можно использовать генерируемый мастером код как заменитель макрорекордера (которого в Access нет), чтобы понять, как можно выполнить те или иные действия.

Для чего используются нестандартные (по отношению к обычным формам VBA) элементы управления:

  • Свободная рамка объекта — возможность разместить на форме OLE-объект (например, документ Word, лист Excel, презентация PowerPoint, рисунок, звукозапись или видеоклип), который может быть встроен в базу данных Access (но не помещен в таблицу!) или находиться во внешнем по отношению к базе данных Access файлу.
  • Присоединенная рамка объекта — то же самое, за исключением того, что он применяется для работы с объектами OLE, которые хранятся в таблицах внутри баз данных Access или внешнего источника данных. Это — самый удобный способ генерации отчетов в Word.

Например, предположим, что в нашей базе данных Access находится таблица с тремя столбцами, как показано на рис. 12.4.

Рис. 12.4 Таблица для хранения шаблонов Word

В столбце File у нас хранятся шаблоны Word, которые используются для генерации отчетов. Мы помещаем на форму элемент управления Присоединенная рамка объекта с именем WordTemplate. После этого все, что нужно для создания файла Word на основе шаблона из базы данных, у нас уже есть. Для кнопки, по нажатию на которой будет формироваться отчет, можно использовать следующий код:

‘Получаем ссылку oFrame на объект присоединенной рамки на форме

Dim oFrame As BoundObjectFrame

Set oFrame = oForm.Controls(«WordTemplate»)

‘При помощи метода DLookup () скачиваем в него значение столбца File из таблицы

‘Templates, где номер строки (значение столбца Num ) равно 1

oFrame = Application.DLookup(«[File]», «Templates», «[Num] = 1»)

‘Открываем объект в отдельном окне приложения — то есть создаем

‘документ Word на основе шаблон, загруженного в рамку объекта на форме

‘Активизируем объект приложения

‘Получаем ссылку на Word в переменную oWord

Dim oWord As Word.Application

Set oWord = GetObject(, «Word.Application»)

‘Получаем ссылку на созданный нами документ

Dim oDoc As Word.Document

Set oDoc = oWord.ActiveDocument

‘Дальше работаем средствами Word, например, вставляем нужный текст

‘в места, отмеченные закладками

Конечно же, правильнее будет при этом сделать эту присоединенную рамку объекта на форме изначально невидимой — чтобы пользователь не мог этот объект активизировать по собственной инициативе.

  • Элемент управления Разрыв страницы — определяет начало нового экрана формы.
  • Подчиненная форма/отчет — используется для размещения на форме подчиненных форм, таблиц или отчетов.

Как уже говорилось, программным способом элементы управления в форме Access приходится создавать редко. Если на форме вам нужен переменный набор элементов управления, то правильнее будет с самого начала создать все нужные элементы управления и по необходимости делать их то видимыми, то невидимыми. Тем не менее создать программным способом элементы управления на форме тоже можно. Эта операция выполняется при помощи метода Application.CreateControl(), который принимает множество параметров — имя формы, на которой создается элемент управления, тип элемента управления, его месторасположение на форме и т.п.

Обращение к значениям элементов управления на форме производится через коллекцию Controls, которая умеет работать с именами элементов управления:

Access vba обращение к подчиненной форме

Pers.narod.ru. Обучение. Access VBA — редактируем связь многие-ко-многим и программно выполняем запрос с параметрами формы

Статья написана в учебных целях, хотя в ней есть и пара интересных неучебных нюансов.

Постановка проблемы: мы хотим динамически редактировать в Access связи между 2 таблицами, объединенными отношением «многие ко многим» (например, теги и слова, помеченные тегами, студенты и дисциплины, которые они посещают, или просто абстрактные «объекты» и «категории»). Думаю, понятно, что «многие ко многим» означает, что один объект может относиться к нескольким категориям и, наоборот, одной категории соответствует несколько объектов.

Классический способ реализации такой связи — промежуточная таблица, хранящая внешние ключи категорий и объектов и реализующая, таким образом, две связи «один ко многим», на которые мы разложили наше отношение:

Сама по себе реализация такого редактора в Access несложна, вот весь процесс.

1. Создаем новую базу данных и сохраняем ее.

2. В окне базы данных на вкладке «Таблицы» создаем в режиме конструктора 3 таблицы:

  • таблица «Категории» будет включать поле «Код категории», имеющее тип «Счетчик» и текстовое поле «Категория», служащее для описания; щелкнув правой кнопкой на поле «код», сделаем его ключевым:
  • таблица «Объекты» будет устроена аналогично: она включает ключевое поле-счетчик с именем «Код объекта» и текстовое поле «Объект», предназначенное для данных;
  • наконец, таблица «Связи» состоит из двух числовых полей, показанных ниже:

Обратите внимание, что оба поля я сделал ключевыми — это поможет избежать дублирования связей — например, объект 1 не должен иметь две одинаковых связи с категорией 1. Чтобы сделать оба поля ключевыми, нужно при нажатой клавише Ctrl выделить их, щелкая по области ключа, а затем вызвать правой кнопкой пункт меню.

3. Идем Сервис, Схема данных. добавляем в окно схемы все 3 таблицы и связываем их, перетаскивая поля мышкой так, чтобы получились связи, показанные на первом рисунке. В появившемся окне «Изменение связей» нужно включить все флажки для обеспечения целостности данных при добавлении или удалении записей.

Читать еще:  Ts web access

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, можно заменить на свои более осмысленные, например, код

Это пример можно скачать и доделать, ведь область применения отношений «многие-ко-многим» так же широка, как сами эти отношения.

Ссылка на основную публикацию
Adblock
detector