
- •В. П. Агальцов
- •Москва «мир» 2002
- •Примеры
- •Примеры
- •Контрольные вопросы
- •Глава 1
- •Третий этап проектирования базы данных: задание первичных и альтернативных ключей
- •Глава 2
- •2 8.2. Освобождение таблицы
- •Index — закрывает все индексные файлы в текущей рабочей об- асги, за исключением структурного мультииндексного файла.
- •Контрольные вопросы
- •Глава 3
- •Удаление тега из мультииндексного файла
- •Вывод на экран имен индексных файлов и имен тегов
- •Примеры
- •If !empty(tag(nCount)) && Проверка наличия тегоз
- •Контрольные вопросы
- •Как удалить тег из мультииндексного файла?
- •Укажите команды для вывода на экран имен индексных файлов и имен индексов (тегов) внутри индексного файла.
- •Глава 4
- •Часто употребляемые опции команд foxpro
- •Сортировка данных
- •4.1. Поиск данных с помощью Главного меню.
- •Фильтрация данных
- •4.5. Примеры
- •4.6. Контрольные вопросы
- •Глава 5
- •Понятие рабочей области
- •Организация взаимосвязи «один-к-одному»
- •Установление взаимосвязи «один-ко-многим»
- •Установление взаимосвязей с помощью главного меню
- •Объединение двух табличных файлов в один файл
- •Корректировка данных в связанных таблицах
- •Создание итогового табличного файла
- •Примеры
- •Контрольные вопросы
- •Глава 6
- •Создание программного файла
- •Запуск программного файла
- •Ignore — продолжить выполнение программы.
- •Модульность программ
- •Область действия переменных
- •Простейшие вычисления
- •Примеры
- •Контрольные вопросы
- •Присвоение значений
- •Команды для работы с переменными
- •Команды для работы с массивами
- •Команды ввода-вывода
- •Функции для работы с массивами
- •Команды циклов
- •Команды ветвления алгоритма
- •Команда ветвления алгоритма на много направлений
- •Примеры
- •9 15, 2 && Задает место на экране
- •Контрольные вопросы
- •Команда создания и отображения меню на экране
- •Команда фиксации выбора пользователя
- •Примеры
- •0 12.32 Prompt 'Выход' message 'Завершение программы' menu то peri
- •ScSc Вывод в специальное окно системного сообщения
- •Контрольные вопросы
- •Какими командами клавишного меню фиксируются ошибки работы программы?
- •Что такое стек? Как сохраняются и как извлекаются клавишные команды из стека?
- •Укажите команды для обработки кодов нажатых клавиш.
- •Примеры
- •0 10.2 Say 'Тигры'
- •0 12.2 Say 'Котята'
- •13. Контрольные вопросы
- •Примеры
- •0 8,40 Say 'Волга'
- •If messagebox('Фамилия не найдена',;
- •If messagebox{'Имя не найдено',;
- •Контрольные вопросы
- •Глава 11
- •Примеры
- •Insert into Fam values(101, 'Байрон')
- •Контрольные вопросы
- •Вычисление абсолютного значения
- •If eof('Catalog') && Определение конца таблицы
- •Recall all ь& Со всех записей таблицы Author снять пометку к удалению
- •Определение конца файла
- •2000 Году: ' ;
- •Определение количества полей в открытой базе данных
- •Поиск значения поля по значению другого поля
- •&& Возвращает ega/Color
- •Определение общего объема оперативной памяти
- •7 ?Aykent(100000,0.1,2) && выводит на экран 56719.05
- •2 Кинуты.
- •Примеры
- •Контрольные вопросы
- •140010, Г , 1юберцы Московской обл.. Октябрьский пр-т. 403. Тс- 554-21-86
- •0 11,10 Prompt 'с начала'
- •1 Строки
Null — запрет пустого (нулевого) значения поля.
Когда все поля структуры описаны, надо сохранить созданную структуру таблицы (пустую) на диске нажатием кнопки Ок. При этом на экран выводится сообщение «Input data record now?» ( рис. 2.3).
Я
Index.
'tdth.
-OeomelHULL
0!
Fietkfc 8|le^h
Рис.
2.2.
Описание
структуры таблицы.
Table Designei
tj кеу_гаквг |
Numeric |
3 |
0 |
J key_cu$t |
Numeric |
3 |
0 |
key.setemn |
Numenc |
3 |
0 |
II кеу_Ьоок |
Numeric |
3 |
0 |
1 datejakez |
Dale |
8 |
|
1 1 vokme |
Numeric |
4 |
0 |
В РОС |
Numeric |
2 |
0 |
Heme
Гуре,,
E
SPRIMERVzakaaOBF
;/
Microsoft
Vi ual FosPro
Ри°‘2-3-
Приглашение к заполнению данными
созданной таблицы.
Е°ли наЖать кнопку No, то на диске, по указанному адресу, И1ет сохранена пустая структура таблицы. Если нажать кнопку - то на экран будет выведен пустой шаблон записи (рис. 2.4.) я занесения данных в созданной таблице.
ГИИ
iZakaz
>Ч_сш1 ■■ 1сз>_м1амп чву_Ьоок iale_zakaz/ / olume iPfOC
Tip^pplala
Рис. 2.4. Шаблон для заполнения записи данными.
Рис.
2.5. Задание типа создаваемой таблицы
Данные в шаблон заносятся по правилам текстовых редакторов. По окончании ввода всех данных (всех записей), их надо сохранить на диске с помощью одной из команд: Ctrl + End или Qfj + W. Если данные сохранять не надо, то нажимают комбинацию клавиш Ctrl + Q или клавишу Esc.
б. С помощью Главного меню.
Из Главного меню подать команду File -> New и в появившейся на экране диалоговой панели New (рис. 2.5) в радиогруппе File Туре выбрать кнопку Table, а затем нажать кнопку' New File.
Затем на экран выводится диалоговая панель Create, описанная выше. Описание структуры таблицы производится аналогично.
в. С помощью SQL-onepamopa.
Сокращенный формат SQL-оператора для создания таблицы имеет вид (подробнее см. главу 11):
CREATE TABLE <имя таблици> ( <кмя поля1> <тип поля1> (<размер поля^) (, <нмя 1шля1> <тнп иатя!> (<размер паля1>),...] )
ОТКРЫТИЕ ТАБЛИЦЫ
В FoxPro следует различать два понятия: открытие таблицы и предъявлени таблицы на экран. В каждый момент времени может быть открыто много таблиц (их количество определяется версией FoxPro). На экран предъявляется, как правило, одна таблица.
Открыть ранее созданную таблицу можно двумя способами: с помощью команд или с помощью главного меню.
а. С помощью команд.
В окне Command надо подать команду USE <нмя_таблицы>. Это краткий вариант команды открытия таблицы. При этом содержимое таблицы на экран не предъявляется. Для того чтобы определить, открыта таблица или нет, надо на экран вывести ста- ТУс-строку, в которой будет указано имя открытой таблицы. Ни- *с пРиведен полный формат команды USE с описанием назна- ения каждой опции. По мере изучения FoxPro будет ясен смысл назначение этих опций.
обозна^ И ДалСе ПРИ описании команд используются следующие
11 — если опция или параметр указаны в квадратных скобках, то они являются не обязательными.
| — ес.ш используется вертикальная черта, то надо сделать вы- бор опиии или параметра слева или справа от вертикаль, ной черты.
Полный формат команды:
USE Кичя табличного файла>] [IN <рабочая область>]
[AGAIN 1
[INDEX <сннсокимеинндексных_фаАлов>]
[ORDER [ <w.ip.N> | < I ОХ-файл> | TAG <нмя_тега>[ [OF <СОХ-фаил>] [ASCENDING | DESCENDING]
[ALLAS <псевдоннм>]
[NOUPDATE]
[EXCLUSIVE]
[SHARED]
Назначение опций:
IN — указывается номер рабочей области, в которой будет от крыта таблица. В Visual FoxPro допускается одновременное от крытис до 25 таблиц в разных рабочих областях. Рабочие области имеют порядковый номер от 1 до 25, но первые 10 рабочих областей дополнительно имеют однобуквенные имена от А до J.
AGAIN — разрешает повторное открытие таблицы в другой рабочей области, но только в режиме просмотра (Read Only).
TNDEX — открывает одновременно с таблицей один или несколько индексных файлов, принадлежащих данной таблице.j Причем первый индексный файл в списке считается главным (текущим), если другой файл не определен в опции ORDER. ORDER — переназначает главный (текущий) индексный файл,1 путем указания его номера (<Bbip.N>) в <списке_имен_индекс* ных_файлов>. При необходимости можно указать тип индексного файла (IDX или CDX), а также имя тега (TAG).
ASCENDING или DESCENDING — задает порядок чтения индекса, соответственно по возрастанию и по убыванию. NOUPDATE — в открываемой таблице запрещены любые изменения (устанавливается режим Read Only).
EXCLUSIVE — открываемая таблица предназначена для личного использования при работе в локальной сети.
SHARED — открываемая таблица предназначена для общего ис пользования при работе в локальной сети.
Если команда USE используется без опций, то она закрывает
рсс таблицы.
б. С помощью Главного меню.
Aulor
DBF
catalog
DBF »]checkDBF Custcmer.dbt 0 FacaDBF 3lm.DBF
fcwtfwo:
[~
!«•]
mmmDBF
wjOtDBF
5
salesmenDBF «*)
salmen.DBF
stieet dbf jjj]
town.DBF
ЯI
ableC.
dbf)
рЙ* Г Только
чтений
ж _ ’
—c
.
*
gxdustve
Рис.
2.6.
Задание
имени открываемой таблицы.
anne-.JtJ
"
w
1асто
при написании программных кодов надо
знать алиас ^нкретной таблицы. Функция
ALIAS0
возвращает
в символь- -м виде значение алиаса
указанной таблицы.
(<имя
рабочей областн> | <имя
таблнцы>]
ели
указанная рабочая область пуста, то
функция ALIAS
О
катает пустое значение.
50 Глава 2
РЕДАКТИРОВАНИЕ ТАБЛИЦЫ
Команда BROWSE выводит на экран окно BROWSE (рис. 2.7), куда помешает содержимое таблицы.
ГГЙ
V
la
Mi
i
1i 1
U№12,IOO
"АгиепадоГ
!д12Л
]Ц12201ШЛ
1
?
1
2l)
17X2X100 ,Вмч»»Г
л
ЗА 3334411
3334411 «Г!
t
4
Йг1»:А0
Тиоцлжс*
ft2*jpil
123789'
1237®» |:
f
1
i
,
1.
j
1
■
111-
Рис.
2.7. Окно BROWSE в режиме
просмотра Browse с данными
табли цы Customer.
:
Команда BROWSE имеет более тридцати необязательных on ций, которые уточняют действие команды. Команда BROWSE без опций открывает окно BROWSE и помещает в него содержи мое текущей таблицы.
Полный формат команды BROWSE:
BROWSE (FIELDS <список имен полсй>(
[FONT <вырС1> ,[<вырМ>] [STYLE <вырС2>Ц [FOR <BbipLl> [REST11 [FORMAT]
[FREEZE <имя поля>]
[KEY <выр1> [,<выр2>][
[LAST|NOINITJ [LEDIT] | [LOCK <BbipN2>[
ILPARTITION]
|NOAPPEND]
[NOCLLARl [NODELETE1 [NOFDITI NOMODI FV'J [NOFOLLOW]
[NOLGRID]
[NORGRID]
[NOLINK]
[NOMENU]
[NOOPTIMIZE]
[NORFFRESII]
[NORMAL]
[NOWAIT]
[PARTITION <BupN3>]
[PREFERENCE <вырСЗ>]
IREDIT]
[save]
[TIMEOUT <BupN4>]
[TITLE <вырС4>]
[VALID [:F] <buPL2>[ERROR <вырС5>]]
[VSTIEN <вырЫ>]
[WIDTH <BwpN5>]
[[WINDOW <имя «на 1>] [LN [WINDOW] <имя окна 2> | IN SCREEN ]] [COLOR [<спнсок nap цвегов>] | COLOR SCHEME <BwpN5>[
Назначение опций:
[FIELDS <список кмек полей>] — в списке перечисляются имена по- Лсй как Физических, так и виртуальных, которые будут отражены RRr?16 ®^OWSE. Виртуальные поля представляются в окне ROWSЕ только в режиме Read Only. Перечисление имен произ- Дится через запятую. После каждого имени поля, по желанию, ,!° Указать дополнительные параметры, управляющие предосеннем информации для данного поля.
:R —
| Устанавливает режим просмотра (редактировать нельзя). VbipN> — описывает ширину поля на экране.
:V <выр1> l:F] [:Е * <вырОЦ — обеспечивает помещение в поле достоверных данных. Если <выр1> истинно, то данные заносятся в поле. В противном случае — нет. В логическом выражении <выр1> может быть указано или правило, или ограничение (подробнее см. теорию баз данных). По умолчанию контроль достоверности данных производится в режиме редактирования. Если указать параметр :F, то контроль достоверности будет проводиться во всех режимах. Если используется параметр :Е, то на экран выводится заданное пользователем сообщение об ошибке — <вырО.
:Р = <вырО — задаст шаблон для ввода в поле только определенных символов. Шаблон представляет собой строку специальных символов. (Подробнее о создании шаблонов см. в разделе «Команды ввода-вывода*.)
:В = <выр1>,<выр2> [:FJ — накладывает ограничение на вводимые в поле символы. <выр!>,<выр2> соответственно нижняя и верхняя границы допустимого диапазона.
:Н = <вырО — описывает заголовок столбца. По умолчанию в качестве заголовка столбца используется имя поля.
:\V = <вырЕ> — запрещает перевод курсора в другое поле, ест логическое условие ложно. Логическое выражение может быть функцией, определяемой пользователем.
FONT <вырС1> [,<выр>11>] [STYLE <вырС2>] — описывает параметры шрифта: тип (<вырС1>), размер (<выр1Ч>) и стиль (<вырС2>). Если указанный тип шрифта отсутствует, то FoxPro подставит ближайший (по типу) доступный тип шрифта. После опции 1 STYLE допускается указать один из уточняющих параметров:
В: — полужирный I: — курсив N: - нормальный
О: — контурный Q. — непрозрачный S: - оттененный
—перечеркнутый Т: — прозрачный U: — подчеркнутый
Если опция STYLE отсутствует, то по умолчанию использует-1 ся начертание N.
FOR <вырЬ1> [REST)] — ограничивает количество выводимых на экран записей. На экран выводятся только те записи, которые удовлетворяют логическому условию <выр.И>. При просмотре, записей курсор перемешается снизу вверх (от последней записи к первой)- Если указана опция REST, то при просмотре записей курсор не перемешается.
FORMAT — отображает на экране поля таблицы в соответствии с форматом, указанным в форматном файле (с расширением .fmt). Предварительно форматный файл должен быть открыт командой SET FORMAT ТО <имя форматного файлаХ
FREEZE <имя поля> — разрешает внесение изменений только в одно указанное поле, хотя на экран выводятся все поля.
KEY <ныр1> 1,<выр2>] — предоставляет возможность выбрать и вывести на экран частичное подмножество записей. Отбор производится по полю текущего индекса. Допускается указать диапазон значений от <выр1> до <выр2> или одно значение <выр1> = <выр2>.
LAST | NOINIT — разрешает открыть окно BROWSE в той конфигурации, в какой оно использовалось в последнем сеансе работы. Опция NOINIT используется для тех же целей, но обеспечивает совместимость с таблицами dBASE.
LEDIT — отображает левую часть разделенного окна BROWSE в режиме просмотра Edit.
LOCK <BbipN2> — запрещает внесение изменений в первые <вырМ2> полей, представленных в окне BROWSE. При этом перевод курсора осуществляется либо мышью, либо комбинацией клавиш Ctrl + Н.
LPARTITION — при открытии окна BROWSE располагает курсор в первом поле первой записи левой части разделенного окна BROWSE. По умолчанию курсор располагается в первом поле первой записи правой части разделенного окна BROWSE.
OAPPEND — запрещает добавление новых записей в конец личного файла и блокирует команду Ctrl + N.
OCLEAR — после закрытия окна BROWSE сохраняет на экра- его образ. По умолчанию окно исчезает.
— запрещает пометку записей к удалению и блоки- РУет команду Ctrl + Т.
NOEDIT — запрещает внесение любых изменений в таблице.
NOMODIFY — запрещает модификацию структуры таблицы.
NOFOLLOW — после внесения всех изменений в одну запись сохраняет указатель в этой записи. По умолчанию указатель пере- ходит на следующую запись.
NOLGRID — удаляет вертикальные линии (разделители полей) в левой части разделенного окна BROWSE.
NORGR1D — удаляет вертикальные линии (разделители полей) в правой части разделенного окна BROWSE.
NOLINK — удаляет синхронную связь между разделенными частями окна BROWSE.
NOMENU — запрещает вызов системного меню окна BROWSE, то есть блокирует клавишу F10 и кнопку в левом верхнем углу окна BROWSE. Опция используется, когда все функциональные клавиши описываются программно.
NOOPTIMIZE — запрещает ускоренную технологию Rushmure. Подробнее см. п. 4.1.
NOREFRESH — запрещает обновление информации в окне BROWSE. Это необходимо при внесении изменений в очень большие базы данных, так как после каждого изменения (по умолчанию) производится переопределение индексов, что требует дополнительного времени.
NORMAL — открывает окно BROWSE с нормальными атрибутами, даже если окно BROWSE открывается внутри другого пользовательского окна. Если опция отсутствует, то для окна BROWSE берутся атрибуты того окна, внутри которого открывается окно BROWSE.
NOWAIT — после открытия окна BROWSE разрешает работу (без пауз) программы, вызвавшей открытие окна BROWSE. В про* тивном случае работа программы прерывается до закрытия окна BROWSE.
PARTITION <BbipN3> — разделяет экран на левую и правую части, где <BbipN3> определяет размер (число колонок) левой части окна BROWSE.
PREFERENCE <вырСЗ> — предназначена для сохранения и повторного использования атрибутов окна BROWSE. Под имеНСМ| указанным в <вырСЗ>, сохраняется текущая конфигурация окНа rrOVVSE в файле foxuser.dbf с помошью команды SET
Resource on.
rEDIT — устанавливает для правой части разделенного окна PROV/SE режим просмотра Edit.
SAVE — опция используется только в программах и сохраняет на экране образ окна BROWSE вместе с образом окна MEMO, если таковое было открыто, после закрытия окна BROWSE.
TIMEOUT <BbipN4> — задает время в секундах, в течение которого окно BROWSE будет открыто без каких-либо действий пользователя. Эта опция используется только в программах.
TITLE <вырС4> — задаст заголовок окна BROWSE. По умолчанию в качестве заголовка используется псевдоним рабочей области, в которой открыт табличный файл. Допускается задавать заголовок таблицы буквами русского алфавита.
VALID [:F[ <BbipL2> [ERROR <вырС5>] — организует проверку логического условия <BbipL2> для текущей записи на логическое соответствие между полями записи (правило). Если выражение <BbipL2> истинно, то разрешается переход к следующей записи. Если выражение <вырЬ2> ложно, то переход к следующей записи запрещен и на экран выдается сообщение <вырС5>. Если опция ERROR отсутствует, то на экран выводится стандартное сообщение Invalid Input.
WHEN <вырЬ4> — разрешает редактировать текущую запись только в том случае, если логическое условие <вырЬ4> истинно.
WIDTH <BbipN5> — устанавливает одинаковую ширину столбцов <вырК5> внутри окна BROWSE.
[WINDOW <нмя окна I>) [IN [WINDOW] Симя окна 2> | IN SCREEN ] - Разрешает открыть окно BROWSE с характеристиками того окна, внутри которого оно и открывается. Это окно сначала должно ®Ыть описано командой DEFINE WINDOW, а его имя указано в ПаРаметре <имя окна 2>. По умолчанию окно BROWSE открыва- ^я на экране, то есть используется опция IN SCREEN.
pOLOR [Сспнсок пар цветов>] | COLOR SCHEME <BbipN5> — описывает атрибуты цвета окна BROWSE. Атрибуты цвета можно отшить либо с помощью списка пар цветов (COLOR ‘B/R’), либо номер цветовой схемы в пределах от I до 24 OLOR SCHEME 4). По умолчанию используется схема 10.
При работе с базой данных часто возникает необходимость исправить данные в таблицах, то есть выполнить рсдактирова- ние данных. Предварительно открывается нужный табличный файл. Вывести па экран таблицу можно в двух режимах: режиВ Browse и режим Edit. В режиме Browse в окно BROWSE выводится несколько записей. Количество записей определяется размером окна BROWSE, при этом возможна прокрутка как та горизонтали, так и по вертикали. В режиме Edit в окно BROWSE выводится одна запись (рис. 2.8), при этом записВ можно пролистывать вперед (клавиша PgDn) и назад (клавиша PgUp).
ц Cut |
Р:ВГ? |
Key_cu*t | Key_town 1 i Key_stieot 14 |
iii |
• Index 108112 |
|
8 Name_custTOO "Алые парусе" |
|
Я AAet_cusla 12/3 |
|
И Tel 1112233 |
|
1 Fax 1112233 |
|
Ц Pizn ю |
|
ijkejLCUSl 2 |
|
:?! 'Key town 1 ?! Key_street 21 Index 117002 |
|
;'.i iNaMe_cuttOOQ "Микродрй" |
1 |
j A dies custA 3-A t Tel “ 3334411 |
|
Fax 3334411 |
|
: ■ Pizn Ю |
% |
Fey_eu*t 3 |
Щ |
: К ey_town 4 ■ few ,Uce‘ hy |
vj |
Рис.
2.8. Окно
BROWSE в
режиме
просмотра Edit с
данными
таблиц^
Customer.
а С помощью команд:
для задания режима Browse надо в окне Command подать команду BROWSE;
для задания режима Edit надо в окне Command подать команду EDIT или CHANGE.
б. С помощью Главного меню:
для задания режима Browse надо подать команду View -» Browse;
для задания режима Edit надо подать команду View -» Edit или View -> Append.
К 9
Перемещение но таблице производится по известным правилам:
на одно поле вправо — либо клавиша Tab, либо клавиша Enter, либо команда Ctrl + -к
на одно паче влево — команда Shift + Tab, либо команда Ctrl +
на одну строку вверх — клавиша ?;
на одну строку вниз — клавиша 4-;
на один экран вверх — клавиша PgUp;
на один экран вниз — клавиша PgDn
Юр
_
Bottom
—
Skip
Previus
—
Record
_
переход на первую запись таблицы; переход на последнюю запись таблицы; переход на следующую запись таблицы; переход на предыдущую запись таблицы; переход на запись с указанным номером.
Н0"ОМер н^жной записи пишется в команде Record в специаль- окошке. Причем указать надо физический номер записи, то - номер в порядке записи на диск, запис Я..Внесения однотипных изменений в большое количество е используют команду REPLACE. Формат команды:
56 Глава 2 _
REPLACE [SCOPE] <нмя поля 1> WITH <выр.1> [ADDITIVE]
[<имя поля 2> WITH <выр.2> [ADDITIVE]... ]
[FOR <выр.Ь1> ]
[WHILE <Bbip.L2>]
[NOOPTIMIZEJ Назначение огший:
<нмя поля 1>, <имя поля 2>... — имена полей, в которые заносятся новые данные.
WITH <выр.1>... — выражение (значение) для поля <имя поля 1>
ADDITIVE — используется только для полей типа Memo. При этом новые данные дописываются в конец имеющимся в поле данным.
Назначение опций FOR, WHILE, SCOPE и NOOPTIMIZE см. в п. 4.1.
Если опция WHILE опущена, то одно и то же выражение (значение) будет подставлено во все указанное поле (столбец), j
Когда редактирование выполнено, то его результаты надо сохранить с помощью одной из пар клавиш: либо Ctrl + End, либо Ctrl + W. Если результаты редактирования сохранять не надо, то используют клавишу Esc или комбинацию клавиш Ctrl + Q.
Если запись содержит поля типа Memo, то для их редакторов вания используют специальные приемы. Если поле типа Memo пусто, то в окне BROWSE в этом поле будет надпись memo. Если поле типа Memo содержит данные, то в окне BROWSE в этом поле будет надпись Memo. Для того чтобы просмотреть (или отредактировать) содержимое поля Memo, надо установить курсор Ц*| это поле и либо дважды щелкнуть левой кнопкой мыши, либо подать команду Ctrl + PgDn. Изменения вносятся в окно Memo так же, как и в окно BROWSE. Для сохранения изменений, сделанных в окне Memo, используют только команду Ctrl + W. Если изменения сохранять не требуется, то нажимают Л)Я комбинацию клавиш Ctrl + Q, либо клавишу Esc.
ДОБАВЛЕНИЕ НОВОЙ ЗАПИСИ
В FoxPro новая запись добавляется в конец таблицы. Можно ЛЯ бавлятъ как одну, так и несколько записей. Предварител^Ш открывают табличный файл, а затем одним из способов пода*0'* команду добавления записи. I
РАБОТА С ТАБЛИЦАМИ 59
а с помощью команд: в окне Command подают команду APPEND.
6. С помощью Главного меню.
Из Главного меню подают одну из команд:
fable -> Append New Record — для добавления одной записи.
Table -> Append Mode — для добавления нескольких записей.
При подаче любой из команд на экран выводится окно BROWSE в режиме Edit (см. рис. 2.8), которое содержит пустой шаблон записи. Если надо установить режим Browse, то из Главного меню следует подать команду View -» Browse.
УДАЛЕНИЕ ЗАПИСИ ИЗ ТАБЛИЦЫ
В FoxPro удаление записи из таблицы производится за два шага: пометка к удалению и физическое удаление записи. На первом шаге производится пометка записи специальным символом — прямоугольник черного цвета перед первым полем записи (рис. 2.9). Помеченные к удалению записи остаются в таблице и значения полей этих записей участвуют во всех вычислениях. Если в алгоритме приложения предусмотреть проверку на пометку записи к удалению, то можно либо полностью, либо частично исключить помеченные записи из процесса вычислений, что очень удобно в некоторых случаях (например, при начислении заработной платы и т. д.). На втором шаге все помеченные к удалению записи удаляются одной командой. При этом оставшиеся в таблице записи перемешаются вверх, занимая освободившееся место, и, таким образом, размер таблицы Уменьшается.
2<5-1. Пометка записи к удалению
Пометить запись к удалению можно тремя способами.
С помощью мыши.
Щелкнуть левой кнопкой мыши в поле выделения. Поле вы- находится слева от первого поля записи и представляет обой прямоугольник серого цвета. Если запись помечена к уда- то поле выделения окрашивается черным цветом (см.
A+Mtul1Ы
1а:ЛН
ii
iztr^lv
ЕДЗЕадрщ-
Ш
IlWCOD
-К.»»*
i
ЭА
<U
Mgi<
Рис.
2.0.
Пометка
записей к
удалению
(отмечены первая и третья
записи).
Im
town 1
I/vVj
1 1| Щ10611Д130
Шlili
?5яг».*отупм)»<..
4-
Если запись помечена к удалению ошибочно, то для снятия пометки надо еще раз щелкнуть левой кнопкой мыши на поле выделения, при этом поле выделения будет закрашено серы цветом.
б. С помощью клавиатуры.
Предварительно курсор устанавливают на любое поле поме чаемой к удалению записи и нажимают клавиши Ctrl + Т. Пос.» выполнения команды поле выделения окрашивается черным цветом.
Для снятия пометки к удалению надо установить курсор любое поле помеченной записи и нажать клавиши Ctrl + Т.
в. С помощью главного меню.
Из Главного меню надо подать команду Table Toggle Deletion Mark и на экран выводится диалоговая панель Delete. Назначение кнопок диалоговой панели Delete.
Delete — помечает текущую запись к удалению.
Skip — определяет сферу действия команды Delete Records и водит на экран диалоговую панель Scope, где можно указать: All — вся таблица.
Next — в специальном окошке указывается количество мечаемых к удалению записей, считая от текущей запис» Опция задана по умолчанию и в окошке указана "Г. Record — в специальном окошке указывается номер по чаемой записи.
Rest — помечаются к удалению все записи, начиная от кущей до конца файла.
е , |( While — определяют отбор записей по условию для их метки к удалению и выводят на экран диалоговую панель Expression Builder, которая содержит элементы управления:
Expression — многострочное поле ввода. Предназначено для написания логического выражения, которое определяет записи для пометки к удалению.
Functions — группа раскрывающихся списков, из которых выбирают по мере необходимости: функции для обработки строковых данных (String), логические операторы (Logical), математические операторы и функции (Math), функции обработки дат (Date).
Fields — список имен полей текущей таблицы.
Variables — список системных переменных.
Если запись или группа записей помечена к удалению ошибочно, то для отмены пометки надо подать команду Table -> Recall Records и на экран выводится диалоговая панель Recall, которая полностью аналогична диалоговой панели «Delete».
г. Программно.
Для пометки записей к удалению надо дать команду DELETE. Формат команды:
DELETE
lFOR<L>]
[ WHILE <L> J [ NOOPTIM1ZE J
Назначение опций см. в п. 2.3. Команда DELETE без опций помечает к удалению одну текущую запись.
2-5.2. Физическое удаление записи
Физическое удаление помеченных записей можно выполнить ■ВДУМя способами.
®- С помощью команд.
окне Command надо подать команду PACK.
£ С помощью Главного меню.
Dcle»cd ReBH j™ Меню надо подать команду Table -► Remove
ост?-1 и дРУгом случае помеченные записи будут удалены, а вверх ._еся в таблице записи автоматически перемещаются Н Ни"'1ая освободившееся место.
МОДИФИКАЦИЯ СТРУКТУРЫ ТАБЛИЦЫ
Модифицировать можно текущую таблицу, при этом из сущееД вующей структуры можно удалить ненужное поле (поля), добавить в структуру новое поле (поля), изменить характеристики существующих полей. При изменении характеристик существующих полей возможна потеря информации в некоторых случаях. Например, если тип поля изменяется с Character на Numeric, или при уменьшении размера поля и т. д.
Из окна Command надо подать команду MODIFY STRUCTURE. Вес команды в Visual FoxPro можно подавать в сокращенном варианте написания, указывая не менее четырех букв of каждого слова имени команды, например MODI STRU. В результате на экран выводится диалоговая панель Table Designer, описанная ранее (см. рис. 2.2). Изменения структуры проводятся щ описанным выше правилам с использованием приемов текстовых! редакторов. С целью избежания потерь информации рекоменду! ется перед применением команды MODIFY STRUCTUREсделаш резервную копию таблицы.
СОЗДАНИЕ ФАЙЛА БАЗЫ ДАННЫХ
Создавать и работать с табличным файлом можно как с независимым объектом, хранящимся внутри каталога, так и как с частью базы данных. Для того чтобы таблица была частью базы данный надо либо сначала создать файл базы данных (или открыть фай! базы данных), а затем создавать таблицы (описанными вышеко-1 мандами), либо специальными командами в открытый файл бааЯ данных поместить (добавить) ранее созданные таблицы. ЕсДЯ файл базы данных создан, то создаваемая база данных будет редИ ционной. В противном случае база данных не реляционная.
Создать файл базы данных можно несколькими способамИ-Я
а. С помощью команд.
В окне Command надо подать команду:
CREATE DATABASE [ <нмя базы данных> | ? ]
Команда создает базу данных и делает ее текущей (открытой Если указана опция «?» или опции не указаны вообще, то на экрЩ выводится диалоговая панель Create, где в специально.м о» представлены имена имеющихся баз данных, и в поле ввода Елд database можно задать имя создаваемой базе данных.
g С помощью Главного меню.
Из Главного меню надо подать команду: File -> New, тогда на н выводится диалоговая панель New (см. рис. 2.5), где в ра- Э .огруппс File Туре надо включить кнопку Database и нажать кнопку New File, тогда на экран выведется диалоговая панель Create, работа с которой описана в пункте а.
в. С помощью графического меню.
В графическом меню нажать кнопку New File и на экран выведется диалоговая панель New, работа с которой рассмотрена в пункте б
База данных, созданная любым способом, становится текущей (открытой). Файл базы данных имеет расширение .DBC.
ОТКРЫТИЕ БАЗЫ ДАННЫХ
Для открытия базы данных надо из Главного меню подать команду File -> Open или в графическом меню нажать кнопку Open, на экран выведется диалоговая панель Open, где надо указать имя базы данных и место се хранения. В результате работы команды Open на экран выведется диалоговая панель Database Designer (рис. 2.10).
РИс
^
"1
Диалоговая панель открытой базы данных.
Добавление таблиц в базу данных
Для того чтобы поместить в открытую базу данных ранее со зданную свободную таблицу, надо выполнить одно из дсйст. вий:
либо из Главного меню подать команду Database -» Ado Table;
либо установить курсор мыши на рабочее поле диалогов панели Database Designer и правой кнопкой мыши вызват на экран контекстное меню, из которого выбрать команд] Add Table.
В том и другом случае на экран выводится диалоговая панель Open, в окне которой представлены имена табличных файлов i текущего каталога. Надо выбрать имя нужного табличного фай и нажать кнопку Ок. После выполнения операции добавления таблицы, изображение самой таблицы появляется в диалогов панели Database Designer (рис. 2.11).
Добавить свободную таблицу в открытую базу даШ1ЫХ можи также с помощью команды ADD TABLE <имя таблицы> | ?
iiJ
Рис.
2.11.
Добавление таблицы в базу данных. |
Ц |
EEKieldt |
ж |
|
|
keyjowi |
|
key_*beet ndex |
|
name_cu« , |
|
adi«_curt |
|
,eJ |
й |
Назначение опции «?» см. в пункте а в п. 2.7.
2 8.2. Освобождение таблицы
- я освобождсние таблицы существуют две команды.
Команда REMOVE TABLE <ичя таблицы> ? [DELETE] удаляет таблицу из базы данных и делает указанную таблицу свободной. оставляя се в текущем каталоге. Если указана опция DELETE- то таблица удаляется не только из базы данных, но и с диска.
Команда FREE TABLE <имя таблипы> используется при закрытой базе данных для доступа к указанной таблице. Если опция <имя таблииы> опушена, то на экран выводится диалоговая панель Free Table, которая аналогична диалоговой панели Open, ще можно указать имя освобождаемой таблицы.
Освободить таблицу можно через Главное меню командой Database -* Remove (рис. 2.12).
После выбора команды Remove надо уточнить свое действие: освободить таблицу (Remove) или удалить таблицу (Delete) нажатием соответствующей кнопки (рис. 2.13).
'
МюогоН
VuimI
I-oxPig
РИД*-
tty 6'osiam £>»;*»«. Ж****' i H* : :-:
Чс*Яижй*У**...
I ‘1<Х
j,005lV»W
молу;.
Blow»
Robuk!t#hfcWwr»
Р
wnfcogefeted
Йоса*
ШЁ
:::Mi
«у*»
^
Освобождение
(или удаление) таблицы.
Microtofl
Vitoel
FoxPio
И Do you vmti to remove ihs taUe from ft* database a tWete i from the tiek?
I^arw*. | gebte ( | Canco1 |
Рис. 2.13. Освобождение или удаление указанной таблицы.
кнопки Yes (или No) в появившемся на экране новом запросе.
ВЫВОД ЗАПИСЕЙ ТАБЛИЦЫ НА ЭКРАН
В окне Command можно подать одну из команд (DISPLAY или LIST) для вывода на экран одной или нескольких записей, а так-1 же всей таблицы. Формат команд одинаковый:
DISPLAY|LIST JSCOPE]
[FIELDS <елисок имен полей>]
[FOR <выр.Ь1> ]
[WHILE <вырХ2>]
[OFF]
[TO PRINTER [PROMPT] | TO FILE <имя файла> ] [NOCONSOLE]
[NOOPTIMIZE]
Назначение опций:
OFF — номер записи не выводится.
ТО PRINTER — информация выводится на принтер.
ТО FILE — информация выводится в файл с указанным имене'<
NOCONSOLE — запрещает вывод информации на экран. используется совместно с опциями ТО PRINTER или ТО FII^p
Назначение опций FOR, FIELDS, WHILE и NOOPTlM*—,
описано в п. 4.1. Д
Различие между командами DISPLAY и LIST состоит в что команда DISPLAY выводит информацию порциями, то с<4
заполнении экрана ждет нажатия клавиши Enlcr, чтобы вы- П£ти следующую порцию информации. Команда LIST выводит ^формацию потоком, без пауз.
ЗАКРЫТИЕ ФАЙЛОВ
Efeg закрытия файлов различных типов используется универсальная команда CLOSE. Команда CLOSE используется с одной из опций. Формат команды:
CLOSE
ALL
DATABASES | FORMAT | INDEX
| MEMO Сспнсок имен полей memo> | MEMO ALL | PROCEDURE | TABLES [ALL]
Назначение опций.
ALL — закрывает вес типы файлов и назначает рабочую область 1 текущей.
DATABASES — закрывает все открытые базы данных, таблицы, индексы и форматные файлы и назначает рабочую область I текущей.
FORMAT — закрывает форматный файл, открытый в текущей рабочей области.
Index — закрывает все индексные файлы в текущей рабочей об- асги, за исключением структурного мультииндексного файла.
MEMO <список имен полей memo> | MEMO ALL—закрывает ок- Врспфопния. в которых были открыты указанные Мето- я или закрывает все Memo-поля во всех рабочих областях.
■ EDURE — закрывает процедурный файл.
а с от ~ закрывает все таблицы в текущей базе данных,
зы ~ все таблицы во всех базах данных. Если все ба-
ь® закрыты, то закрывает все свободные таблицы.
УПРАВЛЕНИЕ СТАТУС-СТРОКОЙ
Статус-строка располагается в нижней части экрана и содер справочную информацию: имя лиска, где хранится таблицы, имя текущей таблицы, права доступа к таблице, номер текущей записи таблицы, общее количество записей таблицы и сведения о включенных режимах клавиатуры.
Для вывода статус-строки на экран надо в окне Command подать команду SET STATUS ON.
Для удаления статус-строки с экрана надо подать ту же команду с параметром OFF.
УСТАНОВКА ТИПА ДАТЫ
В FoxPro предусмотрены несколько типов дат, которые устанавливаются с помощью команды: SET DATE <тип даты>
Аргумент <тип даты> может содержать одну из констант:
AMERICAN — американский тип даты мм/дд/гг ANSY — тип даты ANSY гт.мм.дд BRITISH — английский тип даты дд/мм/гг GERMAN — немецкий тип даты дд.мм.гг ITALIAN — итальянский тип даты дд-мм-гг
Если необходимо установить написание года четырьмя циф рами, то надо подать команду SET CENTURY ON.
Для написания номера года двумя цифрами надо подать ту же команду с параметром OFF.
В приложениях формат даты определяют либо в начале про граммного файла, либо в файле Config.fp.
УПРАВЛЕНИЕ РЕДАКТИРОВАНИЕМ ТАБЛИЦЫ
Для создания комфортных условий при создании и редактировав нии файлов желательно использование следующих команд:
а. Команда установки текущего каталога SET DEFAULT ТО Сполное имя каталога>
б. Команда задания альтернативных путей поиска SET PATH ТО [<список путей поиска>].
Если требуемый файл не найден в текущем каталоге, то поиск файла продолжается в каталогах, указанных в Сспнсхе путей поисках
в. Команда управления курсором SET CONFIRM ON
Команда включает автоматический перевод курсора в следующее поле после нажатия клавиши ENTER. Если после нажатия клавиши ENTER курсор должен оставаться в том же поле, то в этой команде следует указать параметр OFF.
г. Команда подачи звукового сигнала SET BELL ON
При наборе текста вслепую надо знать, была ли нажата клавиша или нет. После подачи этой команды каждое нажатие клавиши сопровождается звуковым сигналом. Для отмены звукового сигнала надо в этой команде указать параметр OFF.
д. Управление выдачей системных сообщений SET TALK ON | OFF
Если установлена опция ON, то на экран выводятся системные сообщения о выполнении некоторых команд и многих функций FoxPro. Если установлена опция OFF, то системные сообщения на экран не выводятся.
ПРИМЕР
Создадим базу данных, рассмотренную в примере гл. I. Предварительно на диске создадим каталог PRIMER, куда и будем помешать вес файлы создаваемой базы данных.
Запустим Visual FoxPro и сделаем каталог PRIMER текущим с помощью команды
SET DEFAULT ТО E:\PRIMER
Таблицы Customer, Sale, Salesman, Account, Order, Catalog, Autor, Town и Street создадим с помощью команды CREATE (см. гл. 2 пп. 2.1.а и 2.1.6). Таблицы Fam, Im и Ot создадим с помощью SQL-опсратора. (Структура всех таблиц приведена в Примере к гл. 1.)
CREATE TABLE Fam (Key_fam n(3),Name_f am с(15) ) CREATE TABLE Im (Key_im n(3). Name_im с(15) ) CREATE TABLE Ot <Key_ot n(3), Name_ot с(15) )
Итак, создано двенадцать пустых таблиц. Для ввода данных в таблицу надо эту таблицу сделать текущей (активной) В каждый момент времени текущей может быть только одна таблица. Откроем все 12 таблиц, каждую в своей рабочей области и каждой рабочей области присвоим псевдоним (alias).
USE Customer.dbf in 1 alias cus USE order.dbf in 2 alias ord USE Salesman.dbf in 3 alias smn USE Sale.dbf in 4 alias sal USE Account.dbf in 5 alias acnt USE Catalog.dbf in 6 alias ctl USE Author.dbf in 7 alias atr USE Town.dbf in 8 alias twn USE Street.dbf in 9 alias str USE Fam.dbf in 10 alias fam USE Im.dbf in 11 alias im USE Ot.dbf in 12 alias ot
Для того чтобы таблицу сделать текущей, надо подать коман ду SELECT и указать алиас нужной рабочей области. Сделаем текущей таблицу Customer, подав команду SELE cus.
Для вывода содержимого текущей таблицы Customer на экра подадим команду Brow.
Используя приемы, описанные в пункте 2.4, заполним таблицу Customer данными и сохраним их.
После заполнения всех таблиц данными, сделайте текуше таблицу Author с помощью команды Selc atr.
Выведите содержимое таблицы Author на экран с помощью команды Browse.
По умолчанию принят американский стандарт даты — ММ.ДД.ГГ. Для перехода на привычный немецкий стандарт даты надо подать команду SET DATE German.
По умолчанию номер года выводится двумя последними циф рами. Для того чтобы год обозначался четырьмя цифрами, надо подать команду SET CENTURY ON. {
Создадим базу данных Book с помощью команды CREATE DATABASE Book
При этом каталог PRIMER должен быть открыт. После выполнения команды на экран будет выведена пустая диалоговая панель Database Designer (см. рис. 2.10).
Поместим созданные двенадцать таблиц в базу данных. Для этого установим курсор мыши на рабочее поле и правой кнопкой мыши выведем на экран контекстное меню, из которого выберем команду Add Table. В появившемся на экране списке имен таблиц курсором выделим имя нужной таблицы и нажмем кнопку Ок. Эту процедуру надо выполнить для каждой таблицы.
Контрольные вопросы
Для каких целей создают таблицу?
Назовите способы создания таблицы.
Назовите два способа представления данных из таблицы на экране. Как задать каждый из способов представления данных?
Какой командой добавляется новая запись в табличный файл? В каком месте таблицы располагается добавленная запись?
Назовите особенности удаления записи из таблицы.
Укажите преимущества и недостатки двухэтапного удаления записи.
Что такое модификация структуры таблицы и в каких случаях она применяется?
В каких случаях возможна потеря информации при модификации таблицы?
Какие характеристики поля надо указать при создании или модификации таблицы?
Назовите два способа открытия таблицы.
Каким способом производится предъявление на экран таблицы?
12- Какая команда выводит на экран сведения о текущей таблице?
13. Сколько таблиц можно открыть одновременно и как они будут располагаться в оперативной памяти?
И- Что такое рабочая область и ал нас рабочей области?
15- Какая команда используется для редактирования таблицы?
1®- Как задать в команде BROWSE вывод на экран определенных полей таблицы?
12- Как задать в команде BROWSE ограничения на значения поля?
Как задать в команде BROWSE логическое условие на значение поля?
Как задать в команде BROWSE вывод на экран заголовка столбца таблицы буквами русского алфавита?
Как задать в команде BROWSE вывод на экран заголовка таблиц буквами русского алфавита?
Как задать в команде BROWSE синхронную и асинхронную связь между половинами разделенного окна BROWSE?
Как запретить в команде BROWSE редактирование записей, добавление записей, модификацию структуры табличного файла, удаление записей?
Объясните назначение файла базы данных.
Укажите команды для создания и открытия файла базы данных.
Укажите команды для помещения таблицы в файл базы данных.
Укажите команду для освобождения таблицы из файла базы данных.
Укажите команду для вывода на экран отдельных записей из таблицы.
Какие типы дат используются в FoxPro? Как установить желаемый тип даты?
Какая команда задает текущий каталог?
Какая команда запрещает (разрешает) вывод на экран системных сообщений?
Глава 3
ИНДЕКСИРОВАНИЕ БАЗ ДАННЫХ
Если записей в таблице много, то найти нужную запись бывает очень трудно. Поиск данных производится методом перебора, то есть просматриваются все записи таблицы от первой записи до последней записи, что приводит к большим затратам времени. Чтобы облегчить поиск данных в таблице, используют индексы. Индекс, иногда его называют указатель, представляет собой порядковый номер записи в таблице. Индекс строится но значениям одного поля или по значениям нескольких полей. Индекс, построенный по значениям одного поля, называется простым, а по значениям двух и более полей — сложным. Во время построения индекса записи в таблице сортируются по значениям поля (или нолей) будущего индекса. Затем первой строке таблицы присваивается индекс номер один, второй строке — индекс номер два и т. д. до конца таблицы.
Как простой, так и сложный индекс имеют свой тип (Туре). Первичный (Primary) индекс (ключ) — это тюле или группа полей, однозначно определяющих запись, то есть значения первичного индекса уникальны (не повторяются). В реляционной базе Данных каждая таблица может иметь только один первичный ключ. Внешних ключей у таблицы может быть много и они будут иметь один из типов:
Candidate — кандидат в первичный ключ или альтернативный ключ. Он обладает всеми свойствами первичного ключа.
Unique (уникальный) — допускает повторяющиеся значения в поле, по которому он построен, но на экран будет выводиться только одна первая запись из группы записей с одинаковым значением индексного поля.
Regular (регулярный) — не накладывает никаких ограничений на значения индексного поля и на вывод записей на экран. Индекс только управляет порядком отображения записей. Эго наиболее популярный тип индекса.
Взаимосвязь между таблицами осуществляется по индексам, которые называют ключами.
Построенный индекс хранится в специальном индексном файле. Если индексный файл хранит только один индекс, то он называется одноиндсксным и имеет расширение .idx. Индексные файлы, которые хранят много индексов, называются муль- тииндексными и имеют расширение .cdx. Каждый индекс, который хранится в мультииндексном файле, называется тегом. Каждый тег имеет свое уникальное имя.
Мультииндексныс файлы бывают двух типов: просто мульти- индексные файлы (о них рассказано выше) и структурные мульти- индексные файлы. Структурный мультииндексный файл имеет одинаковое имя с таблицей, которой он принадлежит (отличие только в расширении файла), и обладает следующими свойствами:
автоматически открывается со своей таблицей;
его нельзя закрыть, но можно сделать не главным.
Одна таблица может иметь много индексных файлов как од- ноиндсксных, так и мультииндексных. В старших версиях FoxPro используются мультииндексныс файлы.
СОЗДАНИЕ ИНДЕКСА
Создать индекс можно двумя способами.
а. С помощью команды:
INDEX ON <индексное выражспне> ТО Сн1х-файл>
TAG <нмя тега> [OF <с(1х-файл>]
[FOR <условне>|
[COMPACT]
[DESCENDING]
[UNIQUE]
[ADDITIVE]
[NOOPTIMIZE]
Назначение опций:
<индексное выражение> — имя поля (или полей), по значениям которого надо построить индекс. При построении сложного индекса имена полей перечисляются через знак + (плюс). Если сложный индекс построен по:
числовым полям, то индекс строится по сумме значений полей;
символьным полям, то индекс строится сначала по значению первого поля, а при повторяющихся значениях первого поля — по значениям второго поля; при повторяющихся значениях первого и второго полей — по значениям третьего поля и т. д.;
по полям разных типов, то сначала значения полей приводят к одному типу, как правило символьному, а затем строят индекс.
Длина индексного выражения не должна превышать 254 символа.
ТО <л<1х-файл> — указывается имя одноиндсксного файла.
TAG <нмя тега> [OF <сёх-файл>] — указывается имя тега в мультииндексном файле. Если используется опция [OF <cdx- файл>1 , то создаваемый тег помешается в указанный мульти- кндексный файл, а если требуемый мультииндексный файл отсутствует, то будет построен структурный мультииндексный файл. Если опция [OF <с<1х-файл>] опущена, то созданный тег будет помещен в текущий мультииндексный файл.
FOR <условие> — устанавливает режим отбора в индекс тех записей таблицы, которые удовлетворяют <усяовию>.
COMPACT — управляет созданием компактного одноиндекс- ного файла. В старших версиях FoxPro не используется.
DESCENDING — строит индекс по убыванию. По умолчанию используется построение индекса по возрастанию (ASCENDING). Для одноиндексных файлов можно построить индекс только по возрастанию. Если перед использованием команды INDEX ON... подать команду SET COLLATE, то можно построить одноин- яексный файл по убыванию.
unique — строит уникальный индекс. Если индексное поле (поля) содержит повторяющиеся значения, то в индекс попадает только одна первая запись и остальные записи будут не до- ступны.
ADDITIVE — вновь создаваемый индексный файл не закрыва- ^УЖс открытые к этому моменту времени индексные файлы. Ес-
.•flbjnment
.box
.indent
_im&cpn
.padvaride
.радело
„pbpage
:
[(Г
Expression
яЬ_з(ер
♦ uch_*vaH
iJ
u
ли опция опушена, то вновь создаваемый индексный файл за крывает все ранее открытые индексные файлы.
NOOPTIMIZE — назначение опции см. II. 4.1
б. С помощью Главного меню:
В этом случае индекс создастся либо при создании таблицы, либо при модификации структуры таблицы. Для этого в диалоговой панели Table Designer надо выбрать вкладку Index (рис. 3.1).
Каждый индекс описывается одной строкой в окне диалоговой панели Table Designer.
В графе Name указывается имя тега мультииндексного файла. Если ранее открыт один из мультииндексеых файлов, то вновь построенный индекс помешается в открытый мупьтиин- дексный файл. Если индекс строится одновременно с созданием табличного файла или табличный файл не имеет мультиин- дсксных файлов, то вновь построенный индекс помешается в автоматически создаваемый структурный мультииндексный файл.
В графе Туре, снабженной раскрывающимся списком, указывается один из допустимых типов индекса. Если индекс строится для таблицы, входящей в состав базы данных, то возможны четыре значения: Primary, Candidate, Unique и Regular. Если ин-
Expression Builder |
|
E? |
|
||
Sinn» , Math |
|
OK j |
•;];J+ J J" |
iJ |
Cancel |
йг*е:
|
(date)
key_fam |
N |
3 |
key_im |
N |
3 |
Eey_ol |
N |
3 |
cbra) |
С |
10 |
ush.itep |
С |
10 |
Fields'
ElECOBBEHElBLii
Fran
Table, j Atr
Рис. 3.2. Построение сложного индекса с помощью построителя выражений
Carg^jl
|
|
Name |
Type |
Ехргея»я Ret |
й |
t |
lem |
RegUar |
key_fam |
|
i |
m |
Regular |
keyjm |
г |
t |
ot |
Regular |
key ol |
Л |
a |
uch |
| Regular z. |
I ‘ % Cl |
|
|
|
[Canddaie [Uwue |
|
|
|
|
|
|
|
|
|
|
• * - |
[ tApnrmHVaulor.DBF |
|
| Records. 2 Reids 1f |
I
able Designoi
ШНЯВ
Ш
Table
Index
ill
18
Length:
Рис.
3.1. Создание индекса.
Деке строится для свободной таблицы, то в раскрывающемся списке отсутствует значение Primary.
В графе Expression перечисляются имена полей, по значениям которых надо построить индекс. Если строится сложный индекс, то удобнее воспользоваться построителем выражений, который запускается нажатием кнопки, расположенной справа от поля ввода.
В графе Filter можно задать логическое условие и построить индекс не для всех записей таблицы, а только для записей, удовлетворяющих условию фильтра. Эта графа также снабжена Построителем выражений Содержание и внешний вид обоих построителей одинаковые (рис. 3.2).
На рис. 3.2 показано построение сложного индекса по двум символьным полям ush step и uch zvan (имя тегу uch было Рисвоено до вызова на экран построителя выражений). Знак
«+*, указывающий на построение сложного индекса, взят из раскрывающегося списка String.
В раскрывающемся списке String приведены допустимые строковые функции. Аналогично в раскрывающихся списках Math, Logical и Date приведены допустимые математические, логические функции и функции даты. Нужная функция из этих раскрывающихся списков выбирается щелчком левой кнопки мыши. Имена полей (список Fields) и имена переменных (список Variables) выбираются с помощью двойного щелчка левой кнопки мыши. Получившееся в результате выражение помещается в окно Expression.
В раскрывающемся списке From Table указано имя таблицы, из которой берутся поля для построения индекса. При желании можно заказать любую таблицу из текущей базы дан ных и для построения индекса взять любое поле.
ОТКРЫТИЕ ИНДЕКСНОГО ФАЙЛА
Открыть индексный файл можно только в том случае, если ранее открыт соответствующий табличный файл. В противном случае будет выдано сообщение об ошибке. Для открытия индексного файла надо подать команду:
SET INDEX ТО [список индексных файлов]
[ORDER <BupN> | <|(1х-файл>|[ТАС<имятега>] [ОЕ<сйх-фаИи>]1 [ASCENDING | DESCENDING]
[ADDITIVE]
Назначение опций такое же, как в командах USE и INDEX ON.
Открыть существующий индексный файл можно одновре менно с открытием табличного файла командой USE (см. п. 2.1 «Открытие таблицы»).
Для закрытия всех индексных файлов надо подать одну из команд: либо SET INDEX ТО без опций, либо CLOSE INDEX.
ЗАМЕНА ТЕКУЩЕГО ИНДЕКСА
Для каждой таблицы одновременно может быть открыто несколько индексных файлов, но текущим (активным) будет только один индекс. По умолчанию принято, что текущим будет первЫй по порядку индекс в том индексном файле, имя которого указано первым в списке имен индексных файлов команды USE или команды SET INDEX ТО.
Текущим можно сделать любой индекс из текущего индексного файла с помощью команды
SET ORDER ТО
[<BupNI> | <1йх-файл> | (TAG <имятега> [OF <cdx - файл>] ] [IN <BupN2> | <вырО I [ASCENDING | DESCENDING)
Назначение опций:
<BbipNl> — задает текущий индекс по его порядковому номеру в мультииндексном файле.
<[с!х-файл> — дслаеттскущимодноиндсксныйфайл.
TAG <имятега> [OF <с<1х-файл>] — задает текущий индекс по имени тега из указанного мультиипдексного файла. Если опция [OF <cdx - файл>] опущена, тотег выбирается из текущего мулъ- тииндексного файла.
IN <BupN2> — указывает номер рабочей области, в которой находится индексный файл. Опция используется в том случае, если табличный файл открыт в одной рабочей области, а индексный файл — в другой рабочей области.
Текущим индекс также можно сделать с помощью диалоговой панели Table Designer, переместив строку описания нужного индекса на первое место.
ПЕРЕСТРОЙКА ИНДЕКСНЫХ ФАЙЛОВ
При внесении изменений в большие таблицы тратится много времени, так как при внесении каждого изменения заново перестраиваются все открытые индексные файлы. Для экономии времени индексные файлы закрывают и вносят изменения в таблицу. Однако в этом случае возникает несоответствие между обваленной таблицей и индексными файлами. Дтя устранения Указанного несоответствия надо заново перестроить индексные Файлы. После открытия всех индексных файлов, принадлежа- рйх измененному табличному файлу, надо подать команду ‘‘EINDEX. Команда действует на все индексные файлы, откры- в текущей рабочей области. Переиндексирование можно
также выполнить, подав из Главного меню команду Table Rebuild Indexes.
ПРЕОБРАЗОВАНИЕ ОДНОИНДЕКСНОГО ФАЙЛА В ТЕГ ,
Если табличному файлу принадлежит один или несколько одно- индексных файлов, то их можно скопировать как теги в мульти-| индсксный файл. Для этих целей используют команду
COPY INDEXES <имсна Idx - файлов> | ALL [ТО <cdx - файл>]
Опция ALL указывается в том случае, если надо скопировал! все одноиндсксные файлы. При этом список имен <ичсна idx- файлов> не указывается. Тегам присваиваются имена одноин- дексных файлов. При копировании нескольких одноиндексньА файлов их имена перечисляются через запятую. Если опция TO J опущена, то одноидексныс файлы копируются в текущий мул ь-J таиндексный файл. Если опция ТО содержит имя нссушествД ющего мультииндексного файла, то он создастся.
Допустима и обратная операция, то есть один тег прсобразЯ ется (копируется) в одпоиндексный файл с помощью ко.мандьЗГ
COPY TAG <список имея тегов> {OF <cdx - файл> ] ТО <idx - файл>]
Предварительно мультииндексный файл должен бьггь otJ крыт. Можно скопировать отдельные теги, указав Ссписокимен тегов>, либо все теги, используя опцию ALL.
Удаление тега из мультииндексного файла
Удалить один тег или все теги из мультииндексного файла, о( крытого в любой рабочей области, можно с помощью командмЦ
DELETE TAG <имя тега 1> [OF <нмясс1х-файла>]
[,<нмя тега 2> [OF <имя сс1х-файла> ] ] ... |
ALL [OF <нмя сйх-файла> ]
Одной командой можно удалить теги, находящиеся в разнЫ^ мультииндексных файлах.
Вывод на экран имен индексных файлов и имен тегов
Во время работы с приложением часто возникает необходимость получить справку, имеет ли таблица индексные файлы, а также узнать имена тегов мультииндексных файлов. Для этих целей предназначены следующие функции.
NDX(<Bup.N> [,<номср рабочей области | псевдоним рабочей областн> ])
Функция возвращает имена открытых одноинасксных файлов.
CDX(<Bnp.N> [,<номср рабочей области | псевдоним рабочей обдастн> ])
Функция возвращает имена открытых мультиплексных файлов.
MUX(<Bup.N> [,< номер рабочей облает | псевдоним рабочей области> ])
Функция возвращает имя структурного мультииндсксного файла.
Во всех функциях <выр.1Ч> — порядковый номер индексного файла, имя которого должна вернуть функция.
ТАС([<имя сйх-файла> , <выр.!\'> [, <номер рабочей области | псевдоним рабочей области> ])
Функция возвращает для указанного <имя «1х-файла> муль- тииндексного файла имя тега <Bbip.N>, заданного порядковым номером. Если <имя cdx-фaйлa> опущено, то по умолчанию подставляется имя текущего мультииндексного файла.
Примеры
Пример 1. В соответствии со структурой таблицы Customer (см. пример к гл. 1) построить необходимые индексы.
SET DEFAULT ТО Е:\PRIMER &&3адание рабочего каталога
Откроем базу данных Book с помощью команды Главного меню File -> Open
Откроем таблицу Customer и установим режим модификации.
USE Customer.dbf in 1 alias cus uu Открытие таблицы
Customer
MODI ST3U Задание режима модификации текущей
таблицы
В появившейся на экране диалоговой панели Table Designer выберем вкладку Index. В графе Name укажим имя тега Cust, в графе Туре укажем тип создаваемого индекса — Primary, в графе Expression укажем имя поля, по значениям которого надо построить индекс, — Key_cust. Индекс построим по возрастанию. После нажатия кнопки Ok на экран выводится запрос — надо ли сохранить сделанные изменения? Для сохранения созданного индекса надо нажать кнопку Yes. Можно задать описание сразу нескольких индексов, а сохранение выполнить один раз.
Вызовем на экран диалоговую панель Table Designer другим способом. Установим курсор мыши на пиктограмму таблицы Customer и щелчком правой кнопки мыши выведем на экран контекстное меню. Из контекстного меню надо выбрать команду Modify (аналог команды Modify structure). В соответствии со структурой таблицы Customer (см. пример в п. 1.8), опишем второй индекс. В графе Name зададим имя тега Town, в графе Туре укажем тип Regular, в графе Expression укажем имя поля Key_town. Сохраним описанный индекс. Так как при построении индексов мы не указали имя мультииндексного файла, то автоматически был построен структурный мультииндексный файл с именем Customcr.cdx. Чтобы убедиться в этом, можно дать команду
? CDX{1)
или команду
? МЭХ (1) .
Остальные индексы можно построить с помощью слсдующи команд:
INDEX ON Key_street TAG Street OF Customer.cdx INDEX ON Key_fam TAG Fam OF Customer.cdx INDEX ON Key_im TAG Im OF Customer.cdx INDEX ON Key_ot TAG Ot OF Customer.cdx
Чтобы вывести на экран имя третьего тега мультиплексного файла Customer, надо лать команду
7 TAG('Customer', 3)
Аналогично любым из способов постройте индексы для оставшихся одиннадцати таблиц в соответствии со структурой таблиц (см. пример к гл. 1).
Пр им ер 2. Сортировка даш!ых.
При выводе содержимого таблицы на экран в окно Browse данные сортируются в соответствии со значениями текущего индекса. Так как при построении индексов для каждой таблицы были созданы структурные мультииндексные файлы, то при открытии таблиц имя структурного мультишщсксного файла в опции INDEX можно не указывать.
CLOSE ALL && Закрытие всех файлев
SET DEFAULT ТО Е:\PRIMER && Задание рабочего
каталога
USP Customer.dbf in 1 alias cus && Далее открытие
двенадцати таблиц USE Order.dbf in 2 alias ord
USE Salesman.dbf in 3 alias smn
USE Sale.dbf in 4 alias sal USE Account.dbf in 5 alias acnt USE Catalog.dbf in 6 alias ctl USE Author.dbf in 7 alias atr USE Town.dbf in 8 alias twn USE Street.dbf in 9 alias str USE Fam.dbf in 10 alias fam USE Im.dbf in 11 alias im USE Ot.dbf in 12 alias ot
SELECT im && Задание текущей
таблицы
После подачи команды BROWSE на экран будет выведено с°Держимое таблицы Im, записи которой будут отсортированы в возрастающем порядке по значениям поля первичного ключа Key_im (порядковый номер имени). Сделаем текущим индекс (тег) с именем Name с помощью команды SET ORDER ТО Name. После подачи команды BROWSE таблица Im будет отсортирована в соответствии с этим индексом, то есть имена будут расположены в алфавитном порядке.
Пример 3. Выведем сведения о наличии мультииндексных файлов и имен тегов у таблицы Author CLEAR && Очистка экрана
? «Имя мультииндексного файла» АТ 2,«имя тега» АТ 40
UU Задание строки заголовка
FOR nCount = 1 ТО 254
If !empty(tag(nCount)) && Проверка наличия тегоз
в мультииндексном файле
? CDX(nCount) АТ 3, TAG('AuthornCount) AT 40
Stic Вывод на экран имен файла и тегов
ELSE
EXIT &£с Выход, если мультииндексный файл пуст
ENDIF
ENDrOR
Контрольные вопросы
Что такое индекс?
Что такое индекс простой и индекс сложный?
Объясните разницу между уникальным и регулярным индексами.
Объясните разницу между одноиндексным и мультииндексным файлами.
Укажите особенности структурного мультииндексного файла.
Что такое тег?
Укажите два способа создания индекса.
Что значит индекс, построенный по возрастанию или по убыванию?
Укажите два способа открытия индексного файла. Как открыва структурный мультиндексный файл?
до. Что значит текущий индекс? Как сделать индекс текущим0 ц. Для каких целей используется перестройка индексных файлов? Какой командой выполняется перестройка индексных файлов?
Как удалить тег из мультииндексного файла?
Укажите команды для вывода на экран имен индексных файлов и имен индексов (тегов) внутри индексного файла.
Глава 4
УПРАВЛЕНИЕ БАЗАМИ ДАННЫХ
Как правило, база данных состоит из нескольких таблиц. Чтобы получить полную информацию об одной сущности, надо прочитать запись во всех таблицах базы данных. Между' таблицами могут бьггь установлены взаимосвязи (см. гл. 5), что существенно облегчает работу с такой базой данных. Нели таблицы разроэне-1 ны, то возникают дополнительные проблемы по управлению такими таблицами (совмещение курсоров, обеспечение достовср- I ности, представление данных и т. д.).
Базы данных могут содержать очень большой объем информации — до нескольких миллионов записей. На поиск нужных данных в таких таблицах уходит много времени. Поэтому предус- • мотрены специальные методы и команды для работы с базами данных.
Часто употребляемые опции команд foxpro
Приведенные ниже опции используются со многими командами. Эти опции определяют список имен полей, с которыми будет работать команда, количество рассматриваемых строк таблицы и порядок выполнения действий.
FIELDS — указывает на то, что команда при своей работе использует только тс поля, имена которых перечислены в списке.1 FOR и WHILE — указывают на то, что команда будет применена только к тем строкам таблицы, для которых истинны соответст-! вующие логические условия (<выр L>).
SCOPE — определяет записи по их физическому номеру, для которых будет применена команда. Сама опция (слово) SCOPE не пишется, а указываются уточняющие параметры:
ALL — команда действует на все записи таблицы. Параметр задан по умолчанию.
NEXT <число> — команда действует на заданное <число> записей, считая от текушей записи
RECORD <номер> — команда действует на запись с указанным номером. Параметр используется редко, так как трудно узнать физический номер записи.
REST — команда действует на все записи, начиная от текущей записи до конца таблицы.
NOOPTIMIZE — отключает использование технологии Rushmore для ускоренного доступа к данным.
При работе с большими базами данных до 90% времени тратится на обработку опций FOR и WHILE. При обнаружении этих опций автоматически подключается технология Rushmore, которая для своей работы использует индексы, построенные по полям, имена которых указаны в опциях FOR и WHILE. Поэтому технология Rushmore ускоряет доступ к данным при выполнении операций поиска.
Нельзя использовать технологию Rushmore при внесении изменений в поля текущего индекса, так как в этом случае редактирование нолей будет выполнено не для всех записей. Нет возможности указатьдля каких записей изменения внесены, а какие записи остались без изменения. Для отключения технологии Rushmore используют опцию NOOPTIMIZE.
Сортировка данных
Очень удобно организовать поиск и просмотр данных, если они отсортированы. Сортировка данных — это их упорядочение по значениям одного или нескольких полей. Упорядочение может быть выполнено как по возрастанию, так и но убыванию.
Если данные сортируют по возрастанию, то на первое место ставится запись, имеющая наименьшее значение по указанному полю (полям). На второе место — запись, имеющая следующее значение поля (полей) и так далее. На последнем месте будет запись, имеющая наибольшее значение указанного поля (или полей). Числовые поля сортируются от наименьшего числа до наибольшего, символьные поля — от первой буквы алфавита до последней буквы алфавита, поля дат — от наименьшей (наиболее ранней) даты до наибольшей (самой поздней) Даты.
При сортировке данных по убыванию размещение записей производится в обратном порядке, по отношению к предыдущему (по возрастанию).
В FoxPro сортировка производится следующими способами.
а. В соответствии с индексом.
Сначала индекс делают текущим, а затем выводят таблицу на экран или обновляют содержимое экрана. Если построен сложный индекс, то и сортировка будет выполнена по полям, входящим в индекс. Это наиболее удобный вид сортировки, так как для своего выполнения требует мало времени, не требует дополнительных затрат памяти и исключена потеря информации.
б. С помощью команды SORT.
В этом случае сортировку таблицы можно произвести но любому полю (или полям), даже если по указанному полю (или полям) нет индекса.
SORT ТО <имя файла> ON <имя поля 1> [/AJ I/O] 1/С]
[,<нмя ноля 2> [/A] [/D] (/С]... ]
[ASCENDING | DESCENDING]
[SCOPE1 [FOR <выр.Ы>]
[WHILE <вырХ2>]
[FIELDS <список имен иолей>]
[NOOPTIM1ZE1 Назначение опций.
<имя файла> — имя табличного файла (таблицы), который надо отсортировать.
ON ... — указывается одно или несколько полей, по значениям которых надо выполнить сортировку таблицы. Каждое поле может иметь уточняющие параметры:
/А — сортировка по возрастанию. Этот параметр принят по умолчанию.
/D — сортировка по убыванию.
/С — игнорирует значение регистра для символьных полей (строчные и прописные буквы считаются одинаковыми).
ASCENDING — задает сортировку по возрастанию только дщ полей, не имеющих параметров /А и /D.
pESCENDING — залает сортировку по убьшанию только для полей, не имеющих параметров /А и /D.
Назначение опций FOR, WHILE, SCOPE и NOOPTIMIZE см. в
FIELDS — в списке перечисляются имена полей, которые надо поместить во вновь создаваемый табличный файл. Если опция опушена, то в создаваемый файл помещаются все поля из исходного табличного файла.
При использовании этой команды на диске дополнительно сохраняется отсортированный файл, на построение которого требуется дополнительное время. Эта команда используется редко.
ПОИСК ДАННЫХ
В FoxPro предусмотрены две методики поиска данных: метод последовательного перебора, когда просматривается вся таблица от первой записи до последней, и метод деления пополам. Во втором случае поиск данных производится по полю текущего индекса. Таблица делится на две части пополам, берется средняя запись и значение поля текущего индекса сравнивается с искомым значением. Если значение поля индекса меньше, чем искомое значение, тогда поиск продолжается в нижней половине таблицы. (Если значение поля текущего индекса больше, чем искомое значение, то поиск продолжается в верхней половине таблицы.) Нижнюю половину таблицы делят пополам, сравнивают среднее значение поля индекса с искомым значением и гак далее, до тех пор пока не найдут нужное значение или не просмотрят всю таблицу. Дня каждой методики поиска предусмотрена своя команда.
4-3.1. Поиск методом полного перебора
Поиск производится по любому полю таблицы.
FOR [SCOPE] <услоаие повои» [WHILE <выр.1> J [NOOPITMIZE| Назначение опций.
^Условие поиска» — пишется имя поля для поиска значения, далее указывается один из логических знаков <,>,<=,>=,“ или и само искомое значение. Если искомое значение имеет сим-
ВДЗЕЗ{
Leokfor.
Oisuin»
15
HatcbCat*
Г”
HtiC'tlbfivitiV
red
Т~jw.ecAiouijf
Г*
f
f
Scope
Cexet
.
Гз!
Напасен
"Ж-
4.1. Поиск данных с помощью Главного меню.
вольный тип, то оно указывается в двойных кавычках. Если искомое значение имеет тип дата, то оно указывается в апострофах. И Если искомое значение имеет числовой тип, то выделять его зна! ка ми не требуется.
Назначение опций SCOPE, WHILE и NOOPTIMIZE см. в п. 4.1.
Если поиск закончился успешно, то курсор устанавливаете^ на найденную запись. Для того чтобы увидеть найденную запись, надо подать команду' DISPLAY или BROWSE. Для нахождения следующей записи, по тому же искомому значению, надо подать] команду CONTINUE. Если поиск закончился неудачно, то кур! сор устанавливается на последнюю запись и на экран выводит^Н сообщение: End of Locate Scope.
Этот поиск можно выполнить с помошью команды Главного меню
Table -» Go to Record -> Locate.
На экран выводится диалоговая панель Locate Record. Назн ;a- чение кнопок:
For — выводит на экран диалоговую панель для задания условия поиска.
Scope и While — выводят на экран диалоговые панели для задания ограничений количества просматриваемых записей.
В случае успешного и неуспешного поиска курсор принимаем соответствующее положение. Для нахождения следующей записи. соответствующей условию поиска, надо повторить эту процел дуру еще раз. Если по полю поиска построен индекс, то автоматически будет использоваться команда SEEK.
Поиск по полю текущего индекса
а. Поиск с помощью окна Command.
В этом случае надо воспользоваться одной из команд:
SEEK <искомое значенне>
FIND <искомое значеыне>
Для написания < искомого значения> используются те же символы выделения, что и в команде LOCATE. В случае удачного и не удачного поиска команда SEEK управляет курсором так же, как Я команда LOCATE. Так как курсор устанавливается на первую наШ
дсиную запись и записи отсортированы по полю поиска, то на экран желательно выводить несколько записей, начиная от текущей.
б. Поиск с помощью команды Г авногоменю.
Предварительно таблицу, в которой надо найти какое-либо значение, делают текущей. Затем из Главного меню подают команду Edit -> Find
На экран выводится диалоговая панель Find (рис. 4.1).
В поле ввода Look For вводится значение для поиска. Для поиска заданного значения просматриваются все поля всех записей подряд. При обнаружении первого значения запись делается текущей, то есть на нее устанавливается указатель (черный треугольник слева от первого поля).
Флажки в группе Options задают cneBvioiiiHe условия поиска:
Match Case — различение регистров. Прописные и строчные буквы считаются разными.
Wrap Around — круговой поиск. При тостижении конца таблицы поиск начинается заново с первой строки.
Match Whole Word — точное соответствие полному значению поиска При выключенном флажке значите поиска может входить как часть в найденное слово.
Search Backward — поиск в обратном направл нии (снизу вверх).
|
Name. Jam |
■ 1 |
Г 1 |
Зайцев |
|
. . ~ 2 |
Сергеев |
|
3 |
Клището___^ |
|
. 4 |
ibwcoe |
1 |
'5 |
Вальтер |
|
~6 |
Самсосе 1 |
|
7 |
Гуцалок |
1 |
... у |
Толоквмсямй |
J |
ЗЖогж
JI
Л&ьж
.
12;К<ур*аеим
Кнопка Find Next предназначена для нахождения следующего значения, удовлетворяющего условию поиска.
Фильтрация данных
В FoxPro определены два вида фильтров данных: фильтр для строк, когда ограничивается количество строк, предъявляемых на экран, и фильтр для полей, когда ограничивается количество ■ полей, отображаемых на экране и, следовательно, доступных для редактирования.
Ограничение на количество строк
Рели таблица большая (несколько сотен записей), то работать с ней неудобно. Поэтому производят фильтрацию данных, то есть выборку и предъявление на экран группы записей, отвечающих 1 определенным требованиям. С выборкой можно проводить все операции редактирования. По окончании работы с выборкой ис- I ходную таблицу восстанавливают в полном (первоначальном) виде.
Для установки фильтра данных используют команду
SET FILTER ТО <выр. 1>
В опции <выр. L> указывают имя поля и его значение, по которым надо выполнить фильтрацию. Для снятия фильтра и вое- 1 станоаления первоначального вида таблицы используют ту же команду, но без опции.
Ограничение на количество полей
Фильтрация полей применяется при работе с длинными записями, которые имеют длину более одного экрана. При редактировании таких записей на экран выводят те поля, в которые надо | внести изменения, и одно-два поля, идентифицирующих запись. Фильтрация полей выполняется в два этапа: на первом этапе определяется список полей, а на втором — фактическая установка фильтра.
Для определения списка полей используют команду:
SET FIELDS ТО [<список полей> | ALL [LIKE <наска> | EXCEPT <маска>11
После выполнения этой команды, из текущей таблицы дл* установки фильтра будут отобраны либо поля, имена которых 1
указаны в <списке полей>, либо все ноля. По умолчанию принята оппия ALL — все поля. Опция LIKE включает в список нолей рсс поля, имена которых удовлетворяют маске (шаблону). Опция EXCEPT включает в список полей все поля, имена которых не удовлетворяют маске (шаблону).
Если повторно подать эту же команду с другим <списком по- лей>, то вновь определенный список полей будет добавлен к существующему списку полей. Команда SET FIELDS ТО без опции закрывает все поля, открытые предыдущими командами SET FIELDS ТО.
Для установки фильтра полей используют команду SET FIELDS ON | OFF | LOCAL | GLOBAL.
Назначение опций:
ON — устанавливает фильтр для ранее определенных полей.
OFF — отменяет список полей и разрешает отображение всех полей таблицы. По умолчанию установлена опция OFF.
LOCAL — определяет, что для фильтра доступны только поля текущей таблицы.
GLOBAL — разрешает отображать поля всех таблиц, между которыми установлены реляционные отношения (установлены взаимосвязи). Об установлении отношений между таблицами см. гл. 5.
После выполнения команд, описанных в п. 4.4.1 и п. 4.4.2, команды DISPLAY и BROWSE будут выдавать на экран записи и поля в соответствии с установленными фильтрами.
4.5. Примеры
Пример 1. Поиск методом LOCATE.
Найти все записи в таблице Fam, которые в поле Name_fam с°Держат фамилию Цаплин и вывести на экран номера записей, Которые содержат эту фамилию.
CLOSE all Clear
SET DEFAULT TO E: \PRIMER ScSe Задание текущего
каталога
Fam IN 1 ALIAS fam && Открытие таблицы Fam
SELECT fam
^Порядковый
Пример
4.
Фильтрация
полей (столбцов), выводимых на экран.
При
выводе на экран окна Browse
для
таблицы Fam
предъявлять
только
поле (столбец) Name
fam.
[close
all
CLEAR
[SET
DEFAULT TO E:\PRIMER USE Fam IN 1 ALIAS fam SELECT fam SET ORDER TO
Name SET FIELDS TO Name_fam Browse
Sc&
Открытие
таблицы Far
1.
2.
3.
4.
5.
6.
7.
8.
STORE
О
ТО
Num
LOCATE
FOR Name_fam = 'Цаплин'
DO
WHILE FOUND( )
Num
= Num + 1
?
«Фамилия»
AT
2, Name_fam AT
15,
номер»
AT
30, Key_fam
AT
50
CONTINUE
ENDDO
В
цикле DO
WHILE
просматривается
вся таблица на наличие
в
ней повторений указанной фамилии.
Пример
2. Поиск
методом
SEEK.
CLOSE
ALL
CLEAR
SET
DEFAULT TO E:\PRIMER
USE
Fam IN 1 ALIAS fam && Открытие
таблицы
Fam
SELECT
fam
SET ORDER TO Name
SEEK 'Гоголь'
Browse
Нет
необходимости использовать цикл для
поиска одинако-
вых значений фамилий,
так как поиск ведется в отсортирован-
ном
массиве и все одинаковые фамилии, если
такие есть, будут
расположены друг
за другом.
Пример 3.
Фильтрация строк. д
Вывести
на экран все записи, содержащие в поле
Name_fam
значение
«Пушкин*.
CLOSE
ALL ’В
CLEAR 'И
SET
DEFAULT ТО
E:\PRIMER
USE
Fam IN 1 ALIAS fam && Открытие
таблицы
SELECT
fam
SET ORDER TO Name
SET FILTER TO Name_fam = 'Пушкин'
Browse
Укажите
два способа сортировки данных в
таблице.
Укажите
особенности применения команды SORT.
Для
какой части табличного файла можно
применить сортировку? Как задать часть
табличного файла, для которой надо
выполнить сортировку?
Укажите
два способа поиска данных в таблице.
Какими
особенностями обладает команда LOCATE?
Какими
особенностями обладает команда SEEK?
Что
значит фильтрация данных?
Как
задать ограним ше на количество строк
при фильтрации данных?
Как
задать ограничение на количество полей
табличного файла при фильтрации данных?
Для
восстановления первоначального вида
окна Browse
надо
подать команду SET
FILTER
ТО.
4.6. Контрольные вопросы
Глава 5
СОЗДАНИЕ ВЗАИМОСВЯЗЕЙ
В FoxPro допускается одновременная работа с несколькими таблицами. Версия Visual FoxPro 3.0 имеет возможность работать одновременно с 25 таблицами. При этом каждая таблица помсщ ется в свою рабочую область, и между таблицами могут быть у ста- новлсиы взаимосвязи. Указатели записей во взаимосвязанных таблицах будут двигаться синхронно. Таблица, в которой указатель перемещается произвольно, называется старшей. Таблица, в которой указатель перемещается в соответствии с перемещением указателя в старшей таблице, называется подчиненной или младшей. Если таблица имеет первичный индекс (ключ), то она может быть родительской. Если таблица имеет внешний индекс (ключ то она может быть дочерней. В один и тот же момент времени одна таблица может быть родительской по отношению к одной таблице, и дочерней — по отношению к другой таблице. Если н_ сколько записей из первой таблице по одинаковым значениям внешнего ключа ссылаются по единственному значению первич ного ключа на одну запись во вгорой таблице, то первая таблица будет дочерней, а вторая таблица — родительской. Другими словами: одна запись в родительской таблице порождает несколько записей в дочерней таблице.
Для установления взаимосвязи и родительская и дочерняя таблицы должны иметь хотя бы одно общее поле. Поле будет общим для старшей и младшей таблицы, если оно имеет:
одинаковое имя,
одинаковый тип,
одинаковый размер
в той и другой таблице. Допускается подключать к одной старшей таблице несколько младших таблиц. При этом для каждой пары таблиц должно быть свое общее поле. Возможен и частный случай, когда несколько таблиц объединяются по одному обш
Последомт*
льнов Параллельное
объединение
таблиц объединение таблиц
Рис.
5.1. Примеры объединения таблиц.
му полю. На практике встречаются три типа объединения таблиц. параллельное, последовательное и смешанное (рис. 5.1).
Перед установлением взаимосвязей между таблицами надо выполнить следующие условия:
все таблицы должны быть открыты, причем каждая в своей рабочей области;
все таблицы попарно должны иметь общее поле (хотя бы одно);
желательно, чтобы для общего поля и в старшей и в младшей таблице был построен индекс, но в одной таблице индекс должен быть построен обязательно.
Существует несколько подходов для установления взаимосвязи между таблицами:
конструкция SET RELATION ТО;
конструкция SET SKIP ТО;
команда JOIN;
команда UPDATE;
команда TOTAL;
переменные памяти.
В каждом конкретном случае, с целью повышения эффективности работы программы, используют тот или иной подход при Установлении взаимосвязей между таблицами. Переменные памяти позволяют сохранить значения полей таблиц даже после их закрытия. Переходя от одной таблицы к другой и сохраняя необходимые значения полей, можно обеспечить обработку любого количества таблиц.
Понятие рабочей области
Каждая таблица вместе со своими индексными файлами открывается в отдельной рабочей области. Количество рабочих областей зависит от версии FoxPro. Все рабочие области имеют порядковые номера. Например, от 1 до 25 для версии Visual FoxPro 3.0. Кроме того, первые десять рабочих областей имеет однобуквенные имена от А до J. Не все команды FoxPro могут обрабатывать I порядковые номера рабочих областей, поэтому при открь табличного файла рабочей области можно присвоить псевдоним (ALIAS). Псевдоним пишется буквами латинского алфавита, причем первый символ обязательно булева, а последующие сш лы могут бьпъ и буквами, и цифрами, допускается и символ подчеркивания. Пробелы при составлении псевдонима не допустимы. Желательно в качестве псевдонима использовать осмысленное сочетание из трех-четырех букв. Более длинные псевдонимы желательно не использовать, так как при написании программных кодов обращение к таблицам производится по псевдонимам рабочих областей, в которых они открыты. При открытии таблиц не обязательно соблюдать строгую нумерацию рабочих областей.
В любой момент времени может быть открыто много рабочих областей, но только одна рабочая область будет текущей или активной. Для назначения текущей рабочей области используют команду
SELECT <вомер рабочей области | псевдоним рабочей областм>
Для доступа к полям таблицы используются префиксы. Для текущей рабочей области префиксом является точка. Для пассивных рабочих областей префиксом является конструкция из двух символов -> минуса и знака больше. Для старших версий FoxPro, начиная с 3.0, допускается использование точки как одного префикса для всех рабочих областей. При обращении к какому-либо полю следует указать псевдоним рабочей области, в которой открыта таблица, затем префикс и потом имя нужного^ поля.
Организация взаимосвязи «один-к-одному»
При установлении взаимосвязи, как правило, в родительской таблице берут первичный ключ, а в дочерней таблице — внешний ключ. Причем эти оба ключа являются общим полем. Текущей делают ту рабочую область, где находится дочерняя таблица, и с помощью команды SET RELATION ТО к дочерней таблице подключают одну' или несколько родительских таблиц, открытых в пассивных рабочих областях.
формат команды:
SET RELATION ТО [<выр.1> INTO Спссвдовим рабочей области 1> ]
[, <выр.2> INTO Спсевдоним рабочей области 2> ]
[...]
[ADDITIVE]
Назначение опций:
<выр.1Хвыр.2>... — имена общих полей между дочерней таблицей и несколькими родительскими таблицами.
INTO <псевдоним> — псевдонимы пассивных рабочих областей, где открыты соответствующие родительские таблицы.
ADDITIVE—добавляет вновь созданные взаимосвязи к уже имеющимся взаимосвязям. По умолчанию ранее установленные взаимосвязи разрываются.
Даже если в дочерней таблице общим полем является внешний ключ типа Regular и имеется несколько записей с одинаковым значением внешнего ключа, на экран будет выводиться только одна запись из дочерней таблицы, так как установлен тал взаимосвязи «один-к-одному».
Для разрыва всех взаимосвязей «один-к-одному» активной таблицы надо подать команду SET REIATION ТО без опций.
Если надо разорвать одну конкретную взаимосвязь между активной (дочерней) таблицей и пассивной (родительской) табличен, то следует подать команду
SET RELATIONS OFF INTO Спсевдоним рабочей областн> |
<иомер рабочей областн>.
Установление взаимосвязи «один-ко-многим»
Взаимосвязь «один-ко-многим» устанавливается «поверх* взаимосвязи «один-к-одному*, то есть сначала устанавливают между
таблицами взаимосвязь «один-к-одному*, а затем подают команду:
SET SKIP ТО [<пседаоцнм рабочей области 1>
[, <псевдоним рабочей области 2> ]... ]
После выполнения этой команды на экран будет выводиться для одной записи из родительской таблицы несколько записей из дочерней таблицы.
Для удаления всех взаимосвязей «один-ко-многим» надо подать команду SET SKIP ТО без опций.
Установление взаимосвязей с помощью главного меню
Если имеется ротационная база данных, то установить взаимосвязи между таблицами можно с помощью команд Главного меню. Для этого предварительно в каждой таблице строят первичный ключ и внешние ключи. Затем выводят на экран диалоговую панель Tabic Designer. Потом курсор мыши размещают на имени первичного ключа родительской таблицы (например индекс «Street» таблицы «Street») и буксируют его внутрь дочерней таблицы, устанавливая на имя соответствующего внешнего ключа (например, индекс «Street* таблицы «Author»). Во время буксировки курсор мыши дважды меняет свою форму. По окончании буксировки на экран выводится диалоговая панель Edit Relationship, где надо проверить, а при необходимости и уточнить, параметры взаимосвязи (рис. 5.2).
Edit
Relations Ыр
Eo
,
t .. .
.у,-: ....
Table,
street
Belated
T еЫе
customer
Щ
street
J
| street
3
Relationship
Type One Tо
Many
[ml
Cancel
| Help |
Рис.
5.2. Параметры
взаимосвязи.
PEIE*
О
Fields
key_ecnt
key_cust
key_docim
date_acnl
pmoti
key_sti«t
'■*■! гитв_Лев
^
okrug GRlndexes:
Ysbeet
rvame
^
|
|
3 |
Yautoi |
A |
|
fam |
|
|
im |
y\ |
|
ot |
|
|
town |
|
$ |
slieet |
J |
|
book |
3 |
"a V /Д |
|
|
|
customer |
2 |
|
: fcuit town |
* I |
|
stieet fam im ot |
и rH |
|
у-.-
/.Vr',!
V . . . .... ■ > •>
Рис. 5.3. Установление взаимосвязи между таблицами.
После нажатия кнопки Ok на экран выводится диалоговая панель Database Designer, между именами соответствующих индексов автоматически прорисовывается прямая линия. Со стороны «один» линия начинается с символа «+*>, а со стороны «много» — с символа «->* (рис. 5.3). Обратная буксировка (от дочерней таблицы к родительской) не допустима.
Тип взаимосвязи между таблицами устанавливается автоматически, в зависимости от типа индексов. Если оба индекса (в родительской таблице и дочерней таблице) уникальные, то возникает тип взаимосвязи «один-к-одному». Если в родительской таблице индекс уникальный, а в дочерней таблице индекс регулярный, то получается тип взаимосвязи «один-ко-многим*.
Чтобы редактировать существующую взаимосвязь, надо вызвать на экран диалоговую панель Edit Relationship. Для этого на- Д° курсор мыши установить на линию взаимосвязи и щелкнуть Левой кнопкой мыши, при этом линия взаимосвязи утолщается.
ПЫиеглЬд*
Inlejpity
j
-Paiom Table 'ChUd Tabt» ' Ooloip Ьн«п
Riil9C'VUpd«»r3
Puh<
ifi
hoWnfl
Bfr
D
rasjij"-"»
Restrict
tmm Cascade mrm
CmckJo
ignore Ignore
jlytOTO
Jpwra
»ir rjyxTtv
Ru-esfer
fleolng
Which
tulc do you waid to apply when a lecoid In the parent (able It
dalotod?
*
&In
the rtiilrt table fiearict
Prohibit the deloiinn II there are related reroute In the child
table. Jiyore: Allow the deletion and
leave I elated recoids In the child table alone.
OK
Help
Рис. 5.4. Задание условий ссылочной целостности.
Затем правой кнопкой мыши на экран вызывают контекстное меню, из которого выбирают команду Edit Relationship.
Для удаления взаимосвязи ее надо предварительно выделить, а затем нажать клавишу Del.
Одним из главных условий создания базы ддцных является обеспечите условий ссылочной целостности. Выполнение этих условий гарантирует помещение в базу данных только достоверной информации. Ссылочная целостность обеспечивается механизмом каскадных воздействий: каскадное удаление и каскадное редактирование ключевых полей. Каскадное удаление — это одновременное удаление записи из родительской таблицы с удалением соответствующих записей из всех дочерних таблиц. Удаление записи из дочерней таблицы не влечет за собой удаления соответствующей записи из родительской таблицы. Аналогично, при изменении зна- че»тя поля (полей) первичного ключа, необходимо изменить значение соответствую!него поля (полей) внешнего ключа дочерней таблицы (или таб.шц), то есть каскадное редактирование.
Для установления каскадных воздействий надо выделить линию взаимосвязи щелчком левой кнопки мыши и вызвать на экран контекстное меню, щелкнув правой кнопки мыши, когда курсор удерживается на линии связи. В появившемся на экране контекстном меню надо выбрать команду Referential Integnty. На экран выводится диалоговая панель Referential Integrity Builder (рис. 5.4).
В верхней части диалоговой панели Referential Integrity имеются графы:
Parent Table — содержит имена родительских таблиц. Указателем (черным треугольником) отмечена текущая родительская таблица
Child Table — содержит имена дочерних таблиц, которые могут быть соединены с соответствующим и родительскими таблицами.
Update — содержит один из возможных типов каскадных воздействий при редактировании поля (полей) первичного ключа у соответствующей пары таблиц (имена таблиц указаны в левых графах).
Delete — содержит один из возможных типов каскадных воздействий при удалении записи из родительской таблицы.
Insert — содержит один из возможных типов каскадных воздействий при вставке записи в родительскую таблицу.
Parent Tag — содержит имя тега в родительской таблице. В графе справа (Child Tag) будет указано имя соответствующего тега дочерней таблицы.
Child Tag — содержит имя тега в дочерней таблице. В графе слева (Parent Tag), будет указано имя соответствующего тега родительской таблицы.
Установить соответствующий тип каскадных воздействий можно либо в верхней части диалоговой панели, либо в шгжней части диалоговой панели.
В верхней части диалоговой панели в одной из граф Update, Delete или Insert курсором мыши выделяют нужное поле (клетку). В поле появляется кнопка раскрывающегося списка, в котором можно выбрать одно из значений:
Cascade — при изменении значения поля (полей) первичного ключа или альтернативного ключа (Candidate) в родительской таблице автоматически выполняется каскадное изменение значения соответствующего поля (полей) внешнего ключа дочерней таблицы (таблиц).
Restrict — запрещает изменение значения поля (полей) первичного или альтернативного ключа в родительской таблице, если в Дочерней таблице (таблицах) имеются соответствующие значения во внешнем ключе.
Ignore — допускаются любые изменения в значениях первичного и альтернативного ключей в родительской таблице. Условия ссылочной целостности не контролируются.
Аналогично работают с графами Delete и Insert, но для графы Insert возможны только два воздействия: Restrict и Ignore.
В нижней части диалоговой панели имеются три вкладки:
Rules lor Updating — управление каскадным редактированием записей;
Rules for Deleting — управление каскадным удалением записей; Rules for Inserting — управление каскадным добавлением записей.
Тип воздействия Cascade, Restrict и Ignore устанавливается с помощью соответствующей радиокнопки.
Объединение двух табличных файлов в один файл
В некоторых случаях требуется информацию из разных таблиц свести в одну таблицу. Одна таблица размешается в активной рабочей области, а вторая таблица — в пассивной области. В результате объединения будет получен новый (третий) табличный файл, который будет записан по указанному адресу. В состав нового (третьего) табличного файла могут быть включены любые поля из двух объединяемых таблиц. Для этих целей используют команду:
JOIN WITH <псевдоним пассивной рабочей области>
ТО <нмя создаваемого файла>
(FOR <выр. L> I
[FIELDS Сспнсок имен полей> ]
[NOOPTIMIZE]
В опции FIELDS указываются имена полей как из активной рабочей области, так и из пассивной рабочей области. Если опция FIELDS опущена, то в создаваемый файл записываются все поля обеих таблиц.
Отметим особенности выполнения команды:
• Если в пассивной таблице нет записи с каким-либо значением общего поля, а в активной таблице такое значение общего поля имеется, то запись из активной рабочей таблицы не помещается в результирующую таблицу.
• Если в активной или пассивной таблице имеются записи с дублирующим значением общего поля, то в результирующий файл помещаются все найденные записи.
Корректировка данных в связанных таблицах
Иногда бывает нужно внести большое количество изменений в одну таблицу используя данные из другой таблицы. Для этого корректируемую таблицу надо поместить в активную рабочую область, а таблицу-источник для исправления данных — в пассивную рабочую область. Для этих целей предусмотрена команда:
UPDATE ON <кмя общего поля>,
FROM < псевдоним пассивной рабочей областн>
REPLACE <имя поля 1 в активной рабочей обласпО WITH <выражепне 1> [, <нмя поля 2 в активной рабочей областн> WITH <выражсиие 2>... ] [RANDOM]
Назначение опций.
ON — указывается имя общего поля. Причем обе таблицы должны быть проиндексированы по этому полю в порядке возрастания. FROM — указывается псевдоним пассивной рабочей области, в которую помещается таблица-источник данных корректировки. REPLACE — указывается имя поля в активной таблицы, куда надо внести изменения в соответствии с <выражением>, указанным в опции WITH и составленным по значениям полей пассивной таблицы.
К недостаткам этой команды следует отнести отсутствие контроля на достоверность данных после внесения изменений. Для обеспечения достоверности должны быть предприняты дополнительные меры.
Создание итогового табличного файла
При создании отчетов необходимо иметь итоговые суммы по некоторым числовым столбцам (полям). Команда TOTAL создает Итоговый табличный файл, содержащий суммы по указанным Полям. Предварительно табличный файл должен быть отсортирован по ключевому полю. При работе команды подсчитывается сУММа по указанным числовым полям, поля других типов копируются в итоговый файл.
Содержание
некоторых таблиц приведено на рис.
5.6.
гнжолао
4[Дрдц»
5jB«T£g>
SjCortX*
КТ
стеной StHgrvti
*П*Ю_
101Алгл«0
10;
Л«щнн
И[Стсп*1
11СвЙ^Ю5^
]2аЭ*у^эеьм
13
Aneru*rw#<
5Мыи»ж
13!Мс*<вй
UPiWb
1S
Аэс«е
I^UarwT
}*7>Ь(/1(И1
Рис.
5.5. Взаимосвязи между
таблицами.
Формат
команды:
TOTAL ON <имя ключевого поля> ТО <имя итогового файла> [SCOPE]
[FIELDS <список имен полей> ]
[FOR <вырХ1> J [WHILE <BUp.L2> ]
[NOOPTIMLZEJ
Назначение опций этой команды описано в п. 4.1.
Примеры
Родительская тяйица |
Дочерняя тябляцв |
|
|||
Имя |
Первичный кмоч |
Имя |
Внешпяй кооч |
||
Fain |
Key Jam |
Author Key Jam Ca og Customer Salesman Sale Sale |
Key Jam Key fam Key fam Key fem_sk Keyjam.cs |
||
Im |
Kcy_im |
Author Catalog Customer Salesman Sale Sale |
Key.im Key_im Keyjm Key_im Key im sk Kcy_im_cs |
||
Ot |
Key_ot |
Author Catalog Customer Salesman Sale |
Key ot Key Ot Key ot Key_ot Key_ot_sk |
||
Town |
Key_town |
Author Customer |
Key town Keyjcwn |
||
Street |
Keyjrcet |
Author Customer |
Key_strcct Key_strect |
||
Customer |
Key_cust |
Account Older |
Key cust Key_cust |
||
Catalog |
Key_book |
Author Sale Order |
Key book Key~book Key“book |
||
Salesman Account Sale |
Key salmn Key_acnt Key_docum |
Order Sale Order Order |
Key salmn Key acnt Key_acnt Key docum |
рис. 5.6. Содержание таблиц Fam, lm, Ot и Catalog.
При таком расположении данных в таблицах достаточно ^УДно определить, какому автору принадлежит та или иная кни- ^ Для облегчения просмотра и одновременного редактирования Четырех таблиц можно свести в одно окно Browse либо все поля Вссх таблиц, либо некоторые поля всех таблиц.
Пример 1. Вывести в окно Browse информацию об авторах 11 их книгах.
Для этого надо взять четыре таблицы: Fam, Im, Ot и Catalog, установить между ними взаимосвязи и результат вывести в окно
Browse. J
&&
Закрытие
всех файлов &&
Задание
рабочего каталога
CLOSE
ALL
SET
DEFA TO E:\PRIMER
USE Catalog.dbf IN 6 ALIAS ctl INDEX catalog;
ORDER TAG tag(2)
USE Fan.dbf IN 10 ALIAS Earn INDEX fam ORDER TAG Name USE Im.dbf IN 11 ALIAS im INDEX im ORDER TAG tag(l) j USE Ct.dbf IN 12 ALIAS ot INDEX ot ORDER TAG Ot SELE Ctl
SET RELATION TO Key_im INTO im, key_ot INTO ot StLECT fam
SET RELATION TO Key_fam INTO ctl SET SKIP TO ctl
BROWSE FIELDS fam.name_fam, im.name_im, ot.name_.ot,? Ctl.name_book
Результат выполнения этой программы приведен на рис. 5.7. На рис. 5.7 видно, что издано несколько книгавторов Гоголя Н. В. и Пушкина А. С., авторы Короленко В. Г. и Куш М. С. имеют по одному изданию. В поле Name_fam взаимосвязь «один-ко-многим» отображена многоточием.
Особое внимание следует обратить на назначение текуШИ* индексов. Для таблиц Fam, Im и Ot текущими индексами буду! первичные ключи. Для таблицы Catalog текущим индексом будет внешний ключ Fam, так как эту таблицу надо просматривать по полю Key_fam и выбирать фамилии соответствующие указанному внешнему ключу.
В командах USE часть текущих индексов задана именами тегов, а часть — функциями TAG, возвращающими имя тега по его порядковому номеру.
Haeeja*
Навс
»
ч i
Namebnofc
If
■"бвммамж
1
.. !
Гогопь
—— —
.ИиколвЛ
[Восмпьвяич iBacmimbwi
Р»оср
Мертвые
inmWloH [йжоый
Вкипьеы*
Вемогм
к» еуорв 6*о Джяыо! тйзеесш
Г
шок
1
— Ш
Двоамв ;
[iwm
'Сергею*
гНюы»влст»*е
«мет
"*Е-орсв
ЗаРисо
I
СпиЛЖО
клбмв
J
'
- f —
-
, , 1
Коржааж
J
дГКсрзшехо
блапжк!
Тмектмэпсеи!
Г
OOCCTV
у
рвсолэсч I
Щ
Kyi
Моисей
Cewew
;Твлвт>в^вчв>»овго1Ий.зает»
Угееи. j
НТЛосвв
_ '
Д
Нагл
A.
Her .
. I
н
Я
Пулкж
Аяеясдчи)
Сергеевич
Иэбрв«<е
Я
Апгнсачи> 1
Сергеев»н
Евг*»*Л
Окт
3
_ 2Zj
Сергеев»*
Пцж»
Сергеевич
1ео“
Jr.l
Рис.
5.7. Результат выполнения программы
примера 1.
Пример 2. Свести в одну постоянную таблицу поля Fam.Name_fam, Im.Name_im, Ot.Namc_ot и Ctl.Name_book. CLOSE ALL && Закрытие всех файлов
SET DEFA TO E:\PRIMER && Задание рабочего каталога
USE Catalog.dbf IN 6 ALIAS ctl INDEX catalog;
ORDER TAG Fam
USE Fam.dbf IN 10 ALIAS fam INDEX fam ORDER TAG Name USE Im.dbf IN 11 ALIAS im INDEX im ORDER TAG Im USE Ot .dbf IN 12 ALIAS ot INDEX Ot ORDER TAG ot SELECT ctl
J0IN WITH fam TO Summa.dbf;
POR ctl.Key_fam= fam.Key_f am;
FIELDS ctl.Name_book, fam.Name_fam, ctl.Key_im, CU1.Key_ot
l'SE summa.dbf IN 13 ALIAS Sum SELECT sum
JOIN WITH Im TO Summal FOR im.Key_im=sum.Key_im; fields sum.Name_fam, im.Name_im, sum.Key_ot
*Л
WCHMW4
;м»е*а„
^Нииччй_
Нкммй
Сякуитм ;Т«пяжцт»
вовдхс«гддж.з»«»ра
В<силм»м |Р«оср
Мергаыадуш
BacMO»»w IflwuMf
«уоробоо
Дням»
Bannwew
~
[Повести
{к^ражм
Йй
[Гогоя*
Гога
л_
П
хил*
|А«*е*«р _
Щ_|Гужж ^Аяв(с»йв
Г
jau«i A/«mkl3 [Ctprewns
<ui«c*cs ____[с^)геееи< ^П(юм
Коtiw« Впяои^^
>Г»п<Л
.Ншолай
\tn
Iixopwtw
-MgaHKis
ЯвЦЛвМЧ
ЦрЫЫЖИ» СКИ»1
Рис.
5.8.
Результат выполнения
программы примера
2.
Результат
выполнения программы представлен на
рис. 5.8
После
выполнения программы примера 2 в каталог
PRIMER
будет
добавлено три новых табличных факта —
Summa,
Summal
и
Summa2.
Пример
3. Подсчитать сумму каждого заказа и
обший
объем
проданных книг в натуральном и денежном
выражении.
В
таблице Order
имеются
сведения о наименовании проданной
книги (Key_book),
о
количестве экземпляров каждого
наименования книг (Volume)
и
предоставленной торговой скидке. ИШ
таблиц Fam,
Im
и
Ot
надо
подставить (по ключам) фактические
значения фамилии, имени и отчества
автора книги, и из таблицы Catalog
подставить
фактическое название книги.
sum.Name_book,
USE
Summal.dbf
IN 14 ALIAS Suml SELECT suml
JOIN
WITH Ot TO Summa2 FOR ot.Key_ot=suml.Key_ot; FIELDS suml.Name_f
am, suml.Name_im, ot.Name_ot,;
suml.Name_book
USE
Summa2.dbf IN 15 ALIAS Sum2 SELECT sum2 BROWSE
CLOSE
ALL &&
Закрытие всех файлов
SET
DEFA
ТО
Е:\PRIMER &&
Задание рабочего каталога
USE
Order.dbf IN 5 ALIAS ord INDEX order;
ORDER
TAG Book USE Catalog.dbf IN 6 ALIAS ctl INDEX catalog;
ORDER
TAG Fam USE Fam.dbf IN 10 ALIAS fam INDEX fan;
ORDER
TAG Name USE Im.dbf IN 11 ALIAS im INDEX im;
ORDER
TAG Zm
USE
Ot .dbf IN 12 ALIAS Ot INDEX ot;
ORDER
TAG ot
SELE
ctl
SET
RELATION TO Key_im INTO im, key_ot INTO ot,; Key_book INTO ord
SELECT
fam
SET
RELATION TO Key_fam INTO ctl SET SKIP TO ctl
BROWSE
FIELDS «Автор»
=
ALLTRIM[fam.name_fam)
+;
'
+ ALLTRIM(im.name_im) + ;
'
+ ALLTRIM(ot.name_ot), ; ct1.name_book :H=«Наименование»
:
4 0,; ord.volume :Н=«Кол-во»,
ctl.price
:Н=«Цена»,
;
ord.proc :H-«Скидка»,;
«Сумма»
=
ord.volume*ctl.price*(100-ord.proc)/100;
NOWAIT
CLEAR
SELECT
fam
SET
ORDER TO name
m=o
n2=o
1)0
while
.T. lF
eof( )
EXIT
ENDIF
nl = r.l + ord. volume
n2 = n2 + ord.volume*ctl.price*(100-ord.proc)/100
SKIP
ENDDO
? «Объем продаж», nl, «книг»
? «Общая сумма продаж», п2
В окно Browse помещены два вычисляемых (виртуальных) поля:
фамилия, имя и отчество автора:
«Аз сер» = ALLTRIM (fam. rsane_f am) + ' * + ALLTRTM (im. na.roe_iin> j,
+ ' ' + ALLTRIM(ot.name_ot), ;
сумма проданных книг, указанного автора, с учетом торговой скидки:
«Сумма» = ord.volume*ctl.price*(100-ord.proc)/100 -И
Если торговая скидка не предоставляется (т. е. торгов^™ скидка составляет 0%), то сумма покупки все равно рассчитывается по той же формуле (для книги Пушкин А. С. «Избранное»).
С помощью цикла DO WHILE рассчитывается общее коли ство проданных экземпляров книг и общая сумма всех прод Результат вычислений выводится в окно Visual FoxPro. Чтс увидеть результат расчета вместе с окном Browse, надо в кома: BROWSE предусмотреть опцию NOWAIT.
Результат выполнения программы представлен на рис. 5.9.
Пример
4. Подсчитать количество проданных книг
каждому клиенту можно также с помощью
команды TOTAL,
при этом в файл проекта добавляется
новый табличный файл- Для подсчета общей
суммы от продажи всех книг также придется
использовать
никл (в программе цикл не показан). На
рис. 5.10 вверху показана исходная таблица
Order, из которой видно, что
клиент 1 (поле Key_cusl)
сделал два заказа (поле Keyorder)
на 200 и 100 экземпляров, внизу показана
итоговая таблица ReA 9
которой
подсчитано количество проданных
экземпляров книг по
пред»* S0C КИИ-
Of
щая
спш» продаж 46SjCOOO
В1«!П
I
оро Гдл»пск» Пометы
и
р*джмы
(здМениб
Семулоеич^ }Тс*счв*«*
гчо^ иго*» алегра
Ле»* _ 1
(100X1
Нитамсс*
ооох
rv^i*^ Дао» миф Ccpr cot^ &w* r-Wf Ссргсш* Саносюе Ocrcce
Obfafyy*
■iur^
! UctNwwoTapjcrp^opfcO^ ;Иэйрато»
.Трдгоы** Ссктц
Рис. 5.9. Результат выполнения программы примера 3.
каждому клиенту. Чтобы подсчитать количество проданных экземпляров книг по каждому клиенту, надо индекс, построенный по нолю Key cust, сделать текущим.
CLOSE ALL ScSc Закрытие всех файлов
SET DEFA ТО E:\PRIMER && Задание рабочего каталога
USE Order.dbf IN 5 ALIAS ord INDEX order;
ORDER TAG Book
SELECT ord
SET ORDER TO TAG tag(2)
TOTAL TO rez ON Key_cust FIELDS volume USE rez.dbf IN 1 ALIAS rez SELE rez
Key_oider|
ICcf_cu»t
HDf
2 3‘ 200 5 00 31
...
Рис. 5.10. Вверху — исходная таблица Customer, внизу — результат работы команды TOTAL (таблица Rez). В таблице Rez посчитан итог по первому клиенту (Key_cust = 1), поэтому количество строк уменьшилось на 1.
Контрольные вопросы
По какому признаку определяются родительская таблица и дочерняя таблица?
Что такое общее поле? Какими свойствами обладает общее поле?.
Назовите три типа объединения таблиц.
Пер числите действия, которые необходимо выполнить перед установлением взаимосвязи между таблицами.
Назовите шесть подходов установления взаимосвязи между таблицами.
Какое назначение и какие особенности работы команды JOIN9
Какое назначение н какие особенности работы команды UPDATE7
Какое назначение и какие особенности работы команды TOTAL?
Какое назначение и какие особенности работы команды SET RELATION ТО?
jO. Какое назначение и какие особенности работы команды SET SKIP ТО?
Что такое рабочая область и каково максимальное количество рабочих областей?
Как присваиваются имена и номера рабочим областям?
Укажите назначение алиаса рабочей области.
Объясните понятие текущей рабочей области. Как установить текущую рабочую область ?
Укажите направление установления взаимосвязи «один-к-одному».
Объясните понятие «ссылочная целостность».
|7. Объясните понятие «каскадное воздействие».
Что такое каскадное изменение?
Что такое каскадное удаление?
Как установить ссылочную целостность между таблицами?
Как задать каскадные воздействия между таблицами?
Глава 6
РАБОТА С ПРОГРАММНЫМИ ФАЙЛАМИ
При работе с базой данных часто бывает необходимо при каждом новом запуске представлять на экране одну и ту же базу данных в различных вариантах. Процесс конфигурирования базы данных достаточно длительный. Для облегчения этого процесса используют программные файлы. В каждом программном файле записывают и сохраняют на диске один из вариантов конфигурации базы данных. Впоследствии, запуская программный файл на выполнение, получают желаемую конфигурацию базы данных.
Создание программного файла
Программный файл создается с помощью встроенного текстового редактора FoxPro. Текстовый редактор можно запустить как из окна Command, так и из Главного меню.
а.Чтобы запустить текстовый редактор из окна Command, в этом окне надо задать команду:
MODIFY COMMAND | FILE [<имя файла> | ?]
[NOEDIT]
[NOMENU]
[NOWAIT]
[RANGE <Bbip.NI>, <nbip.N2>]
[[WINDOW <нмя окна 1>]
[IN [WINDOW'] <имя окна 2> | IN SCREEN ]
[SAME]
[SAVE]
Ключевое слово COMMAND предназначено как для создания нового программного файла (имя файла не указывается) с расширением .pig, так и для открытия уже существующего файл® (имя файла указывается либо полностью, либо частично — п° шаблону).
Ключевое слово FILE предназначено только для открытия существующего программного файла, причем имя файла надо указывать полностью.
Если имя файла не известно, то вместо имени файла можно указать символ «?* и на экран будут выведен список имен программных файлов (с расширением .prg), где можно выбрать имя нужного файла.
Назначение опций:
NOEDIT — разрешает просмотр текста, но редактирование текста запрещено;
NOMENU — запрещает вызов системного меню окна редактирования, то есть блокирует клавишу F10 и кнопку в левом верхнем углу окна редактирования.
NOWAIT — после открытия окна редактирования разрешает работу (без пауз) программы, вызвавшей открытие окна редактирования. В противном случае работа программы прерывается до закрытия окна редактирования
RANGE <выр.М1>, <Bbip.N2> — при работе с Мето-иолем позволяет выбрать часть текста в указанном интервале от <выр.Ы1> до <выр.Ы2>.
WINDOW <нмя окна 1> — открывает окно редактирования с характеристиками другого предварительно открытого окна <имя окна 1>.
IN WINDOW <имя окна 2> — открывает окно редактирования внутри окна <имяокна2>.
IN SCREEN — опция задана по умолчанию. Открывает окно редактирования внутри главного окна FoxPro.
SAME — если текст программы, текст документа или Мето-поде Уже открыты, то запрещает новое редактирование в окне редактора.
SAVE — опция используется только в программах и сохраняет на экране образ окна редактирования после его закрытия.
Пример:
MODI COMM f* && открывает все файлы с расширением .ргд, имена которых начинаются с буквы f
MODI COMM * && открывает все программные файлы
с расширением .ргд.
В том и другом случае каждый программный файл открывается в отдельном окне. Ненужные окна закрываются либо клавишей Esc, либо щелчком мыши на кнопке в правом верхнем углу окна.
Встроенный редактор FoxPro предназначен также для вывода на экран и редактирования Memo-полей, которые открываются с помощью команды Ctrl + Home, и текстовых файлов, имена которых указаны в тексте программного файла с целью их дальнейшего вывода на печать.
б. Для создания нового программного файла из Главного меню надо подать команду':
File —► Ne%v -> выбрать расширение .prg (или Program).
Для открытия уже существующего программного файла надо подать команду:
File -> Open -> указать имя нужного программного файла.
В том и другом случае написание и редактирование текста программного файла производится по правилам текстовых редакторов.
Запуск программного файла
Выполнить программный файл можно либо из окна Command с помощью команды DO <имя программного файла>, либо с помощью команды Главного меню:
PROGRAM -> DO -> указать в списке имя программного файла,
либо нажав в графическом меню кнопку, на которой изображен восклицательный знак.
Остановить выполнение программного файла можно нажатием клавиши Esc, если в тексте программного файла указа!» команда SET ESCAPE ON.
Во многих версиях FoxPro эта команда указана по умолчанию- В Visual FoxPro после нажатия клавиши Esc, на экран выводится диалоговая панель с тремя кнопками:
Caned — выполнение программы прерывается.
Suspend — выполнение программы приостанавливается до подачи команды RESUME.
Ignore — продолжить выполнение программы.
В уже отлаженных и хорошо работающих программах можно заблокировать нажатие клавиши Escape с помощью команды SET ESCAPE OFF.
Модульность программ
Программный продукт включает в себя внешние и внутренние процедуры, которые оформляются как отдельные модули. Модульное построение программного продукта позволяет повысить его наглядность и унифицировать часто повторяющиеся операции, сокращает время написашш и отладки программ. При выполнении программных кодов, если FoxPro встречает обращение к подпрограмме (модулю), то он ищет текст модуля в следующей последовательности:
в текущей процедуре;
в процедурном файле;
снизу вверх в старших процедурах;
на диске в виде отдельной программы.
Внешние процедуры
Внешней процедурой называется некоторая последовательность Команд, которые выполняют определсшюе и законченное действие по обработке данных. Внешняя процедура (или несколько Процедур) хранятся в отдельном файле на диске. Приложение мо- *ет содержать несколько процедурных файлов, но подключен (активен) всегда только один процедурный файл. Подключение Процедурного файла производится командой:
SET PROCEDURE ТО [<имя процедурного файла>]
Команда без опции закрывает процедурный файл.
I
Вызов внешней процедуры Формат команды:
DO <нмя программного файла внешней процсдуры>
[ WITH <снисок параметров> 1 [ IN <нмя файла>)
Назначение опций WITH Ссписок параметров — содержит список входных и выходных параметров. В качестве входных и выходных нарамет-1 ров допускается использование переменных, констант и выражений.
IN <имя файла> — явно указывает место хранения программного файла и используется вместо предварительно подаваемой команды SET PROCEDURE.
Команда DO выполняет указанную программу. Если указанная программа не откомпилирована или в нее были внесены изменения, то она автоматически компилирует указанную про-1 грамму, а затем се выполняет.
Если в <имени программного файла> опущено расширение, то расширения будут просматриваться в следующем порядке: .ехе. .арр, .£хр, .prg.
Команда описания заголовка процедуры Формат команды:
PROCEDURE <нмя процелуры>
В качестве имени процедуры используется уникальный набор букв латинского алфавита. Допускается использование цифр, но первым символом должна быть буква.
Команда восприятия параметров Формат команды:
PARAMETERS Ссписок параметров
Эта команда позволяет передать процедуре значения переменных из командной строки или из вызывающей программы. Она пишется сразу после заголовка процедуры и содержит такое Ж®
количество параметров и того же типа, что и в команде DO, вызывающей данную процедуру.
Команда окончания процедуры формат команды:
RETURN [ТО MASTER | ТО <имяпроцедуры> | <выр>]
Команда RETURN без опций завершает выполнение процедуры и передает управление следующему по порядку оператору
Команда RETURN ТО MASTER завершает выполнение процедуры и выполняет переход к самому верхнему уровню вызывающих процедур, передавая управление следующему по порядку оператору.
Команда RETURN ТО <имя процедуры> завершает выполнение процедуры и выполняет переход к процедуре с указанным именем, передавая управление следующему по порядку оператору.
<выр> содержит последний выполняемый оператор в теле процедуры. Такой способ окончания процедуры используется в процедурах-функциях для передачи последнего вычисленного значения.
Команда возврата RENTRY
Команда позволяет вернуться на ту команду, которая вызвала текущую процедуру, т. е. циклическая ссылка Иногда работой алгоритма предусмотрен многократный вызов одной и той же процедуры, но всегда надо предусмотреть принудительный выход из такой ситуации.
6-3.1.7. Команда выхода на командный уровень cancel
Команда прекращает выполнение программы, освобождает из Памяти переменные, созданные пользователем и возвращает управление окну Command.
Команда выхода из среды Visual FoxPro QUIT
Осуществляет выход из среды Visual FoxPro в операционную систему. Рекомендуется использовать эту' команду перед выключением компьютера, с целью предотвращения потери данных.
Внутренние процедуры
Внутренние процедуры хранятся вместе с текстом основной программы и размещаются в конце основной программы.
Для создания внутренних процедур используются те же команды, что и при создании внешних процедур.
Процедура-функция
Если результатом работы процедуры является единственное вы численное значение, то удобнее использовать процедуру-функцию. Процедура-функция может быть оформлена как внешняя или как внутренняя процедура. Пронелура-функция вызывает по своему имени, которое допускается указывать в командах. По еле имени процедуры-функции обязательно указываются или пустые круглые скобки, или круглые скобки с именами передаваемых аргументов.
Команда описания заголовка процедуры-функции
FUNCTION(<HMfl процедуры-функини>)
Имя процедуры-функции пишется по правилам имен процедур (см. п. 6.3.1.2).
Передача входных параметров (аргументов) и написание тела процедуры-функции производится аналогично процедурам, но запрещено использование команды RETURN в любом варианте- Единственный результат вычисления, определенный последним исполняемым оператором, передается под именем самой функции Вызов процедуры-функции производится командой
1)0 <нмя происдуры-функцнн>.
Область действия переменных
Переменные могут передаваться в процедуры не только через фиктивные параметры, но и напрямую. Псремеш<ые, определенные в старших модулях, действуют также и в подчиненных модулях.
Глобальные переменные
Переменные и массивы, объявленные как глобальные, действуют во всей среде Visual FoxPro. Глобальную переменную можно определить либо в окне Command, либо с помощью оператора
PUBLIC <список имен переменных в масснвов>
Элементы списка отделяются друг от друга запятой. Глобальная переменная продолжает существовать даже тогда, когда процедура, ее определившая, закончила свою работу и освободила оперативную память.
»
Локальные переменные
Локальные переменные существуют только внутри процедуры, в которой они определены, и во всех подчиненных ей процедурах. Для описания локальных переменных используют оператор PRIVATE <спнсок имен переменных>
Допускается объявление группы локальных переменных по шаблону:
PRIVATE ALL LIKE <шаблои> | EXCEPT <шаблон>
Назначение опций:
LIKE <шаблон> — задает множество имен, соответствующих условию шаблона.
EXCEPT <шаблон> — задает множество имен, не соответствующих условию шаблона
Оператор PRIVATE описывает только переменные. Локальные массивы описываются командами DECLARE и DIMENSION.
Простейшие вычисления
В Visual FoxPro предусмотрены команды, которые позволяют существенно упростить процесс вычислений в таблицах.
Вычисление суммы по столбцу
Команда SUM без опций производит вычисление суммы по всем числовым полям всех столбцов и всех записей активной таблицы.
Формат команды:
SUM
[ Ссиисок выряжсний> ]
[ FOR <выр. Ll> 1 I WHILE <Bi.ip.L2>]
[ТО < список имен переменных памятн> | ТО ARRAY <имя массива> ]
[ NOOPTIMIZEI
Назначение опций-
<список выражении> — задает имена физических нолей или выражения (виртуальные поля), которые должны быть просуммированы. Количество элементов списка должно соответствовать количеству элементов массива, если результат вычислений будет сохраняться в массиве (опция ТО ARRAY <имя массива>).
FOR <выр. Ll> — задает диапазон строк, для которых надо выполнить операцию суммирования.
WHILE <выр. L2> — задает диапазон строк, для которых надо выполнить операцию суммирования.
ТО Ссписок имен переменных памяти> — задает имена переменных памяти, в которых будут сохранены результаты вычисления сумм. При необходимости соответствующие переменные будУ1 созданы автоматически.
ТО ARRAY <имя масснва> — содержит имя массива, который предназначен для хранения результатов вычисления сумм. СЛ массив должен быть создан заранее.
NOOPTIMIZE — отключает технологию ускоренного доступ3 к данным, если в опцию FOR включены поля текущего ИИ- декса.
Вычисление среднего значения по столбцу
Команда AVERAGE осуществляет вычисление среднего арифметического значения для выражения. Формат команды:
average
(<спнсок Bbip.N> ]
[ FOR <выр. LI>]
(WHILE <выр. L2> J
[ ТО <спис(ж имен переменных памятн> | ТО ARRAY <имя чассим> ]
| NOOPTIM1ZE ]
Назначение опций аналогично команде SIJM. В <списке Bbip.N> могут содержаться как имена физических нолей, так и выражения для виртуальных полей.
Вычисление математических операций над физическими и виртуальными полями
Команда CALCULATE позволяет выполнять любые допустимые математические операции над полями и выражениями. Формат команды:
CALCULATE [ Сспнсок Bbip.N> ]
(FOR <выр. Ll> ]
I WHILE <выр. L2> ]
[ TO <спнсок имен переменных пачятн> | ТО ARRAY <ичя масснва> ]
INOOPTIMIZE]
При написании выражений допускается использование функций:
АУС(<выр. N>) — вычисляет среднее арифметическое значение Для числового поля (столбца) или выражения, содержащего поле
(столбец).
CNT0 — вычисляет общее количество записей.
^1АХ(<выр.>) — находит максимальное значение для поля (столбца) или выражения, содержащего поле (столбец).
XlL\(<Bup.>) — находит минимальное значение для поля (столбца) или выражения, содержащего поле (столбец).
NPV(<w»ip. Nl>, <выр> [, <выр. N2> J) — рассчитывает значение,
представленное в сети, для серии платежей при некотором фиксиЛ рованном проценте. Процент указывается в <выр. N1 > в десят^И чной форме. В <выр.> указывается серия платежей либо именем поля, либо выражением поля, либо численным выражением.
В <выр. N2> может быть указано начальное инвестирование.
STD(<Bbip. N>) — вычисляет стандартное отклонение для зна-1 чений в числовом поле или в выражении, содержащем числовое I поле.
SUM(<Bbip. N>) — вычисляет сумму значений в числовом поле или в выражении, содержащем числовое поле.
VAR(<Bbip. N>) — вычисляет дисперсию от среднего для числового поля или выражения, содержащего числовое поле.
Записи, помеченные к удалению, включаются к вычислению, если ранее не была использована команда SET DELETED ON, которая игнорирует помеченные к удалению записи.
Вычисление общего количества записей в таблице
Команда COUNT подсчитывает общее количество записей в активной таблице и сохраняет результат в переменной памяти. Фо(^И мат команды:
COUNT [ FOR <выр. Ll> ]
[WHILE <выр. L2> ]
[ТО <персмсннойпамяггн>]
[ NOOPTIMIZE j
Для аналогичных целей может бьггь использована функция: J RECCOUNT( [ <выр. N> | <выр. О ])
которая возвращает количество записей таблицы. Желаемая таб-Я лица задастся либо номером рабочей области <выр. N>, либоЯ алиасом рабочей области <выр. С>.
Примеры
Пример 1. Создать программный файл по условиям примерЯ 1 гл. 5.
USE Customer.dbf * |
in |
1 |
alias |
cus |
* JSE Order.dbf |
in |
2 |
alias |
ord |
USE Salesman.dbf |
in |
3 |
alias |
smn |
USE Sale.dbf |
in |
4 |
alias |
sal |
USE Account.dbf |
in |
5 |
alias |
acnt |
USE Catalog.dbf in INDEX catalog; ORDER TAG Fam |
6 |
alias |
Ctl; |
|
USE Author.dbf |
in |
7 |
alias |
atr |
USE Town.dbf |
in |
8 |
alias |
twn |
USE Street.dbf |
in |
9 |
alias |
str |
USE Fam.dbf in NDEX fam; ORDER TAG Name |
10 |
alias |
fam; |
|
USE Im.dbf INDEX im; ORDER TAG Im |
in |
11 |
alias |
im; |
USE Ot.dbf |
in |
12 |
alias |
Ot; |
INDEX
ot;
ORDER
TAG Ot
Запустите
встроенный текстовый редактор, введите
текст программы и поставьте ее на
выполнение кнопкой графического меню.
При первом запуске надо задать имя
созданному программному файлу.
CLOSE
ALL && Закрытие всех
файлов
S3T
DEFAULT
ТО
E:\PRIMER
&&
Задание рабочего каталога
&&
Далее открытие двенадцати таблиц
SET RELATION TO Key_im INTO im, key_ot INTO ot SELECT fam
SET RELATION TO Key_fam INTO ctl SET SKIP TO ctl
Browse FIELDS «Автор» = ALLTRIM(fam.narne_fam) + ' + ALLTRIM(im.name_im) ■*■''+ ALLTRIM(ot .name_ot), ctl.name_book :Н=«Наименование» :4 0
Контрольные вопросы
Укажите назначение программного файла.
Укажите несколько способов создания программного файла.
Как открыть программный файл?
Как поставить на выполнение открытый программный файл?
ОСНОВЫ ЯЗЫКА ПРОГРАММИРОВАНИЯ
В FoxPro каждый оператор должен начинаться с новой строки. Переход на новую строку позволяет распознать начало и конец отдельной команды. Для облегчения чтения длинйую команду можно разделить на две (и более) строки. Чтобы указать, что следующая строка является продолжением данной строки, в конце данной строки помешают символ «;*. Запреп ается использовать символ «;» внутри строковых констант. Если строковую константу надо разместить в двух строках тот каждую часть строковой константы помешают в кавычки и соединяют между собой знаком «+*. Если по смыслу строковая константа должна содержать символ «;*, то его размещают внутри кавычек.
FoxPro игнорирует лишние пробелы, поэтому их можно использовать для удобного расположения команд FoxPro.
При написании текста программ удобно вставлять комментарии для пояснения работы конкретного блока команд. В FoxPro предусмотрены два типа комментариев.
Если символ «** или NOTE установлены в начале строки, то это означает, что комментарий занимает всю строку. Можно после символа «*» указать несколько символов «-» длялучшего выделения комментария.
Если в любом месте строки текста программы встречаются символы « && *, то после них следует комментарий. То есть сче- ва от этих символов пишется исполняемая команда, а справа — комментарий.
7-1. ПЕРЕМЕННЫЕ, КОНСТАНТЫ И МАССИВЫ
В FoxPro разрешается использовать переменные и константы тех *с типов, что и поля таблицы, за исключением типа Memo. Значение переменной изменяется по мерс выполнения программы, а значение константы всегда остается постоянным. Имена пере
менных и констант составляются по правилам имен полей, то есть имена пишутся буквами латинского алфавита и могут содержать цифры, но первый символ в имени — всегда буква. Длина имени не должна превышать 12 символов.
В FoxPro предусмотрены два типа переменных: пользовательские и системные. Имена системных переменных начинаются с символа « _ » подчеркивание и предназначены для храпения параметров настройки среды FoxPro. Системные переменные яшшются резидентными и их нельзя удалить.
Таблица 7.1
Использование
разделителей
Пример
Тип
дойных
Описание
Character
Currency
Date
Date
Пше
11:00am)
logical
Numeric
Текст от 1 до 2S6 символов Денежные суммы Даты
Даты и Время
«Истина», «Ложь» Числа
«текст», ‘текст’, [текст], “текст”
$число
(дата)
(дата время)
Т. или F.
Без разделителен
Pr = « Hello*
Рг = $500 Рг = (25/01/02) Рг = (25/01/02)
Рг-.Т.
Рг -1550
В табл. 7.1 приведены часто употребляющиеся типы и размеры пользовательских переменных.
В FoxPro отсутствуют описатели типов переменных.
Тип переменной определяется значением, которое она содержит.
Таким образом, при выполнении программы в каждый момент времени одна и та же переменная может иметь разные типы.
Массив — это последовательность переменных, имеющих одинаковое имя и отличающихся друг от друга порядковым номером (индексом). Любой элемент массива в каждый момент времени может иметь один из допустимых типов. В Fo\Pr° определены одномерные и двухмерные массивы. Имена массивов состаатяются по правилам имен переменных.
Для объявления массивов используют одну из команд DECLARE или DIMENSION, формат которых одинаковый.
DECLARE | DIMENSION <ичя массива 1> (<выр.М> [,<выр N2>])
[,<нмя массива 2> (<Bbip.N3> (,<iup.N’4>])l 1-1
Пример.
dime abc(5,10), cd{18)
Одной командой DIMENSION объявлены два массива: двумерный массив с именем аЬс, содержащий пять строк и десять столбцов, и одномерный массив cd, содержащий восемнадцать элементов массива. Тип каждого элемента массива как одномерного, так и двумерного будет определен потом, тем значением (данным), которое будет в него помещено.
Присвоение значений
Присвоить значения переменным и элементам массива можно несколькими способами.
С помощью оператора присваивания
<нмя вереме1шоА> ■ <выражсинс>
<имя элемента массива> = <выраженне>
С помощью команды STORE
STORE <значеиис> ТО <имя перемениой>
STORE <эвачсние> ТО <имя элемента массива>
STORE <значеиие> ТО <имямассива>
Эта команда наиболее эффективна при работе с массивом (третий вариант команды), она позволяет всем элементам массива задать одинаковые (начальные) значения.
Примеры.
st = «Москва» && создается переменная st
символьного типа, в которую помещается значение «Москва».
^t = (25/01/02) && создается переменная dt
* типа дата, в которую помещается
значение 25 января 2002 года.
STORE 145 ТО nm
*
* && создается переменная
числового типа, в которую помещается значение 145.
&&
объявляется одномерный массив с именем
mas
из
12 элементов.
&&
все элементы массива mas
получают
значение * и символьный тип.
&&
четвертый элемент массива 1
mas
получает
значение 0 и
тип числовой
DECL
пав(12)
*
*
STORE
*
ТО
mas
mas(4)
=0
mas(7) = (07/02/02) && седьмой элемент массива mas
получает значение 7 февраля 2002 года и тип дата.
Команды для работы с переменными
В FoxPro допустимы следующие действия над переменными: хранение в файле, загрузка их в оперативную память, просмотр и удаление.
Сохранение переменных
С помощью команды SAVE ТО можно сохранить либо все переменные, находящиеся в оперативной памяти, либо их произвольную часть, как в файле, так и в Memo-полс с заданным именем. Формат команды:
SAVE ТО <нмя файла> | ТО MEMO <имя поля> {ALL LIKE | EXCEPT <шаблон>]
В команде предусмотрено использование одного из двух шаблонов.
ALL LIKE — сохраняются все переменные, имена которых соответствуют шаблону.
ALL EXCEPT — сохраняются все переменные, кроме переменных, перечисленных в шаблоне.
В любом из шаблонов допустимо использование символов V и "Г.
По умолчанию к указанному в команде имени файла, добавляется расширение .mem
По умолчанию команда создает файл с указанным именем. Если файл с таким именем уже существует, то он заменяется на новый без предупреждения Если вы хотите увидеть предупреждение на экране, что указанный файл уже существует, надо перед командой SAVE ТО установить команду SETT SAFETY OFF.
Загрузка переменных в оперативную память
Если при работе с приложением возникает необходимость разместить в оперативной памяти переменные, значения которых были определены ранее, то надо воспользоваться командой:
RESTORE FROM <нмяфайла>| FROM MEMO Симя поля> [ADDITIVE]
В результате работы команды оперативная память очищается от имеющихся переменных, и в нее помещаются переменные из указанного файла с расширением .mem или из Memo-поля. Для того чтобы сохранить в оперативной памяти переменные, значения которых определены до использования команды SAVE ТО, и добавить в оперативную память переменные с отличными (другими) именами из файла (или Memo-поля), надо указать опцию ADDITIVE.
Просмотр переменных
Переменные, которые хранятся в оперативной памяти, можно Просмотреть с помощью команды:
DISPLAY MEMORY [LIKE <шаблон>] [ТО PRINTER | FILE <нмяфайла>[
На экране каждая переменная занимает одну строку, куда выводится имя, тип, значение и статус переменной. После заполнения экрана надо нажать либо клавишу ENTER, либо клавишу •пробел* для продолжения вывода переменных на экран. При Желании можно направить вывод переменных либо на принтер (ТО PRINTER), либо в файл (ТО FILE).
Удаление переменных
Все переменные или часть переменных, хранящихся в оперативной памяти, можно удалить с помощью команды:
RELEASE <список имен иеременных>
RELEASE ALL [LIKE | EXCEPT <шаблон>]
Для удаления всех переменных также можно использовать команду:
CLEAR MEMORY
Команды для работы с массивами
В FoxPro для работы с массивами предусмотрены четыре команды: две для работы с одномерными массивами и две для работы с двумерными массивами.
Команда заполнения одномерного массива из табличного файла
Команда SCATTER переносит данные из текущей записи активной таблицы в одномерный массив. Если одномерный массив не был создан заранее или размерность созданного массива мала, то автоматически либо создается одномерный массив, либо увеличивается размерность ранее созданного массива. Эта команда переносит данные из текущей записи активной таблицы либо в одномерный массив, либо в переменные, которые при необходимости могут быть также автоматически созданы. При автоматическом создании массива ему присваивается имя табличного файла, но перед именем добавляется буква М и префикс «.* точка. При автоматическом создании переменных им присваиваются имена соответствующих полей с добавлением перед именем буквы М и префикса «.* точка. Тип переменных определяется типом соответствующих полей.
Формат команды:
SCATTER
[FIELDS Сспнсок имен полей> | FIELDS LIKE <шаблон>
| FIELDS EXCEPT <шаблон> ]
[MEMO] ТО<нмямассива>|ТО <имя масснва>
[BLANK] | [MEMVAR] | [MEMVAR] [BLANK]
Назначение опций:
FIELDS <список имен полей> — задает список имен полей, значения которых будут копироваться в одномерный массив или переменные.
FIELDS LIKE <шаблон> — в одномерный массив или переменные будут копироваться значения только тех полей, имена которых соответствуют шаблону.
FIELDS EXCEPT <шаблон> — в одномерный массив или переменные будут копироваться значения только тех полей, имена которых не соответствуют шаблону.
MEMO — указывает на необходимость копирования Memo-полей. По умолчанию Memo-поля не копируются.
ТО <ичямасснва> — залает имя массива, куда будут копироваться значения указанных полей.
ТО <имямассива> BLANK — создает пустой массиве указанным именем. Элементы массива получают тип и размер соответствующих полей.
MEMVAR — указывает на то, что поля текущей записи будут копироваться в переменные.
MEMVAR BLANK — создает набор пустых переменных. Переменные получают тип и размер соответствующих полей.
Если опция FIELDS не задана, то копирование начинается с первого поля записи подряд. Если число элементов массива больше, чем количество полей записи, то последние элементы массива сохраняют свое прежнее значение.
Команда заполнения табличного файла из одномерного массива
Команда GATHER переносит данные из одномерного массива в текущую запись активной таблицы. Для правильной работы команды необходимо заранее описать одномерный массив и заполнить его данными. При этом программист сам должен следить за соответствием типов и размеров элементов массива типам и размерам соответствующих полей записи таблицы. Формат команды:
Gather FROM <имямассива>| MEMVAR
[FIELDS Ссписок имен полей> | FIELDS LIKE <шаблон> |
Helds except <шаблон>]
[MEMO]
1
Назначение опций:
FIELDS <список имен полей> — задает имена полей, в которые,
в строго указанном порядке, будут заноситься значения из элементов одномерного массива.
FIELDS LIKE <шаблон> — задает имена полей по шаблону (аналогично команде SCATTER).
FIELDS EXCEPT <шаблон> — задает имена полей по шаблону (аналогично команде SCATTER).
MEMO — задает копирование полей типа Memo.
Если опция FIELDS не задана, то копирование начинается в первое поле записи и далее подряд. Если число элементов массива больше, чем количество полей записи, то последние элементы массива не копируются. Если число элементов массива меньше количества полей записи, то последние поля записи сохраняют свои прежние значения.
Копирование данных из табличного файла в двумерный массив
Команда COPY ТО ARRAY копирует записи табличного файла в заранее созданный двумерный массив. Копируется столько записей, сколько строк в двумерном массиве, начиная с текущей записи. Если количество полей записи больше, чем число элементов массива в одной строке, то лишние поля записи не копируются. Если количество элементов массива в одной строке больше, чем количество полей записи, то последние элементы массива сохраняют прежние значения. Формат команды:
COPY ТО ARRAY <имя масснва>
(FIELDS <снисок имен иолей>]
[SCOPE]
[FOR <выр.Ь1>]
[WHILE <выр.Ь2>]
[NOOPTIMIZEJ
Назначение опций:
FIELDS Ссписок имен полей> — задает имена полей, значения которых будут копироваться в двумерный массив.
SCOPE — задаст запись, начиная с которой производится копирование, либо диапазон записей.
FOR <Bbip.Ll> — выделяет для копирования только те записи, которые удовлетворяют логическому условию СвырХ! >.
WHILE <Bbip.L2> —выделяет для записи указанные поля.
NOOPTIMIZE — запрещает ускоренную технологию обработки (Rushmore).
Добавление записей в табличный файл из двумерного массива
Команда /APPEND FROM ARRAY добавляет в конец табличного файла записи из двумерного массива. Причем каждая строка двумерного массива заносится в табличный файл как новая запись. Если количество элементов в строке двумерного массива больше, чем количество полей в записи, то последние элементы массива не копируются. Если количество элементов в строке двумерного массива меньше, чем количество полей в записи, то последние поля записи сохраняют прежние значения. Формат команды:
APPEND FROM ARRAY Снчя двумерного масснва>
[FOR <выРХ1>]
[FIELDS <списокимен полей>]
Назначение опций:
FOR <вырХ1> — выделяет из массива те строки, которые удовлетворяют логическому условию <вырХ1>.
FIELDS <список имен полей> — задает имена полей, в которые будут заноситься данные из массива.
Команды ввода-вывода
При работе с базами данных постоянно требуется вводить какие- либо данные, задавать критерии поиска и фильтрации, получать из базы данных результаты произведенных действий. Для этих Целей предусмотрены команды ввода-вывода, которые бывают как простыми, так и универсальными.
Простейшие команды вывода
В FoxPro имеются команды для вывода на экран значений переменных и элементов массивов Причем эти команды допускают управление шрифтом и простейшее форматирование. Формат команды вывода:
? I ?? [<выр.1>]
[PICTURE <выр. С1>[
[FUNCTION <выр. С2>]
[АТ <вьгр. Nl>]
[FONT <выр. С3> [, <BUp.N2> ]] [STYLE <выр.С4>[
[, <выр.2>] ...
Команда вычисляет и выводит на экран <выр.1>. Назначение опций:
? <выр.1> — вычисляет и выводит значение <выр.1> в следующей строке экрана.
?? <выр.1> — вычисляет и выводит на экран <выр.1> в текущей строке экрана.
Если перед этой командой указана команда SET PRINTER ON, то вывод будет производиться на принтер (печать)
PICTURE <выр. С1> — задает шаблон для вывода значения <выр.1> (подробнее см. команду @ ... SAY ... GET ... в п. 7.5.3).
FUNCTION <выр. С2> — задает колы управления выводом (подробнее см. команду @ ... SAY ... GET ... в п. 7.5.3).
АТ <Bbip.Nl> — используется для создания таблиц. <Bbip.Nl> задает номер колонки на экране, с которой начинается вывод значения <ныр.!>.
FONT <выр. С3> [, <Bbip.N2> ] [STYLE <выр.С4>] — опция задает тип шрифта (<выр.СЗ>), размер шрифта (<Bbip.N2>) и стиль написания шрифта (STYLE <выр.С4>).
В Visual FoxPro предусмотрены следующие стили написания
шрифта:
В — жирный I — курсив N — нормальный
О — кошурный Q — непрозрачный S — с тенью
- — перечеркнутый Т — прозрачный U — подчеркнутый
Команды очистки экрана
Для очистки экрана используются две команды:
а. Очистка всего экрана — CLEAR. Команда очищает либо весь экран, либо все рабочее окно и размещает курсор в левом верхнем углу.
б. Очистка прямоугольной области экрана:
§> <YI,X1> [CLEAR | CLEAR TO <Y2,X2>]
Команда очищает прямоугольную область экрана с координатами левого верхнего угла (<Y1,X1>) и координатами правого нижнего угла (<Y2,X2>). Если координаты правого нижнего угла области не указаны, то принимаются координаты правого нижнего угла экрана.
Универсальная команда ввода-вывода
Эта команда предназначена для форматного ввода-вывода на экран и принтер. Формат команды:
9 <Y1>, <Х1>
[SAY <выр.1>
[PICTURE <выр.С1>]
[ FUNCTION <выр.С2>]
<имя файла> [ BITMAP] | <имя общего поля>
[ SIZE <выр.М>, <Bwp.N2> ]
[CENTER]
[ ISOMETRIC | STRETCH ]
[ FONT <выр.СЗ> [, <Bbip.N3> ] ] [ STYLE <выр.С4> J [VERB <Bbip.N4>]
[COLOR SCHEME <Bbip.N5> | COLOR <список пар цвегов> ] [GET <переме1тая>
[ PICTURE <выр.С5> ]
[FUNCTION <выр.С6>]
[ DEFAULT <выр.2> ]
[ENABLE| DISABLE]
[ MESSAGE <выр.С7>]
[ [ OPEN ] WINDOW <имя окиа> ]
[ RANGE [ <выр.3> ] [ <выр.4> ] ]
[ SIZE <Bbip.N6>, <Bbip.N7> ]
[VALID <выр.Ь1> | <aup.N8> [ERROR <выр.С8>] ]
[WHEN <aup.L2>]
[FONT <вьф.С9>[,<Bbip.N9>]] [STYLE <выр.С10>) [COLOR SCHEME <выр.М0> | COLOR <спис<жnapцвегов>J
Команда размещает курсор на экране или в окне в позиции YI (номер строки от 0 до 35) XI (номер столбца от 0 до 79 ) и, начиная с этой позиции, на экран выводится сообщение, указанное в опции SAY <выр.1>. Если в команде дополнительно используется опция GET <переменная>,то <переменная> выводится на экран сразу после SAY <выр.1>. Если перед командой @ ... SAY ... GET ... указана команда SET DEVICE ТО PRINT, то вывод производится на принтер и тогда количество строк и столбцов определяется размером бумаги. Для переназначения вывода на экран следует использовать команду SET DEVICE ТО SCREEN (команда используется по умолчанию). Значение <переменная> должно быть определено до использования команды @ ... SAY ... GET ... В общем случае, назначение опции SAY указать пользователю, где выполнить ввод (вывод) по пункту GET.
<выр.1> и <переменная> форматируются по отдельности с использованием опций, указанных после них.
Для форматирования <выр.1> используются следующие опции:
PICTURE — задаст шаблон для форматирования. При составлении шаблона можно применять символы:
А — используются только символы алфавита (русского или латинского);
L — используются только логические данные;
N — используются только буквы и цифры;
X — используются любые символы;
Y — используются логические данные, приведенные к виду Y — True и N — False;
9 — используются только числовые данные;
— используются цифры, пробелы и математические
знаки;
! — преобразует строчные (малые) буквы в прописные (большие);
$ — используется для обозначения денежных единиц;
— используется для обозначения • перед числом;
. — используется для отделения целой части числа от дробной части;
, — используется для разделения тысяч в числовых данных.
Каждый шаблон начинается с символа а затем следуют указанные выше символы.
FUNCTION — задает коды управления выводом, при этом начальный символ @ не указывается. Для составления кодов уп- равления используют символы:
А — разрешены только символы алфавита;
В — сохраняет выравнивание числовых данных;
С — отображает знак кредита CR после поло
жительного числа;
D — использует текущий формат даты;
I — используется для расположения текста по
центру внутри поля;
J — форматирует текст внутри поля по правой
границе;
К — разрешает редактирование целочисленного
поля;
L — отображает ведущие (незначащие) нули пе
ред целой частью числа;
М<список>0 — задает список предварительного выбора для пользователей (элементы списка разделены запятыми);
R — отображает (без сохранения) символы фор
мата;
S<n> — задает ширину поля вывода в символах;
Т — удаляет ведущие и конечные пробелы;
V<Bbip N> — заполняет все отведенное пространство
(<Bbip.N>) текстом, за счет добавления пробелов;
X — отображает знак дебета DB после положи
тельного числа;
Z — в пустых числовых полях отображает про
белы вместо 0;
( — заключает в скобки отрицательные числа;
— преобразует строчные (малые) буквы в прописные (большие);
$ — отображает символ денежной единицы;
пробел — задаст вывод чисел в экспоненциальной
форме.
<имя файла> [ BITMAP] | <ичя общего патя> — используется д ля вставки рисунка (.bmp) или OLE-объекта, сохраненном в общем поле в указанном месте экрана. Следующие четыре опции управляют размещением рисунка на экране.
SIZE <выр.М>, <Bbip.N2> — определяет ширину'(<выр.Ы1>) и высоту (<Bbip.N2>) импортируемого рисунка.
CENTER — располагает рисунок в центре выделенной области.
ISOMETRIC — пропорционально изменяет размеры импортируемого рисунка, с целью заполнения всего выделенного пространства.
STRETCH — заполняет рисунком все выделенное пространство без сохранения пропорций.
VERB <выр.М> — непосредственно вставляет рисунок с указанными параметрами.
FONT <выр.СЗ> [, <Bbjp.N3> ] ] [ STYLE <выр.С4> — залаеттип (<выр.СЗ>), размер (<выр.№> ) и стиль (<выр.С4> ) шрифта, которым будет выведено значение <выр. 1 >. ■
COLOR SCHEME <Bbip.N5> | COLOR <список пар цветов> — задает цвет, которым будет выведено значение <выр.1>, либо с помощью указания номера цвета (<Bbip.N5>) в палитре цветов (номер цвета выбирается из диапазона от 1 до 24), либо с помощью буквенного обозначения цвета шрифта и цвета фона (<список пар цветов>).
GET <переменная> — указывается имя переменной, значение которой будет выведено после значения <выр.1>. Значение <пе- ременная> должно быть определено до использования команды @ SAY GET любым способом, кроме опции DEFAULT. PICTURE <выр.С5> — задает шаблон для значения СперемеН- ная> аналогично значению <выр.1>.
FUNCTION <выр.С6> — задает коды управления выводом значения <персменная> аналогично значению <выр.1>.
В опциях PICTURE и FUNCTION допускается использование комбинации символов *♦* и пробел для создания командных кнопок-
DEFAULT <выр.2> — устанавливает значение переменной по умолчанию. При первом вызове команды @ SAY GET опция не работает.
ENABLE — разрешает редактирование <псременной>. Эта опция задана по умолчанию.
DISABLE — запрещает редактировать переменной и указывает на это цветом.
MESSAGE <выр.С7> — выводит сообщение (<иыр.С7>) в статус-строку или последнюю строку экрана при установке курсора на поле GET (<неременная>).
[ OPEN ] WINDOW <имя окиа> — разрешает редактирование Memo-поля в окне, которое было заранее определено. Если указана опция OPEN, то окно открывается автоматически. Если опция OPEN не указана, то для открытия окна надо подать команду Ctrl + Home. В том и другом случае дли входа в окно надо либо дважды щелкнуть левой кнопкой мыши внутри окна, либо подать команд)' Ctrl + Home. Для выхода из окна надо либо подать команду' Ctrl + End (для сохранения внесенных изменений), либо нажать клавишу Esc (изменения не сохраняются).
RANGE [<выр.3>] [<выр.4>] — устанааливает диапазон допустимых значений (нижняя граница — <выр.3>, верхняя граница — <выр.4>) для <переменной>. Допускается указание любой одной границы диапазона. При указании только верхней границы диапазона необходимо перед значением верхней границы диапазона поставить запятую. Диапазон допустимых значений устанавливается для символов, чисел и дат. При нарушении границ диапазона на экран выводится соответствующее сообщение с Указанием границ диапазона.
SIZE <Bbtp.N6>, <Bbip.N7> — задает ширину (<ubip.N6>) ивы- соту (<Bbip.N7>) поля GET для ввода значений <перемеиной>.
VALID <выр.И> I <Bbip.N8> [ERROR <выр.С8>] — предназначена для обеспечения достоверности вводимых данных. Если логическое выражение <iibip.Ll> истинно, то вводимые данные Достоверны. В противном случае на экран выводится сообщение °б ошибке <выр.С8>. При составлении логических выражений Допускается использование функций, в том числе и функций Пользователя, специально написашнях для этих целей. Если оп- Пия используется с числовым выражением <Bbip.N8>, то:
число 0 (ноль) соответствует выявленной ошибке,
положительное число указывает, на сколько полей GET вперед надо переместить курсор для следующего ввода,
отрицательное число указывает, на сколько полей GET назад надо переместить курсор для следующего ввода.
Часто в опцию VALID включают команды, которые выполняются при чтении поля.
WHEN <выр.Ь2> — используется для управления редактированием <псременной>. Если логическое условие (<выр.Ь2>) истинно, то редактирование <переменной> разрешено. Если логическое условие (<Bbip.L2>) ложно, то курсор передвигается к следующему полю GET. При написании логического условия допускается использование функций, в том числе и функция пользователя, а также команд, которые выполняются при отображении поля GET.
FONT <выр.С9> [, <Bbip.N9> ] ] [ STYLE <выр.С10> — назначение опции см. выше.
COLOR SCHEME <eup.N10> | COLOR Ссписок пар цветов> -
назначение опции см выше
Редактирование переменных,
заданных командой @ ... SAY ... GET
Команда READ может редактировать переменные всех активных команд® ... SAY ... GET и разрешает ввод данных в спроектированный экран. Формат команды:
READ
[CYCLE]
[ACTIVATE <buP.L1> ]
[DEACTIVATE <Rup.L2>]
[MODAL]
[WITH Ссписок имен окои>]
[SHOW <Bbip.L3> 1 [VALID CBbip.L4> | CBbip.Nl> ]
[WHEN <Bbip.L5>]
[OBJECT Свыр.\2>]
[TIMEOUT CBbip.N3>]
[SAVE] (NOMOUSE]
(LOCK | NOLOCK]
[COLOR Ссписок пар цвстов> | COLOR SCHEME <Bbip.N4>]
Назначение опций:
CYCLE — при переходе от одной команды @ ... SAY ... GET к другой команде, предотвращает окончание команды READ при обработке последней команды @ ... SAY ... GET и возвращает курсор на первую команду @ ... SAY ... GET. Для выхода из циклического режима надо либо нажать клавишу Esc, либо подать команду Ctrl + W, либо другие прерывающие команды.
ACTIVATE Свыр.Ы> — опция работает с командами @ ... SAY ... GET в разных окнах. При перемещении пользователя от одного окна к другому окну команда READ активизируется для текущего окна только в случае истинности логического выражения Cubip.LlX
DEACTIVATE Свыр.Ь2> — при работе пользователя с несколькими окнами опция разрешает покинуть очередное окно, если логическое выражение CBbip.L2> истинно.
MODAL — разрешает активацию только тех окон, имена которых указаны в Ссписке имен окон> опции WITH.
WITH Ссписок имен окон> — задает имена окон, с которыми работает команда READ.
SHOW CBbip.L3> — разрешает обновить информацию на экране, предварительно измененную командой REM). Эта опция работает совместно с командой SHOW GETS, которая фактически и обновляет содержимое экрана.
VALID Свыр.Ы> | CBbip.Nl> — обеспечивает достоверность вводимых данных с помощью команды READ. Команда READ прекратит всю работу только после ввода достоверных данных, то есть если логическое выражение Свыр.Ь4> истинно.
" HEN Свыр.Е5> — разрешает активацию команды READ только в случае истинности логического выражения CBbip.L5>. OBJECT Cebip.N2> — указывает номер объекта (команды @ ... SAY ... GET), с которого начинается обход. Нумерация объектов начинается с единицы.
TIMEOUT Свыр.Ю> — задает время активности команды BEAD в секундах для ожидания ввода пользователя.
SAVE — сохраняет установки команд @ ... SAY ... GET для их последующей активации следующей командой READ. Обычно установки команд @ ... SAY ... GET очищаются одной из команд CLEAR, CLEAR GETS или CLEAR ALL.
NOMOUSE — запрещает работу мыши. Пользователь может работать только с клавиатурой.
LOCK — ограничивает доступ к данным, указанным в командах @ ... SAY ... GET. После успешного закрытия данных их можно редактировать с помощью команды READ. Опция применяется в локальных сетях.
NOLOCK — устанавливает для всех данных режим «только для чтения». Опция применяется в локальных сетях.
COLOR <список пар пветов> | COLOR SCHEME <Bbip.N4> — устанаативает атрибуты цвета для окна BROWSE.
Функции для работы с массивами
-*
4
-*
8
-у 12
-* 16
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
Определение положения элемента массива
а. Номер строки и номер столбца определяет функция ASUBSCR1PT( <имя масснва>, <выр.ГЧ>, < 112> ).
Она возвращает из двумерного массива положение элемента <Bbip.N>. Если третий аргумент 1, то функция возпращает номер строки. Если третий аргумент 2, то функция возвращает номер столбца.
б. Функция
AELEMENT( <имя масснва>, <Bup.Nl>, [ <ewp.N2> ] )
определяет порядковый номер элемента двумерного массива, по заданным номеру строки <Bbip.Nl> и номеру столбца <Bbip.N2>.
Удаление элемента массива
После удаления элемента массива размерность массива не изменяется.
Если удаляется элемент одномерного массива, то все элементы справа от удалешюго элемента сдвигаются влево, занимая освободившееся место. Последний элемент массива получает тип логический и значение .F. ("ложь").
Если удаляется строка или столбец двумерного массива, то после выполнения операции удаления производится сдвиг оставшихся строк или столбцов. Последняя строка или столбец (все элементы) получают тип логический и значение .F.
Формат функции:
ADEL( <имя масснва>, <выр.1М> [, 2] )
Если операция удаления прошла успешно, то функция возвращает 1. Если третий аргумент 2, то в двумерном массиве удаляется столбец. В противном случае удаляется строка.
<Bbip.N> — указывает для одномерного массива номер удаляемого элемента, а для двумерного массива либо номер удаляемой строки, либо номер удаляемого столбца (в зависимости от значения третьего аргумента).
Вставка элементов массива
После выполнения операции вставки элемента массива размерность массива не изменяется.
Формат функции:
A1NS( <нмя массивя>, <Bup.N> [, 2 ] ) <Bbip.N> — указывает номер элемента массива, перед которым надо вставить пустой элемент. Пустой элемент имееттип логический и значение .F. Если новый элемент вставляется в одномерный массив, то все элементы справа от вставленного элемента сдвигаются вправо и последний элемент теряется.
В двумерный массив вставляется либо строка, либо столбец целиком. После операции вставки аналогично проводится сдвиг (либо вниз, либо вправо) оставшихся элементов. Если третий аргумент 2, то вставляется столбец, в противном случае — строка.
Копирование элементов из одного массива в другой
Функция ACOPY копирует элементы из одного массива в другой, причем если отсутствует массив-приемник элементов, то он создается автоматически той же размерности, что и массив источник элементов. Если операция копирования прошла успешно, то функция возвращает количество скопированных элементов.
Формат функции:
ACOPY( <массив 1>, <массив 2> (, <w,ip.Nl> [, <eup.N2> [, <w»ip.N3> ] ] ])
Назначение опций:
<массив 1> — имя массива источника элементов.
<масснв 2> — имя массива приемника элементов.
<выр.1Ч1> — указывает номер элемента массива <массив 1>, с которого начинается копирование.
<Bbip.N2> — задает число копируемых элементов.
<выр.МЗ> — указывает номер элемента массива <массив 2>, с которого начинается ввод данных.
Если отсутствуют опции <Bbip.Nl>, <Bbip.N2> и <Bbip.N3>, то производится копирование всего массива <мас- сив 1> в массив <массив 2>. Если отсутствуют опции <nbip.Nl> или <Bbip.N2> (или обе одновременно), то их позиция в формате функции должна быть зафиксирована символом «,* (запятая).
Поиск элемента массива
функция ASCAN осушсстнляет поиск значения <выр.> среди элементов указанного массива, начиная с элемента, имеющего порядковый номер <выр.М1>, до элемента с порядковым номером <Bbip.N2>. При успешном поиске функция возвращает порядковый номер разыскиваемого элемента, в противном случае — 0 (ноль).
Формат функции:
ASCAN( <массив>, <выр.> [, <выр.Х1> [, <вырЛМ2>]] )
Назначение опций:
<массив> — задает имя массива, в котором осуществляется поиск элемента.
<выр.> — задает условие поиска.
<выр.1Ч1> — указывает номер элемента, с которого начинается поиск.
<Bbip.N2> — указывает номер элемента, на котором заканчивается поиск.
Если отсутствуют опции <выр.К1> и <Bbip.N2>, то поиск производится по всему <массиву>. Если отсутствует опция <Bbip.NI>, то ее позиция в формате функции фиксируется символом «,* (запятая).
Сортировка элементов массива
Под сортировкой одномерного массива понимают упорядочение элементов массива либо по возрастанию, либо по убыванию. Под сортировкой элементов (строк или столбцов) двумерного массива понимают перестановку строк или столбцов массива в зависимости от значений какого-либо поля по возрастанию или убыванию. Формат функции:
ASORT( <массив> [, <выр.М> [, <Bbip.N2> [, <выр.Ш> ] ] ] )
где:
<массив> — задает имя сортируемого массива.
<Bbip.N3> — определяет направление сортировки. Если указан О (ноль), то производится сортировка по возрастанию (установка принята по умолчанию). Если указана 1 (единица), то производится сортировка по убыванию.
Назначение опций при сортировке одномерного массива:
<Bbip.Nl> — указывает номер элемента массива, с которого начинается сортировка.
<выр.Ш> — указывает номер элемента массива, на котором заканчивается сортировка.
Назначение опций при сортировке двумерного массива.
<Bbip.Nl> — задает номер столбца, по значениям которого будет производиться сортировка.
<Bbip.N2> — задает количество строк, которые будут переставляться в результа те сортировки. За начало отсчета принята текущая строка.
Если отсутствуют опции <выр.М1>, <Bbip.N2> и <ubip.N3>, то сортируется весь массив по возрастанию. Если отсутствуют опции <Bbip.Nl> или <выр.Ы2> (или обе одновременно), то их позиция в формате функции фиксируется символом «,* (запятая).
Получение сведений о структуре таблицы
Функция AFIELDS позволяет получить сведения о текущей таблице.
Формат функции:
AFIELDS( <массив>)
<массив> — имя двумерного массив.».
В результате работы функция AFIELDS возвращает количество полей текущей таблицы и создает двумерный массив, с указанным именем, каждая строка которого состоит из 11 столбцов и содержит информацию об одном поле:
имя поля,
тип поля (обозначается одной буквой),
размер поля.
размер дробной части числа,
допустимость пустого значения,
номер кодовой страницы,
условие достоверности вводимых значений в поле,
текст сообщения при нарушении достоверности на уровне поля,
значение поля по умолчанию,
условие достоверности на уровне записи,
текст сообщения при нарушении условия достоверности на уровне записи.
Количество строк <массива> определяется количеством полей таблицы.
Имея возвращенный функцией AFIELDS массив можно построить копию таблицы с помощью команды CREATE DBF языка запросов SQL.
Получение информации о файлах
Функция ADIR позволяет получить информацию о файлах текущего каталога.
Формат функции:
ADIR( <масснв> [, <выр.О ] )
<массив> — имя двумерного массива.
<выр.О — шаблон на ограничение количества файлов. Шаблон составляется с использованием символов и "?и.
В результате работы функция ADIR создает двумерный массив, с указанным именем, каждая строка состоит из пяти полей, в которых содержится информация об одном файле: имя файла (тип поля С ), размер файла (тип поля N), дата создания файла (тип поля D), время создания файла (тип поля С) и атрибут (тип поля С). Количество строк массива <массив> определяется количеством файлов.
Полученный массив <массив> удобно использовать в командах при создании меню.
Команды циклов
Также как и в языках программирования, при разработке приложений баз данных предусмотрены команды циклов. Назначение команд, а иногда и формат команд, аналогичное.
Цикл по условию
Формат команды:
DO WHILE <выр. L>
[LOOP1 [EXIT]
ENDDO
Цикл выполняется многократно, до тех пор пока истинно логическое условие <вьф. L>. Для принудительного выхода их цикла, до нарушс!шя логического условия <выр. L>, используют команду EXIT. Команда LOOP используется для прекращения вычислений, предусмотренных текущей итерацией, и принудительного перехода к следующей итерации внутри цикла.
Фиксированный цикл
Формат команды:
FOR <нер.> = <выр. Nl> ТО <выр. N2> [ STEP <выр. N3> ]
[ЕХГГ]
[LOOP]
ENDFOR | NEXT
Цикл выполняет фиксированное количество итераций (шагов).
<пер> называется переменной цикла. В переменной цикла фиксируется количество выполненных итераций, то есть после выполнения очередной итерации значение переменной цикла увеличивается на значение шага цикла <выр. N3>.
<выр. NI> задает начальное (стартовое) значение переменно! цикла.
<выр. N2> задаст конечное значение цикла.
<выр. N3> задает шаг цикла.
<выр. Nl>, <выр. N2> и <выр. N3> имеют целочисленный тип.
По умолчанию шаг цикла принят равным 1. Если <выр. N2> больше <пср.>, то цикл будет выполняться до тех пор, пока
<пер.> небудетбольше <выр. N2>. Это событие обязательно наступит, так как после выполнения каждой итерации переменная цикла <пер.> будет увеличиваться на 1 В некоторых случаях требуется, чтобы переменная цикла после выполнения каждой итерации увеличивалась быстрее, тогда в <выр. N3> указывают целое число, отличное от 1, которое и будет прибавляться к <пер.> после выполнения очередной итерации. Мы рассмотрели цикл на увеличение (сложение), то есть переменная цикла с каждой новой итерацией увеличивала свое значение на величину шага цикла <выр. N3> и цикл прекращался, когда переменная цикла <пер.> становилась больше <выр. N2>.
Допускается задание цикла на уменьшение (вычитание). В этом случае начальное значение <выр. Nl> переменной цикла <пер.> должно быть больше конечного значения <выр. N2>, а шаг цикла <выр. N3> должен бьггь целым и отрицательным. В этом случае после каждой выполненной итерации из переменной цикла <пер.> будет вычитаться значение шага цикла <выр N3> и цикл закончит свою работу после того, как переменная цикла <пер.> станет меньше конечного значения цикла <выр. N2>.
Цикл сканирования
Цикл сканирования организует просмотр записей текущей таблицы.
Формат команды:
SCAN
...
[ FOR <L1> ]
[ WHILE,L2>]
{NOOPTIMIZE ]
I LOOP 1 (EXIT)
ENDSCAN
Цикл сканирования работает аналогично циклу DO WHILE, но предназначен для работы с текущей таблицей. Назначение оп- 11 ий аналогичное. По умолчанию цикл сканирования выполняется для всех записей.
Команда выполнения
I «и нами М1НЧ1КЖ1 < л 1
Формат команды:
RUN <команда> | ! <команда>
Эта команда позволяет выполнить команду DOS или любую внешнюю команду, которая используется с приглашением DOS и подается в окне Command.
Команды ветвления алгоритма
При реализации сложных алгоритмов обработки данных, выбора одного решения из многих возможных, используют различные команды ветвления алгоритма.
Команда ветвления алгоритма на два направления
Формат команды:
1F <выр. 1> <онератор 1> [ ELSE <оп«ратор 2> ] ENDIF
Если логическое выражение <выр. L> истинно, то выполняется <опсратор 1>. Если логическое выражение <выр. L> ложно, то выполняется <оператор 2>.
Команда ветвления алгоритма на много направлений
Формат команды:
DO CASE CASE <условие 1>
оператор>
CASE <условие 2>
оператор>
[ OTHERWISE
оператор >
... |
ENDCASE
Количество блоков CASE <условис N> не ограничено. При работе команды DO CASE последовательно проверяются условия CASE <условие N> и выполняются все блоки, условия которых истинны. Поэтому’ для однозначной работы алгоритма необходимо, чтобы условия CASE <условие N> взаимно не перекрывались. Если все указанные условия ложны, то выполняется блок OTHFRWISE.
Варианты задания условий CASE <условис N>.
а. Точные условия.
Переменная условия точно равна какому-либо значению или точно не равна какому-либо значению
CASE Я ”= b или CASE а > b или C.ASE а < Ь
б. Диапазон значений.
Значение переменной условия задается диапазоном, включая границы диапазона.
CASE BETWEEN(ms, 01, 09)
в. Список значений.
Значение переменной условия задается списком. Элементы списка отделяются друг от друга запятой.
CASE INLIST(ms, ‘10’, ‘19’, ‘43’, ‘14’, ‘25*)
Для условия CASE <условие N> могут использоваться значения любого типа, но надо следить за правильностью использования типов данных в функциях.
7.8.3. Команда безусловного перехода
Формат команды:
СО | GOTO
(RECORD] <выр.М> | ТОР | ВОГТОМ [ IN <выр. \'2> | <псеадовим> ]
Команда переводит курсор внутри таблицы. Назначение опций:
I RECORD ] <выр. Nl> — переводит курсор на указанную запись.
ТОР — переводит курсор на первую запись.
BOTTOM — переводит курсор на последнюю запись.
IN <выр. N2> | <псевдоним> — задает номер рабочей области или пседоним рабочей области, в которой находится нужная таблица. По умолчанию имеется в виду активная таблица.
Примеры
Пример 1. Простейшие команды вывода
? 15 * (10 + 10) && выводит в следующую
строку экрана результат
вычисления выражения 300
? 'Привет' PICTURE '@!' && выводит в следующую " строку экрана значение
'Привет' строчными буквами.
?? 'Visual FoxPro' && выводит в текущую строку
экрана значение
'Visual FoxPro'
? DATE( ) FONT 'Courier',16 STYLE 'BI'
выводит в следующую
строку экрана текущую
текущую дату шрифтом *
типа Courier, размером 16
пунктов и жирным курсивом.
? 'Использование функций для вывода значений '+;
'в несколько строк' FUNCTION 'V10' выводит в && следующую строку экрана значение && 'Использование функций для вывода значений в && несколько строк', причем вывод организован в
&& несколько строк и длина каждой строки не более
&& 10 символов и слова переносятся целиком.
Пример 2. Очистка экрана.
@ 5,0 CLEAR && очищает прямоугольную область
экрана с координатами
левого верхнего угла 5, 0 и
координатами нижнего правого
угла экрана.
@ 15,5 CLEAR ТО 20,40 && очищает прямоугольную
* область экрана с
&& координатами левого верхнего угла 15, 5 и && координатами правого нижнего угла 20, 40.
CLEAR && очищает весь экран.
Пример 3. Использование универсальной команды ввода- вывода для вывода значения в указанном формате. Ключ «С* означает КРЕДИТ
CLEAR
@ 2, 10 SAY 52.75 FUNCTION 'С$$'
Если число положительное, то на экране добавляется признак кредита CR. Если число отрицательное, то оно выводится на экран в денежном формате без признака кредита.
Пример 4. Использование универсальной команды ввода-вывода для задания шрифта при выводе значения выражения GET <выр.1>
@ 5, 2 SAY 'Пример задания шрифта' FONT 'Courier', 16 @7,2 SAY 'Пример задания стиля {начертания шрифта}' STYLE 'BI'
Пример 5. Использование универсальной команды ввода- вывода для задания контроля правильности вводимых значений в переменную. Значения должны быть в диапазоне от «Сумка* до «Якорь», причем первая буква обязательно прописная (большая).
CLEAR
STORE " "ТО mmm
@2,2 SAY 2*(5+5) FONT 'Times New Roman', 12 STYLE '31';
GET mmm SIZE 1,7 VALID (mrrm>'' Сумка'' .AND. шик "Якорь") ;
ERROR "Введенное значение вышло за допустимый диапазон' '
READ
Введите значение «Вишня» и нажмите клавишу Enter. На экран будет выведено сообщение об ошибке. Введите значение, соответствующее установленному диапазону допустимых значений. Например — «Цапля*. Нажмите клавишу Enter. Программа закончит свою работу.
Аналогичного результата можно добиться, используя опцию RANGE.
CLEAR
STORE " "ТО гшп
9 2,2 SAY 2* (5 +5) PONT 'Times New Reman',12 STYLE 'BI' ; GET rnrm SIZE 1,6 RANGE 'Сумка', 'Якорь' MESSAGE "Введите; значение''
READ
Опция MESSAGE выводит в строку состояния сообщение «Введите значение».
Пример 6. Использование универсальной команды ввода- вывода дтя создания модальных кнопок Ok и Cancel с помощью кодов упраатения выводом.
9 15, 2 && Задает место на экране
- 15 строка и 2 столбец.
SIZE 2,8 && задает размер кнопок
2 - высота, 8 — ширина.
STORE 1 ТО mmm
© 15, 2 GET mmm FUNCTION ** OK;Cancel' SIZE 2, 8 READ
Пример 7. Создание тех же кнопок, что и в примере 6, но описание кнопок выполнено с использованием переменной-
STORE 1 ТО mmm
STORE '* OK;Cancel' TO ttt
9 15,2 GET mmm FUNCTION ttt SIZE 2, 8
READ
Пример 8. Создание тех же кнопок, что и в примере 6, с использованием шаблона.
STORE 1 ТО mmm
@2,2 GET mmm PICTURE '@* OK;Cancel' SIZE 1. 8 READ
STORE 1 TO mmm
@ 20,2 GET mmm PICTURE '8*' + ' OK;Cancel' SIZE 1, 8 READ
Пример 9. Одновременное использование шаблона и кода управления выводом.
CLEAR
STORE 1 ТО mmm
8 15,2 GET mmm FUNCTION '*';
PICTURE ' OK;Cancel' SIZE 3, 12 READ
CLEAR
8 2,2 GET nn FUNCTION '* OK;Cancel' DEFAULT 1;
SIZE 2, 10, 1
© 2,16 GET nn FUNCTION '* OK;CanceI' DEFAULT 1;
SIZE 2, 10, 2 READ
STORE 1 TO nn
8 2,2 GET nn FUNCTION '* \<OK;\<CANCEL;WDISABLED'; COLOR,,,,,W+/B,R/B,,GR+/B,W/B
READ
Пример 10. Использование универсальной команды ввода- вывода для вставки рисунка.
CLEAR
STORE 1 ТО mmm
® 15,2 SAY «Е:\M_DOC\Tiger.bmp* BITMAP SIZE 18,80;
CENTER ISOMETRIC
READ
Предполагается, что графический файл существует и хранится в указанном месте.
Пр им ер И. Редактирование переменной, заданной универсальной командой ввода-вывода.
STORE 1 ТО mmm.
STORE SPACE(15) ТО varName CLEAR
@2,2 AY 'Введите название : ' GET varName @ 4, 2 GET nmm PICTURE '@*RV яблоки;Апельсины; Лкмочы;Груши,-Мандарины; Выход'; VALID GOREC( )
READ CYCLE OBJECT 6
PROCEDURE gorec DO CASE
CASE mmm = 1
varName = «Яблоки» CASE mmm = 2
varName = «Апельсины» CASE nmm = 3
varName = «Лимоны» CASE mmm = 4
varName = «Груши»
CASE mmm = 5
varName = «Мандарины» CASE mmm = 6 Cancel
ENDCASE
@ 2, 2 SAY 'Введите название : ' GET varName SIZE 1, 12 RETURN
С помощью кнопок радиогруппы вводится желаемое значение. Для выхода из программы надо выбрать кнопку «Выход*. В этой программе использована внутренняя процедура gorec. Создание и работа с процедурами будут рассмотрены ниже.
.Пример 12. Команды для работы с одномерными массивами.
CLEAR
66
Открытие
таблиц
Fam
LOCATE FOR Fam.Key_fam *
SCATTER TO mas
? mas(l), mas(2)
12 66 Установка курсора
на 12 запись 66 Создание массива mas и помещение в него 12 записи 66 Вывод на экран
содержимого массива mas
GO
*
BOTTOM
SCATTER TO mas
? mas(l), mas(2) *
66 Установить курсор на последнюю запись 66 Создание массива mas и помещение в него последней записи
66 Вывод на экран содержимого массива mas
mas(1) = Key_fam + 1 *
mas(2) = «Некрасов»
ft
APPEND BLANK *
GATHER FROM mas * 66 Присвоение следующего порядкового номера 66 Значение следующей фамилии 66 Добавление пустой строки в конец таблицы Fam
66 Заполнение последней пустой строки таблицы Fam
BROWSE
Команда GATHER помещает значения элементов одномерного массива в текущую запись. Поэтому необходимо в конец таблицы Fam добавить пустую строку командой APPEND BLANK (после добавления пустая запись автоматически становится текущей), а потом применить команду GATHER.
Пример 13. Команды для работы с двумерными массивами.
CLEAR
USE E:\PRIMER\Fam.dbf && Открытие таблицы Fam
DIMENSION Temp(3,2)
COPY NEXT 3 TO ARRAY Temp DISPLAY MEMORY LIKE Temp GOTO BOTTOM Temp(1,1) = Key_fam + 1
Temp(2,1) = Key_fam + 2
Temp(3,1) = Key_fam + 3
Temp(1,2) = «Есенин»
Temp(2,2) = «Блок»
Temp(3,2) = «Северянин»
APPEND FROM ARRAY Temp BRCWSE
Команда APPEND FROM ARRAY добавляет новые записи в конец табличного файла, поэтому нет необходимости принудительно помещать в конец таблицы пустые записи. Однако двумерный массив-источник данных надо формировать заранее и следить за соответствием типов элементов массива типам соответствующих полей таблицы.
Пример 14. Вывод на экран списка имен полей текущей таблицы.
CLOSE ALL
USE E:\PRIKER\Author.dbf IN 4 ALIAS aut && Открытие таблицы Author ms = AFIELDS(Massiv, 4)
&& Определение количества полей текущей && таблицы и занесение имен полей таблицы в && массив Massiv. Таблица находится в четвертой && рабочей области
CLEAR
FOR nCount = 1 ТО ms
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
ENDFOR
В программе предусмотрен вывод на экран восьми характеристик (из одиннадцати возможных) для каждого поля таблицы Author.
Пример 15. Поиск значения в массиве.
CLOSE ALL CLEAR
USE E:\PRIMER\Fam.dbf IN 5 ALIAS fan
&& Открытие таблицы Fam
SELE fam
COPY TO ARRAY Prom && Копирование в двумерный
массив Pron первых 7
строк из таблицы Fam
gnPos = ASCAN(Prom, 'Гоголь')
&& Поиск в таблице Fan
значения 'Гоголь'
IF gnPos != 0
? 'Номер найденного элемента = ', gnPos
&& Вывод на экран порядкового
номера найденного элемента ENDIF
NunRec = ASUBSCRIFT(Prom, gnPos, 1)
Отределени номера строки,
в которой находится
найденное значение.
? ''Номер записи = '', NumRec
DISPLAY RECORD NumRec && Вывод строки с найденным- {
значением на экран.
Пример 16. Вставка элемента массива.
CLOSE ALL CLEAR
USE E:\PRIMER\Fam.dtof && Открытие таблицы Fam DIKENS-ON mmm(10,2), CCt(10,2)
COPY TO ARRAY mmm
FOR i = 1 TO 10 && С здание копии массива rrarm
ttt(i, 1) = mmm(i, 1) ttt(i, 2) = mmm(i, 2)
EKDFOR
= AINS( mmm, 5,1) && Вставка пустой строки
выше пятой строки массиза
FOR i = 1 to 10 && Вывод на экран массива
mmm и массива ttt
? ttt (i, 1) AT 1, ttt (i, 2) AT 12, mmm{i, 1)
AT 30, mmm(i, 2) AT 45 ENOFOR
Массив ttt содержит записи до добавления пустой
строки с номером пять.
Пример 17. Удаление элемента массива.
CLOSE ALL CLEAR
USE E:\PRlMER\Fam.dbf && Открытие таблицы Fart
DIMENSION mmm(10,2), ttt(10,2)
COPY TO ARRAY mmm
FOR i = 1 ТО 10 ttt(i, 1) = mmm(i, 1) tct (i, 2) = mmm(i, 2) ENDFOR
= ADEL( mnm, 5, 1)
FOR
i = 1 to 10 *
? ttt (i, 1) AT 1, ttt(i, 2) AT 12, mmm(i, 1);
AT 30, 2) AT 45
ENDFOR
Пример 18. Просмотр оглаатения каталога.
SET DEFAULT TO E:\Primer *
nn = ADIR(mmm, '1.dbf')
*
*
*
CLEAR
FOR i = 1 TO ПП *
? mmm(i, 1)
ENDFOR && Задание полного имени каталога && Создание массива mmm, определение типов файлов '*.dbf' и их количества nn
&& Вывод на экран имен отобранных файлов
Пример 19. Копирование элементов из одного массива в другой массив.
&&
Открытие
таблицы Fam
&£t
Описание
двух двумерных массивов mmm
и
ttt
&&
Копирование записей из таблицы Fam
в
массив mmm
USE E:\Prinier\Fam.dbf CLEAR
COPY
*
TO ARRAY mmm
= ACOPY(nmm, tu, 5, 6, 4 )
&& Копирование из массива mmm в массив ttt DISPLAY MEMORY LIKE ttt && Вывод на экран массива ttt
В массив mmm копируются первые десять записей из таблицы Fam Функция ACOPY читает из массива mmm, начиная с пятого элемента (третья строка первый столбец), шесть элементов (третью, четвертую и пятую строки полностью) и помещает их в массив ttt, начиная с четвертого элемента (с третьей строки первого столбца).
Пример 20. Сортировка элементов двумерного массива mmm.
CLOSE ALL
USE E:\?rimer\Fam.dbf && Открытие таблицы Fam CLEAR
DIMS mmm(15,2) && Описание двумерного массива
COPY TO ARRAY mmm FIELDS Key_fam, Name_fam
&&
Отсортировать в массиве mmm
по
значениям второго столбца первые
восемь строк в порядке убывания
&&
вывод на экран пустой
&&
Вывод на экран отсортированного
массива mmm
FOR i=l TO 15 &&
*
*
? mmm(i.1), mmm(i,2) ZNDFOR
= ASORT(mirm, 2, 8, 1)
*
*
*
Вывод на экран не отсортированного массива mmm
Пример 21. Сохраните переменных в памяти компьютера. CLEAR А41 = 50 А42 = 'Hello'
В34 = 48 В55 = 'Москва'
SAVE ТО temp && сохраняет в файле с именем
temp все переменные SAVE ТО abc ALL LIKE а* && сохраняет в файле с именем
abc все переменные,
имена которых начин-ются
с бухвы а
SAVE ТО ttt ALL EXCEPT а* && сохраняет в файле с
именем ttt все временные,
имена которых начинаются
с любой буквы, кроме а CLEAR MEMORY
Пр и м е р 22. Восстановление переменных в памяти компьютера.
CLEAR
g3 = '25/01/2000'
RESTORE FROM temp ADDITIVE DISPLAY MEMORY LIKE a*
DISPLAY MEMORY LIKE b*
DISPLAY MEMORY LIKE g*
Восстанатжвает в оперативной памяти переменные, с именами, отличными от имеющихся в оперативном памяти из файла temp, с сохранением в оперативной памяти уже имеющихся переменных с совпадающими именами.
Пример 23. Удаление переменных из оперативной памяти. CLEAR А41 = 50 А42 = 'Hello'
В34 = 48 В55 = 'Москва'
RELEASE |
ALL |
LIKE |
b* |
DISPLAY |
MEMORY |
LIKE |
a* |
DISPLAY |
MEMORY |
LIKE |
b* |
DISPLAY |
MEMORY |
LIKE |
g* |
Контрольные вопросы
Как задать продолжение команды на другой строке?
Как задать комментарий в тексте программы?
По каким правилам задаются имена переменных?
Как определяется тип переменной?
Какими командами описываются массивы?
Как определяется тип элементов массива?
Укажите два способа присвоения значений переменным и элементам массива
Укажите варианты способов хранения значений переменных и напишите команду для сохранения переменных.
Напишите команду по восстановлению ранее сохраненных значений переменных.
Укажите два варианта восстановления значений переменных.
Укажите варианты вывода значений переменных на экран.
Как удалить переменные из оперативной памяти?
Какие команды работают с одномерными массивами, а какие команды работают с двумерными массивами?
Укажите особенности работы команды SCATTER.
Укажите особенности работы команды GATHER
Укажите особенности работы команды COPY ТО ARRAY.
Укажите особенности работы команды APPEND FROM ARRAY.
Укажите назначение и особенности работы команд ?и??.
Расскажите о назначении и особенностях работы универсальной команды ввода-вывода.
Укажите два способа обращения к элементам двумерного массива и напишите функции для пересчета координат элемента массива.
Расскажите о вариантах использования функции копирования элементов массива.
Что значит сортировать элементы одномерного и двумерного массивов?
Какая функция выполняет сортировку элементов одномерного массива и элементов двумерного массива?
Сравните принцип работы функции сортировки элементов массива и команды сортировки табличного файла.
Расскажите об особенностях функции добаатения новых элементов в одномерный массив и в двумерный массив.
Расскажите об особенностях функции удаления элементов одномерного массива и элементов двумерного массива.
Как получить сведения о структуре таблицы (и вывести их на экран)?
В базах данных меню является основным инструментом диалога. В FoxPro предусмотрены возможности для создания меню различных типов. Управление работой меню осуществляется либо мышью, либо с клавиатуры.
Световое меню — это набор пунктов (элементов) меню, один из которых является активным, то есть выделен цветом. Выбор пункта меню осуществляется либо щелчком мыши на пункте меню, либо с помощью клавиш-стрелок курсор устанавливается на нужный пункт меню и нажимается клавиша Enter. Отказ от выбора пункта мешо — нажатие клавиши Esc.
Вызванное световое меню накладывается, как правило, поверх прежнего изображения на экране. После удаления меню с экрана происходит автоматическое восстановление первоначального вида экрана. При работе с меню допускается использование клавишных команд, дублирующих выбор пункта мешо. Такие клавишные команды называются «горячими* клавишами. Если меню многоуровневое (три и более уровней), то использование «горячих» клавши становится эффективным средством работы с меню.
При работе прикладных программ, содержащих меню, на экран могут выводиться системные сообщения. Текст системных сообщений накладывается на элементы меню и впоследствии не удаляется. Для запрета вывода на экран системных сообщений используется команда SET TALK OFT.
По умолчанию системные сообщения выводятся на экран, то есть установлена команда SET TALK ON.
При работе со световым меню можно задать режим, когда при нажатии клавиши с первой буквой имени пункта меню этот пункт (команда) меню становится активным. Для задания этого режима используется команда SET CONFIRM OFF.
Бели устаноилена команда SETT CONFIRM ON, то после нажатия клавиши-буквы дополнительно надо нажать либо клавишу Enter, либо клавишу SpaccBar.
При работе конкретного приложения в разные моменты времени некоторые пункты меню могут быть не доступны для выбора и на экране выделены в полтона (бледно). Для того чтобы сделать пункт меню недоступным для выбора, надо перед именем пункта установить символ Д*. В вертикальных (POPUP) меню иногда необходимо одну группу пунктов отделить разделительной чертой от других пунктов меню, причем курсор на разделительной черте не фиксируется. Для этих целей вместо имени пункта меню надо указать сочетание двух символов «\-*.
В FoxPro предусмотрены две технологии построения меню: FOX-меню и dBASE-мсню.
Меню типа FOX активны только во время работы программы и являются частью про!раммы. При выборе пункта такие меню вырабатывают числовой код, который запоминается и анализируется с последующей выработкой реакции на выбор пункта меню. Как правило, анализ выбора пользователя осуществляется с помощью оператора DO CASE... ENDCASE. Из меню этого типа можно сделать единственный выбор. Чтобы организовать многократный выбор из меню, надо описание меню поместить внутрь цикла.
Меню типа dBASE после своего описания остается в оперативной памяти резидентно и может многократно вызываться на экран и удаляться с экрана. Меню может вызываться не только из конкретного приложения, но и из окна Command даже в том случае, если закрыта база данных и программный файл закончил свою работу. Для удаления меню из оперативной памяти предусмотрены специальные команды (см. п.п. 8.2.1.7—8.2.1.11). При своей работе меню вырабатывает не только числовые коды, которые фиксируют выбор пользователя, но и непосредственно вызывает процедуры и команды на выполнение. В качестве пунктов меню здесь можно использовать имена файлов и структуру базы Данных, а также организовать множественный выбор пунктов меню.
МЕНЮ ТИПА FOX
Меню nma FOX существует в трех вариантах. Максимальное количество пунктов меню — 128.
Меню произвольного типа. LIGHTBAR-меню
Меню этого типа помешается в оперативную память и выводится на экран для работы одной командой. Для создания меню предусмотрены следующие команды.
Команда описания пункта меню
@ У.Х PROMPT <выр.С1> [MESSAGE <выр.С2>]
Команда выводит в позицию Y, X экрана строку меню <выр.С1>. Опция MESSAGE предназначена для вывода в строку состояния (или заранее указанную строку) дополнительное сообщение <выр.С2>. Это сообщение выводится в момент размещения курсора на пункте меню. Если дополнительное сообщение надо вывести в определенную строку экрана, то перед этой командой надо указать команду SET MESSAGE ..., формат которой описан ниже. Само меню состоит из набора команд @ Y,X PROMPT ....количество которых не более 128.Таккакко- манды не связаны между собой, то пункты меню будут располагаться на экране произвольным образом (положение каждого пункта определяется координатами Y и X). Переход от одного пункта меню к другому осуществляется с помощью кланиш-стрелок. Порялок обхода определяется порядком описания пунктов меню. Активный пункт меню выделяется либо цветом, либо яркостью.
Команда фиксации выбора пользователя
\1ENU ТО <переменная>
Команда запоминает в <переменной> порядковый номер (по описанию в тексте программы) выбранного пункта меню. При нажатии клавиши Fsc (отказ от выбора пункта меню) в <пере- менную> заносится 0 (ноль). Команда SET MESSAGE ТО [ <выр.1Ч> [ LEFT | RIGHT | CENTER ] ] предназначена для указания номера строки экрана <Bbip.N>, в которую выводится дополнительное сообщение, и для указания места вывода внутри строки:
LEFT — дополнительное сообщение форматируется по левому краю строки.
RIGHT — дополнительное сообщение форматируется по правому краю строки.
CENTER — дополнительное сообщение форматируется по центру строки.
При использовании команды SET MESSAGE ТО ... в команде @ Y,X PROMPT ... обязательно должна быть указана опция MESSAGE.
Команда SET MESSAGE ТО без параметров выводит дополнительное сообщение в последнюю строку экрана. Эта команда работает как в FOX-меню, так и в dBASE-меню.
Вертикальное POPUP-меню
Для создания этого меню предусмотрены команды как для описания меню, так и для предъявления меню на экран. При необходимости линейка прокрутки подключается автоматически.
Команда создания и отображения меню на экране
@ Y,X MENU <массив>, <выр.М> [, <Bbip.N2> ] (TITLE dup.O (
Назначение опций:
<массив> — имя одномерного массива. Массив должен быть заранее описан. Элементы массива содержат названия пунктов меню. Максимальная длина названия пункта меню — 50 символов. <Bbip.Nl> — число пунктов меню (не более 128).
<Bbip.N2> — число одновременно предъявляемых на экран пунктов меню. По умолчанию отображается 17 пунктов меню.
TITLE <выр.О — заголовок меню, который отображается в верхней части меню.
Команда фиксации выбора пользователя
READ MENU ТО <персменная> [ SAVE J Назначение опций:
<переменная> — имя переменной целого типа, в которой фиксируется номер выбранного пользователем пункта меню. Если до подачи команды <персменной> бьпо присвоено значение, то после предъявления меню на экран указанный пункт меню будет активным (выделенным). В противном случае выделен будет первый пункт меню.
SAVE — сохраняет на экране образ меню после выхода из него. В этом случае удалить с экрана образ меню можно только командой CLEAR
Далее в программе производится анализ <переменной> в операторе DO CASE... ENDCASE.
Двухуровневое PULLDOWN-меню
Двухуровневое меню состоит из горизонтального и вертикального меню. Используя эти же команды, можно создать только горизонтальное меню Здесь также предусмотрены команды для создания меню и команды для использования меню.
Команда определения горизонтального меню
MENU BAR <масснв>, <Bbip.N>
Определяет и выводит на экран горизонтальное меню. Назначение опций:
<массив> — имя двумерного массива. Размерность массива (п, 2). В первом столбце указываются названия пунктов меню, а во втором — комментарии к пунктам меню. Комментарии выводятся либо в последнюю строку экрана, либо в строку, указанную командой SET MESSAGE ТО ... Комментарии описывать не обязательно, но массив должен быть обязательно двумерным и если комментарии отсутствуют, то значения второго столбца — пустые строки.
<выр.1Ч> — обшее число пунктов меню.
В горизонтальном меню на экран выводится столько пунктов меню, сколько уместится на экране. Для предъявления на экран остальных пунктов меню надо несколько раз нажать клавишу «стрелка вправо».
Команда описания подчиненного меню
MENU <Bwp.Nl>, <маесив>, <ewp.N2> [, <swp.N3> ]
Команда определяет вспомогательное меню и его «привязку* к соответствующему пункту главного меню. Назначение опций:
<Bbip.Nl> — определяет номер пункта главного меню, который
будет вызывать описываемое вспомогательное меню.
<Bbip.N2> — число пунктов вспомогательного меню. Это число в
общем случае может не соответствовать размерности <массива>.
<выр.\3> — число одновременно показываемых пунктов меню. Если <Bbip.N3> меньше <Bbip.N2>, то автоматически подключается линейка прокрутки.
<массив> — имя одномерного массива, элементы которого содержат названия пунктов вспомогательного меню.
Команда фиксации выбора пользователя
READ MENU BAR ТО <nep.l>, <пер.2> [SAVE]
Назначение опций:
<пер.1> — целочисленная переменная, в которую записывается номер выбранного пункта главного меню.
<пер.2> — целочисленная переменная, в которую записывается номер выбранного пункта вспомогательного меню.
SAVE — сохраняет на экране образ меню, после выхода из него. В этом случае удалить с экрана образ меню можно только командой CLEAR.
При нажатии клавиши Esc обе переменные <пер.1> и <пер.2> получают значение 0 (ноль).
При создании двухуровневого FOX-меню команды следует располагать в следующем порядке:
а) Описываются и заполняются данными массивы главного и всех вспомогательных меню.
б) Описывается главное меню командой MENU BAR...
в) Описываются все вспомогательные меню с помощью комавд MENU...
г) В нужных местах программы указываются команды READ MENU BAR ... для активации всей конструкции меню.
д) После каждой команды READ MENU BAR ... пишется обработчик выбора пункта меню, как правило, с помощью оператора DO CASE ... ENDCASE.
МЕНЮ ТИПА dBASE
При создании и эксплуатации данного меню должны быть предусмотрены следующие элементы:
определение меню — описывается содержание меню, клавиши быстрого доступа, форма и реакции меню. Меню типа dBASE определяется один раз;
активация меню — команды (клавиши быстрого доступа) активации выводят меню на экран и делают его чувствительным к выбору пользователя;
деактивация меню — меню удаляется с экрана, но остается в оперативной памяти, и впоследствии может быть предъявлено на экран;
удаление меню — меню удаляется из оперативной памяти. Для нового использования меню его надо заново определять.
Меню типа dBASE бывает двух видов: вертикальное (POPUP) и горизонтальное (BAR). Эти два вида меню могут использоваться как совместно, так и по отдельности. Допускается создание иерархических меню любой сложности.
Вертикальное POPUP-меню
Меню предъявляется на экран в указанном месте в виде прямоугольной области заданного размера. В качестве пунктов меню можно задать либо имена файлов из указанного каталога, либо структуру табличного файла, либо произвольные строки.
Команда определения меню
DEFINE POPLP <имяменю>
[FROM <Y1,XI> J I ТО <Y2,X2>]
[IN [WINDOW] <нмнокиа> | IN SCREEN]
[FOOTER <выр.С1>]
[KEY <имяклавишн>]
[ MARGIN ]
[ MARK <выр.С2> ]
[ MESSAGE <выр.СЗ> ]
[MOVER]
[ MULTI ]
[PROMPT FIELD <выр.>] | [PROMPT FILES LIKE <шаблон>]]
| [ PROMPT STRUCTURE 1
[SCROLL] [ SHADOW ]
[ TITLE <выр.С4> 1
[ COLOR <сннсок пар цветов> | СО! OR SCHEME <ewp.N> J
Назначение опций:
<нмя меню> — содержит имя создаваемого меню. Программист задает имя меню буквами латинского апфавита.
FROM <Y1,X1> ТО <Y2, Х2> — определяет положение и размер меню на экране. <Y1,X1> задает координаты левого верхнего угла меню ( номер строки и номер столбца соответственно). <Y2, Х2> задаст координаты правого нижнего угла меню (номер строки и номер столбца соответственно). Если <Y2, Х2> не указаны. то ширина меню определяется размером максимального имени пункта меню, а длина меню — либо количеством пунктов меню, либо — весь экран. Если <YL, XI> не указаны, то правый верхний угол меню помещается либо в левый верхний угол экрана (координаты 0, 0), либо под соответствующим пунктом вызвавшего (старшего) меню.
IN [WINDOW] <нмяокна> — определяет имя окна, внутри которого будет открыто создаваемое меню.
IN SCREEN — создаваемое меню будет открыто на экране. FOOTER <выр.С1> — название (заголовок) меню пишется в центре нижней области меню.
KEY <нмя клавиши> — указывается имя клавиши, которая будет вызывать меню.
MARGIN — задает по одному пробелу слева и справа от имени пункта меню В этих пробелах, в случае необходимости, будут располагаться специальные символы: слева — символ множественного отбора пунктов меню, справа — символ наличия подчиненного (младшего) меню.
MARK <выр.С2> — устанавливает тип (вид) символа множественного отбора пунктов меню. По умолчанию принят символ ♦, код которого по таблице ASCII — 4.
MESSAGE <выр.СЗ> — дополнительное сообщение (комментарий), которое выводится либо в последнюю строку экрана, либо в строку, которая задана командой SET MESSAGE.
MOVER — предоставляет возможность перемешать на экране пункты меню внутри области меню с помощью мыши.
MULTI — устанавливает режим множественного отбора пунктов меню. Множественный отбор выполняется при зажатой клавише Shift. Этот режим не работает, если используется одна из опций PROMPT FIELDS | PROMPT FILES | PROMPT STRUCTURE. PROMPT FIELD <выр> — пунктами меню будут значения поля (или полей), указанного в <выр.>. Если в <выр> надоуказатьнс- сколько полей, то их имена перечисляются через знак «+» (плюс). Имена полей можно указывать как из активной таблицы, гак и из пассивных таблиц. Если значения полей имеют разный тип, то в <выр.> допускается использование функций, с целью приведения значений полей к одному типу, как правило, символьному. При использовании этой опции нет возможности организовать множе- ствсшшй отбор пунктов меню. Если необходимо организовать множественный отбор, то процедуру множественного отбора надо программировать отдельно (см. примеры в конце раздела).
PROMPT FILES LIKE <шаблон> — задает в качестве пунктов меню имена файлов из текущего каталога. С помощью <шаблона> можно ограничить количество имен файлов. PROMPT STRUCTURE — задаст в качестве пунктов меню структуру активной таблицы.
SCROLL — автоматически подключает полосу прокрутки, если пункты меню не умещаются в отведенной области.
SHADOW — обрамляет область меню «тенью».
TITLE <выр.С4> — заголовок меню пишется в центре верхней области меню.
COLOR <список пар пветов> | COLOR SCHEME <выр.М> — устанавливает цвет элементов меню либо указанием конкретной пары цветов (цвет фона и цвет букв), либо указывается номер схемы. По умолчанию установлена схема 2.
Команда описания пункта меню
DEFINE BAR <eup.Nl> OF <имя POPUP мсию> PROMPT <»ыр.С1> [ KEY <имя клавиши> [, <выр.С2> ] ]
[ BEFORF <Bup.N2> | AFTER <Bup.N3> ]
[ MARK <выр.СЗ> ]
[MESSAGE <выр.С4>]
[ SKIP [ FOR <Bup.L> ] 1
[ COLOR <список пар цвстов> | COLOR SCHEME <Bbip.N4> ]
Команда задает название пункту меню, закрепляет за пунктом меню клавишу быстрого выбора и управляет активностью пункта меню. Назначение опций:
<выр.1\1> — задаст номер описываемого пункта меню.
<имя POPUP меию> — определяет, какому меню принадлежит описываемый пункт.
<выр.С1> — определяет название описываемого пункта меню.
KEY <иля клавиши>, <выр.С2> — назначает клавишу быстрого выбора пункта меню и комментарий ( <выр.С2> ) к пункту меню.
BEFORE <Bbip.N2> — назначает порядок вывода на экран пунктов меню по возрастанию их номеров, начиная с номера <BUp.N2>.
AFTER <Bbip.N3> — назначает порядок вывода на экран пунктов меню по убыванию их номеров, начиная с номера <Bbip.N3>. MARK <выр.СЗ> — устанавливает тип (вид) символа множественного отбора пункта меню. По умолчанию принят символ ♦, код которого по таблице ASCII — 4. Если символ множественного отбора определен в команде DEFINE РО PUP, то здесь производится переопределение символа множественного отбора.
MESSAGE <выр.С4> —дополнительное сообщение (комментарий), которое выводится либо в последнюю строку экрана, либо в строку, которая задана командой SETT MESSAGE.
SKIP FOR <выр.Е> — делает пункт меню недоступным для выбора пользователя. Если указан параметр FOR <выр.1>, то пункт мешо будет доступен для выбора при истинности логического условия <выр.Ь>.
COLOR <список пар цветов> | COLOR SCHEME <выр.М> —
устанавливает цвет элементов меню либо указанием конкретной пары цветов (цвет фона и цвет букв), либо указанием номера схемы. По умолчанию установлена схема 2.
Команда определения реакции на вызов меню ON SELECTION POPUP <нмя POPUP меню> | ALL [ <комавда> I
к
определена. Если указана опция ALL, то указанная [ <коман- да> | выполняется для всех POPUP-меню. В параметре [ <команда> ] может быть указана любая команда, но чаще всего используется команда DO, которая вызывает на выполнение процедуру, созданную пользователем. Команда, указанная в параметре [ <команла> ], является общей для всего POPUP-меню. По окончании выполнения процедуры (или команды) управление опять передается POPUP-меню, при условии, что внутри процедуры не было команды DEACTIVATE POPUP. Далее можно выбрать любой пункт меню.
Команда определения реакции на вызов пункта меню
ON SELECTION BAR <Bwp.N> OF <нчя РОРиР-меню> [<команда>]
При выборе пункта меню с номером <выр.1Ч> изменю <имя POPUP мсию>, выполняется команда, определенная в [<ко- манда>] . Команда ON SELECTION BAR ... пишется после команды DEFINE POPUP ..., но до команды ACTIVATE POPUP ... Если команда ON SELECTION BAR используется без параметра [<комакда>], то отменяется ранее сделанное закрепление.
Комацда закрепления подчиненного (младшего) меню
ON BAR <выр.1Ч> OF <имя РОР1/Р-менк>>
[ ACTIVATE POPUP <имя POPUP меню 2> |
ACTIVATE MENU <имя BAR меию> ]
Команда назначает вызов подчиненного (младшего) меню, закрепленного за пунктом <Bbip.N> меню <имя POPUP- меню> . Подчиненное (младшее) меню может быть как вертикальным ACTIVATE POPUP <имя POPUP-меню 2>, так и горизонтальным (ACTIVATE MENU <имя ВАИ-меню>).
Использование команды ON BAR без опции отменяет закрепление подчиненного меню. Если за пунктом текущего меню закреплен вызов подчиненного меню, то справа от названия пункта текущего меню автоматически устанавливается символ ► , место для которого надо предусмотреть с помощью опции MARGIN команды DEFINE POPUP ...
Команда активации меню
ACTIVATE POPUP <имя POPUP мсшо>[АТ Y,X)
[ BAR <выр.1Ч> ]
[NOWAIT]
[REST]
Команда предъяшшет меню на экран и делает его доступным для выбора пользователя. Назначение опций :
AT Y, X — переопределяет координаты экрана (окна), куда помешается первый верхний угол меню. Эта опция имеет приоритет перед определением положения меню в команде DEFINE POPUP ...
BAR <BbJp.N> — определяет номер текущего (активного) пункта меню, после вывода всего меню на экран.
NOWAIT — разрешает дальнейшее выполнение программы, не дожидаясь закрытия меню.
REST — определяет текущим пунктом меню текущую строку активной таблицы. По умолчанию это первая строка активной таблицы. Эта опция имеет смысл только в том случае, если в команде DEFINE POPUP указана опция PROMPT FIELD.
Для этих же целей предусмотрена и вторая команда:
SHOW POPUP <список имен POPUP Meiuo>]|ALL [SAVE]
Команда предъявляет на экран либо меню указанные в <спи- скс имен РОРиР-мсню>, либо все меню (ALL ) Если указана опция SAVE, то после закрытия меню их образ остается на экране.
Команда деактивации меню
DEACTIVATE POPUP
Команда удаляет меню с экрана, но сохраняет его в оперативной памяти. Этот же результат получается при нажатии клавиши Esc или при переходе к другому POPUP-меню.
В любом случае управление передается следующей команде по ходу программы.
Если обработчиком выбранного пункта меню является специальная процедура, то последней выполняемой командой может быть:
последняя команда процедуры;
команда RETURN;
команда DEACTIVATE POPUP.
Если вместо выбора пункта меню нажата клавиша Esc, то обращение к процедуре не производится.
Удаление всех POPUP-меню
CLEAR POPUPS
Команда удаляет с экрана и из оперативной памяти все POPUP-меню.
Удаление указанных POPUP-меню
RELEASE POPUPS [Cciihcok имен POPUP мсню> [ EXTENDED J]
Команда удаляет с экрана и из оперативной памяти меню, перечисленные в <списке имен РОРиР-меню>. Если указана опция EXTENDED, то удаляются не только все перечисленные меню, но и все подчиненные меню. Если опция Ссписок имен РОРиР-меню> не указана, то удаляются все POPUP-меню.
Удаление пунш меню
RELEASE [ BAR Ссписок имен пунктов РОРиР-меню> | ALL ] OF С нм я РОРиР-меню>
Команда удаляет с экрана и из оперативной памяти либо указанные, либо все пункты POPUP-меню. Имя меню задается в опции OF Симя РОРиР-меню> .
Удаление меню с экрана
HIDE POPUP Ссписок имен POPUP-Memo> | .ALL [ SAVE J
Команда удаляет с экрана либо перечисленные в Сспискс имен РОРиР-меню>, либо все (ALL) POPUP-меню, но сохраняет их в оперативной памяти. Эта команда идентична команде
DEACTIVATE POPUP. Опция SAVE сохраняет на экране образ меню, хотя само меню с экрана удалено.
Перемещение меню по экрану
MOVE POPUP <имя РОРиР-ченю> ТО Y, X | BY <выр.М1>, <Bbip.N2>
Команда перемешает активное POPUP-меню в новое положение на экране. Новое положение задается либо абсолютными координатами ( Y, X ), либо относительными координатами (<выр.Ы1>, <Ubip.N2>).
Для работы с вертикальным POPUP-меню предусмотрены следующие функции:
BAR0 — фиксация выбора пункта меню. Функция возвращает номер выбранного пользователем пункта меню. Если никакое меню не выбрано (нажата клавиша Esc), то функция возвращает 0 (ноль). Номера пунктам меню присваиваются в команде DEFINE BAR ...
POPUPO — получение имени активного POPUP-меню. Функция возвращает строчными (большими) буквами имя активного POPUP-меню.
PROMPT0 — получение названия (имени) пункта меню. Функция возвращает название (имя) пункта меню. Если в команде DEFINE POPUP была указана опция:
PROMPT FIELD, то возвращается содержимое поля из текущей записи активной таблицы.
PROMPT FILE, то возвращается полное имя файла;
PROMPT STRUCTURE, то возвращается имя выбранного поля.
Если никакое меню не выбрано (нажата клавиша Esc), то возвращается пустая строка.
CNTBAR( [ <имя РОРиР-меню> ] ) — определение количества пунктов меню. Функция возвращает количество пунктов указанного POPUP-меню. Если параметр <имя РОРиР-меню> опущен, то функция возвращает количество пунктов активного меню.
MRKBAR(<iimh РОРиР-меню>, <выр. N>) — определение активного пункта меню. Функция возвращает логическое значение «истина» (.Т.), если пункт меню с номером <выр. N> является активным. В противном случае возвращается логическое значение «ложь» (.F.). Функция полезна при организации множественного отбора пунктов меню.
Горизонтальное BAR-меню
Как правило, горизонтальное меню располагается в первой строке экрана и на его основе строится главное меню программы. В общем случае горизонтальное меню может располагаться в любой строке экрана и даже замешать главное меню FoxPro.
Для создания горизонтального меню предусмотрены следующие команды.
Определение горизонтального меню
DEFINE \1ENU <имямсию>
( BAR [ AT LINE <выр.М> ] 1
JIN [WINDOW] <имяокна> | IN SCREEN]
[ KEY <имя клавнпт> [, <выр.С1>[ ]
[ MARK <выр.С2> ]
[MESSAGE <выр.СЗ>]
[ NOMARC IN ]
[ COLOR <снисок пар цвстов> | COLOR SCHEME <Bbip.N> 1
Назначение опций:
BAR — автоматически подключает полосу прокрутки, если строка меню не умещается на экране.
AT LINE <выр.Ы1> — задает номер строки экрана дтя вывода горизонтального меню.
IN [WINDOW] <ичяокна> — размещает описываемое горизонтальное меню в указанном окне.
IN SCREEN — размешает описываемое горизонтальное меню на экране.
KEY <имя клавиши> [, <выр.С1>] — назначает клавишу (или комбинацию клавиш) для активации горизонтального меню. При установке курсора на пункт меню выводится дополнительное сообщение <выр. С1> в строку состояния.
МАКК <выр.С2> — определяет символ множественного отбора пунктов меню.
MESSAGE <выр.СЗ> — выводит комментарий к выбранному пункту меню либо в строку состояния, либо в заранее указанную с помощью команды SET MESSAGE ТО ... строку.
NOMARGIN — удаляет пробелы слева и справа от имени пунктов меню.
COLOR <список пар цветов> | COLOR SCHEME <Bbip.N> — определяет цвет фона и нвет букв пунктов меню.
Описание пунш горизонтального меню
DEFINE PAD <имя пункта меню> OF <имя BAR-4emo> PROMPT <выр.С1>
[ AT Y, X1
[ BEFORE <имя пункта мсшо> | AFTER <нмя пункта меыю> ]
[ KEY <имя клавишн> [, <выр. С2> ] ]
I MARK <выр.СЗ> 1 [ SKIP [ FOR <выр.1> ] |
[ MESSAGE <выр.С4> ]
[COLOR <список пар цветов> | COLOR SCHEME <eup.N> ]
Назначение опций:
<имя пункта меню> — определяет имя пункта меню. Имя пункта меню пишется буквами латинского алфавита. На имя пункта меню производятся ссылки при программном обращении к пункту' меню.
<имя BAR меню> — имя горизонтального меню, которому принадлежит описываемый пункт меню.
PROMPT <выр.С1> — определяет название пункта меню, которое выводится на экран.
AT Y,X — переопределяет расположение пункта меню на экране.
BEFORE <имя пункта меню> — задает порядок обхода пунктов меню по возрастанию, начиная с пункта <ичя пункта мсню>.
AFTER <имя пункта меню> — задает порядок обхода пунктов меню по убыванию, начиная с пункта <имя пункта меню>.
L
ке курсора на пункт меню выводится дополнительное сообщение <выр. С2> в строку состояния.
MARK <выр.СЗ> — переопределяет символ множественного отбора пунктов меню.
SKIP [ FOR <выр.1> ] — делает пункт меню недоступным для выбора пользователя. Если указан параметр FOR <выр.Ь>, то пункт меню будет доступен для выбора при истинности логического условия <выр.Ь>.
MESSAGE <выр.С4> — выводит на экран дополнительное сообщение <выр.С4>.
COLOR <СШ1С0К пар цветов> | COLOR SCHEME <выр.ГМ> — определяет цвет фона и цвет букв пункта меню.
Команда активации меню
ACTIVATE MENU <имя BAR-MeuK>>
[ NOWAIT)
[ PAD <нчя пункта меню> ]
Команда выводит на экран горизонтальное меню и делает его доступным дтя выбора пользователя. Активация меню производится в любом месте программы, но после описания меню. Назначение опций:
NOWAIT — разрешает выполнение программы, не дожидаясь закрытия меню.
PAD <имя пункта меню> — определяет, какой пункт меню будет активен, после предьяатения меню на экран, то есть задает выбор по умолчанию.
Для этих же целей предусмотрена и вторая команда:
SHOW MENU <списокимси BAR-Meino> |ALL [PAD <имя пункта меню> ]
[SAVE)
Назначение опций:
PAD <имя пункта меню> — определяет, какой пункт меню будет активен, после предъявления меню на экран, то есть задает выбор по умолчанию.
SAVE — сохраняет на экране образ меню после его закрытия.
Реакция на вызов горизонтального меню
ON SELECTION MENU <ичя BAR-Me»im> [ <комацца>}
Команда определяет реакцию на вызов меню, то есть ставит на выполнение общую для всего меню команду или процедуру, которая определена в параметре <команда>. Если параметр <команда> опущен, то отменяется ранее назначенная <комаша>.
Реакция на выбор пункта меню
ON SELECTION PAD <имя пункта чсню> ОЕ <имя BAR-mciuo> [ <команда> J
Команда определяет для конкретного пункта меню <имя путпета меню>, принадлежащего меню <имя ВАЛ-меню>. команду или процедуру, которая определена в параметре <коман- да>, и ставит ее на выполнение.
Назначение подчиненного (младшего) меню
ON PAD <имя пункта меню> OF <имя ВАН-меню>
[ ACTIVATE POPUP <имя ГОРиР-меяю> |
ACTIVATE MENU <имя BAR-Meino> ]
Команда назначает путнету меню <имя пункта меню>, принадлежащего меню OF <имя ВАК-меню>, подчиненное меню: либо вертикальное (ACTIVATE POPUP <и.мя РОРиР-мсню>), либо горизонтальное (ACTIVATE MENU <имя BAR-MeHio>).
Вместо этой команды можно использовать команду ON SELECTION PAD но при этом подчиненное меню будет выводиться на экран при выполнении двух условий: курсор должен быть установлен на пункте горизонтального меню и должна быть нажата либо клавиша Enter, либо клавиша SpaceBar.
Для удаления связи по вызову подчиненного меню надо подать команду ON PAD без опций.
8.2.2J. Деактивация горизонтального меню
DEACTIVATE MENUS
Команда удаляет с экрана горизонтальное меню, но сохраняет его в оперативной памяти, и передает управление следующей команде программы.
Удаление всех горизонтальных меню CLEAR MENUS
Команда удаляет все меню с экрана и из оперативной памяти.
Удаление горизонтального меню
RELEASE MENUS I < список нмси BAR-mchio> [ EXTENDED J ]
Команда удаляет с экрана и из оперативной памяти перечисленные в <списке имен ВАЯ-меню> меню. Если указана опция EXTENDED, то одновременно удаляются и все подчиненные меню.
8.2.2.Э. Удаление пункта горизонтального меню
RELEASE PAD <имя пункта ченю> | ALL OF <нмя BAR-mcjdo>
Команда удаляет с экрана и из оперативной памяти указанный в <имени пункта мсню> пункт либо все (ALL) пункты меню из горизонтального меню, заданного в <имсни ВАИ-менюХ
Деактивация горизонтального меню
HIDE MENU <спнсок имев BAR-mchkj> | ALL [ SAVE J
Команда удаляет с экрана, но оставляет в оперативной памяти, либо указанные в <спискеимсн ВАК-меню> меню, либо все (ALL) меню. Если указана опция SAVE, то на экране остается образ удаленных меню.
Для работы с горизонтальным меню предусмотрены следующие функции.
MENUO — определение имена активного BAR-меню. Функция возвращает имя активного горизонтального меню.
PAD0 — определение имени выбранного пункта меню. Функция возвращает имя выбранного пользователем пункта меню. CNTPAD( <имя BAR-MeHK>>) — определение количества пунктов горизонтального меню. Функция возвращает количество пунктов указанного горизонтального меню.
MRKPAD( <имя BAR-Memo> , <ичя пупкта> ) — определение имени выбранного (активного) пункта меню. Функция возвращает логическое значение «истина» (.Т.), если пункт, указанный в <имя пункта> из меню <имя BAR-mchk>>, выбран пользователем (активный пункт). В противном случае возвращается логическое значение «ложь» (.F.).
При создании двухуровневого меню надо выполнить следующие действия:
а) Описать главное горизонтальное меню командой DEFINE MENU ...
б) Описать каждый пункт горизонтального меню командами DEFINE PAD ...
в) Описать реакции на выбор пунктов (командами ON SELECTION PAD ...) главного горизонтального меню, т. е. общую команду, выполняемую при выборе пункта меню.
г) Установить взаимосвязи между пунктами главного горизонтального меню и вызываемыми подчиненными меню с помощью команд ON PAD ...
д) Далее описываются сами подчиненные меню: либо вертикальные — с помощью команд: DEFINE POPUP ... и при необходимости с описанием каждого пункта меню, либо горизонтальные — с помощью команд DEFINE MENU ... с описанием каждого пункта меню.
е) Активация всей конструкции меню командой ACTIVATE MENU ... и деактивация меню командой DEACTIVATE MENU ...
ж) Анализ выбора пользователя производится с помощью функций BAR(), POPUPO, PROMPTO, MENUO, PAD() и т. д.
Для создания динамических меню и управления отображением меню на экране можно использовать следующие команды:
SET SKIP OF MENU <имя горизонтального меню> <выр.1>
SET SKIP OF PAD <нчя пункта горизонтального меню> OF <нчя горизонтального менк>> <выр.Ь>
SET SKIP OF POPUP <нмя контекстного (всплывающего)меню> <выр.1>
SET SKIP OF BAR <Bup.N> | <имя пункта > OF <имя контекстного (всплывающего) мсюо> <выр.Ь>
Если логическое выражение <выр.Ц> истинно, то все меню (или пункт меню) доступно для выбора. В противном случае меню не доступно. В последней команде пункт меню можно задать либо его порядковым номером <Bbip.N>, либо его именем <имя пункта >. Контекстным меню называется вертикальное POPUP- меню, которое предъявляется в любом месте экрана, как правило, с помощью щелчка правой кнопкой мыши.
КЛАВИШНОЕ МЕНЮ
В отличие от светового меню, клавишное меню не имеет в своем составе каких-либо элементов управления расположенных на экране. Клавишное меню представляет собой набор одно- или двухклавишных команд. Иногда в последней строке экране размещают подсказку о назначении команд клавишного меню. Юга- вишнос меню предназначено для реализации простых и часто повторяющихся операций по обработке данных.
Команды клавишного меню устанавливают связь между программой и прерываниями от нажатия клавиш или для обработки возникших во время работы программы ошибок. Для создания клавишного меню используются следующие команды.
Фиксация возникновения ошибки во время выполнения программы
ON ERROR [<комаича>)
Команда осуществляет переход к выполнению <команды> при возникновении любой ошибки при выполнении программы.
Фиксация ошибок ввода
ON READERROR [<команда>]
При обнаружении ошибки ввода ставится на выполнение <команда>. Ошибка ввода возникает при вводе данных не соответствующего типа, при нарушении границ допустимых значений данных или при нарушении логических условий.
Фиксация нажатия клавиши Esc
ON ESCAPE [<комаыда>]
После нажатия клавиши Esc ставится на выполнение команда. указанная в параметре <команда>. Если ранее по тексту программы была установлена команда SET ESCAPE OFF, то команда ON ESCAPE ... не выполняется.
Фиксация нажатия любой клавиши
ON KEY [<комаеда>]
После нажатия любой клавиши выполняется команда, указанная в параметре <команда>. Эта команда работает во всех режимах, кроме режима редактирования.
Фиксация нажатия клавиши с указанным кодом
ON KEY = <Bup.N> [<команда>]
После нажатия клавиши с кодом <выр.М> ставится на выполнение команда, указанная в параметре <команда>.
Фиксация нажатия клавиши с указанным именем
ON KEY [LABEL <имя клавнши>] [<команда>]
После нажатия клавиши с именем <имя клавиши> ставится на выполнение команда, указанная в параметре <командах Имя клавиши задается как строчными, так и прописными буквами. Клавиши, описанные этой командой, остаются активными во всех режимах работы. Нажатие такой клавиши в любой момент времени и в любом месте программы влечет за собой немедленное выполнение предусмотренной в параметре <команда> процедуры или команды. Поэтому при выполнении длительных вычислительных операций необходимо предусмотреть отмену команд ON KEY LABEL ... и ON KEY = ... теми же командами, но без опций или командой PUSH KEY CLEAR.
В командах ON KEY = и ON KEY LABEL ... можно указать почти все клавиши и комбинации клавиш. В программе допускается использование только одной активной команды ON KEY = ..., в то время как активных команд ON KEY LABEL ...может быть несколько.
L
команда. Дня отмены действия любой О IS-команды надо подать ту же команду, но без опции.
Команды, фиксирующие возникновение ошибки, предназначены для подавления системных сообщений и выхода из аварийной ситуации с наименьшими потерями.
Чаше всего клавишные меню используются в режимах редактирования: BROWSE, EDIT, CHANGE и READ.
Сохранение клавишных назначений в оперативной памяти
PUSH KEY [CLEAR]
Команда сохраняет все сделаные назначения командами ON KEY LABEL ... в специальной области оперативной памяти, которая называется стеком . Если указана опция CLEAR, то дополнительно прекращается действие клавишнььч назначений в работающей программе. При последовательном вызове команды PUSH KEY ... в стек будет записано несколько отдельных групп клавишных назначений. Извлекаться из стека группы назначений будут в обратном порядке.
Извлечение клавишных назначений из оперативной памяти
POP KEY TALL]
Команда извлекает из стека клавишные назначения в обратном порядке и делает их активными. Если указана опиия ALL, то стек очищается, и отменяются все текущие назначения.
Изменение назначений функциональных клавиш
SET FUNCTION <Bbip.N> | <имя клавиши> ТО [ <выр.О ]
Команда закрепляет выражение символьного типа <выр.С> за функциональной клавишей. Клавишу задают либо порядковым номером <Bbip.N>, либо именем <имя клавиши>. Если символьное выражение <выр.С> содержит символ «;* (точка с запятой), то наличие этого символа соответствует нажатию клавиши Enter. Символьное выражение <выр.С> может содержать несколько команд, раэдслсшшх символом «;*. Если в символьное выражение <выр.С> будет помешено число (символ «;* в этом случае игнорируется), то это число правильно определяется командой ввода @ GET В Симени клавиши> при задании имени клавиши допускается использование комбинании функциональных клавиш со специальными клавишами Shift и Ctrl.
Отмена назначений функциональных клавиш
CLEAR MACROS
Команда отменяет все назначения как пользовательские, так и системные за функциональными клавишами.
Отмена назначения конкретной функциональной клавиши
SET FUNCTION <имя клавиши ТО
Для просмотра текущих клавишных назначений следует использовать команду DISPLAY | LIST STATUS или функцию ON().
При создании клавишных меню можно использовать также следующие клавишные функции.
Определение кода нажатой клавиши
INKEY( [ <Bbip.N> 1 [, <выр.О ])
Функция возвращает ASCII-код последней нажатой клавиши. Если нажатия клавиши не было, то функция возвращает 0 (ноль). Параметр <выр.Ы> задает время ожидания в секундах до нажатия клавиши (или задание временного интервала — паузы). Если <выр.Ы>=0, то задано неограниченное время ожидания нажатия клавиши. Если параметр <выр.1М> не указан, то функция выполняется немедленно. Параметр <выр.С> управляет включением/выключением курсора и фиксацией факта нажатия кнопки мыши. Параметр <выр.С> может содержать одну из констант или сочетание констант:
S — включить курсор;
Н — выключить курсор;
М — контроль нажатия кнопки мыши (при этом возвращается значение 151).
Определение кода нажатой клавиши и направление кода в буфер
LASTKEYO
При нажатии клавиш их коды заносятся в буфер клавиатуры. При нажатии клавиш управления (Enter, Tab и т. д.) содержимое буфера переносится в оперативную память. Код последней нажатой клавиши, кроме того, переносится в клавишную ячейку.
Функция LASTKEYO работает только с клавишной ячейкой.
Функция INKEY( <выр.1Ч>) ждет нажатия любой клавиши и, кроме того, возвращает код нажатой клавиши и переносит код нажатой клавиши в клавишную ячейку, не дожидаясь нажатия одной из клавиш управления, таким образом предоставляя возможность работать функции LASTKEYO- Функция INKEY0 без параметров работает только с буфером клавиатуры. Если буфер заполнен, то она читает левый символ, возвращает его код, помещает код прочитанного символа в клавишную ячейку и сдвигает содержимое буфера на один символ влево. Таким образом, многократно подавая функцию INKEY(), можно очистить буфер клавиатуры. Заполняется буфер клавиатуры двумя способами, либо с помощью нажатия клавиш, либо с помощью функции KEYBOARD( <выр.О).
Фиксация выхода из режима редактирования
READKEY0
Функция возвращает код клавиши, с помощью которой был осуществлен выход из режима редактирования. Кроме того, возвращаемый код содержит информацию о том, было ли редактирование данных. Выйти из режима редактирования можно с помощью одной из клавиш, при этом возвращается один из вариантов кода клавиши:
Имя клавиши Данные не изменяюсь Данные изменялись
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
Определение команды, закрепленной за клавишей
ON( <выр.С1> [, <выр.С2> ])
Функция возвращает команду, закрепленную за клавишей или ON-командой.
<выр.С1> — содержит ON-команду (например. ERROR, READERROR, KEY, и т. д.).
<выр.С2> — содержит имя клавиши. Используется только для команды ON KEY LABEL.
Проверка заполнения буфера клавиатуры
CHRSAW( ( <выр.М> ] )
Функция возвращает значение «истина» (.Т.), если в буфере клавиатуры имеется хотя бы один символ, содержимое буфера не изменяется. В противном случае возвращается значение «ложь*
(F).
Управление регистром букв
CAPSLOCK( [ <выР.1> ])
Если <Bbip.L> истинно (.Т.), то устанавливается верхний регистр. Если <вырХ> ложно (.F.), то устанавливается нижний регистр. Если <вырХ> отсутствует, то устанаативается текущее состояние регистра (управление с клавиатуры).
Ввод данных с клавиатуры
INPUT [<кыр.>] ТО <псрс.менная пачяти>
Команда производит ввод данных от пользователя (с клавиатуры) и сохраняет их в указаной <переменной памятиХ Тип <переменной памяти > определяется типом ввод имых данных.
Ввод данных символьного типа с клавиатуры
ACCEPT [<выр.>] ТО <переменная памятн>
Команда производит ввод данных символьного типа от пользователя (с клавиатуры) и сохраняет их в указаной <переменной памятиХ В отличие от команды INPUT, в команде ACCEPT указание разделителя (кавычек или двойных кавычек) не предусматривается.
Определение имени переменной (поля), куда вводятся данные
VARREAD0 или SYS(18)
Функции возвращают имя переменной или поля, куда с помощью команды READ вводятся данные, при условии что было выполнено прерывание от одной из клавишных команд. Имя переменной возвращается прописными (большими) буквами. Имя поля возвращается строчными буквами, кроме первой буквы: первая буква — прописная.
Примеры
Пример 1. Произвольное меню типа LIGHBAR.
LIGHTDFR-Mghso типа FOX CLEAR
@ 5,7 PROMPT 'Пуск' MESSAGE 'Запуск программы' MENU ТО peri
0 12.32 Prompt 'Выход' message 'Завершение программы' menu то peri
@ 8,50 PROMPT 'Поиск' MESSAGE 'Поиск данных'
MENU ТО peri
Пример 2. Использование LIGHBAR-меню.
Просмотреть таблицу Catalog и выводить на экран по одной записи. Начало просмотра организовать либо с начала таблицы, либо с конца таблицы, либо с произвольного места таблицы по номеру издания (книги).
CLOSE ALL && Закрытие всех файлов
SET DEFAULT ТО Е:\PRIMER && Задание рабочего
каталога
USE Customer.dbf in 1 alias cus && Далее открытие
двенадцати таблиц
USE |
Order.dbf |
in |
2 |
alias |
ord |
|
|
||||
USE |
Salesman.dbf |
in |
3 |
alias |
ВПГ. |
|
|
||||
USE |
Sale.dbf |
in |
4 |
alias |
sal |
|
|
||||
USE |
Account.dbf |
in |
5 |
alias |
acr.t |
|
|
||||
USE Catalog.dbf ORDER TAG Fam |
in |
6 |
alias |
ctl |
INDEX |
catalog; |
|||||
USE |
Autor.dbf |
in |
7 |
alias |
atr |
|
|
||||
USE |
Town.dbf |
in |
8 |
alias |
twn |
|
|
||||
USE |
Street.dbf |
in |
9 |
alias |
str |
|
|
||||
USE |
Fam.dbf |
in |
10 alias |
fam |
INDEX ORDER |
fam; TAG tag(2» |
|||||
USE |
Im.dbf |
in |
11 |
alias |
im |
INDEX |
in ORDER TAG |
||||
USE |
Ot.dbf |
in |
12 |
alias |
ct |
INDEX |
ot ORDER TAG |
CLEAR
PRIVATE OTV SSLE ct 1
SET RELATION TO Key_fam INTO
Fam, Key_im INTO; Im, Key_ot INTO Ot
DO WHILE .T.
CLEAR
@ 10,10 SAY 'Задайте режим просмотра'
CASE 0TV=2
GO BOTTOM CASE OTV=3
INPUT 'Введите номер автора' TO С_NOMN LOCATE FOR Key_book = C_NOMN IF BOF()
WAIT 'Такой записи нет'
LOOP
ENDIF CASE OTV=4 CLEAR EXIT
ENDCASE
CLEAR ScSc Помощь о назначении клавиш
б 20,1 SAY 'Для просмотра следующей записи '; +
' нажмите Enter'
@ 21,1 SAY 'Для просмотра предыдущей записи '; +
' нажмите PgUp'
@ 22,1 SAY 'Для выхода нажмите Esc'
DO WHILE not EOF() && Вывод на экран найденной
записи
<3 8,5 SAY 'Фамилия автора : ' + fam.Name_fam @ 9,5 SAY 'Имя автора : ' + im.Name_In»
@ 10,5 SAY 'Отчество автора : ' ♦ ot.Name_ot
@ 11,5 SAY 'Название книги : ' + ctl.Name_book
@ 13,5 SAY RECNOO
К = INKEY(0) && Ожидание нажатия клавиши
DO CASE && Управление выводом на
экран
CASE К=27 && Проверка клавиши Esc
CLEAR EXIT
CASE К=18 && Проверка клавиши PgUp
SKIP-1
CASE К=13 && Проверка клавипи Enter
SKIP
ENDCASE
EKDDO
ENDDO
Пример 3. Вертикальное POPUP-менютипа FOX.
Левый верхний угол меню помешен в 25-ю позицию 6-й строки. Одновременно на экран выводится 7 строк меню: первая строка — заголовок меню, четыре строки — пункты меню и две строки дпя организации прокрутки.
CLEAR
DIME а(10)
а(1)= 'Старт'
а(2)='Файл'
а(3)='Поиск'
а(4)='Редактирование'
а(5)='Фильтр'
а(6)='Печать'
а{7)='Модификация'
а{8)='Дополнение'
а{9) = ''
а(10)='Выход'
@ 6,25 MENU а, 10, 7 TITLE 'База данных'
READ MENU ТО рг
@2, 10 SAY рг && Вывод на экран номера выбранного * пункта меню
С помощью оператора DO CASE можно проанализировать выбор пользователя и написать обработчик выбранного пункта меню (см. пример 2).
П р и м е р 4. Двухуровневое PULLDOWN-меню типа FOX.
CLEAR
DECL Ъ(5,2), а(10) а(1)= 'Файл' а(2)='Формат' а(3)='Поиск'
а (4) =' \ Редактирование' а(5)='Фильтр' а(6)='Печать' а(7)='Модификация' а (8) ='Дополнение' а(9)='' а(10)='Выход'
Ь(1,1)='\ Старт'
Ь(2,1)='База данных' fc(3,1> ='Программа' to(4,1)='Объект' to(5,l)='Выход'
0(1,2)='ENTER'
to( 2,2) ='Команда USE'
Ь(3,2)='Редактир. программы' b (4,2) ='Вставка объекта' b(5,2)='Esc'
8t 1=3
&& Определяет актизный по умолчанию пункт
горизонтального меню вг2=1
MENU BAR Ь, 5 MENU 4, а. 10, б
READ MENU BAR TOstl, st2 && Фиксация выбора
пользователя
@12, 5 SAY stl GET st2 && Выводит на экран
номера выбранных
пользователем && пунктов горизонтального и вертикального меню
Первый пункт горизонтального меню описан как недоступный для выбора. Четвертому пункту горизо пального меню назначено подчиненное вертикальное меню.
Пример 5. Вертикальное меню типа dBASE с произвольными пунктами.
В меню имеются линейка прокрутки, верхний и нижний заголовки, предусмотрен множественный отбор пунктов, установлено по одному пробелу слева и справа от имени пункта меню.
DEFINE POPUP Edit FROM 2,2 SCROLL MARGIN;
TITLE " Редактирование'' MULTI FOOTER ''Правка" DEFINE BAR 1 OF Edit PROMFT «Вырезать» KEY 'Ctrl+X'
DEFINE BAR 2 OF Edit PROMPT 'Копировать' KEY 'Ctrl+C'
DEFINE 3AR 3 OF Edit PROMPT 'Вставить' KEY 'Ctrl+P'
DEFINE BAR 4 OF Edit PROMPT 'Удалить' KEY 'Ctrl+D'
ACTIVATE POPUP Edit
Пример 6. Вертикальное меню типа dBASE, пунктами которого назначены имена файлов, левый верхний угол меню помещен в строку 4 столбец 12.
DEFINE POPUP File PROMPT FILES LIKE E:\PRIMER\* .dbf ; FROM 4, 12 TITLE "Файл"
ACTIVATE POPUP File
Пример 7. Вертикальное меню типа dBASE, пунктами которого назначены значения поля Name fam из таблицы Fam. Для сортировки списка по алфавиту текущим задан тег с номером 1. Если при создании вертикального меню используется опция PROMPT, то запрещено использовать опции MOVER и MULTI. Поэтому для организации множественного отбора пунктов меню в структуру таблицы добавлено логическое поле w и написана процедура рг.
USE |
Customer.dbf |
in |
1 |
alias |
cus |
|
|
|
ЬЬ |
Далее открытие двенадцати таблиц |
|
||||||
USE |
Order.dbf |
in |
2 |
alias |
ord |
|
|
|
USE |
Salesman.dbf |
in |
3 |
alias |
smn |
|
|
|
USE |
Sale.dbf |
in |
4 |
alias |
sal |
|
|
|
USE |
Account.dbf |
in |
5 |
alias |
acnt |
|
|
|
USE |
Catalog.dbf |
in |
6 |
alias |
ctl |
INDEX catalog TAG Fam |
ORDER; |
|
USE |
Autor.dbf |
in |
7 |
alias |
atr |
|
|
|
USE |
Town.dbf |
in |
В |
alias |
twn |
|
|
|
USE |
Street.dbf |
in |
9 |
alias |
str |
|
|
|
USE |
Fam.dbf |
in |
10 |
alias |
fam |
INDEX fam; ORDER TAG |
tag(2) |
|
USE |
Im.dbf |
in |
11 |
alias |
im |
INDEX im ORDER TAG |
In |
|
USE |
Ot.dbf |
in |
12 |
alias |
ot |
INDEX ot ORDER TAG |
ot |
&& Закрытие
всех файлов && Задание рабочего
каталога
CLOSE
ALL
SET
DEFAULT TO B:\PRIMER
SET ORDER ТО TAG(1)
DEFINE POPUP Fam PROMPT FIELDS
fam.Kame_fam-<TIF{fam. w,'+',' *)+pr() FROM 3, B; SCROLL TITLE ''Фамилии''
ON SELECTION POPUP Fam REPLACE w WITH !W ACTIVATE POPUP Fam
FUNCTION pr && Функция для возврата символа «пробел» в 25, 0
в 25, 0 SAY "Пусто"
RETURN ' '
Пример 8. Вертикальное меню типа dBASE, пунктами которого назначены значения поля Name_fam из таблицы Fam.
Организован множественный отбор пунктов меню с последующей их обработкой, для чего в структуру таблицы добавлено логическое поле w. По полю w построен индекс, который сделан текущим индексом.
CLOSE ALL && Закрытие всех файлов
SET DEFAULT ТО E:\PRIMER && Задание рабочего каталога
USE |
Customer.dbf |
in |
1 |
alias |
cus |
&& |
Далее открытие |
двенадца- |
•к таб |
||
USE |
Order.dbf |
in |
2 |
alias |
ord |
USE |
Salesman.dbf |
in |
3 |
alias |
smn |
USE |
Sale.dbf |
in |
4 |
alias |
sal |
USE |
Account.dbf |
in |
5 |
alias |
acnt |
USE |
Catalog.dbf |
in |
6 |
alias |
ctl |
ORDER TAG Fam
USE |
Autor.dbf |
in |
7 |
alias |
atr |
USE |
Town.dbf |
in |
В |
alias |
twn |
USE |
Street.dbf |
in |
9 |
alias |
st r |
USE |
Fam. dbf |
in |
10 alias |
fam |
ORDER TAG tag(2) USE Im.dbf in 11 alias im INDEX im;
ORDER TAG Im USE Ot.dbf in 12 alias ot INDEX ot;
ORDER TAG Ot
SELE fam
SET ORDER TO TAG{3)
DEFINE POPUP Fam PROMPT FIELDS fam.Name_fam+IIF(w,' + ',' ') FROM 3, B;
SCROLL TITLE "Фамилия"
ON SELECTION POPUP Fam DO Selbar
ACTIVATE POPUP Fam
REPLACE w WITH .F. FOR w && Очистка поля w
PROCEDURE Selbar DO CASE
CASE LASTKEY()=32 && Фиксация нажатия клавиши
&& ЗрасеЗаг и окончание процесса выбора пунктов
HIDE POPUP Fam SCAN FOR w ENDSCAN
DEACTIVATE POPUP
CASE LASTKEY()=13 *
*
REPLACE w WITH !w
ENDCASE
RETURN && Скрытие POPUP-меню && Сканирование текущей таблицы bSc и обработка записей && Удаление меню && Фиксация нажатия клавиши Enter для отмены ранее сделанных выделений && Инверсия значения поля w
Допускается работа без указания текущего индекса по
полю w, но отображение
сделанного выбора будет другим (не упорядоченным).
Пр и м е р 9. Вертикальное меню типа dBASE, пунктами которого назначена структура таблицы Catalog.
CLOSE ALL && Закрытие всех файлов
SET DEFAULT ТО E:\PRIMER && Задание рабочего
* каталога
USE Customer.dbfin 1 alias cus
ScSc Далее открытие двенадцати таблиц
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
USE Account.dbf in 5 alias acnt
USE |
Catalog.dbf |
in |
6 |
alias |
ctl |
USE |
Autor.dbf |
in |
7 |
alias |
atr |
USE |
Town.dbf |
in |
8 |
alias |
twn |
USE |
Street.dbf |
in |
9 |
alias |
str |
USE |
Fam. dbf |
in |
10 |
alias |
fan |
USE |
Im.dbf |
in |
11 |
alias |
im |
USE |
Ot.dbf |
in |
12 |
alias |
ot |
ORDER TAG Fan
INDEX fan;
ORDER TAG tag(2)
INDEX im;
ORDER TAG Im
INDEX ot;
ORDER TAG ot
CLEAR SSLE ctl
DEFINE POPUP Catal PROMPT STRUCTURE FROM 3, 8; SCROLL TITLE ''Каталог''
ACTIVATE POPUP Catal
Пример 10. Назначение вертикальному меню подчиненного вертикального меню второго уровня.
CLOSE ALL && Закрытие всех файлов
SET DEFAULT ТО Е:\PRIMER && Задание рабочего каталога
USE |
Customer.dbf |
in |
1 |
alias |
cus |
|
|
|
&& |
Далее |
открытие двенадцати |
USE |
Order.dbf |
in |
2 |
alias |
ord |
USE |
Salesman.dbf in |
3 |
alias |
smn |
|
USE |
Sale.dbf |
in |
4 |
alias |
sal |
USE |
Account.dbf |
in |
5 |
alias |
acnt |
USE |
Catalog.dbf |
in |
6 |
alias |
ctl INDEX catalog; |
|
|
|
|
|
ORDER 1 |
USE |
Autor.dbf |
in |
7 |
alias |
atr |
USE |
Town.dbf |
in |
8 |
alias |
twn |
USE Street.dbf in 9 alias str
USE Fan. dbf in 10 alias fam INDEX fam;
ORDER TAG tag(2) USE Im.dbf in 11 alias im INDEX im;
ORDER TAG Im USE Ot.dbf in 12 alias ot INDEX ot;
ORDER TAG ot
CLEAR SELE fan
SET ORDER TO TAG Name
DEFINE POPUP Edit FRCM 2,2 SCROLL MARGIN;
TITLE ''Редактирование'' ; MULTI FOOTER ''Edit''
DEFINE BAR 1 OF Edit PROMPT "Вырезать" KEY 'Ctrl+X'
DEFINE BAR 2 OF Edit PROMPT ' Копировать'KEY 'Ctrl+C'
DEFINE BAR 3 OF Edit PROMPT 'Вставить' KEY 'Ctrl+P'
DEFINE BAR 4 OF Edit PROMPT 'Удалить' KEY 'Ctrl+D'
DEFINE POPUP Fam PROMPT FIELDS fam.Name_fam SCROLL; TITLE "Фамилии" FROM 4,29 TO 11,45
On 3AR 2 OF Edit ACTIVATE POPUP Fam
ACTIVATE POPUP Edit
Пример 11. Горизонтальное меню типа dBASE.
DEFINE MENU arm BAR AT LINE 7;
KEY 'Ctrl+M' FONT "Times New Roman". 12 STYLE 'BI'
Описание четырех пунктов горизонтального меню.
DEFINE PAD File OF arm PROMPT 'Файл' KEY 'Ctrl+F' DEFINE PAD Edit OF arm PROMPT 'Редактирование';
KEY 'Ctrl+E'
DEFINE PAD Filter OF arm PROMPT 'Фильтр' KEY 'Ctrl+T' DEFINE PAD Finish OF arm PROMPT 'Выход' KEY 'Escape'
ACTIVATE MENU arm
Для написания имен пунктов меню задан шрифт.
Пример 12. Двухуровневое меню типа dBASE.
CLOSE ALL && Закрытие всех файлов
SET DEFAULT ТО E:\PRIMER && Задание рабочего каталога
USE |
Cuetomer.dbf |
in |
1 |
alias |
cus |
|
|
|
|
|
&& Далее открытие |
двенадцати табгп |
|||||
USE |
Order.dbf |
in |
2 |
alias |
ord |
|
|
|
USE |
Salesman.dbf |
in |
3 |
alias |
smn |
|
|
|
USE |
Sale.dbf |
in |
4 |
alias |
sal |
|
|
|
USE |
Account.dbf |
in |
S |
alias |
acnt |
|
|
|
USE |
Catalog.dbf |
in |
6 |
alias |
ctl |
INDEX ORDER |
catalog; TAG Farr |
|
USE |
Autor.dbf |
in |
7 |
alias |
atr |
|
|
|
USE |
Town.dbf |
in |
8 |
alias |
twr. |
|
|
|
USE |
Street.dbf |
in |
9 |
alias |
str |
|
|
|
USE |
Fam.dbf |
in |
10 |
alias |
fam |
INDEX ORDER |
fan; TAG tag(2) |
|
USE |
Im.dbf |
in |
11 |
alias |
irr. |
INDEX ORDER |
im; TAG In |
|
USE |
Ot.dbf |
in |
12 |
alias |
ot |
INDEX ORDER |
ot; TAG Ot |
CLEAR SELE ctl
SET RELATION TO Key_fam INTO Fam, Key_iir. INTO Im,;
Key_ot INTO Ot
DEFINE MENU arm BAR AT LINE 7 KEY 'Ctrl+F'
* Описание четырех пунктов горизонтального меню.
DEFINE PAD File OF arm PROMPT 'Файл' KEY 'Ctrl+F'
DEFINE PAD Edit OF arm PROMPT ' \<Редактирование' ;
KEY 'Ctrl+E'
DEFINE PAD Filter OF arm PROMPT '\<Фильтр' KEY 'Ctrl+T' DEFINE PAD Finish OF arm PROMPT 'Выход' KEY 'Escape'
Описание подчиненного мен» для пункта Edit
горизонтального меню.
Пунктами подчиненного меню заданы произвольные
названия.
DEFINE POPUP Ed“ RELATIVE SCROLL MARGIN
Описание четырех пунктов подчиненного меню.
DEFINE BAR 1 OF Edt PROMPT «Вырезать» KEY 'Ctrl+X'
DEFINE BAR 2 OF Edt PROMPT 'Копировать' KEY 'Ctrl+C'
DEFINE BAR 3 OF Edt PROMPT 'Вставить' KEY 'Ctrl-P'
DEFINE BAR 4 OF Edt PROMPT 'Удалить' KEY 'Ctrl+D'
Вызов процедуры при выборе пунктов подчиненного вертикального меню
ON SELECTION BAR 1 OF Edt DO ppp IN;
E:\PRIMER\progS.prg WITH menuO, pad() ON SELECTION BAR 2 OF Edt DO ppp IN;
E:\?RIMER\prog5.prg WITH menu(), pad() ON SELECTION BAR 3 OF Edt DO ppp IN;
E:\PRIMER\prog5.prg WITH menuO, pad() ON SELECTION 3AR 4 OF Edt DO ppp IN;
E:\PRIMER\prog5.prg WITH menuO, pad()
Вызов описанного ранее подчиненного меню при выборе
пункта Edit горизонтального меню.
ON PAD Edit OF arm ACTIVATE POPUP Edt
Вызов подчиненного меню при выборе пункта File
горизонтального меню.
ON PAD File OF arm ACTIVATE POPUP Fie
Описание подчиненного меню для пункта Filter
горизонтального меню.
Пунктами подчиненного меню заданы значения поля
Name_jnodel таблицы model, dbf ЕELECT fam
SET ORDER TO TAG Name
DEFINE POPUP Fltr PROMPT FIELDS fan.Name_f am ;
SCROLL FROM 7,22 TO 15,35
Вызов подчиненного меню при выборе пункта Filter
горизонтального меню.
CN PAD Filter OF arm ACTIVATE POFUP Fltr
ACTIVATE MENU arm && Активация всей конструкции меню.
Обработчик выбора пользователя для пучхта главно-о
меню Edit n = PAD( )
n = BAR( )
DO CASE && Ана лиз выбора из горизонтального
(главного) меню
CASE m = 'EDIT'
DO CASE && Анализ выбора из подчиненного
(вертикального) меню
CASE n = 1
SELECT ctl Brow CASE n = 2
SELE fam Browse
CASE n = 3
Sele im BROW CASE n = 4
Select ot BROWSE
ENDCASE
ENDCASE
Процедура должна быть помещена в программный файл
PR0G5.PRG, путь к
которому указывается в командах ON SELECTION BAR ...
PROCEDURE ppp PARAMETER mmenu, mpad
? «Вызов подпрограммы», mmenu, mpad 6 10,4 SAY mmenu GET mpad DEACTIVATE MENUS RETURN
Пример 13. Динамическое изменение имени и назначения пункта меню, х = .Т.
DEFINE POPUP View FROM 4,12 TITLE 'Вид'
DEFINE BAR 1 OF View PROMPT 'Панели инструментов'
DEFINE BAR 2 OF View PROMFT 'Линейка'
DEFINE BAR 3 OF View PROMPT 'Масштаб'
DEFINE BAP. 4 OF View PROMPT IIF(x, 'Вход', 'Выход')
ON SELECTION POPUP View DO wt ACTIVATE POPUP View
Procedure wt
X = ! X
DEFINE BAR 4 OF View PROMPT IIF(x, 'Вход','Выход') RETURN
Пр и м е р 14. Попытка открыть не существующий табличный файл.
ON ERROR DO errhand WITH ;
ERROR( ). MESSAGE( ), MESSAGE(1) , FROGRAM{ ), LINENO[ ) USE E:\PRIMER\mnm.dbf ON ERROR
ItSt Отмена выполнения индивидуальной процедуры и && возврат к системному обработчику ошибок
PROCEDURE errhand
PARAMETER merror, mess, meesl, irprog, mliner.o CLEAR
? 'Ошибка номер: ' + LTRIK(STR<merror))
? 'Текст ошибки: ' + mess
? 'Строка содержит ошибку: ' + nessl
? 'Номер строки с ошибкой: ' + LTRIM{STR(mlineno))
? 'Программный файл: ' + mprog
Пр и м е р 15. Обработчик нажатия клавиши Esc.
SET ESCAPE ON ON ESCAPE DO stopit
Создание окна сообщения и вывод в него сообщения
WAIT WINDOW 'Нажмите клавишу Esc для выхода из '+; 'программы' NOWAIT
ппп = .Т.
Пустой цикл для сохранения окна редактора на экране DO WHILE ппп
ENDDO
RETURN
PROCEDURE stopit nnn = . F.
RETURN
Пример 16. Обработчик нажатия любой клавиши.
Вывести на экран потоком каталог изданных книг. Для остановки потока надо нажать любую клавишу. Для продолжения просмотра — нажать любую клавишу.
CLOSE ALL && Закрытие всех файлов
SET DEFAULT ТО E:\PRIMSR && Задание рабочего каталога
USE |
Customer.dbf |
in |
1 |
alias |
cus |
|
|
|
Далее открытие |
||
USE |
Crde^.dhf |
in |
2 |
alias |
ord |
USE |
Sa esman.dbf |
in |
3 |
alias |
smn |
USE |
Sale.dbf |
in |
4 |
alias |
sal |
USE |
Account.dbr |
in |
5 |
alias |
acnt |
'JSE |
Catalog.dbf |
in |
6 |
alias |
ctl |
USE |
Autor.dbf |
in |
7 |
alias |
atr |
USE |
Tcwn.dfcf |
in |
8 |
alias |
twn |
USE |
Street.dbf |
in |
9 |
alias |
str |
USE |
Fam.dbf |
in |
10 |
alias |
fam |
USE |
Im.dbf |
in |
11 |
alias |
in |
ORDER
TAG Fam
ORDER
TAG tag(2)
INDEX
im;
ORDER
TAG Im INDEX ot;
ORDER
TAG ot
USE
Ot.dbf
CLEAR
PRIVATE OTV SELE Ctl
SET RELATION TO Key_fam INTO Fam, Key_im INTO Im,; Key_ot INTO Ot
ON KEY DO pause DO WHILE NOT EOF( )
? 'Фамилия автора:
? 'Имя автора: '
? 'Отчество автора: ? 'Название книги : ?
SKIP
ENDDO
АТ 2. fam.Naire_Fam АТ 25 АТ 2, im. Name_Im AT 25 AT 2, ot. Name_Ot AT 25 AT 2, ct 1. Nair.e_fcoo< AT 2 5
PROCEDURE pause = INKEY( 3 ) WAIT WINDOW
*
RETURN
ScSc Вывод в специальное окно системного сообщения
Пр и м е р 17. Назначение команд отдельным клавишам. CLEAR
Определение клавишных назначений.
ON KEY LABEL RIGHTARROW ? 'Стрелка вправо'
ON KEY LABEL LEFTARROW ? 'Стрелка влево'
ON KEY LABEL UPARROW ? 'Стрелка вверх'
ON KEY LABEL DNARROW ? 'Стрелка вниз'
SET ESCAPE ON STORE .F. TO glExit
ON ESCAPE STORE .T. TO glExit && Назначение команды
для клавиши Esc.
STORE 0 TO TEMP
@ 2,0 SAY 'Нажмите любую клавишу стрелку, для '+; 'выхода - Esc'
Определение окна для вывода сообщений о нажатых
клавишах
DEFINE WINDOW wEnt FROM 10.20 TO 14.45 DOUBLE;
FONT 'Tunes New Roman', 12 STYLE 'B'
ACTIVATE WINDOW wEnt DO WHILE NOT glExit ENDDO
DEACTIVATE WINDOW wEnt
CM KEY && Отмена всех клавишных сообщений
Пример 18. Определение способа выхода из редактирования. CLOSE ALL Sclc Закрытие всех файлов
SET DEFAULT ТО Е:\PRIMER && Задание рабочего каталога
USE |
Customer.dbf |
in |
1 |
alias cus |
|
|
|
|||
|
|
IcSc |
Далее открытие |
двенадцати |
таблиц |
|||||
USE |
Order.dbf |
in |
2 |
alias |
ord |
|
|
|
||
USE |
Salesman.dbf in |
3 |
alias |
smn |
|
|
|
|||
USE |
Sale.dbf |
in |
4 |
alias |
sal |
|
|
|
||
USE |
Account.dbf |
in |
5 |
alias |
acnt |
|
|
|
||
USE |
Catalog.dbf |
in |
6 |
alias |
ctl |
INDEX |
catalog |
|||
|
|
|
|
|
|
ORDER |
TAG |
Fam |
||
USE |
Autor.dbf |
in |
7 |
alias |
atr |
|
|
|
||
USE |
Town.dbf |
in |
8 |
alias |
twn |
|
|
|
||
USE |
Street.dbf |
in |
9 |
alias |
str |
|
|
|
||
USE |
Fam. dbf |
in |
10 |
alias |
fam |
INDEX ORDER |
fam; TAG |
tag(2) |
||
USE |
Im.dbf |
in |
11 |
alias |
im |
INDEX ORDER |
im; TAG |
Im |
||
USE |
Ot.dbf |
in |
12 |
alias |
ot |
INDEX |
ot; |
|
ORDER TAG ot
CLEAR
PRIVATE OTV SELE ctl
SET RELATION TO Key_fam INTO Fam, Key_im INTO Im,; Key_ot INTO Ot
CLEAR
@ 20,4 SAY 'Для следующего поля нажмите Enrer'
@ 21,4 SAY '«Для пропуска записи нажмите PgDn'
в 22,4 SAY 'Для предыдущей записи нажмите PgUp'
0 23,4 SAY 'Для выхода нажмите Esc'
DO WHILE .not. EOF О
в 8,5 SAY 'Фамилия автсра : ' GET fan.Kame_fa*n
0 9,5 SAY 'Имя автора : ' GET? i3i.Narae_im
0 10,5 SAY 'Отчество автора : ' GST ot.Name_ot
0 11,5 SAY 'Название книги : ' GET ctl.Nane_j300k
READ
К = READKEY()
DO CASE
CASE K=12 .OR. K=26S && Нажата клавиша Esc EXIT
CASE K=6 .OR. K=262 && Нажата клавиша PgUp IF RECN0() =1 &Sc Проверка на достижение
* первой записи
@ 17,17 SAY 'Обнаружена первая запись' ZZZ = :NKEY(2)
8 17,17 SAY '
ELSE
SKIP-1
EKDIF
CASE K=7 .OR. K=263 && Нажата клавиша PgDn
SKIP
CASE X=16 .OR. K=271 .OR. K=5 .OR. K=261 && Нажата клавиша Enter или стрелка вниз SKIP
ENDCASE
ENDDO
Контрольные вопросы
Что такое световое меню и каковы его основные элементы?
Что такое клавишное меню и каковы его основные элементы?
Каким приемом задать недоступный пункт меню?
Как отделить одну группу пунктов меню от другой (руппы пунктов меню?
Укажите особенности светового меню типа Fox.
Укажите особенности светового меню типа dBASE.
Расскажите об особенностях создания и использования
LIGHTBAR-меню.
Расскажите об особенностях создания и использования
POPU P-меню типа Fox.
Расскажите об особенностях создания и использования
PULLDOWN-меню.
Укажите порядок создания меню типа Fox.
И. Какой командой создается POPUP-меню типа dBASE?
Укажите команды для предъя&ления на экран POPUP-меню типа dBASE.
Укажите команды для удаления с экрана (и из оперативной памяти) POPUP-меню типа dBASE.
Какой командой создается BAR-менютипа dBASE?
Укажите команды для предъявления на экран BAR-мсню типа dBASE.
Укажите команды для удаления с экрана (и из оперативной памяти) BAR-мснютипа dBASE.
Какой командой производится закрепление подчиненного меню за пунктом POPUP-меню? За пунктом BAR-меню?
Укажите порядок действий при создании двухуровневого (многоуровневого) меню типа dBASE.
Какими командами клавишного меню фиксируются ошибки работы программы?
Расскажите о вариантах использования команды ON KEY.
Что такое стек? Как сохраняются и как извлекаются клавишные команды из стека?
Укажите команды для обработки кодов нажатых клавиш.
ОПРЕДЕЛЕНИЕ ОКОН
I
V fc'J , - i «в... i^t • j Wi|Ой^М|Ш 1
1 <Г1.1Ы.> Dll 1)Ь |
В FoxPro имеется возможность одновременной работы с несколькими окнами. С помощью специальных команд окна можно создавать, изменять их положение и размеры, закрывать как программными средствами, так и с помощью клавиатуры и мыши. Различают три состояния окна:
нормальное — окно имеет размеры и занимает положение на экране, определенное командами при его создании;
свернутое — окно имеет минимальный размер (одна строка с заголовком окна) и размешается в нижней части экрана;
распахнутое — окно раскрыто на весь экран.
Для работы с окнами предусмотрены следующие клавишные команды.
Ctrl + F7 и клавиши-стрелки — перемещение окна по экрану'. Эту операцию можно выполнить мышью. Курсор мьпии устанавливается на заголовок окна и окно буксируется в нужном направлении.
Ctrl + F9 — сворачивает окно до минимального размера. Эту операцию можно выполнить двойным щелчком левой кнопки мыши на заголовке окна.
Shift + Ctrl + F9 — сворачивает окно до минимального размера и перемещает его в правый нижний угол экрана. Двойной щелчок левой кнопки мыши на заголовке окна при зажатой клавише Shift выполняет ту же операцию.
Ctrl + F10 — переход к друтому окну. Переход также выполняется щелчком левой кнопки мыши на нужном окне.
Для работы с окнами предусмотрены следующие команды.
ОПИСАНИЕ (СОЗДАНИЕ) ОКНА
DEFINE WINDOW <имя окна> FROM Yl.Xl ТО Y2,X2 (ATYI,X1 |
(SIZE Y2,X2 ]
(IN (WINDOW ] <имя окна 2> | IN SCREEN | IN DESKTOP ]
I FONT <выр.С1> [, <Bbip.N> ] J (STYLE <выр.С2>)
[FILL FILE <выр.СЗ>]
[ ICON FILE <выр.С4> ]
[ HALFHEIGHT J [ MDI | NOMDIJ [ FOOTER <выр.С5> ]
[ TITLE <выр.С6> ]
[ DOUBLE | PANEL | NONE | SYSTEM < строка бордюра> J [CLOSE | NOCLOSE 1 [FLOAT | NOFLOAT [
[ GROW | NOGROW)
[ MINIMIZE ]
[SHADOW [
[ ZOOM | NOZOOM ]
[ FILL <выр.С7> J
[ COLOR Сснисок nap цвстов> | COLOR SCHEME <Bbip.N2> ]
Назначение опций:
Yl,Xl и Y2, X2 — определяют координаты левого верхнего и правого нижнего углов описываемого окна.
AT Y1,X1 — переопределяет координаты левого верхнего угла окна. Если эта опция используется совместно с опцией SIZE, то Visual FoxPro автоматически согласовывает размер окна с количеством помещенного в него текста и размером шрифта.
IN WINDOW <имя окна 2> — размешает описываемое окно внутри другого окна с именем <имя окна 2>. Если эта опция опущена, то описываемое окно размешается на экране.
IN SCREEN — описываемое окно размещается на экране. Эта опция задана по умолчанию.
IN DESKTOP — размещает описываемое окно на экране WINDOWS поверх главного окна Visual FoxPro
FONT <выр.С1>, <Bbip.N> STYLE <выр.С2> — определяет тип, размер и стиль шрифта
FILL FILE <выр.СЗ> — задает фоновый рисунок окна. В <выр.СЗ> указывается имя графического файла с расширением .bmp.
ICON FILE <выр.С4> — задает пиктограмму, которая будет отображаться после свертывания окна. В <выр.С4> указывается имя графического файла с расширением .bmp.
ILVLFIIEIGHT — создаст окно со строкой заголовка половинной высоты. Опция используется для обеспечения работы программы в двух средах — WINDOWS и MS DOS.
MDI | NOMDI — указывает, соответствует ли описываемое окно многооконному интерфейсу (М DI) или нет (NOMDI). По умолчанию принято — MDI.
FOOTER <выр.С5> — описывает заголовок окна в центре нижней границы окна.
TITLE <выр.С6> — описывает заголовок окна в центре верхней границы окна.
DOUBLE — обрамляет окно двойной линией.
PANEL — обрамляет окно одинарной линией.
NONE — окно не имеет линии границы.
SYSTEM — граница обозначена сплошной полосой и в ее углах расположены элементы управления окном (стандарт среды MS DOS).
<строка бордюра> — задает шаблон (не более восьми символов), который используется для задания границы окна.
CLOSE | NOCLOSE — разрешает (CLOSE) или запрещает (NOCLOSE) закрытие окна с помощью мыши и выводит в правый верхний угол соответствующую кнопку.
FLOAT | NOFLOAT — разрешает (FLOAT) или запрещает (NOFLOAT) перемещение окна по экрану как с помощью мыши, так и с помощью клавиатуры.
GROW | NOGROW — разрешает (GROW) или запрещает (NOGROW) изменять размер окна как с помощью мыши, так и помощью клавиатуры.
MINIMIZE — разрешает сворачивание окна до пиктограммы.
SHADOW — отображает окно обрамленное «тенью*.
ZOOM | NOZOOM — разрешает (ZOOM) или запрещает (NOZOOM) распахивать окно на весь экран и возвращаться в нормальное состояние.
FILL <выр.С7> — определяет символ фонового заполнения окна. COLOR <спнсок пар цветов> | COLOR SCHEME <Bbip.N2> — определяет цвет окна либо по списку цветов, либо указанием номера схемы (от 1 до 24).
АКТИВАЦИЯ ОКНА
ACTIVATE WINDOW
[ <имя окпа!> J [, <имя окна2> J [... ] | ALL [ BOTTOM | ТОР ]
Команда предъявляет на экран ранее определенные окна, имена которых указаны в списке [ <имя окна1> ] [, <имя окна2> ][...], либо все окна (ALL). Кроме того, можно указать расположение открываемых окон: под ранее открытыми окнами (BOTTOM) или перед уже открытыми окнами (ТОР) По умолчанию принята опция ТОР.
УПРАВЛЕНИЕ РАСПОЛОЖЕНИЕМ ОКНА
SHOW WINDOW <нмя окна1> [, <имя окна2> ][...] | ALL [ IN WINDOW <имя окиа N> | IN SCREEN ]
[ТОР | BOTTOM | SAME]
[SAVE]
[REFRESH]
Команда предъявляет на экран указанное окно или окна, изменяя порядок их отображения. Геометрические размеры окна и его расположение на экране команда не изменяет. Назначение опций:
IN WINDOW <имя окна N> — выводит указанные окна внутри окна <имя окна N>.
IN SCREEN — выводит указа!шые окна на экран.
ТОР — помешает вновь открываемые окна поверх уже открытых окон.
BOTTOM — помещает вновь открываемые окна под уже открытыми окнами.
SAME — помещает на экран деактивированное окно, в то же самое место, где оно было до деактивации.
SAVE — сохраняет на экране образ окна после его удаления.
REFRESH — предназначено для повторного открытия окна BROWSE после внесения изменений в данные. В окне BROWSE автоматически изменения не отображаются, поэтому нужна дополнительная команда на обновление информации в окне BROWSE.
ДЕАКТИВАЦИЯ ОКНА
DEACTIVATE WINDOW <имя окна1> [, <имя окна2> ] |...} | ALL
Команда удаляет с экрана, но оставляет в оперативной памя ти окна, указанные в списке <имя окна1> [, <имя окна2> ][...] или все (ALL) окна. После этого вывод направляется либо в оставшееся открытое окно, либо на экран.
ПЕРЕМЕЩЕНИЕ ОКНА
MOVE WINDOW <ичя окна> ТО Y, X | BY <bmp.N 1>, <Bbip.N2> | CENTER
Команда перемещает указанное <нмя окна> окно на экране или внутри другого окна. Причем левый верхний угол окна помещает ся в точку, указашгую либо абсолютными координатами ТО Y, X, либо oTHocHTej ьными координатами BY <Bbip.Nl>, <Bbip.N2>, либо располагается по центру — CENTER. Команда может выполняться как до активации окна, так и после активации.
УДАЛЕНИЕ ОКОН
CLEAR WINDOWS
Команда удаляет все окна с экрана и из оперативной памяти.
УДАЛЕНИЕ УКАЗАННЫХ ОКОН
RELEASE WINDOWS Ссписок имен окон>
Команда удаляет с экрана и из оперативной памяти окна, имена которых указаны в списке <список имен окон>.
СОХРАНЕНИЕ ОКОН В ПАМЯТИ
SAVE WINDOW Ссписок имен окон> | ALL ТО Снмя файла> |
ТО MEMO Симя MFMO ноля >
Команда сохраняет либо указанные в списке <список имен окон> окна, либо все (ALL) окна или в файле ТО Симя файла> или в Memo-поле ТО MEMO Снмя MEMO поля >
ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ОКОН
RESTORE WINDOW Ссписок имен окон> | ALL FROM Снмя файла> | FROM MEMO Снмя МЕМО-иоля>
Команда восстанавливает в оперативной памяти описания окон, имена которых указаны в списке Ссписок имен окон> или все (ALL) поля. Восстаноатсние производится либо из файла Симя файла>, либо из Memo-поля Симя MEMO поля>.
ИЗМЕНЕНИЕ ПОЛОЖЕНИЯ ОКНА
ZOOM WINDOW Симя окна> MIN [ AUTO ] | MAX | NORM [ АТ У1, XI | FROM Yl, XI [ SIZE Y2, Х21 ТО Y3, ХЗ ] |
Команда перемешает указанное окно <имя окна> с одновременным изменением его размеров, если это задано. Перемещаемое окно должно быть ранее описано командой DEFINE WINDOW ... Перемещать можно как активированное, так и деактивированное окно. Назначение опций:
MIN — сворачивает окно до пиктограммы, но в команде DEFINE WINDOW должна быть указана опция М FNIMIZE. Опция AUTO используется только совместно с опцией MIN и размешает пиктограмму свернутого окна в правом нижнем углу экрана (окна). М.АХ — распахивает окно на весь экран (весь размер старшего окна), но в команде DEFINE WINDOW должна быть указана опция ZOOM.
NORM — окно принимает размер, указанный в команде DEFINE WINDOW или установленный предшествующей командой ZOOM WINDOW...
AT Yl, XI | FROM Yl, XI — задаст новые координаты левого верхнего угла минимизированного и нормального окна.
SIZE Y2, Х21 ТО Y3, ХЗ — задаст новый нормальный размер окна либо количеством строк и столбцов (Y2 Х2), либо координатами правого нижнего угла окиа (Y3, ХЗ).
ПРОКРУТКА ОКНА
SCROLLYl,XI, Y2,X2, <выр.М> [, <выр.1\2> ]
Команда перемешает прямоугольную область окна, заданную координатами левого верхнего угла (Y1, XI) и координатами правого нижнего угла (Y2, Х2), на <выр.Х1> строк и <вырЛЧ2> столбцов. Если <Bbip.Nl> и <Bbip.N2> положительные,то прокрутка производится вверх и вправо. Если отрицательные, то вниз и влево.
При создании окон допускается использование следующих функций:
\VEXIST(<hmb окна>) — функция возвращает значение «истина* (.Т.), если существует окно, указанное в <имя окна>. В противном случае возвращается значение «ложь» (.F.).
\\'ОМТОР([<нмя окла> ]) — функция без аргумента возвращает имя окна переднего плана. Если н аргументе указано имя окна переднего плана, то функция возвращает значение «истина» (.Т.). В противном случае возвращается значение «ложь* (.F.). \VOUTPUT([ <имя окна> ]) — функция без аргумента возвращает имя активного окна, в которое производится выдача информации. Если в аргументе указано имя активного окна, то функция возвращает значение «истина* (.Т.). В противном случае возвращается значение «ложь* (.F.).
\YMINIMUM([ <имя оква> ]) — функция возвращает значение «истина* (.Т.), если текущее (аргумент не указан) окно или указанное в <кмя окна> окно находится в свернутом состоянии. WMAXIMUM([ <имя окна> ]) — функция возвращает значение «истина* (.Т.), если текущее (аргумент не указан) окно или указанное в <нмя окна> окно распахнуто на весь экран (старшее окно). WCOLS([ <имя окна> ]) — функция возвращает количество столбцов либо в текущем (аргумент не указан) окне, либо в указанном окне.
WROYVS([ <ичя окна> ]) — функция возвращает количество строк либо в текущем (аргумент не указан) окне, либо в указанном окне.
\VLCOL{[ <имя окна> ]) - функция возвращает номер левой колонки (относи ельно экрана) либо текущего (аргумент не указан) окна, либо указанного окна.
WLROYV([ <имя окна> ]) — функция возвращает номер верхней строки (относительно экрана) либо текущего (аргумент не указан) окна, либо указашюго окна.
WLAST([ <имя окна> ]) — функция возвращает значение «истина» (.Т.), если указанное окно было активным перед текущим окном. В противном случае возвращается значение «ложь* (.F.). Если аргумент не указан, то функция возвращает имя предыду щего активного окна.
WTITLK([ <нмя окиа> ]) — функция возвращает заголовок либо текущего (аргумент не указан) окна, либо указанного окна.
SCOLS() — функция возвращает число столбцов экрана.
SROWS0 — функция возвращае число строк экрана.
При работе с функциями следует иметь в виду, что имя окна пишется буквами атинского алфавита и опреде шется в ком. нде DEFINE WINDOW... В тексте программы обращение к окну производится по его имени.
Заголовок окна указывается в опции TITLE команды DEFINE WINDOW и пишется как буквами латинского алфавита, так и буквами русского алфавита. Заголовок окна выводится на экран в строку заголовка.
Если окно BROWSE при своем описании имеет опцию TITLE, то в качестве имени окна BROWSE будет использоваться этот заголовок. Причем команды активации и деактивации окна распознают только заголовки написанные буквами латинского алфавита. При закрытии таких окон с помощью клавишных команд: Esc, Ctrl + W или Ctrl + End, не важно какими буквами написан заголовок окна, но при программном закрытии окна — существенно. Замечание справедливо и для русифицированных версий FoxPro.
Примеры
Пример 1. Создание, предъявление на экран, скрытие и удаление окна «Вывод».
CLEAR
DEFINE WINDOW output FROM 2.1 TO 13,75 TITLE 'Вывод' ;
CLOSE FLOAT GROW SHADOW ZOOM ACTIVATE WINDOW output
WAIT WINDOW 'Нажмите любую клавишу для скрытия окна
'Зывод'
HIDE WINDOW output
WAIT WINDOW 'нажмите любую клавишу для вывода на экран
'окна Вывод'
SHOW WINDOW output
WAIT WINDOW 'Нажмите любую клавишу для удаления окна ' + ,-
'Вывод'
RELEASE WINDOW output
Пример 2. Управление расположением окна на экране.
DEFINE WINDOW wEnter FROM 10,4 TO 15,54 SYSTEM TITLE; 'Перемещение окна'
ACTIVATE WINDOW wEnter
WAIT WINDC/W 'Нажмите любую клавишу для перемещения '+;
'окна'
MOVE WINDOW wEnter ТО 20,15
WAIT WINDOW 'Нажмите любую клавишу для расположения '+;
'окна по центру экрана'
MOVE WINDOW wEnter CENTER
WAIT WINDOW 'Нажмите любую клавишу для удаления окна' RELEASE WINDOW wEnter
Пр и м е р 3. Сохранение окна «Вывод» в файле.
CLEAR
DEFINE WINDOW wOutputl FROM 2,1 TO 13,75 TITLE 'Вывод' ;
CLOSE FLOAT GR' OW SHADOW ZOOM ACTIVATE WINDOW WOutputl
@ 1,1 SAY 1 Сохранение окна в файле temp.win';
FONT "Times New Roman',12 STYLE 'B'
SAVE WINDOWS wOutputl TO temp =INKEY(3)
CLEAR WINDOWS
WAIT WINDOW 'Для восстановления окна «Вывод» на '+;
'экране нажмите любую клавишу RESTORE WINDOW wOutputl FROM temp ACTIVATE WINDOW wOutputl
WAIT WINDOW 'Для удаления окна и файла нажмите '+;
'любую клавишу'
DEACTIVATE WINDOW wOutputl RELEASE WINDOW wOutputl DELETE FILE temp.win
Пример 4. Перемещение окна по экрану с изменением размеров.
CLOSE ALL && Закрытие всех файлов
SET DEFAULT ТО E:\PRIMER && Задание рабочего каталога USE Customer.dbf in 1 alias cus
&& Далее открытие двенадцати таблиц
USE |
Order.dbf |
in |
2 |
alias |
ord |
|
USE |
Salesman.dbf |
in |
3 |
alias |
smn |
|
USE |
Sale.dbf |
in |
4 |
alias |
sal |
|
USE |
Account.dbf |
in |
5 |
alias |
acnt |
|
USE |
Catalog.dbf |
in |
6 |
alias |
ctl |
INDEX ORDER |
USE |
Autor.dbf |
in |
7 |
alias |
atr |
|
USE |
Town.dbf |
in |
8 |
alias |
twn |
|
USE |
Street.dbf |
in |
9 |
alias |
str |
|
USE |
Fam.dbf |
in |
10 |
alias |
fam |
INDEX ORDER |
USE Im.dbf in 11 alias im _NDEX im ORDER TAG Im USE Ot.dbf in 12 alias ot INDEX ot ORDEP TAG ot CLEAR SELECT Ctl
BROWSE NORMAL NOWAIT IF _DOS OR „WINDOWS
ZOOM WINDOW Ctl MIN;
WAIT WINDOW TIMEO'JT 5 'Окно свернуто'-;
'Подождите.'
ENDIF
ZOOM WINDOW Ctl NORM
WAIT WINDOW TIMEOUT 5 'Установлен нормальный '+;
'размер окна. Подождите.'
IF _DOS OR „WINDOWS
ZOOM WINDOW Ctl MIN AT 10,10;
WAIT WINDOW TIMEOUT 5;
'Окно свернуто и помещено в точку с коорцин, тами '+; '10,10 Подождите.'
ENDIF
ZOOM WINDOW Ctl NORM AT 1,1 SIZE 22,25 WAIT WINDOW TIMEOUT 5 ;
'Для нормального окна задана новая координата 'правого нижнего угла. Подождите.'
ZOOM WINDOW Ctl NORM FROM 10,10 TO 22,70
WAIT WINDOW TIMEOUT 5 'Задание нового нормального' + ;
'размера и положения '+;
'Подождите.'
ZOOM WINDOW Ctl MAX
WAIT WINDOW TIMEOUT 5 'Окно распахнуто на весь '+;
'экран. Подождите.'
CLEAR ALL
Пример 5. Размещение фонового рисунка в окне и задание пиктограммы при свертывании окна.
CLEAR ALL
CLOSE ALL && Закрытие всех файлов
SET
DEFAULT ТО
E:\PRIMER &&
Задание рабочего каталога
USE
Customer.dbf
in
1
alias
cus
USE
Order.dbf
&&
in
Далее
открытие двенадцати таблиц 2 alias
ord
USE
Salesman.dbf
in
3
alias
smn
USE
Sale.dbf
in
4
alias
sal
USE
Account.dbf
in
5
alias
acnt
USE
Catalog.dbf
in
6
alias
ctl
INDEX
catalog; ORDER TAG Fam
USE
Autor.dbf
in
7
alias
atr
USE
Tcwn.dbf
in
8
alias
twn
USE
Street.dbf
in
9
alias
str
USE
Fam.dbf
in
10
alias
fam
INDEX
fam;
ORDER
TAG tag(2)
USE
Im.dbf
in
11
alias
im
INDEX
im;
ORDER
TAG Im
USE
Ot
.dbf
in
12
alias
ot
INDEX
ot;
ORDER
TAG ot
DEFINE WINDOW Primer FROM 1,1 TO 20,10;
FILL FILE E:\M_DOC\tiger.bmp ;
ICON FILE D:\VFP\FOX.bmp MINIMIZE TITLE 'Пример'; FLOAT GROW CLOSE ZOOM ;
FONT 'Times New Roman',12 STYLE 'B'
ACTIVATE WINDOW Primer
0 10.2 Say 'Тигры'
0 12.2 Say 'Котята'
SELECT fam
BROWSE IN WINDOW Primer
Мышью измените (увеличьте) размер окна Primer. Размер окна Browse также можно изменить.
Пример 6. Использование некоторых оконных функций. CLEAR ALL
DEFINE WINDOW File FROM 10,10 TO 2C,69;
FONT 'Times New Roman' 12 Style 'BI'; TITLE 'Файл' DEFINE WINDOW View FROM 1,1 TO 19,45 TITLE 'Вид'; CLOSE FLOAT GROW ZOOM;
FONT 'Times New Roman' 12 Style 'BI' ACTIVATE WINDOW View
? 'Описано ли окно File' AT 2, WEXIST<'File') AT 45
£c£c На экран выводится .Т.
STORE 'View' TO Name ? 'Описано ли окно Win_name' AT 2, ;
WEXIST('win_name') AT 45 && На экран выводится .F.
? 'Существует ли переменная Name' AT 2, ; WEXIST(Name) AT 45 && На экран выводится .Т.
IF NOT EMPTY(WONTOPO ) ;
WAIT W NDOW 'АКТИВНО окно: ' ▼ WONTOPO ->■ ;
'Нажмите любую клавишу'
ELSE
WAIT WINDOW 'Открытых окон нет'
ENDIF
RELEASE WINDOWS File, View
13. Контрольные вопросы
Какой интерфейс имеет FoxPro — однооконный или многооконный?
Какие три состояния может иметь окно?
Какой командой описывается окно пользователя? Каковы особенности этой команды?
4* Укажите команды предъявления окна на экран и удаления окна с экрана.
Какая команда управляет расположением окна? Каковы особенности этой команды?
Какой опцией какой команды задается верхний (нижний) заголовок окна?
Какие опции какой команды управляют закрытием и перемещением окна?
Какие опции какой команды управляют размерами окна*7
Чем отличается деактивация окна от удаления окна? Какими командами выполняются эти действия?
Назовите две команды перемещения окна.
Как определить количество строк и столбцов окна?
Как проверить, существует ли окно с указанным именем?
ПСЕВДОГРАФИКА И ЭЛЕМЕНТЫ УПРАВЛЕНИЯ
При создании программного продукта наряду с правильным функционированием надо разработать удобный и понятный в эксплуатации интерфейс. Привлекательный внешний вид имеет важное значение при коммерческом распространении программы, обеспечивая конкурентоспособность созданного программного продукта.
Для управления ходом вычислений испотьзуют различные элементы управления, поля ввода, кнопки, радиогруппы и т. д., располагая их в окне приложения. С помощью элементов управления задают различные режимы работы приложения — сортировку, поиск и фильтрацию данных, а также критерии для этих режимов работы.
ИЗОБРАЗИТЕЛЬНЫЕ СРЕДСТВА
Изобразительные средства, о которых мы расскажем в п. I0.1, использовались для создания привлекательного внешнего вида в ранних версиях FOX PRO.
В настоящее время они по-прежнему разрешены к использованию, в современных версиях FOX PRO элементы эстетического оформления выполняются средствами, рассмотренными далее, в п. 10.2.
Создание рамки
@ Yl, XI Y2.X2 BOX <выр. О
Команда рисует рамку с координатами левого верхнего Yl, XI и правого нижнего Y2, Х2 углов. При желании в углах рамки и в центре каждой из сторон рамки можно установить символ <выр. С>. <выр. О содержит символьное выражение длиной не более девяти символов (девятый символ устанавливается в цент
ре прямоугольной области). Если <выр. О отсутствует, то рамка будет нарисована одиночной линией.
Создание рамки с определением цвета и формы
@ Yl, XI ТО Y2.X2 ( DOUBLE | PANEL | <шаблои> ]
[ COLOR <слнсок пар овстов> | COLOR SCHEME <выр. N> ]
Команда рисует рамку с координатами левого верхнего Yl, XI и правого нижнего Y2, Х2 углов. Рисование выполняется только вниз и вправо. Назначение опций:
DOUBLE — контур рамки рисуется двойной линией.
PANEL — контур рамки рисуется одиночной линией.
<шаблон> — контур рамки составлен из символов, указанных в шаблоне. В шаблоне символы перечисляются через запятую. Если в <шаблоне> указан один символ, то этим символом и выполняется контур рамки. Если в <шаблоне> содержится несколько символов, но не более девяти, то рамка рисуется ана- Л01 ично предыдущей команде.
Задание окантовки для окон и меню
SET BORDER ТО [ SINGLE | DOUBLE | PANEL | NONE | <шаблов1> | <шаблон2> ]
Команда задаст тип линии рамки, которая создается командой @... ТО для меню, описанных командами DEFINE MENU ... или DEFINE POPUP ..., а также для окон, описанных командой DEFINE WINDOW ... Назначение опций:
SINGLE — одиночная линия (будет нарисована по умолчанию). DOUBLE — двойная линия.
PANEL — сплошная линия рамки.
NONE — линия рамки отсутствует.
<шаблон1> — символьный шаблон дпя линии рамки активного окна.
<шаблон2> — символьный шаблон для линии рамки пассивных окон.
Шаблоны составляются по правилам, указанным для предыдущих команд.
Установка цвета
Команда установки цвета элементов экрана имеет несколько вариантов исполнения.
Для обозначения цветов и эффектов используются следующие символы:
N —черный G — зеленый GR - коричневый В — синий BG — бирюзовый R—красный GR+ —желтый RB — лиловый W — белый 1 — инверсия U — подчеркивание цвета (для текста)
+ — после каждого кода цвета означает повышенную яркость.
* — после каждого кода цвета означает эффект мерцания (только для текста).
а. Цвет для команд ввода-вывода и элементов интерфейса устанавливает команда:
SET COLOR ТО [ <стандартный [, <дополнительный ] [, <рамка> ) [ <фон> ] J
Команда без опций устанавливает цвет по умолчанию. Назначение опций:
<стаддартный> — задает цвет основных текстовых сообщений.
<дополнительныи> — залает цвет дополнительных сообщений области ввода GET, выбранного пункта меню и т. д.
<рамка> — определяет цвет экрана за пределами области, ограниченной рамкой.
<фон> — определяет цвет фона внутри рамки.
б. Цветовую гамму но номеру схемы, указанной в <выр.К1> определяет команда:
SET COLOR OF SCHEME <выр.1Ч1> TO [ Ссписок пар цвегов> ] | SCHEME <Bbip.N2>l
Номер схемы задается в пределах от 1 до 24. Д ля каждого номера схемы можно задать конкретное сочетание цветов одним из способов:
ТО Ссписок пар цветов> — перечисляется десять пар цветов. Допускается указывать не все десять сочетаний цветов, но зафиксировать место (с помощью запятых) для каждого из десяти сочетаний обязательно. В <списке пар цветов> допускается указание не только конкретного цвета, но и интенсивность каждого цвета с помощью опции RGB. Интенсивность каждого цвета задается в пределах от 0 до 255.
ТО SCHEME <Bbip.N2> — задастся одна из комбинаций (в диапазоне от 1 до 10) сочетаний цветов.
Примеры
SET COLOR OF SCHEME 20 TO;
■*-/B,K+/R,W+/N* ,G+/N* ,V>+/B+-,GR+VB,№-/N,W*/B,W/B SET COLOR OF SCHEME 6 TO W+/N,......... N/BG
SET COLOR OF SCHEME 8 TO RGB(255,255,255,0,0,0)......... ;
RGB(0,0,0,142,74,92)
SET COLOR OF SCHEME 16 TO SCHEME 10
Эта команда без опций устанавливает цвета из текущего цветового набора.
в. Цвет для элементов меню и пользовательских окон устанавливает кома! ада:
SET COLOR OF NORMAL | MESSAGE | TITLES | BOX | HIGHLIGHT | INFORMATION | FIELDS TO [ <ставдарт> ]
Управление мерцанием
SET BLINK ON | OFF
Команда включает или отключает мерцание. По умолчанию мерцание выключено.
Изменение цвета существующего изображения
@ Y1,X1 FILL ТО Y2,X2 [COLOR <список пар цвстож> |
COLOR SCHEME <Bbip.N>l
После выполнения этой команды вывод данных будет осуществляться в новых цветах. Изменение цвета возможно только в направлении вниз и вправо. Если опция опущена, то производится очистка указанной области.
Определение текущего набора цветов
SCHE\lE(<Bbip. N>)
Функция выводит на экран список цветовых пар дпя указанной в <выр. N> схемы.
Управление звуком
SET BELL ON | OFF
Команда включает или выключает звуковой сигнал при редактировании данных в командах BROWSE, EDIT, CHANGE, APPEND, INSERT и READ. Звуком сопровождается выход из редактируемого поля.
Установка частоты и длительности звукового сигнала
SET BELL ТО <частота>, <длнтельиость>
Команда задает частоту звуконого сигнала в герцах в диапазоне от!9Гцдо 10000 Гц и длительность звучания сигнала в секундах от I сек до 19 сек.
ЭЛЕМЕНТЫ УПРАВЛЕНИЯ
При создании пользовательского интерфейса удобно использовать элементы управления. Элементы управления можно как программировать с помощью команд FoxPro, так и, используя лист формы, располагать на форме готовые элементы управления.
Для описания элементов управления, как правило, используется команда @ GET с опцией FUNCTION или PICTURE. Элементы управления можно располагать как на экране, так и на форме. Если элемент управления надо расположить на форме, то программный код этого элемента упраатения помещают на лист программного кода формы (двойной щелчок на листе формы выводит на экран лист программного кода формы). При описании элемента управления с помощью команд создастся либо терминальный элемент (TERMINATING), который при своем описании требует команду считывания READ, и при работе задает выполнение какой-либо команды (например печать); либо нетерминальный элемент (NOTERM1NATING), который предназначен для определения особенностей выполнения действий терминального элемента (например определение режимов печати)- При составлении шаблонов для опций FUNCTION и PICTURE первый символ шаблона определяет функциональный код создаваемого элемента упраатения:
* — кнопки различных типов;
Л — списки различных типов.
Второй символ шаблона указывает на конкретный вид элемента управления:
*R — радиокнопка (Radio Button).
*С — флажок (CheckBox).
•пробел — невидимая кнопка (Invisible Button). Если пробел есть, то кнопка будет видима. Если пробела нет, то кнопка — невидима Лпробел — раскрывающийся список (СошЬоВох).
Дня создания списка (List Box) вместо опции FUNCTION используют опцию FROM.
При описании некоторых элементов можно использовать третий символ, который замешает опцию по умолчанию:
N — нетерминальная кнопка.
Т — терминальная кнопка.
Н — расположение элементов по горизонтали (HORIZONTAL). V — расположение элементов по вертикали (VERTICAL).
После установки двух (или трех) символов шаблона обязательно устанавливается пробел. Шаблоны для опций FUNCTION и PICTURE пишутся одинаково, но для опции PICTURE шаблон всегда начинается с символа
Стандартные элементы управления, взятые с панели инструментов, могут располагаться только на форме.
СОЗДАНИЕ ЭКРАННОЙ ФОРМЫ
Visual FoxPro является объектно-ориентированным языком программирования, который управляется по событиям. Разработка объектно-ориентированных приложений начинается с размещения объектов на форме, каждый из которых выполняет конкретные функции. Создание каждого объекта предполагает использование Visual FoxPro, при этом допускается копирование объектов из одного приложения в другое. При работе с объектами по событием понимается щелчок кнопки мыши на объекте, выбор пункта меню и т. д.
Объектно-ориентированное построение Visual FoxPro предполагает построение приложения шаг за шагом, переходя от одного объекта к другому. Все объекты группируются в классы. Класс содержит информацию о том, как должен выглядеть объект и определяет выполняемые им действия. Объект является экземпляром класса и наследует характеристики класса. Примеры объектов: кнопка, радиогруппа, флажок, окно и т. д. При создании входных форм широко используются базовые классы, список которых приведен в табл. 10.1. Таблица 10.1. |
|||
Наименование |
Назначение |
Видимый Контейнер |
|
Active Doc |
Активный документ |
Нет |
Нет |
CheckBox |
Флажок |
Да |
Нет |
Column |
Столбец |
Да |
Да |
ComboBox |
Раскрывающийся список |
Да |
Нет |
CommandBuUon |
Кнопка упрапления |
Да |
Нет |
CommandG roup |
Набор кнопок управления |
Да |
Да |
Container |
Контейнер |
Да |
Да |
Control |
Базовый визуальный класс |
Да |
Нет |
Custom |
Базовый не визуальный класс |
Нет |
Нет |
EditBox |
Область редактирования |
Да |
Нет |
Form |
Форма |
Да |
Да |
FormSet |
Группа форм |
Нет |
Да |
Grid |
Таблица |
Да |
Да |
Header |
Заголовок столбцов таблицы |
Да |
Нет |
HypcrLink Object |
Гиперссылка |
Нет |
Нет |
Image |
Изображение |
Да |
Нет |
Label |
Надпись |
Да |
Нет |
Line |
Линия |
Да |
Нет |
ListBox |
Список |
Да |
Нет |
OleContainerControl |
OLE-объекг управления |
|
|
OleBoundControl |
OLE-объект данных |
|
|
OptionButton |
Переключатель |
Да |
Нет |
OptionGroup |
Набор переключателей |
Да |
Да |
Page |
Страница формы |
Да |
Да |
Page Frame |
Макет страницы |
Нет |
Да |
ProjectHook |
Проект |
Нет |
Да |
Separator |
Разделитель |
Да |
Нет |
Shape |
Обрамление |
Да |
Нет |
Spinner |
Счетчик |
Да |
Нет |
Text Box |
Поле ввода |
Да |
Нет |
Timer |
Таймер |
Нет |
Нет |
ToolBar |
Панель управления |
Да |
Да |
Классы могут быть вложены друг в друга, в этом случае старший класс называется контейнером. Доступ ко всем объектам возможен либо на этапе проектирования формы, либо программно.
Для программного доступа к объектам используются следующие ключевые слова:
THIS — ссылка на сам объект;
THISFORM — ссылка на форму, которая содержит объект; THISFORMSET — ссылка на группу форм, которая содержит объект.
В Visual FoxPro отобразить данные можно двумя способами: в окне BROWSE и в экранной форме. Создать экранную форму можно в режиме Мастера формы (Form Wizard) — быстрое создание упрощенного варианта экранной формы; в режиме Построителя (Builder) — создание более развитой формы или в режиме Конструктора (Form Design г) — создание формы любой степени сложности. В Visual FoxPro экранная форма существует как функциональный объект проектирования. На экранной форме объединяются визуальные компоненты, элементы управления и сервисные (вспомогательные) элементы.
Создание экранной формы
с помощью Мастера форм — Form Wizard
С помощью Мастера форм можно создавать экранные формы для просмотра и редактирования данных как одной таблицы, так и для нескольких взаимосвязанных таблиц. Экранная форма создастся только для физически существующей таблицы.
После открытия проекта (базы данных) в диалоговой панели Диспетчера проектов (Project Manager) надо выбрать вкладку Документы (Documents) и курсором выделить команду Формы (Forms). Затем нажать кнопку Новый (New).
В появившейся на экране диалоговой панели New Form выбрать способ создания формы — пиктограмму Form Wizard. В диалоговой панели Wizard Selection надо указать на данных каких таблиц будет построена форма: Form Wizard — по данным одной таблицы One-to-Many Form Wizard — по данным нескольких таблиц.
После запуска Мастера форм на экран будут выводиться диалоговые панели Мастера, где надо ответить на вопросы. Все диалотовые панели Мастера снабжены четырьмя кнопками управления: Cancel — отказ от построения экранной формы; Next — переход к следующему шагу Мастера; Back — возврат к предыду шему шагу Мастера, Finish — завершение построения формь Кнопку Finish можно нажать на любом шаге Мастера, тогда недостающие сведения будут подставлены по умолчанию.
В первой диалоговой панели Form Wizard (Step 1 — Field Selection) в раскрывающемся списке Databases надо указать имя базы данных а в раскрывающемся списке Tables указать имя таблицы, поданным которой будет построена экранная форма. В раскрывающемся списке Avalable Fields следует выбрать имена полей, значения которых будут размещены в экранной форме. Перенос выбрашвых полей в окно Selected Fields производится с помощью кнопок-стрелок.
Во второй диалоговой панели Form Wizard (Step 2 — Style) определяется стиль йене шсиия экранной формы. В списке Style выбирается один из допустимых стилей: Standard. Chiseled, Shadowed, Boxed или Embossed. Результат Rauiero выбора можно просмотреть здесь же в специальном окне. С помощью радио- группы Button Туре определяется тип отображения кнопок управления:
Text Buttons — текстовые надписи на кнопках управления; Picture Buttons — пиктограммы на кнопках управления;
No Buttons — кно 1ки управления отсутствуют.
В третьей диалоговой панети Form Wizard (Step 3 — Sort Order) определяется порядок сортировки данных. В списке Avaliablc Fields указываются имена полей, по значениям которых надо выполнить сортировку данных. А с помощью кнопок Ascending (по возрастанию) и Descending (по убыванию) определяется порядок сортировки. С помощью кнопки Add поля сортировки заносятся в окно Selected Fields.
В четвертой диалоговой панели Form Wizard (Step 4 — Finish) определяется заголовок созданной экранной формы, который пишется в поле ввода Type a title for your form. Далее с помощью кнопок радиогруппы выбирается вариант продолжения работы:
Save form for later use — сохранить созданную форму;
Save and run form — сохранить экранную форму и поставить ее на выполнение;
Save form and modify it in the Form Designer — сохранить экранную форму и открыть ее в Конструкторе для модификации.
Если при создании таблицы, на основе которой строится экранная форма, было задано свойство Caption, то содержимое этого свойства используется в качестве надписей к нолям. Если свойство Caption не задано, то для надписей к полям используются имена полей.
Созданная экранная форма готова к использованию и не требует генерации программных кодов. Для запуска созданной экранной формы надо из главного меню подать команду Program -> Do установить курсор на имя файла экранной формы и нажать кнопку Ok [2].
Создание экранной формы
с помощью Конструктора форм — Form Designer
Процесс создания формы состоит в размещении компонентов формы (элементы управления, визуальные компоненты и т. д.) на листе формы и определения для них свойств и событий при выполнении различных действий. Созданная экра!шая форма может находиться и одном из двух состоянии:
а. Режим проектирования — на форме размещаются компоненты, описываются их свойства и события — пассивное состояние.
б. Рабочий режим — файл формы поставлен на выполнение. После чего в экранную форму выводятся данные, которые можно просматривать, редактировать, удалять и производить некоторые действия (сортировка, поиск, фильтрация и т. д.) — активное состояние.
Для открытия окна Конструктора форм надо выполнить одно из действий:
из главного меню подать команду File -> New, в появившейся на экране диалоговой панели выбрать кнопку New File и указать тип создаваемого файла Form.
вызвать на экран окно проекта и выбрать вкладку Document, затем указать группу Form и нажать кнопку New.
• вызвать на экран окно проекта и выбрать вкладку Document, затем указать группу Form и из главного меню подать команду File -> New, в появившейся на экране диалоговой панели выбрать кнопку New File и указать тип создаваемого файла Form.
При работе с Конструктором форм можно использовать четыре панели инструментов:
Form Controls — предназначена для выбора и размещения компонентов на листе формы.
Form Designer — предназначена для управления формой и вызовом на экран остальных трех панелей инструментов.
Layout — предназначена для выравнивания компонентов на листе формы.
Color Palette — предназначена для задашш цвета компоненту.
Чтобы разместить компонент на форме, надо па панели инструментов выбрать нужный компонент (установить курсор мыши на нужный компонент и щелкнуть левой кнопкой). Затем курсор мыши расположить на поле формы и либо щелкнуть левой кнопкой мыши, либо, лажав левую кнопку мыши, нарисовать прямоугольный контур, внутри которого будет размещен выбранный компонент.
В каждый момент времени на форме может быть активен только один компонент. Активный компонент на форме выделен по контуру черными маркерами. Для того чтобы сделать компонент активным, надо разместить на нем курсор мыши и щелкнуть левой кнопкой мьппи. Для отмены активности компонента надо либо выделить другой компонент, либо щелкнуть левой кнопкой мыши на ноле формы.
Для активного компонента на экран можно вывести окно свойств Properties (окно свойств может быть постояшю открыто) с помощью команды главного меню View -> Properties. При смене активного компонента в окно Properties автоматически выводится информация для выбранного компонента. Окно Properties содержит вкладки:
ЛИ — содержит список (в алфавитном порядке) всех свойств и , методов выбранного компонента.
Data — содержит свойства компонента, относящиеся к источнику данных.
Methods — содержит список всех методов компонента.
Layout — содержит свойства, определяющие внешний вид компонента.
Other — содержит все свойства, которые не вошли в остальные вкладки.
При работе с окном Properties выбирают нужное свойство компонента и присваивают ему значение одним из способов: с клавиатуры вписывают требуемое (допустимое) значение; с помощью кнопки 1 открывают список, из которого выбирают нужное значение;
с помощью кнопки выводят на экран диалоговую панель, с помощью которой формируют нужное значение.
На каждой вкладке выше списка свойств расположены три кнопки:
jjgj— выводит на экран построитель выражений (формул) для задания значения свойства.
и— подтверждает ввод значения свойства. ■>£'!
I— отказ от введенного значения свойства.
Кроме окна Properties свойства и методы компонента можно задать программным способом.
Изменить геометрические размеры активного компонента можно, буксируя один из маркеров выделения компонента или изменяя значения свойств Height и Width.
Изменить положение компонента на форме можно, буксируя компонент или изменяя значения свойств Left и Тор.
Активный компонент можно удалить либо нажав клавишу Backspace, либо нажав клавишу Del, либо из главного меню подать команду Edit -> Cut, либо с помощью кнопки графического меню
Для удобства размещения объектов на форме на листе формы выведена сетка. Установить или удалить сетку можно с помощью команды главного меню View -» Grid Line. Деления сетки (размер шага) можно задать в диалоговой панели Grid Propert es, которая выводится на экран командой главного меню Format -> Set Grid Seale.
Компоненты можно размещать строго по линиям сетки, если из главного меню подать команду Format -» Snap to Grid.
По умолчанию при нажатии клавиши Tab фокус управления (порядок обхода компонентов) передается в естественном порядке слева направо и сверху вниз. Изменить порядок обхода компонентов (передачу фокуса управления) можно в одном из режимов: Interactive — интерактивный, то есть в порядке расположения элементов на форме, и в режиме By List — в естественном порядке. Для установления ооного из режимов надо находясь в Конструкторе формы, из главного меню подать команду Tools -> Options —на экране диалоговая пане ть Options, на которой надо выбрать вкладку Forms и в раскрывающемся списке Tab Ordering выбрать одну из команд : Interactive или By List. Команда главного меню View -> Tab Order в режиме Interactive выводит на экран порядковый номер компонента при переходе от одного компонента к другому. Удерживая клавишу Shift в зажатом состоянии, можно с помощью щелчка мыши изменить порядок передачи фокуса упраатения. По окончании перестановок надо нажать кнопку Reorder. Команда главного меню View -> Tab Order в режиме By List будет выводить на экран диалоговую панель Tab Order, где в окне представлены имена расположенных на форме компонент в порядке получения ими фокуса управления. С помощью мыши или кнопок By Column и By Row можно переставить имена компонент в желаемом порядке [2J.
Форма
Саму форму можно рассматривать как компонент. Форма имеет свойства и методы. Форма имеет размеры, может располагаться на экране произвольным образом, при открытии формы предварительно могут выполняться какие-то действия (и при закрытии тоже). Под настройкой экранной формы понимают определение ее размеров, положения на экране, описание заголовка и, при необходимости, задание среды окружения. Если на поле формы Щелкнуть левой кнопкой мыши, то форма станет активной, и в окне Properties будут предстаазены ее свойства и события. Перечислим основные свойства формы.
BorderStyle — задает рамку вокруг формы. Свойство может содержать одну из констант:
No border — рамка отсутствует;
Single line border — одинарная линия рамки;
Double wide border — двойная линия рамки;
Sizable border — изменяемая рамка BackColor — задает цвет фона или фоновый рисунок формы. WindowStatc — определяет состояние формы. Свойство может содержать одну из констант:
Normal — размеры формы определяются ее свойствами;
Minimized — форма свернута в пиктограмму;
Maximized — форма распахнута па весь экран.
FontName — задет тип шрифта.
FontSize — задает размер шрифта.
FontBold — начертание шрифта полужирное FontOuilline — начертание шрифта перечеркнутое.
Fontltalic — начертание шрифта курсив.
FontShadow — пачерта! ие шрифта с тенью.
FontUnderline — начертание шрифта подчеркнутое.
Под средой окружения для экранной формы понимают источник данных. Источником данных может быть одна таблица или несколько взаимосвязанных таблиц. Для задания среды окружения пред! азначена диалоговая панель Data Evironmcnt, которая предъявляется на экран одним из способов:
из главного меню подают команду View -> Evironment;
на панели инструментов Form Designer нажимают кнопку Data Evironment;
в контекстном меню выбирают команду Data Evironment.
После открытия диалоговой панели Data Evironment в главное меню добавляется пункт Data Evironment. Когда диалоговая панель Data Evironment открыта, то через контекстное меню можно определить (с помощью команды Add), какие таблицы будут источником данных для экрашюй формы. После выбора команды Add на экран выводится список имен таблиц, которые могут быть источником данных для сод аваемой экранной формы. Задание таблиц производится стандартным способом.
Рассмотрим основные свойства компонент, располагаемых на экранной форме.
Label - надпись
Компонент Label размешает текстовую информацию в любом месте экранной формы. В окне Properties можно задать следующие свойства.
Caption — содержит текст, который надо расположить на экранной форме.
BackStyle — задает фон под надписью. Свойство может содержать одну из констант:
Opaque — устанавливаемый цвет. Константа по умолчанию.
Transparent — фон надписи совпадает с фоном экранной формы.
BackCoIor — задаст цвет фона надписи. Это свойство имени смысл, если свойство BackStyle содержит константу Opaque. FontName, FontStyle и FontSizc — определяют соответственно тип, стиль и размер шрифта надписи.
BorderStyle — задает рамку вокруг надписи. Свойство может содержать одну из констант:
None — рамки нет. Константа по умолчанию;
FixedSingle — рамка в виде одиночной линии.
TextBox - поле ввода
Поле ввода предназначено для просмотра и редактирования поля таблицы, с которым оно связано. Основные свойства поля ввода
ControlSource — связывает поле ввода с полем-источником данных таблицы. Для задания имени поля-источпика данных надо либо открыть раскрывающийся список и выбрать имя поля, либо задать имя поля-источника данных с клавиатуры.
Alignment — форматирует данные внутри поля ввода. Свойство может содержать одну из констант:
Automatic — автоматическое форматирование данных: символьные данные — по левому краю поля, числовые — по правому. Константа по умолчанию.
Lcfl — данные форматируются по левому краю поля.
Right — данные форматируются по правому краю поля. Center — данные форматируются по центру поля.
BorderStyle и BorderColor — соответственно задают стиль и цвет рамки поля ввода.
Disabled BackColor — задает цвет неактивного поля ввода Comment — содержит текст комментария, который выводится в последней строке экрана.
FontName и FontStyle — соответственно задают ип и стиль шрифта.
ForeColor — задает цвет данных внутри поля ввода.
Format — задает формат отображения данных внутри потя ввода. Для задания формата следует использовать следующие символы:
А — разрешен ввод только текстовых символов;
D — разрешен ввод дат в формате, установленном командой SET DATE;
К — выделяет все поте при установке курсора в это поле;
L — отображает ведущие нули в поле;
М — содержит список допустимых значений, Список значений, разделенных запятыми, задается в свойстве InputMask.
Иформат — содержит маску формата для поля ввода. Символы маски отображаются на экране, но на винчестере не сохраняются.
InputMask — задает шаблон для ввода данных. Для создания шаблона определены следующие символы:
X — любой символ;
9 — определяет: для символьного поля возможны только цифры, для числового поля — цифры и знак плюс или знак минус;
$ — выводит на экран символ текущей денежной единицы (текущая денежная единица устанавливается командой SET CURRENCY ...);
# — определяет цифры, знак и пробел;
* — перед числовым значением выводятся звездочки. Этот символ используется совместно с символом $;
. — отделяет целую часть числа от дробной;
, — определяет разделитель тысяч.
Readonly — если свойство установлено в значение "истина", то поле доступно только для чтения. Если свойство установлено в значение "ложь”, то разрешено редактирование поля.
SpecialEfTect — определяет стиль отображения поля. Свойство может содержать одну из констант:
Plain — плоское отображение;
3D — объемное отображение (константа по умолчанию). StatusBarText — содержит комментарий к полю. Комментарий отображается в строке состояния, когла курсор устанавливается на поле.
ToolTipText — краткая подсказка к полю (ярлычок), которая появляется около поля, когда курсор мыши указывает на поле и удерживается на нем некоторое время. Это свойство зависит от значения свойства ShowTips.
ShowTips — если свойство установлено в True, то ярлычок отображается на экране. Если свойство установлено в False, то ярлычок не отображается.
EditBox - поле редактирования
Основное назначение полей редактирования — внесение изменений в поля большого размера и Memo-поля. Основные свойства:
ScrollBars — управляет выводом на экран полосы прокрутки. Свойство может содержать одну из констант:
None — полоса прокрутки отсутствует;
Vertical — выводит вертикальную полосу прокрутки.
Остальные свойства аналогичны свойствам компонента TextBox.
CommandButton - командная кнопка
Кнопка предназначена для постановки на выполнение различных процедур. Основные свойства и методы:
Caption — размещает надпись на кнопке.
Picture — размещает пиктограмму па кнопке, при этом на экран выводится диалоговая панель для задания имени файла пиктограммы.
Click — метод определяет, какие команды будут выполняться при нажатии на кнопку. Для написания команд реакции нажатия на кнопку надо либо дважды щелкнуть на кнопке для того, чтобы открылось окно редактора программных кодов, либо на вкладке Methods щелкнуть мышью на имени метода Click. Полный список метолон представлен на вкладке Methods.
CommandGroup - группа командных кнопок
Некоторые компоненты являются составными объектами: CommandGroup и OptionGroup. То есть в их состав входит несколько однотипных объектов, каждый из которых имеет свои собственные свойства и методы. Если курсор мыши расположить на составном объекте и правой кнопкой мыши вызвать на экран контекстное меню, то команда Edit из контекстного меню позволит перевести весь компонент в режим редактирования. При включенном режиме редактирования весь составной компонент заключается в голубую рамку. В режиме редактирования каждым элементом, входящим в составной компонент, можно управлять как самостоятельным компонентом: перемешать внутри голубой рамки, изменять другие свойства. Для выхода из режима редактирования надо щелкнуть мьпнью на поле формы.
После установки составного компонента на форме надо задать количество элементов, входящих в составной компонент с помощью свойства ButtonCount. По умолчанию свойство ButtonCount имеет значение 2.
Все остальные свойства и методы каждого отдельного элемента составного компонента CommandGroup аналогичны свойствам и методам компонента CommandButton.
OptionGroup - радиогруппа
Радиогруппа предназначена для выбора одного из нескольких значений переменной или поля и также является составным компонентом, то есть может содержать произвольное количество кнопок. Задание количества кнопок радиогруппы и описание свойств и методов каждой кнопки производятся аналогично компоненту CommandGroup. Дополнительные свойства:
Style — задает вид переключателя. Свойство может содержать одну из констант:
Standard — стандартный стиль исполнения;
Graphical — графический тип. Отсутствует место фиксации выбора пользователя. При выборе элемента пользователем кнопка «углубляется».
Left, Тор — определяютрасстоянис меаду кнопками соответственно при горизонтальном и вертикальном расположении кнопок. BorderStyle — задает обрамление компонента. Свойство может содержать одну из констант:
None — обрамление отсутствует;
Fixed Single — обрамление одиночной линией.
CheckBox - флажок
Флажок предназначен для фиксации одного из двух возможных состояний. Допускается одновременное включение нескольких флажков. Основные свойства и методы:
Caption — задает название флажка.
FontName и FontSize — задают тип и размер шрифта соответственно.
ForeColor — задает цвет шрифта названия флажка.
BackColor — задает цвет фона названия флажка.
Click — метод описывает реакцию на включение и выключение флажка.
3.2.9. ListBox - список
Список предназначен для отображения на экране элементов списка. Сам список предварительно определяется как массив или структура. Основные свойства:
ColumnCount — определяет количество колонок в списке.
First Element — задает элемент, который будет отображаться первым в списке.
NumberOfElement — задает количество одновременно отображаемых элементов.
RowSource — задает источник данных списка.
RowSourceType — определяет тип источника данных. Свойство может содержать одну из констант:
None — элементы списка определяются программно с использованием методов Addltem и AddListltem.
Value — список задается в виде строки, где значения отделяются друг от друга запятыми.
Alias — источником данных является структура (имена полей) активной таблицы. Количество полей таблицы определяется свойством ColumnCount
SQL Statiment — список содержит значения, которые будут получены в результате выполнения оператора SQL.
Querry — список содержит значения, полученные в результате выполнения запроса SQL.
Array — источником данных является массив значений.
Fields — значения элементов списка берутся из полей таблицы. Предварительно таблица должна бьггь открыта в любой рабочей области с указанием алиаса. В свойстве RowSource указывается алиас и имя поля, при этом таблица может быть пассивной
Files — значениями элементов списка будут имена файлов. В свойстве RowSource можно задать шаблон для имен файлов. Structure — значениями элементов списка будут имена полей таблицы. В свойстве RowSource надо задать имя таблицы. Popup — значениями элементов списка будут пункты контекстного меню.
10.3.2.10. ComboBox - раскрывающийся список
Раскрывающийся список имеет то же назначение, что и ListBox, на экране занимает только одну’ строку. Раскрывающийся список имеет те же свойства и методы, что и список.
Spinner - счетчик
Счетчик предназначен для задания полю числового значения, которое находится в заданном д иапазоне. Основные свойства: SplnnerHightValue — минимальное значение, вводимое из компонента.
SpinncrLowValue — максимальное значение, вводимое из компонента.
KeyboardllightValue — минимальное значение, вводимое с клавиатуры.
KeyboardLowValuc — максимальное значение, вводимое с клавиатуры.
Increment — шаг изменения значения, вводимого из компонента.
Остальные свойства аналогичны рассмотренным выше компонентам.
Line - линия
Компонент Line предназначен для проведения на форме разграничительных линий, с целью отделения одной группы компонентов от другой. Компонент носит декоративный характер. Линия на форме рисуется следующим способом: на панели инструментов выбирают компонент Line. Затем курсор мыши устанавливают в точку начала линии и зажимают левую кнопку' мыши. Курсор мыши буксируют в нужном направлении. В точке окончания линии кнопку мыши отпускают. Затем на вкладке свойств Properties задают свойства нарисованной линии. Основные свойства:
BorderColor — задает цвет линии.
BorderStyle — задает тип линии. Свойство может содержать одну из констант:
Transparent — линия отсутствует, но цвет фона может быть. Solid — тонкая линия. Свойство по умолчанию.
Dash — штриховая линия.
Dot — пунктирная линия.
Dash-Dot — штрих-пунктирная линия.
Dash-Dot-Dot — линия, состоящая из штриха и двух пунктиров.
Border Width — залает толщину линии в пунктах.
DrawMode — определяет отображение линии на экране совместно со свойствами цветов. Свойство может содержать одну из констант:
Manual — ручное управление отображением линии. Automatic — автоматическое управление отображением линии.
Shape - контур
Компонент Shape предназначен для отображения на экране прямоугольника, квадрата, круга или эллипса. Компонент контур имеет декоративный характер. После выбора этого компонента на панели инструментов на листе формы курсором мыши рисуют контур, внутри которого будет размешена одна из фигур. Форму фигуры и другие свойства задают с помощью вкладки свойств Properties. Основные свойства:
BackStyle — определяет, будет ли фигура прозрачной или нет. Если указана константа Transparent, то фигура прозрачная. Если указана константа Opaque, то фигура непрозрачная. Константа Opaque принята по умолчанию.
BorderStyle — задаст рамку вокруг фигуры. Свойство содержит одну из констант. Тины констант такие же, как и у компонента Line. Curvature — задает тин фигуры с помощью числа. Диапазон чисел от 0 до 99.
FillStyle — задает узор внутри объекта. Свойство может принимать одну из констант:
Solid — сплошное заполнение;
Transparent — заполнение отсутствует;
Horizontal Line — горизонтальные линии;
Vertical Line — вертикальные линии;
Upward Diagonal — илриховка по диагонали слева направо; Downward Diagonal — штриховка по диагонали справа налево; Cross — горизонтально-вертикальная штриховка (в «клеточку»);
Diagonal Cross — диагональная штриховка в двух направлениях. FillCoIor — задает цвет узора заполнения.
Image - размещение графического изображения
Компонент Image предназначен для расположения на форме графического изображении. Допускается размещение графического объекта с расширением .bmp. а также экспорт графического объекта с расширением .рсх . Основные свойства:
Picture — предназначено для предварительного просмотра и вставки графического файла. После выделения курсором этого свойства надо в строке свойства дважды щелкнуть левой кнопкой мыши и в диалоговой панели Open указать имя нужного графического файла. Кнопка Preview на диалоговой панели Open прелназначена для предварительного просмотра графического файла. В этом свойстве явно указывается путь к графическому файлу.
General - размещение графического изображения
Компонент General предназначен для размещения на форме графического изображения, хранящегося в поле типа General таблицы. Причем в поле типа General может храниться как само графическое изображение, так и ссылка на файл графического изображения.
Приемы работы с полем General аналогичны приемам работы с полем Memo. После открытия поля типа General на экран выводится пустое окно редактора поля Genera], заголовком которого является имя поля таблицы. Затем из Главного меню надо подать команду Edit -» Insert Object и на экран будет выведена диалоговая панель Insert Object, где с помощью кнопок радио- группы надо определить способ создания встраиваемого объекта: Create New — создание нового объекта. Далее из списка выбирается редактор для создания нового объекта.
Create from File — создание объекта из файла. Если флажок Link включен, то в поле будет помещена ссылка на файл встраиваемого объекта. Если флажок Link выключен, то сам файл копируется в поле типа General. Затем с помощью кнопки Browse на экран выводят диалоговую панель Browse, где задают полный пУть к нужному файлу [2].
Примеры
Пример 1. Нарисовать прямоугольники.
CLEAR
0 2,2 ТО 10,10 DOUBLE COLOR 'R,G'
0 2,30, 10.50 ЗОХ
0 8,40 Say 'Волга'
Пример 2. Создать входную форму с помощью Мастера форм.
Для установления рабочего каталога в окне Command подадим команду SET DEFA ТО E:\PRIMER.
Откроем ранее созданную базу данных. Из главного меню подадим команду File -* Open. В появившейся на экране диалоговой панели выделим курсором имя файла primer.pjx и нажмем кнопку Ок. Создадим новый файл входной формы с помощью команды главного меню: File -> New. В появившейся на экране диалоговой панели New укажем тип файла Form и нажмем кнопку' Wizard.
В появившейся на экране диалоговой панели Wizard Selection выберем команду Form Wizard, то сеть создадим входную форму для одной таблицы. Посте нажатия кнопки Ok на экран выводится первая диалоговая панель Мастера форм.
В раскрывающемся списке Databases/Tables выберем имя таблицы Author с помощью кнопки, расположенной справа от раскрывающегося списка. При этом в списке «Available Fields» будут представлены имена полей, принадлежащих таблице Author. Для того чтобы перенести все поля во входную форму, надо нажать кнопку-стрелку. После этого имена всех полей будут помещены в список Selected Fields.
Для перехода ко второй диалоговой панели Мастера форм надо нажать кнопку Next. Здесь в списке Style определяется один из допустимых стилей оформления входной формы. Выберем стиль Shadowed. В радиогруппе Button Туре определим внешний вид кнопок управления: Picture Buttons — кнопки с рисунком.
На третьей диалоговой панели определим поле (или поля), по значениям которого надо отсортировать данные при их выводе на экран. Выделим курсором поле Key fam и нажмем кнопку Add. Укажем направление сортировки по возрастанию (кнопка Ascending).
В четвертой диалоговой панели в специальном окне присвоим имя созданному файлу входной формы — Author и нажмем
■АШОЯ
ИЛЕ|
author
Кто-»
г~
-fcricN
1
‘
Сгкмшгн*
1
Клх
сгсчести*
Яг.*уГ«|^
:
|Аснод|-геол«<:
B'VT
.-Гчяое
Латорсл>сН(М
|
ГГ
:
Цпоиужы
т-
:
Пгглйеьйякджс
[
<
\ <
ни
«
&'\
Ж
j
&
|
а
1
Рис.
10.1.
Результат выполнения примера 2.
кнопку Finish. После сохранения файла входной формы на диске откроем его с помощью команды Open главного меню и поставим на выполнение одним из способов. В результате будет создана входная форма следующего вида (рис. 10.1).
Входная форма снабжена кнопками:
перехода на первую запись;
перехода на предыдущую запись;
перехода на следующую запись;
перехода на последнюю запись;
поиска записи;
печати;
добавления записи;
редактирования записи;
удаления записи;
выхода из формы.
Пример 3. Создание входной формы с помощью Конструктора форм.
Для установления рабочего каталога в окне Command подадим команду SET DEFA ТО E:\PRIMER.
Откроем ранее созданную базу данных. Из главного меню подадим команду File -> Open. В появившейся на экране диалоговой панели выделим курсором имя файла primer.pjx и нажмем кнопку Ок. Создадим новый файл входной формы с помощью команды главною меню File -* New. В появившейся на экране диалоговой панели New укажем тип файла Form и нажмем кнопку New File.
Определим таблицы, данные из которых будут помешены во входную форму. Для этого из главного меню надо подать команду View -> Data Environment
H0F
О
си
idds
keyjam name Jam
QDndexes.
name
fam
< SFieldj: £
key_cust keyjown • key_sbeet gj index
|
ot |
щ |
OFiekte |
|
key_ot |
|
I name_ot |
Щ |
CEtndexes: |
• «: |
ot |
|
пяте |
Shields'
key_m
namejm
GSlndexes
ForniDesgnef
Properties
Code.
UJr,
.у.,,- .-,-;. .
W. *W'.
Рис. 10.2. Определение таблиц, данные из которых помещаются во входную форму.
:Л Фвыялкя |
lat*i2 |
|
С Имя |
Индш |
|
Т Отчество |
Город |
|
Г Город |
Улица |
|
Т Упица |
Адрес |
|
Отвкт ' |
ТепеФои |
|
|
Фзк |
|
ТейЗ |
|
|
ТехМ |
||
Тей5 |
|
|
Te*t6 |
||
Тех17 |
I |
|
Tertfl |
|
LabellJ
TexJI
2
\ "Пе^ая (: Стдгоцгя { : Предыдущая [ Посг.идняз [ Выход [
Рис. 10.3. Размещение элементов управления на форме.
В первый момент рабочее поле диалоговой панели Data Environment пусто. Курсор мыши помешают на рабочее поле и Щелчком правой кнопки мыши вызывают на экран контекстное меню, из которого выбирают команду Add.
В появившейся на экране диалоговой панели Add Table or View курсором выделяют имя нужной таблицы и нажимают копку Ок. В результате выбранная таблица помещается в рабочее поле диалоговой панели Data Environment. Эту операцию повторяют несколько раз. Поместим в рабочее поле таблицы Customer, Earn, Im, Ot, Town и Street. Если ранее взаимосвязи между таблицами не были установлены, то их надо установить сейчас.
Закроем диалоговое окно Data Environment.
Разместим на форме элементы управления в соответствии с Рис. 10.3.
Радиогруппа Optiongroupl (управление таблицами)
а. Кнопка «Фамилия
CLOSE INDEX SELECT Fam
SET INDEX TO Fam.cdx ORDER TAG Name Ogl = 1
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
ThisForm.Gridl.Columnl.Visible = .F. ThisForm.Gridl.Column2.Visible = .F. ThisForm.Gridl.Column3.Visible = .F. ThisForm.Gridl.Column4.Visible = .F. ThisForm.Gridl.Columns.Visible = .T. ThisForm.Gridl.Column6.Visible = .F. ThisForm.Gridl.Column7.Visible = .F. ThisForm.Gridl.Column8.Visible = .F. ThisForm.Gridl.Column9.Visible = .F. ThisForm.Label1.Visible = .T.
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
ThisForm.Labell.Caption = 'Ключ'
ThisForm.Label2.Caption = 'Фамилия'
б. Кнопка «Имя*
CLOSE INDEX SELECT Im
SET INDEX TO Im.cdx ORDER TAG Naire Ogl = 2
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
в. Кнопка «Отчество»
CLOSE INDEX SELECT Ot
SET INDEX TO Ot.cdx ORDER TAG Name Ogl = 3
ThisForm.Gridl.Columnl.Visible = .F. ThisForm.Gridl.Column2.Visible = .F. ThisForm.Gridl.Column3.Visible = .F. ThisForm.Gridl.Column4.Visible = .F. ThisForm.Gridl.Column5.Visible = .F. ThisForm.Gridl.Column6.Visible = .F. ThisForm.Gridl.Column?.Visible = .T. ThisForm.Gridl.Column8.Visible = .F. ThisForm.Gridl.Column9.Visible = .F.
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
г. Кнопка «Город -
SELECT Town Ogl = 4
ThisForm.Gridl.Colunnl.Visible = .F. ThisForm.Gridl.Column2-Visible = .F. ThisForm.Gridl.Column3.Visible = .F. ThisForm.Gridl.Columr.4. Visible = ThisForm.Gridl.Columns.Visible = .F. ThisForm.Gridl.Column6.Visible = .F. ThisForm.Gridl.Column7.Visible = .F. ThisForm.Gridl.Column8.Visible = .T. ThisForm.Gridl.Column9.Visible * .F.
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
ThisForm.Labell.Caption = 'Клоч'
ThisForm.Label2.Caption = 'Город'
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
_screen.ActiveForm.Refresh()
д. Кнопка «Улица*
SELECT Street Ogl = 5
ThisForm.Gridl-Columnl.Visible = .F. ThisForm.Gridl.Column2.Visible = .F. ThisForm.Gridl.Column3.Visible = .F. ThisForm.Gridl.Column4.Visible = .F. ThisForm.Gridl .Со1шт5 .Visible = .F. ThisForm.Gridl.Column6.Visible = .F. ThisForm.Gridl.Column7.Visible = .F. ThisForm.Gridl.Column8.Visible = .F. ThisForm..Gridl .Column9 .Visible = -T. ThisForm.Labell.Visible = .T.
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
_screen.ActiveForm.Refresh()
Кнопка «Клиент»
SELECT Customer Ogl = 6
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
ThisForm.Gridl.Columnl. Visible = .T.
ThisForm.Gridl.Column2.Visible = .T. ThisForm.Gridl.Column3.Visible = .T.
ThisForm.Gridl.Column4.Visible = .T.
ThisForm.Gridl.Columns.Visible = .T.
ThisForm.Gridl.Column6.Visible = .T. ThisForm.Gridl.Column7.Visible = .T. ThisForm.Gridl.Columns-Visible = .T. ThisForm.Gridl.Column9.Visible = .T. ThisForm. Label l.i'isible = .T.
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
ThisForm.Labe11.Caption = 'Ключ'
ThisForm.Label2.Caption = 'Фирма'
_screen.Act iveForm.Refresh()
Обработчик нажатия кнопки «Первая»
Переход на первую запись IF !BOF()
GO TOP
DO CASE Case Ogl =1
ThisForm.Text1.Value = Fam.Key_fam
ThisForm.Text2.Value = Fam.Kame_fam
SET MESSAGE TO 'Нажата кнопка с номером 1' Case Ogl = 2
ThisForm.Textl.Value = Im.Xey_im
ThisForm.Text2.Value = Im.Name_im
SET MESSAGE TO 'Нажата кнопка с номером 2' Case Ogl = 3
ThisForm.Texcl.Value = 0~.Xey_ot
ThisForm.Texc2.Value - Ot.Name_ot
SET MESSAGE TO 'Нажата кнопка с номером 3' OTHERWISE
SET MESSAGE TO 'Нажата кнопка с номером 'более 3'
ENDCASE
ENDIF
..screen. Act iveForm. Refresh ()
Обработчик нажатия кнопки «Следующая*
Переход к следующей записи I? 1E0F()
SKIP
DO CASE Case Ogl =1
ThisForm.Textl.Value = Fam.Key_fam ThisForm.Text2.Value = Fam.Name_fam SET MESSAGE TO 'Нажата кнопка с номером 1'
Case Ogl = 2
ThisForm.Text1.Value = Im.Key_im
ThisForm.Text2-Value = Im.Name_im
SET MESSAGE TO 'Нажата кнопка с номером 2'
■ Case Ogl = 3
ThisForm.Text1.Value = Ot.Key_ot
ThisForm.Text2.Value = Ot.Name_ot
SET MESSAGE TO 'Нажата кнопка с номером 3' OTHERWISE
SET MESSAGE TO 'Нажата кнопка с номером '+; 'более 3'
ENDCASE
ENDIF
_screen.Act iveForm.Re fresh()
Обработчик нажатия кнопки «Предыдущая*
* Переход к предыдудей записи IF !B0F()
SKIP - 1 DO CASE Case Ogl =1
ThisForm.Text1.Value = Fam.Key_£am
ThisForm.Text2.Value = Fam Name_fam
SET MESSAGE TO 'Нажата кнопка с номером 1' Case Ogl = 2
ThisForm.Textl.Value = Im.Key_im
ThisForm.Text2.Value = Im.Name_im
SET MESSAGE TO 'Нажата кнопка с номером 2' Case Ogl = 3
ThisForm.Textl.Value = Ot.Key_ot
ThisForm.Text2.Value = Ot.Name.ot
SET MESSAGE TO 'Нажата кнопка с номером 3'
OTHERWISE
SET MESSAGE ТО 'Нажата кнопка с номером '+; 'более 3'
ENDCASE
ENDIF
screen.ActiveForm.Refresh()
Обработчик нажатия кнопки «Последняя>
* Переход к последней записи
IF LB0FO GOTO BOTTOM DO CASE Case Ogl =1
ThisForm.Textl.Value = Fam.Key_fam
ThisForm.Text2. Value -*= Fair..hame_fam SET MESSAGE TO 'Нажата кнопка с номером 1' Case Ogl = 2
Thi sForm.Text1.Value = Im.Key_im
ThisForm.Text2.Value = Im.Name_im
SET MESSAGE TO 'Нажата кнопка с номером 2' Case Ogl = 3
ThisForm.Textl.Value = Ot.Key_ot
ThisForm.Text2.Value = Ot.Name_ot
SET MESSAGE TO 'Нажата кнопка с номером 3' OTHERWISE
SET MESSAGE TO 'Нажата кнопка с номером '+; 'более 3'
ENDCASE
ENDIF
—screen.Act iveForm.Refresh()
Обработчик нажатия кнопки «Поиск*
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
ThisForm.Labell2.Caption = 'Условие поиска'
DO CASE Case Ogl =1
nn = ThisForm.Text12.Value
LOCATE FOR Fam.Name_fam = ALLTRIM(nn)
IF FOUND() THEN
ThisForm.Textl.Value = Fam.Key_fam ThisForm.Text2.Value = Fam.Name_£am ELSE
If messagebox('Фамилия не найдена',;
6 + 32 + 256, 'Выход') = б THEN
ENDIF
ENDIF
SET MESSAGE TO 'Нажата кнопка с номером 1' Case Ogl = 2
nn = ThisForm.Textl2.Value
LOCATE FOR Im.Name_im = ALLTRIM(nn)
IF FOUND0 THEN
ThisForm.Textl.Value = Im.Key_im
ThisForm.Text2.Value = Im.Name_im
ELSE
If messagebox{'Имя не найдено',;
6 + 32 + 256, 'Выход') = 6 THEN
ENDIF
ENDIF
SET MESSAGE TO 'Нажата кнопка с номером 2'
Case Ogl =3
nn = ThisForm.Text12.Value
LOCATE FOR Ot.Name_ot = ALLTRIM(nn)
IF FOUND{) THEN
ThisForm.Textl.Value = Ot.Key_ot ThisForm.Text2.Value = Ot.Name_ot ELSE
IF MESSAGEBOX('Отчестве не найдено*. ; 6+32+256. 'Выход') = 6 THEN ENDIF ENDIF
SET MESSAGE TO 'Нажата кнопка с номером 3' OTHERWISE
SET MESSAGE TO 'Нажата кнопка с номером 'более 3'
ENDCASE
Обработчик нажатия кнопки «Фильтр»
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
ThisForm.Labell2.Caption = 'Условие фильтра'
CLEAR DO CASE Case Ogl =1 1=0
nn = ThisForm.Textl2.Value 1 = LEN(ALLTRIM(nn))
k = RAT(';', ALLTRIM(nn))
ml = SUBSTR(nn, 1, 1-2)
m2 = SUBSTR(nn, 1)
IF 1 >0 THEN
ACTIVATE WINDOW Filer SHOW WINDOW Filtr BROWSE IN WINDOW Filtr;
FOR Name_fam > ml .AND. Name_fam < m2; FIELDS Key_fam :H = «Ключ», Name_fam :h =«Имя»; FONT «Times New Roman», 12 STYLE «В1»
ENDIF
ThisForm.Textl2.Value = '' && пустая строка SET MESSAGE TO 'Нажата кнопка с номером 1'
Case Ogl = 2 1=0
nn = ThisForm.Text12.Value 1 = LEN(ALLTRIM(nn))
k = RAT(*;', ALLTRIM(nn)) ml = SUBSTR(nn, 1, 1-2) m2 = SUBSTR(nn, 1)
IF 1 >0 THEN ACTIVATE WINDOW Filtr SHOW WINDOW Filtr
BROWSE IN WINDOW Filtr FOR Name_im > ml .AND.; Name_im < m2;
FIELDS Key_im :H = 'Ключ', Name_im :h =‘Имя'; FONT 'Times New Roman', 12 STYLE 'BI'
ENDIF
ThisForm.Text12.Value = " && пустая строка
SET MESSAGE TO 'Нажата кнопка с номером 2'
Case Ogl = 3 1=0
nn = ThisForm.Textl2.Value 1 = LEN(ALLTRIM(nn))
k = RAT(';', ALLTRIM(nn))
ml = SUBSTR(nn, 1, 1-2)
m2 = SUBSTR(nn, 1)
IF 1 >0 THEM ACTIVATE WINDOW Filtr SHOW WINDOW Filtr
BROWSE IN WINDCW Filtr FOR Name_ot > ir.l .AND.; Name_ot < m2;
FIELDS Key_ot :H = 'Ключ', Name_ot ;h ='Имя'; FONT 'Times New Roman', 12 STYLE 'BI'
ENDIF
ThisForm.Textl2.Value = " && пустая строка
SET MESSAGE TO 'Нажата кнопка с номером 3' OTHERWISE
SET MESSAGE TO 'Нажата кнопка с номером ' + ; 'более 3'
ENDCASE
Обработчик нажатия кнопки «Добавить*
DO CASE
Case Ogl = 1
nn = ThisForm.Text2.Value
LOCATE FOR Fam.Name_£am = ALLTRIM (nn)
IF FOUND() THEN
IF MESSAGEBOX('Дубликат фамилии ' + nn,;
6 + 32 + 256,'Выход') = 6 THEN ENDIF ELSE
SET ORDER TO TAG Fam OF Fam.cdx GOTO BOTTOM n = Fam.Key_£am + 1
APPEND BLANK
REPLACE Fam.Key_fam WITH n,;
Fam.Name_fam WITH ThisForm.Text2.Value ENDIF
Case Ogl = 2
nn = ThisForm.Text2.Value
LOCATE FOR Im.Name_im = ALLTRIM(nn)
IF FOUND() THEN IF MESSAGEBOX('Дубликат имени ' + nn, ;
6 + 32 + 256,'Выход') = 6 THEN ENDIF ELSE
SET ORDER TO TAG Im OF Im.cdx GOTO BOTTOM n = Im.Key_im + 1
APPEND BLANK
REPLACE Im.Key_im KITH n, Im.Name_im; WITH ThisForm.Text2.Value
ENDIF Case Ogl = 3
nn = ThisForm.Text2.Value
LOCATE FOR Ot.Nair.e_ot = ALLTRIM (nn)
IF FOUND() THEN IF MESSAGEBOX('Дубликат отчества ' + nn,; 6 + 32 + 256.«Выход») = 6 THEN
ENDIF
ELSE
SET ORDER TO TAG Ot OF Ot.cdx GOTO BOTTOM n = Ot.Key_ot + 1
APPEND BLANK
REPLACE Ot.Key_ot WITH n, Ot.Name_ot; WITH ThisForm.Text2.Value
ENDIF
ENDCASE
Обработчик нажатия кнопки «Выход*
* выход из формы с подтверждением
1? MESSAGEBOX('Выдти из формы?',4-32-256,'Зыход'} = б _screen.Act iveForm.Release()
ELSE
_screen.Act iveFom. Refresh ()
ENJIF
Поиск настроен на неточное совпадение, то сеть вводятся несколько первых символов искомого значения. На экран выводится первое найденное значение. Так как поиск производится по индексному полю, то значения содержащие первые одинаковые символы размещаются друг за другом (рис. 10.4).
При фильтрации в условии фильтра сначала указывается нижняя граница (строго меньше), затем разделитель (символ «> — точка с запятой) и далее верхняя граница (строго меньше). Пробе-
Условие
пенсия
I *
[top
Добавить
|
Пои
с г
iV
iT
I 1 п.
J
Смпьтр
ы
Первая
j
Следующая
[ Предыдущая
|
Последняя } Выход Рис.
10.4. Поиск в таблице «Фамилия».
|
||
|
£л»«| Имл |
|
II |
Щу Валентина |
|
|
4 Валерий |
|
|
t Виктор |
|
■ |
И Владимир |
—. |
ИМЯ
rU.tnilfl
£ ИМЯ
;
Г
/'Гсздд
~
Уякцз
Г
Клиент
i
Поиск
Фильтр
Персая | Слгдющэя | Пргдыдацая | f П« -адндя | 8ыюд' | Рис. 10.5. Фильтрация таблицы «Имя».
лы внутри условия фильтра запрещены. Результат фильтрации приведен на рис. 10.5.
При добавлении значений в родительскую таблицу («Фамилия», «Имя» и «Отчество») поле ключа не заполняется. Уникальное значение первичного ключа присваивается автоматически.
Контрольные вопросы
Для каких целей используют элементы управления?
Что такое класс?
Что такое объект?
Назовите ключевые слова для доступа к объектам.
Что из себя представляет экранная форма и для каких целей она используется?
Назовите два способа создания экранной формы.
Укажите назначение и основные принципы работы с Мастером форм.
Укажите назначение и основные принципы работы с Конструктором форм.
Укажите назначение режима проектирования в Конструкторе форм.
Как установить режим проектирования в Конструкторе форм?
Укажите назначение рабочего режима в Конструкторе форм.
Как перейти в рабочий режим в Конструкторе форм?
Укажите назначение панели инструментов Form Controls в Конструкторе форм.
Укажите назначение панели инструментов Fomi Designer и Конструкторе форм.
Укажите назначение панели инструментов Layout в Конструкторе форм
Укажите назначение панели инструментов Color Palette в Конструкторе форм.
Какие действия надо выполнить для размещения компонента на форме?
Как сделать компонент активным (пассивным)?
Укажите назначение окна Properties. Для какого компонента предназначено окно Properties?
Объясните назначение вкладок окна Properties: All. Data, Methods, Layout и Other.
Назовите два способа задания свойств и методов компонента.
Как удалить компонент с формы?
Как установить на форме вспомогательную сетку?
Что такое фокус управления?
Как изменить порядок обхода элементов управления (компонент)?
Укажите основные свойства и методы компонента «Форма».
Укажите основные свойства и методы компонента «Label».
Укажите основные свойства и методы компонента «TextBox*.
Укажите основные свойства и методы компонента «EditBox*.
38 Укажите основные свойства и методы компонента
«Command Button».
Укажите основные свойства и методы компонента
«CommandG roup*.
* Укажите основные свойства и методы компонента «Option Group».
. Укажите основные свойства и методы компонента «CheckBox».
и»
Ui и*
и* ы и> ы
«
90 9\ 'Л ^ Ы
. Укажите основные свойства и методы компонента «ComboВох». . Укажите основные свойства и методы компонента «Spinner».
. Укажите основные свойства и методы компонента «Line*.
. Укажите основные свойства и метопы компонента «Shape».
. Укажите основные свойства и методы компонента «Image».
40. Укажите основные свойства и методы компонента «General*.
Глава 11
ОСНОВЫ ЯЗЫКА ЗАПРОСОВ SQL
Структурированный язык запросов SQL является универсальным средством управления базами данных. Этот язык предусмотрен практически во всех системах управления базами данных. С помощью языка SQL можно как создавать новые объекты, так и управлять существующими объектами. Рассмотрим основные команды языка SQL.
СОЗДАНИЕ ТАБЛИЧНОГО ФАЙЛА
CREATE TABLE | DBF <имятаблицы>
( NAME <длинное имя таблицы> 1 FREE J
(<имя поля 1> <тнп поля 1> [<шириня поля 1> [, <т©чность> ] 1) (NULL | NOT NULL]
I CHECK <выр.1> [ ERROR «сообщение> ] ]
[ DEFAULT <выр.> ]
(PRIMARY KEY [<выр.> TAG <имятега>] |
UNIQLE [<выр.> TAG <нмятега>]]
( FOREIGN KEY <выр>ТАС <имятега>
[REFERENCES <нмя таблнды> I TAG <нмя тега 1> ] ] t NOCPTRANS ]
1(<имяполя2> ...)]
I FROM ARRAY <нмямассива>
Команда создает таблицу либо описанием всех полей, либо на основе массива. Таблица создается и открывается в исключительном режиме в самой младшей доступной рабочей обла- задании меню таблицы опции TABLE и DBF идеи-
NAME <длинное имя табляцы> — задаст длинное имя таблицы до 128 символов. Длинное имя используется для таблиц, которые являются частью базы данных
TREE — опция указывает на то что создаваемая таблица не является частью открытой в данный момент базы данных. Если при создании таблицы ист открытых баз данных, то опцию указывать не обязательно.
(<имя поля 1> <тип поля 1> [<ширина поля 1> [, <точность> ] ]) —
параметры, которые используются для описания каждого поля. Первые два параметра обязательны для полей .любых типов.1 <ширина поля > используется для символьных и числовых полей. <точность> используется для числовых полей с плавающей точкой или двойной точности. Тип поля может быть задан одним символом
С —символьный D —тип даты Т —тип дата- N —числовой
время
Y — денежный L — логический М — тип Memo G — обшее поле
F — с плавающей В — поля двойной Р — поля рисунков
точкой точности
NULL | NOT NULL — разрешает или запрещает пустое (нулевое) значение поля.
CHECK <выр.1> — задает условие достоверности вводимого значения поля. В опции ERROR можно зачать собственное сообщение об ошибке.
DEFAULT <выр.> — задает значение поля по умолчанию. PRIMARY KEY [ <выр.> TAG <имя тега> ] — создает первичный ключ. Первичный ключ создастся по полю, которое указано перед этой опцией. Если добавлено <выр.>, то первичный ключ создается в соответствии с указанным выражением. Если добавлено TAG <имя тсга>, то первичный ключ создается на основе указанного индекса. Каждая таблица может иметь только один первичный ключ.
UNIQUE [<выр.> TAG <имя тега> ] — создает альтернативный ключ. Правила создания альтернативного ключа анало! ичнЫ правилам создания первичного ключа.
FOREIGN KEY <выр.> TAG <имя тега> — создаст внешний ключ для связи с родительской таблицей.
REFERENCES <имя таблицы> [ TAG <имя тега 1> ] — задает имя родительской таблицы, а при необходимости и имя индекса в родительской таблице. Если опция TAG опущена, то связь устанавливается с первичным ключом родительской таблицы. NOCPTRANS — запрещает использование символьных полей и полей типа Memo в различных кодовых страницах.
Указанные опции могут быть повторены для любот поля таблицы.
FROM ARRAY <нмя массива> — позволяет создать таблицу на основе массива, а не описывать каждое поле.
11.2. ДОБАВЛЕНИЕ ЗАПИСЕЙ В ТАБЛИЦУ
В конец таблицы можно добавить записи либо с клавиатуры, либо из массива, либо из переменных памяти.
а. Добавление записей с клавиатуры.
INSERT INTO <имятаблнцы>
[ ([<нчя пазя 1> [, <нмя паля 2> ... ]) )
VALUES (<выр.1> [, <выр.2> [, ... ]))
При этом порядок указания имен полей произвольный, но в опции VALUES тип каждого значения должен соответствовать типу поля. Имена полей указаны в круглых скобках после имени таблицы.
Если при добавлении новой записи в таблицу значения заносятся во все поля и значения располагаются строго по порядку описания полей, то в формате команды допускается не указывать имена полей:
INSERT INTO <имя таблнкы>
values (<выр.1> [, <выр.2> [, ... ] ])
б. Добавление записей из массива.
INSERT INTO <имятаблнцы> FROM ARRAY <нмямассива>
«• Добавление записей из переменных памяти.
INSERT into <имятаблицы> FROM MEMVAR
В любом из трех случаев программист должен следить за со- °тветствием типов вводимых данных типам полей таблицы.
РЕДАКТИРОВАНИЕ ЗАПИСЕЙ ТАБЛИЦЫ
Любую запись (или группу записей) в таблице можно отредактировать. Для этого предназначена команда:
UPDATE <нчя таблицы> ;
SET <имя поля 1> = <значение 1> [, <ммя поля 2> ™
<значенис 2> ... ] ;
WHERE <нмя поля ионска> = <)словие нонска>
Если опция WHERE опущена, то замена значения будет произведена во всем столбце.
ВЫБОР ДАННЫХ ИЗ ТАБЛИЦЫ
Команда SELECT позволяет производить выборку данных как из одной таблицы, так и из нескольких взаимосвязанных таблиц, и помещать результат выборки либо в новую таблицу, либо в другой приемник данных. Отобранные данные могут быть сгруппированы и отсортированы.
SELECT [ALL | DISTINCT) [<псендоиим 1>] Спуикгвыбора>[, <пеевдоннм>,) <пункт выбора> ... )
FROM <имя таплипы> [<псевдоним 2> J [, <имя таблнцы> [<псевлояим 3>] ... ]
[[ INTO ARRAY <ичя массика> | INTO CURSOR <имя> |
INTO TABLE | DBF <имя тайлицы>
| [ТО FILE <нмяфайла> [ADDITIVE] | ТО PRINTER]]
(NOCONSOLE]
[ PLAIN ]
[NOWAIT]
[WHERE <условнесоединення> [AND <условиесоединсния> ...] [ AND | OR <условие фильтра> [ AND | OR <условне фильтра>... [ [ GROUP BY <колонка гругшы> [, <каюнка группы> ... ] ]
[ HAVING <условие фильтра> ]
[UNION [ALL] <комаиаа SELECI>]
[ ORDER BY <пункт порядка> [ ASC | DESC ]
[, <пункт порядка> [ ASC | DESC ] ... ] ]
Назначение опций:
ALL — отображает все поля одной иди нескольких таблиц. Опция но умолчанию.
DISTINCT — содержит имена полей, которые надо выбрать. Имена полей могут быть составными с указанием псевдонима рабочей области, в которой находится таблица, содержащая нужное поле. Составные имена используются, если данные выбираются из нескольких таблиц.
FROM — перечисляются имена таблиц или псевдонимы рабочих областей, из которых выбираются поля.
IMO ARRAY — результат выборки направляется в масеив. ГМО CURSOR — результат выборки направляется во временную таблицу.
INTO TABLE | DBF — результат выборки направляется в постоянную таблицу.
ТО FILE результат выборки направляется в текстовый файл. Если добавлена опция ADDITIVE, то выбранные данные добавляются в конец существующего файла.
ТО PRINTER — результат выборки направляется на принтер.
Ест опции INTO и ТО отсутствуют, то результат выборки направляется на экран.
NOCONSOLE — запрет вывода на экран.
PLAIN — запрет вывода заголовков колонок.
NOWAIT — устраняет паузу при заполнении экрана. Результат выборки будет выводиться непрерывно до конца выборки.
WHERE — задает условия поиска данных в нескольких таблицах. Каждое <условие соединения> сравнивает поле одной таблицы с полем другой таблицы. Каждое <условие фильтра> сравнивает два поля или одно поле с переменной или константой. GROUP BY — позволяет группировать записи в порядке возрастания значений одного или нескольких полей.
HAVING — включает в запрос столько групп, сколько задано условий.
ORDER BY — позволяет сортировать результат выборки (запроса) по возрастанию (ASC) или по убыванию (DESC) одного или нескольких полей.
VNlON — позволяет комбинировать результат текущего запро- Са (выборки) с результатами другого запроса SELECT. Если не Указана опция ALL, то повторяющиеся записи исключаются.
Для задания экранного имени столбца (поля) допускается nq пользование опции AS после имени поля.
Примеры
Пример 1. Вывести в окно Query значения трех полей всех за писсй таблицы Catalog.
CLOSE ALL
SET DEFAULT TO E:\Prim_bd
USE Catalog IN 2 INDEX Catalog ALIAS Cat;
ORDER TAG Name SET TALK OFF CLEAR SSLE Cat
SELECT Name_book, Year, Price FROM Catalog
Пример 2. Вывести в окно Query значения полей из разнь таблиц.
CLOSE ALL
SET DEFAULT TO E:\Prim_bd USE Catalog IN 2 ALIAS Cat
USE Fam IN 5 ALIAS Fam
USE Im IN 7 ALIAS Im
USE Ot IN 10 ALIAS Ot
SET TALK OFF CLEAR SSLE Cat
SELECT F.Name_fam, I.Name_im, O.Name_ot, C.Name_book, C.Year. C.Price;
FROM Catalog C, Fam F, Im I, Ot O;
WHERE C.Key_fam=F.Key_fam AND;
C.Key_im=I. Key_im AND C.Key_ot=O.Key_ot
Результат работы примера приведен на рис. 11.1.
SET DEFAULT ТО E:\Prirr._bd
USE |
Catalog |
IN 2 |
ALIAS |
Cat |
USE |
Fam |
IN 5 |
ALIAS |
Fam |
USE |
Im |
IN 7 |
ALIAS |
In |
USE |
Ot |
IN 10 |
ALIAS |
Ot |
SET |
TALK |
OFF |
|
|
Пример
3. Вывести в окно Query
значения
полей из разных таблиц. Экранные имена
столбцов задать буквами русского
алфавита.
Рис.
11.1.
Результат
работы примера 2
L
Погром
Сергеевич
MsBjaMaoe
'уикич
_//у*снлр vuik
ч Алис»-да
Сергеевич
Александр
Атексчндр
М
нсей Николай
Никоя й
Сергеевич
Сергеевич
Смчукгтоеич О с ват Вас вам
Проза
Талаащант
аиара. сегодня завтра Венера на хуторе
ВпюДикачаки Повести
Гегеле
Гвгоя
Васильевич
Гс-шч
Галактион
зам
Короленко
лксавоа
Влиеыир
Сергей
Тииофаеам
Повести
и рассказы
Из6^аа«ноа
Григорьева
Рис. 11.2. Результат работы примера 3.
Результат работы примера см на рис. 11.2.
Пример 4. Вывести в окно Query значения полей из разных таблиц. Экранные имена столбцов задать буквами русского алфавита. Выполнить сортировку данных по возрастанию по значениям столбца «Фамилия», а при одинаковых фамилия — по значениям столбца «Год».
CLOSE ALL
SET DEFAULT TO E:\Prim_bd USE Catalog IN 2 ALIAS Cat
USE Fam IN 5 ALIAS Fan
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
C.Name_book AS 'Название_книги';
С.Year AS 'Год',; С.Price AS 'Цена';
FROM Catalog C, Fam F, Im I, Ot O;
WHERE С.Key_fam=F.Key_fam AND С.Key_im=I.Key_im AND С.Key_ot =0.Key_o t;
ORDER BY F.Name_fam, C.Year
Пример 5. Выполнить задание по условиям примера 4, но результат выборки направить во вновь создаваемую таблицу Catal jrom.
CLOSE ALL
SET DEFAULT TO E:\Prim_bd •jSS Catalog IN 2 ALIAS Cat
USE Fam IN 5 ALIAS Fan
USE Im IN 7 ALIAS Im
USE Ot IN 10 ALIAS Ot
SEC TALK OFF CLEAR SELE Cat
SELECT F.Name_£am AS 'Оамклкя', I.Name_im AS 'Имя'; O.Name_ot AS 'Отчество',
С.Name_book AS 'Название_книги';
С.Year AS 'Год',; С.Price AS 'Цена';
FROM Catalog C, Fam F, Im I, Ot O;
WHERE С.Key_fam=F.Key_£am AND; C.Key_im=I.Key_im AND;
С.Key_ot =0.Key_ot;
ORDER BY F.Kame_fam, C.Year;
INTO TABLE Cata L_prom.dbf BROWSE
Пример 6. Из таблицы фамилий Fam сделать выборку и вывести па экран все фамилии, которые начинаются с буквы «С».
CLOSE ALL
SET DEFAULT TO E:\Pri.T._bd USE Catalog IN 2 ALIAS Cat
USE Fam IN 5 ALIAS Fam
USE Im IN 7 ALIAS Im
USE Ot IN 10 ALIAS Ot
SET TALK OFF CLEAR SELE Cat
SELECT * FROM Fam F WHERE F.Name_fam LIKE «С%»
Рис. 11.3. Выборка фамилий, которые начинаются с одной буквы.
Name
fam
Сергее»
5.Смменон
6-Самсонов
31
{Северянин
Пример 7. Из таблицы фамилий Fam сделать выборку и вывести на экран все фамилии, которые начинаются с буквы ♦ К* и состоят из трех букв.
CLOSE ALL
S3T DEFAULT ТО E:\Prim_bd USE Catalog IN 2 ALIAS Cat
USE Fam IN 5 ALIAS Fam
JSE Im IN 7 ALIAS Im
USE Ot IN 10 ALIAS Ot
SET TALK OFF CLSA?.
SSLE Cat
SELECT * FROM Fam F WHERE F.Name_fam LIKE «К »
Пример 8. Из таблицы фамилий Fam сделать выборку и вывести на экран все фамилии прописными (большими) буквами.
CLOSE ALL
SET DEFAULT TO E:\Prin\_bd USE Fam IN 5 ALIAS Fam CLEAR
SELECT UPPER(Name_fam) AS 'Список_фамилий' FROM Fa^l
Пример 9- Из таблицы Catalog сделать выборку и вывести на экран наименований книг одного автора (под номером 21 — фамилия Гоголь).
CLOSE ALL
SET DEFAULT TO E:\Prim_bd USE Catalog IN 2 ALIAS Cat
USE Fam IN 5 ALIAS Fam
USE Im IN 7 ALIAS Im
USE Ot IN 10 ALIAS Ot
SET TALK OFF CLEAR SELE Cat
SELECT Kamejoook FROM Catalog С WHERE ;
EXISTS (SELECT * FROM Fam F;
WHERE F.Key_fam = C.Xey_fam AND F.Key_farr = 21) Результат работы программы представлен на рис. 11.4.
Пример 10. Добавление новой записи в таблицу Fam. CLOSE ALL
USE
Fam USE Im USE Ot SET TALK CLEAR SELE Fam
INSERT
INTO Fam (Key_fam, Kame_fam) VALUES(100,
SELECT
Fam
BROWSE
Сологуб')
Допускается использование краткого формата команды.
CLOSE ALL
SET DEFAULT TO E:\Prim_bd USE Catalog IN 2 ALIAS Cat
USE Fan IN 5 ALIAS Fam
USE Im IN 7 ALIAS Im
USE Ot IN 1C ALIAS Ot
SET TALK OFF CLEAR SELE Fam
Insert into Fam values(101, 'Байрон')
SELECT Fam BROWSE
Результат добавления новых записей представлен на рис. 11.5.
Пример 11. В таблице «Fam» заменить фамилию «Гуца- люк» на фамилию «Проскурин*.
CLOSE ALL
SET DEFAULT TO E:\Prim_bd
USE Catalog IN 2 ALIAS Cat
USE Fam IN 5 ALIAS Fam ORDER TAG Name
USE Im IN 7 ALIAS Im
USE Ot IN 10 ALIAS Ot
SET TALK OFF
CLEAR
SSLE Fam
UPDATE Fam SET Name_fam = 'Проскурин';
WHERE Name_fam = ' Гуцалэок'
BROWSE
Если опции WHERE опущена, то замена значения будет произведена во всем столбце.
Контрольные вопросы
L Укажите область применения языка запросов SQL.
Какие операции надданными можно выполнитьс помощью команд языка запросов SQL?
Укажите два варианта создания табличного файла с помощью команды CREATE TABLE.
Как задать контроль правильности вводимых значений в поле с помощью команды CREATE TABLE?
Как задать значение по умолчанию для поля с помощью команды CREATE TABLE?
Как задать первичный и внешний ключи с помощью команды CRATE TABLE?
Как задать условия ссылочной целостности с помощью команды CREATE TABLE?
9- Укажите команду для добавления записей в табличный файл.
5- Напишите команду SELECT для выборки всех записей из ■таблицы.
Напишите команду SELECT для выборки из таблицы записей, удовлетворяющих некоторому условию (условиям).
Напишите команду SELECT для выборки всех записей из таблицы, с указанием сортировки по возрастанию (по убыванию) по значениям какого-либо поля.
Напишите команду SELECT для выборки некоторых полей из разных таблиц, удовлетворяющих некоторым условиям
Напишите команду SELECT для выборки всех записей из таблицы, с указанием группировки данных по значениям некоторого поля.
ФУНКЦИИ СУБД
Среда программирования Visual FoxPro предоставляет разработчику баз данных широкие возможности по управлению данными. Для облегчения написания программных кодов среда программирования Visual FoxPro содержит более двухсот функций различного назначения. Использование функций позволяет создать гибкие, простые в упраачении инструменты но обработке данных. Кроме того, предусмотрена возможность создания своих собственных функций, которые можно использовать наравне со стандартными функциями, поместив их в специальные библиотеки.
МАТЕМАТИЧЕСКИЕ ФУНКЦИИ
Большой набор математических функций позволяет выполнить практически любые вычисления. При необходимости использования специальных разделов математики можно дописать необходимое количество функций для выполнения специальных вычислений.
Вычисление абсолютного значения
ABS(<Bbip. N>)
Функция возвращает абсолютное значение числа, заданного константой или переменной <выр. N>.
Примеры.
SET TALK OFF
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
Проверка на принадлежность интервалу значений
BETWEEN(<Bbip. 1>, <выр. 2>, <выр. 3>)
Функция возвращает значение «истина» (.Т.), если значение <выр. 1> больше или равно <выр. 2>, но меньше или равно <выр. 3>, в противном случае — значение «ложь» (.F.). Все три выражения должны быть либо строками, либо числами, либо датами.
Пример.
CLCSE ALL
SET DEFAULT ТО E:\Prin\_bd
USE Catalog IN 2 INDEX Catalog ALIAS Cat ORDER; J TAG Boot
CLEAR SELE Cat
SCAN FOR BETWEEN(Xey_fc>ook,1,10)
? Key_book, Nane_book && Вывод на экран порядкового
номера книги и названия .
книги
EKDSCAN
Получение целого числа, большего или равного аргументу
CEILING(<Bbip. N>)
Функция возвращает целое число, которое больше или равно числовому выражению <выр. N>.
Примеры.
? CEILING (6.3) £с& Выводит на экран 7
? CEILING(-8.4) &Ь Выводит на экран -8
Получение целого числа, меньшего или равного аргументу
FLOOR(<Bbip. N>)
Функция возвращает целое число, которое меньше или равно числовому выражению <выр. NX
Примеры.
S£T TALK OFF
STORE Ю.9 ТО |
peri |
|
|
|
|
STORE -10.1 ТО |
per2 |
|
|
|
|
CLEAR |
|
|
|
|
|
? FLOOR(peri) |
& & |
Выводит |
на |
экран |
10 |
? FLOOR(per2) |
&& |
Выводит |
на |
экран |
-11 |
? FLOOR(10.0) |
&& |
Выводит |
на |
экран |
10 |
? FLOOR(-10.0) |
(etc |
Выводит |
на |
экран |
-10 |
12.1.5. Выделение |
целой |
части числа |
|
|
INT(<Bbip. N>)
Функция возвращает целую часть чиоа, заданного константой или переменной <выр. NX
Пример.
|
INT(18.7) |
&& |
Выводит |
на |
экран |
18 |
■? |
INT(12.5) |
&& |
Вызодит |
на |
экран |
12 |
? |
INTJ6.25 * |
2) && |
Выводит |
на |
экран |
12 |
■> |
INT(-12.5) |
&& |
Выводит |
на |
экран |
-12 |
STORE -12.5 ТО |
per |
|
|
|
|
|
j |
INT(per) |
|
Выводит |
на |
экран |
-12 |
CLEAR
SET TALK
OFF
Выбор максимального значения из списка
^АХ(выр .1, выр.2, вырЗ...)
Функция возвращает максимальное значение из заданного РЭДа значений. Все элементы ряда должны иметь один тип данных.
Пример.
CLOSE ALL
SET DEFAULT TO E:\Prinubd
USE Catalog IN 2 INDEX Catalog ALIAS Cat ORDER; ] TAG Book
CLEAR SEL3 Cat CLEAR
Per_Max = 1 £c& Начальное максимальное значение
Per^Min = 100000 && Начальное минимальное значение
SCAN
?er_Min = MIN(Per_Min, Price)
Per_Max = MAX(Per_Max, Price)
ENDSCAN
? 'Минимальная цена одного экземпляра книги: ', Per_Min ? 'Максимальная цена одного экземпляра книги: ', PerJ>lax
Выбор минимального значения из списка
М1Ч(<выр. 1>, <выр. 2>, <выр. 3>,...)
Функция возвращает минимальное значение из заданного ряда значений. Все элементы ряда должны иметь один тип данных. Примером, в п. 12.1.6.
Целочисленный остаток от деления
MOD(<Bbip. Nl>, <выр. N2>)
Функция возвращает остаток отделения <выр. Nl> на <выр. N2> Пример.
CLEAR
?
MOD(36,10)
&&
Выводит
на экран 6
?
MOD((4*9),
(90/9))
&&
Выводит
на экран 6
?
MOD(25.250,5.0)
&&
Выводит
на экран 0.250
?
IIF(MOD(YEAR(DATE<)),
4)
=0,
'
Текущий год високосный'.
'Текущий
год не високосный')
12.1.9. Округление с заданной точностью
ROUND(<Bbip, М>, <вьф. N2>)
функция возвращает округленное значение <выр. Nl> с точностью <выр. N2> знаков после запятой
Пример.
SET DECIMALS ТО 4
SET FIXED ON && Установить вывод на экран
указанное выпе количество
разрядоз дробной части числа CLEAR
? ROUND(1234.1962, 3) && ? ROUND(1234 1962, 2) && ? ROUND(1234.1962, 0) && ? ROUND(1234.1962, -1)&& ? ROUND(1234.1962. -2)&& ? ROUND(1234.1962, -3)&b
Выводит на экран 1234.1960 Выводи*7’ на экран 1234.2000 Выводи*” на экран 1234.0000 Выводит на экран 1230.0000 Выводит на экран 1200.0000 Вызодит на экран 1000.0000
SET FIXED OFF && Восстановить вывод на экран
указанное по умолчанию количество разрядов дробной части числа.
Ю. Генератор псевдослучайных чисел от 0 до 1
RAND(<»up. N>)
По умолчанию используется число 100001. Наилучший результат даст задание отрицательного начального числа. Для реализации равномерного закона распределения можно использо- ^ть формулу:
,(b - a)*RAND() + а — для вещественных чисел в диапазоне а - Ь; lN,T((j_i + i)*RAND() + i) — для целых чисел в диапазоне i — j.
Пример.
CLOSE ALL
SET DEFAULT TO E:\Prim_bd
USE Catalog IN 2INDEX Catalog ALIAS Cat ORDER TAG Bookj CLEAR SELE Cat
SET DECIMALS TO 4
SET FIXED ON && Установить вывод ка экран
указанное выше количество
разрядов дробной части числа J
FOR i = 1 ТО 10 && Добавить десять записей
APPEND BLANK
&& Назначить случайным образок начальную цену одного}]
экземпляра книги
REPLACE Price WITH 1 + 100 * RAND(), Key_book;
WITH 100 «■ i SNDFOR
Определение знака числа
SlGN(<BUp. N>)
Функция возвращает I, если число положительное. Функция возвращает -1, если число отрицательное. Функция возвращает 0, если число равно нулю.
Пример.
STORE 10 ТО Numl STORE -10 ТО Num2 STORE 0 ТО Per_Zero CLEAR
1
-1
0
? SIGN(Num2) && Выводит на экран
? SIGN (Per_Zero) && Выводит на экран
Экспонента
ЕХР(<выр. N>)
функция возвращает основание натурачьного логарифма, возведенное в степень <выр. N>.
Пример.
? ЕХР(О) £г£г Выводит ча экран 1.0000
? ЕХ?(1) && Зыводит на экран 2.7183
Натуральный логарифм
ШС(<выр. N>)
Функция возвращает значение натурального логарифма от аргумента < выр. М>, но аргумент должен быть больше 0.
Пример.
CLEAR
SET TALK OFF
? LOG(1) &£t Выводит на экран С.0000
STORE EXP(2) TO peri
? LOG (peri) £c£c Зыводит на экран 2.0000
Десятичный логарифм
1Х)С10(<выр. N>)
Функция возвращает значение десятичного логарифма от аргумента <выр. N>, но аргумент должен быть больше 0.
Пример.
CLEAR
SET TALK OFF
? LOG10(10) && Выводит на экран 1.0000
STORE 100 TO peri
• LOGlO(perl) && Выводит на экран 2.0000
? LOG10(рег1Л2) && Выводит на экран 4.0000
Извлечение квадратного корня
SQRT(<Bbip. N>)
Функция возвращает значение квадратного корня от аргумента <выр. N>, но аргумент должен быть положительным.
Пример.
CLEAR
? SQRT{4) && Выводит на экран 2.0000
? SQRT(2*SQRT(2))&& Выводит на экран 1.6818
Вычисление синуса
81Н(<выр. N>)
Функция возвращает значение синуса от аргумента <выр. N>, но аргумент задается в радианах.
Пример.
CLEAR
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
Вычисление косинуса
COS(<Bup. N>)
Функция возвращает значение косинуса от аргумента <Bup.N>, но аргумент задается в радианах.
Пример.
CLEAR
SET TALK OFF
|
COS(O) |
&& |
Выводит |
на |
экран |
1.00 |
|||
•J |
COS (Pin ) |
|
Выводит |
на |
экран |
-1.00 |
|||
■> |
COS(DTOR(180)) |
|
Выводит |
на |
экран |
-1.00 |
|||
STORE PI() * 3 TO peri |
|
|
|
|
|||||
|
COS(peri) |
|
Выводит |
на |
экран |
-1.00 |
12.1-18. Вычисление arcsin
ASlN(<Bbip. N>)
Функция возвращает значение арксинуса от аргумента <выр.ГЧ>, но аргумент задается от 1 до —1. Результат в пределах от 1.57079 до-1.57079.
Пример.
CLEAR
SET TALK OFF
на
экран С.00
на
экран 90.00 на экран 45.00
STORE 1 TO peri ? RTOD(ASIN(perl)) && Выводит
? RTOD(ASIN(SQRT(2)/2)) Выводит
Вычисление arctg
ATAN(<eup. N>)
Функция возвращает значение арктангенса от аргумента <выр.1Ч> Аргумент может быть любым. Результат в радианах в диапазоне от—1.57079 до 1.57079.
Пример.
CLEAR
|
Выводит |
На |
экран |
0.00 |
peri |
|
|
|
|
&& |
Выводит |
на |
экран |
1.00 |
&& |
Выводит |
на |
экран |
1.00 |
&& |
Выводит |
на |
экран |
1.00 |
SET TALK OFF ? ATAN(0)
STORE PI()/2 TO ? ATAN(peri)
? ATAN(PI()/2)
? ATAN(DTOR(90))
Вычисление тангенса
TAN(<Bup. N>)
r
Функция возвращает значение тангенса угла. <выр. N> задайся в радианах.
Вычисление арккотангенса
АТГЧ2(<выр. Nl>, <иыр. N2>)
Функция возвращает значение арктангенса от аргументов <выр. N 1> и <выр. N2>. Здесь аргументы — координаты точки на плоскости: <выр. N 1> -> Y, <выр. N2> -> X
Пример.
SET TALK OFF
CLEAR
SELE Cat
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
Числовое значение pi РЮ
Функция возвращает значение 3.141592 Примеры см. в п. 12.1.19—12.1.21.
Преобразование градусов в радианы
RTOD(<Bwp. N>)
Для увеличения разрядности (по умолчанию N = 2), то есть точности вычислений используют две команды (в паре):
SET FIXED ON && (по умолчанию OFF)
SET DECIMALS TO <выр. N>
<выр. N> — определяет количество разрядов после запятой. Эти две команды влияют только на отображение на экране, а в оперативной памяти точность максимальна [12].
Пример.
CLEAR
? RTOD(ACOS(0)) && Выводит на экран 90.СО
STORE -1 ТО peri
? RTOD(ACOS(peri)) && Выводит на экран 80.00
? RTOD(ACOS(SQRT(2)/2)} && Вызодит на экран 45.00
СТРОКОВЫЕ ФУНКЦИИ
При работе с базами данных важное значение имеет обработка строковых выражений. Для упрощения работы со строками предусмотрено большое количество строковых функций различного назначения. С помощью строковых функций выполняется поиск символа (или символов) в строке данных, определение позиции символа в строке, определение наличия символа в строке и т. д. Для удобства работы со строковыми функциями они разделены на категории.
Функции анализа
Наличие вхождения
<выр. С1>$<выр. С2>
Если <вырС1> содержится внутри <вырС2>, то возвращается значение «истина» (.Т.), в противном случае — значение «ложь» (F.).
Пример.
? 'база'$'база данных* && Выводит на экран .Т.
Поиск по строке слева направо
АТ]АТС(<выр. С1>, <выр. С2>, <выр. N>)
г Поиск слева направо в строке <выр. С2> позиции, начиная с которой <выр. С1> входит в <выр. С2>. <Выр. N> указывает, какое по счету вхождение интересует (по умолчанию <выр. N> = 1)
Примеры.
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
Команда АТ() различает большие и маленькие буквы, а АТСО — различия не делает.
Поиск по строке справа налево
RAT(<Bbip. С1>, <выр. С2>, <выр. N>)
Эта команда осуществляет поиск в строке <выр.С2> справа налево, но позицию вхождения дает слева направо.
Пример.
SET TALK OFF
CLEAR
SELE Cat
STORE 'abracadabra' TO string STORE 'a' TO find_str
? RATffind^str,string) && Выводит на экран 11 7 RAT(find_str,string,3) && Выводит на экран 6
Поиск выражения в списке
INLIST(<Bup>, <выр. 1>, <выр. 2>,...)
Функция возвращает значение «истина» (.Т.), если <выр> содержится в списке <выр. 1>, <выр. 2>, и т. д. Все выражения должны быть одного типа: либо строки, либо числа, либо даты.
Пример.
SET TALK ON
STORE CMONTH(DATE()) TO Per_Mes DO CASE
CASE INLIST(Per_Mes,'Январь','Февраль','Март') STORE 'Kvart_l' TO peri CASE INLIST(Per_Mes,'Апрель','Май','Июнь')
STORE ' Kvart_2' TO peri
CASE INLIST(Perjfles,'Июль','Август','Сентябрь') STORE 'Kvart_3' ТО peri OTHERWISE
STORE 'Kvart_4' TO peri
ENDCASE
WAIT WINDOW peri &£c Зыводит з спец. окно номер
квартала - Kvart_N
Проверка на цифру
ISDIGlT(<Bup. О)
Если первый символ <выр. О цифра, то функция возвращает значение «истина» (.Т.).
Пример.
CLOSE ALL
SET DEFAULT TO E:\Prim_bd
USE Catalog IN 2 INDEX Catalog ALIAS Cat ORDER;
TAG Book SET TALK OFF CLEAR SELE cat
display Name_book
? lSDIGIT(Name_Jx>ok) && Выводит на экран .F.
DISPLAY Key_book
? ISDIGIT(ALLTRIM(STR(Key_book)))&£c Выводит на экран.Т.
Подсчет числа символов LEN(<Bbip. О)
Функция возвращает количество символов в <выр. О. Пример.
? 1>ЕЫ('база данных') Выводит на экран 11
Определение вхождения
1ЛКЕ(<выр. С1>, <выр. С2>)
Функция возвращает значение «истина* (.Т.), если <выр. С1> входит в <выр. С2>. Для <выр. С1> допускается использование шаблона (символы * и ?). Функция удобна дпя поиска по базе но неполному ключу.
Пример.
CLOSE ALL
SET DEFAULT TO E:\Prim_bd
USE Catalog IN 2 INDEX Catalog ALIAS Cat ORDER TAG Book-] SET TALK OFF CLEAR SELS Cat
? 'Вывести на экран названия всех книг, названия 'которых начинаются с символов Пов* ‘
7
SCAN FOR LIKE('Пов*', Name_book)
? Kame_book ENDSCAN
Определение количества вхождений
OCCURS(<Bbip. С1>, <выр. С2>)
Функция возвращает число, обозначающее, сколько раз <выр. С1> входит в <выр. С2>.
Пример.
? OCCURS('а','база данных') && Выводит на экран 3|
Функции выделения
Ввделение начала строки
ШТ(<выр. О, <выр. N>)
Выделение из <выр. О первых <выр. N> символов. ЕслМ <выр. N> длиннее <выр. О, то выделяется <выр. О целиком.
Пример.
? LEFT('база данных',4) && Вьзодит на экран «база»
Выделение конца строки
ИСНТ<<выр. О, <выр. N>)
Выделяет из строки <выр. О последние <выр. N> символов.
Пример.
? RIGHT('база данных',6) Выводит на экран «данных»
Выделение произвольной подстроки
SUBSTR(<Bbip. 0,<вач. позиция>, <число символов>)
Выделяет из строки <выр. С> подстроку, начиная с <нач. позиция>, длиной в <число символов>.
Пример.
? SUBSTR('база исходных данных *,6,8)
* Выводит на экран ''исходных''
Удаление пробелов из символьного выражения
LTRIM(<Bup. О) | RTRIM(<Bbip. О) | АШШМ(<выр. О)
Функции удаляют пробелы от выражения <выр.О слева, справа, слева и справа одновременно соответственно.
Функции преобразования
Конвертация (кодирование) символов
CHRTRAN(<Bbip. С1>, <выр. С2>, <вьф. С3>)
Кодируются символы <выр. С1> по следующему правилу; Если в <выр. С1> встречается символ, равный первому символу из <выр. С2>, то он заменяется в <выр. С1> на первый символ из <выр. С3>. Если в <выр. С1> встречается символ, равный второму символу из <выр. С2>, то он заменяется на второй символ из <выр.СЗ> и т. д.
То есть <выр. С2> используется как шаблон для поиска символов из <выр. С1>, а символы в <выр. С1> заменяются на coorj ветствуюшие из <выр. С3>.
Если <выр. С3> имеет меньше знаков, чем <выр. С2>, то лишние знаки из <выр. С2> переводятся в знаки нулевой длины (теряются). Если <выр. С3> имеет больше знаков, чем <выр. С2>, то дополнительные знаки игнорируются.
Примеры:
? CHRTRAN(''abedef'',''асе'',''xyz'')
£с£с Выводит на экран xbydzf
S=''абвгдежзийклмнопрстуфхцчшгьыьэюя''
Р="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬ1ЬЭЮЯ' '
? CHRTRAN('База данных',S,Р)
&& Выводит на экран БАЗА ДАННЫЙ
Повторение выражения несколько раз
REPLICATE(<Bup. О, <выр. N>)
Повторяет <выр. О <выр. N> раз.
Пример.
? REPLICATE('Привет ' , 3)
&& Выводит на экран Привет Привет Призер
Формирование строки пробелов
SPACE(<Bbip. N>)
Пробел повторяется <выр. N> раз.
Редактирование (замена) части строки
STUFF(<Bbip. С1>, <нач. позицня>,<число сичволов>, <выр. С2>)
В строке <выр. С1> заменяется <число символов>, начиная с символа <нач. позиция>, на символы строки <выр. С2>.
Если <число символов>=0, то <выр. С2> вставляется в <выр. С1> в позицию <нач. позиция>, не затирая (отодвигая) часть строки <выр. С1>.
Если <выр. С2> пустая строка, то из строки <выр. С1> удаляется <чнсло символов>, начиная с <нач. позиция> с одновременным сжатием <выр. С1>.
Пример.
х='база исходных данных'
? STUFF(х,6,9, 'конечных') &.& Выводит на экран » '' база конечных данных''
? STUFF(х.6,9, " ) && Выводит на экран
* ''база данных''
Поиск и замена часта строки
STRTRAN(<Bbip. С1>, <выр. С2>, <выр. С3>, <вир. Nl>, <выр. N2>)
В строке <выр. С1>, начиная с позиции <выр. Nl>, ищется подстрока <выр. С2>. Если <выр. С2> найдено в строке <выр. С1>, то оно заменяется на <выр. С3>. Процесс поиска замены продолжается до позиции <выр. N2>.
Если <выр. С3> отсутствует, то все найденные <выр. С2> будут превращены в пустую строку. Если не указано <выр. Nl>, то поиск начинается с первой позиции. Если не указано <выр. N2>, то поиск продолжается до конца строки <выр. С1>.
Пример.
? STRTRAN('база данных','а','А')
&& Выводит на экран ''бАзА дАнных*'
? STRTRAN('база данных','н')
&& Выводит на экран ''база даых''
’ STRTRAN('база данных','а','*',2)
&& Выводит на экран ''баз* д*нных''
Задание шаблона вывода данных
^AlSSFORM(<Bup.>, <шаблон>)
Задает шаблон аналогично @...SAY.
12.2.3.7.
Вставка подстроки в центр|слева|справа
строки
PADC
|
PADL
|PADR(<Bbip.
С1>,
<выр. N>,
<выр.
С2>)
<Вьф.
С1> вставляется соответственно в
центр/слева/справа строки, составленной
из <выр. С2>, повторенного <выр. N>
раз.
Если <выр. С2> опущено, то используются
пробелы. Если <выр. С1> длиннее, чем
<выр. N>,
то
<выр. С1> усекается справа до <выр.
N>,
т.
е. длина строки не превышает <выр. N>.
Пример.
?
РАЭС1'Таблица',20, )
&&
Выводит на экран ***’
SET
KEMOWIDTH
TO
20
?
ATLINE('AB', peri) SET KEMOWIDTH TO 10
?
ATLINE('AB',
peri)
‘'Таблица*
12.2.4. Функции обработки мемо-полей
Пример.
? TRANSFORM(234..83,
? TRANSFORM(234.183, ? TRANSFORM(234.183,
&& Выводит на экран 234.1
&& Выводит на экран 234.18
&& Выводит на экран 234.1*3
П ример 1.
Пусть дана таблица Employee, которая содержит поля: pjrsi_Name — символьное, Last Name — символьное, Notes — доле типа Memo.
USE employee&St Открытие таблицы Employee CLEAR
STORE 'Японец' TO Per_Find
&& Символы заносятся с учетом регистра. LOCATE FOR ATLINE(Per_Find, notes) != 0 ? FirstJName ?? Last_Name
? MLINE(notes, ATLINE(Per_Find, notes))
П p и м e p 2. Работа со строками.
STORE '1234567890ABCDEFGHIJ' TO Deri
&& Установлена длина строки 20 симзолов
&& Выводит на экран 1
&& Установлена длина строки 10 симзолов
&& Выводит на экран 2
Employee
С мемо-полями могут работать ранее рассмотренные функш LEN(), АТ(), АТС(), SUBSTR(). Только с мемо-полями работают следующие функции.
ии:
Определение первого вхождения подстроки
ATLINE| ATCLINE(<Bbip. С1>,<мемо-поле>)
Ищет первое вхождение <выр. С1> в <мемо-поле> и возвращает номер строки, где было найдено <выр. С1>. Если <выр. СР не найдено, то возвращается 0. •1 _
ATCLINE не различает строчные и прописные буквы, а фунК- J ция ATLINE — различает. Далее найденная строка может обрабатываться другими функциями.
Определение последнего вхождения подстроки
RATLI\E{<Bbip. С1>, <мемо-поле>)
Определяет место последнего вхождения <выр. С1> в <мемо- Поле> и возвращает номер строки мемо-поля.
Пример.
employee Открытие таблицы
STORE 'Японец' ТО per STORE MLINE(notes, RATLINE(per, notes));
TO Per_FileLine ? per_FileLine
Выбор строки по ее номеру
MLINE(<MCMo-nwie>, <»чр. N>)
Возвращает строку с номером <выр. N> Если <выр. N> больше числа строк, то возвращается пустая строка.
12.2.4А Определение количества строк в мемо-поле
MEMLINES(<4cyo-ncuie>)
Возвращает число строк и мемо-поле.
Длина строки определяется командой SET MEMOWIDTII (но умолчанию — 50) При разбиении текста мемо-поля функция ями MLINE0 и MEMLINES0 на строки учитывается и уже имеющееся разбиение, сделанное с помощью Enter. Фиксация нажатия клавиши Enter и обозначается CHR(13).
Функции конвертирования и распознавания букв
Определение начала слова
ISALPHA(<BbipCl>)
Если <вырС1> начинается с буквы, то возвращается значение «истина» (.Т.).
Пример.
CLOSE ALL
SET DEFAULT TO E:\Prim_bd
USE Catalog IN 2 INDEX Catalog ALIAS Cat ORDER;
TAG Book SET TALK OFF CLEAR SELE Cat
.Т.
? IS ALPHA (Name_Jx>ok) && Выводит на экран
DISPLAY Price
? ISALPHA(CHR<Price)) && Выводит на экран
Определение строчной (малой) буквы
[SLOWER(<iwp. О)
Если слово <выр. О начинается с малой буквы, то возвращается значение «истина».
Пример.
CLEAR
? ISLOWER('привет') UU Выводит на экран .Т.
? ISLOWER('Привет') && Выводит на экран .F.
Определение нулевого значения
ISNULL(<«bip.>)
Функция возвращает значение «истина» (Т.), если значение выражения <выр.> равно нулю
Определение прописной (большой) буквы ISUPPER(<*up. О)
Если <выр. О начинается с большой буквы, то возвращается значение «истина» (.Т.).
Пример.
CLEAR
? ISUPPER('Привет') && Выводит на экран .Т.
? ISUPPER('привет') Ьй Выводит на экран .F.
Преобразование букв в строчные
1^WER( <выр.О)
Преобразует все буквы, содержащиеся в <выр.О, в строчные (малые).
Преобразование букв в прописные
рЙОРЕД(<*кф.О)
• Преобразует буквы, содержащиеся в <выр.О, следующим °бразом: первая буква — прописная (большая), остальные — СтР°чные (малые).
Преобразование букв в прописные
иРРЕЩ<вьф.О>
Преобразует все буквы, содержащиеся в <выр.О, в прописные (большие).
Функции работы с датами
Преобразование даты из символьной формы в форму дать
СТОЩ<выр. О)
Преобразует <выр. О в американский тип даты (ме- сяц/дснь/год, если не установлен другой тип командой SET DATE. <выр. С> должно быть в диапазоне: 4(1/1/1000» .. «12/31/9999*. Функция используется для создания переменных типа дата.
Пример.
CLEAR
STORE DATE{) ТО tek_date ? 'Техушая дата', tek_date
STORE СТОО('12/25/1999') ТО pr_date ? pr_date
STORE STR{~ek_date - pr_date, 4) TO kol_day ? _<ol_day
? 'Количество дней ', kol_cay, 'между текущей '+; 'датой и 12/25/1999'
День недели в символьной форме CDOW(<Bwp. D>)
Функция возвращает день недели в символьной форме.
Имя месяца в символьной форме
СМ(ЖТН(<выр. D>)
Функция возвращает имя месяца в символьной форме.
Системная дата DATEO
функция возвращает текущую системную дату
12.2.6.5 Месяц в числовой форме 1)ЛУ(<выр. D>)
функция возвращает день месяца указанной даты в числовой форме
Преобразование формата даты в символьный формат
DMY(<Bbip. D>)
Возвращает в виде строки (по английски) последовательно: день, месяц и год.
Если была дана команда SET CENTURY OFF, то ДД МЕСЯЦ ГГ Если была дана команда S ЕТ CENTURY ON, то ДД МЕСЯЦ ГИТ
Пример.
CLEAR
SET CENTURY OFF ? DMY(DATE())
£t£t Выводит на экран текущую дату 12 June 01 SET CENTURY ON DMY( DATEO)
b£c Выводит на экран текущую дату 12 June 2001
Определение порядкового номера дня недели бО\У(<Выр. Ц>)
Функция возвращает порядковый номер дня недели.
Преобразование типа дата в строку символов бТОС(<аир. D>)
Функция возвращает указанную дату в виде символьной ^оки
Определение новой даты
СОМО!ЧТН(<выр. D>, <выр. N>)
Возвращает дату, которая отстоит от <вьф. D> на <выр. N> месяцев. Если <выр. N> положительно, то определяется будущ-- дата. Если <вьф. N> отрицательно — прошедшая. Если такой даты не существует, то возвращается дата, соответствующая последнему дню вычисленного месяца.
Пример.
SET CENTURY ON STORE DATE О TO peri CLEAR
? peri Sc& Текущая дата 12 июня 2001 (06/12/2001)
? GOMONTH(peri, 2) && Выводит на экран 08/12/200Ь ? GOMONTH(peri, -2)&& Выводит ча экран 04/12/2001
Определение номера месяца
MONTH(<Bbip. D>)
Функция возвращает порядковый номер месяца указанн^ даты.
Определение номера года
YEAR(<Bbip. D>)
Функция возвращает номер года.
Функции преобразования типов данных
Определение кода первого символа
ASC(<Bbip. О)
Возвращает ASCII-код первого символа из <выр. О.
Пример.
дТОКЗ 'ABCDEFGHIJ' ТО peri && 10 символов
clear
poR i = 1 ТО 10
? SUBSTR(perl, i, 1) && Выводит на экран
символ
? > ASC(SU3STR(perl, i)) && Выводит на экран
ASCII код символа ENDFOR
Преобразование числа в символ
СНИ(<выр. N>)
Преобразует <выр. N>, где N — целое число в диапазоне I...255, в соответствующий символ из таблицы ASCII. Функции ASC0 и CHR() обратны друг другу. 112].
Пример.
CLEAR
FOR i = 65 ТО 75
? i && Выводит на экран ASCII код
символа
?? ' ' + CHR(i) && В текущую строку добавляет
символ
ENDFOR
Преобразование числа в строку символов
sTR(<Bup. Nl> [, <выр. N2> [, <выр. N3> ] J)
Функция преобразует числовое выражение в строку символов. <выр. Nl> исходное числовое значение, <выр. N2> общая возвращаемой строки символов, <выр. N3> определяет количество символов в строке для обозначения дробной части Числа. Если <выр. N2> определяет короткую строку и не хватает количества символов для отображения числа, то функция возвращает серию звездочек.
12.2J.4. Преобразование символьного типа в числовой тип VAL(<>up. С1>)
Функция преобразует число, записанное символами, в числовой тип.
Преобразование денежного типа в числовой тип
МТОГЧ(<денежное выражение>)
Функция возвращает денежное выражение в числовой форме
ФУНКЦИИ ПРОВЕРКИ ФАЙЛОВ И ДИСКОВ
Так как среда программирования Visual FoxPro предоставляет возможность одновременной работы с несколькими таблицами, то для обращения к нужной таблице, проверки наличия таблицы, определения начала и конца таблицы и т. д. используются специальные функции. Для удобства работы с функциями проверки файлов они разделены на категории.
Ниже необязательный параметр <область> предоставляет возможность работать в любой пассивной рабочей области Пассивная область задается своим номером.
Определение начала файла
BOF([<o6.iacTb>J)
Функция возвращает значение «истина» (.Т.), если достигнуто начало файла: но не первая запись файла, а попытка прочитать несуществующую нулевую запись файла. Во всех остальных случаях возвращается значение «ложь* (.F.).
Пример.
С помощью кнопок «Вперед» и «Назад организовать просмотр таблицы «Catalog*. Из текущей записи на экран вывЯ дится название книги. При достижении конца таблицы на экран выводится сообщение «Достигнут конец таблицы», а при достижении начала таблицы на экран выдается сообщение «Достигну'* то начало таблицы».
USE Е:\Prim_bd\Catalog && Открытие таблицы
SET TALK OFF
CLEAR
activate SCREEN
■3 2,1 SAY 'Название книги: ' ♦ Name. book
DEFINE WINDOW wSkip FROM 9,10 TO 14,65 DOUBLE; COLOR SCHEME 5 FONT 'Times Mew Roman'
ACTIVATE WINDOW wSkip
3 1,5 GET gnChoice FUNCTION ' *HN \<Вперед;',- \ <Ha зад;\<Выход' ;
DEFAULT 0 SIZE 2,14 VALID CHOICE()
READ CYCLE
RELEASE WINDOW wSkip
Ш Я ' J "
PROCEDURE choice DO CASE
CASE gnChoice = 1 SKIP
If eof('Catalog') && Определение конца таблицы
WAIT WINDOW 'Достигнут конец таблицы'; NOWAIT
SKIP -1
ENDIF CASE gnChoice = 2 SKIP -1
IF BOF ('Catalog') ^Определение начала таблицы
WAIT WINDOW 'Достигнуто начало таблицы'; NOWAIT
GO TOP
ENDIF gnChoice = 3
CLEAR READ ENDCASE
Name_book
Определение имени табличного файла
DBF([<o(wiacTb>])
Пример.
IN
2 ALIAS Cat IN 7 ALIAS Aut
USE Е: \Princ_bd\Catalog USE E:\Prim_bd\Author CLEAR
? DBF(2) && Выводит на экран путь к табличному
файлу, открытому во 2 рабочей области
? DBF{'Aut')
&£с Выводит на экран путь к табличному
файлу, открытому в рабочей области с
псевдонимом Aut
Определение свободного места на активном диске
DISKSPACEO
? 'На текущем диске свободно ', DISKSPACEO, ' байт
Определение помеченных к удалению записей
pELETED([<o(wiacTb>])
функция возвращает значение «истина* (.Т.), если текущая запись помечена к удалению. Если надо определить вес записи, помеченные к удалению в указанной рабочей области, то используют команду:
LIST FOR DELETED([<o6.Tacib>])
Пример.
CLOSE ALL
SET DEFAULT no E:\Prim_bd USE Catalog IN 2 ALIAS Cat
&& Открытие табличного файла Catalog
USE Author IN 7 ALIAS Aut
&& Открытие табличного файла Author
SELE Aut
DELETE FROM Author.dbf WHERE Key_autor = 2
&& Вторую запись пометить к удалению.
CLEAR
LIST FOR DELETED{'Aut')
&& Вывести на экран помеченные к
* удалению записи.
Recall all ь& Со всех записей таблицы Author снять пометку к удалению
Определение конца файла
^р([<область>])
Функция возвращает значение «истина* (.Т.) когда сделана °Пытка прочитать следующую (за последней) запись, а не когда Достигнута последняя запись табличного файла. Во всех осталь- w случаях возвращает значение «ложь* (.F.).
Пример см. вп. 12.3.1.
Проверка наличия файла на диске
FILE(<hmh файла>)
Имя файла с расширением должно быть задано в виде строки в апострофах либо храниться в символьной переменной. Можно проверить наличие любого файла.
Пример.
CLOSE ALL
ЗЕТ DEFAULT ТО E:\Prim_bd 'JSE Catalog IN 2 ALIAS Cat USE Author IN 7 ALIAS Aut С LEA?
IF FILE('Catalog.dbf')
WAIT WINDOW 'Указанный файл присутствует' ELSE
WAIT WINDOW 'Указанный файл отсутствует' ENDIF
Определение имени поля
FIELD(<Bup. N> [,<область>])
Функция возвращает имя поля с номером <выр. N> из ука занной рабочей области. Если полей меньше, чем указано в <выр. N>, то выводится 0. Имя поля выводится прописными буквами.
Пример.
CLOSE ALL
SET DEFAULT TO E:\Prim_bd
USE Catalog IN 2 ALIAS Cat
USE Author IN 7 ALIAS Aut
CLEAR
SELE Cat
CLEAR
FOR i = 1 ТО FCOUNTO && Цикл на количество полей ? FIELD(1) && Выводит на экран имя
текущего поля
NEXT
о
? 'Количество полей: ' + ALLTRIK(£T?.(i -1))
Анализ успешности поиска
FOUNDd <область>])
Функция возвращает значение «истина» (Т.), если команды LOCATE, CONTINUE и SEEK закончились успешно. Функция действует в указанной области и удобна для анализа результатов поиска в связанных базах данных.
Пример.
CLOSE ALL
SET DEFAULT ТО E:\Prim_bd
USE Catalog IN 2 ALIAS Cat
USE Author IN 7 ALIAS Aut
CLEAR
SELE Cat
SET TALK OFF
STORE 0 TO per
LOCATE FOR Year = 2000
DO WHILE FOUND{}
Per = per + 1
CONTINUE
ENDDO
I Wait window 'Количество книг, выпущенных в '+;
2000 Году: ' ;
+ LTRIM(STR(per)) NOWAIT
LIST
Определение количества полей в открытой базе данных
FCOUNT(L<o6.iatnv>])
Возвращает число полей в открытой базе данных. Если параметр <область> отсутствует, то определяется количество полей из таблицы, размещенной в текущей области.
Пример см. в 12.3.7.
Определение действующего значения фильтра
FILTER([<o6uacTb>])
Возвращает прописными буквами значение действующего фильтра в заданной рабочей области. Функция полезна при формировании диалога для отбора записей из базы данных.
Пример.
CLOSE ALL
SET DEFAULT TO E:\Prim_bd USE Catalog IN 2 ALIAS Cat USE Author IN 7 ALIAS Aut CLEAR SELE Cat
SET FILTER TO SUBSTR(Name_book,1) = 'V ? 'Первый фильтр ', FILTER()
&& Выводит на экран условие первого фильтра| STORE FILTER!'Cat') ТО gcOldFilter
&& Сохраняет в памяти условие первого фильтр SET FILTER ТО Year = 1977 ? 'Второй фильтр ', FILTER!)
&& Выводит на экран условие второго фильтра^ LIST FIELDS Key_book, Year, Name_book
&& Выводит на экран результат работы второго фильтра
S3T FILTER ТО &gc01dFilter
&& Восстанавливает условия перзого фильтра
? 'Третий фильтр ', FILTER!)
&& Зыводит на экран условие восстановленного (первого) фильтра
FIELDS Key_book, Year, Name_Jx>ok ScSc Выводит на экран результаты первого (восстановленного) фильтра
Поиск значения поля по значению другого поля
LOOKUP(<noncl>, <выр.>, <полс 2>)
Ишет первое вхождение <выр> в Споле 2> из активной БД и возвращает значение <поля 1> из той же БД. Если табличный файл индексирован и индекс открыт, то производится индексный поиск. В противном случае производится последовательный поиск. Если поиск неудачный, то возвращается пустая строка и EOF() = True.
Пример.
CLOSE ALL
SET DEFAULT TO E:\Prirn_fcd
USE Catalog IN 2 INDEX Catalog ALIAS Cat ORDER TAG Name SET TALK OFF CLEAR SELE Cat
® 2,2 SAY LOOKUP(Price, ALLTRIM!'Лирика'), Name_book, ; 'Name•)
12.3.12 Определение даты последнего изменения ЕД IUPDATE([ <области>])
Выводит дату последнего изменения БД.
Пример.
clear
•,LUPDATE()
&& Выводит на экран дату последнего изменения базы данных
Определение имени главного индексного файла
ORDER([<o6.iacnC>])
Возвращает прописными буквами имя главного индексного файла БД. Если такого файла нет, то возвращается пустая строк Функция используется при создании пользовательского интерфейса, когда применяется изменение главного индексного файла.
Пример.
CLOSE ALL
SET DEFAULT TO E:\Prin_bd
USE Catalog IN 2 INDEX Catalog ALIAS Cat ORDER;
TAG Name SET TALK OFF CLEAR SELE Cat
? ORDER О && Выводит на экран имя екущегс|
индекса
? ORDER ('Cat', 1) СеСс Выводит на экран полное имя
главного индексного файла
Определение номера текущей записи
RECNO([<ofuiacn>>])
Возвращает номер текущей записи.
Если команда RECNO была задана после команды SEEK и командой SEEK был выполнен неудачный поиск, то функция RECNOQ возвращает номер ближайшей записи, следующей Ш искомой (как если бы она была), то есть выполняется *мяТД кий* поиск (локализация области записей, приближенны» поиск).
Пример.
CLOSE ALL
SET DEFAULT ТО E:\Prim_bd
USE Catalog IN 2 INDEX Catalog ALIAS Cat ORDER;
TAG Name SET TALK OFF CLEAR SELE Cat
per = 'ЯЯЯ'
SEEK ALLTRIM(per)
IF FOUND(J
DISPLAY Name_book, Price
ELSE
CLEAR
? 'Отсутствует книга с названием ' + per ? 'Номер последней записи: ' + ALLTRIM(STR (RECNO{) — 1)) ENDIF
Определение общего количества записей в ВД
КЕСС01ЛЧТ([<область>])
Возвращает обшее количество записей в БД, включая и записи, помеченные к удалению.
Пример.
C^>SE ALL
SET DEFAULT TO E:\Prim_bd
UsE Catalog IN 2 INDEX Catalog ALIAS Cat;
ORDER TAG Name SET TALK OFF CLEAR
SeLS Cat
peri = HEADER('Cat')
per = peri + (RECSIZE('Cat') * RECCOUNT('Cat') ■* 1) I? DISKSPACE (j > (per * 3)
WAIT WINDOW 'Свободного дискового пространства '+; 'достаточно для выполнения сортировки'
ELSE
WAIT WINDOW 'Свободного дискового пространства '+;
' недостаточно'
ENDIF
Определение размера записи файла БД
RECSIZE(l<o&»acib>])
Выводит размер записи в байтах.
Пример.
См. пример п. 12.3.15.
Определение размера заголовка БД
HEADER([<o6jiacTb>])
Выводит размер заголовка БД в байтах. Примерно: 32*(N + О байт, где N — число полей в БД.
См. пример в п. 12.3.15.
Поиск записи в индексированной ЕД
SEEK(<Bup.> [,<область>])
Выполняется поиск записи, содержащей <выр> в индексном файле и устанавливает на нее курсор (указатель записей). Пм удачном поиске возвращает значение «истина* (.Т.), а при н*1 удачном — значение «ложь* (.F.). Функция SEEKO эквиваленте комбинации команды SEEK и функции FOUND0-
Пример.
CLOSE ALL
s3T DEFAULT TO E:\Prim_bd
USE Catalog IN 2 INDEX Catalog ALIAS Cat;
ORDER TAG Name g£T TALK OFF CLEAR SELE Cat
? SEEK(ALLTRIM('Повести'))
Ub Если запись найдена, то на экран выводится .Т.
Анализ работы команды READ UPDATEO
Возвращает значение «истина* (.Т.), если при выполнении последней команды READ данные в ее областях GET каким-либо образом изменялись. В противном случае — значение «ложь» (. F.). Экономит время на перезаписи данных на диск, если они не менялись.
Вывод имени текущей директории
ССРОШ([диск])
Возвращает прописными буквами имя текущей директории на заданном диске. Если такого диска нет, то возвращается пустая строка.
Пример.
CLEAR
? 'Текущий каталог: CURDIRO
SCOldDir = SET('DEFAULT') + SYS(2003)
SET DEFAULT TO (HOMEO)
• 'Каталог Visual FoxPro : CURDIRO
SET DEFAULT TO (gcOldDir)
В1 'Текущий каталог: ', CURDIRO
Вывод имени активного диска
SYS(5)
Возвращает имя активного по умолчанию диска. Активный является либо стартовый диск, либо диск, установленный командой: SET DEFAULT ТО.
Пример.
CLEAR
IF _DOS OR „WINDOWS SET DEFAULT ТС C:
ZKDI?
? SYS(5) && Выводит на экран имя активного диске!
Вывод имени директории, где хранится FoxPro SYS(2004)
Возвращает полное имя директории, где хранится FoxPro. 1 Пример.
CLEAR. г
? 'Visual FoxPro размещен в каталоге: ', SYS(2004)
Вывод имени текущей директории SYS(2003)
Возвращает имя текущей директории на диске по умолчанщо. Имя диска не выводится. (12].
См. пример в п. 12.3.20.
Определение положения курсора
COL0
Возвращает номер текущей колонки на экране/окне. Пример.
CLEAR
в 5,5 SAY "
@ ROW(), COL<)+12 SAY 'Привет'
@ ROW(), $+12 SAY 'Hello'
Определение положения курсора
ROW0
Возвращает номер текущей строки на экране или в окне. См. пример в п. 12.4.1.
Определение позиции печати
PCOL0
Возвращает номер текущей колонки на принтере.
Пример.
CLEAR
9 PROW{) , PCOLO+12 SAY 'Привет'
Э PROW<), $+12 SAY 'Hello'
ФУНКЦИИ ПОЗИЦИОНИРОВАНИЯ ВЫДАЧИ ДАННЫХ
При формировании и выводе на печать отчетов различной форМЧ широко используются функции позиционирования, то есть ук*в ния начала строки (начала печати). Стандартными функшй^И предусмотрены практически все возможности вывода текста на пИ чать и создания собственных функций, как правило, не требует^И
Определение позиции печати
PRovvo
Возвращает номер текущей строки на принтере.
Применение команды EJECT (прогон) устанавливает PRO\V() в ноль. 112].
См. пример в п. 12.4.4.
ФУНКЦИИ РАБОТЫ С МЫШЬЮ
Для управления интерфейсом широко используется манипулятор мышь. Позиция курсора мыши определятся с помощью функций, приведенных ниже.
Определение положения маркера мыши
MCOL([<okiio>J)
Возвращает номер колонки, где находится маркер мыши. Если <окно> не указано, то выдается положение относительно экрана или текущего окна. Если маркер находится вне экрана, то возвращается—I.
Пример.
CLEAR ? MCOL()
Определение положения маркера мыши
MRO\V([<okho>1)
Возвращает номер строки, где находится маркер мыши (аналогично МСОЦ)).
Пример.
CLEAR ? MR0WO
Контроль нажатия левой кнопки
MDOWN0
Возвращает значение «истина» (.Т.), если левая кнопка мьпш* была нажата во время выполнения функции, и значение «ложь! (.F.) — в противном случае [12]
Пример.
CLEAR
£2,2 SAY 'Нажмите <Esc> для выхода to exit'
STORE MDOWNO TO per £4,2 CLEAR TO 4,6 £4,2 SAY per ENDDO
ТЕХНИЧЕСКИЕ ФУНКЦИИ
Технические функции предназначены для определения состояния и характеристик технических средств персонального компь- кдера, а также текущей среды приложения.
12.6.1- Определение количества доступных функциональных клавиш
FK.V1AX0
Возвращает число фактически доступных функциональных клавиш ПК.
Пример.
CLEAR
SET COMPATIBLE OFF ? 'COMPATIBLE OFF'
? 'Доступны функциональные клавиши'
FOR i = 1 ТО FKMAXO ? FKLABEL(i)
ENDFOR
SET COMPATIBLE ON
? 'Доступны комбинации функциональных клавиш'
FOR i = 1 TO FKMAXO ? FKLABEL(i)
ENDFOR
Определение имени переменной (поля), куда вводятся данные
VARREAD0|SYS(18)
Полностью идентичные функции возвращают (прописными буквами) имя поля/переменной при вводе данных командой если было выполнено прерывание от клавиши с помощью процедуры ON KEY... или сделан вызов пользовательской функ- в опциях VAL1D/WH EN. Функция удобна при вызове на эк
ран подсказок при вводе данных: для каждого поля — своя под. сказка. Функции можно использовать совместно с командами BROWSE/CHANGE (в параметрах :W, :V, :Е) или с командой ON KEY LABEL <клавиша> DO <процсдура> WITH VARREAD().
Однако имя поля передается в них, по не прописными (большими), кроме первой буквы, а строчными буквами. При желании можно воспользоваться функцией UPPER().
Включение/выключение курсора на экране
SYS(2002[,1])
Включает/выключает (с параметром 1) курсор на экране. Функция аналогична команде: SET CURSOR ON/OFF.
Определение статуса SET-команд
SET(<Bbip. 01,1])
Возвращает текущий статус различных SET-команд.
Если используется параметр 1, то определяется статус SET-I команд вида SET...ON/OFF. Если параметр 1 опушен, то определяется статус SET-команд вида: SET...TO.
Пример Если ранее командой SETT ALTERNATE ТО model был назначен альтернативный табличный файл с именем model.txt, то использование функции SETO дает следующие результаты:
SET('alter') && возвращает OFF
SET('alter',1) && возвращает D:\FOX\LENA\model.txt.
Определение типа процессора
SYS(17)
Возвращаеттип процессора 18086/88; i80286; i80386 i80486 и т. Д-
Олреление типа видеоадаптера и монитора
SYS(2006)
&& Возвращает ega/Color
Пример:
? SYS(2006)
Определение готовности принтера
SYS(13)
Возвращает прописными буквами статус готовности принтера READY — готов; OFFLINE — не готов.
Проверка готовности принтера
PRINTSTATUSO
Возвращает значение «истина* (.Т.), если принтер готов, и значение «ложь» (.F.) — если не готов. Эта функция удобнее SYS(13).
Пример:
I? 1 PR_NTSTATL'S ()
? «Подготовьте принтер» EKDIF
• Лфф XX U* Ы
Определение объема свободной основной оперативной памяти
SYS(12)
Возвращает число свободных байтов основной оперативной памяти (из 640Кб).
Определение объема свободной (доступной) оперативной памяти
MEMoryo
Возвращает число килобайтов доступной оперативной памя- 111 Для загрузки внешних программ по команде RUN или !
Определение общего объема оперативной памяти
SYS(lOOl)
Возвращает размер всей имеющейся оперативной памяти (до 1Мб).
Определение объема оперативной памяти, занятой временными файлами
SYS(16)
Возвращает число — объем оперативной памяти, занятой переменными, окнами, меню, открытыми файлами.
Определение типа монитора
ISCOLOR0
Возвращает значение «истина» (.Т.), если монитор цветной и значение «ложь» (-F.), если монохроматический.
Определение цветовой пары
SCHEME* <вырГЧ1> [,<BMpN2>D
Возвращает цветовую пару номер <BbipN2> списка цветовых пар из схемы цветов номер <вырМ>. Если <BbjpN2> опушено, то выдается весь список.
Определение версии FoxPro
VERSION([l])
Возвращает номер версии пакета FoxPro, а если указан параметр I, то и дату создания и номер самого пакета.
ФУНКЦИИ ВРЕМЕНИ
Для управления параметром «время* программисту предложен широкий набор функций времени.
12-7.1 • Определение времени в часах
HOlR(<Bbip. Т>)
Функция возвращает количество часов из указанного выражения в 12-часовом или 24-часовом формате.
Определение времени в минутах
MINUTE(<Bup. т>)
Функция возвращает количество минут из указанного выражения.
Определение времени в секундах
SEC(<Bbip. Т>)
Функция возвращает количество секунд из указанного выражения.
Определение времени в секундах
SECONDS0
Функция возвращает количество секунд на отрезке между полуночью и текущим моментом времени в чистовом формате с точностью .001 сек.
Определение времени в секундах
SYS(2)
Возвращает число секунд (в виде строки символов), считая от Полуночи.
Определение текущего (системного) времени
ПМЕ()
Функция возвращает текущее (системное) время в 24-часо- ®°м формате.
ФУНКЦИИ АНАЛИЗА УСЛОВИИ
Выбор значения по условию
HF(<ycJiOBHe>, <выр1>, <выр2>)
Если <условие> истинно (True), то функция возвращает <выр!>, а если ложно (False), то — <выр2>.
Эта функция может быть помешена практически в любую команду в качестве <выражения> или в другую функцию. Необходимо только соблюсти тип выражения. Допускается вложение функций IIF.
ФУНКЦИИ АНАЛИЗА ТИПА И НАЛИЧИЯ ДАННЫХ
При программном обращении к данным необходимо знать, есть ли данные вообще, а если они есть, то какого типа. Исходя из полученного ответа, строится дальнейший алгоритм обработки данных.
Проверка заполнения поля (переменной)
ЕМРТУ(<выр.>)
Возвращает значение "истина” (.Т.), если <выр.> (ноле или переменная) не имеет данных, в противном случае — значение ’’ложь” (.F.).
Поле (переменная) считается пустым в зависимости от его типа и содержания (табл. 12.1).
Таблица 12.1
Тип
пробелы
символьное
знаки табуляции
возврат каретки
переводы строки
цифровое
даты
False
логические
memo
Определение типа данных в поле (переменной)
ТУРЕ(<выр. О)
Возвращает прописной буквой символ, обозначающий тип данных <выр. О:
С — символьный;
N — числовой;
D — лата;
L — логический;
М— мемо-полс,
U — неопределенный.
Имя анализируемой переменной (<выр. С>) должно быть взято в апострофы или кавычки.
ФИНАНСОВЫЕ ФУНКЦИИ
Так как базы данных широко используются для хранения экономических показателей фирм различной сферы деятельности, то для обработки экономических показателей используются функции, представленные ниже. Стандартно поставляемые функции не могут охватить всего круга задач, поэтому дтя каждой конкретной фирмы необходимо дополнительно создавать специальные экономические и финансовые функции.
Возврат кредита равными долями
PAYMENT(<Bwp. Nl>, <выр. N2>, <выр. N3>)
Вычисляет размер периодических выплат за взятый кредит, на который установлен определенный процент и указано число периодов погашения кредита:
<вьимата>=РАУМЕКТ(<кредит>, <процснт>, <число периодов>)
Расчет производится по сложной ставке процентов.
Пример. В банке взят кредит на 2 года в сумме 100000 руб- Лей из расчета 10% годовых по сложной ставке процентов с ежемесячным погашением кредита равными долями.
? PAYMENT(ЮСООО, 0.1/12,241 && выводит на экран 4614.49
Если погашать кредит 1 раз в год двумя выплатами, то:
7 ?Aykent(100000,0.1,2) && выводит на экран 56719.05
Определение общей суммы, полученной вкладчиком
FV(<BMp. Nl>, <выр. N2>, <выр. N3>)
Результат вычислений сохраняется в переменной <общая сумма>:
<о5щая сумма>=FV(<сумма пер. ззноса>, <процент>, <чис:ю периодоз>)
Пример. В течение 3 лет ежемесячно вносилась сумма 1000 рублей при годовой ставке сложных процентов — 10%. Определить общую сумму, полученную вкладчиком через 3 года.
? FV(1СС0,0.1/12,36) && выводит на экран 41781.82
Сумма вклада 36*1000 = 36000
Обдая сумма 41781.82
Определение суммы за будущие платежи
FV(<»np. Nl>, <выр. N2>, <вьф. N3>)
<выплата>=РУ(<период выплаты>, <процент>, <число периодов^
Пример. За аренду помещения надо платить ежегодно по 10000 рублей. Срок аренды — 3 года (30000 рублей). Годовая ставка процентов — 10%. Какую сумму надо заплатить вперед (сегод ня) за 3 года аренды?
? PV(10000,0.1/12,36) && выводит на экран 25826.03
ФУНКЦИИ ПОДСТАНОВКИ
Эти функции дают возможность формировать имена переменных. функции и команды непосредственно в программе.
Функция макроподстановки
&<снмв. псремеииая>[<выр. О]
Превращает содержимое <снмв. пере енной> или мемо-поля непосредственно в объект, который она изображает.
Пример.
а=''model.dbf''
USE &а
Иногда удобно имя файла формировать программным способом, тогда функция & незаменима.
Если имеется несколько однотипных файлов отличающихся номерами: model 1.dbf, model2.dbf, model3.dbf и т. д., то для открытия нужного файла надо выполнить команды:
INPUT 'Укажите номер файла' СО пет && нажать клавишу 3 п = 'model' LTRIM (STR (пот.))
USE &п && выводит на экран mode 13
Аргументом функции & являются вес символы, следующие за & до первого пробела.
Если необходимо составить фразу, содержащу ю кроме макроподстановки и некоторую строку <выр. О, то их соединяют точкой. Если <выр. О уже содержит точку, то их должно быть две.
INPUT 'Укажите номер удаляемого файла' СО пот п = 'model' + LTRIM (STR (пот))
ERASE &п..dbf
При формировании команд с именами файлов, переменных или полей допускается использовать символьные переменные взятые в круглые скобки, то есть:
ERASE (п + '.dbf')
Макроподстановка может применяться и дтя формирования
команд:
INP'JT 'Укажите номер удаляемого файла' ТО пот п = 'ERASE T.cdel' + LTRIM (STR (пот)) + '.dbf'
Ьп
Запрещено формировать команду после символа «&*, поэтому запись:
й'ERASE model' - LTRIM (STR (nom)) + '.dbf'
является недопустимой.
Допускается вложение макроподстановок друг в друга. Общая длина одной макроподстановки не должна превыша 255 символов.
Пр и м е р: команду DISPLAY ALL можно представить
X ='DISPLAY' у ='ALL'
&х &у && пробел обязателен, т.к. он присутствует в команде DISPLAY ALL
либо X ='DISP' у ='LAY ALL'
&х&у
Вычисление результата выражения
EVALUATE(<Bup. О)
Рассматривает <выр. О как некоторую формулу и возвращает вычисленный результат. Эта функция используется только в составе команд и работает очень быстро.
Пример.
? EVALUATE (' 2**3 ' ) , EVALUATE ( ' DATE O')
&& выводит на экран 8, 05-01-94
USE model
? EVALUATE('rame„model')
да выводит на экран Волга
12.11-3. Команда вызова функции без присвоения
=<выр.>[,<выр.>].„
В качестве <выр.> можно использовать как встроенные функции, так и пользовательские функции [12].
Пример.
= CAPSLOCK(True) && эта команда повлечет переход
на верхний регистр
= INKEY{120) && эта команда повлечет паузу в
2 Кинуты.
НЕКОТОРЫЕ ПОЛЕЗНЫЕ ОПЕРАТОРЫ
Оператор комментария
Скоманда | функция | оператор > && < строчной комментарий
В некоторых случаях удобно текст программ снабжать строчным комментарием. Строчный комментарий облегчает чтение программы. Оператор && означает, что далее следует текст-пояснение.
Оператор сравнения
<выр. 1> # <выр. 2>
Если <выр. 2> не входит в <выр. 1>, то оператор возвращает значение «истина* (.Т.).
Комментарий в целую строку
< комментарий >
Комментарий занимает всю строку. Оператор « * * пишется с первой позиции.
Оператор продолжения строки
Наличие символа «;» в конце строки означает, что следующая стРока — продолжите этой строки.
При работе с базами данных информация хранится в таблицах. Просмотр табличной информации в явном виде неудобен. Поэтому информацию из таблицы (или таблиц) извлекают, группируют, сортируют и выводят на экран или бумагу. Под отчетом понимают отформатированную информацию, которая выводится на экран, принтер или в файл. FoxPro позволяет создать несколько видов отчетов:
одностраничный табличный отчет;
многостраничный табличный отчет;
отчет в свободной форме;
почтовая этикетка.
Табличный отчет представляет собой регулярную структуру, которая состоит из произвольного количества однотипных записей. В качестве столбцов (полей) можно использовать физические поля таблицы (или нескольких таблиц) и вычисляемые поля. По желанию пользователя строки могут быть сгруппированы и отсортированы.
Если отчет создан в свободной форме, то информация, принадлежащая одной строке таблицы, может быть размещена на экране или бумаге произвольным способом. В этом случае одна строка занимает весь экран или весь печатный лист.
Почтовая этикетка является разновидностью отчета в свободной форме. На части печатного листа формируют почтовый адрес адресата и адресанта. Затем созданный блок многократно размножают на листе. При этом в каждую почтовую этикетку будет помещен уникальный почтовый адрес адресата (клиента фирмы) ** одинаковый почтовый адрес адресанта (самой фирмы).
|
РРР |
|
А |
|
|
|
|
|
|
- М ,|. |
& V |
£ »*vxv# |
|
. ' Г |
Гг. Л |
i/I- |
J |
|
|
. |
|
<Л< с' |
|
VV |
|
.И* |
|
E3
Fgrni
■
5Я?33
£?
Lsbri.
MiciotuM
Vitud
FonPtb
1
" - '■
В Visual FoxPro создать любой из отчетов можно одним из способов:
Стандартный отчет (Quick Report) — отчет создается по данным одной или нескольких таблиц; в отчет помешаются все поля всех указанных таблиц;
Мастер отчетов (Report Wizard) — отчет создается поданным одной или нескольких таблиц; допускается произвольный выбор полей из указанных таблиц, сортировка и группировка данных, изменение стиля отображения данных;
Конструктор отчетов — при создании отчета любого вида предварительно открывается база данных (проект), для которой надо создать отчет.
Для запуска Мастера отчетов надо выполнить следующее:
На вкладке окна проекта выбрать кнопку Document. Если вкладка Document содержит кнопки управления, то выбрать
кнопку New. Если на вкладке Document кнопок управлений нет, то на экран надо вызвать контекстное меню, из которого выбрать команду New (рис. 13.1).
Эту же процедуру можно выполнить через главное меню Visual FoxPro подав команду File, а в подменю надо указать команду New.
В том и другом случае на экран выводится диалоговая панель New Report (рис. 13.2), где надо выбрать одну из кнопок:
Report Wizard — запускает Мастер отчетов.
Рис. 13.2. Задание способа создания отчета.
New Report — запускает Конструктор отчетов.
New Report |
E3 |
|
|
|
|
... |
|
|
• . V' . |
i_J |
|
Report |
iJew Report |
|
If Canoe? ;| |
|
|
|
. |
|
Wtzatd
Selection
Лгу»
R-«
■<' Wca«J
TTT.
" ".
ШШ
Report
Wizard
i/\
щ
4
ОеяДч'юо:
Столе?
a(£*cut that croup* lecctdt I pie eparert trice locoidj horo i chtd
tabe
:'rA
Рис. 13.3. Выбор способа создания отчета.
После запуска Мастера отчетов надо определить, какие данные из одной или нескольких таблиц будут помешены в соала- ваемый отчет. Для этого в диалоговой панели Wizard Selection (рис. 13.3) надо выбрать одну из команд:
One-to-Many Report Wizard — создание отчета по данным из нескольких таблиц, тогда между таблицам и будут установлены взаимосвязи «один-ко-миогим*.
Report Wizard — создание отчета по данным одной таблицы.
СОЗДАНИЕ ТАБЛИЧНОГО ОТЧЕТА ПО ДАННЫМ
ОДНОЙ ТАБЛИЦЫ С ПОМОЩЬЮ МАСТЕРА ОТЧЕТОВ
В диалоговой панели Wizard Selection надо выбрать команду Report Wizard и нажать кнопку Ок.
Все диалоговые окна Мастера отчетов содержат по пять иголок управления:
Cancel — отказ от построения отчета.
Back — возврат к предыдущему шагу построения отчета;
Next — переход к следующему шагу построения отчета;
Finish — построить отчет по указанным данным;
Help — выводит на экран контекстную подсказку.
На первом шаге Мастера отчетов «Step 1 — Select fields» (рис. 13.4) надо определить имя таблицы, по значениям которой
fwalable
fiotds
)
1
Select
Fetdt Whcb
bcuit do vcuwint rt >>511 teport?
Setectpdatabstewf/eo
Taofcs tern abfeotvrv»,
and
iHen «fed tfe ftekb >юи
wart.
У Entire Fiod |
■МЧ |
|
£ пЬге FiaW |
|
■ ! |
SrCM*n$cUsiy£is;
a
Letter
|Г
Initial
Letter* 3 Initial Letta* • Initial Letter* - Initial Ldtsu
ВУ:Ы -.--.у,...' I
Wh©*
гродгд
V'JKVftj; >>.>;
wart f<y сгоир-fevfi
ГрЗД?
Ccred
{ < j-acfc J
О
roup
д
Int
val
Group-teveJ
held*
I
Ic
2\
Nan»book
зГ
Field. |
! Sum |
Avj * C«nl |
Mir Мех 1 |
IZ.cOfcJl |
|
Meme_book |
Г |
г Т |
г |
Г |
CjtdsI j |
Yeer |
г |
г г |
г |
Г |
|
VaKme |
г |
г г |
г |
Г* % |
|
|
г |
г г |
г |
г- V |
|
^sage |
г |
г г |
г |
г . |
|
$uiam<*y>
Oplioru
Г5"
г-х! $_rvivyy
jgrnttat1,
criy
Г
CafcUiie paocr*
oUoist 1от sum
t*ot««s
ЩШШЯ1Ш
кнопки Summary Options на экран выводится диалоговая панель Summary Options (рис. 13.7).
Для каждого числового столбца (поля) можно задать вычисление следующих итоговых значений:
Sum — вычислить сумму по столбцу;
Avg — вычислить среднее значение по столбцу;
Count — определить количество значений в столбце;
Min — определить минимальное значение столбца;
Мах — определить максимальное значение оголбца.
С помощью кнопок радиогруппы определяется объем итоговых вычислений и область размещения данных. Назначение кнопок:
Detail and Summary — задает область размещения данных, вычисление промежуточных итоговых значений по группам и вычисление итогового значения по столбцу.
Summary Only — задаст область размещения данных и вычисление итогового значения по столбцу.
No totals — задает область размещения данных. Итоговые значе- 1ШЯ не вычисляются.
Значения промежуточных итоговых значений по группам можно отображать в отчете в виде абсолютных значений, тогда флажок Calculate percent of total for sums должен бьпь выключен,
/
Report
Wpmd
|
Siep 3 ■ Chooie Report Style How do you wort yea leper lofcok?
) Сансе) | < 6ac>. j Цех! >
Рис. 13.8. Определение стиля выполнения отчета.
либо в виде процента от обшего итогового значения по столбцу, тогда флажок Calculate percent of total for sums должен быть включен.
На третьем шаге «Step 3 — Choose Report Style» (рис. 13.8) Мастера отчетов определяется один из допустимых стилей выполнения отчета. Задание нужного стиля выполняется выделением соответствующей строки в окне Style.
В специальном окне, расположенном в верхнем левом углу диалоговой панели четвертого шага Мастера отчетов, можно просмотреть внешний вид выбранного стиля исполнения отчета.
На четвертом шаге «Step 4 — Define Report Layout» (рис. 13.9) Мастера отчетов определяется порядок размещения объектов в отчете.
При создании отчета по значениям одной таблицы на этом шаге построения отчета можно определить только ориентацию листа бумаги с помощью радиогруппы Orintation, выбрав одну из кнопок:
Portrait — вертикальное (книжное) расположение листа;
Landscape — горизонтальное (альбомное) расположение листа.
|
Nurobtt J £dumns: |
- Onentelicn |
|
|
1 id |
• <?gorttait : Y~ Landscape |
1 |
|
field -eyotA , <? |
|
|
|
Гь |
|
|
Cancel
<
Cock
JVush
Рис.
13.9.
Задание
внешнего вида отчета.
1йШш
Report
Wizard
Report
Wcaid
:'£step4
• De'rneReportLayout What
kcid of layout dn you want’
.
tnec-AjnnVsyoU BieiieJdaodrt data «e in one cctufwi In a rо/i
tjyoul they ate in one (cm.
You idicck up to i«eo fetds«indwe».
-1 |
|
Voiume |
|
Puce |
|
Visage |
'/j |
|
d |
AvailaSe
hette a
rdw uo
I
'%
-i'w-
-
{
(•
Acsendfto 'Dsecendmg
Selected
fiefcfe
зд8и»>да<1
>^>x«r;\y4v
%
t*A
d
.ЛвЛ
H«to
i
Рис. 13.10. Задание сортировки данных.
Остальные элементы управления, расположеиные на диалоговой панели, не доступны для выбора.
На пятом шаге «Step 5 — Son Records» (рис. 13.10) Мастера отчетов определяется необходимость сортировки данных по одному или нескольким полям таблицы.
В списке Available fields of index tag указаны имена потей, по значениям которых можно выполнить сортировку данных. Если группировки полей (шаг 2) не было, то в этом списке будут пред ставлены имена всех полей таблицы, помещаемых в отчет. Если иа втором шаге Мастера отчетов были заданы имена полей для группировки данных, то имена этих полей в список Available fields of index tag не будут включены. Аналогично шагу 2 Мастера отчетов в списке Available fields of index tag курсором выделяется имя ноля сортировки и нажатием кнопки «Add» пере юсится в список Selected fields. Для удаления имени поли из списка Selected fields его надо выделить курсором и нажать кнопку Remove. Для каждого поля сортировки можнозадать напраатение сортировки, включив одну из кнопок радиогруппы:
Ascending — сортировка по возрастанию значений;
Descending — сортировка по убыванию значений.
На шестом шаге «Step 6 — Finish» (рис. 13.11) Мастера отчетов задастся заголовок созданного отчета и определяется дальней ший режим работы Visual FoxPro.
Текст заголовка отчета пишется в поле ввода Type a title for your report. Дальнейший режим работы с Visual FoxPro определяется включением одной из кнопок радиогруппы Select an option and click Finish:
Save report for later use — сохранить созданный отчет.
Save report and modify it in the Report Designer—сохранить созданный отчет и открыть его заново в Конструкторе отчетов для выполнения модификации отчета.
Save and print report — сохранить и распечатать отчет.
На диалоговой панели размещены два флажка:
Use display setting stored in the database — при включенном флажке для отображения значений полей используются установки, указанные в базе (анных.
Repoil
Wizaid
:;x>*
T
vpe о
We f<« усгх
fcjjoti.
|
Step
6 ■
Frah
.
j
Каталог книг
Yoc
*ve
еаф
tc
cieote
yoiv
mtrort.
roc“i5c<yourfOportn»vH
clekPisvtow
Sdect
on Kilion бЫ
cbck. Fresh 5вЛ
(«put
foi IV« ute f
Snvc (eport erdfl)oify
rr!t»
Repoit Оаедгкг
f~
5a*e ‘•dprrtiopat
f“
U»oj
settings stored »i ‘he dotdboes P
Tifteo T elefa that do not tit
C*>ce<
W
Щ»ИИ1ШМм1|Т| M
мИНИЙЯ
1ТЕЩЮ(И1дрпПЛЮиг1М1ИИ
J
<£*<*
( I E<4»h
&avt*w:r
Рис. 13.11. Сохранение созданного отчета
• Wrap fields that do not fit — при включенном флажке разрешить перенос на следующую строку символов значения полей, если значение не уметается в отведенном размере строки.
Кнопка Preview предназначена для предварительного просмотра созданного отчета перед сохранением на диске. Если созданный отчет не устраивает пользователя, то с помощью кнопки Back можно вернуться назад на один или несколько шагов и исправить отчет.
Нажатие кнопки Finish завершает создание отчета [2].
СОЗДАНИЕ ТАБЛИЧНОГО ОТЧЕТА ПО ДАННЫМ
НЕСКОЛЬКИХ ТАБЛИЦ С ПОМОЩЬЮ МАСТЕРА ОТЧЕТОВ
В этом случае отчет строится аналогичным способом по значениям выбранных полей родительской и дочерней таблин.
Первый шаг «Step 1 — Select Parent Table Fields* Мастера отчетов аналогичен построению отчета по значениям полей одной таблицы. Здесь указывается имя родительской таблицы и опреде-
CATALOG..
Dm
То-Млпу
ftopoit
Wn«d
j
Step з
-
Relate TableT~
•TAM
key_fam
~E3
How doyajwirt to iet*e the two Ubi*s? Select о .ivilchrvj ьей in еекЬ tcble.
J/, '■ ' , /. .• .
Й “—“—reV-'af"
<y. / //-•
' ■ ttrip } Ceocfrl . | чВасК : ' | ■ Ne>&> j Ekttn f
Рис. 13.12. Уточнение взаимосвязи между таблицами.
ляются имена полей родительской таблицы, значения которых надо поместить в отчет.
На втором шаге «Step 2 — Select Child Table Fields» Мастера отчетов аналогичным образом выбираются дочерняя таблица и поля из дочерней таблицы.
На третьем шаге «Step 3 — Relate Tables» (рис. 13.12) Мастера отчетов проверяют правильность установления взаимосвязи родительской и лочерней таблиц. При необходимости можно изменить внешний ключ дочерней таблицы и альтернативный ключ родительской таблицы, указав их в соответствующих раскрывающихся списках.
На четвертом шаге «Step 4 — Sort Records» (см. рис. 13.10) Мастера отчетов аналогичным способом определяют имена полей, по значениям которых надо выполнить сортировку данных, помещенных в отчет.
На пятом шаге «Step 5 — Choose Report Style» (см. рис. 13.8) Мастера отчетов аналогичным способом определяют стиль исполнения отчета.
Шестой шаг «Step 6 — Finish» (см. рис. 13.11) Масгсра отчетов завершает создание отчета аналогичным способом.
СОЗДАНИЕ ОТЧЕТА
С ПОМОЩЬЮ КОНСТРУКТОРА ОТЧЕТОВ
Для запуска Конструктора отчетов в диалоговой панели New Report (см. рис. 13.2) надо выбрать кнопку New Report — экране появится рабочее окно Конструктора отчетов (рис. 13.13).
Г |
Нерон Datmnet |
Report? |
ПР1Е1 |
|
[ё. . ft- • Р . |
|
. . .1»; . .fr..И.. .,Я.. .1'°. В» lia... 1» Ц |
R-t
atCcnircJ
И
ж
Pojwffejcfe»
авгооя
ж
Pdos i-ociw
аоьжд
Рис. 13.13. Рабочее окно Конструктора отчетов и панель инструментов.
Назначение кнопок панели инструментов:
Ш Select Object — указа гель выбора объекта отчета.
A! Label — размещает текст.
и
Field — размещает поле.
Line — рисует линию.
ЕЭ Rectangle — рисует прямоугольник.
О Rounded Rectangle — рисует прямоугольник с закругленными краями.
ЕШ Picture/OLE Bound Control — помещает рисунок в отчет. ■ Button Lock — закрепляет выбор кнопки.
Первоначально рабочее окно Конструктора отчетов содержит три области (полосы):
Page Header — информация, размещенная в этой полосе, распечатывается в начале каждой страницы (верхний колонтитул)
Detail — размещается содержимое полей таблиц или результат вычислений над полями.
Page Footer — информация, размещенная в этой полосе, распечатывается в конце каждой страницы (нижний колонтитул).
Дополнительно могут быть добавлены следующие области:
Title — информация перед основным отчетом: может быть имя отчета, сопроводительное письмо и т. д.
Group Header — информация, используемая при группировке Группы помогают идентифицировать информацию, содержащуюся на каждом уровне группировки.
Group Footer — итоговая информация по группе.
Summary — информация размешается один раз после основного отчета и содержит общие суммы или текст, подводящий итог содержимого отчета.
При создании и редактировании отчета возможны следующие операции:
Задание среды окружения
Под средой окружения понимают набор таблиц из базы данных, по значениям которых будет построен отчет, определение индексов и установление отношений между таблицами. Если с помощью Конструктора отчетов вносятся изменения в существующий отчет, то среда окружения уже задана. Если отчет создастся заново с помощью Конструктора отчетов, то среду окружения надо задать принудительно. Вся информация о среде окружения хранится в фа line описания отчета.
Для задания среды окружения сначала запускают Конструктор отчетов, а затем выполняют одно из действий:
из главного меню подают команду View -» Data Environment;
из контекстною меню выбирают команду Data Environment.
В любом случае на экран выводится диалоговая панель Data Environment (рис. 13.14), куда с помощью команды Add контекстного меню добавляются таблицы. Взаимосвязи устанавливаются буксировкой общих (ключевых) нолей.
>j8ock
labtoi
т!
dslabaw
Add
Рис.
13.15. Определение
состава таблиц.
Add
Т
abf
о>
View
Имя нужной таблицы надо выделить курсором, затем нажать кнопку Add. Если в отчет надо поместить значения полей из таблиц, расположенных в других базах данных или свободных таблицах. то следует воспользоваться кнопкой Other и явно определить место расположения таблиц. Когда все таблицы определены, надо нажать кнопку Close.
Взаимосвязь между таблицами устанааливают буксировкой поля внешнего ключа дочерней таблицы на поле первичного (альтернативного) ключа родительской таблицы.
Для задания полей, значения которых будут помещены в отчет, надо из главного меню подать команду Report -> Quick Report, и на экран выведется диалоговая панель Quick Report (рис. 13.16), где надо определить вариант размещения полей по горизонтали или по вертикали.
Назначение флажков в панели Quick Report:
Titles — при включенном флажке имена полей отображаются над полем, при выключенном — рядом с полем.
Add Alias — при включенном флажке к имени поля добавляется псевдоним таблицы в рабочем окне Конструктора.
Add Table to Data Environment — добавляет таблицу в окружение.
Quick Report
Field
1ац>*
ir-Vrrir;: to
“
■ u
*
“ „•.
Сапой
hdii.
Р Add«fc«
Add table to da'a дгмнхгая
Рис. 13.16. Определение варианта размещения полей в отчете.
Дли помещения полей в отчет надо нажать кнопку Fields — на экране появится диалоговая панель Field Picker (рис. 13.17).
В окне All fields курсором выделяется имя нужного поля и нажатием кнопки Move переносится в окно Selected fields. Назначение кнопки Remove — обратное.
В полосу Page Footer обычно помещают поле с функпиеи DATEO — текущая дата и поле с функцией _PAGENO — номер страницы.
Cancel
|
M |
J |
J! key Jem |
H |
' 3 |
1 key_m |
N |
3 |
I key.ot |
N |
3 |
; name.book |
С |
50 |
j keyjown |
M |
3 |
1 yea |
N |
4 |
volume |
M |
4 |
■Jpnce |
N |
6 |
'
Field
Picker
Catalog
From
iabte
Titfe/SumnAif |
ЯШ -J |
|
|
г jnopw we 1 lulntvrti r’ j- Repot surunay J~ JiirotneybamJ ЯншШШтз» |
1Г s*, a Слпое! |
Рис. 13.18. Добавление полос заголовка и итогов.
В окне Конструктора текст (слово, строка, несколько строк и т. д.) рассматривается как объект. Для размещения текста надо на панели инструментов выбрать инструмент Label, затем в любой полосе курсором мыши указать место начала размещения текста. Набрать сам текст. Если набранный текст выделить как объект, то его можно отформатировать и задать требуемый шрифт.
Для добавления полосы заголовка и полосы итотов надо из главною меню подать команду: Report -» Title/Summary', на экране появится диалотоиаи^анель Title/Summary' (рис. 13.18), где надо включить соответствующие флажки.
Для размещения поля надо на панели инструментов выбрать инструмент Field, затем в любой полосе курсором мыши выделить прямоугольную область, в которую и будет помещено поле. После чего на экран выводится диалоговая панель Report Expression (рис. 13.19), где в окне Expression надо либо ввести с клавиатуры, либо составить с помощью построителя (рис. 13.20), выражение, которое будет определять значение установленного поля. Для запуска построителя выражений используется кнопка @1, расположенная справа от поля ввода Expression. Назначение флажков:
Float — позиция поля в отчете может изменяться при изменении размеров окружающих его полей.
Fix Relative То Top of Band — поле сохраняет постоянную позицию относительно верхней границы полосы.
Fix Relative То Button of Band — поле сохраняет постоянную позицию относительно нижней границы полосы
L*J
БАЗЫ ДАННЫХ 2
Оглавление 4
От автора 6
Справочник команд, операторов и функций 9
... 114
... | 156
I 207
Литература 364
V* П port I xpiettion
Г
.
Cfiinmcri
Fick)
pavbcr
i
СдЫ-уст»
{
JlotWhm
■ I
Рис.
13.19.
Определение
значения вычисляемого поля или поля
подстановки.
'ШЬШс
При формировании выражения поля можно использовать поля открытых таблиц, переменные из списка Variables, строковые, математические, логические функции, а также функции латы и времени. Для подведения итога по всему документу, после напи-
,f Fipiestion Duildot |
r 1 |
Cxprtrwi ПеЮ O'! Rco^t |
|
j|'W
cd
-.-j. К»
.book
К
catalog fcqyjan I catalog kay_n I catalogkey_ot caiaiogname_bock S
catabg kay_towri £ catalog yea
£ catalog,
vdune
сания выражения в окне Expression, следует воспользоваться кнопкой Calculations и определить функцию итога.
Допускается размещение в отчете рисунков и разделительных линий с использованием инструментов Line и Picture
В созданный отчет можно добавить две полосы: Group Header (Верхняя полоса группировки) и Group Footer (нижняя полоса группировки). Для добавления полос надо из главного меню подать команду Report -> Data Grouping.
Как правило, в верхней полосе размешают название (заголовок) группы, а в нижнеи полосе — итоговые суммы по группе.
СОЗДАНИЕ ПОЧТОВОЙ ЭТИКЕТКИ
В некоторых изданиях почтовые этикетки называют многоколонным отчетом. Создают многоколонный отчет по oopajuy отчета и произвольной форме. Затем размечают лист на несколько колонок. Для разметки листа надо из главного меню подать команду File -> Page Setup, на экране появится диалоговая панель Page Setup (рис. 13.21).
'
' Раде
Setup
Р«0*
layout
.
.-I-'-.-
~|
[-Column»-
лж:
Hiorber
|П
Щ
’ -
I
, j Сбгёо
I
VkUK J13Б64-"ej
.1
I , , :Priri'£eW-.
j SpoCtTC-j ^
PltrtOlAf.
*jvl
1 ]
^
.
f
Pir-. «ел-
j
pmlabe рэ£в
LeR
magn jo oca^j' >
Dtnetuwoi.
Cenbmetet»
Поле ввода Number предназначено для определения количества колонок на листе.
В поле ввода Width определяется ширина колонки.
Поле ввода Spacing предназначено для задания промежутка между колонками.
Если включен флажок Printable Расс, то устанашшвается режим печати с нолями страницы, определенными в соответствии с установленным драйвером печати.
Если включен флажок Whole Page, то устанавливается режим печати с минимальными полями.
Переключатель Print Order определяет порядок вывода записей в многостраничных отчетах.
Счетчик Left Margin опреде;шет ширину левого поля отчета [2].
Примеры
П р и м е р I. Создать отчет по данным одной таблицы с помощью Мастера отчетов.
Создать простой отчет по значениям таблицы CATALOG из базы данных PRIMER с помошыо Мастера отчетов.
Запустим Мастер отчетов, выполнив следующие действия.
•
Bepat
Wizaid
Do»ob»c*
aodtdbtes
Bsiep
1 • SekdfKld» 3
Whcti
Felds isjiouwan! r
jjv
»рйГ?
ACCOUNT
AUTCR
CATALOG
E
CUSTOMER В
FAM
ЕЭ
IM
jdectad
MdK
.
PfJaire
book жТ,
-e-
Volume
^
Price
L
fc
'
Surmeiy
Option*
Г
CaJcidal.e
сегсеЗ
d
tcW
/«
№t
JutniKOy
Рис.
13.23.
Задание
вычисления итоговых значений.
• Для вывода итоговых значений по группам и в целом по отчету включите кнопку Detail and Summary' (рис. 13.23).
Нажмите кнопку Ok, а затем — кнопку Next.
На третьем шаге Мастера отчетов определите стиль исполнения отчета. В списке курсором выделите строку Executive и нажмите кнопку Next.
На четвергом шаге Мастера отчетов определите ориентацию печатного листа. В радиогруппе Orintation включите кнопку Portrait. Нажмите кнопку Next.
1 la пятом шаге Мастера отчетов определите сортировку строк отчета внутри групп строк. В списке Available fields or index tag выделите курсором строку Namebook и нажмите кнопку Add. При этом имя поля Name book переместиться в список Selected fields. Направление сортировки задается с помощью кнопок Ascending — по возрастанию, и Descending — по убыванию (рис. 13 24). Нажмите кнопку Next.
На шестом шаге Мастера отчетов в поле ввода Type a title for your report задайте имя отчета — «Каталог книг*. Включите кнопку' Save report for later use. Для предварительного просмотра созданного отчета нажмите кнопку Preview. В результате будет создан трехстраничный отчет. Ды перехода по листам отчета вое
пользуйтссьнавигатором ^1*1 . Выйдите из режи
ма просмотра с помощью кнопки . Нажмите кнопку' Finish.
'/
Report
Wizard
Y«j
troy vM<.\
no to
thtoa
hel.lt tn rwtsxe r
9
Ыер
5
- Sot Records How
do.you went ic sot! th* lecradx?
|
К! |
Pirce |
|
Ve»3* |
|
|
ш |
|
zi |
iviitafcle
I'xMta
пЗсьi
iae
ИФ
1
T.'A3jv
i
<
fienwe |
(*
A^eodna
TWO,*
I
elected ileUe
OjrKri
| < gark j
ДёИ
>
В появившейся на экране .аналоговой панели Save As укажите место хранения файла отчета и укажите имя файла отчета.
П р и м е р 2. Создать отчет по данным из нескольких таблиц с помошью Мастера отчетов.
Создадим отчет по данным таблицы CATALOG (дочерняя) и таблицы FAM (родительская), между которыми ранее устаноаче- на взаимосвязь «один-ко-многим».
Откройте базу данных BOOK и запустите Мастер отчетов (см. пример 1), выделив курсором строку Опе-to-Many Report Wizard в диалоговой панели Wizard Selection.
На первом шаге Мастера отчетов в списке Databases and Tables укажите имя родительской таблицы FAM. Из списка Available fields перенесите поле Namefam в список Selected fields (подробнее см. пример 1). Нажмите кнопку Next.
На втором шаге Мастера отчетов в списке Databases and Tables укажите имя дочерней таблицы CATALOG. Из списка Available fields перенесите поля Namebook, Year, Volume, Price и «Visage» в список Selected fields (подробнее см. пример 1). Нажмите кнопку Next.
На
третьем шаге проверьте правильность
>стаповленной взаимосвязи между
таблицами FAM (родительская)
и CATALOG (дочерняя) по ключу
Key fam. Нажмите
кнопку Next.
На четвертом шаге Мастера отчетов определите сортировку записей отчета по полю Name_fam (подробнее см. пример 1). Нажмите кнопку Next.
На пятом шаге Мастера отчетов задайте стиль исполнения отчета (подробнее см. пример 1).
На шестом шаге сохраните созданный отчет (подробнее см. пример 1).
ПримерЗ. Создать отчет по данным из нескольких таблиц с помощью Конструктора отчетов.
А1 I Data j Documwits
выберите команду Data и на строке имени базы данных Book дважды щелкните левой кнопкой мыши.
AT
able «
Vie»
’
yirr.r
ЙГвИс I Uy.lwi IWMjlT
IOlndt'ti гшт
IM
key Ьо^
kjyjen
WTik*
I neme_rt UJntbci
пгэгсгс
ГгИЬ
Г?
Р
£ddtri*
to daa «rwyimxi
Рис. 13.26. Определение расположения полей на листе отчета
Запустите Конструктор отчетов с помощью команды главного меню File -> New, выберите опцию Report и нажмите кнопку New File.
Определите таблицы, по значениям полей которых надо построить отчет. Для этого из главного меню подайте команду View -> Data Environment. Затем правой кнопкой мыши выведите на экран контекстное меню и подайте команду'Add. Вдиалого- вой панели Add Tabic or View поочередно выделяя нужные таблицы, нажатием кнопки Add поместите их на рабочее поле диалоговой панели Data Environment (рис. 13.25). По окончании выбора таблиц нажмите кнопку Close.
Закройте диалоговую панель Data Environment. Задайте среду окружения, выбрав из главного меню команду' Report -» Quick Report. В диалоговой панели Quick Report определите расположение полей по строкам (левая пиктограмма). Включите все три флажка (рис. 13.26).
Нажмите кнопку Fields и определите значения каких полей надо поместить в отчет. В раскрывающемся списке From tabic выберите имя нужной таблицы, а из списка All fields перенесите имена нужный полей в список Selected fields по правилам, описанным в примере 1 настоящей главы. Поочередно определяя разные таблицы, поместите в список Selected fields все нужные поля (рис. 13.27):
из таблицы FAM — поле Namc_fam;
из таблицы CATALOG — поля Name_book, Year, Price, Volume, Visage.
Шщтышшит |
|
OK j |
Слоев) j |
V
Field
Picker
/'Я jetdtr
SgHrttnHitMs
Femname.fam
Catalog name_book Catalog year Catalog.'volume Catalog piice Catalog
visage
Jkey_f«m
key_im
Як«У_с<
Рис. 13.27. Определение полей, значения которых будут помещены в отчет.
В диалоговых панелях Field Picker и Quick Report нажмите кнопку Ok.
После выполнения описанных выше действий макет отчета будет выглядеть следующим образом (рис. 13.28).
Добавим в созданный маке г полосу заголовка отчета и полосу итогов. Для этою надо из главного меню подать команду Report -» Title/Summarv и в появившейся на экране диалоговой панели Title/Summary включить флажки Title band и Summary band (рис. 13.29).
Тс Report Ocngnci - Deport! |
|
RBBI |
. |
'Ш, 'ms шя dN |
.г . и ь ** а |
I
:
:$*ЯВ
ж г-едеёоом
(
Trtle/Sumneiy
ftejxdUJe
OK
I
Р
littebsnd
Сэпсе*
j
Г
Hww
ряде
Report
suTifrtay
PjjSiXimcry
bjrxt
Г~
&УЭ*
Рис.
13.29. Добавление в отчет дополнительных
полос.
Если на экране отсутствует панель инструментов, то для вызова ее на экран надо из главного меню подать команду View -> Toolbars и в появившейся на экране диалоговой панели Toolbars включить флажок Report Designer.
Для определения заголовка отчета из панели инструментов выберите компонент Label, разместите его в полосе заголовка и введите текст «Каталог книг». Текст «Каталог книг» будет написан шрифтом, заданным по умолчанию. Для изменения шрифта сделайте объект «Каталог книг» активным, то есть щелкните на нем мышью. Активный объект выделяется на экране угловыми маркерами. Для задания шрифта выделенному объекту надо из главного меню подать команду Formal -» Font, а далее по известным правилам. Изменить размеры и положение объекта внутри полосы можно с помощью буксировки.
Для помещения в отчет вычисляемых полей надо выполнить следующее.
Создать объект поле. Из панели инструментов выбрать компонент Field и установить его внутри любой полосы. Например, фамилию, имя и отчество автора поместим в одно поле отчета. В полосе «Detail» сдвинем все объекты полей вправо. Разместим компонент Field в левой части полосе Detail. В появившейся на экране диалоговой панели Report Expression в поле ввода Expression заладим выражение для сцепления полей Namefam, Nameim и
Name_ot, воспользовавшись кнопкой ■ . В раскрывающемся списке String выделим курсором имя функции ALLTRIM и и двойным щелчком мыши поместим ее в поле ввода Expression.
'
Expiet
ion Duitder
ExtrtCMxxtlui
Fold cn Report
Рис.
13.30.
Задание
вычисляемого поля.
В качестве аргумента функции ALLTRIM зададим имя поля Namefam, которое выбираем из списка Fields аналогичным способом. Знак «+» вводим с клавиатуры. По окончании составления выражения надо нажать кнопку Ok (рис. 13.30).
R«poi1 Oettgrtei Перш 14
Г
I
Каталог книг
И.О.
с»
тор
a Hat book
1
Геи,
ptag
feet 1».?.мв^
Inaio^booK
TE(J_
■ Ш 1
Л. PoecfertM
Нерон
Designer
-
Hepat4
•
F
И?»
Е3|
Каталог
книг
ttuun
Я.О.
«море
Иеаиг_ЬооК
Year
Price
VolAO
Гоголь
Николай Васильевич
Ревизор.
Нертвие дули.
1977
1
.CD
"I
H
Путалин
Александр Сергеевич
Избранное
1975
1.С2
sV-
Короленко
Влаликю
Повести
и рзссхазк.
1953
l.CC
M
-
Аксенов
Сергей Тжофеевхч
Избралвое
1975
1.15
56
See
Рис.
13.32. Отчет «Каталог книг».
Аналогично в полосе Title сдвинем все объекты заголовков столбцов. Разместим новый компонент Label и зададим заголовок для вычисляемого поля — «Фамилия И. О. автора». При необходимости можно изменить шрифт заголовка.
После выполнения описанных действий макет отчета будет выглядеть как на рис. 13.31).
Как видно из макета отчета, имена столбцов отчета (колонок) могут быть написаны буквами русского алфавита.
Перед сохранением отчета на диске, его можно просмотреть на экране. Для этого надо, находясь на диалоговой панели Report Designer, правой кнопкой мыши вывести на экран контекстное меню и выбрать команду Preview (рис. 13.32).
Внешний вид созданного отчета полностью зависит от установленных взаимосвязей между таблицами (см. рис. 13.25).
При закрытии диалоговой панели Report Designer на экран выводится сообщение о необходимости сохранить созданный отчет. После нажатия кнопки Yes в появившейся на экране диалоговой панели Save As надо указать место хранения файла отчета и задать имя файла отчета.
П р н м е р 4. Создать многоколонный отчет по данным из нескольких таблиц.
Г' П |
|
3r»cldf |
Л I 1 — |
name_fem |
J |
C&ntoces |
|
rvame |
|
fan |
|
|
|
iH tekJt |
-4 |
II И.т |
|
1 nan> im // |
|
| Iflb'XJexer |
|
j! Im |
|
■I j name |
-J |
1 |
|
O'nldt |
d |
key.ol |
|
IMroe.Ot |
|
(Bndexos |
§j |
7 d |
|
палю |
|
■ ■ |
Рис. 13.33. Определение таблиц, по данным которых будет построен отчет.
Предположим, что постоянным покупателям фирмы надо разослать новый каталог книг. Посгупим аналогично предыдущему' примеру. Многоколонный отчет будем строить по данным трех таблиц (рис. 13.33).
■•ЛИП
ИНДИИ—*»
к..
I»;
gwffifcl
и ШМИД
-L р :р...
л.
т
ndex
=L
toiTTi «пав» tovn_
■dees
cust.
Мге«_ош1 oast
jl. D«4arf
“ (datbj >
a V'sgtfmUt
IvOMJ'
I
патв_сиЛ_
.
Рад» Не
[
КуДаТ" Inde^^TZccm^^Iai
пе
town_
яатв
street | |дАу1 сил |
Црапл
>_j
Я
mmm
/1
/./. 777/Л
Гif
сип,
natne
Jam}—
" "+ A
/.
■к. Рад» ?rit«
Рис. 13.35. Уточненный макет многоколонного отчета
Размещение нолей на листе отчета надо задать по столбцам (рис. 13.26 правая кнопка мыши). Начальный вид макета отчета приведен на рис. 13.34.
Выделяя каждый объект-поле, отбуксировать его в нужное место отчета и задать нужный тип и стиль шрифта. Оставим на листе отчета только нужные заголовки полей, написай их буквами
;;
Р«уе
Setup
Pi<>9
ItgctA
Pmt«ea
Г7
Pro(»b«
l<*/>
Г
WTobpaoe
.
|»гч
.
Lbftirv**!
j icoa^j Dcrxsr&ioox
Ccrbfoeto*».
J
MurtJ
\2 ^ ? ,
,
с«х<»
!
v/K»b
1.163+:
ч
5lvr
r>j I uQu
Куда : mill Россия Абакам
Куда
:
117092
Россия АЬлар
Аксакова
ул д. 3-А
Кому
: ООО
"МихроЫы
*
ToJWKOurxutl
Огдаиом
Коржаяим Нави Игоревич
Куда : ЗЩ734 Россия Таганрог
Абрикосоаский ncp. д. 2 коря.4
KoMV '.АО "Русскийляс’
Дроздов Владимир Еорисович
КуДЯ t 456231 Россия Моасаа
Автомоторная ул 6.1 стр.З
Кому : ЗА О "Скопа"
Некрасов Николай Александрович
Куда
:
191234
Россия Можайск
Рис. 13.37. Фрагмент многоколонного отчета
русского алфавита. Добавим вычисляемое поле и разделительные линии. Уточненный макет отчет приведен на рис. 13.35.
Для задания печати па одном листе нескольких почтовых этикеток надо из главного меню подать команду File -> Page Setup и задать свойства в соответствии с рис. 13.36.
Далее выполним предварительный просмотр и сохранение на диске созданного многоколонного отчета. Результат работы представлен на рис. 13.37.
Контрольные вопросы
Что такое отчет?
Какие виды отчетов можно создавать в среде Visual FoxPro?
Какие способы создания отчетов имеются в среде Visual FoxPro?
Назовите преимущества и недостатки использования Мастера отчетов.
Назовите преимущества и недостатки Конструктора отчетов.
Расскажите как создать вычисляемое поле в отчете.
Как изменить начертание шрифта в отчете?
Что называют объектом при создании отчета?
Как объект сделать активным (пассивным)?
Как вывести на экран панель инструментов?
Что называют окружением при создании отчета?
В каких случаях окружение задается автоматически?
Какие действия можно выполнить над активным (пассивный) объектом?
Назовите имена и назначение основных полос при создании отчета.
Назовите имена и назначение дополнительных паюс отчета.
Как задать дополнительные полосы при создании отчета?
Как задать таблицы, но данным которых будет построен отчет?
Как запустить Мастер отчетов?
Как запустить Конструктор отчетов?
Как задать несколько колонок при создании многоколонного отчета?
Как задать вычисление промежуточных итогов н Мастере отчетов?
Как задать вычисление промежуточных итогов в Конструкторе отчетов?
Как задать группировку данных в Конструкторе отчетов?
Как вызывается на экран контекстное меню при работе с различными диалоговыми окнами?
Назовите отличия при задании заголовка отчета при работе с Мастером и Конструктором отчетов.
ПРИЛОЖЕНИЕ
Компакт-диск содержит примеры к главам учебника. В каталоге GL-Ои хранятся примеры главы и. Каждый файл каталога имеет название Ехтр_0А_0/я, который означает, что это пример номер т главы к.
Литература
Лгалъиов В. II. Примерная программа диспнп.1>шы. «Базы шны - М.. Издательский отп'л llVlllCnO. 1998,16с.
Каратыгин С, Тихонов А, Тихонова Л. Visual FoxPro 6.0. Полное руководство пользователя с ирииершнн. М.. Бином. 2000. ~В4с.
НэМок Р., Петерсен Д., ТалмейОж. Vn ч1 FoxPro 6. Pajpaftor а корпоративных лрюижемй. М., ДМ К, 2000,392 с.
Ьаш I V., Использование Visual FoxPro 6 ГПо БХВ — Петербург, 2000.928 с.
Горев А, Ахали Р., Мскашарипов С Эффективная работа с СУБД СПб.. Питер, 1997,704с.
ОмевьченкоЛ. Самоучитель Visual FoxPro 6.0 СПб, БХВ— Петербург, 2000,512 с.
Каратыгин С., Тихонов А., Тихонова Л. Работа в Visual FoxPro к примерах. Vi., Бином. 1995,312с.
С" _№ Ч. Visual FoxPro для профессионалов. М., ЭНТ1 ОН, Киев, ВЕК+, 1999,
576 с.
Гончаров A FoxPro па примерах СПб.. Питер, 1995,160с.
Смирнов А А Разработка прикладного программного обеспечения в среде FoxPro for WINDOWS Учсбис ; пособие М., Моск. Гос. Уи-тэкономики, статистики н информатики. 1997,93 с.
Кузьменко В. Г Системы управления Г зами данвп. Учебное пособие. VI.. Изд во VI И. 1977.73 с.
ПсповА А Программирование в среде СУБД FoxPro 2.0 М., Радио и связь. 1994, 352 с.
Диго С. Л/. П юектировани н кснслыование баз данных. М.- Финансы и сытпсгакь, 1995.
Учебно* t* Or "Ur
Ага.шюв Виктор Петрович
БАЗЫ ДАННЫХ
Злв. редакцией Т. Г. Хохлова. Ведущий редактор АЛ А Никитина.
Главный художник В. /Л Григорьев. Художник П. Инфантэ. Корректор Г. И. Кштина. Оригинал-макет подготовлен £. В. Денюковой.
Подине шо в печать 14 06 2002. Формат 60x88 1/16. Булата офсетная К« I. Лечат офсетная Гарнитура Newton ' Печ л 23.5. Уел леч. я. 23.03. Уч.-изд. я. .892. Изд №69828. Тираж 3000 экч Заказ 3664
Издагс юствоиМнр»
Министерства РФ по делам печати, телерадиовещания и средств массовых коммуникаций. 107996. ПСП-6, Москва. 1-й Рижский пер.. 2
Диапгспттивы изготовлены в издательстве «МИР»
Отпечатано с готовых диапозитивов в ФГУП «Производственно-издательский комбинат ВИНИТИ»,
140010, Г , 1юберцы Московской обл.. Октябрьский пр-т. 403. Тс- 554-21-86
* Описание LIGHTBAR-меню
0 11,10 Prompt 'с начала'
0 12,10 PROMPT 0 13,10 PROMPT 0 14,10 PROMPT MENU TO OTV
Обработчик выбора пользователя из DO CASE
CASE OTV=l GO TOP
* Описание п дчикенного меню для пункта File
горизонтального меню.
Пунктами подчиненного меню заданы имена файлов из
каталога FOX_jAUTO
DEFINE POPUP Fie PROMPT FILES LIKE;
E:\PRIMER ,*.dbf
• добавление области,
перемещение области,
удаление области.
Процесс создания табличного отчета состоит из следующих этапов:
определение окружения;
размещение текста;
размещение полей;
размещение линий, прямоугольников и рисунков;
перемещение объектов;
сохранение отчета.
• Для подсчета общего количества листов в одном экземпляре всех изданий на пересечении строк Volume и Sum щелчком мыши установите «итичку».
Для подсчета средней цены одного экземпляра книги установите «птичку» на пересечении строк Price и Avg.
1 Строки
FOR i=l TO 15
*
? inmm<i#l), mmm(i,2) ENDFOR
2 Открываем базу данных PRIMER, подав из главного меню команду File -» Open, на диске открываем каталог PRIMER, выделяем курсором имя файла Primer.pjx и нажимаем кнопку Ок.
Запустим Мастер отчетов, выполнив следующие действия: из главного меню подаем команду File -> New и в появившейся на экране диалоговой панели New выбираем кнопку' Report из радиогруппы File Туре. Затем нажимаем кнопку Wizard. В появившейся на экране диалоговой панели Wizard Selection курсором выделяем строку Report Wizard и нажимаем кнопку Ок.
На первом шагс Мастера отчетов надо выполнить следующие действия.
Проверить, что в раскрывающемся списке Databases and Tables утсазано имя базы данных BOOK. Если в раскрывающемся списке указано имя другой базы данных, то откройте список и укажите имя базы данных BOOK.
Рис. 13.22. Определение таблицы и задание полей для отчета.
В расположенном ниже раскрывающегося списка Databases and Tables окне выделите курсором имя таблицы CATALOG. При этом в списке Available fields будут указаны имена полей. содержащихся в таблице CATALOG.
По очереди выделите курсором имена полей: Namebook, Year, Volume, Price, Visage и с помощью кнопки «стрелка вправо» перенесите, по очереди, указаные поля в список Selected Fields (рис. 13.22). Нажмите кнопку Next.
На втором шаге Мастера отчетов задайте группировку записей по значениям поля Year. Для этого курсором выделите строку Year. Для задания расчета итоговых значений нажмите кнопку Summary Options и в появившейся на экране диалоговой панели Summary Options выполните следующие действия.