VBA для чайников
Шрифт:
.Direction = adParamlnput
End With
With cmdVBA
.iarameters.Append prrnDate ' Добавление параметра
.Execute ‘ Выполнение команды
End With
Если вы выполняете запрос, сохраненный в базе данных Jet/Access, используйте значение adCmdTable свойства CommandType объекта Command, а не adCmdStoredProc, относящееся к SQL Server и многим другим серверам баз данных.
Работа с SQL
Достаточно просто открыть набор записей с помощью ADO, но заполнение его данными -
Как избежать SQL
Добавление инструкций SQL в код VBA чем-то сродни изучению письма, содержащего отрывки на греческом языке, сложные математические вычисления и музыкальное представление. Несмотря на то, что SQL более компактный и узконаправленный язык программирования, чем Visual Basic, многие VBA-программисты находят его сложным в использовании по той причине, что он просто другой. Осознавая подобное положение, вы можете захотеть использовать инструменты разработки, которые будут составлять инструкции SQL, базирующиеся на вашем выборе из списка полей, критериях поиска определенных полей, а также действиях, которые должен совершать запрос.
Встроенный конструктор запросов Access - один из подобных инструментов. После того как вы создали и протестировали запрос Access, у вас есть два варианта выбора для добавления объекта Command в ваш код VBA для выполнения запросов.
Объект Command может выполнять запрос как хранимую процедуру или же вы можете копировать SQL-код, полученный с помощью конструктора запросов, а затем вставить его в свой код VBA. Для того чтобы воспользоваться последним приемом, сконструируйте запрос в Access и тщательно его проверьте; затем выберите команду
View=SQL View (Вид=Режим SQL), чтобы отобразить соответствующую инструкцию. Скопируйте ее в буфер обмена, переключитесь к редактору VBA, после чего вставьте, заключив в кавычки, в инструкцию VBA, которая определяет значение свойства CcnmandText объекта Command. Подробные сведения о выполнении инструкций SQL и хранимых процедур изложены в разделе "Использование объекта Command" раньше в настоящей главе.
Конструктор запросов Access замечательно справляется с поставленными задачами, но он не может обработать все встречающиеся ситуации. Он не позволяет создавать запросы сложных типов, т.е. подзапросы. Конечно же, его хранимые процедуры работают только с базами данных Jet (однако другие базы данных содержат подобные средства визуального конструирования запросов). Вы можете попробовать конструктор запросов
Access для получения SQL-кода для баз данных другого типа, однако не забывайте о том, что разные базы данных используют разные версии SQL, поэтому вам придется вносить коррективы в полученный код.
Знакомство с диалектами SQL
Хотя SQL и считается практически универсальным языком создания запросов для систем управления базами данных, многие базы данных понимают только определенные диалекты
SQL. Jet, например, предлагает несколько нестандартных усовершенствований SQL,
Вставка инструкций SQL в VBA-код
Фрагменты кола, приведенные раньше в настоящей главе, должны были проиллюстрировать, как добавлять инструкции SQL в код, написанный на VBA. Здесь очень важно не забывать о том, что VBA обрабатывает инструкции SQL как текстовые строки, а не как часть собственно программного кода. Эти строки претерпевают специальную обработку, когда интерпретируются как аргументы методов Open или Execute объектов ADO, но до тех пор они остаются обычными строками VBA, содержащими текст.
По этой причине вам следует заключать каждую инструкцию SQL в двойные кавычки.
Независимо от того, настраиваете вы свойство CommandText объекта Command или указываете аргумент метода Open объекта Recordset, использование двойных кавычек обязательно. И опять, вы найдете много примеров в предыдущих разделах настоящей главы. И не пропустите материал раздела "Настройка набора записей: задаем критерии" дальше в настоящей главе.
Написание инструкций SELECT
Процесс создания объектов Recordset модели ADO я подробно рассмотрел раньше в настоящей главе. В этом разделе основной акцент будет сделан именно на коде SQL, необходимом для определения того, какие записи относятся к набору. Вам необходимо выполнить подобную задачу как можно точнее, поэтому инструкция SELECT - это именно то, что вам нужно.
Простейшая форма инструкции SELECT получает все записи из одной таблицы. Приведенный ниже пример возвращает все поля и все записи из таблицы Toys:
SELECT * FROM Toys
Поскольку эта инструкция не содержит никаких дополнительных критериев, в возвращаемый в результате выполнения инструкции набор записей включаются все записи из таблицы Toys. Звездочка означает, что набор записей, помимо всего прочего, содержит еще и все поля из таблицы.
Инструкции SELECT извлекают записи из базы данных, но не изменяют при этом хранящиеся там данные. Для внесения подобных изменений вы должны изменить значения полей в наборе записей, после чего использовать такие инструкции SQL, как UPDATE или DELETE.
Связывание нескольких таблиц в инструкциях SELECT
Одна инструкция SELECT может работать с более чем одной таблицей. Просто перечисsiire ULC необходимые таблицы, с которыми должна работать инструкция, как показано ниже:
SELECT * FROM Toys, Clerks
Однако набор записей, полученный в результате подобного перечисления таблицы, оказывается не таким уж полезным. Ничто не связывает эти таблицы, поэтому база данных не знает, какая запись из первой таблицы соответствует какой записи из второй таблицы. Получается, что каждой записи из первой таблицы соответствуют все записи из второй.