Содержание
Запрос
Запросы извлекают и сводят данные из других форм. Они очень похожи на отчеты и настраиваются по тем же принципам. Компонент размещается на форме и в его фильтры и вычисляемые поля могут быть подставлены значения полей формы. Запрос обновляется всякий раз, когда осуществляется переход на другую запись.
Имя запроса
Имя запроса используются для его идентификации в базе данных. Оно используется в различных диалогах, выражениях, шаблонах. Имя должно быть уникальным в пределах всей базы данных и не должно совпадать с именами других запросов, форм или отчетов. В именах запрещены использовать следующие символы:
' " | ! < > [ ] { } / \ ? : *
Поля формы в фильтре источника
В выражениях фильтра источника могут использоваться поля формы. Например:
[!дата]>=BeginMonth([дата]) & [!дата]<=[дата] & [!Группа]=[Группа]
Возможно вас может удивить, что имена полей по обе стороны знаков сравнения одинаковы. На самом деле это обычное явление, потому что часто в разных формах имена полей одинаковы.
Когда поле формы изменяется, это заставляет запрос обновиться. Достаточно того, чтобы программа нашла совпадение в любой части фильтра, даже в комментариях. Она ищет образцы вида: [Поле], [Поле|, [:Поле], [:Поле|, [!Поле], [!Поле|.
Поля формы в вычисляемых полях и выходном фильтре
В выражениях вычисляемых полей и выходном фильтре могут использоваться поля формы. И чтобы их можно было отличить от полей отчета, перед именем ставиться двоеточие. Если поле принадлежит родительской форме, то перед именем ставится восклицательный знак. Когда поле формы изменяется, это заставляет запрос обновиться. Достаточно того, чтобы программа нашла совпадение в любой части выражения, даже в комментариях. Она ищет образцы вида: [:Поле], [:Поле|, [!Поле], [!Поле|.
Обновлять вручную
Установка опции «Обновлять вручную» отключает автоматическое обновление запроса при переходе на другую запись или при изменении полей. Запрос можно обновить командой контекстного меню или кнопкой «Обновить». При добавлении или редактировании записи в запросе, он будет обновлен автоматически не смотря на установленную опцию.
При печати и использовании в качестве источника списка, запрос также обновляется автоматически.
Подчинённые запросы
Пример базы Как известно, для хранения подчиненных данных используется таблица. Таблица имеет свою достоинства и недостатки. Основными недостатками являются: в таблицах нельзя создавать подчиненные таблицы, таблицу нельзя открыть в отдельной закладке, как форму, и работать со всеми записями. Подчиненные запросы не имеют таких недостатков. Подчиненный запрос - это запрос отображающий данные некоторой формы, логически принадлежащие текущей родительской записи. Для создания подчиненного запроса необходимо:
- Две формы: А и Б.
- В форме А должен быть объект, ссылающийся на форму Б.
Теперь в форму Б можно добавить запрос, отображающий данные, принадлежащие текущей записи.
Рассмотрим на конкретном примере. К статье приложен пример базы данных, откройте ее. В этой базе:
- Две формы: «Заказы» и «Клиенты».
- В форме «Заказы» есть объект «Заказчик», который ссылается на форму «Клиенты».
Теперь мы можем в форму «Клиенты» добавить запрос, отображающий заказы текущего клиента. На рисунке показан подчиненный запрос в форме «Клиенты». Откройте отбор (отмечен красной стрелкой на рисунке). Обратите внимание на фильтр. Заказы фильтруются по объекту «Заказчик». Функция RECID передает в фильтр идентификатор текущей записи формы «Клиенты» (помните ведь, что объект хранит идентификатор записи?). Вот таким образом мы создали подчиненную связь между формами «Клиенты» и «Заказы».
Значения, передаваемые в фильтр, являются параметрами при создании новой записи в запросе. Для этого необходимо соблюдение одного условия: должна использоваться операция сравнения = (равно). В данном случае, при создании нового заказа в запросе, в форму «Заказы» автоматически вставится текущий клиент.
Связь между запросами
Пример базы В DataExpress можно сделать так, чтобы один запрос зависел от другого. Т. е. при перемещении по записям запроса А, запрос Б отображал записи, соответствующие выбранной записи в запросе А. Для этого достаточно в выражении запроса Б обратиться к запросу А, например при помощи функций RECID и GET. Выражение может находиться в фильтре отбора, в выходном фильтре или в вычисляемых полях.
На самом деле при перемещениях по записям запроса и при обновлении запроса программа ищет в других запросах формы подстроку вида: 'Запрос А' или «Запрос А». И если подстрока найдена, то запрос обновляется. Таким образом для организации подчиненной связи достаточно подстроки данного вида. Такой незатейливый алгоритм, однако, может приводить к «побочным эффектам». Если, например, в выражении запроса в кавычках указано имя поля, совпадающее с именем запроса, то программа ошибочно будет считать это именем запроса и обновлять «подчиненный» запрос. Давайте запросам уникальные имена. Данное правило относится также к формам и полям.
Откройте пример базы (см. выше). Три формы: Устройства, Узлы, Комплектующие, образуют два уровня подчиненности. Устройства состоят из узлов, узлы - из комплектующих. В форме «Устройства» 2 запроса: _Узлы (Запрос А) и _Комплектующие (Запрос Б). Откроем отбор запроса «_Комплектующие» (красная стрелка на рисунке). Обратите внимание на фильтр. Комплектующие фильтруются по объекту «Узел». Функция RECID передает в фильтр идентификатор текущей записи запроса «_Узлы».
Пример подчиненных запросов можно увидеть и в DEMO_DB в форме «Товарооборот». Там, в частности, продемонстрировано применение функции GET:
[Товар|Название]=get('запрос2', 'товар')
Редактирование записей запроса
Если в настройке отбора не используются функции и группировка по дате, данные извлекаются только из одного источника, то данные запроса можно редактировать. Точнее редактируются данные формы, из которой они извлекаются. В меню запроса и кнопках можно использовать команды редактирования.
Когда вы добавляете новую запись запроса, в запись могут быть подставлены результаты вычисления выражений фильтра источника. Для этого должно соблюдаться следующее условие: поле источника не должно являться полем объекта (т. е. [объект|поле объекта]), должен использовать знак равенства. Пример:
[!Клиент]=[клиент] & [!дата]=date & [!сумма]>0
При добавлении записи в запрос в поля новой записи будут подставлены выбранный клиент и текущая дата.
Если данные извлекаются в том числе из подчиненной формы, то при редактировании все равно будет открываться родительская форма.
Таблица или запрос?
Пример базы При внешнем сходстве таблицы и запросы имею важные отличия в работе. Здесь пойдет речь о редактируемых подчиненных запросах. Такие запросы отображают только часть данных, логически принадлежащих родительской записи.
Особенности таблиц:
- Таблица - это подчиненная форма и хранит реальные данные.
- Такая форма не может отображаться в закладках, а также выступать в качестве источника списка объекта.
- Данные, сохраняемые в таблицу, попадают в базу не сразу. Чтобы данные таблицы сохранились в базе, нужно сохранить запись родительской формы.
- При удалении родительской записи, все подчиненные записи также удаляются.
- Редактирование таблицы возможно только когда редактируется родительская запись.
- Нельзя настроить сортировку, если родительская запись редактируется.
- Таблица не может содержать другие таблицы.
- Возможно редактировать данные прямо в таблице.
- Доступны команды: дублировать, шопинг, перемещение строк.
Особенности запросов:
- Запрос отображает часть данных некоторой формы. Редактируя запрос, вы на самом деле редактируете данные связанной с запросом формы.
- При редактировании запроса данные немедленно попадают в базу.
- При попытке удалить родительскую запись, вы получите отказ, если запрос отображает какие-то подчиненные данные.
- Сортировку можно настроить в любой момент.
- С помощью запросов можно создавать подчиненность произвольной вложенности.
Так в каких же случаях использовать таблицу и запрос? Все зависит от задачи. Таблица лучше подойдет там, где нужно хранить пункты чего-либо. Если требуется хранить, например, список товаров или услуг, то с этой задачей успешно справится таблица. Дополнительным бонусом является быстрое добавление позиций при помощи шопинга.
Если же подчиненные данные также имеют некоторые подчиненные данные, то лучше использовать отдельные формы и строить подчиненность с помощью запросов. Если подчиненные данные будут выступать в качестве источника списка объектов, то нужно также использовать запрос. Если предполагается работать с полным списком подчиненных данных в отдельной форме, используйте запросы.