4. Формирование запросов к базе данных

4.1 Общее понятие запросов

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

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

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

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

Включать в результирующую таблицу поля из одной или нескольких таблиц в нужном порядке;

Выбирать записи, удовлетворяющие условиям отбора;

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

Группировать записи и находить для групп записей или для всех записей итоговые значения по некоторым полям с помощью статистических функций: Sum – сумма значений поля, Avg – среднее значений поля, Max – максимальное из значений поля, Min – минимальное из значений поля, Count – число значений поля и др.

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

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

Существует четыре типа запросов на внесение изменений в базу данных:

1) запрос на удаление - удаляет группу записей из одной таблицы или нескольких взаимосвязанных таблиц базы данных, для которых задано каскадное удаление связанных записей;

4) запрос на создание таблицы - создает новую таблицу на основе всех или части данных из одной или нескольких таблиц базы данных.

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

4.2 Создание запроса выбора

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

Окно БД - объект Запросы - [Создать] - окно Новый запрос - выбрать Конструктор - окно Добавление таблицы - выбрать таблицы-источники запроса - [Закрыть].

Окно Конструктора запроса имеет вид как на рис. 4.1.


Рис. 4.1 Окно Конструктора запроса

Оно разделено на две панели.

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

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

· Поле – указывает имена полей, участвующих в формировании запроса;

· Имя таблицы - указывает имена таблиц, которым принадлежат эти поля;

· Сортировка – дает возможность отсортировать записи в результирующей таблице запроса;

· Вывод на экран – позволяет управлять отображением полей в этой таблице;

· Условие отбора – служит для задания условий отбора записей;

· или – позволяет объединять условия отбора логической операцией ИЛИ. При этом условия отбора могут указываться в нескольких строках бланка запроса.

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

· перетащить поле из списка полей в крайнюю слева свободную клетку строки Поле;

· дважды щелкнуть по имени поля в списке полей;

· щелкнуть в клетке строки Поле и из раскрывающегося списка выбрать нужное поле.

Включение в бланк запроса всех полей таблицы можно выполнить, если:

· дважды щелкнуть по имени таблицы и перетащить все выделенные поля в клетку строки Поле;

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

Для очистки отдельных столбцов бланка запроса используется команда - Правка/Удалить столбцы.

Для очистки всего бланка запроса служит команда - Правка/Очистить бланк.

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

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

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

Формирование запроса с условиями отбора.

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

Если выражения вводятся в несколько клеток одной строки Условие отбора, то они автоматически объединяются с помощью логического оператора And. Если выражения вводятся в разные строки бланка запроса, то Access объединяет их логическим оператором Or. Пример создания запроса с условием для создаваемой базы данных см. в Приложении 11-12.

В условии отбора может быть использована конструкция Between (между). Например, Between 100 and 200. Результат построения запроса с использованием конструкции Between см. в Приложении 13-14.

Формирование запроса с вычисляемым полем.

Для создания вычисляемого поля в пустую клетку строки Поле вводится имя вычисляемого поля с двоеточием, после которого – выражение. Например,

СТОИМОСТЬ: [ЦЕНА]*[КОЛИЧЕСТВО]

Если выражение сложное, то для его создания целесообразно использовать построитель выражений.

Для проектируемой базы данных запрос с вычисляемым полем имеет вид – см. в Приложении 15-16.

Формирование запроса с группировкой.

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

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

· перетаскивается в первую клетку строки Поле то поле, по которому производится группировка записей. Затем перетаскиваются в последующие клетки поля, по которым подводятся итоги;

· вводится команда Вид / Групповые операции. В бланке запроса появляется новая строка Групповая операция, в которой для всех полей указано Группировка;

· в строке Групповая операция для полей, по которым подводятся итоги, производятся щелчки и из раскрывающегося списка выбирается требуемая статистическая функция.

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

Если необходимо часто выполнять один и тот же запрос выбора, меняя только в условиях отбора значения полей, то целесообразно создать запрос с параметрами. В строках Условие отбора, или для полей, играющих роль параметров, вводится в квадратных скобках текст приглашения на ввод интересующих пользователя значений этих полей. Этот текст будет выводиться в диалоговом окне "Введите значение параметра при выполнении запроса". Результат построения запроса с параметрами приведен в Приложении 17-18.

4.3 Создание перекрестного запроса

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

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

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

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

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

Результат создания перекрестного запроса представлен в Приложении 19-20.

4.4 Создание запросов действия

Формирование запроса на создание таблицы БД.

После открытия окна конструктора запроса вводится команда Запрос / Создание таблицы

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

Формирование запроса на обновление полей таблицы БД

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

Формирование запроса на добавление записей к таблице БД.

При открытии окна конструктора запроса в качестве источника запроса указывается таблица, из которой добавляются записи в другую таблицу. Записи таблицы-источника должны содержать такие же поля, что и пополняемая таблица БД. В окне конструктора запроса вводится команда Запрос / Добавление. Появится диалоговое окно Добавление, в котором требуется указать имя пополняемой таблицы и где эта таблица находится – в текущей БД или в другой БД. Кроме того, в бланке запроса появится новая строка Добавление.

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

Формирование запроса на удаление записей из таблицы БД.

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

В этом случае при удалении записей из подчиненной таблицы в окне конструктора запроса вводится команда Запрос / Удаление. В результате в бланке запроса появится новая строка Удаление. Тогда из списка полей подчиненной таблицы перетаскивается в бланк запроса символ звездочки (*), после чего в строке Удаление для этого поля отобразится значение Из. Затем из списка полей главной таблицы перетаскиваются поля, участвующие в условии отбора удаляемых записей, и для них в строке Удаление появится значение Условие. После этого задаются условия отбора удаляемых записей.

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

При составлении запроса на удаление записей из главной таблицы (в обоих случаях) в окне конструктора запроса вводится команда Запрос / Удаление.

В бланк запроса перетаскиваются поля, участвующие в условиях отбора записей на удаление, и задаются условия отбора.

4.5 Выполнение и сохранение запроса

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

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

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

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

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

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

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

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

Реализация

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

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

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

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

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

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

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

Что в итоге?

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

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

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

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

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

Инструкция

  • Поисковые системы (Google, Yandex, Rambler, Mail, Yahoo и др.) призваны снабжать пользователей нужной информацией. Делают они это на основании поискового запроса.Поисковые запросы могут быть трех типов:
  • Информационный. Юзер ищет точную информацию (неважно, на каком сайте она находится). Например: "Гимн России".

    Навигационный. Юзер ищет адрес сайта, на котором может находится интересующая его информация. Например: "Сайт МГУ им. М.В. Ломоносова".

    Транзакционный. Юзер готов совершить какое-либо действие и ему нужна информация об этом. Например: "форматирование диска".Итак, первое, что нужно сделать при формировании поискового запроса - определить, что именно вы ищете.

  • Поисковая система - это огромная база данных, вся информация в которой "разложена" по полочкам - ключевым словам. После того, как вы задаете поисковый запрос, происходит поиск по ключевым словам и выдается результат поиска.Распространенная ошибка начинающих пользователей в том, что они воспринимают поисковую систему как собеседника, знающего все, и задают поисковый запрос, например, так: "Не подскажете, как убрать пятно с новенькой блузки? Она шелковая". Естественно, польза от такого запроса будет минимальной.Гораздо эффективнее будет такой запрос: "белая шелковая блузка убрать пятно".Итак, второе, что нужно сделать - правильно сформировать запрос. Он должен быть максимально простым и содержать ключевые слова.
  • После того, как машина обработает ваш запрос, она выдаст результаты поиска. Как правило, все наиболее подходящие результаты находятся на первых двух-трех страницах. Далее следуют результаты поиска, которые только частично удовлетворяют запрос.Однако, бывают ситуации, когда нужна очень редкая информация - тогда приходится перебирать несколько комбинаций ключевых слов в поисковом запросе и очень тщательно фильтровать полученные данные.
  • Также иногда приходится искать редкую информацию, которая "содержится" в популярных ключевых словах. Например, если задать поисковый запрос "Маркс издатель фото", то поисковая система найдет множество фотографий Карла Маркса, издателя Карла Маркса, но для того, чтобы найти фотографию А.Ф. Маркса, книгоиздателя, придется потрудиться.Итак, третье, что нужно сделать для того, чтобы поиск удался - правильно сортировать информацию.