Создание простого запроса на выборку. Объектная модель запроса "схема запроса" - теория и примеры использования Запросы access способы их создания

В 8.3.5 у нас появилась восможность программной работы с текстом запроса.
Новость об этом можно прочитать на сайте 1С "Управляемый конструктор запроса и объектная модель схемы запроса" .
Для анализа конкретного запроса рекоммендую

Попробуем разобраться, что такое вообще запрос. В каком формате он представлен в 1С и на сервере ИБ.

Упрощенно можно выделить следующие уровни работы с запросом:
1. Запрос на языке СУБД. На этом уровне запрос представляет собой текстовую строку в синтаксисе конкретной СУБД.
Например "SELECT field1 FROM table1 WHERE table1.field2 > 100".
2. Драйвер конкретной СУБД. Это утилита, которая служит связующим звеном между программой и сервером. Она получает запрос от программы и передает его к СУБД.
На этом уровне 1С работает с внешними источниками данных.
3. Универсальный программный интерфейс. Это универсальный компонент, позволяющий программе получить доступ к данным в различных ИБ. Его также можно назвать менеджером драйверов. К нему в виде DSN подключаются используемые на компьютере драйвера конкретных СУБД. В зависимости от используемой системы тут может быть компонент ODBC, OLE DB, JDBC, ADO.NET либо любого другого стандарта. Судя по http://its.1c.ru/db/metod8dev#content:2926:1 на текущий момент 1С использует OLE DB. В платформе 7.7 использовался ODBC.
4. Объект на сервере 1С. На этом уровне выполняется работа сервера приложений с запросом.
Насколько я понимаю, в платформе на языке Си описан объект запроса для которого прописаны методы формирования текста SQL. С этим объектом запроса работают платформенные объекты (конструктор запросов, построитель и т.д.)
5. Запрос на языке 1С. На этом уровне запрос представляет из себя текст, написанный на псевдо-SQL-языке вида "ВЫБРАТЬ Справочник.ИмяСправочника.ИмяПоля ИЗ Справочник.ИмяСправочника"

Насколько я понимаю, с введением объекта "Схема запроса" ничего нового в платформе не изобрели.
Ранее мы могли работать только с текстовым представлением запроса (уровень 5). Это наиболее простой и понятный способ, хотя и не всегда удобный.
Сейчас нам дали доступ к объекту (уровень 4), с которыми ранее работали только платформенные механизмы.
Если проанализировать объект "Схема запросов", то его свойства очень четко пересекаются с конструктором запросов.
Каждому элементу и свойству можно найти визуальный аналог в конструкторе запросов.
Каждому клику в конструкторе можно подобрать аналогичную команду.
Например:
Закладка "Пакет запросов" = СхемаЗапроса.ПакетЗапросов;
Закладка "Таблицы и поля" = СхемаЗапроса.ПакетЗапросов.ДоступныеТаблицы;
Клик на таблице "Справочники" - "Номенклатура" = СхемаЗапроса.ПакетЗапросов.Операторы.Источники.Добавить("Справочник.Номенклатура");

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

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

СхемаЗапроса = Новый СхемаЗапроса; СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст); //Тут наши комманды модификации запроса Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();

Объектная модель запроса включает основной объект "Схема запроса" и около 50 связанных с ним подчиненных объектов, коллекций и специфичных типов данных. Поначалу ориентироваться в этом наборе объектов достаточно сложно.

Чтобы понять общую структуру схемы запроса открываем нужный раздел СП и загоняем все связи между объектами в графопостроитель.
Получается такой вот граф.
Не могу сказать, что он очень понятный, но общую идею отображает. Удобно подглядывать при анализе запроса.
В графе обозначены:
Желтым - объектные сущности схемы запроса;
Красным - коллекции объектов;
Зеленым - стандартные типы 1С (строка, число, булево);
Бирюзовым - примитивные типы, специфичные для схемы запроса;

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

Для примера рассмотрим создания с нуля пакета запроса, аналогичного запросу из

ВЫБРАТЬ РАЗРЕШЕННЫЕ Товары.Ссылка КАК Номенклатура, Закупки.Период КАК Период, ЕСТЬNULL(Закупки.СуммаОборот, 0) КАК СуммаЗакупок, 0 КАК СуммаПродаж ПОМЕСТИТЬ ТаблицаОбороты ИЗ Справочник.Номенклатура КАК Товары ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Закупки.Обороты(&Начало, &Окончание, Месяц) КАК Закупки ПО Закупки.Номенклатура = Товары.Ссылка ГДЕ НЕ Товары.ЭтоГруппа ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 100 Товары.Ссылка, Продажи.Период, 0, ЕСТЬNULL(Продажи.СуммаОборот, 0) ИЗ Справочник.Номенклатура КАК Товары ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&Начало, &Окончание, Месяц) КАК Продажи ПО Продажи.Номенклатура = Товары.Ссылка ГДЕ НЕ Товары.ЭтоГруппа ИНДЕКСИРОВАТЬ ПО Номенклатура, Период; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТаблицаОбороты.Номенклатура КАК Номенклатура, ТаблицаОбороты.Период КАК Период, СУММА(ТаблицаОбороты.СуммаЗакупок) КАК СуммаЗакупок, СУММА(ТаблицаОбороты.СуммаПродаж) КАК СуммаПродаж ИЗ ТаблицаОбороты КАК ТаблицаОбороты СГРУППИРОВАТЬ ПО ТаблицаОбороты.Номенклатура, ТаблицаОбороты.Период ИМЕЮЩИЕ СУММА(ТаблицаОбороты.СуммаЗакупок) > 0 УПОРЯДОЧИТЬ ПО ТаблицаОбороты.Номенклатура.Наименование, Период ИТОГИ СУММА(СуммаЗакупок), СУММА(СуммаПродаж) ПО ОБЩИЕ, Номенклатура ТОЛЬКО ИЕРАРХИЯ; //////////////////////////////////////////////////////////////////////////////// УНИЧТОЖИТЬ ТаблицаОбороты

Проанализируем пакет запросов.

Пакет представляет из себя набор из трех запросов.
В первом запросе данные выбираются из ИБ двумя оперататорами (запросы по закупкам и продажам), каждый из которых использует два источника (справочник "Номенклатура" и соответствующий регистр накопления). Данные объединятся из двух операторов и помещаются во временную таблицу на сервере.
Во втором запросе мы получаем данные из временной таблицы, группируем их и получаем результат для обработки на сервере 1С.
Третий запрос служит для уничтожения временной таблицы, сформированной первым запросом.

Начнем программное создание пакета запросов.

Для разработки кода воспользуемся деревом запроса. По нему удобно определять пути к данным. Желательно периодически проверять получившийся текст запроса после модификаций кода.

Для начала создадим объект "СхемаЗапроса".

СхемаЗапроса = Новый СхемаЗапроса;

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

ЗапросВыбораИзИБ = СхемаЗапроса.ПакетЗапросов; ОператорВыбораЗакупок = ЗапросВыбораИзИБ.Операторы;

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

ИсточникНоменклатура = ОператорВыбораЗакупок.Источники.Добавить("Справочник.Номенклатура","Товары"); ИсточникЗакупки = ОператорВыбораЗакупок.Источники.Добавить("РегистрНакопления.Закупки.Обороты","Закупки");

По умолчанию второй источник добавляется с левым соединение к первому.

Нам нужно обратное сединение. Меняем тип соединения.

ИсточникЗакупки.Соединения.ТипСоединения = ТипСоединенияСхемыЗапроса.ПравоеВнешнее;

Параметры таблиц:
Для каждой добавленной в качестве источника таблицы мы можем задать дополнительные параметры.
Коллекция параметров заполняется автоматически при добавлении таблицы в зависимости от типа таблицы.
Добавить в неё параметр вручную нельзя, можно лишь установить значение имеющегося параметра.
Таблица "Справочник.Номенклатура" это простая таблица справочника. У нее параметров нет.
Таблица "РегистрНакопления.Закупки.Обороты" это таблица оборотов регистра накопления.
Согласно СП, у неё есть 4 параметра: начало периода, конец периода, периодичность, условие.
Нам необходимо установить первые 3 параметра:

ИсточникЗакупки.Источник.Параметры.Выражение = Новый ВыражениеСхемыЗапроса("&Начало") ; ИсточникЗакупки.Источник.Параметры.Выражение = Новый ВыражениеСхемыЗапроса("&Окончание") ; ИсточникЗакупки.Источник.Параметры.Выражение = Новый ВыражениеСхемыЗапроса("Месяц") ;

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

ОператорВыбораЗакупок.ВыбираемыеПоля.Добавить("Товары.Ссылка"); ОператорВыбораЗакупок.ВыбираемыеПоля.Добавить("Закупки.Период"); ОператорВыбораЗакупок.ВыбираемыеПоля.Добавить("ЕСТЬNULL(Закупки.СуммаОборот, 0)"); ОператорВыбораЗакупок.ВыбираемыеПоля.Добавить("0");

Укажем на уровне запроса вцелом псевдонимы для выбираемых колонок :
Обратите внимание, что колонки таблиц выбираем для каждого подзапроса объединения, имена колонкам присваиваем вцелом для коллекции "Колонки" на уровне запроса пакета.

ЗапросВыбораИзВТ.Колонки.Псевдоним = "Номенклатура"; ЗапросВыбораИзВТ.Колонки.Псевдоним = "Период"; ЗапросВыбораИзВТ.Колонки.Псевдоним = "СуммаЗакупок"; ЗапросВыбораИзВТ.Колонки.Псевдоним = "СуммаПродаж";

Добавим условие на выбор данных

ОператорВыбораПродаж.Отбор.Добавить("НЕ Товары.ЭтоГруппа");

Всё аналогично добавляем для второй части запроса.

Сопоставление колонок:
У нас в каждом операторе выбора выбирается 4 поля (элемент справочника "Номенклатура", дата и два числовых поля).
При объединении колонок из двух операторов выбора колонки из справочника и даты система соспоставит сама.
Числовых колонок две. Схема может самостоятельно сопоставить их с колонками первого запроса неверно.
Указываем, какой колонке таблицы результата какое выражение соответствует.

ЗапросВыбораИзИБ.Колонки.Поля.Установить(1,ВыражениеЗакупки); ЗапросВыбораИзИБ.Колонки.Поля.Установить(1,ВыражениеПродажи);

Все аналогично повторяем для второго запроса пакета.

Из отличий, тут используется отбор по итоговым значения вида "ИМЕЮЩИЕ".
Такое условие добавляется аналогично обычному отбору на детальные записи.
Схема сама определит, в какой раздел условий поместить наше в зависимости от использования функций группировки.

ОператорВыбрать.Отбор.Добавить("СУММА(ТаблицаОбороты.СуммаЗакупок) > 0");

Последним шагом добавляем запрос на уничтожение таблицы данных

ЗапросУничтоженияВТ = СхемаЗапроса.ПакетЗапросов.Добавить(Тип("ЗапросУничтоженияТаблицыСхемыЗапроса")); ЗапросУничтоженияВТ.ИмяТаблицы = "ТаблицаОбороты";

А также выставляем дополнительные свойства запросов:

ЗапросВыбораИзИБ.ТаблицаДляПомещения = "ТаблицаОбороты"; ЗапросВыбораИзИБ.ВыбиратьРазрешенные = Истина;

Итоговый полный вариант формирования запроса:

//Создание схемы запроса СхемаЗапроса = Новый СхемаЗапроса; ЗапросВыбораИзИБ = СхемаЗапроса.ПакетЗапросов; //Установка свойств запроса ЗапросВыбораИзИБ.ТаблицаДляПомещения = "ТаблицаОбороты"; ЗапросВыбораИзИБ.ВыбиратьРазрешенные = Истина; //Добавляем операторы выбора первого запроса пакета ОператорВыбораЗакупок = ЗапросВыбораИзИБ.Операторы; ИсточникНоменклатура = ОператорВыбораЗакупок.Источники.Добавить("Справочник.Номенклатура","Товары"); //Добавляем запрос выбора из регистра закупок ИсточникЗакупки = ОператорВыбораЗакупок.Источники.Добавить("РегистрНакопления.Закупки.Обороты","Закупки"); ИсточникЗакупки.Источник.Параметры.Выражение = Новый ВыражениеСхемыЗапроса("&Начало") ; ИсточникЗакупки.Источник.Параметры.Выражение = Новый ВыражениеСхемыЗапроса("&Окончание") ; ИсточникЗакупки.Источник.Параметры.Выражение = Новый ВыражениеСхемыЗапроса("Месяц") ; //Меняем тип соединения ИсточникЗакупки.Соединения.ТипСоединения = ТипСоединенияСхемыЗапроса.ПравоеВнешнее; //Указываем выбираемые поля ОператорВыбораЗакупок.ВыбираемыеПоля.Добавить("Товары.Ссылка"); ОператорВыбораЗакупок.ВыбираемыеПоля.Добавить("Закупки.Период"); ОператорВыбораЗакупок.ВыбираемыеПоля.Добавить("ЕСТЬNULL(Закупки.СуммаОборот, 0)"); ОператорВыбораЗакупок.ВыбираемыеПоля.Добавить("0"); //Указываем спевдонимы для выбранных полей ЗапросВыбораИзИБ.Колонки.Псевдоним = "Номенклатура"; ЗапросВыбораИзИБ.Колонки.Псевдоним = "Период"; ЗапросВыбораИзИБ.Колонки.Псевдоним = "СуммаЗакупок"; ЗапросВыбораИзИБ.Колонки.Псевдоним = "СуммаПродаж"; //Добавляем отбор ОператорВыбораЗакупок.Отбор.Добавить("НЕ Товары.ЭтоГруппа"); /////////////////////// //Выбираем данные о продажах ОператорВыбораПродаж = ЗапросВыбораИзИБ.Операторы.Добавить(); ИсточникНоменклатура = ОператорВыбораПродаж.Источники.Добавить("Справочник.Номенклатура","Товары"); ОператорВыбораПродаж.ВыбираемыеПоля.Добавить("Товары.Ссылка"); //Добавляем источник РН и устанавливаем параметры ИсточникПродажи =ОператорВыбораПродаж.Источники.Добавить("РегистрНакопления.Продажи.Обороты","Продажи"); ИсточникПродажи.Источник.Параметры.Выражение = Новый ВыражениеСхемыЗапроса("&Начало") ; ИсточникПродажи.Источник.Параметры.Выражение = Новый ВыражениеСхемыЗапроса("&Окончание") ; ИсточникПродажи.Источник.Параметры.Выражение = Новый ВыражениеСхемыЗапроса("Месяц") ; ИсточникПродажи.Соединения.ТипСоединения = ТипСоединенияСхемыЗапроса.ПравоеВнешнее; //Указываем отбираемые поля и устанавливаем для числовых полей соответствие с полями первого запроса ОператорВыбораПродаж.ВыбираемыеПоля.Добавить("Продажи.Период"); ВыражениеЗакупки = ОператорВыбораПродаж.ВыбираемыеПоля.Добавить("0"); ВыражениеПродажи = ОператорВыбораПродаж.ВыбираемыеПоля.Добавить("ЕСТЬNULL(Продажи.СуммаОборот, 0)"); ЗапросВыбораИзИБ.Колонки.Поля.Установить(1,ВыражениеЗакупки); ЗапросВыбораИзИБ.Колонки.Поля.Установить(1,ВыражениеПродажи); //Добавляем отбор ОператорВыбораПродаж.Отбор.Добавить("НЕ Товары.ЭтоГруппа"); //Индексируем данные ЗапросВыбораИзИБ.Индекс.Добавить(ЗапросВыбораИзИБ.Колонки); ЗапросВыбораИзИБ.Индекс.Добавить(ЗапросВыбораИзИБ.Колонки); //Устанавливаем параметры выбора данных ОператорВыбораПродаж.ВыбиратьРазличные = Истина; ОператорВыбораПродаж.КоличествоПолучаемыхЗаписей = 100; //////////////// //Второй пакет запроса ЗапросВыбораИзВТ = СхемаЗапроса.ПакетЗапросов.Добавить(); ОператорВыбрать = ЗапросВыбораИзВТ.Операторы; //Устанавливаем сформированную в прошлом запросе временную таблицу как источник Источник = ОператорВыбрать.Источники.Добавить("ТаблицаОбороты","ТаблицаОбороты"); ОператорВыбрать.ВыбираемыеПоля.Добавить("ТаблицаОбороты.Номенклатура"); ОператорВыбрать.ВыбираемыеПоля.Добавить("ТаблицаОбороты.Период"); ОператорВыбрать.ВыбираемыеПоля.Добавить("СУММА(ТаблицаОбороты.СуммаЗакупок)"); ОператорВыбрать.ВыбираемыеПоля.Добавить("СУММА(ТаблицаОбороты.СуммаПродаж)"); //Условие отбора ОператорВыбрать.Отбор.Добавить("СУММА(ТаблицаОбороты.СуммаЗакупок) > 0"); //Устанавливаем псевдонимы колонок ЗапросВыбораИзВТ.Колонки.Псевдоним = "Номенклатура"; ЗапросВыбораИзВТ.Колонки.Псевдоним = "Период"; ЗапросВыбораИзВТ.Колонки.Псевдоним = "СуммаЗакупок"; ЗапросВыбораИзВТ.Колонки.Псевдоним = "СуммаПродаж"; //Порядок сортировки данных ЗапросВыбораИзВТ.Порядок.Добавить(ЗапросВыбораИзВТ.Операторы.Источники.Источник.ДоступныеПоля.Поля); ЗапросВыбораИзВТ.Порядок.Добавить(ЗапросВыбораИзВТ.Колонки); //Итоги запроса ИтогНоменклатура = ЗапросВыбораИзВТ.КонтрольныеТочкиИтогов.Добавить(ЗапросВыбораИзВТ.Колонки); ИтогНоменклатура.ТипКонтрольнойТочки = ТипКонтрольнойТочкиСхемыЗапроса.ТолькоИерархия; ЗапросВыбораИзВТ.ОбщиеИтоги =Истина; ЗапросВыбораИзВТ.ВыраженияИтогов.Добавить(ЗапросВыбораИзВТ.Колонки); ЗапросВыбораИзВТ.ВыраженияИтогов.Добавить(ЗапросВыбораИзВТ.Колонки); //////////////// //Последний запрос пакета - удаление временной таблицы ЗапросУничтоженияВТ = СхемаЗапроса.ПакетЗапросов.Добавить(Тип("ЗапросУничтоженияТаблицыСхемыЗапроса")); ЗапросУничтоженияВТ.ИмяТаблицы = "ТаблицаОбороты";

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

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

Плюшки появляются только в случае, если нам необходимо этот запрос модифицировать дальше в зависимости от настроек.
Рассмотрим несколько примеров модификация нашего пакета из 3х запросов:

Пример 1.

Допустим, у нас есть переменные "Организация" и "Склад". И в случае, если они заполнены, нам необходимо добавить в отбор данных условия на эти переменные.
При работе с текстом нам придется вклиниваться в текст запроса и писать сложное условия вида "Если заполнен скалад, то добавить условие". при чем разрывать в нескольких местах и комбинировать варианты заполнены и склад и организация, заполнен только склад, заполнена только организация, ничего не заполнено.
После такой модификации открыть запрос конструктором будет и невозможно и дальнейшая его модификация сильно затруднена.

При программной работе с данными мы просто добавляем команды:

Если ЗначениеЗаполнено(Организация) Тогда ОператорВыбораЗакупок.Отбор.Добавить("Закупки.Организация = &Организация"); ОператорВыбораПродаж.Отбор.Добавить("Продажи.Организация = &Организация"); КонецЕсли; Если ЗначениеЗаполнено(Склад) Тогда ОператорВыбораЗакупок.Отбор.Добавить("Закупки.Склад = &Склад"); ОператорВыбораПродаж.Отбор.Добавить("Продажи.Склад = &Склад"); КонецЕсли;

Пример 2.

Нам нужно отобрать товары, для которых последняя цена выше 1000руб.
Т.е. необходимо
1. Добавить в текст запроса выбор во временную таблицу из регистра цен номенклатуры, по которой цены выше 1000руб.
2. Добавить при выборе данных условия по этой временной таблице в оба запроса выбора данных (закупки и продажи).
Как вклиниваться в текстовый запрос для выполнения этих действий, вы пожете представить самостоятельно.
Программно мы просто добавляем строки кода:

//Добавляем временную таблицу ЗапросИзРегистраЦен = СхемаЗапроса.ПакетЗапросов.Добавить(); //Настраиваем временную таблицу ЗапросИзРегистраЦен.ТаблицаДляПомещения = "ВТ_ЦеныНоменклатуры"; ОператорВыбрать = ЗапросИзРегистраЦен.Операторы; Источник = ОператорВыбрать.Источники.Добавить("РегистрСведений.ЦеныНоменклатуры.СрезПоследних","ЦеныНоменклатурыСрезПоследних"); ОператорВыбрать.ВыбираемыеПоля.Добавить("ЦеныНоменклатурыСрезПоследних.Номенклатура"); ОператорВыбрать.Отбор.Добавить("ЦеныНоменклатурыСрезПоследних.Цена > &Цена"); //Сдвигаем новую табличку перед запросами выбора данных СхемаЗапроса.ПакетЗапросов.Сдвинуть(СхемаЗапроса.ПакетЗапросов.Индекс(ЗапросИзРегистраЦен),0); //Добавляем условия в исходные запросы ОператорВыбораЗакупок.Отбор.Добавить("Закупки.Номенклатура В (ВЫБРАТЬ ВТ_ЦеныНоменклатуры.Номенклатура ИЗ ВТ_ЦеныНоменклатуры КАК ВТ_ЦеныНоменклатуры)"); ОператорВыбораПродаж.Отбор.Добавить("Продажи.Номенклатура В (ВЫБРАТЬ ВТ_ЦеныНоменклатуры.Номенклатура ИЗ ВТ_ЦеныНоменклатуры КАК ВТ_ЦеныНоменклатуры)");

ИМХО, даже для этих примеров программная работа с запросом удобнее, чем прямая работа с текстом.
При этом учтем, что данные варианты модификаций все-таки достаточно простые.
С усложнением вариантов модификаций, увеличением количества запросов в пакете, выбором различных модификаций в зависимости от условий (например, добавление условий либо по регистру цен, либо по видам номенклатуры, либо по планам производства) программная работа выглядит всё более удобной по сравнению с работой с текстовой строкой.

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

з.ы. Всё выше написанное всего лишь моё личное понимание темы. Возможно, где-то ошибаюсь. Комментарии и уточнения приветствуются.

upd: Еще один небольшой пример использования схемы запроса. Формирование запроса, выполняющего поиск задвоенных значений предопределенных данных. Без обращения к метаданным формирует один общий запрос ко всем справочникам, планам счетов, ПВХ, ПВР вцелом по конфигурации. Используется в обработке

СхемаЗапроса = Новый СхемаЗапроса; КоллекцияОператоры = СхемаЗапроса.ПакетЗапросов.Операторы; Для каждого ГруппаТаблиц Из СхемаЗапроса.ПакетЗапросов.ДоступныеТаблицы Цикл Если ГруппаТаблиц.Представление = "Справочники" ИЛИ ГруппаТаблиц.Представление = "ПланыСчетов" ИЛИ ГруппаТаблиц.Представление = "ПланыВидовРасчета" ИЛИ ГруппаТаблиц.Представление = "ПланыВидовХарактеристик" Тогда Для каждого Таблица Из ГруппаТаблиц.Состав Цикл Для каждого ПолеТаблицы Из Таблица.Поля Цикл Если ПолеТаблицы.Имя = "ИмяПредопределенныхДанных" Тогда НовыйОператор = КоллекцияОператоры.Добавить(); НовыйИсточник = НовыйОператор.Источники.Добавить(Таблица,"СправочникИмя"); НовыйОператор.ВыбираемыеПоля.Добавить(""""+Таблица.Имя+""""); НовыйОператор.ВыбираемыеПоля.Добавить("КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СправочникИмя.ИмяПредопределенныхДанных)"); НовыйОператор.Группировка.Добавить("СправочникИмя.ИмяПредопределенныхДанных"); НовыйОператор.Отбор.Добавить("СправочникИмя.Предопределенный"); НовыйОператор.Отбор.Добавить("КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СправочникИмя.Ссылка) > 1"); Продолжить; КонецЕсли; КонецЦикла; КонецЦикла; КонецЕсли; КонецЦикла;

Тема 2.3. Программные средства презентаций и основы офисного программирования

Тема 2.4. Системы управления базами данных и экспертные системы

2.4.11. Учебная база данных с главной кнопочной формой "Training_students" - Скачать


СУБД и экспертные системы

2.4. Системы управления базами данных и экспертные системы

2.4.4. Создание (формирование) запросов

Запрос (query) – это средство выбора необходимой информации из базы данных. Вопрос, сформированный по отношению к базе данных, и есть запрос. Применяются два типа запросов: по образцу (QBE – Query by example) и структурированный язык запросов (SQL – Structured Query Language).

QBE - запрос по образцу – средство для отыскания необходимой информации в базе данных. Он формируется не на специальном языке, а путем заполнения бланка запроса в окне Конструктора запросов.

SQL – запросы – это запросы, которые составляются (программистами) из последовательности SQL – инструкций. Эти инструкции задают, что надо сделать с входным набором данных для генерации выходного набора. Все запросы Access строит на основе SQL – запросов, чтобы посмотреть их, необходимо в активном окне проектирования запроса выполнить команду Вид/SQL.

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

2.4.4.1. Создание запроса на выборку с помощью Мастера

При создании query необходимо определить:

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

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


Рис. 1.

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

Затем в окне Мастера надо выбрать подробный или итоговый отчет и щелкнуть на кнопке Далее. После этого необходимо задать имя запроса и выбрать один из вариантов дальнейшего действия: Открыть query для просмотра данных или Изменить макет запроса и нажать кнопку Готово. В результате чего получите готовый query.

2.4.4.2. Создание запроса на выборку с помощью Конструктора

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

  1. Простой.
  2. По условию.
  3. Параметрические.
  4. Итоговые.
  5. С вычисляемыми полями.

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

В окне Добавление таблицы следует выбрать таблицу – источник или несколько таблиц из представленного списка таблиц, на основе которых будет проводиться выбор данных, и щелкнуть на кнопке Добавить. После этого закрыть окно Добавление таблицы, окно «Запрос: запрос на выборку» станет активным.

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

В нижней части окна находится Бланк построения запроса QBE (Query by Example), в котором каждая строка выполняет определенную функцию:

  1. Поле – указывает имена полей, которые участвуют в запросе.
  2. Имя таблицы – имя таблицы, с которой выбрано это поле.
  3. Сортировка – указывает тип сортировки.
  4. Вывод на экран – устанавливает флажок просмотра поля на экране.
  5. Условия отбора - задаются критерии поиска.
  6. Или – задаются дополнительные критерии отбора.



Рис. 2.

Запрос на выборку

В окне «Запрос: запрос на выборку» с помощью инструментов формируем query:

  1. Выбрать таблицу – источник, из которой производится выборка записей.
  2. Переместить имена полей с источника в Бланк запроса. Например, из таблицы Группы студентов отбуксировать поле Название в первое поле Бланка запросов, из таблицы Студенты отбуксировать поле Фамилии во второе поле Бланка запросов, а из таблицы Успеваемость отбуксировать поле Оценка в третье поле и из таблицы Дисциплины отбуксировать поле Название в четвертое поле Бланка запросов.
  3. Задать принцип сортировки. Курсор мыши переместить в строку Сортировка для любого поля, появится кнопка открытия списка режимов сортировки: по возрастанию и по убыванию. Например, установить в поле Фамилия режим сортировки – по возрастанию.
  4. В строке вывод на экран автоматически устанавливается флажок просмотра найденной информации в поле.
  5. В строке "Условия" отбора и строке "Или" необходимо ввести условия ограниченного поиска – критерии поиска. Например, в поле Оценка ввести - "отл/A", т.е. отображать все фамилии студентов, которые получили оценки отл/A.
  6. После завершения формирования запроса закрыть окно Запрос на выборку. Откроется окно диалога Сохранить – ответить Да (ввести имя созданного запроса, например, Образец запроса в режиме Конструктор) и щелкнуть ОК и вернуться в окно базы данных.



Рис. 3.

Чтобы открыть query из окна базы данных, необходимо выделить имя запроса и щелкнуть кнопку Открыть, на экране появится окно запрос на выборку с требуемым именем.



Рис. 4.

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

Параметрические запросы

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

Последовательность создания параметрического запроса:

  1. Создать query в режиме конструктора или открыть существующий запрос в режиме конструктора, например «Образец запроса в режиме Конструктор».
  2. В Бланк запроса в строке Условия отбора ввести условие отбора в виде приглашения в квадратных скобках, например [Введите фамилию].
  3. Закрыть окно Запрос на выборку, на вопрос о сохранении изменения ответить – Да. Вернуться в окно базы данных, где созданный query будет выделен.
  4. Выполнить query, щелкнув по кнопке: Открыть. В появившемся на экране окне диалога «Введите значение параметра» надо ввести, например фамилию студента, информацию об успеваемости которого необходимо получить, выполнить щелчок по кнопке ОК.

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

Запросы можно создавать самостоятельно и с помощь(о мастеров. Мастера запросов автоматически выполняют основные действия в зависимости от ответов пользователя на поставленные вопросы. Самостоятельно разработать запросы можно в режиме конструк­тора.

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

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

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

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

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

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

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

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

Запрос на выборку используется наиболее часто. При его выполнении данные, удовле­творяющие условиям отбора, выбираются из одной или из нескольких таблиц и выводятся в определенном порядке. Например, можно вывести на экран данные о фамилиях доцентов, стаж которых более 15 лет (на основе таблицы Преподаватели). Можно также использовать запрос на выборку, чтобы сгруппировать записи для вы­числения сумм, средних значений, пересчета и других действий. Например, используя за­прос на выборку, можно получить данные о среднем стаже доцентов и профессоров (на основе таблицы Преподаватели). Простые запросы на выборку практически не отличаются от фильтров. Более того, фильтры можно сохранять как запросы.

Запрос с параметрами - это запрос, при выполнении которого в его диалоговом окне пользователю выдается приглашение ввести данные, на основе которых будет выполняться запрос. Например, часто требуются данные о том, какие дисциплины ведут преподаватели. Чтобы не создавать отдельные запросы по каждому преподавателю, можно создать один запрос с параметрами, где в качестве параметра будет использоваться фамилия преподавателя. При каждом вызове этого запроса вам будет предложено ввести фамилию преподавателя, а затем на экран будут выведены все поля, которые вы указали в запросе, например фамилия, имя, отчество преподавателя и читаемая им дисциплина.

Для создания нового запроса надо в окне базы данных выбрать вкладку Запросы и щелкнуть по кнопке <Создать>. Откроется окно «Новый запрос».

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

    Конструктор,

    Простой запрос.

    Перекрестный запрос,

    Повторяющиеся записи.

    Записи без подчиненных.

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

Простой запрос позволит создать с помощью Мастера запрос на выборку из определенных полей таблиц или других запросов. (Это наилучший способ создания запроса для начинающих пользователей.)

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

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

У вас может возникнуть вопрос: как создавать запросы с параметрами и запросы на изменение, если при создании запроса они явно не указаны? Следует отметить, что основой для всех этих запросов является запрос на выборку, т.е. сначала необходимо определить набор данных, с которым хотите работать. Затем для созданного запроса на выборку надо перейти в режим конструктора. Задание параметров производится в строке Условия отбора для соответствующих полей. Подробнее это будет рассмотрено ниже при выполнении задания. Для доступа к запросам на изменение надо открыть пункт меню Запрос - в открыв­шемся списке вы увидите все виды запросов на изменение.

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

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

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

    на физическом носителе информации (обычно это жесткий диск) требуется меньший объем пространства;

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

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

Для сохранения запроса следует выполнить следующие действия. Выполните коман­ду Файл, Сохранить или щелкните по кнопке <Сохранить> на панели инструментов. Если вы впервые сохраняете запрос, введите новое имя запроса в диалоговом окне «Сохране­ние».

Запрос лучше всего создавать с помощью Конструктора (язык QBE). Для этого есть специальный значок в окне База данных . Он называется Создание запроса в режиме конструктора и открывает специальный окно в режиме языка QBE (см. рисунок 1). Окно состоит из двух частей. В верхней отображается структура таблиц, к которым запрос адресован, а нижняя область разбита на столбцы – по одному столбцу на каждое поле будущей результирующей таблицы.

Рис. 1 Окно создания запрос в режиме QBE

Памятка «Условия отбора»

Оператор

Описание

? Улица

Знак вопроса заменяет один символ

43 место*

Звездочка заменяет несколько символов, идущих после определенного слова

Значение меньше 100

Значение больше или равно 1

<>"Москва"

Все города кроме Москвы

Between 1 and 10

Значения между 1 и 10

Is Null Is Not Null

Находит пустые записи или находит все записи кроме пустых

Like "a*"

Все слова, начинающиеся с буквы а

>0 And <=10

Все значения большие 0 и меньшие 10

"Bob" Or "Jane"

Значения равные или Bob, или Jane

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

Чтож, раз задача требует реализации - давайте выполним ее!

Как это сделать

Сразу оговоримся, что в отчете будут выводиться два поля: "Ссылка" и "Проведен". Эти стандартные реквизиты есть у всех документов. Запрос для получения всех документом мы будем формировать программным образом, обходя коллекцию метаданных "Метаданные.Документы". Для каждого элемента коллекции будем создавать запрос к его таблице по реквизитам "Ссылка" и "Проведен", а дальше объединять его результат с результатом аналогичного запроса к другому документу.

" ВЫБРАТЬ | Док. Ссылка КАК Ссылка, | Док. Проведен КАК Проведен |ИЗ | Документ. ABCКлассификацияПокупателей КАК Док . Ссылка КАК Ссылка, | Док. Проведен КАК Проведен |ИЗ | Документ. АвансовыйОтчет КАК Док |ОБЪЕДИНИТЬ ВСЕ |ВЫБРАТЬ | Док. Ссылка КАК Ссылка, | Док. Проведен КАК Проведен |ИЗ | Документ. АккредитивПереданный КАК Док |ОБЪЕДИНИТЬ ВСЕ | . . . "

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

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

Реализация

Теперь по порядку. Создав внешний отчет, добавим в него схему компоновки данных. В качестве запроса в наборе данных добавим следующий запрос:

Вообще, в нашем случае не важно, какой запрос будет для набора данных. Его мы добавили только для того, чтобы удобно было настраивать структуру отчета в конструкторе, поскольку иначе бы поля на закладке "Настройка" отсутствовали. Конечная настройка структуры отчета следующая:

Теперь в обработчике события "ПриКомпоновкеРезультата" отключим стандартную обработку и выполним формирование отчета программно. Программный код формирования отчета на СКД представлен на следующем листинге:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) СтандартнаяОбработка = Ложь ; // отключаем стандартный вывод отчета - будем выводить программно Настройки = КомпоновщикНастроек. Настройки; // Получаем настройки отчета ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; // Создаем данные расшифровки КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; // Создаем компоновщик макета // Инициализируем макет компоновки используя схему компоновки данных // и созданные ранее настройки и данные расшифровки " ) ; МакетКомпоновки = КомпоновщикМакета. Выполнить (СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки) ; // Скомпонуем результат ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки. Инициализировать(МакетКомпоновки, , ДанныеРасшифровки) ; ДокументРезультат. Очистить() ; // Выводим результат в табличный документ ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода. УстановитьДокумент(ДокументРезультат) ; ПроцессорВывода. Вывести(ПроцессорКомпоновки) ; КонецПроцедуры

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

// .................................................................. СхемаКомпоновкиДанных = ПолучитьМакет(" ОсновнаяСхемаКомпоновкиДанных " ) ; // Получаем схему компоновки данных СхемаКомпоновкиДанных. НаборыДанных. НаборДанных1. Запрос = " " ; // Очищаем запрос в наборе данных ДокументыКонфигурации = Метаданные. Документы; // Получаем коллекцию метаданных документов КоличествоДокументов = ДокументыКонфигурации. Количество() ; // Определяем общее количество документов в конфигурации Сч = 1 ; ТекстЗапроса = " " ; Для Каждого Док Из ДокументыКонфигурации Цикл ТекстЗапроса = ТекстЗапроса + // Для каждого документа формируем текст запроса к его таблице " ВЫБРАТЬ | Док. Ссылка КАК Ссылка, | Док. Проведен КАК Проведен |ИЗ | Документ. " + Док. Имя+ " КАК Док " ; // В текст запроса нам необходимо лишь подставить имя таблицы документа в дереве метаданных Если Сч КоличествоДокументов Тогда // Если документ не последний в коллекции - добавляем инструкцию "ОБЪЕДИНИТЬ ВСЕ" для ТекстЗапроса = ТекстЗапроса + // объединения результатов запросов по документам в единый список " |ОБЪЕДИНИТЬ ВСЕ | " ; КонецЕсли ; Сч = Сч + 1 ; КонецЦикла ; СхемаКомпоновкиДанных. НаборыДанных. НаборДанных1. Запрос = ТекстЗапроса; // Помещаем новый текст запроса в набор данных МакетКомпоновки = КомпоновщикМакета. Выполнить (СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки) ; // Компонуем макет // ....................................................................

Отчет готов к тестированию.

Что в итоге?

Запустим отчет в режиме 1С:Предприятие. Отчет успешно выполнится и мы увидим список всех документов в информационной базе.

При всех проделанных действия отчет имеет все стандартные возможности СКД: расшифровка, настройка структуры отчета, отборы, условное оформление и прочее.

Запрос к таблицам всех документом не самое оптимальное решение для просмотра полного списка документов в информационной базе, поскольку формирует относительно "тяжелый" запрос СУБД. Наиболее правильно было бы использовать объект конфигурации "Журнал документов", но это уже выходит за рамки статьи.

Лабораторная работа 2. Формирование запросов и отчетов

Формирование простых запросов

1. Создайте простой запрос на выборку

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

Для создания простого запроса:

· выберите пункт меню «Создание» – «Мастер запросов». В появившемся окне «Новый запрос» выберите «Простой запрос» и щелкните по кнопке ОК;

· в появившемся окне в строке Таблицы/Запросы выберите таблицу «Преподаватели»;

· переведите поля Фамилия, Имя, Отчество, Должность из окна «Доступные поля» в окно «Выбранные поля» и щелкните по кнопке «Далее»;

· в строке параметра «Задайте имя запроса» введите новое имя «Должности преподавателей» и щелкните по кнопке Готово. На экране появится таблица с результатами запроса.

2. Данные запроса отсортируйте по должностям и сохраните запрос.

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

3. Создать запрос на выборку с параметром.

Для создания запроса на выборку с параметром:

    создайте запрос на выборку аналогично п. 1 для следующих полей таблицы Преподаватели: Фамилия, Имя, Отчество.

Поле «Название дисциплины» возьмите из таблицы «Дисциплины»;

    задайте имя запросу «Преподаваемые дисциплины» и щелкните по кнопке Готово. На экране появится таблица с результатами запроса; перейдите в режим конструктора (команда Вид à Конструктор), в строке параметра «Условия отбора» для поля Фамилия введите фразу (скобки тоже вводить) [Введите фамилию преподавателя];

Формирование сложных запросов

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

    в появившемся окне в строке Таблицы/Запросы выберите из списка таблицу Студенты; перенесите все поля из окна Доступные поля в окно Выбранные поля и щелкните по кнопке Далее;

    выберите «Подробный» и еще раз щелкните по кнопке Далее; в появившемся окне введите имя запроса Группа, выберите «Изменить макет запроса» и щелкните по кнопке Готово. Откроется запрос в режиме конструктора.

    в строке «Условия отбора» для поля Номер группы введите фразу (скобки тоже вводить) [Введите номер группы];

    выполните запрос (команда Запрос à Выполнить), в появившемся окне введите 2В и щелкните по кнопке ОК. На экране появится таблица с данными о студентах группы 2В; сохраните запрос и закройте таблицу запроса.

2. Создайте запрос, в котором выводятся оценки студентов заданной группы по заданной дисциплине.

Для создания запроса, в котором выводятся оценки студентов заданной группы по заданной дисциплине:

    Аналогично предыдущим запросам создайте простой запрос с помощью «Мастера»; выберите таблицу Студенты и перенесите поля Фамилия, Имя, Отчество, Номер группы в окно Выделенные поля; Из таблицы «Дисциплины» выберите поле «Название дисциплины»; в таблице Оценки выберите поле Оценки. Вы сформировали шесть полей запроса, которые связаны между собой посредством схемы данных; щелкните по кнопке Далее, а затем в появившемся окне снова щелкните по кнопке Далее; в появившемся окне введите имя запроса «Оценки группы», затем щелкните по ячейке «Изменить макет запроса» и щелкните по кнопке Готово. Откроется запрос в режиме конструктора. в строке Условия отбора для поля Номер группы введите фразу [Введите номер группы], а для поля Название дисциплины - [Введите название дисциплины];

    выполните запрос; в первом появившемся окне введите 2В, затем щелкните по кнопке ОК, во втором - введите «Информатика» и щелкните по кнопке ОК. На экране появится таблица со списком группы 2В и оценками по информатике; сохраните запрос и закройте таблицу запроса.

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

Для создания перекрестного запроса о среднем балле в группах по дисциплинам сначала сформируйте «Простой запрос» с помощью «Мастера» и щелкните по кнопке ОК;

    выберите из таблицы Студенты поле Номер группы, из таблицы Дисциплины - поле Название дисциплины, из таблицы Оценки - поле Оценки; щелкните по кнопке Далее, а затем в появившемся окне снова щелкните по кнопке Далее; в появившемся окне введите имя запроса «Дисциплины оценки группы» и щелкните по кнопке Готово; сохраните запрос и закройте таблицу запроса.

Теперь можно создавать перекрестный запрос. Для этого:

    с помощью «Матера», выберите «Перекрестный запрос» и щелкните по кнопке ОК;

    щелкните по ячейке Запросы, выберите Дисциплины оценки группы и щелкните по кнопке Далее;

    выберите поле Название дисциплины и щелкните по кнопке Далее;

    выберите поле Номер группы и щелкните по кнопке Далее;

    выберите функцию «Среднее» и щелкните по кнопке Далее; выберите название запроса «Средние оценки» и щелкните по кнопке Готово; закройте таблицу запроса. Просмотрите результаты выполнения запроса.

4. Разработайте запрос на увеличение (на 10 %) заработной платы тех преподавателей, кто получает менее 10000 руб.

Для создания запроса на изменение заработной платы преподавателей:

    в появившейся строке конструктора запроса «Обновление» в поле Зарплата щелкните правой кнопкой мыши для вызова контекстного меню и выберите пункт «Построить…».

    с помощью построителя выражений введите: [Зарплата]*1,1;

    выполните запрос, подтвердив готовность на обновление данных;

    закройте запрос, подтвердив его сохранение; откройте форму Преподаватели, просмотрите изменение заработной платы у преподавателей, получающих меньше 10000р., и закройте форму.

5. Создайте запрос на удаление отчисленных студентов.

Для запроса на отчисление студента гр. 2Г Перлова Кирилла Николаевича:

    создайте с помощью «Мастера» «Простой запрос»; в таблице Студенты выберите поля Фамилия, Имя, Отчество, Номер группы; щелкните по кнопке Далее, а затем в появившемся окне снова щелкните по кнопке Далее; в появившемся окне введите имя запроса «Отчисленные студенты»; щелкните по ячейке «Изменить макет запроса», затем по кнопке Готово; в строке Условия отбора введите: в поле Фамилия - Перлов, в поле Имя - Кирилл, в поле Отчество – Николаевич, в поле Номер группы - 2Г;

    просмотрите удаляемую запись «Вид»- «Режим таблицы»

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

6. Разработайте запрос на создание базы данных отличников.

Для создания запроса на создание базы данных отличников:

o Создайте Простой запрос;

o в таблице Студенты выберите поля Фамилия, Имя, Отчество, Номер группы, а в таблице Оценки - поле Оценки;

o поставьте флажок на «Sum» и нажмите кнопку «ОК»

o в появившемся окне введите имя запроса «Отличники»;

o щелкните по ячейке «Изменить макет запроса», затем по кнопке Готово;

o в строке Условия отбора поля «Sum - Оценка: Оценка» введите 20 (отличниками будем считать тех студентов, которые за четыре экзамена набрали 20 баллов);

o снимите флажок с «Выводить на экран»;

o введите имя таблицы Студенты-отличники и щелкните по кнопке ОК;

o подтвердите создание таблицы и закройте (с сохранением) запрос;

o откройте вкладку Таблицы, затем таблицу Студенты-отличники. Удостоверьтесь в правильности создания таблицы. Закройте таблицу.

7. Для всех созданных вами запросов разработайте формы.

Создание отчета с группированием данных

На основе таблицы «Преподаватели» создайте отчет с группированием данных по должностям.

o откройте вкладку «Создать» и выберите пункт «Мастер отчетов»

.

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

o добавьте группировку по полю «Должность». Переведите выделение на поле Должность, щелкните сначала по кнопке >>, а затем по кнопке Далее.

o параметры появившегося окна оставьте без изменений (щелкните по кнопке Далее), выберите стиль оформления отчета и щелкните по кнопке Далее.

o в появившемся окне введите название отчета Преподаватели и щелкните по кнопке Готово. Просмотрите, а затем закройте появившийся на экране сформированный отчет.

Создайте еще 3 отчета на свое усмотрение.

Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: