Visual FoxPro   Обзор графических пакетов 3GL   Компьютерная графика к экономической информатике   к 4GL - визуальному программированию

Программирование в VisualFoxPro 7.0

Запросы к базе данных

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

Например, вам необходимо выбрать из таблиц информацию о клиентах, проживающих в Москве и Московской области, или сформировать список клиентов, купивших в последний месяц товаров на сумму свыше 5000 рублей, и упорядочить их в алфавитном порядке по полю, содержащему фамилии клиентов. Для решения таких задач предназначен конструктор запросов и команда SELECT языка Visual FoxPro.

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

gl9-1.jpg

Рис. 9.1. Ввод условия выборки в мастере запросов

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

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

  Конструктор запросов

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

  1. На вкладке Data (Данные) конструктора проекта выберите группу Queries (Запросы).
  2. Нажмите кнопку New (Новый).
  3. В открывшемся диалоговом окне New Query (Новый запрос) нажмите кнопку New Query (Новый запрос). Открывается диалоговое окно выбора таблиц Add Table or View (Добавить таблицу или представление данных).
  4. В этом диалоговом окне выберите таблицы, данные из которых хотите использовать в запросе, и с помощью кнопки Add (Добавить) перенесите их в окно конструктора запросов.
  5. Завершив выбор таблиц, нажмите кнопку Close (Закрыть).

На экране появляется окно конструктора запросов (рис. 9.2), которое содержит названия выбранных таблиц, а в основном меню появляется пункт Query (Запрос). Можно приступать к формированию условий запроса.

Совет

Для открытия ранее созданного запроса в окне конструктора запросов на вкладке Data (Данные) окна проекта в группе Queries (Запросы) найдите модифицируемый запрос, установите на него курсор и нажмите кнопку Modify (Модифицировать).

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

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

gl9-2.jpg

Рис. 9.2. Окно конструктора запросов с выбранной таблицей клиентов

Таблица 9.1. Назначение вкладок окна конструктора запросов

Вкладка Назначение
Fields (Поля) Позволяет указать поля исходных таблиц, выбираемые в результирующий запрос
Join (Объединение) Позволяет задать условия объединения таблиц
Filter (Фильтр) Позволяет определить фильтры, накладываемые для выбора записей
Order By (Упорядочение) Позволяет задать критерии упорядочения данных
Group By (Группировка) Позволяет задать условия группировки данных
Miscellaneous (Разное) Позволяет задать дополнительные условия, такие как признак выборки повторяющихся значений, количество или процент выбора данных

  Команды, используемые при формировании запросов

Для работы в окне конструктора запроса можно использовать команды меню Query и панель инструментов Query Designer (Конструктор запроса). Назначение команд и кнопок на панели инструментов описано в табл. 9.2.

Таблица 9.2. Назначение команд меню Query и кнопок панели инструментов Query Designer

Команда меню Кнопка Назначение
Add Table (Добавить таблицу)   Добавляет в запрос новую таблицу
Remove Table (Удалить таблицу)   Удаляет выбранную таблицу из запроса
Remove Join Condition (Удалить условие объединения) Удаляет условие объединения таблиц
Output Fields (Результирующие поля) Открывает вкладку Fields для выбора полей результирующей таблицы
Join (Объединение)   Открывает вкладку Join для задания условия объединения таблиц
Filter (Фильтр) Открывает вкладку Filter для задания фильтра
Order By (Упорядочение) Открывает вкладку Order By для определения критерия упорядочения
Group By (Группировка) Открывает вкладку Group By для определения условия группировки данных
Miscellaneous (Разное) Открывает вкладку Miscellaneous для задания дополнительных параметров запроса
Query Destination (Результат запроса)   Открывает диалоговое окно Query Destination, в котором указывается, куда выводить результат запроса
View SQL (Показать SQL)   Открывает диалоговое окно, в котором отображается SQL-оператор, соответствующий созданному запросу
Maximize the table view (Максимизировать панель отображения)

Раскрывает панель отображения используемых в запросе таблиц на весь экран. Повторное нажатие на эту кнопку возвращает панели первоначальный размер
Add Join (Добавить условие объединения)   Открывает диалоговое окно Join Condition для задания условия объединения таблиц
Comments (Комментарии)   Открывает диалоговое окно, в котором вы можете ввести краткое описание создаваемого запроса
Run Query (Выполнить запрос) Запускает запрос на выполнение

Совет

Для просмотра конструкции SELECT, соответствующей выборке, предназначены команда View SQL и кнопка Show the SQL window панели инструментов. Сформировав запрос, вы можете скопировать конструкцию SELECT во временный буфер Windows и использовать ее при написании программ.

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

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

Для сохранения условий выборки в меню File (Файл) выберите команду Save as (Сохранить как). В открывшемся диалоговом окне Save As (Сохранить как) откройте папку, в которой хотите сохранить файл, введите в поле ввода имя файла и нажмите кнопку Сохранить.

В окне проекта запросы размещаются в разделе Queries (Запросы) вкладки Data (Данные). Для открытия запроса необходимо установить на него курсор и нажать кнопку Modify (Модифицировать) окна проекта.

  Запуск запроса на выполнение

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

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

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

  Формирование списка полей результирующей таблицы запроса

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

gl9-3.jpg

Рис. 9.3. Вкладка Fields предназначена для выбора полей запроса

Вкладка Fields (Поля) содержит два списка: Available fields (Имеющиеся поля) и Selected fields (Выбранные поля). Список Available fields (Имеющиеся поля) содержит все поля размещенных в окне конструктора таблиц. Selected fields (Выбранные поля) отображает поля формируемого запроса.

Перенести поля из списка Available fields (Имеющиеся поля) в Selected fields (Выбранные поля) вы можете одним из следующих способов.

Совет

Как и при работе с объектами в Windows, для выделения группы полей вы можете использовать мышь совместно с клавишами <Shift> и <Ctrl>. Сначала выделите первое из выбираемых полей и нажмите клавишу <Shift> или <Ctrl> в зависимости от того, расположены выбираемые поля рядом или вразброс. Затем, не отпуская клавишу, щелкните мышью по крайнему полю из группы подряд выбираемых полей или по каждому из отдельно расположенных полей.

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

  Вычисляемые поля запроса

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

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

Для формирования выражения предназначено поле Functions and expressions (Функции и выражения) вкладки Fields (Поля). Нажмите расположенную справа от поля кнопку вызова построителя выражения и в диалоговом окне Expression Builder (Построитель выражения) создайте выражение для вычисляемого поля. После того как выражение в поле Functions and expressions (Функции и выражения) сформировано, нажатием кнопки Add (Добавить) перенесите его в список Selected fields (Выбранные поля).

Замечание

В окне Expression Builder (Построитель выражения) при создании выражения вы можете использовать поля исходных таблиц, константы, функции. Используя круглые скобки, вы можете изменить порядок вычисления или сгруппировать данные.

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

  1. Откройте окно запроса для таблицы customer.
  2. На вкладке Fields (Поля) перенесите в список Selected fields (Выбранные поля) поле ccompany, содержащее наименование предприятия.
  3. Для объединения города и адреса клиента нажмите кнопку вызова построителя выражения поля Functions and expressions (Функции и выражения) и в диалоговом окне Expression Builder (Построитель выражений) создайте следующее выражение:

    ALL/TRIM (Ccity) + ", " +ALLTRIM(Caddress)

     

  4. Закройте окно построителя выражения, нажав кнопку ОК.
  5. Для размещения созданного выражения в списке Selected fields (Выбранные поля) нажмите кнопку Add (Добавить).
  6. На этом формирование запроса завершено (рис. 9.4). Нажмите кнопку Run (Выполнить) на стандартной панели инструментов, и на экране появится результирующая таблица (рис. 9.5).
gl9-4.jpg

Рис. 9.4. Определение вычисляемого поля

gl9-5.jpg

Рис. 9.5. Результат выборки

  Вкладка Order By конструктора запросов

Вкладка Order By (Упорядочение) конструктора запросов (рис. 9.6) позволяет указать критерий упорядочения данных в результирующей таблице, используя одно или несколько полей исходной таблицы, перенесенных из списка Selected fields (Выбранные поля) в список Ordering criteria (Критерии упорядочения). Для каждого поля в списке Ordering criteria (Критерии упорядочения) вы можете указать критерий упорядочения, используя следующие опции переключателя Order options (Опции упорядочения):

В списке Ordering criteria (Критерии упорядочения) с левой стороны поля, для которого установлена опция Ascending (По возрастанию), расположена направленная вверх стрелка. Для обозначения упорядочения по убыванию используется стрелка, направленная вниз.

gl9-6.jpg

Рис. 9.6. Вкладка Order By конструктора позволяет сформировать условия упорядочения данных в запросе

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

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

  1. Откройте окно конструктора запросов.
  2. В открывшемся диалоговом окне Add Table or View (Добавить таблицу или представление) выберите таблицу customer.
  3. На вкладке Fields (Поля) перенесите в список Selected fields (Выбранные поля) поля Ccompany и Ccity.
  4. Откройте вкладку Order By (Упорядочение).
  5. Дважды щелкнув на поле Ccity, перенесите его в список Ordering criteria (Критерии упорядочения). По умолчанию для него установлена опция Ascending, т. е. данные будут упорядочены в алфавитном порядке по возрастанию.
  6. Нажмите кнопку Run (Выполнить) на стандартной панели инструментов и просмотрите результаты выполненного запроса (рис. 9.7).
gl9-7.jpg

Рис. 9.7. Результаты выборки запроса

  Упорядочение по нескольким полям

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

  1. На вкладке Fields (Поля) добавьте в список Selected fields (Выбранные поля) Поле YcreditLimit.
  2. В окне конструктора запросов перейдите на вкладку Order By (Упорядочение). В списке Ordering criteria (Критерии упорядочения) находится поле ccity, по значению которого были упорядочены данные в предыдущем запросе.
  3. Выделите поле YcreditLimit и дважды щелкните по нему мышью. Поле будет перенесено в список Ordering criteria (Критерии упорядочения).
  4. Установите для данного поля опцию Descending (По убыванию). Обратите внимание, как выглядит теперь окно конструктора запросов (рис. 9.8).
gl9-8.jpg

Рис. 9.8. Использование для упорядочения двух полей

В списке Ordering criteria (Критерии упорядочения) рядом с полем ccity расположена стрелка, направленная вверх, а рядом с полем YcreditLimit — стрелка, направленная вниз. Направленная вверх стрелка означает, что данные отображаются в порядке возрастания, а направленная вниз — что данные расположены в порядке убывания.

  Задание условий для выбора записей

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

Для формирования условий выбора определенных записей предназначена вкладка Filter (Фильтр) конструктора запросов.

  Задание условия точного совпадения значений одного поля

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

В этом примере выберем данные о клиентах из Москвы.

  1. Откройте окно конструктора запросов.
  2. Поместите в него таблицу customer.
  3. На вкладке Fields (Поля) перенесите в список Selected fields (Выбранные поля) наименование предприятия.
  4. Перейдите на вкладку Filter (Фильтр) конструктора запросов.
  5. В столбце Field Name (Имя поля) нажмите кнопку раскрытия списка и из всех полей исходной таблицы выберите ccity.
  6. В списке Criteria (Критерии) выберите значение ==.
  7. В поле Example (Образец) введите Москва (рис. 9.9).
  8. Для выполнения запроса нажмите кнопку Run (Выполнить). На экране появится результирующая таблица, которая содержит записи о клиентах, чьи фирмы расположены в Москве.
gl9-9.jpg

Рис. 9.9. Задание условия точного совпадения значения одного поля

Замечание

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

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

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

В данном примере выберем из таблицы customer все записи, за исключением записей со значением Казахстан в поле ccountry.

  1. Откройте запрос, созданный в предыдущем примере.
  2. Перейдите на вкладку Filter (Фильтр).
  3. В столбце Field Name (Имя поля) выберите из раскрывающегося списка поле Ccountry.
  4. Щелкните мышью в поле Not (He), установив тем самым флажок.
  5. В списке вариантов сравнения Criteria (Критерий) выберите значение ==,
  6. В текстовом поле столбца Example (Образец) введите Казахстан (рис. 9.10).
  7. Для выполнения запроса нажмите кнопку Run (Выполнить). На экране появится результирующая таблица, которая содержит записи о клиентах, проживающих вне Казахстана.
gl9-10.jpg

Рис. 9.10. Задание условия для выбора полей, не удовлетворяющих определенному критерию

  Выбор похожих значений

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

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

  1. Откройте окно конструктора запросов.
  2. Поместите в него таблицу Customer.
  3. На вкладке Fields (Поля) выделите курсором поля, которые хотите отобразить в запросе, и с помощью кнопки Add (Добавить) перенесите их в список Selected fields (Выбранные поля).
  4. Для задания условия на вкладке Filter (Фильтр) выберите поле с last name.
  5. В списке вариантов сравнения выберите значение =.
  6. В поле столбца Example (Образец) введите Ник (рис. 9.11). В результате выполнения запроса Visual FoxPro отобразит в результирующей таблице записи о фирмах, имеющих представителей с фамилиями Никифоров и Николаев.
gl9-11.jpg

Рис. 9.11. Задание условия неточного совпадения

  Выбор записей, находящихся в заданном диапазоне значений

Для выбора записей, лежащих в заданном диапазоне значений, используются операторы > (Больше), < (Меньше) и Between (Между) из списка Criteria (Критерий) вкладки Filter (Фильтр). Операторы > (Больше) и < (Меньше) используются в том случае, если задана только нижняя или верхняя граница диапазона, a Between (Между) — когда известны обе границы. Предположим, что вам потребовался список заказов, итоговая сумма которых превышает 10 000 рублей. В другом случае вам нужно получить сведения о клиентах, воспользовавшихся услугами вашей фирмы в определенный интервал времени. В обоих случаях необходимо выбрать из таблицы записи, попадающие в диапазон значений.

Создадим запрос, формирующий список заказов, итоговая сумма которых превышает 10 000 рублей.

  1. Откройте новое окно конструктора запросов.
  2. Добавьте в него таблицу ordsaiem.
  3. В списке Selected fields (Выбранные поля) вкладки Fields (Поля) разместите поля с номером заказа, датой и итоговой суммой по заказу.
  4. Для задания условия отбора на вкладке Filter (Фильтр) выберите поле nsumdoc.
  5. В списке Criteria (Критерий) выберите оператор >.
  6. В текстовом поле столбца Example (Пример) введите 10 000.
  7. Нажмите кнопку Run (Выполнить) на стандартной панели инструментов.

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

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

  1. Откройте запрос, созданный в предыдущем примере.
  2. На вкладке Filter (Фильтр) из списка Field Name (Имя поля) выберите поле ddoc, содержащее дату заказа.
  3. В списке Criteria (Критерий) выберите значение Between (Между).
  4. В поле Example (Образец) введите начальную и конечную даты интервала (рис. 9.12) в следующем виде:

    CTOD("01.11.2001") , CTOD("15.11.2001")

gl9-12.jpg

Рис. 9.12. Выбор записей по диапазону значений поля дат

  1. Нажмите кнопку Run (Выполнить) на стандартной панели инструментов.

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

Замечание

При задании условий для выбора записей по диапазону значений можно использовать не только числовые поля, но и текстовые. В этом случае при выполнении запроса Visual FoxPro сравнивает коды символьных величин. Например, условие выбора "Л, М", помещенное в поле Example (Образец) для поля Ccompany, позволит выбрать из таблицы Customer список предприятий, названия которых начинаются на буквы Л и М.

  Формирование списка условий

Visual FoxPro позволяет при создании запросов формировать несколько условий. В том случае, если все задаваемые условия накладываются на одно поле, их можно разместить в одной строке. В противном случае условия размещаются в разных строках вкладки Filter (Фильтр). Рассмотрим следующий пример. Выберем всех покупателей из Москвы, Новгорода и Киева.

  1. Откройте окно конструктора запросов.
  2. Поместите в него таблицу customer.
  3. На вкладке Fields (Поля) разместите в списке Selected fields (Выбранные поля) требуемые поля.
  4. Откройте вкладку Filter (Фильтр).
  5. Из списка Field Name (Имя поля), содержащего все поля таблицы Customer, выберите поле Ccity.
  6. В списке Criteria (Критерии) выберите значение In (В).
  7. В поле столбца Example (Пример) через запятую задайте названия городов, покупатели которых вас интересуют (рис. 9.13).
  8. Для просмотра результатов выборки нажмите кнопку Run (Выполнить) на стандартной панели инструментов.
gl9-13.jpg

Рис. 9.13. Окно запроса со списком условий отбора

  Многотабличные запросы

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

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

gl9-14.jpg

Рис. 9.14. Вкладка Join содержит условия объединения таблиц

Если таблица, добавляемая в конструктор запросов, не имеет установленных в базе данных связей с уже размещенными в конструкторе таблицами, на экране открывается диалоговое окно Join Condition (Условие объединения) (рис. 9.15), в котором необходимо задать условие объединения двух таблиц.

В верхней части диалогового окна Join Condition (Условие объединения) размещены два раскрывающихся списка, содержащие поля, которые можно использовать для объединения таблиц. Ниже расположен переключатель Type of join (Тип объединения), содержащий опции, определяющие тип создаваемой между таблицами связи. Назначение опций описано в табл. 9.3.

gl9-15.jpg

Рис. 9.15. Определение условия объединения таблиц в диалоговом окне Join Condition

Таблица 9.3. Назначение опций диалогового окна Join Condition

Опция Тип создаваемой связи
Inner join

(Внутреннее объединение)

Создает объединение, в котором выбираются только те записи, которые содержат совпадающие значения в полях связи
Left join

(Объединение слева)

Создает объединение, в котором выбираются все записи из левой таблицы, а также записи из правой таблицы, значения поля связи которого совпадают со значениями поля связи левой таблицы
Right join

(Объединение справа)

Создает объединение, в котором выбираются все записи из правой таблицы, а также записи из левой таблицы, значения поля связи которого совпадают со значениями поля связи правой таблицы
Full join (Полное объединение) Создает объединение, в котором выбираются все записи из правой и левой таблиц

Замечание

По умолчанию Visual FoxPro при объединении таблиц использует опцию Inner join (Внутреннее объединение), при которой из таблиц выбираются только те записи, которые содержат совпадающие значения в полях связи.

Замечание

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

Установленные между таблицами условия объединения можно изменять. Для этого выполните следующие действия:

  1. Дважды щелкните мышью на линии, связывающей таблицы, или на вкладке Join (Объединение) нажмите кнопку с двунаправленной стрелкой с левой стороны поля Туре (Тип).
  2. В открывшемся диалоговом окне Join Condition (Условие объединения), отображающем текущее условие объединения таблиц, измените требуемые параметры.
  3. Нажмите кнопку ОК.

Совет

Для установления связи между таблицами в конструкторе запросов, как и в базе данных, можно использовать механизм "перенести-и-оставить". Выберите поле одной из таблиц, нажмите кнопку мыши и удерживая ее нажатой, перенесите поле на связываемое поле в другой таблице. После этого откройте диалоговое окно Join Condition (Условие объединения) и отредактируйте установленное условие объединения таблиц.

  Выборка из четырех таблиц

Рассмотрим пример выборки товаров, приобретенных клиентами. Для решения ЭТОЙ задачи нам потребуются таблицы Customer, Ordsalem, Ordsaled и Goods. Таблица customer содержит информацию о клиентах, таблица Ordsalem — сведения о заказе на товары, таблица Ordsaled — сведения о товарах, входящих в заказ (количество купленных товаров и цена товара), а таблица Goods — наименования всех товаров. При создании базы данных между этими таблицами уже были определены постоянные отношения.

  1. Откройте новое окно конструктора запросов.
  2. Добавьте в конструктор запросов таблицы Customer, Ordsalem, Ordsaled и Goods. Между этими таблицами в базе данных установлены постоянные отношения. После их перенесения в запрос в окне конструктора запросов отобразятся установленные между таблицами связи, а на вкладку Join (Объединение) добавятся три строки с условиями объединения таблиц (рис. 9.16).
  3. В список Selected fields (Выбранные поля) вкладки Fields (Поля) перенесите фамилию клиента, номер заказа, наименование товара и количество заказанного им товара.
  4. Нажмите кнопку Run (Выполнить), и на экране появится результирующая таблица (рис. 9.17), содержащая информацию о заказах всех клиентов.
gl9-16.jpg

Рис. 9.16. Вкладка Join окна запроса для выборки из четырех таблиц

gl9-17.jpg

Рис. 9.17. Результаты запроса для выборки из четырех таблиц

  Группировка полей запроса

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

Для группировки записей в запросе предназначена вкладка Group By (Группировка) (рис. 9.18), содержащая список Grouped fields (Поля группировки) с полями, по которым осуществляется группировка данных.

gl9-18.jpg

Рис. 9.18. Вкладка Group By окна конструктора запросов

  Использование в запросе выражений и функций полей

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

Кроме того, Visual FoxPro позволяет выполнять итоговые операции над вычисляемыми в запросе полями. Например, в запросе, выбирающем данные из таблиц ordsaiem и Ordsaied, вы можете вычислить итоговую стоимость продажи каждого товара за интересующий вас интервал времени.

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

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

Функция Результат вычисления
COUNT ( ) Количество строк в итоговой таблице
МАХ() Наибольшее значение в столбце
MIN() Наименьшее значение в столбце
AVG() Среднее значение столбца численных данных
SUM() Сумма численных данных столбца

Для формирования в запросе выражения предназначено поле Functions and expressions (Функции и выражения) вкладки Fields (Поля) и расположенная справа от него кнопка открытия построителя выражения. Нажмите данную кнопку. Откроется диалоговое окно Expression Builder (Построитель выражения) (рис. 9.19). В поле ввода Expression (Выражение) сформируйте итоговое значение, используя поля таблиц запроса, расположенные в списке Fields (Поля), и функции области Functions (Функции), сгруппированные по типам данных и представленные в виде четырех списков.

gl9-19.jpg

Рис. 9.19. Диалоговое окно Expression Builder позволяет включить в запрос функцию или выражение

При нажатии кнопки Options (Опции) открывается диалоговое окно Expression Builder Options (Опции построителя выражения) (рис. 9.20). Используя параметры этого окна, можно настроить список наиболее часто используемых в запросе функций, отображаемых в области Functions (Функции) диалогового окна Expression Builder (Построитель выражения).

gl9-20.jpg

Рис. 9.20. Диалоговое окно Expression Builder Options

Чтобы настроить список функций, выполните следующие действия:

  1. В диалоговом окне Expression Builder Options (Опции построителя выражений) установите опцию типа настраиваемой функции.
  2. Нажмите кнопку Clear (Очистить) для очистки списка функций.
  3. Используя клавишу <Shift>, если выбираемые функции расположены подряд в списке, или клавишу <Ctrl>, выберите необходимые функции.
  4. Нажмите кнопку ОК.

В нижней части диалогового окна Expression Builder Options (Опции построителя выражений) находится группа переключателей Field aliases (Псевдонимы поля), содержащая опции, описанные в табл. 9.5.

Таблица 9.5. Назначение группы переключателей Field aliases диалогового окна Expression Builder Options

Переключатель Назначение
Always add alias (Всегда добавлять псевдоним) Указывает, что имя таблицы или представления данных всегда включается в имя поля
Add non-selected alias only (Добавлять только невыбранные псевдонимы) Если открыто более одной таблицы или представления данных, Visual FoxPro включает имя таблицы или представления данных только в том случае, если они не содержатся в списке псевдонимов в окне Data Session (Сеанс данных)
Never add alias (He добавлять псевдоним) Указывает, что имя таблицы или представления данных никогда не включается в имя поля

Флажок Show system memory variables (Показывать системные переменные) указывает, будут ли отображаться в окне построителя выражения системные переменные.

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

Таблица 9.6. Арифметические операторы, используемые при формировании выражений

Оператор Функция
+ Сложение
_ Вычитание
* Умножение
/ Деление

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

  Включение в запрос итоговых значений

В данном примере создадим запрос для таблиц Ordsalem и Ordsaled об итоговой сумме по каждому заказу.

  1. Откройте окно запроса для таблиц Ordsalem и Ordsaled.
  2. На вкладке Fields (Поля) перенесите в список Selected fields (Выбранные поля) поле cndoc, содержащее номер документа.
  3. Чтобы вычислить стоимость проданного товара по текущему заказу, воспользуйтесь функцией зим. Для этого нажмите кнопку открытия диалогового окна Expression Builder (Построитель выражения) поля Functions and expressions (Функции и выражения).
  4. В поле ввода Expression (Выражение) открывшегося диалогового окна введите выражение, по которому будет просуммирована стоимость каждого проданного товара и помещена в соответствующее поле результирующей таблицы:

    SUM (Ordsaled. nQuant * Ordsaled.nUnitPri.ee)

     

  5. Нажмите кнопку OK для закрытия диалогового окна Expression Builder (Построитель выражения).
  6. Для перемещения сформированного выражения в список Selected fields (Выбранные поля) нажмите кнопку Add (Добавить).
  7. Для группировки записей результирующей таблицы по полю icdorder откройте вкладку Group By (Группировка) и перенесите поле icdorder в список Grouped fields (Поля группировки).
  8. Сохраните запрос. Для выполнения запроса нажмите кнопку Run (Выполнить). На экране появится результирующая таблица, содержащая информацию об итоговой стоимости товаров по каждому заказу (рис. 9.21).
gl9-21.jpg

Рис. 9.21. Результат выборки

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

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

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

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

В предыдущем примере наименование итогового поля было определено Visual FoxPro по умолчанию. Результат запроса будет более читабельным, если вы измените наименования полей. Для этого выполните следующие действия:

  1. Откройте окно запроса, созданного в предыдущем примере.
  2. Добавьте в поле, содержащее номер заказа, ключевое слово AS и наименование поля заказ. OrdSalem.cnDoc AS заказ
  3. 3. Аналогичным образом добавьте в итоговое поле вычисления итоговой стоимости заказа ключевое слово AS и наименование поля стоимость.

    SUM(OrdSaled.nQuant * OrdSaled.nUnitPrice) AS Стоимость

     

  4. Сохраните запрос. Для выполнения запроса нажмите кнопку Run (Выполнить), в результате на экране появится результирующая таблица, содержащая новые наименования полей (рис. 9.22).
gl9-22.jpg

Рис. 9.22. Изменение наименования полей

Visual FoxPro   Обзор графических пакетов 3GL   Компьютерная графика к экономической информатике   к 4GL - визуальному программированию

Знаете ли Вы, что такое мысленный эксперимент, gedanken experiment?
Это несуществующая практика, потусторонний опыт, воображение того, чего нет на самом деле. Мысленные эксперименты подобны снам наяву. Они рождают чудовищ. В отличие от физического эксперимента, который является опытной проверкой гипотез, "мысленный эксперимент" фокуснически подменяет экспериментальную проверку желаемыми, не проверенными на практике выводами, манипулируя логикообразными построениями, реально нарушающими саму логику путем использования недоказанных посылок в качестве доказанных, то есть путем подмены. Таким образом, основной задачей заявителей "мысленных экспериментов" является обман слушателя или читателя путем замены настоящего физического эксперимента его "куклой" - фиктивными рассуждениями под честное слово без самой физической проверки.
Заполнение физики воображаемыми, "мысленными экспериментами" привело к возникновению абсурдной сюрреалистической, спутанно-запутанной картины мира. Настоящий исследователь должен отличать такие "фантики" от настоящих ценностей.

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

Это мы видим на примере СТО и ОТО, превратившихся в своеобразный вид религии, управляющей наукой и общественным мнением. Никакое количество фактов, противоречащих им, не может преодолеть формулу Эйнштейна: "Если факт не соответствует теории - измените факт" (В другом варианте " - Факт не соответствует теории? - Тем хуже для факта").

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

Эксперимент на то и эксперимент, что он есть не изощрение мысли, а проверка мысли. Непротиворечивая внутри себя мысль не может сама себя проверить. Это доказано Куртом Гёделем.

Понятие "мысленный эксперимент" придумано специально спекулянтами - релятивистами для шулерской подмены реальной проверки мысли на практике (эксперимента) своим "честным словом". Подробнее читайте в FAQ по эфирной физике.

НОВОСТИ ФОРУМА

Форум Рыцари теории эфира


Рыцари теории эфира
 10.11.2021 - 12:37: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
10.11.2021 - 12:36: СОВЕСТЬ - Conscience -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
10.11.2021 - 12:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от д.м.н. Александра Алексеевича Редько - Карим_Хайдаров.
10.11.2021 - 12:35: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ПРАВОСУДИЯ.НЕТ - Карим_Хайдаров.
10.11.2021 - 12:34: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вадима Глогера, США - Карим_Хайдаров.
10.11.2021 - 09:18: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> Волновая генетика Петра Гаряева, 5G-контроль и управление - Карим_Хайдаров.
10.11.2021 - 09:18: ЭКОЛОГИЯ - Ecology -> ЭКОЛОГИЯ ДЛЯ ВСЕХ - Карим_Хайдаров.
10.11.2021 - 09:16: ЭКОЛОГИЯ - Ecology -> ПРОБЛЕМЫ МЕДИЦИНЫ - Карим_Хайдаров.
10.11.2021 - 09:15: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Екатерины Коваленко - Карим_Хайдаров.
10.11.2021 - 09:13: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вильгельма Варкентина - Карим_Хайдаров.
Bourabai Research - Технологии XXI века Bourabai Research Institution