Vvmebel.com

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

Access vba список

Элемент управления Список

Элемент управления Список (ListBox) используется для представления на экране поля, возможные значения которого ограничиваются списком, причем списком недлинным. Это связано с тем, что такой список занимает много места на экране (рис. 9.14). И хотя можно использовать полосы прокрутки, чтобы посмотреть значения, которые не помещаются в выделенную область, очевидно, что для отображения длинных списков этот элемент управления не подходит.

Список может состоять из одного или нескольких столбцов, однако при выборе элемента списка в связанное с ним поле таблицы передается только одно значение, например в приведенных на рис. 9.14 списках это «КодТипа» (CategoryID) и «КодСотрудника» (EmployeeID), которые в списках даже не отображаются. Внешний вид списка и его содержимое определяются его свойствами, которые можно задать вручную, а можно воспользоваться мастером при размещении списка в форме, который, запросив нужную информацию, определит большую часть свойств автоматически. Создание списка с помощью мастера уже демонстрировалось в первой части книги. Мастер списков очень похож на Мастера, с помощью которого создаётся элемент Поле со списком (см. разд. «Создание и удаление элементов управления» гл. 5). Для того чтобы список правильно работал, нужно корректно определить его важнейшие свойства — это первые восемь свойств на рис. 9.15. Соответственно, если он работает неправильно, именно эти свойства нужно проверять в первую очередь.

Рис. 9.14. Элементы управления Список

Рис. 9.15. Свойства элемента управления Список

  • Имя (Name) — название данного элемента управления. Нужно дать ему осмысленное название, т. к. оно используется во всех ссылках на этот элемент управления в выражениях, программах и макросах.
  • Данные (Control Source) — название поля в таблице, которое будет содержать выбранное в списке значение.
  • Следующие два свойства: Тип источника строк (Row Source Type) и Источник строк — (Row Source) определяют источник данных для элементов списка. В приведенном примере в качестве источника данных используется таблица «Типы» (Categories), поэтому в свойстве Тип источника строк (Row Source Type) выбрано значение Таблица или запрос (Table/Query), а в качестве значения свойства Источник строк (Row Source) указана инструкция SQL, которая выбирает нужные данные из таблицы (поля «КодТипа» и «Катерогия»): SELECT Типы.КодТипа, Типы.Категория FROM Типы; для английской версии Access: SELECT Categories.CategorylD, Categories.CategoryName FROM Categories;
  • Чтобы элементы в данном списке были отсортированы в алфавитном порядке по полю «Категория», в конец инструкции SQL нужно дабавить предложение: ORDER BY Типы.Категория (ORDER BY Categories.CategoryName).

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

  • Свойство Число столбцов (Column Count) имеет значение 2, т. е. в списке будет два столбца (выбираются два поля), однако свойство Ширина столбцов (Column Width) определяет ширину первого столбца, равной 0, т. е. он не будет отображаться на экране.
  • Несмотря на то, что первый столбец является скрытым, его тоже можно присоединить к полю таблицы, как и любой другой столбец списка, чтобы в выбранном элементе списка значение именно из этого столбца (в нашем примере — это значение поля «КодТипа») записывалось в базовую таблицу формы. Чаще всего именно первый слобец списка требуется присоединить к полю источника данных. Номер присоединенного столбца указывается в свойстве Присоединенный столбец (Bound Column).
  • Свойство Заглавия столбцов (Column Heads) в нашем примере имеет значение Нет (No), поэтому они не будут отображаться в списке.

Кроме рассмотренного, существуют еще три типа источников строк для элемента управления Список (ListBox):

    Список значений. Если количество строк в списке невелико и постоянно, можно все значения задать прямо в окне свойств элемента. В этом случае в свойстве Тип источника строк выбирается значение Список значений (Value List), а значения элементов списка перечисляются через точку с запятой без пробелов в свойстве Источник строк. Например:

Если элементы списка содержат пробелы, включите их в кавычки. Чтобы все дни недели отобразились в одном столбце списка, установите значение свойства Число столбцов равным 1, а свойству Ширина столбцов присвойте любое ненулевое значение, например 2, 5см (2, 5cm).

Если нужно вывести два столбца значений, то в свойстве Источник строк в перечислении значений задаются последовательно пары значений, число столбцов устанавливается равным 2, а в свойстве Ширина столбцов задается пара значении, например 2, 5см; Зсм (2, 5cm; 3cm).

  • Список полей. Этот тип источника строк (значение Список полей (Filed List) свойства Тип источника строк) предназначен для вывода в списке имен полей таблицы или .запроса. Имя таблицы или запроса задается в свойстве Источник строк. Таким способом в списке можно отобразить имена полей таблиц, чтобы предоставить возможность их выбора.
  • Определяемая пользователем функция. Наконец, источником строк для списка может быть функция, написанная на языке VBA, которая заполнит список значениями. В этом случае свойство Тип источника строк нужно установить, как это показано на рис. 9.16, т. е. указать имя функции без знака равенства (=) и без скобок, а свойство Источник строк должно остаться пустым. Использовать определяемую пользователем функцию полезно, когда требуется заполнить список вычисленными значениями или когда содержимое списка должно динамически меняться в зависимости от содержимого других элементов управления. В первом случае вычисления могут проводиться даже над данными, которых нет в базе (например, когда нужно вычислить определенные даты, начиная с текущей) Второй вариант окажется подходящим, например, если при выборе категории товаров в одном списке, в другом должен отображаться набор товаров именно этой категории.
  • Рис. 9.16. Использование функции в качестве источника строк

    Несколько слов о третьем типе источника строк списка. Эта функция должна иметь такой список аргументов:

    Function Имя_функции(fid As Control, id As Variant, _

    row As Variant, col As Variant, code As Variant) As Variant

    Данная функция вызывается Access каждый раз, когда требуется заполнение списка элементами. Например, это происходит автоматически, когда форма, содержащая список, открывается в первый раз. Вызвать обновление содержимого списка в какой-то другой момент можно программно, с помощью метода обновления содержимого элемента управления Require. Каждый раз при обновлении содержимого списка эта функция вызывается неоднократно: с различным «кодом действия».

    Поясним значения ее аргументов и возвращаемого значения.

    • code — «код действия», определяет, какое действие должна выполнить функция при данном вызове. Это могут быть следующие действия: инициализация списка, его открытие, получение количества строк, количества столбцов, ширины столбцов, самих элементов списка и завершение работы. Всем этим действиям соответствуют зарезервированные константы VBA.
    • fid — ссылка на элемент управления Список или Поле со списком, который заполняется элементами, с помощью данной функции.
    • id — уникальный идентификатор заполняемого элемента управления. Этот аргумент полезен, когда такая функция используется для заполнения нескольких элементов управления, чтобы их различить.
    • row — текущий номер строки для заполняемого элемента списка (начиная с 0).
    • col — текущий номер столбца для заполняемого элемента списка (начиная с 0).
    • Возвращаемое значение и его тип зависят от текущего «кода действия», переданного в функцию. Например, для кода acLBGetValue (получить данные) это должно быть строковое значение элемента списка в заданной строке row и столбце col.

    Все значения аргументов формируются и передаются в функцию самим Access. Разработчику только остается их обработать.

    О создании функции, выполняющей роль источника данных для списка или поля со списком, можно получить подробную информацию в справочной системе Access 2002, в разд. «Справка по Microsoft Access, Программирование на Visual Basic, Справочник по Visual Basic для Microsoft Access, Свойства, Q-R, RowSourceType» (Microsoft Access Help, Programming in Visual Basic, Microsoft Access Visual Basic Reference, Properties, Q-R, RowSourceType Property). Пример использования такой функции можно найти также на компакт-диске, являющемся дополнительным приложением к данной книге, который продается отдельно.

    Свойство Присоединенный столбец (Bound Column), определяющее тот столбец списка, значение которого при выборе становится значением элемента управления, может иметь значение 0. В этом случае значением элемента Список (List Box) станет индекс (номер) выбранного элемента в списке.

    Читать еще:  Как активировать майкрософт офис бесплатно

    Элемент управления Список интересен еще и тем, что он позволяет делать множественный выбор в списке, т. е. в нем можно выбрать одновременно несколько элементов, чего не позволяет делать элемент Поле со списком (Combo Box). Такая возможность требуется довольно часто, когда задаются критерии отбора записей. Например, в базе данных объектов недвижимости надо найти интересующие клиента квартиры, а его интересуют квартиры в определенных районах города. Можно, конечно, выбирать в списке по очереди сначала один район, чтобы выбрать все квартиры в данном районе, потом другой и т. д. Однако удобнее в этом случае использовать для указания интересующих районов список, в котором выбираются сразу все интересующие районы, а потом формируется соответствующий запрос к базе данных.

    Определить, как пользователь будет выбирать значения из списка, можно с помощью свойства Несвязное выделение (Multi Select). Его можно найти на вкладке Другие (Other) окна свойств. По умолчанию это свойство имеет значение Отсутствует (None). В этом случае разрешается ныбор только одного элемента из списка. Но это свойство может иметь значения Простой (Simple) и Со связным выбором (Extended). В первом случае разрешается множественный выбор просто щелчком мыши по нужным элементам, а во втором список работает так, как почти все списки в Windows, т. е. можно использовать клавиши и для выделения смежных и несмежных элементов. Результаты выбора хранятся в специальном массиве и могут быть использованы программами VBA.

    Объекты VBA Программирование VBA в СУБД Access 2003

    Основы языка программирования VBA

    Microsoft Office 2003 основан на принципах объектно-ориентированного программирования. Microsoft Office может быть представлен семейством классов и объектов. Необходимо отметить, что структуры объектных моделей приложений Microsoft Office отличаются друг от друга. Так объектная модель Access отличается от объектных моделей Word, Excel, PowerPoint. Иерархические структуры, сформированные из объектов и семейств, называются объектными моделями приложений.

    Программирование VBA в Microsoft Access 2003 отличается от программирования в других приложениях Microsoft Office 2003. Программирование VBA в СУБД Access используют в основном профессиональные программисты в процессе создания различных приложений для пользователей. Но в некоторых случаях пользователи баз данных Access 2003 самостоятельно применяют программирование VBA для автоматизации своей деятельности.

    Для программирования в Office можно использовать COM-совместимые или .NET-совместимые языки программирования. COM (Component Object Model — объектная модель компонентов) — это стандарт от компании Microsoft. COM предназначен для создания программного обеспечения на основе взаимодействующих COM-компонентов. При этом каждый COM-компонент через COM-интерфейсы может использоваться во многих программах одновременно. Использование COM-компонентов обеспечивается Windows API (application programming interfaces — интерфейсом прикладного программирования). К COM-совместимым языкам программирования относятся: Delphi, C, C++, Java, JScript, Visual Basic, VBScript и т.д.

    Языки программирования .NET (языки программирования платформы .NET компании Microsoft) — компьютерные языки программирования, которые используются для создания библиотек и программ, удовлетворяющих требованиям CLI (Common Language Infrastructure — общеязыковая инфраструктура). К NET-совместимым языкам программирования относятся: VB.NET, JScript.NET, Delphi Visual C++, Borland C++, C# (си-шарп) и т.д.

    Но для программирования приложений в Microsoft Office целесообразно использовать Visual Basic for Applications, что позволяет создавать приложения на языке VBA непосредственно внутри документов Microsoft Office. В этом случае программный код на языке VBA хранится внутри документов Word, Excel, PowerPoint, Access и т.д.

    Объекты характеризуются свойствами, методами и событиями. Однотипные объекты объединяются в классы. Таким образом, объекты представляют собой экземпляры определенного класса. Классы — это шаблоны для создания объектов. Объект, содержащий набор однотипных объектов, называется семейством (сollection).

    Свойства — это характеристики (атрибуты) объекта, которые предназначенны для его описания. Свойства определяют внешний вид и поведение объекта в приложении. Методы — это наборы действий (команд или процедур), которые может выполнить объект. Для каждого объекта определен ряд возможных событий. Событие — это определенное действие (например, нажатие кнопки), для которого можно создать исполняемый код обработки события, то есть процедуру, выполняющуюся в ответ на событие (отклик на событие).

    В СУБД Access 2003 используется визуальная среда программирования, основанная на событиях объектов. Технология разработки программы на VBA состоит в выборе объектов из определенного класса, выборе свойств объектов, в задании событий и создании (написании программы или исполняемого кода) процедуры их обработки.

    Все приложения MS Office имеют собственные объектные модели. В VBA определены объектные модели для каждого приложения Microsoft Office, объекты которых можно использовать в программах. Объектная модель Microsoft Access 2003 представляет собой набор объектов, организованных в библиотеку Access.

    Главным в иерархии объектов Access является объект Application (приложение Access). Слева на рисунке 1 представлена объектная модель Access.Application. Объекты модели не раскрыты. Справа на этом же рисунке показан фрагмент объектной модели, в которой объект CodeData представлен в раскрытом виде (в объект CodeData входят коллекции). Информация заимствована из справки Microsoft Visual Basic приложения Access 2003.

    Для просмотра объектов VBA в приложении Access 2003 можно использовать окно просмотра Object Browser. Это окно вызывается из редактора VBA, выполнив команду View/Object Browser. Объекты можно искать во всех доступных библиотеках (All Libraries). Скриншот окна диалога Object Browser представлен на рисунке 2.

    По умолчанию список библиотек (рис. 2) содержит библиотеку Access, DAO, VBA, библиотеку проекта — Деканат и др. Список доступных библиотек можно изменять в окне диалога References, которое открывается командой Tools/References.

    Для поиска объекта Application в библиотеке Access выберем Access в открывающемся списке библиотек, а в списке поиск введем Application и щелкнем на кнопке Просмотр. Результаты поиска будут отображаться в окне Object Browser (рис. 3).

    В окне мы увидим, в какой библиотеке, в каком классе содержится объект Application, который мы искали. В списке Library (библиотека) отображаются объекты, в списке Class отображаются все имеющиеся модули и объекты класса. В списке Member отображаются компоненты (элементы объекта: свойства, методы, события) класса или проекта.

    Если выбрать библиотеку Деканат, то окно диалога Object Browser будет иметь вид, представленный на рисунке 4.

    Если в списке Classes выделить объект Form_FormatP, то списке Members (компоненты) будет отображаться свойства и методы этого объекта.

    Графические символы для описания объектов в окне диалога Object Browser: — событие; — методы; — свойства.

    Если выбрать библиотеку VBA, то окно диалога Object Browser будет иметь вид, представленный на рис.5. В окне отображается библиотека классов, связанных с языком VBA.

    В нижней части инструмента Object Browser имеется еще одно полезное окно, которое предназначено для отображения сведений о выбранном элементе. На рисунке 5 в этом окне отображается выбранный класс . Рекомендую пользователям самостоятельно ознакомиться с этим окном.

    В заключение хочу отметить, что перед рассмотрением языка программирования мы с вами ознакомились с объектами VBA, так как понимание объектов лежит в основе программирования на языке VBA. Объекты VBA — это основные средства манипуляции данными в Microsoft Access 2003. Итак, объект – это программный элемент, который отображается на экране, и который содержит необходимые переменные, определяющие его свойства, а также список методов для управления объектом. Знание структуры объектной модели Microsoft Access 2003 позволяет создавать качественные приложения. Далее мы рассмотрим язык программирования VBA: переменные, типы данных и константы.

    Copyright

    © Обучение в интернет, .
    Обратная связь

    Как использовать параметры в VBA в разных контекстах Microsoft Access?

    Я много читал о SQL-инъекции и использовании параметров из таких источников, как bobby-tables.com. Тем не менее, я работаю со сложным приложением в Access, у которого много динамического SQL с конкатенацией строк во всех местах.

    У меня есть следующие вещи, которые я хочу изменить, и добавьте параметры, чтобы избежать ошибок и разрешить мне обрабатывать имена с одинарными кавычками, такими как Jack O’Connel.

    • DoCmd.RunSQL выполнить команды SQL
    • Наборы DAO
    • Наборы ADODB
    • Формы и отчеты, открытые с помощью DoCmd.OpenForm и DoCmd.OpenReport , используя конкатенацию строк в аргументе WhereCondition
    • Агрегаты домена, такие как DLookUp , которые используют конкатенацию строк

    Запросы в основном структурированы следующим образом:

    Каковы мои параметры для использования параметров для этих разных видов запросов?

    Этот вопрос предназначен как ресурс, для частых способов использования комментариев параметров для разных сообщений

    Читать еще:  Майкрософт офис фото

    sql vba access-vba ms-access

    2 ответа

    6 Решение Erik von Asmuth [2018-03-27 12:47:00]

    Существует много способов использования параметров в запросах. Я попытаюсь предоставить примеры для большинства из них и где они применимы.

    Во-первых, мы обсудим решения, уникальные для Access, такие как формы, отчеты и агрегации доменов. Затем мы поговорим о DAO и ADO.

    Использование значений из форм и отчетов в качестве параметров

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

    Вы можете обращаться к элементам управления следующим образом:

    Forms!MyForm!MyTextbox для простого управления на форме

    Forms!MyForm!MySubform.Form!MyTextbox для управления надстройкой

    Reports!MyReport!MyTextbox для управления в отчете

    Пример реализации:

    Это доступно для следующих целей:

    При использовании DoCmd.RunSQL , обычных запросов (в графическом интерфейсе), форм и источников отчетов, форм и отчетов, агрегатов доменов, DoCmd.OpenForm и DoCmd.OpenReport

    Это недоступно для следующих целей:

    При выполнении запросов с использованием DAO или ADODB (например, открытие наборов записей CurrentDb.Execute )

    Использование TempVars в качестве параметров

    TempVars in Access — глобально доступные переменные, которые могут быть установлены в VBA или с использованием макросов. Они могут использоваться повторно для нескольких запросов.

    Пример реализации:

    Доступность для TempVars идентична доступности значений из форм и отчетов: недоступна для ADO и DAO, доступных для других целей.

    Я рекомендую TempVars для использования параметров при открытии форм или отчетов по ссылке на управляющие имена, так как если закрытие объекта закрывается, TempVars остаются доступными. Я рекомендую использовать уникальные имена TempVar для каждой формы или отчета, чтобы избежать странности при обновлении форм или отчетов.

    Использование пользовательских функций (UDF) в качестве параметров

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

    Пример реализации:

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

    Чтобы установить значение:

    Чтобы получить значение:

    Использование DoCmd.SetParameter

    Использование DoCmd.SetParameter довольно ограничено, поэтому я буду краток. Он позволяет установить параметр для использования в DoCmd.OpenForm , DoCmd.OpenReport и некоторых других операторах DoCmd , но он не работает с DoCmd.RunSQL , фильтрами, DAO и ADO.

    Пример реализации

    Использование DAO

    В DAO мы можем использовать объект DAO.QueryDef для создания запроса, установки параметров, а затем либо открыть набор записей, либо выполнить запрос. Сначала вы устанавливаете SQL запросов, затем с помощью коллекции QueryDef.Parameters устанавливаете параметры.

    В моем примере я собираюсь использовать неявные типы параметров. Если вы хотите сделать их явными, добавьте PARAMETERS объявление в ваш запрос.

    Пример реализации

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

    Использование ADO

    Вы можете использовать параметры в ADO с помощью объекта ADODB.Command . Используйте Command.CreateParameter для создания параметров, а затем добавьте их в коллекцию Command.Parameters . ADO требует, чтобы вы были более явными, чем любой из предыдущих способов использования параметров. Хотя некоторые аргументы (такие как длина) иногда могут быть опущены, я не рекомендую его.

    Пример реализации:

    Те же ограничения, что и открытые наборы DAO, применяются. Хотя этот способ ограничивается выполнением запросов и открытием наборов записей, вы можете использовать эти наборы записей в другом месте вашего приложения.

    Я построил довольно простой класс построителя запросов, чтобы обойти беспорядок конкатенации строк и обработать отсутствие именованных параметров. Создание запроса довольно просто.

    Результат метода ToString() выглядит так:

    SELECT * FROM tblEmployees ГДЕ 1 = 1 И (StartDate > # 3/29/2018 # ИЛИ StatusChangeDate > # 3/29/2018 #) И (StatusIndicator IN (‘A’, ‘L’) ИЛИ Grade > 10 ) И (Зарплатa > 9999.99) И (Пенсионный = Неверно) ЗАКАЗАТЬ ПО ID ASC;

    Каждый предикат обернут в parens для обработки связанных предложений AND/OR, а параметры с тем же именем должны быть объявлены один раз. Полный код находится на моем github и воспроизведен ниже. У меня также есть версия для запросов Passthrough Oracle, в которых используются параметры ADODB. В конце концов, я хотел бы обернуть оба в интерфейсе IQueryBuilder.

    Программирование на VBA в СУБД MS Access

    VBA (Visual Basic for Application) играет важную роль при разработке баз данных MS Access. С помощью VBA в MS Access можно настроить формы и отчеты, запустить макросы, извлечь данные и т.д.

    Модули VBA

    VBA может использоваться для выполнения любых действий в ходе работы приложения. Для создания процедур VBA в MS Access используется Построитель программ. Программный код создается в Окне модуля. В зависимости от технологии создания можно различить несколько типов модулей:

    1. Стандартный модуль. Для его открытия нужно распахнуть список Макрос, расположенный в группе Другие вкладки Создание ленты инструментов, и нажать кнопку Модуль.

    2. Модуль формы или отчета. Для открытия модуля формы или отчета нужно открыть форму или отчет в режиме Конструктора и выбрать кнопку Просмотреть код в группе Сервис контекстного меню Инструменты конструктора форм/отчетов — Конструктор ленты инструментов. MS Access позволяет открыть одновременно и форму/отчет и ее модуль. Модули формы/отчета сохраняются одновременно с формой/отчетом и не перечисляются во вкладке Модули области переходов.

    3. Независимый модуль класса. Открывается щелчком мыши по кнопке Модуль класса, появляющейся в распахивающемся списке кнопки Макрос, расположенной в группе Другие вкладки Создание ленты инструментов. После сохранения такого модуля его имя будет находиться на вкладке Модули области переходов вместе со стандартными модулями. Для обозначения стандартных модулей и независимых модулей VBA используются разные пиктограммы (рис. 10.8):

    Элементы языка VBA

    Коды программы VBA состоят из выражений (statements). В каждой строке кода располагается одно отдельное выражение. Но данное правило имеет исключения:

    · несколько выражений могут быть расположены в одной строке и разделены двоеточием;

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

    Алфавит языка VBA составляют следующие элементы:

    · прописные и строчные буквы латинского алфавита (А – Z);

    · прописные и строчные буквы кириллицы (А – Я);

    · цифры от 0 до 9;

    · символ подчеркивания «_»;

    При написании кода VBA следует знать некоторые соглашения, которых следует придерживаться, чтобы избежать ошибок выполнения кода. Первое соглашение – это соглашение по именам. В VBA именуются переменные, константы, процедуры, функции, объекты и т.д. Определим правила, которым следует следовать при выборе имен:

    1. Длина имен не должна превышать 255 символов, но VBA учитывает только первые 31 символ от начала имени.

    2. Имена должны начинаться с буквы и могут содержать комбинацию букв, цифр и символов.

    3. Имена не должны совпадать со стандартными именами VBA.

    4. Имена не должны включать точек, пробелов и следующих символов: ! @ # $ %. Символ пробела можно заменить символом подчеркивания _.

    Регистр букв в именах не имеет значения. Например, имена PRICE, Price и price эквивалентны.

    Типы данных языка VBA

    В языке VBA типы данных делятся на простые (или базовые) и структурированные.

    К простым типам относятся:

    · вещественный (Single, Double, Currency, Decimal);

    · логический (Boolean).

    К стандартным структурированным типам относятся:

    · массив;

    · строка;

    · тип, определяемый пользователем.

    Таким образом,VBA использует 12 встроенных типов данных, представленных в таблице 10.1.

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

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

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