Использование в запросе фильтров с несколькими условиями

В этом примере мы выполним запрос, используя несколько условий в фильтре. Задача следующая: мы знаем, сколько получили прибыли на сегодняшний день — в день отбытия клиент рассчитывается, а данные и о нем самом и о сумме оплаты заносятся в таблицу depciients. Но нам интересно, есть ли среди живущих в нашем отеле клиентов те, которые уже на сегодня “должны” нам с тобой, ну скажем, сумму больше 36 500 руб. Почему именно такую?

Да не важно, это просто для примера. Усложним задание: клиенты должны быть из России и более того, нам интересно видеть конкретную сумму по каждому. Каким же образом все это узнать, хотя бы про суммы — ведь в таблице с записями о проживающих (names) нет соответствующего поля? Тем не менее конструктор запросов позволяет легко решить данную задачу, потому что помимо использования фильтра с несколькими условия- ми, у нас еще есть возможность создавать с помощью построителя выражений вычисляемые поля и включать их в итоговую таблицу.

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

Для того чтобы узнать сумму по каждому клиенту, воспользуемся построителем выражений. Чтобы его открыть, нужно щелкнуть на области поля Fields Name вкладки Fields и перейти к его самому последнему элементу Expression. При щелчке на данном элементе откроется построитель выражений (Expression Builder) — а с помощью этой “хитрой штуки” можно создать любое выражение на языке программирования Visual FoxPro.

Что ж, приступим. Чтобы узнать сумму оплаты, нам сначала необходимо знать, сколько дней человек пребывал в нашем отеле — от сегодняшней даты отнимаем дату приезда. Затем умножаем полученное значение на стоимость проживания в номере за сутки. Практически все изложенное ранее выполняется следующим образом: в раскрывающемся списке From table (Из таблицы), в котором перечислены все “участвующие” в запросе таблицы, выбираем необходимую — в данном случае это таблица names.

При этом в списке Fields (Поля) будут отображены поля указанной таблицы. Для того чтобы перенести их в поле Expression (Выражение), где собственно и происходит построение выражения, необходимо дважды щелкнуть по выбранном» полю. Если в выражении участвуют какие-либо функции, то их можно писать как вручную, так и выбирать из раскрывающихся списков в областя Functions (Функции). После построения выражения его необходимо проверить, щелкнув по кнопке Verify, и сохранить, нажав кнопку ОК. Сохранив полученное выражение, его можно добавить в список Selected fields конструктора запросов.

Построим еще одно выражение — объединим в одном поле фамилию, имя и отчество клиента.

Теперь обратимся к вкладке Filter, на которой и определим условия фильтра.

В данном случае мы установили значение логического оператора (Logical) как AND (Логическое И). Смысл показанного на рисунке выражения можно объяснить так: показать записи, для которых результат первого выражения будет больше 36 500, и те записи, для которых значение второго выражения совпадет с условием фильтра.

А что будет, если мы изменим значение логического оператора, и вместо AND поставим OR? Давай посмотрим.

Здесь видно, что в результат запроса попали как клиенты, прибывшие из России, так и те люди, что проживают в других странах. Более того, мы видим записи, как удовлетворяющие первому условию (сумма больше 36 500), так и записи, не “прошедшие” проверку. Почему так произошло? А все дело в том, что при добавлении оператора OR В набор условий происходит разделение выражения на две части: до OR И после. Они выполняются независимо друг от друга, и что самое интересное, оба работают правильно. Посмотри повнимательней — результатом работы первого выражения являются все записи с суммами больше указанной. Верно? Верно.

Ты спросишь, а почему попали “иностранцы”? А где в первом условии упоминание о стране? Там ведь речь идет только о суммах, вот наш дядюшка Лис их аккуратно и выбрал. Но опять же, есть запись с меньшей суммой. А это уже результат paботы второго условия. Страну “заказывали”? Заказывали. Есть записи с этой страной? Есть. Вот и ладненько. Примерно так рассуждает наш изворотливый Лис, и он прав, потому что для него главное синтаксис критериев, а смысл этих критериев ему безразличен. За смыслом выражений должны следить, естественно, мы с тобой. Вот еще один наглядный пример, на этот раз с использованием логического оператора AND.

Установка значения AND

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

Ну и как тебе работа с конструктором запросов? Возможности действительно впечатляют. Помнишь, как мы вычисляли сумму счета для выбывших клиентов? Писали программный код, использовали SCAN, REPLACE И другие команды… А здесь мы обошлись без каких-либо вычислений и легко получили желаемый результат. Но на этом возможности конструктора запросов не ограничиваются.

Вывод результатов запроса

То, в каком виде результаты запроса предстанут перед пользователем, можно определить, воспользовавшись диалоговым окном Query Destination (Назначение запроса).

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

Диалоговое окно Query Destination

  • BROWSE (Окно просмотра Browse) – Результат выводятся в режиме BROWSE
  • CURSOR (Временная таблица) – Результат помещается во временную таблицу
  • TABLE (Таблица) – Результат помещается в постоянную таблицу
  • GRAPH (График) – Результат используется для построения графика
  • SCREEN (Экран) – Результат выводится на экран
  • REPORT (Отчет) – Результат представляется в виде отчета
  • LABEL (Этикетка) – Результат представляется в виде этикетки

Курсор
Курсор — это не только указатель мыши. В Visual FoxPro курсором называется временная таблица, которая будет создана для хранения результатов запроса. Данные в курсоре можно только просматривать, нельзя их ни Добавлять, ни модифицировать, ни удалять. Курсор “живет” только в текущем сеансе, при завершении работы Visual FoxPro он будет удален. Знаешь, почему он так интересно называется? Да потому, что его название как нельзя точно определяет его суть — CURSOR (Current Set Of Records, текущий набор записей).

Таблица
Результаты запроса записываются в новую таблицу. Это обычная таблица, записи которой можно удалять, добавлять, модифицировать. В отличие от своего временного собрата курсора таблица остается на диске и после завершения сеанса работы Visual FoxPro.

График
Результаты запроса можно отобразить в графическом виде. Для построения графиков у Лиса имеется свой “чертежник” — Graph Wizard (Мастер графиков). Чтобы наглядно проследить за его работой, давай запустим на выполнение наш запрос, предварительно установив опцию Graph в диалоговом окне Query Destination.

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

На следующем шаге будет предложено выбрать стиль диаграммы. И наконец, последний шаг, на котором предлагается задать заголовок для будущего графика (Type a title for your graph), выбрать режим отображения нулевых значений (Show null values) и легенды (Add a legend to the graph). Воспользовавшись кнопкой предварительного просмотра Preview, мы можем посмотреть на результат работы мастера.

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

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100