Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебник по аксес.doc
Скачиваний:
25
Добавлен:
14.11.2018
Размер:
1.62 Mб
Скачать

6. Формирование справки о предприятиях произвольно заданного города.

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

Сформируем эту справку с помощью запроса на выборку по имени «Запрос1».

Для создания запроса в окне открытой базы данных перейдем на вкладку Запросы и щелкнем кнопку Создать. Из списка возможных способов создания выберем Конструктор.

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

Нижняя часть окна представляет собой бланк формирования запроса. Столбцы этого бланка соответствуют полям запроса. В строке Поле в каждом столбце нужно указать имя поля, которое мы собираемся выводить в этом месте в результате выполнения запроса. Если выводятся все поля таблицы, то указывается имя таблицы.*. Символ «*» (звездочка) и является признаком вывода всех полей таблицы. Имя поля можно выбрать из списка полей, разворачивающегося в каждой клеточке этой строки.

В строке Имя таблицы указывается имя источника данных для формирования данного поля запроса, а именно, имя таблицы или запроса. В нашем примере это имя TABV или TABP.

Клеточку в строке Сортировка надо заполнить, если строки, выводимые как результат выполнения запроса, должны быть упорядочены по значениям данного поля.

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

В строке Условие отбора записывается критерий, по которому отбираются записи. В клеточке этой строки можно записать часть или все выражение сравнения, описывающее критерий. Критерии, записанные в разных клеточках этой строки, связаны между собой логической операцией «И», то есть должны выполняться в отбираемых записях одновременно.

В строке или записываются критерии, связанные с критериями строки Условие отбора логической операцией «ИЛИ». Записанные в пределах одной строки или критерии связаны между собой логической операцией «И», затем общий критерий этой строки объединяется с общим критерием предыдущей строки логической операцией «ИЛИ».

Строк или может быть несколько, если не хватает одной.

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

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

Если расположить записи об одном предприятии в таблице TABV подряд, то различаться они будут названием изделия. Подсчитав количество записей (строк) с одним и тем же предприятием, мы и получим количество видов изделий на этом предприятии. Такой подсчет осуществляется с помощью групповой операции (по другому – итоговой функции) COUNT для любого поля таблицы. Обеспечить группирование, то есть расположение подряд записей с одним и тем же предприятием позволит другая групповая операция – Группировка, выполненная для поля Kodp (Код предприятия).

Поэтому в нашем запросе понадобится строка Групповая операция. Для поля Kodp из таблицы TABV в этой строке зададим операцию Группировка. Создаем вычисляемое (то есть ранее не существующее ) поле для подсчета количества видов изделий. В качестве имени этого поля укажем заголовок столбца справки: «Кол-во видов изделий».После разделительного символа «:» укажем выражение для вычисления. В качестве выражения можно записать Count(Izd), а можно просто указать имя поля Izd, задав групповую операцию Count в строке групповых операций для вычисляемого поля.

Поля Pred (предприятие), Dt (дата основания), Adr (адрес) выбираем из таблицы TABP.

Все поля, включаемые в итоговый запрос, должны быть либо полями, по которым осуществляется группировка, либо должны содержать итоговые функции, поэтому для полей Pred, Dt, Adr тоже задаем групповую операцию Группировка. Для таблицы TABP группировка не имеет значения, так как в ней каждое предприятие встречается только один раз.

Следующая проблема состоит в том, что для справки нужны не все, а только некоторые предприятия. Первое условие отбора – дата основания должна быть больше 1970 года. Это условие можно задать в строке Условие отбора для поля Dt как часть выражения сравнения: >#31.12.1970#. Здесь справа от символа «>» записана константа типа даты. По правилам синтаксиса ACCESS она заключается в символы «#».

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

Для того, чтобы можно было в запросе описать сравнение неизвестно с чем, существует специальное средство – параметры. В запросе параметр задается подсказкой о вводе, заключенной в квадратные скобки, например [Введите город]. При выполнении запроса с параметром выводится диалоговое окно с подсказкой. Конкретное значение параметра вводится в это окно и после его закрытия заменяет собой параметр в критерии. Это значит, что, введя в качестве значения параметра «Самара», получим в результате отбора записи с этим городом в адресе.

Сложность запроса в нашем примере состоит в том, что название города является частью адреса, содержащегося в поле Adr. Таким образом, надо описать условие, накладываемое на часть значения поля. Если бы искомый город был известен заранее, то проверку условия можно было бы организовать с помощью операции Like, а именно написать критерий: Like “Самара*” (вместо Самары может быть любой другой город ).

Операция Like организует сравнение по частичному совпадению сравниваемых значений. Символ шаблона “*” здесь означает, что после слова «Самара» в сравниваемом значении могут находиться любые символы, независимо от них условие будет выполнено.

Но существует ограничение на применение операции Like. Она не допускает использование параметра внутри шаблона, поэтому в нашем примере ее использовать нельзя.

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

Функция, вырезающая часть символов (подстроку) из строки символов (текста) – это функция Mid. Обращение к ней имеет следующую структуру:

Mid (x; n [;k])

Здесь х – текст, из которого вырезаются символы, n – целое число, обозначающее номер символа, начиная с которого происходит вырезание, k – целое число, обозначающее количество вырезаемых символов. Если оно не задано (необязательность этого аргумента помечена квадратными скобками), то вырезаются все символы, начиная с n – го и до конца строки. Аргументы разделены символом-разделителем – “;”. В ACCESS в качестве разделителя используется точка с запятой, а в VBA разделителем является запятая.

Считая, что адрес начинается с названия города, вместо аргумента n запишем 1. Но надо еще определить длину названия города, которая является переменной. Предполагая, что после названия города в адресе обязательно пишется запятая, а потом уже улица и номер дома, мы можем с помощью другой встроенной функции определить местоположение первой запятой в адресе, а значит, и длину названия города. Такой функцией является встроенная функция VBA Instr. Упрощенное обращение к ней имеет вид :

Instr (X;Y)

Здесь Х – строка символов(текст), в которой происходит поиск, Y – строка символов (или один символ) которая ищется. Результатом функции является номер позиции, начиная с которой в строке Х первый раз найдена строка Y.

В нашем примере обращение к функции выглядит так:

Instr ([Adr];”,”).

Тогда количество выделяемых в качестве названия города символов будет:

Instr ([Adr];”,”)-1, а само название города, выделенное из адреса, определится с помощью функции:

Mid([Adr];1;Instr ([Adr];”,”)-1).

Остается записать условие в запросе:

Mid ([Adr];1;Instr([Adr];”,”)-1) = [ Введите город ]

Записать это условие можно в столбце с адресом или в дополнительном столбце, но ACCESS сама оптимизирует его размещение следующим образом : в запросе образуется дополнительный столбец, в строке Поле которого записана функция Mid, в строке Групповая операция – выражение, а в строке Условие – параметр. Столбец этот в результате выполнения запроса отображен не будет.

Теперь запрос полностью сформирован. Его вид на бланке конструктора приведен на рисунке 4.

Рис. 4. Запрос пункта 3 в режиме конструктора.

По запросу, сформированному на бланке конструктора, система автоматически строит запрос на языке SQL. SQL (Structured Query Language) – язык формирования запросов, применяемый в различных СУБД и в значительной степени не зависящий от конкретного вида СУБД.

Для того, чтобы увидеть этот запрос, надо переключиться из режима конструктора в режим SQL с помощью кнопки на панели инструментов или через меню: Вид – Режим SQL.

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

Простейшая команда (или инструкция, или оператор) для реализации запроса на выборку имеет следующую структуру: