Динамическое формирование запроса. Создание запросов в базах данных Access Запросы access способы их создания

Тема 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, щелкнув по кнопке: Открыть. В появившемся на экране окне диалога «Введите значение параметра» надо ввести, например фамилию студента, информацию об успеваемости которого необходимо получить, выполнить щелчок по кнопке ОК.

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

Если вы хотите узнать больше о принципах работы запросов на примере базы данных Northwind, ознакомьтесь со статьей Общие сведения о запросах .

В этой статье

Общие сведения

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

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

Преимущества запросов

Запрос позволяет выполнять перечисленные ниже задачи.

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

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

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

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

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

Основные этапы создания запроса на выборку

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

    Выберите таблицы или запросы, которые хотите использовать в качестве источников данных.

    Укажите поля из источников данных, которые хотите включить в результаты.

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

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

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

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

Подготовка

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

Дополнительную информацию о создании отношений между таблицами можно найти в статье Руководство по связям между таблицами .

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

    На вкладке Создание в группе Запросы нажмите кнопку Мастер запросов .

    В диалоговом окне Новый запрос выберите пункт Простой запрос и нажмите кнопку ОК .

    Теперь добавьте поля. Вы можете добавить до 255 полей из 32 таблиц или запросов.

    Для каждого поля выполните два указанных ниже действия.


  1. Если вы не добавили ни одного числового поля (поля, содержащего числовые данные), перейдите к действию 9. При добавлении числового поля вам потребуется выбрать, что именно вернет запрос: подробности или итоговые данные.

    Выполните одно из указанных ниже действий.


  2. В диалоговом окне Итоги укажите необходимые поля и типы итоговых данных. В списке будут доступны только числовые поля.

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

    1. Sum - запрос вернет сумму всех значений, указанных в поле.

      Avg - запрос вернет среднее значение поля.

      Min - запрос вернет минимальное значение, указанное в поле.

      Max - запрос вернет максимальное значение, указанное в поле.


  3. Если вы хотите, чтобы в результатах запроса отобразилось число записей в источнике данных, установите соответствующий флажок Подсчет числа записей в (название источника данных) .

    Нажмите ОК , чтобы закрыть диалоговое окно Итоги .

    Если вы не добавили в запрос ни одного поля даты и времени, перейдите к действию 9. Если вы добавили в запрос поля даты и времени, мастер запросов предложит вам выбрать способ группировки значений даты. Предположим, вы добавили в запрос числовое поле ("Цена") и поле даты и времени ("Время_транзакции"), а затем в диалоговом окне Итоги указали, что хотите отобразить среднее значение по числовому полю "Цена". Поскольку вы добавили поле даты и времени, вы можете подсчитать итоговые величины для каждого уникального значения даты и времени, например для каждого месяца, квартала или года.


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

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

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

Создание запроса в режиме конструктора

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

Создание запроса

Действие 1. Добавьте источники данных

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

Автоматическое соединение

Если между добавляемыми источниками данных уже заданы отношения, они автоматически добавляются в запрос в качестве соединений. Соединения определяют, как именно следует объединять данные из связанных источников. Access также автоматически создает соединение между двумя таблицами, если они содержат поля с совместимыми типами данных и одно из них - первичный ключ.

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

Повторное использование одного источника данных

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

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

Действие 2. Соедините связанные источники данных

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

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

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

Добавление соединения

Изменение соединения

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

Действие 3. Добавьте выводимые поля

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

    Для этого перетащите поле из источника в верхней области окна конструктора запросов вниз в строку Поле бланка запроса (в нижней части окна конструктора).

    При добавлении поля таким образом Access автоматически заполняет строку Таблица в таблице конструктора в соответствии с источником данных поля.

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

Использование выражения в качестве выводимого поля

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

Действие 4. Укажите условия

Это необязательно.

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

Определение условий для выводимого поля

Условия для нескольких полей

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

Настройка условий на основе поля, которое не включается в вывод

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

    Добавьте поле в таблицу запроса.

    Снимите для него флажок в строке Показывать .

    Задайте условия, как для выводимого поля.

Действие 5. Рассчитайте итоговые значения

Этот этап является необязательным.

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

Для расчета итоговых значений в запросе используется строка Итого . По умолчанию строка Итого не отображается в режиме конструктора.

Чтобы увидеть результаты запроса, на вкладке "Конструктор" нажмите кнопку Выполнить . Access отобразит результаты запроса в режиме таблицы.

Чтобы вернуться в режим конструктора и внести в запрос изменения, щелкните Главная > Вид > Конструктор .

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

Создание запроса на выборку в веб-приложении 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"); Продолжить; КонецЕсли; КонецЦикла; КонецЦикла; КонецЕсли; КонецЦикла;

Формирование запросов.

Наименование параметра Значение
Тема статьи: Формирование запросов.
Рубрика (тематическая категория) Связь

Запросы. Типы запросов.

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

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

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

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

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

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

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

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

Запросы, используемые для добавления, изменения или удаления данных, называются запросами на изменение .

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

При создании query крайне важно определить:

· Поля в базе данных, по которым будет идти поиск информации

· Предмет поиска в базе данных

· Перечень полей в результате выполнения запроса

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

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

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

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

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

· Простой

· По условию

· Параметрические

· Итоговые

· С вычисляемыми полями

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

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

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

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

Поле – указывает имена полей, которые участвуют в запросœе

Имя таблицы – имя таблицы, с которой выбрано это поле

Сортировка – указывает тип сортировки

Вывод на экран – устанавливает флажок просмотра поля на экране

Условия отбора - задаются критерии поиска

Или – задаются дополнительные критерии отбора

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

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

Переместить имена полей с источника в Бланк запроса. К примеру, из таблицы Группы студентов отбуксировать поле Название в первое поле Бланка запросов, из таблицы Студенты отбуксировать поле Фамилии во второе поле Бланка запросов, а из таблицы Успеваемость отбуксировать поле Оценка в третье поле и из таблицы Дисциплины отбуксировать поле Название в четвертое поле Бланка запросов.

Задать принцип сортировки. Курсор мыши переместить в строку Сортировка для любого поля, появится кнопка открытия списка режимов сортировки: по возрастанию и по убыванию. К примеру, установить в поле Фамилия режим сортировки – по возрастанию.

В строке вывод на экран автоматически устанавливается флажок просмотра найденной информации в поле.

В строке "Условия" отбора и строке "Или" крайне важно ввести условия ограниченного поиска – критерии поиска. К примеру, в поле Оценка ввести - "отл/A", ᴛ.ᴇ. отображать всœе фамилии студентов, которые получили оценки отл/A.

После завершения формирования запроса закрыть окно Запрос на выборку. Откроется окно диалога Сохранить – ответить Да (ввести имя созданного запроса, к примеру, Образец запроса в режиме Конструктор) и щелкнуть ОК и вернуться в окно базы данных.

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

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

Формирование запросов. - понятие и виды. Классификация и особенности категории "Формирование запросов." 2017, 2018.

Лекция 16. Создание запросов средствами MS Access 2000

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

§ соединение данных нескольких таблиц;

§ отображение только требуемых полей;

§ формирование сложных критериев отбора записей;

§ вычисления с использованием данных из исходных таблиц;

§ группировку информации по каким-либо критериям;

§ модификацию данных в таблицах.

MS Access предоставляет удобные механизмы быстрого создания запросов без особой подготовки, тогда как в других СУБД часто требуются знание языковых средств, для создания запросов. Для создания запросов MS Access предлагает следующие средства:

§ Конструктор запросов – средство конструирования запросов с использованием QBE (Query by example – запрос по образцу), требует минимальных знаний. Средство, уступающее режиму SQL .

§ Простой запрос – позволяет быстро создавать запросы на основе одной или нескольких таблиц, в том числе итоговые запросы.

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

§ Запрос на повторяющиеся записи – средство создания запросов для выявления повторяющихся записей, выполнено в виде мастера.

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

Создание запросов начинается с выбора категории «Запросы» окна диалога «Базы данных». Затем, кнопкой «Создать» может быть вызвано окно диалога «Новый запрос», в котором выбирается один из вариантов создания запроса (рисунок 16.1).

Рисунок 16.1 - Диалоговое окно «Новый запрос»

Создание простых запросов с помощью мастера

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


Рисунок 16.2 - Окно мастера создания запросов

Процесс создания запроса с помощью мастера сводится к следующим шагам:

§ Запускается мастер создания простых запросов, например командой – Создание запроса с помощью мастера

§ в раскрывающемся списке «Таблицы и запросы» последовательно выбираются таблицы или запросы, информация из которых необходима пользователю, а затем, из списка «Доступные поля» в список «Выбранные поля» перемещаются требуемые поля (рисунок 16.2).

§ На втором шаге работы мастера определяется тип запроса: подробный или итоговый. Если выбран итоговый запрос, то необходимо определить итоговые операции над полями запроса: Max , Min , Sum , Avg или Count .

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

Создание запроса в режиме конструктора

Конструктор редко используется для создания запросов, чаще используется как средство модификации уже существующих. Конструктор запросов использует QBE (Query by example – запрос по образцу) позволяющий сформировать относительно сложные запросы на основе специального бланка, заполнение которого позволяет сформировать запрос, безусловно, этот способ уступает непосредственному использованию конструкций языка SQL , но требует значительно меньших знаний.

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

Окно конструктора (рисунок 16.3) разделено на две части. Верхняя часть предназначена для расположения таблиц, на основе которых формируется запрос. Добавление таблиц в запрос осуществляется командой панели инструментов - Отобразить таблицу .


Рисунок 16.3 - Окно конструктора запроса. Пример ввода условия.

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

Включение новых полей в запрос выполняется простым перетаскиванием имени поля из списков полей таблиц (верхней части конструктора) в требуемый столбец строки «Поле:», при этом имя таблицы определяется автоматически.

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

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

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

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

Количество строк в QBE может варьироваться в зависимости от типа создаваемого запроса, например при использовании группировки появится новая строка – «Групповая операция».

Установка критериев отбора записей

Определение критериев выборки в запросах является одной из основных задач. Чтобы сформировать требуемый пользователю набор данных необходимо определить значения условий отбора в строке «Условие отбора:» QBE. В условиях отбора можно использовать логические операторы (or , and , not ), операторы сравнения (<, >, <=, >=, <>, = ), а также операторы Between , In и Like .

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

1. ввести всё условие в одну ячейку строки «Условие отбора:», с использованием логическогооператораили (or ).

2. одну часть условия указать в ячейке строки «Условие отбора:», а вторую часть условия вписать в нижнюю ячейку строки «Или:».

Оба варианта будут эквивалентными, второй вариант изображен на рисунке 16.4. Результатом этого запроса будет список студентов имеющих оценки 4 или 5.


Рисунок 16.4 - Использование логического оператора или ( or ) .

Логическая операцияи ( and ) используется в том случае, когда должны быть выполнены оба условия одновременно и только в этом случае запись будет включена в результирующий набор данных. Например, условие >2 and <5 даст список студентов имеющих оценки 3 и 4.

Логическая операция and может быть использована не только для одного поля, но и для нескольких полей, условия в которых должны выполниться одновременно, однако, в этом случае она используется неявно. На рисунке 16.5 показано неявное использование логической операции and . В результате такого запроса будут выданы все студенты, проживающие в городе «Уфа» и имеющие оценку 5. Фактически, если заглянуть в код SQL (в режиме SQL ) то можно увидеть следующее условие:

[Студенты].[Город] = “Уфа” and [Студенты и занятия].[Балл] = “5”


Рисунок 16.5 – Пример использования логической операции и ( and )

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

Оператор B etween позволяет задать диапазон значений, например диапазон от 10 до 20 может быть определен следующим образом:

between 10 and 20

Оператор I n позволяет использовать для сравнения список значений, указываемый в качестве аргумента. Например:

in (“первый”,”второй”,”третий”)

Оператор L ike полезен для поиска образцов в текстовых полях, причем позволяет использовать шаблоны:

* - обозначает любое количество символов;

Любой одиночный символ;

# - указывает, что в данной позиции должна быть цифра.

Например, для выбора фамилии, начинающейся с буквы П и с окончанием “ов” можно записать следующие условие:

Like П*ов

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

>#31.12.1996#

Если требуется выделить временные события конкретного дня, месяца или года, то можно использовать встроенные функции MS Access :

§ Day (дата) – возвращает значение дня месяца в диапазоне от 1 до 31;

§ Month (дата) – возвращает значение месяца в диапазоне от 1 до 12;

§ Year (дата) – возвращает значение года в диапазоне от 100 до 9999;

Текущую дату можно определить функцией Now (), используемую без аргументов.

Вычисляемые поля

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

Надбавка: [ Оклад]*0.15

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

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

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

Допустим, существует запрос «Отпуск товаров со склада», который содержит поля «КолОтп» (количество отпущенное) и «ЦОтп» (цена отпускная), требуется определить сумму продажи. Открываем запрос в режиме конструктора, переходим на пустой столбец и запускаем построитель выражений командой «Построить», контекстного меню . Находим в среднем списке имя поля «ЦОтп» и дважды щелкаем по нему мышкой. Нажимаем кнопку «*» и повторяем ту же последовательность действий для поля «КолОтп». Получаем требуемое выражение (рисунок 16.6).


Рисунок 16.6 - Окно построителя выражений

Прежде чем применить созданное выражение, рекомендуется определить имя вычисляемого поля, например «Сумма»:

Сумма: [ЦОтп]*[КолОтп]

После нажатия «ОК» полученный результат будет помещен в новый столбец бланка QBE.

Контрольные вопросы

1. Что такое запрос?

2. В чем заключаются функции запроса?

3. Какие способы создания запросов существуют в MS Access ?

4. Чем отличаются возможности различных способов создания запросов?

5. Как создается запрос с помощью мастера?

6. Что представляет собой бланк запросов?

7. Как сформировать условия отбора записей?

8. Назовите основные логические операторы.

9. Что представляет собой оператор b etween?

10. В чем назначение оператора Like ?

11. Как создаются вычисляемые поля?

12. Преимущества и недостатки конструктора запросов?


Задания для самостоятельной работы

Задание 1. Создайте запрос «Просроченные книги», по следующему описанию:

1. В окне «Базы данных» выбираем категорию «Запросы».

2. Открываем окно мастера командой «Создание запроса с помощью мастера».

3. В раскрывающемся списке «Таблиц и запросы» выбираем таблицу «Книги». Из списка «Доступные поля» в список «Выбранные поля» перемещаем поля «Название» и «Автор».

4. В раскрывающемся списке «Таблиц и запросы» выбираем таблицу «Экземпляры». Из списка «Доступные поля» в список «Выбранные поля» перемещаем поля «Инвентарный номер», «Дата возврата» и «Наличие».

5. В раскрывающемся списке «Таблиц и запросы» выбираем таблицу «Читатели». Из списка «Доступные поля» в список «Выбранные поля» перемещаем поля «Номер_ЧБ», «ФИО», «Тел_дом», «Тел_раб». Нажимаем кнопку «Далее».

6. На данном этапе выбираем подробный запрос и нажимаем кнопку «Далее».

7. Указываем имя запросаПросроченные_книги и нажимаем кнопку «Готово».

8. Откроем запрос«Просроченные_книги» в режиме конструктора, нажав кнопку «Конструктор» (рисунок 16.7).


9. В бланке запроса в строке «Условие отбора» для поля «Дата_возврата» укажем значение < Now ().

10. В бланке запроса в строке «Условие отбора» для поля «Наличие» установим значение нет и снимем флажок «Вывод на экран».

11. Закроем окно конструктора.

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

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

Задание 3. Из запроса «Просроченные_книги» извлеките информацию о должниках (Номер читательского билета, ФИО, Домашний и рабочий телефоны)

Задание 4. Создайте запрос на получение списка книг одного автора.