- •Министерство образования российской федерации
- •Выборка данных в конструкторе запросов Visual FoxPro
- •Курский государственный технический университет.
- •1. Цель работы
- •2. Окно конструктора запросов
- •3. Определение полей результирующей таблицы
- •3.1. Выбор полей исходной таблицы
- •3.2. Использование в запросах вычисляемых полей
- •4. Построение условий для выбора записей
- •5. Упорядочение данных в запросе
- •6. Группировка полей запроса
- •7. Включение в запрос выражений и функций полей и итоговых значений
- •8. Вывод результатов запроса
- •9. Общие сведения о команде select
- •10. Формирование гибких запросов
- •10.1. Выборка по текстовому значению
- •10.6. Запросы с выбираемыми критериями
- •П усть в таблицу PatientTab занесены следующие данные (рис. 14).
- •11. Порядок выполнения работы
- •12. Контрольные задания
- •13. Контрольные вопросы
10.6. Запросы с выбираемыми критериями
Пусть из таблицы Patienttab требуется выбрать служащих, удовлетворяющих слудующим условиям:
фамилия начинается с определенных символов;
они имеют определенную группу риска;
Дата рождения, начиная с определенного числа.
При этом может быть выбрано одно, два или три условия для формирования запроса.
Для формирования данного запроса создадим форму, представленную на рис. 13.
Р
ис.
13. Форма для формирования
запроса
Выбор условий формирования запроса определяется тремя переключателями Check1, Check2, Check3. В компонент Text1 вводятся начальные символы фамилии. Из выпадающего списка Combo1 выбирается профессия служащих, для этого в свойстве RowSourceType выбрано значение 1-Value, а свойству RowSource присвоено значение тюард,пи- лот,борттехник. Компонент Text2 предназначен для ввода даты поступления на работу. Текст запроса записан в методе Click кнопки Выбрать:
public fz,risk,dat && объявление переменных
if ThisForm.Check1.Value=1 && прверка выбора первого условия
fz=RTRIM(ThisForm.Text1.Text) && значение нач. букв фамилии если первое условие выбрано
else fz='' '' && если первое условие не выбрано (начало фамилии с любого символа)
endif
if ThisForm.Check2.Value=1 && прверка выбора второго условия
risk=RTRIM(ThisForm.Combo1.Text) && выбранная профессия если второе условие выбрано
else
risk='' '' && если второе условие не выбрано (любая профессия)
endif
if ThisForm.Check3.Value=1 && прверка выбора третьего условия
dat=ctod(RTRIM(ThisForm.Text2.Text)) && дата поступления на работу если третье условие выбрано
else
dat={^1800-01-01} &&если третье условие не выбрано (дата, заведомо меньшая любой даты из таблицы)
endif
SELECT patienttab.surnpt, patienttab.namept, patienttab.patrpt, patienttab.datar, patienttab.grouprisk;
From RegistryBD!patienttab;
WHERE patienttab.surnpt LIKE fz+"%" AND patienttab.grouprisk=risk and patienttab.datar between dat and date();
order by surnpt;
П усть в таблицу PatientTab занесены следующие данные (рис. 14).
Рис. 14. Содержание таблицы PatientTab
Пусть требуется выбрать всех инвалидов, родившихся с 1 января 1950 года и чья фамилия начинается на букву Г (рис. 15).
Р
ис.
15. Выбор условий для
запроса
Тогда результат работы будет иметь следующий вид (рис. 16):
Рис.
16. Результат выбора
Можно выводить результат запроса непосредственно на форму, используя объект Grid. Для этого необходимо добавить объект Grid, его свойству RecordSousceType присвоить значение 0 (Table). Результат выполнения запроса будет записываться в итоговую таблицу Rez, которая будет выводиться в Grid, при этом в текст программы необходимо внести следующие изменения (подчеркнутые строки):
public fz,risk,dat && объявление переменных
if ThisForm.Check1.Value=1 && прверка выбора первого условия
fz=RTRIM(ThisForm.Text1.Text) && значение нач. букв фамилии если первое условие выбрано
else fz='' '' && если первое условие не выбрано (начало фамилии с любого символа)
endif
if ThisForm.Check2.Value=1 && прверка выбора второго условия
risk=RTRIM(ThisForm.Combo1.Text) && выбранная профессия если второе условие выбрано
else
risk='' '' && если второе условие не выбрано (любая профессия)
endif
if ThisForm.Check3.Value=1 && прверка выбора третьего условия
dat=ctod(RTRIM(ThisForm.Text2.Text)) && дата поступления на работу если третье условие выбрано
else
dat={^1800-01-01} &&если третье условие не выбрано (дата, заведомо меньшая любой даты из таблицы)
endif
SELECT patienttab.surnpt, patienttab.namept, patienttab.patrpt, patienttab.datar, patienttab.grouprisk;
From RegistryBD!patienttab;
WHERE patienttab.surnpt LIKE fz+"%" AND patienttab.grouprisk=risk and patienttab.datar between dat and date();
order by surnpt;
into table Rez && запись результата в итоговую таблицу Rez
ThisForm.Grid1.RecordSource="Rez.dbf" && вывод итоговой таблицы Rez в объекте Grid
Т
огда
результат выполнения приведенного выше
примера будет выведен в объекте Grid (рис.
17).
Рис. 17. Модифицированная форма
