Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SREDNEE_PROFESSIONAL_NOE_OBRAZOVANIE.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.86 Mб
Скачать
  • 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

    Keyzakaz

    >Ч_сш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>),...] )

    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 О катает пустое значение.

    Из Главного меню подают команду File —► Open и на экран выводится диалоговая панель Open (рис. 2.6), где указывается имя таблицы и место се хранения.

    50 Глава 2

    1. РЕДАКТИРОВАНИЕ ТАБЛИЦЫ

    Команда 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, в каждое из которых будет помещена своя табли ца. Количество одновременно открытых окон BROWSE также за' висит от версии FoxPro.

    Команда 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).

    Установить режимы Browse и Edit можно несколькими сп бами.

    ц 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 ,Ucehy

    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 _

    Для перемещения по таблице также можно использовать ко­манду Главного меню Table -* Goto и в появившемся на экране подменю выбрать одну из команд:

    переход на первую запись таблицы; переход на последнюю запись таблицы; переход на следующую запись таблицы; переход на предыдущую запись таблицы; переход на запись с указанным номером.

    Н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.

    1. ДОБАВЛЕНИЕ НОВОЙ ЗАПИСИ

    В FoxPro новая запись добавляется в конец таблицы. Можно ЛЯ бавлятъ как одну, так и несколько записей. Предварител^Ш открывают табличный файл, а затем одним из способов пода*0'* команду добавления записи. I

    РАБОТА С ТАБЛИЦАМИ 59

    а с помощью команд: в окне Command подают команду APPEND.

    6. С помощью Главного меню.

    Из Главного меню подают одну из команд:

    fable -> Append New Record — для добавления одной записи.

    Table -> Append Mode — для добавления нескольких записей.

    При подаче любой из команд на экран выводится окно BROWSE в режиме Edit (см. рис. 2.8), которое содержит пустой шаблон записи. Если надо установить режим Browse, то из Глав­ного меню следует подать команду View -» Browse.

    1. УДАЛЕНИЕ ЗАПИСИ ИЗ ТАБЛИЦЫ

    В 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ая освободившееся место.

    1. МОДИФИКАЦИЯ СТРУКТУРЫ ТАБЛИЦЫ

    Модифицировать можно текущую таблицу, при этом из сущееД вующей структуры можно удалить ненужное поле (поля), доба­вить в структуру новое поле (поля), изменить характеристики су­ществующих полей. При изменении характеристик существую­щих полей возможна потеря информации в некоторых случаях. Например, если тип поля изменяется с Character на Numeric, или при уменьшении размера поля и т. д.

    Из окна Command надо подать команду MODIFY STRUC­TURE. Вес команды в Visual FoxPro можно подавать в сокращен­ном варианте написания, указывая не менее четырех букв of каждого слова имени команды, например MODI STRU. В резуль­тате на экран выводится диалоговая панель Table Designer, опи­санная ранее (см. рис. 2.2). Изменения структуры проводятся щ описанным выше правилам с использованием приемов текстовых! редакторов. С целью избежания потерь информации рекоменду! ется перед применением команды MODIFY STRUCTUREсделаш резервную копию таблицы.

    1. СОЗДАНИЕ ФАЙЛА БАЗЫ ДАННЫХ

    Создавать и работать с табличным файлом можно как с независи­мым объектом, хранящимся внутри каталога, так и как с частью базы данных. Для того чтобы таблица была частью базы данный надо либо сначала создать файл базы данных (или открыть фай! базы данных), а затем создавать таблицы (описанными вышеко-1 мандами), либо специальными командами в открытый файл бааЯ данных поместить (добавить) ранее созданные таблицы. ЕсДЯ файл базы данных создан, то создаваемая база данных будет редИ ционной. В противном случае база данных не реляционная.

    Создать файл базы данных можно несколькими способамИ-Я

    а. С помощью команд.

    В окне Command надо подать команду:

    CREATE DATABASE [ <нмя базы данных> | ? ]

    Команда создает базу данных и делает ее текущей (открытой Если указана опция «?» или опции не указаны вообще, то на экрЩ выводится диалоговая панель Create, где в специально.м о» представлены имена имеющихся баз данных, и в поле ввода Елд database можно задать имя создаваемой базе данных.

    g С помощью Главного меню.

    Из Главного меню надо подать команду: File -> New, тогда на н выводится диалоговая панель New (см. рис. 2.5), где в ра- Э .огруппс File Туре надо включить кнопку Database и нажать кнопку New File, тогда на экран выведется диалоговая панель Create, работа с которой описана в пункте а.

    в. С помощью графического меню.

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

    База данных, созданная любым способом, становится теку­щей (открытой). Файл базы данных имеет расширение .DBC.

    1. ОТКРЫТИЕ БАЗЫ ДАННЫХ

    Для открытия базы данных надо из Главного меню подать коман­ду File -> Open или в графическом меню нажать кнопку Open, на экран выведется диалоговая панель Open, где надо указать имя базы данных и место се хранения. В результате работы команды Open на экран выведется диалоговая панель Database Designer (рис. 2.10).

    РИс ^

    "1 Диалоговая панель открытой базы данных.

    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

    «у*»

    ^ Освобождение (или удаление) таблицы.

    После нажатия одной из кнопок (Remove или Delete) надо подтвердить (или отменить) выбранное действие нажатием

    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) в появившемся на экране новом запросе.

    1. ВЫВОД ЗАПИСЕЙ ТАБЛИЦЫ НА ЭКРАН

    В окне 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 выводит ^формацию потоком, без пауз.

    1. ЗАКРЫТИЕ ФАЙЛОВ

    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 — закрывает процедурный файл.

    а с от ~ закрывает все таблицы в текущей базе данных,

    зы ~ все таблицы во всех базах данных. Если все ба-

    ь® закрыты, то закрывает все свободные таблицы.

    1. УПРАВЛЕНИЕ СТАТУС-СТРОКОЙ

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

    Для вывода статус-строки на экран надо в окне Command по­дать команду SET STATUS ON.

    Для удаления статус-строки с экрана надо подать ту же коман­ду с параметром OFF.

    1. УСТАНОВКА ТИПА ДАТЫ

    В FoxPro предусмотрены несколько типов дат, которые устанав­ливаются с помощью команды: SET DATE <тип даты>

    Аргумент <тип даты> может содержать одну из констант:

    AMERICAN — американский тип даты мм/дд/гг ANSY — тип даты ANSY гт.мм.дд BRITISH — английский тип даты дд/мм/гг GERMAN — немецкий тип даты дд.мм.гг ITALIAN — итальянский тип даты дд-мм-гг

    Если необходимо установить написание года четырьмя циф рами, то надо подать команду SET CENTURY ON.

    Для написания номера года двумя цифрами надо подать ту же команду с параметром OFF.

    В приложениях формат даты определяют либо в начале про граммного файла, либо в файле Config.fp.

    1. УПРАВЛЕНИЕ РЕДАКТИРОВАНИЕМ ТАБЛИЦЫ

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

    а. Команда установки текущего каталога SET DEFAULT ТО Сполное имя каталога>

    б. Команда задания альтернативных путей поиска SET PATH ТО [<список путей поиска>].

    Если требуемый файл не найден в текущем каталоге, то поиск файла продолжается в каталогах, указанных в Сспнсхе путей поисках

    в. Команда управления курсором SET CONFIRM ON

    Команда включает автоматический перевод курсора в следу­ющее поле после нажатия клавиши ENTER. Если после нажатия клавиши ENTER курсор должен оставаться в том же поле, то в этой команде следует указать параметр OFF.

    г. Команда подачи звукового сигнала SET BELL ON

    При наборе текста вслепую надо знать, была ли нажата клави­ша или нет. После подачи этой команды каждое нажатие клави­ши сопровождается звуковым сигналом. Для отмены звукового сигнала надо в этой команде указать параметр OFF.

    д. Управление выдачей системных сообщений SET TALK ON | OFF

    Если установлена опция ON, то на экран выводятся систем­ные сообщения о выполнении некоторых команд и многих фун­кций FoxPro. Если установлена опция OFF, то системные сооб­щения на экран не выводятся.

    1. ПРИМЕР

    Создадим базу данных, рассмотренную в примере гл. 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. В появившемся на экране списке имен таб­лиц курсором выделим имя нужной таблицы и нажмем кнопку Ок. Эту процедуру надо выполнить для каждой таблицы.

    1. Контрольные вопросы

    1. Для каких целей создают таблицу?

    2. Назовите способы создания таблицы.

    3. Назовите два способа представления данных из таблицы на экране. Как задать каждый из способов представления данных?

    4. Какой командой добавляется новая запись в табличный файл? В ка­ком месте таблицы располагается добавленная запись?

    5. Назовите особенности удаления записи из таблицы.

    6. Укажите преимущества и недостатки двухэтапного удаления записи.

    7. Что такое модификация структуры таблицы и в каких случаях она применяется?

    8. В каких случаях возможна потеря информации при модификации таблицы?

    9. Какие характеристики поля надо указать при создании или модифи­кации таблицы?

    10. Назовите два способа открытия таблицы.

    11. Каким способом производится предъявление на экран таблицы?

    12- Какая команда выводит на экран сведения о текущей таблице?

    13. Сколько таблиц можно открыть одновременно и как они будут рас­полагаться в оперативной памяти?

    И- Что такое рабочая область и ал нас рабочей области?

    15- Какая команда используется для редактирования таблицы?

    1®- Как задать в команде BROWSE вывод на экран определенных полей таблицы?

    12- Как задать в команде BROWSE ограничения на значения поля?

    Как задать в команде BROWSE логическое условие на значение поля?

    Как задать в команде BROWSE вывод на экран заголовка столбца таблицы буквами русского алфавита?

    1. Как задать в команде BROWSE вывод на экран заголовка таблиц буквами русского алфавита?

    2. Как задать в команде BROWSE синхронную и асинхронную связь между половинами разделенного окна BROWSE?

    3. Как запретить в команде BROWSE редактирование записей, добав­ление записей, модификацию структуры табличного файла, удале­ние записей?

    4. Объясните назначение файла базы данных.

    5. Укажите команды для создания и открытия файла базы данных.

    6. Укажите команды для помещения таблицы в файл базы данных.

    7. Укажите команду для освобождения таблицы из файла базы данных.

    8. Укажите команду для вывода на экран отдельных записей из таб­лицы.

    9. Какие типы дат используются в FoxPro? Как установить желаемый тип даты?

    10. Какая команда задает текущий каталог?

    11. Какая команда запрещает (разрешает) вывод на экран системных сообщений?

    Глава 3

    ИНДЕКСИРОВАНИЕ БАЗ ДАННЫХ

    Если записей в таблице много, то найти нужную запись бывает очень трудно. Поиск данных производится методом перебора, то есть просматриваются все записи таблицы от первой записи до последней записи, что приводит к большим затратам времени. Чтобы облегчить поиск данных в таблице, используют индексы. Индекс, иногда его называют указатель, представляет собой поряд­ковый номер записи в таблице. Индекс строится но значениям од­ного поля или по значениям нескольких полей. Индекс, построен­ный по значениям одного поля, называется простым, а по значени­ям двух и более полей — сложным. Во время построения индекса записи в таблице сортируются по значениям поля (или нолей) будущего индекса. Затем первой строке таблицы присваивается индекс номер один, второй строке — индекс номер два и т. д. до конца таблицы.

    Как простой, так и сложный индекс имеют свой тип (Туре). Первичный (Primary) индекс (ключ) — это тюле или группа по­лей, однозначно определяющих запись, то есть значения первич­ного индекса уникальны (не повторяются). В реляционной базе Данных каждая таблица может иметь только один первичный ключ. Внешних ключей у таблицы может быть много и они будут иметь один из типов:

    • Candidate — кандидат в первичный ключ или альтернатив­ный ключ. Он обладает всеми свойствами первичного ключа.

    • Unique (уникальный) — допускает повторяющиеся значе­ния в поле, по которому он построен, но на экран будет вы­водиться только одна первая запись из группы записей с одинаковым значением индексного поля.

    • Regular (регулярный) — не накладывает никаких ограниче­ний на значения индексного поля и на вывод записей на эк­ран. Индекс только управляет порядком отображения запи­сей. Эго наиболее популярный тип индекса.

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

    Построенный индекс хранится в специальном индексном файле. Если индексный файл хранит только один индекс, то он называется одноиндсксным и имеет расширение .idx. Индекс­ные файлы, которые хранят много индексов, называются муль- тииндексными и имеют расширение .cdx. Каждый индекс, кото­рый хранится в мультииндексном файле, называется тегом. Каждый тег имеет свое уникальное имя.

    Мультииндексныс файлы бывают двух типов: просто мульти- индексные файлы (о них рассказано выше) и структурные мульти- индексные файлы. Структурный мультииндексный файл имеет одинаковое имя с таблицей, которой он принадлежит (отличие только в расширении файла), и обладает следующими свойствами:

    • автоматически открывается со своей таблицей;

    • его нельзя закрыть, но можно сделать не главным.

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

    1. СОЗДАНИЕ ИНДЕКСА

    Создать индекс можно двумя способами.

    а. С помощью команды:

    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 указано имя таблицы, из которой берутся поля для построения индекса. При желании можно заказать любую таблицу из текущей базы дан ных и для по­строения индекса взять любое поле.

    1. ОТКРЫТИЕ ИНДЕКСНОГО ФАЙЛА

    Открыть индексный файл можно только в том случае, если ранее открыт соответствующий табличный файл. В противном случае будет выдано сообщение об ошибке. Для открытия индексного файла надо подать команду:

    SET INDEX ТО [список индексных файлов]

    [ORDER <BupN> | <|(1х-файл>|[ТАС<имятега>] [ОЕ<сйх-фаИи>]1 [ASCENDING | DESCENDING]

    [ADDITIVE]

    Назначение опций такое же, как в командах USE и INDEX ON.

    Открыть существующий индексный файл можно одновре менно с открытием табличного файла командой USE (см. п. 2.1 «Открытие таблицы»).

    Для закрытия всех индексных файлов надо подать одну из ко­манд: либо SET INDEX ТО без опций, либо CLOSE INDEX.

    1. ЗАМЕНА ТЕКУЩЕГО ИНДЕКСА

    Для каждой таблицы одновременно может быть открыто не­сколько индексных файлов, но текущим (активным) будет толь­ко один индекс. По умолчанию принято, что текущим будет пер­вЫй по порядку индекс в том индексном файле, имя которого указано первым в списке имен индексных файлов команды 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, переместив строку описания нужного ин­декса на первое место.

    1. ПЕРЕСТРОЙКА ИНДЕКСНЫХ ФАЙЛОВ

    При внесении изменений в большие таблицы тратится много времени, так как при внесении каждого изменения заново пере­страиваются все открытые индексные файлы. Для экономии времени индексные файлы закрывают и вносят изменения в таб­лицу. Однако в этом случае возникает несоответствие между об­валенной таблицей и индексными файлами. Дтя устранения Указанного несоответствия надо заново перестроить индексные Файлы. После открытия всех индексных файлов, принадлежа- рйх измененному табличному файлу, надо подать команду ‘‘EINDEX. Команда действует на все индексные файлы, откры- в текущей рабочей области. Переиндексирование можно

    также выполнить, подав из Главного меню команду Table Rebuild Indexes.

    1. ПРЕОБРАЗОВАНИЕ ОДНОИНДЕКСНОГО ФАЙЛА В ТЕГ ,

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

    COPY INDEXES <имсна Idx - файлов> | ALL [ТО <cdx - файл>]

    Опция ALL указывается в том случае, если надо скопировал! все одноиндсксные файлы. При этом список имен <ичсна idx- файлов> не указывается. Тегам присваиваются имена одноин- дексных файлов. При копировании нескольких одноиндексньА файлов их имена перечисляются через запятую. Если опция TO J опущена, то одноидексныс файлы копируются в текущий мул ь-J таиндексный файл. Если опция ТО содержит имя нссушествД ющего мультииндексного файла, то он создастся.

    Допустима и обратная операция, то есть один тег прсобразЯ ется (копируется) в одпоиндексный файл с помощью ко.мандьЗГ

    COPY TAG <список имея тегов> {OF <cdx - файл> ] ТО <idx - файл>]

    Предварительно мультииндексный файл должен бьггь otJ крыт. Можно скопировать отдельные теги, указав Ссписокимен тегов>, либо все теги, используя опцию ALL.

    1. Удаление тега из мультииндексного файла

    Удалить один тег или все теги из мультииндексного файла, о( крытого в любой рабочей области, можно с помощью командмЦ

    DELETE TAG <имя тега 1> [OF <нмясс1х-файла>]

    [,<нмя тега 2> [OF <имя сс1х-файла> ] ] ... |

    ALL [OF <нмя сйх-файла> ]

    Одной командой можно удалить теги, находящиеся в разнЫ^ мультииндексных файлах.

    1. Вывод на экран имен индексных файлов и имен тегов

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

    NDX(<Bup.N> [,<номср рабочей области | псевдоним рабочей областн> ])

    Функция возвращает имена открытых одноинасксных фай­лов.

    CDX(<Bnp.N> [,<номср рабочей области | псевдоним рабочей обдастн> ])

    Функция возвращает имена открытых мультиплексных фай­лов.

    MUX(<Bup.N> [,< номер рабочей облает | псевдоним рабочей области> ])

    Функция возвращает имя структурного мультииндсксного файла.

    Во всех функциях <выр.1Ч> — порядковый номер индексно­го файла, имя которого должна вернуть функция.

    ТАС([<имя сйх-файла> , <выр.!\'> [, <номер рабочей области | псевдоним рабочей области> ])

    Функция возвращает для указанного <имя «1х-файла> муль- тииндексного файла имя тега <Bbip.N>, заданного порядковым номером. Если <имя cdx-фaйлa> опущено, то по умолчанию подставляется имя текущего мультииндексного файла.

    1. Примеры

    Пример 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

    1. Контрольные вопросы

    1. Что такое индекс?

    2. Что такое индекс простой и индекс сложный?

    3. Объясните разницу между уникальным и регулярным индексами.

    4. Объясните разницу между одноиндексным и мультииндексным файлами.

    5. Укажите особенности структурного мультииндексного файла.

    6. Что такое тег?

    7. Укажите два способа создания индекса.

    8. Что значит индекс, построенный по возрастанию или по убыванию?

    9. Укажите два способа открытия индексного файла. Как открыва структурный мультиндексный файл?

    до. Что значит текущий индекс? Как сделать индекс текущим0 ц. Для каких целей используется перестройка индексных файлов? Какой командой выполняется перестройка индексных файлов?

    1. Как удалить тег из мультииндексного файла?

    2. Укажите команды для вывода на экран имен индексных файлов и имен индексов (тегов) внутри индексного файла.

    Глава 4

    УПРАВЛЕНИЕ БАЗАМИ ДАННЫХ

    Как правило, база данных состоит из нескольких таблиц. Чтобы получить полную информацию об одной сущности, надо прочи­тать запись во всех таблицах базы данных. Между' таблицами могут бьггь установлены взаимосвязи (см. гл. 5), что существенно облегчает работу с такой базой данных. Нели таблицы разроэне-1 ны, то возникают дополнительные проблемы по управлению такими таблицами (совмещение курсоров, обеспечение достовср- I ности, представление данных и т. д.).

    Базы данных могут содержать очень большой объем инфор­мации — до нескольких миллионов записей. На поиск нужных данных в таких таблицах уходит много времени. Поэтому предус- • мотрены специальные методы и команды для работы с базами данных.

    1. Часто употребляемые опции команд foxpro

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

    FIELDS — указывает на то, что команда при своей работе использует только тс поля, имена которых перечислены в списке.1 FOR и WHILE — указывают на то, что команда будет применена только к тем строкам таблицы, для которых истинны соответст-! вующие логические условия (<выр L>).

    SCOPE — определяет записи по их физическому номеру, для ко­торых будет применена команда. Сама опция (слово) SCOPE не пишется, а указываются уточняющие параметры:

    ALL — команда действует на все записи таблицы. Параметр задан по умолчанию.

    NEXT <число> — команда действует на заданное <число> записей, считая от текушей записи

    RECORD <номер> — команда действует на запись с указан­ным номером. Параметр используется редко, так как трудно узнать физический номер записи.

    REST — команда действует на все записи, начиная от теку­щей записи до конца таблицы.

    NOOPTIMIZE — отключает использование технологии Rushmore для ускоренного доступа к данным.

    При работе с большими базами данных до 90% времени тра­тится на обработку опций FOR и WHILE. При обнаружении этих опций автоматически подключается технология Rushmore, кото­рая для своей работы использует индексы, построенные по по­лям, имена которых указаны в опциях FOR и WHILE. Поэтому технология Rushmore ускоряет доступ к данным при выполнении операций поиска.

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

    1. Сортировка данных

    Очень удобно организовать поиск и просмотр данных, если они отсортированы. Сортировка данных — это их упорядочение по значениям одного или нескольких полей. Упорядочение может быть выполнено как по возрастанию, так и но убыванию.

    Если данные сортируют по возрастанию, то на первое место ставится запись, имеющая наименьшее значение по указанно­му полю (полям). На второе место — запись, имеющая следую­щее значение поля (полей) и так далее. На последнем месте будет запись, имеющая наибольшее значение указанного поля (или полей). Числовые поля сортируются от наименьшего числа до наибольшего, символьные поля — от первой буквы ал­фавита до последней буквы алфавита, поля дат — от наимень­шей (наиболее ранней) даты до наибольшей (самой поздней) Даты.

    При сортировке данных по убыванию размещение записей производится в обратном порядке, по отношению к предыдуще­му (по возрастанию).

    В 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 — в списке перечисляются имена полей, которые надо поместить во вновь создаваемый табличный файл. Если опция опушена, то в создаваемый файл помещаются все поля из исход­ного табличного файла.

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

    1. ПОИСК ДАННЫХ

    В FoxPro предусмотрены две методики поиска данных: метод по­следовательного перебора, когда просматривается вся таблица от первой записи до последней, и метод деления пополам. Во вто­ром случае поиск данных производится по полю текущего индек­са. Таблица делится на две части пополам, берется средняя за­пись и значение поля текущего индекса сравнивается с искомым значением. Если значение поля индекса меньше, чем искомое значение, тогда поиск продолжается в нижней половине табли­цы. (Если значение поля текущего индекса больше, чем искомое значение, то поиск продолжается в верхней половине таблицы.) Нижнюю половину таблицы делят пополам, сравнивают среднее значение поля индекса с искомым значением и гак далее, до тех пор пока не найдут нужное значение или не просмотрят всю таб­лицу. Дня каждой методики поиска предусмотрена своя команда.

    4-3.1. Поиск методом полного перебора

    Поиск производится по любому полю таблицы.

    FOR [SCOPE] <услоаие повои» [WHILE <выр.1> J [NOOPITMIZE| Назначение опций.

    ^Условие поиска» — пишется имя поля для поиска значения, да­лее указывается один из логических знаков <,>,<=,>=,“ или и само искомое значение. Если искомое значение имеет сим-

    4.1. Поиск данных с помощью Главного меню.

    ВДЗЕЗ{

    Leokfor.

    Oisuin»

    15 HatcbCat* Г” HtiC'tlbfivitiV red Т~jw.ecAiouijf Г* f f Scope

    Cexet .

    Гз! Напасен

    "Ж-

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

    Назначение опций SCOPE, WHILE и NOOPTIMIZE см. в п. 4.1.

    Если поиск закончился успешно, то курсор устанавливаете^ на найденную запись. Для того чтобы увидеть найденную запись, надо подать команду' DISPLAY или BROWSE. Для нахождения следующей записи, по тому же искомому значению, надо подать] команду CONTINUE. Если поиск закончился неудачно, то кур! сор устанавливается на последнюю запись и на экран выводит^Н сообщение: End of Locate Scope.

    Этот поиск можно выполнить с помошью команды Главного меню

    Table -» Go to Record -> Locate.

    На экран выводится диалоговая панель Locate Record. Назн ;a- чение кнопок:

    For — выводит на экран диалоговую панель для задания условия поиска.

    Scope и While — выводят на экран диалоговые панели для задания ограничений количества просматриваемых записей.

    В случае успешного и неуспешного поиска курсор принимаем соответствующее положение. Для нахождения следующей запи­си. соответствующей условию поиска, надо повторить эту процел дуру еще раз. Если по полю поиска построен индекс, то автома­тически будет использоваться команда SEEK.

    1. Поиск по полю текущего индекса

    а. Поиск с помощью окна 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 предназначена для нахождения следующе­го значения, удовлетворяющего условию поиска.

    1. Фильтрация данных

    В FoxPro определены два вида фильтров данных: фильтр для строк, когда ограничивается количество строк, предъявляемых на экран, и фильтр для полей, когда ограничивается количество ■ полей, отображаемых на экране и, следовательно, доступных для редактирования.

    1. Ограничение на количество строк

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

    Для установки фильтра данных используют команду

    SET FILTER ТО <выр. 1>

    В опции <выр. L> указывают имя поля и его значение, по ко­торым надо выполнить фильтрацию. Для снятия фильтра и вое- 1 станоаления первоначального вида таблицы используют ту же команду, но без опции.

    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;

    • переменные памяти.

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

    1. Понятие рабочей области

    Каждая таблица вместе со своими индексными файлами откры­вается в отдельной рабочей области. Количество рабочих обла­стей зависит от версии FoxPro. Все рабочие области имеют поряд­ковые номера. Например, от 1 до 25 для версии Visual FoxPro 3.0. Кроме того, первые десять рабочих областей имеет однобуквен­ные имена от А до J. Не все команды FoxPro могут обрабатывать I порядковые номера рабочих областей, поэтому при открь табличного файла рабочей области можно присвоить псевдоним (ALIAS). Псевдоним пишется буквами латинского алфавита, причем первый символ обязательно булева, а последующие сш лы могут бьпъ и буквами, и цифрами, допускается и символ под­черкивания. Пробелы при составлении псевдонима не допусти­мы. Желательно в качестве псевдонима использовать осмыслен­ное сочетание из трех-четырех букв. Более длинные псевдонимы желательно не использовать, так как при написании программ­ных кодов обращение к таблицам производится по псевдонимам рабочих областей, в которых они открыты. При открытии таблиц не обязательно соблюдать строгую нумерацию рабочих областей.

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

    SELECT <вомер рабочей области | псевдоним рабочей областм>

    Для доступа к полям таблицы используются префиксы. Для текущей рабочей области префиксом является точка. Для пас­сивных рабочих областей префиксом является конструкция из двух символов -> минуса и знака больше. Для старших версий FoxPro, начиная с 3.0, допускается использование точки как од­ного префикса для всех рабочих областей. При обращении к ка­кому-либо полю следует указать псевдоним рабочей области, в которой открыта таблица, затем префикс и потом имя нужного^ поля.

    1. Организация взаимосвязи «один-к-одному»

    При установлении взаимосвязи, как правило, в родительской таблице берут первичный ключ, а в дочерней таблице — внешний ключ. Причем эти оба ключа являются общим полем. Текущей делают ту рабочую область, где находится дочерняя таблица, и с помощью команды SET RELATION ТО к дочерней таблице под­ключают одну' или несколько родительских таблиц, открытых в пассивных рабочих областях.

    формат команды:

    SET RELATION ТО [<выр.1> INTO Спссвдовим рабочей области 1> ]

    [, <выр.2> INTO Спсевдоним рабочей области 2> ]

    [...]

    [ADDITIVE]

    Назначение опций:

    <выр.1Хвыр.2>... — имена общих полей между дочерней табли­цей и несколькими родительскими таблицами.

    INTO <псевдоним> — псевдонимы пассивных рабочих областей, где открыты соответствующие родительские таблицы.

    ADDITIVE—добавляет вновь созданные взаимосвязи к уже име­ющимся взаимосвязям. По умолчанию ранее установленные вза­имосвязи разрываются.

    Даже если в дочерней таблице общим полем является внеш­ний ключ типа Regular и имеется несколько записей с одинако­вым значением внешнего ключа, на экран будет выводиться только одна запись из дочерней таблицы, так как установлен тал взаимосвязи «один-к-одному».

    Для разрыва всех взаимосвязей «один-к-одному» активной таблицы надо подать команду SET REIATION ТО без опций.

    Если надо разорвать одну конкретную взаимосвязь между ак­тивной (дочерней) таблицей и пассивной (родительской) табли­чен, то следует подать команду

    SET RELATIONS OFF INTO Спсевдоним рабочей областн> |

    <иомер рабочей областн>.

    1. Установление взаимосвязи «один-ко-многим»

    Взаимосвязь «один-ко-многим» устанавливается «поверх* взаи­мосвязи «один-к-одному*, то есть сначала устанавливают между

    таблицами взаимосвязь «один-к-одному*, а затем подают ко­манду:

    SET SKIP ТО [<пседаоцнм рабочей области 1>

    [, <псевдоним рабочей области 2> ]... ]

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

    Для удаления всех взаимосвязей «один-ко-многим» надо по­дать команду SET SKIP ТО без опций.

    1. Установление взаимосвязей с помощью главного меню

    Если имеется ротационная база данных, то установить взаимосвя­зи между таблицами можно с помощью команд Главного меню. Для этого предварительно в каждой таблице строят первичный ключ и внешние ключи. Затем выводят на экран диалоговую па­нель 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 ^

    лт^> Database Designer - Book

    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?

    *

    &

    icide: Delete all related retold* 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

    Cancel

    Рис. 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 устанавливается с помощью соответствующей радиокнопки.

    1. Объединение двух табличных файлов в один файл

    В некоторых случаях требуется информацию из разных таблиц свести в одну таблицу. Одна таблица размешается в активной ра­бочей области, а вторая таблица — в пассивной области. В резуль­тате объединения будет получен новый (третий) табличный файл, который будет записан по указанному адресу. В состав нового (третьего) табличного файла могут быть включены любые поля из двух объединяемых таблиц. Для этих целей используют команду:

    JOIN WITH <псевдоним пассивной рабочей области>

    ТО <нмя создаваемого файла>

    (FOR <выр. L> I

    [FIELDS Сспнсок имен полей> ]

    [NOOPTIMIZE]

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

    Отметим особенности выполнения команды:

    • Если в пассивной таблице нет записи с каким-либо значе­нием общего поля, а в активной таблице такое значение об­щего поля имеется, то запись из активной рабочей таблицы не помещается в результирующую таблицу.

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

    1. Корректировка данных в связанных таблицах

    Иногда бывает нужно внести большое количество изменений в одну таблицу используя данные из другой таблицы. Для этого корректируемую таблицу надо поместить в активную рабочую об­ласть, а таблицу-источник для исправления данных — в пассив­ную рабочую область. Для этих целей предусмотрена команда:

    UPDATE ON <кмя общего поля>,

    FROM < псевдоним пассивной рабочей областн>

    REPLACE <имя поля 1 в активной рабочей обласпО WITH <выражепне 1> [, <нмя поля 2 в активной рабочей областн> WITH <выражсиие 2>... ] [RANDOM]

    Назначение опций.

    ON — указывается имя общего поля. Причем обе таблицы должны быть проиндексированы по этому полю в порядке возрастания. FROM — указывается псевдоним пассивной рабочей области, в ко­торую помещается таблица-источник данных корректировки. REPLACE — указывается имя поля в активной таблицы, куда на­до внести изменения в соответствии с <выражением>, указан­ным в опции WITH и составленным по значениям полей пассив­ной таблицы.

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

    1. Создание итогового табличного файла

    При создании отчетов необходимо иметь итоговые суммы по не­которым числовым столбцам (полям). Команда 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.

    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

    Предполагается, что все таблицы (Fam, Im, Ot и Catalog) уже созданы и заполнены, и индексы для всех таблиц построены по условиям примеров гл. 4.

    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«!П

    Кф*вви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

    Кру talmn К> v book Volume Proc Key1 acnt

    2 3‘ 200 5 00 31

    ...

    Рис. 5.10. Вверху — исходная таблица Customer, внизу — результат работы команды TOTAL (таблица Rez). В таблице Rez посчитан итог по первому клиенту (Key_cust = 1), поэтому количество строк уменьши­лось на 1.

    1. Контрольные вопросы

    1. По какому признаку определяются родительская таблица и дочер­няя таблица?

    2. Что такое общее поле? Какими свойствами обладает общее поле?.

    3. Назовите три типа объединения таблиц.

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

    5. Назовите шесть подходов установления взаимосвязи между табли­цами.

    6. Какое назначение и какие особенности работы команды JOIN9

    7. Какое назначение н какие особенности работы команды UPDATE7

    8. Какое назначение и какие особенности работы команды TOTAL?

    9. Какое назначение и какие особенности работы команды SET RELATION ТО?

    jO. Какое назначение и какие особенности работы команды SET SKIP ТО?

    1. Что такое рабочая область и каково максимальное количество рабо­чих областей?

    2. Как присваиваются имена и номера рабочим областям?

    3. Укажите назначение алиаса рабочей области.

    4. Объясните понятие текущей рабочей области. Как установить теку­щую рабочую область ?

    5. Укажите направление установления взаимосвязи «один-к-одному».

    6. Объясните понятие «ссылочная целостность».

    |7. Объясните понятие «каскадное воздействие».

    1. Что такое каскадное изменение?

    2. Что такое каскадное удаление?

    3. Как установить ссылочную целостность между таблицами?

    4. Как задать каскадные воздействия между таблицами?

    Глава 6

    РАБОТА С ПРОГРАММНЫМИ ФАЙЛАМИ

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

    1. Создание программного файла

    Программный файл создается с помощью встроенного текстово­го редактора 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 -> указать имя нужного программного файла.

    В том и другом случае написание и редактирование текста программного файла производится по правилам текстовых редак­торов.

    1. Запуск программного файла

    Выполнить программный файл можно либо из окна Command с помощью команды DO <имя программного файла>, либо с помощью команды Главного меню:

    PROGRAM -> DO -> указать в списке имя программного файла,

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

    Остановить выполнение программного файла можно нажати­ем клавиши Esc, если в тексте программного файла указа!» команда SET ESCAPE ON.

    Во многих версиях FoxPro эта команда указана по умолчанию- В Visual FoxPro после нажатия клавиши Esc, на экран выво­дится диалоговая панель с тремя кнопками:

    Caned — выполнение программы прерывается.

    Suspend — выполнение программы приостанавливается до под­ачи команды RESUME.

    Ignore — продолжить выполнение программы.

    В уже отлаженных и хорошо работающих программах можно заблокировать нажатие клавиши Escape с помощью команды SET ESCAPE OFF.

    1. Модульность программ

    Программный продукт включает в себя внешние и внутренние процедуры, которые оформляются как отдельные модули. Мо­дульное построение программного продукта позволяет повысить его наглядность и унифицировать часто повторяющиеся опера­ции, сокращает время написашш и отладки программ. При вы­полнении программных кодов, если FoxPro встречает обращение к подпрограмме (модулю), то он ищет текст модуля в следующей последовательности:

    • в текущей процедуре;

    • в процедурном файле;

    • снизу вверх в старших процедурах;

    • на диске в виде отдельной программы.

    1. Внешние процедуры

    Внешней процедурой называется некоторая последовательность Команд, которые выполняют определсшюе и законченное дейст­вие по обработке данных. Внешняя процедура (или несколько Процедур) хранятся в отдельном файле на диске. Приложение мо- *ет содержать несколько процедурных файлов, но подключен (активен) всегда только один процедурный файл. Подключение Процедурного файла производится командой:

    SET PROCEDURE ТО [<имя процедурного файла>]

    Команда без опции закрывает процедурный файл.

    I

    1. Вызов внешней процедуры Формат команды:

    DO <нмя программного файла внешней процсдуры>

    [ WITH <снисок параметров> 1 [ IN <нмя файла>)

    Назначение опций WITH Ссписок параметров — содержит список входных и выходных параметров. В качестве входных и выходных нарамет-1 ров допускается использование переменных, констант и выраже­ний.

    IN <имя файла> — явно указывает место хранения программно­го файла и используется вместо предварительно подаваемой ко­манды SET PROCEDURE.

    Команда DO выполняет указанную программу. Если указан­ная программа не откомпилирована или в нее были внесены изменения, то она автоматически компилирует указанную про-1 грамму, а затем се выполняет.

    Если в <имени программного файла> опущено расширение, то расширения будут просматриваться в следующем порядке: .ехе. .арр, .£хр, .prg.

    1. Команда описания заголовка процедуры Формат команды:

    PROCEDURE <нмя процелуры>

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

    1. Команда восприятия параметров Формат команды:

    PARAMETERS Ссписок параметров

    Эта команда позволяет передать процедуре значения перемен­ных из командной строки или из вызывающей программы. Она пишется сразу после заголовка процедуры и содержит такое Ж®

    количество параметров и того же типа, что и в команде DO, вы­зывающей данную процедуру.

    1. Команда окончания процедуры формат команды:

    RETURN [ТО MASTER | ТО <имяпроцедуры> | <выр>]

    Команда RETURN без опций завершает выполнение процедуры и передает управление следующему по порядку опера­тору

    Команда RETURN ТО MASTER завершает выполнение про­цедуры и выполняет переход к самому верхнему уровню вызыва­ющих процедур, передавая управление следующему по порядку оператору.

    Команда RETURN ТО <имя процедуры> завершает выполне­ние процедуры и выполняет переход к процедуре с указанным именем, передавая управление следующему по порядку опера­тору.

    <выр> содержит последний выполняемый оператор в теле процедуры. Такой способ окончания процедуры используется в процедурах-функциях для передачи последнего вычисленного значения.

    1. Команда возврата RENTRY

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

    6-3.1.7. Команда выхода на командный уровень cancel

    Команда прекращает выполнение программы, освобождает из Памяти переменные, созданные пользователем и возвращает уп­равление окну Command.

    1. Команда выхода из среды Visual FoxPro QUIT

    Осуществляет выход из среды Visual FoxPro в операционную систему. Рекомендуется использовать эту' команду перед вы­ключением компьютера, с целью предотвращения потери дан­ных.

    1. Внутренние процедуры

    Внутренние процедуры хранятся вместе с текстом основной про­граммы и размещаются в конце основной программы.

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

    1. Процедура-функция

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

    1. Команда описания заголовка процедуры-функции

    FUNCTION(<HMfl процедуры-функини>)

    Имя процедуры-функции пишется по правилам имен проце­дур (см. п. 6.3.1.2).

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

    1)0 <нмя происдуры-функцнн>.

    1. Область действия переменных

    Переменные могут передаваться в процедуры не только через фиктивные параметры, но и напрямую. Псремеш<ые, определен­ные в старших модулях, действуют также и в подчиненных моду­лях.

    1. Глобальные переменные

    Переменные и массивы, объявленные как глобальные, действуют во всей среде Visual FoxPro. Глобальную переменную можно оп­ределить либо в окне Command, либо с помощью оператора

    PUBLIC <список имен переменных в масснвов>

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

    »

    1. Локальные переменные

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

    Допускается объявление группы локальных переменных по шаблону:

    PRIVATE ALL LIKE <шаблои> | EXCEPT <шаблон>

    Назначение опций:

    LIKE <шаблон> — задает множество имен, соответствующих ус­ловию шаблона.

    EXCEPT <шаблон> — задает множество имен, не соответствую­щих условию шаблона

    Оператор PRIVATE описывает только переменные. Локаль­ные массивы описываются командами DECLARE и DIMEN­SION.

    1. Простейшие вычисления

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

    1. Вычисление суммы по столбцу

    Команда SUM без опций производит вычисление суммы по всем числовым полям всех столбцов и всех записей активной таб­лицы.

    Формат команды:

    SUM

    [ Ссиисок выряжсний> ]

    [ FOR <выр. Ll> 1 I WHILE <Bi.ip.L2>]

    [ТО < список имен переменных памятн> | ТО ARRAY <имя массива> ]

    [ NOOPTIMIZEI

    Назначение опций-

    <список выражении> — задает имена физических нолей или вы­ражения (виртуальные поля), которые должны быть просуммиро­ваны. Количество элементов списка должно соответствовать ко­личеству элементов массива, если результат вычислений будет сохраняться в массиве (опция ТО ARRAY <имя массива>).

    FOR <выр. Ll> — задает диапазон строк, для которых надо вы­полнить операцию суммирования.

    WHILE <выр. L2> — задает диапазон строк, для которых надо выполнить операцию суммирования.

    ТО Ссписок имен переменных памяти> — задает имена перемен­ных памяти, в которых будут сохранены результаты вычисления сумм. При необходимости соответствующие переменные будУ1 созданы автоматически.

    ТО ARRAY <имя масснва> — содержит имя массива, который предназначен для хранения результатов вычисления сумм. СЛ массив должен быть создан заранее.

    NOOPTIMIZE — отключает технологию ускоренного доступ3 к данным, если в опцию FOR включены поля текущего ИИ- декса.

    1. Вычисление среднего значения по столбцу

    Команда AVERAGE осуществляет вычисление среднего арифме­тического значения для выражения. Формат команды:

    average

    (<спнсок Bbip.N> ]

    [ FOR <выр. LI>]

    (WHILE <выр. L2> J

    [ ТО <спис(ж имен переменных памятн> | ТО ARRAY <имя чассим> ]

    | NOOPTIM1ZE ]

    Назначение опций аналогично команде SIJM. В <списке Bbip.N> могут содержаться как имена физических нолей, так и выражения для виртуальных полей.

    1. Вычисление математических операций над физическими и виртуальными полями

    Команда 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, которая игнорирует помеченные к удалению записи.

    1. Вычисление общего количества записей в таблице

    Команда COUNT подсчитывает общее количество записей в ак­тивной таблице и сохраняет результат в переменной памяти. Фо(^И мат команды:

    COUNT [ FOR <выр. Ll> ]

    [WHILE <выр. L2> ]

    [ТО <персмсннойпамяггн>]

    [ NOOPTIMIZE j

    Для аналогичных целей может бьггь использована функция: J RECCOUNT( [ <выр. N> | <выр. О ])

    которая возвращает количество записей таблицы. Желаемая таб-Я лица задастся либо номером рабочей области <выр. N>, либоЯ алиасом рабочей области <выр. С>.

    1. Примеры

    Пример 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 && Задание рабочего каталога

    && Далее открытие двенадцати таблиц

    SELE ctl

    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

    1. Контрольные вопросы

    1. Укажите назначение программного файла.

    2. Укажите несколько способов создания программного файла.

    3. Как открыть программный файл?

    4. Как поставить на выполнение открытый программный файл?

    ОСНОВЫ ЯЗЫКА ПРОГРАММИРОВАНИЯ

    В 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. Присвоение значений

    Присвоить значения переменным и элементам массива можно несколькими способами.

    1. С помощью оператора присваивания

    <нмя вереме1шоА> ■ <выражсинс>

    <имя элемента массива> = <выраженне>

    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 года и тип дата.

    1. Команды для работы с переменными

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

    1. Сохранение переменных

    С помощью команды SAVE ТО можно сохранить либо все пе­ременные, находящиеся в оперативной памяти, либо их произ­вольную часть, как в файле, так и в Memo-полс с заданным име­нем. Формат команды:

    SAVE ТО <нмя файла> | ТО MEMO <имя поля> {ALL LIKE | EXCEPT <шаблон>]

    В команде предусмотрено использование одного из двух шаб­лонов.

    ALL LIKE — сохраняются все переменные, имена которых со­ответствуют шаблону.

    ALL EXCEPT — сохраняются все переменные, кроме перемен­ных, перечисленных в шаблоне.

    В любом из шаблонов допустимо использование символов V и "Г.

    По умолчанию к указанному в команде имени файла, добав­ляется расширение .mem

    По умолчанию команда создает файл с указанным именем. Если файл с таким именем уже существует, то он заменяется на новый без предупреждения Если вы хотите увидеть предупреж­дение на экране, что указанный файл уже существует, надо пе­ред командой SAVE ТО установить команду SETT SAFETY OFF.

    1. Загрузка переменных в оперативную память

    Если при работе с приложением возникает необходимость раз­местить в оперативной памяти переменные, значения которых были определены ранее, то надо воспользоваться командой:

    RESTORE FROM <нмяфайла>| FROM MEMO Симя поля> [ADDITIVE]

    В результате работы команды оперативная память очищается от имеющихся переменных, и в нее помещаются переменные из указанного файла с расширением .mem или из Memo-поля. Для того чтобы сохранить в оперативной памяти переменные, значе­ния которых определены до использования команды SAVE ТО, и добавить в оперативную память переменные с отличными (дру­гими) именами из файла (или Memo-поля), надо указать опцию ADDITIVE.

    1. Просмотр переменных

    Переменные, которые хранятся в оперативной памяти, можно Просмотреть с помощью команды:

    DISPLAY MEMORY [LIKE <шаблон>] [ТО PRINTER | FILE <нмяфайла>[

    На экране каждая переменная занимает одну строку, куда вы­водится имя, тип, значение и статус переменной. После заполне­ния экрана надо нажать либо клавишу ENTER, либо клавишу •пробел* для продолжения вывода переменных на экран. При Желании можно направить вывод переменных либо на принтер (ТО PRINTER), либо в файл (ТО FILE).

    1. Удаление переменных

    Все переменные или часть переменных, хранящихся в оператив­ной памяти, можно удалить с помощью команды:

    RELEASE <список имен иеременных>

    RELEASE ALL [LIKE | EXCEPT <шаблон>]

    Для удаления всех переменных также можно использовать команду:

    CLEAR MEMORY

    1. Команды для работы с массивами

    В FoxPro для работы с массивами предусмотрены четыре коман­ды: две для работы с одномерными массивами и две для работы с двумерными массивами.

    1. Команда заполнения одномерного массива из табличного файла

    Команда 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 не задана, то копирование начинается с первого поля записи подряд. Если число элементов массива больше, чем количество полей записи, то последние элементы массива сохраняют свое прежнее значение.

    1. Команда заполнения табличного файла из одномерного массива

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

    Gather FROM <имямассива>| MEMVAR

    [FIELDS Ссписок имен полей> | FIELDS LIKE <шаблон> |

    Helds except <шаблон>]

    [MEMO]

    1

    Назначение опций:

    FIELDS <список имен полей> — задает имена полей, в которые,

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

    FIELDS LIKE <шаблон> — задает имена полей по шаблону (ана­логично команде SCATTER).

    FIELDS EXCEPT <шаблон> — задает имена полей по шаблону (аналогично команде SCATTER).

    MEMO — задает копирование полей типа Memo.

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

    1. Копирование данных из табличного файла в двумерный массив

    Команда COPY ТО ARRAY копирует записи табличного файла в заранее созданный двумерный массив. Копируется столько за­писей, сколько строк в двумерном массиве, начиная с текущей записи. Если количество полей записи больше, чем число эле­ментов массива в одной строке, то лишние поля записи не копи­руются. Если количество элементов массива в одной строке больше, чем количество полей записи, то последние элементы массива сохраняют прежние значения. Формат команды:

    COPY ТО ARRAY <имя масснва>

    (FIELDS <снисок имен иолей>]

    [SCOPE]

    [FOR <выр.Ь1>]

    [WHILE <выр.Ь2>]

    [NOOPTIMIZEJ

    Назначение опций:

    FIELDS Ссписок имен полей> — задает имена полей, значения которых будут копироваться в двумерный массив.

    SCOPE — задаст запись, начиная с которой производится копи­рование, либо диапазон записей.

    FOR <Bbip.Ll> — выделяет для копирования только те записи, которые удовлетворяют логическому условию СвырХ! >.

    WHILE <Bbip.L2> —выделяет для записи указанные поля.

    NOOPTIMIZE — запрещает ускоренную технологию обработки (Rushmore).

    1. Добавление записей в табличный файл из двумерного массива

    Команда /APPEND FROM ARRAY добавляет в конец таблично­го файла записи из двумерного массива. Причем каждая строка двумерного массива заносится в табличный файл как новая за­пись. Если количество элементов в строке двумерного массива больше, чем количество полей в записи, то последние элементы массива не копируются. Если количество элементов в строке двумерного массива меньше, чем количество полей в записи, то последние поля записи сохраняют прежние значения. Формат команды:

    APPEND FROM ARRAY Снчя двумерного масснва>

    [FOR <выРХ1>]

    [FIELDS <списокимен полей>]

    Назначение опций:

    FOR <вырХ1> — выделяет из массива те строки, которые удов­летворяют логическому условию <вырХ1>.

    FIELDS <список имен полей> — задает имена полей, в которые будут заноситься данные из массива.

    1. Команды ввода-вывода

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

    1. Простейшие команды вывода

    В 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 — подчеркнутый

    1. Команды очистки экрана

    Для очистки экрана используются две команды:

    а. Очистка всего экрана — CLEAR. Команда очищает либо весь экран, либо все рабочее окно и размещает курсор в левом верхнем углу.

    б. Очистка прямоугольной области экрана:

    §> <YI,X1> [CLEAR | CLEAR TO <Y2,X2>]

    Команда очищает прямоугольную область экрана с координа­тами левого верхнего угла (<Y1,X1>) и координатами правого нижнего угла (<Y2,X2>). Если координаты правого нижнего уг­ла области не указаны, то принимаются координаты правого нижнего угла экрана.

    1. Универсальная команда ввода-вывода

    Эта команда предназначена для форматного ввода-вывода на эк­ран и принтер. Формат команды:

    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 Ссписок пар цветов> -

    назначение опции см выше

    1. Редактирование переменных,

    заданных командой @ ... 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.

    1. Функции для работы с массивами

    1. -* 4

    1. -* 8

    1. -у 12

      1. -* 16

    Все функции, которые будут рассмотрены ниже, работают как с одномерными, так и с двумерными массивами. Особенность ра­боты в среде FoxPro такова, что нет принципиальной разницы при работе с одномерными и двумерными массивами. К элемен­ту двумерного массива можно обращаться точно так же, как и к элементу одномерного массива, то есть по одному индексу. Если к элементу двумерного массива обращаются по одному индексу, то при этом имеется в виду порядковый номер элемента двумер­ного массива. Приведем соответствие между фактическим мес­тоположением элемента двумерного массива и его порядковым номером на примере массива размерности (4,4).

    БАЗЫ ДАННЫХ 2

    Оглавление 4

    От автора 6

    Справочник команд, операторов и функций 9

    ... 114

    ... | 156

    I 207

    Литература 364

    1. Определение положения элемента массива

    а. Номер строки и номер столбца определяет функция ASUBSCR1PT( <имя масснва>, <выр.ГЧ>, < 112> ).

    Она возвращает из двумерного массива положение элемента <Bbip.N>. Если третий аргумент 1, то функция возпращает но­мер строки. Если третий аргумент 2, то функция возвращает но­мер столбца.

    б. Функция

    AELEMENT( <имя масснва>, <Bup.Nl>, [ <ewp.N2> ] )

    определяет порядковый номер элемента двумерного массива, по заданным номеру строки <Bbip.Nl> и номеру столбца <Bbip.N2>.

    1. Удаление элемента массива

    После удаления элемента массива размерность массива не изме­няется.

    Если удаляется элемент одномерного массива, то все элемен­ты справа от удалешюго элемента сдвигаются влево, занимая ос­вободившееся место. Последний элемент массива получает тип логический и значение .F. ("ложь").

    Если удаляется строка или столбец двумерного массива, то после выполнения операции удаления производится сдвиг остав­шихся строк или столбцов. Последняя строка или столбец (все элементы) получают тип логический и значение .F.

    Формат функции:

    ADEL( <имя масснва>, <выр.1М> [, 2] )

    Если операция удаления прошла успешно, то функция воз­вращает 1. Если третий аргумент 2, то в двумерном массиве уда­ляется столбец. В противном случае удаляется строка.

    <Bbip.N> — указывает для одномерного массива номер удаляе­мого элемента, а для двумерного массива либо номер удаляемой строки, либо номер удаляемого столбца (в зависимости от значе­ния третьего аргумента).

    1. Вставка элементов массива

    После выполнения операции вставки элемента массива размер­ность массива не изменяется.

    Формат функции:

    A1NS( <нмя массивя>, <Bup.N> [, 2 ] ) <Bbip.N> — указывает номер элемента массива, перед которым надо вставить пустой элемент. Пустой элемент имееттип логиче­ский и значение .F. Если новый элемент вставляется в одномер­ный массив, то все элементы справа от вставленного элемента сдвигаются вправо и последний элемент теряется.

    В двумерный массив вставляется либо строка, либо столбец целиком. После операции вставки аналогично проводится сдвиг (либо вниз, либо вправо) оставшихся элементов. Если третий ар­гумент 2, то вставляется столбец, в противном случае — строка.

    1. Копирование элементов из одного массива в другой

    Функция 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> (или обе одновременно), то их пози­ция в формате функции должна быть зафиксирована символом «,* (запятая).

    1. Поиск элемента массива

    функция ASCAN осушсстнляет поиск значения <выр.> среди элементов указанного массива, начиная с элемента, имеющего порядковый номер <выр.М1>, до элемента с порядковым номе­ром <Bbip.N2>. При успешном поиске функция возвращает порядковый номер разыскиваемого элемента, в противном слу­чае — 0 (ноль).

    Формат функции:

    ASCAN( <массив>, <выр.> [, <выр.Х1> [, <вырЛМ2>]] )

    Назначение опций:

    <массив> — задает имя массива, в котором осуществляется по­иск элемента.

    <выр.> — задает условие поиска.

    <выр.1Ч1> — указывает номер элемента, с которого начинается поиск.

    <Bbip.N2> — указывает номер элемента, на котором заканчива­ется поиск.

    Если отсутствуют опции <выр.К1> и <Bbip.N2>, то поиск производится по всему <массиву>. Если отсутствует опция <Bbip.NI>, то ее позиция в формате функции фиксируется сим­волом «,* (запятая).

    1. Сортировка элементов массива

    Под сортировкой одномерного массива понимают упорядочение элементов массива либо по возрастанию, либо по убыванию. Под сортировкой элементов (строк или столбцов) двумерного массива понимают перестановку строк или столбцов массива в зависимо­сти от значений какого-либо поля по возрастанию или убыванию. Формат функции:

    ASORT( <массив> [, <выр.М> [, <Bbip.N2> [, <выр.Ш> ] ] ] )

    где:

    <массив> — задает имя сортируемого массива.

    <Bbip.N3> — определяет направление сортировки. Если указан О (ноль), то производится сортировка по возрастанию (установка принята по умолчанию). Если указана 1 (единица), то произво­дится сортировка по убыванию.

    Назначение опций при сортировке одномерного массива:

    <Bbip.Nl> — указывает номер элемента массива, с которого на­чинается сортировка.

    <выр.Ш> — указывает номер элемента массива, на котором за­канчивается сортировка.

    Назначение опций при сортировке двумерного массива.

    <Bbip.Nl> — задает номер столбца, по значениям которого будет производиться сортировка.

    <Bbip.N2> — задает количество строк, которые будут перестав­ляться в результа те сортировки. За начало отсчета принята теку­щая строка.

    Если отсутствуют опции <выр.М1>, <Bbip.N2> и <ubip.N3>, то сортируется весь массив по возрастанию. Если отсутствуют опции <Bbip.Nl> или <выр.Ы2> (или обе одновременно), то их позиция в формате функции фиксируется символом «,* (запя­тая).

    1. Получение сведений о структуре таблицы

    Функция AFIELDS позволяет получить сведения о текущей таб­лице.

    Формат функции:

    AFIELDS( <массив>)

    <массив> — имя двумерного массив.».

    В результате работы функция AFIELDS возвращает количество полей текущей таблицы и создает двумерный массив, с указан­ным именем, каждая строка которого состоит из 11 столбцов и содержит информацию об одном поле:

    • имя поля,

    • тип поля (обозначается одной буквой),

    • размер поля.

    • размер дробной части числа,

    • допустимость пустого значения,

    • номер кодовой страницы,

    • условие достоверности вводимых значений в поле,

    • текст сообщения при нарушении достоверности на уровне поля,

    • значение поля по умолчанию,

    • условие достоверности на уровне записи,

    • текст сообщения при нарушении условия достоверности на уровне записи.

    Количество строк <массива> определяется количеством по­лей таблицы.

    Имея возвращенный функцией AFIELDS массив можно по­строить копию таблицы с помощью команды CREATE DBF языка запросов SQL.

    1. Получение информации о файлах

    Функция ADIR позволяет получить информацию о файлах теку­щего каталога.

    Формат функции:

    ADIR( <масснв> [, <выр.О ] )

    <массив> — имя двумерного массива.

    <выр.О — шаблон на ограничение количества файлов. Шаблон составляется с использованием символов и "?и.

    В результате работы функция ADIR создает двумерный мас­сив, с указанным именем, каждая строка состоит из пяти полей, в которых содержится информация об одном файле: имя файла (тип поля С ), размер файла (тип поля N), дата создания файла (тип поля D), время создания файла (тип поля С) и атрибут (тип поля С). Количество строк массива <массив> определяется ко­личеством файлов.

    Полученный массив <массив> удобно использовать в ко­мандах при создании меню.

    1. Команды циклов

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

    1. Цикл по условию

    Формат команды:

    DO WHILE <выр. L>

    [LOOP1 [EXIT]

    ENDDO

    Цикл выполняется многократно, до тех пор пока истинно ло­гическое условие <вьф. L>. Для принудительного выхода их цикла, до нарушс!шя логического условия <выр. L>, используют команду EXIT. Команда LOOP используется для прекращения вычислений, предусмотренных текущей итерацией, и принуди­тельного перехода к следующей итерации внутри цикла.

    1. Фиксированный цикл

    Формат команды:

    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>.

    1. Цикл сканирования

    Цикл сканирования организует просмотр записей текущей таб­лицы.

    Формат команды:

    SCAN

    ...

    [ FOR <L1> ]

    [ WHILE,L2>]

    {NOOPTIMIZE ]

    I LOOP 1 (EXIT)

    ENDSCAN

    Цикл сканирования работает аналогично циклу DO WHILE, но предназначен для работы с текущей таблицей. Назначение оп- 11 ий аналогичное. По умолчанию цикл сканирования выполня­ется для всех записей.

    1. Команда выполнения

    I «и нами М1НЧ1КЖ1 < л 1

    Формат команды:

    RUN <команда> | ! <команда>

    Эта команда позволяет выполнить команду DOS или любую внешнюю команду, которая используется с приглашением DOS и подается в окне Command.

    1. Команды ветвления алгоритма

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

    1. Команда ветвления алгоритма на два направления

    Формат команды:

    1F <выр. 1> <онератор 1> [ ELSE <оп«ратор 2> ] ENDIF

    Если логическое выражение <выр. L> истинно, то выполня­ется <опсратор 1>. Если логическое выражение <выр. L> лож­но, то выполняется <оператор 2>.

    1. Команда ветвления алгоритма на много направлений

    Формат команды:

    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. Примеры

    Пример 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

    USE E:\PRIMER\Fam.dbf

    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 *

    && Удаление пятой строки из массива mmm && Вывод на экран массива mmm и массива ttt

    ? 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

    CLOSE ALL

    USE E:\Prinier\Fam.dbf CLEAR

    COPY

    *

    DIME mmm(10,2) , ttt(10,2)

    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*

    1. Контрольные вопросы

    1. Как задать продолжение команды на другой строке?

    2. Как задать комментарий в тексте программы?

    3. По каким правилам задаются имена переменных?

    4. Как определяется тип переменной?

    5. Какими командами описываются массивы?

    6. Как определяется тип элементов массива?

    7. Укажите два способа присвоения значений переменным и элемен­там массива

    8. Укажите варианты способов хранения значений переменных и на­пишите команду для сохранения переменных.

    9. Напишите команду по восстановлению ранее сохраненных значе­ний переменных.

    10. Укажите два варианта восстановления значений переменных.

    11. Укажите варианты вывода значений переменных на экран.

    12. Как удалить переменные из оперативной памяти?

    13. Какие команды работают с одномерными массивами, а какие ко­манды работают с двумерными массивами?

    14. Укажите особенности работы команды SCATTER.

    15. Укажите особенности работы команды GATHER

    16. Укажите особенности работы команды COPY ТО ARRAY.

    17. Укажите особенности работы команды APPEND FROM ARRAY.

    18. Укажите назначение и особенности работы команд ?и??.

    19. Расскажите о назначении и особенностях работы универсальной ко­манды ввода-вывода.

    20. Укажите два способа обращения к элементам двумерного массива и напишите функции для пересчета координат элемента массива.

    21. Расскажите о вариантах использования функции копирования эле­ментов массива.

    22. Что значит сортировать элементы одномерного и двумерного мас­сивов?

    23. Какая функция выполняет сортировку элементов одномерного мас­сива и элементов двумерного массива?

    24. Сравните принцип работы функции сортировки элементов массива и команды сортировки табличного файла.

    25. Расскажите об особенностях функции добаатения новых элементов в одномерный массив и в двумерный массив.

    26. Расскажите об особенностях функции удаления элементов одно­мерного массива и элементов двумерного массива.

    27. Как получить сведения о структуре таблицы (и вывести их на экран)?

    В базах данных меню является основным инструментом диалога. В 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). При своей работе меню вырабатывает не только числовые коды, кото­рые фиксируют выбор пользователя, но и непосредственно вы­зывает процедуры и команды на выполнение. В качестве пунктов меню здесь можно использовать имена файлов и структуру базы Данных, а также организовать множественный выбор пунктов меню.

    1. МЕНЮ ТИПА FOX

    Меню nma FOX существует в трех вариантах. Максимальное количество пунктов меню — 128.

    1. Меню произвольного типа. LIGHTBAR-меню

    Меню этого типа помешается в оперативную память и выводится на экран для работы одной командой. Для создания меню пре­дусмотрены следующие команды.

    1. Команда описания пункта меню

    @ У.Х PROMPT <выр.С1> [MESSAGE <выр.С2>]

    Команда выводит в позицию Y, X экрана строку меню <выр.С1>. Опция MESSAGE предназначена для вывода в стро­ку состояния (или заранее указанную строку) дополнительное со­общение <выр.С2>. Это сообщение выводится в момент разме­щения курсора на пункте меню. Если дополнительное сообщение надо вывести в определенную строку экрана, то перед этой командой надо указать команду SET MESSAGE ..., формат которой описан ниже. Само меню состоит из набора команд @ Y,X PROMPT ....количество которых не более 128.Таккакко- манды не связаны между собой, то пункты меню будут распола­гаться на экране произвольным образом (положение каждого пун­кта определяется координатами Y и X). Переход от одного пунк­та меню к другому осуществляется с помощью кланиш-стрелок. Порялок обхода определяется порядком описания пунктов меню. Активный пункт меню выделяется либо цветом, либо яркостью.

    1. Команда фиксации выбора пользователя

    \1ENU ТО <переменная>

    Команда запоминает в <переменной> порядковый номер (по описанию в тексте программы) выбранного пункта меню. При нажатии клавиши Fsc (отказ от выбора пункта меню) в <пере- менную> заносится 0 (ноль). Команда SET MESSAGE ТО [ <выр.1Ч> [ LEFT | RIGHT | CENTER ] ] предназначена для указания номера строки экрана <Bbip.N>, в которую выводится дополнительное сообщение, и для указания места вывода внутри строки:

    LEFT — дополнительное сообщение форматируется по левому краю строки.

    RIGHT — дополнительное сообщение форматируется по право­му краю строки.

    CENTER — дополнительное сообщение форматируется по цен­тру строки.

    При использовании команды SET MESSAGE ТО ... в ко­манде @ Y,X PROMPT ... обязательно должна быть указана оп­ция MESSAGE.

    Команда SET MESSAGE ТО без параметров выводит допол­нительное сообщение в последнюю строку экрана. Эта команда работает как в FOX-меню, так и в dBASE-меню.

    1. Вертикальное POPUP-меню

    Для создания этого меню предусмотрены команды как для опи­сания меню, так и для предъявления меню на экран. При необхо­димости линейка прокрутки подключается автоматически.

    1. Команда создания и отображения меню на экране

    @ Y,X MENU <массив>, <выр.М> [, <Bbip.N2> ] (TITLE dup.O (

    Назначение опций:

    <массив> — имя одномерного массива. Массив должен быть за­ранее описан. Элементы массива содержат названия пунктов ме­ню. Максимальная длина названия пункта меню — 50 символов. <Bbip.Nl> — число пунктов меню (не более 128).

    <Bbip.N2> — число одновременно предъявляемых на экран пун­ктов меню. По умолчанию отображается 17 пунктов меню.

    TITLE <выр.О — заголовок меню, который отображается в верхней части меню.

    1. Команда фиксации выбора пользователя

    READ MENU ТО <персменная> [ SAVE J Назначение опций:

    <переменная> — имя переменной целого типа, в которой фикси­руется номер выбранного пользователем пункта меню. Если до подачи команды <персменной> бьпо присвоено значение, то после предъявления меню на экран указанный пункт меню будет активным (выделенным). В противном случае выделен будет первый пункт меню.

    SAVE — сохраняет на экране образ меню после выхода из него. В этом случае удалить с экрана образ меню можно только коман­дой CLEAR

    Далее в программе производится анализ <переменной> в операторе DO CASE... ENDCASE.

    1. Двухуровневое PULLDOWN-меню

    Двухуровневое меню состоит из горизонтального и вертикально­го меню. Используя эти же команды, можно создать только гори­зонтальное меню Здесь также предусмотрены команды для создания меню и команды для использования меню.

    1. Команда определения горизонтального меню

    MENU BAR <масснв>, <Bbip.N>

    Определяет и выводит на экран горизонтальное меню. Назна­чение опций:

    <массив> — имя двумерного массива. Размерность массива (п, 2). В первом столбце указываются названия пунктов меню, а во втором — комментарии к пунктам меню. Комментарии выво­дятся либо в последнюю строку экрана, либо в строку, указанную командой SET MESSAGE ТО ... Комментарии описывать не обязательно, но массив должен быть обязательно двумерным и если комментарии отсутствуют, то значения второго столбца — пустые строки.

    <выр.1Ч> — обшее число пунктов меню.

    В горизонтальном меню на экран выводится столько пунктов меню, сколько уместится на экране. Для предъявления на экран остальных пунктов меню надо несколько раз нажать клавишу «стрелка вправо».

    1. Команда описания подчиненного меню

    MENU <Bwp.Nl>, <маесив>, <ewp.N2> [, <swp.N3> ]

    Команда определяет вспомогательное меню и его «привязку* к соответствующему пункту главного меню. Назначение опций:

    <Bbip.Nl> — определяет номер пункта главного меню, который

    будет вызывать описываемое вспомогательное меню.

    <Bbip.N2> — число пунктов вспомогательного меню. Это число в

    общем случае может не соответствовать размерности <массива>.

    <выр.\3> — число одновременно показываемых пунктов меню. Если <Bbip.N3> меньше <Bbip.N2>, то автоматически подклю­чается линейка прокрутки.

    <массив> — имя одномерного массива, элементы которого со­держат названия пунктов вспомогательного меню.

    1. Команда фиксации выбора пользователя

    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.

    1. МЕНЮ ТИПА dBASE

    При создании и эксплуатации данного меню должны быть пре­дусмотрены следующие элементы:

    • определение меню — описывается содержание меню, кла­виши быстрого доступа, форма и реакции меню. Меню типа dBASE определяется один раз;

    • активация меню — команды (клавиши быстрого доступа) активации выводят меню на экран и делают его чувстви­тельным к выбору пользователя;

    • деактивация меню — меню удаляется с экрана, но остается в оперативной памяти, и впоследствии может быть предъяв­лено на экран;

    • удаление меню — меню удаляется из оперативной памяти. Для нового использования меню его надо заново опреде­лять.

    Меню типа dBASE бывает двух видов: вертикальное (POPUP) и горизонтальное (BAR). Эти два вида меню могут использоваться как совместно, так и по отдельности. Допускает­ся создание иерархических меню любой сложности.

    1. Вертикальное POPUP-меню

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

    1. Команда определения меню

    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.

    1. Команда описания пункта меню

    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.

    1. Команда определения реакции на вызов меню ON SELECTION POPUP <нмя POPUP меню> | ALL [ <комавда> I

    к

    При выборе указанного <имя POPUP мсню> меню, после нажатия клавиши Enter, выполняется ( <команда> ], если она

    определена. Если указана опция ALL, то указанная [ <коман- да> | выполняется для всех POPUP-меню. В параметре [ <команда> ] может быть указана любая команда, но чаще всего используется команда DO, которая вызывает на выполнение процедуру, созданную пользователем. Команда, указанная в параметре [ <команла> ], является общей для всего POPUP-ме­ню. По окончании выполнения процедуры (или команды) управление опять передается POPUP-меню, при условии, что внутри процедуры не было команды DEACTIVATE POPUP. Далее можно выбрать любой пункт меню.

    1. Команда определения реакции на вызов пункта меню

    ON SELECTION BAR <Bwp.N> OF <нчя РОРиР-меню> [<команда>]

    При выборе пункта меню с номером <выр.1Ч> изменю <имя POPUP мсию>, выполняется команда, определенная в [<ко- манда>] . Команда ON SELECTION BAR ... пишется после команды DEFINE POPUP ..., но до команды ACTIVATE POPUP ... Если команда ON SELECTION BAR используется без параметра [<комакда>], то отменяется ранее сделанное за­крепление.

    1. Комацда закрепления подчиненного (младшего) меню

    ON BAR <выр.1Ч> OF <имя РОР1/Р-менк>>

    [ ACTIVATE POPUP <имя POPUP меню 2> |

    ACTIVATE MENU <имя BAR меию> ]

    Команда назначает вызов подчиненного (младшего) меню, закрепленного за пунктом <Bbip.N> меню <имя POPUP- меню> . Подчиненное (младшее) меню может быть как верти­кальным ACTIVATE POPUP <имя POPUP-меню 2>, так и гори­зонтальным (ACTIVATE MENU <имя ВАИ-меню>).

    Использование команды ON BAR без опции отменяет за­крепление подчиненного меню. Если за пунктом текущего меню закреплен вызов подчиненного меню, то справа от названия пун­кта текущего меню автоматически устанавливается символ ► , место для которого надо предусмотреть с помощью опции MAR­GIN команды DEFINE POPUP ...

    1. Команда активации меню

    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, то после закрытия меню их образ остается на экране.

    1. Команда деактивации меню

    DEACTIVATE POPUP

    Команда удаляет меню с экрана, но сохраняет его в оператив­ной памяти. Этот же результат получается при нажатии клавиши Esc или при переходе к другому POPUP-меню.

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

    Если обработчиком выбранного пункта меню является спе­циальная процедура, то последней выполняемой командой мо­жет быть:

    • последняя команда процедуры;

    • команда RETURN;

    • команда DEACTIVATE POPUP.

    Если вместо выбора пункта меню нажата клавиша Esc, то об­ращение к процедуре не производится.

    1. Удаление всех POPUP-меню

    CLEAR POPUPS

    Команда удаляет с экрана и из оперативной памяти все POPUP-меню.

    1. Удаление указанных POPUP-меню

    RELEASE POPUPS [Cciihcok имен POPUP мсню> [ EXTENDED J]

    Команда удаляет с экрана и из оперативной памяти меню, пе­речисленные в <списке имен РОРиР-меню>. Если указана оп­ция EXTENDED, то удаляются не только все перечисленные ме­ню, но и все подчиненные меню. Если опция Ссписок имен РОРиР-меню> не указана, то удаляются все POPUP-меню.

    1. Удаление пунш меню

    RELEASE [ BAR Ссписок имен пунктов РОРиР-меню> | ALL ] OF С нм я РОРиР-меню>

    Команда удаляет с экрана и из оперативной памяти либо ука­занные, либо все пункты POPUP-меню. Имя меню задается в опции OF Симя РОРиР-меню> .

    1. Удаление меню с экрана

    HIDE POPUP Ссписок имен POPUP-Memo> | .ALL [ SAVE J

    Команда удаляет с экрана либо перечисленные в Сспискс имен РОРиР-меню>, либо все (ALL) POPUP-меню, но сохра­няет их в оперативной памяти. Эта команда идентична команде

    DEACTIVATE POPUP. Опция SAVE сохраняет на экране образ меню, хотя само меню с экрана удалено.

    1. Перемещение меню по экрану

    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.). Функция полезна при организации множест­венного отбора пунктов меню.

    1. Горизонтальное BAR-меню

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

    Для создания горизонтального меню предусмотрены следую­щие команды.

    1. Определение горизонтального меню

    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> — определяет цвет фона и нвет букв пунктов меню.

    1. Описание пунш горизонтального меню

    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

    KEY <имя клавиши> [, <выр. С2> 1 — назначает клавишу (или комбинацию клавиш) для активации пункта меню. При установ­

    ке курсора на пункт меню выводится дополнительное сообщение <выр. С2> в строку состояния.

    MARK <выр.СЗ> — переопределяет символ множественного от­бора пунктов меню.

    SKIP [ FOR <выр.1> ] — делает пункт меню недоступным для выбора пользователя. Если указан параметр FOR <выр.Ь>, то пункт меню будет доступен для выбора при истинности логиче­ского условия <выр.Ь>.

    MESSAGE <выр.С4> — выводит на экран дополнительное со­общение <выр.С4>.

    COLOR <СШ1С0К пар цветов> | COLOR SCHEME <выр.ГМ> — определяет цвет фона и цвет букв пункта меню.

    1. Команда активации меню

    ACTIVATE MENU <имя BAR-MeuK>>

    [ NOWAIT)

    [ PAD <нчя пункта меню> ]

    Команда выводит на экран горизонтальное меню и делает его доступным дтя выбора пользователя. Активация меню произво­дится в любом месте программы, но после описания меню. На­значение опций:

    NOWAIT — разрешает выполнение программы, не дожидаясь закрытия меню.

    PAD <имя пункта меню> — определяет, какой пункт меню будет активен, после предьяатения меню на экран, то есть задает вы­бор по умолчанию.

    Для этих же целей предусмотрена и вторая команда:

    SHOW MENU <списокимси BAR-Meino> |ALL [PAD <имя пункта меню> ]

    [SAVE)

    Назначение опций:

    PAD <имя пункта меню> — определяет, какой пункт меню будет активен, после предъявления меню на экран, то есть задает вы­бор по умолчанию.

    SAVE — сохраняет на экране образ меню после его закрытия.

    1. Реакция на вызов горизонтального меню

    ON SELECTION MENU <ичя BAR-Me»im> [ <комацца>}

    Команда определяет реакцию на вызов меню, то есть ставит на выполнение общую для всего меню команду или процедуру, которая определена в параметре <команда>. Если параметр <команда> опущен, то отменяется ранее назначенная <комаша>.

    1. Реакция на выбор пункта меню

    ON SELECTION PAD <имя пункта чсню> ОЕ <имя BAR-mciuo> [ <команда> J

    Команда определяет для конкретного пункта меню <имя путпета меню>, принадлежащего меню <имя ВАЛ-меню>. ко­манду или процедуру, которая определена в параметре <коман- да>, и ставит ее на выполнение.

    1. Назначение подчиненного (младшего) меню

    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

    Команда удаляет с экрана горизонтальное меню, но сохраня­ет его в оперативной памяти, и передает управление следующей команде программы.

    1. Удаление всех горизонтальных меню CLEAR MENUS

    Команда удаляет все меню с экрана и из оперативной памяти.

    1. Удаление горизонтального меню

    RELEASE MENUS I < список нмси BAR-mchio> [ EXTENDED J ]

    Команда удаляет с экрана и из оперативной памяти перечис­ленные в <списке имен ВАЯ-меню> меню. Если указана опция EXTENDED, то одновременно удаляются и все подчиненные меню.

    8.2.2.Э. Удаление пункта горизонтального меню

    RELEASE PAD <имя пункта ченю> | ALL OF <нмя BAR-mcjdo>

    Команда удаляет с экрана и из оперативной памяти указанный в <имени пункта мсню> пункт либо все (ALL) пункты меню из горизонтального меню, заданного в <имсни ВАИ-менюХ

    1. Деактивация горизонтального меню

    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 SELEC­TION 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- меню, которое предъявляется в любом месте экрана, как прави­ло, с помощью щелчка правой кнопкой мыши.

    1. КЛАВИШНОЕ МЕНЮ

    В отличие от светового меню, клавишное меню не имеет в своем составе каких-либо элементов управления расположенных на экране. Клавишное меню представляет собой набор одно- или двухклавишных команд. Иногда в последней строке экране раз­мещают подсказку о назначении команд клавишного меню. Юга- вишнос меню предназначено для реализации простых и часто повторяющихся операций по обработке данных.

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

    1. Фиксация возникновения ошибки во время выполнения программы

    ON ERROR [<комаича>)

    Команда осуществляет переход к выполнению <команды> при возникновении любой ошибки при выполнении программы.

    1. Фиксация ошибок ввода

    ON READERROR [<команда>]

    При обнаружении ошибки ввода ставится на выполнение <команда>. Ошибка ввода возникает при вводе данных не соот­ветствующего типа, при нарушении границ допустимых значе­ний данных или при нарушении логических условий.

    1. Фиксация нажатия клавиши Esc

    ON ESCAPE [<комаыда>]

    После нажатия клавиши Esc ставится на выполнение коман­да. указанная в параметре <команда>. Если ранее по тексту про­граммы была установлена команда SET ESCAPE OFF, то коман­да ON ESCAPE ... не выполняется.

    1. Фиксация нажатия любой клавиши

    ON KEY [<комаеда>]

    После нажатия любой клавиши выполняется команда, указанная в параметре <команда>. Эта команда работает во всех режимах, кроме режима редактирования.

    1. Фиксация нажатия клавиши с указанным кодом

    ON KEY = <Bup.N> [<команда>]

    После нажатия клавиши с кодом <выр.М> ставится на вы­полнение команда, указанная в параметре <команда>.

    1. Фиксация нажатия клавиши с указанным именем

    ON KEY [LABEL <имя клавнши>] [<команда>]

    После нажатия клавиши с именем <имя клавиши> ставится на выполнение команда, указанная в параметре <командах Имя клавиши задается как строчными, так и прописными буквами. Клавиши, описанные этой командой, остаются активными во всех режимах работы. Нажатие такой клавиши в любой момент времени и в любом месте программы влечет за собой немедлен­ное выполнение предусмотренной в параметре <команда> про­цедуры или команды. Поэтому при выполнении длительных вычислительных операций необходимо предусмотреть отмену команд ON KEY LABEL ... и ON KEY = ... теми же команда­ми, но без опций или командой PUSH KEY CLEAR.

    В командах ON KEY = и ON KEY LABEL ... можно указать почти все клавиши и комбинации клавиш. В программе допускает­ся использование только одной активной команды ON KEY = ..., в то время как активных команд ON KEY LABEL ...может быть несколько.

    L

    Все ON-команды, кроме команды ON KEY LABEL ..., ра­ботают до тех пор, пока не будет обнаружена следующая такая же

    команда. Дня отмены действия любой О IS-команды надо подать ту же команду, но без опции.

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

    Чаше всего клавишные меню используются в режимах редак­тирования: BROWSE, EDIT, CHANGE и READ.

    1. Сохранение клавишных назначений в оперативной памяти

    PUSH KEY [CLEAR]

    Команда сохраняет все сделаные назначения командами ON KEY LABEL ... в специальной области оперативной памяти, ко­торая называется стеком . Если указана опция CLEAR, то допол­нительно прекращается действие клавишнььч назначений в рабо­тающей программе. При последовательном вызове команды PUSH KEY ... в стек будет записано несколько отдельных групп клавишных назначений. Извлекаться из стека группы назначе­ний будут в обратном порядке.

    1. Извлечение клавишных назначений из оперативной памяти

    POP KEY TALL]

    Команда извлекает из стека клавишные назначения в обрат­ном порядке и делает их активными. Если указана опиия ALL, то стек очищается, и отменяются все текущие назначения.

    1. Изменение назначений функциональных клавиш

    SET FUNCTION <Bbip.N> | <имя клавиши> ТО [ <выр.О ]

    Команда закрепляет выражение символьного типа <выр.С> за функциональной клавишей. Клавишу задают либо порядко­вым номером <Bbip.N>, либо именем <имя клавиши>. Если символьное выражение <выр.С> содержит символ «;* (точка с запятой), то наличие этого символа соответствует нажатию кла­виши Enter. Символьное выражение <выр.С> может содержать несколько команд, раэдслсшшх символом «;*. Если в символь­ное выражение <выр.С> будет помешено число (символ «;* в этом случае игнорируется), то это число правильно определяется командой ввода @ GET В Симени клавиши> при задании име­ни клавиши допускается использование комбинании функцио­нальных клавиш со специальными клавишами Shift и Ctrl.

    1. Отмена назначений функциональных клавиш

    CLEAR MACROS

    Команда отменяет все назначения как пользовательские, так и системные за функциональными клавишами.

    1. Отмена назначения конкретной функциональной клавиши

    SET FUNCTION <имя клавиши ТО

    Для просмотра текущих клавишных назначений следует исполь­зовать команду DISPLAY | LIST STATUS или функцию ON().

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

    1. Определение кода нажатой клавиши

    INKEY( [ <Bbip.N> 1 [, <выр.О ])

    Функция возвращает ASCII-код последней нажатой клави­ши. Если нажатия клавиши не было, то функция возвращает 0 (ноль). Параметр <выр.Ы> задает время ожидания в секундах до нажатия клавиши (или задание временного интервала — паузы). Если <выр.Ы>=0, то задано неограниченное время ожидания нажатия клавиши. Если параметр <выр.1М> не указан, то функ­ция выполняется немедленно. Параметр <выр.С> управляет включением/выключением курсора и фиксацией факта нажатия кнопки мыши. Параметр <выр.С> может содержать одну из констант или сочетание констант:

    S — включить курсор;

    Н — выключить курсор;

    М — контроль нажатия кнопки мыши (при этом возвращает­ся значение 151).

    1. Определение кода нажатой клавиши и направление кода в буфер

    LASTKEYO

    При нажатии клавиш их коды заносятся в буфер клавиатуры. При нажатии клавиш управления (Enter, Tab и т. д.) содержимое буфера переносится в оперативную память. Код последней нажа­той клавиши, кроме того, переносится в клавишную ячейку.

    Функция LASTKEYO работает только с клавишной ячейкой.

    Функция INKEY( <выр.1Ч>) ждет нажатия любой клавиши и, кроме того, возвращает код нажатой клавиши и переносит код нажатой клавиши в клавишную ячейку, не дожидаясь нажатия одной из клавиш управления, таким образом предоставляя воз­можность работать функции LASTKEYO- Функция INKEY0 без параметров работает только с буфером клавиатуры. Если буфер заполнен, то она читает левый символ, возвращает его код, поме­щает код прочитанного символа в клавишную ячейку и сдвигает содержимое буфера на один символ влево. Таким образом, мно­гократно подавая функцию INKEY(), можно очистить буфер клавиатуры. Заполняется буфер клавиатуры двумя способами, либо с помощью нажатия клавиш, либо с помощью функции KEYBOARD( <выр.О).

    1. Фиксация выхода из режима редактирования

    READKEY0

    Функция возвращает код клавиши, с помощью которой был осуществлен выход из режима редактирования. Кроме того, воз­вращаемый код содержит информацию о том, было ли редакти­рование данных. Выйти из режима редактирования можно с по­мощью одной из клавиш, при этом возвращается один из вариан­тов кода клавиши:

    Имя клавиши Данные не изменяюсь Данные изменялись

    БАЗЫ ДАННЫХ 2

    Оглавление 4

    От автора 6

    Справочник команд, операторов и функций 9

    ... 114

    ... | 156

    I 207

    Литература 364

    1. Определение команды, закрепленной за клавишей

    ON( <выр.С1> [, <выр.С2> ])

    Функция возвращает команду, закрепленную за клавишей или ON-командой.

    <выр.С1> — содержит ON-команду (например. ERROR, READERROR, KEY, и т. д.).

    <выр.С2> — содержит имя клавиши. Используется только для команды ON KEY LABEL.

    1. Проверка заполнения буфера клавиатуры

    CHRSAW( ( <выр.М> ] )

    Функция возвращает значение «истина» (.Т.), если в буфере клавиатуры имеется хотя бы один символ, содержимое буфера не изменяется. В противном случае возвращается значение «ложь*

    (F).

    1. Управление регистром букв

    CAPSLOCK( [ <выР.1> ])

    Если <Bbip.L> истинно (.Т.), то устанавливается верхний ре­гистр. Если <вырХ> ложно (.F.), то устанавливается нижний регистр. Если <вырХ> отсутствует, то устанаативается текущее состояние регистра (управление с клавиатуры).

    1. Ввод данных с клавиатуры

    INPUT [<кыр.>] ТО <псрс.менная пачяти>

    Команда производит ввод данных от пользователя (с клави­атуры) и сохраняет их в указаной <переменной памятиХ Тип <переменной памяти > определяется типом ввод имых данных.

    1. Ввод данных символьного типа с клавиатуры

    ACCEPT [<выр.>] ТО <переменная памятн>

    Команда производит ввод данных символьного типа от поль­зователя (с клавиатуры) и сохраняет их в указаной <переменной памятиХ В отличие от команды INPUT, в команде ACCEPT ука­зание разделителя (кавычек или двойных кавычек) не предусмат­ривается.

    1. Определение имени переменной (поля), куда вводятся данные

    VARREAD0 или SYS(18)

    Функции возвращают имя переменной или поля, куда с по­мощью команды READ вводятся данные, при условии что было выполнено прерывание от одной из клавишных команд. Имя пе­ременной возвращается прописными (большими) буквами. Имя поля возвращается строчными буквами, кроме первой буквы: первая буква — прописная.

    1. Примеры

    Пример 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

    SELE fam

    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

    in 12 alias ot

    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

    1. Контрольные вопросы

    1. Что такое световое меню и каковы его основные элементы?

    2. Что такое клавишное меню и каковы его основные элементы?

    3. Каким приемом задать недоступный пункт меню?

    4. Как отделить одну группу пунктов меню от другой (руппы пунктов меню?

    5. Укажите особенности светового меню типа Fox.

    6. Укажите особенности светового меню типа dBASE.

    7. Расскажите об особенностях создания и использования

    LIGHTBAR-меню.

    1. Расскажите об особенностях создания и использования

    POPU P-меню типа Fox.

    1. Расскажите об особенностях создания и использования

    PULLDOWN-меню.

    1. Укажите порядок создания меню типа Fox.

    И. Какой командой создается POPUP-меню типа dBASE?

    1. Укажите команды для предъя&ления на экран POPUP-меню типа dBASE.

    2. Укажите команды для удаления с экрана (и из оперативной памяти) POPUP-меню типа dBASE.

    3. Какой командой создается BAR-менютипа dBASE?

    4. Укажите команды для предъявления на экран BAR-мсню типа dBASE.

    5. Укажите команды для удаления с экрана (и из оперативной памяти) BAR-мснютипа dBASE.

    6. Какой командой производится закрепление подчиненного меню за пунктом POPUP-меню? За пунктом BAR-меню?

    7. Укажите порядок действий при создании двухуровневого (много­уровневого) меню типа dBASE.

    8. Какими командами клавишного меню фиксируются ошибки рабо­ты программы?

    9. Расскажите о вариантах использования команды ON KEY.

    10. Что такое стек? Как сохраняются и как извлекаются клавишные ко­манды из стека?

    11. Укажите команды для обработки кодов нажатых клавиш.

    ОПРЕДЕЛЕНИЕ ОКОН

    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 — переход к друтому окну. Переход также выполняет­ся щелчком левой кнопки мыши на нужном окне.

    Для работы с окнами предусмотрены следующие команды.

    1. ОПИСАНИЕ (СОЗДАНИЕ) ОКНА

    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).

    1. АКТИВАЦИЯ ОКНА

    ACTIVATE WINDOW

    [ <имя окпа!> J [, <имя окна2> J [... ] | ALL [ BOTTOM | ТОР ]

    Команда предъявляет на экран ранее определенные окна, име­на которых указаны в списке [ <имя окна1> ] [, <имя окна2> ][...], либо все окна (ALL). Кроме того, можно указать расположение открываемых окон: под ранее открытыми окнами (BOTTOM) или перед уже открытыми окнами (ТОР) По умолчанию приня­та опция ТОР.

    1. УПРАВЛЕНИЕ РАСПОЛОЖЕНИЕМ ОКНА

    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.

    1. ДЕАКТИВАЦИЯ ОКНА

    DEACTIVATE WINDOW <имя окна1> [, <имя окна2> ] |...} | ALL

    Команда удаляет с экрана, но оставляет в оперативной памя ти окна, указанные в списке <имя окна1> [, <имя окна2> ][...] или все (ALL) окна. После этого вывод направляется либо в ос­тавшееся открытое окно, либо на экран.

    1. ПЕРЕМЕЩЕНИЕ ОКНА

    MOVE WINDOW <ичя окна> ТО Y, X | BY <bmp.N 1>, <Bbip.N2> | CENTER

    Команда перемещает указанное <нмя окна> окно на экране или внутри другого окна. Причем левый верхний угол окна помещает ся в точку, указашгую либо абсолютными координатами ТО Y, X, либо oTHocHTej ьными координатами BY <Bbip.Nl>, <Bbip.N2>, ли­бо располагается по центру — CENTER. Команда может выпол­няться как до активации окна, так и после активации.

    1. УДАЛЕНИЕ ОКОН

    CLEAR WINDOWS

    Команда удаляет все окна с экрана и из оперативной памяти.

    1. УДАЛЕНИЕ УКАЗАННЫХ ОКОН

    RELEASE WINDOWS Ссписок имен окон>

    Команда удаляет с экрана и из оперативной памяти окна, имена которых указаны в списке <список имен окон>.

    1. СОХРАНЕНИЕ ОКОН В ПАМЯТИ

    SAVE WINDOW Ссписок имен окон> | ALL ТО Снмя файла> |

    ТО MEMO Симя MFMO ноля >

    Команда сохраняет либо указанные в списке <список имен окон> окна, либо все (ALL) окна или в файле ТО Симя файла> или в Memo-поле ТО MEMO Снмя MEMO поля >

    1. ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ОКОН

    RESTORE WINDOW Ссписок имен окон> | ALL FROM Снмя файла> | FROM MEMO Снмя МЕМО-иоля>

    Команда восстанавливает в оперативной памяти описания окон, имена которых указаны в списке Ссписок имен окон> или все (ALL) поля. Восстаноатсние производится либо из файла Симя файла>, либо из Memo-поля Симя MEMO поля>.

    1. ИЗМЕНЕНИЕ ПОЛОЖЕНИЯ ОКНА

    ZOOM WINDOW Симя окна> MIN [ AUTO ] | MAX | NORM [ АТ У1, XI | FROM Yl, XI [ SIZE Y2, Х21 ТО Y3, ХЗ ] |

    Команда перемешает указанное окно <имя окна> с одновре­менным изменением его размеров, если это задано. Перемещае­мое окно должно быть ранее описано командой DEFINE WIN­DOW ... Перемещать можно как активированное, так и деактиви­рованное окно. Назначение опций:

    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, ХЗ).

    1. ПРОКРУТКА ОКНА

    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. Примеры

    Пример 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

    1. 13. Контрольные вопросы

    1. Какой интерфейс имеет FoxPro — однооконный или многоокон­ный?

    2. Какие три состояния может иметь окно?

    3. Какой командой описывается окно пользователя? Каковы особен­ности этой команды?

    4* Укажите команды предъявления окна на экран и удаления окна с экрана.

    1. Какая команда управляет расположением окна? Каковы особенно­сти этой команды?

    2. Какой опцией какой команды задается верхний (нижний) заголовок окна?

    3. Какие опции какой команды управляют закрытием и перемещени­ем окна?

    4. Какие опции какой команды управляют размерами окна*7

    5. Чем отличается деактивация окна от удаления окна? Какими коман­дами выполняются эти действия?

    6. Назовите две команды перемещения окна.

    7. Как определить количество строк и столбцов окна?

    8. Как проверить, существует ли окно с указанным именем?

    ПСЕВДОГРАФИКА И ЭЛЕМЕНТЫ УПРАВЛЕНИЯ

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

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

    1. ИЗОБРАЗИТЕЛЬНЫЕ СРЕДСТВА

    Изобразительные средства, о которых мы расскажем в п. I0.1, использовались для создания привлекательного внешнего вида в ранних версиях FOX PRO.

    В настоящее время они по-прежнему разрешены к использо­ванию, в современных версиях FOX PRO элементы эстетическо­го оформления выполняются средствами, рассмотренными далее, в п. 10.2.

    1. Создание рамки

    @ Yl, XI Y2.X2 BOX <выр. О

    Команда рисует рамку с координатами левого верхнего Yl, XI и правого нижнего Y2, Х2 углов. При желании в углах рамки и в центре каждой из сторон рамки можно установить символ <выр. С>. <выр. О содержит символьное выражение длиной не более девяти символов (девятый символ устанавливается в цент­

    ре прямоугольной области). Если <выр. О отсутствует, то рам­ка будет нарисована одиночной линией.

    1. Создание рамки с определением цвета и формы

    @ Yl, XI ТО Y2.X2 ( DOUBLE | PANEL | <шаблои> ]

    [ COLOR <слнсок пар овстов> | COLOR SCHEME <выр. N> ]

    Команда рисует рамку с координатами левого верхнего Yl, XI и правого нижнего Y2, Х2 углов. Рисование выполняется только вниз и вправо. Назначение опций:

    DOUBLE — контур рамки рисуется двойной линией.

    PANEL — контур рамки рисуется одиночной линией.

    <шаблон> — контур рамки составлен из символов, указанных в шаблоне. В шаблоне символы перечисляются через запятую. Если в <шаблоне> указан один символ, то этим символом и вы­полняется контур рамки. Если в <шаблоне> содержится несколько символов, но не более девяти, то рамка рисуется ана- Л01 ично предыдущей команде.

    1. Задание окантовки для окон и меню

    SET BORDER ТО [ SINGLE | DOUBLE | PANEL | NONE | <шаблов1> | <шаблон2> ]

    Команда задаст тип линии рамки, которая создается коман­дой @... ТО для меню, описанных командами DEFINE MENU ... или DEFINE POPUP ..., а также для окон, описанных командой DEFINE WINDOW ... Назначение опций:

    SINGLE — одиночная линия (будет нарисована по умолчанию). DOUBLE — двойная линия.

    PANEL — сплошная линия рамки.

    NONE — линия рамки отсутствует.

    <шаблон1> — символьный шаблон дпя линии рамки активного окна.

    <шаблон2> — символьный шаблон для линии рамки пассивных окон.

    Шаблоны составляются по правилам, указанным для преды­дущих команд.

    1. Установка цвета

    Команда установки цвета элементов экрана имеет несколько вариантов исполнения.

    Для обозначения цветов и эффектов используются следую­щие символы:

    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 [ <ставдарт> ]

    1. Управление мерцанием

    SET BLINK ON | OFF

    Команда включает или отключает мерцание. По умолчанию мерцание выключено.

    1. Изменение цвета существующего изображения

    @ Y1,X1 FILL ТО Y2,X2 [COLOR <список пар цвстож> |

    COLOR SCHEME <Bbip.N>l

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

    1. Определение текущего набора цветов

    SCHE\lE(<Bbip. N>)

    Функция выводит на экран список цветовых пар дпя указан­ной в <выр. N> схемы.

    1. Управление звуком

    SET BELL ON | OFF

    Команда включает или выключает звуковой сигнал при ре­дактировании данных в командах BROWSE, EDIT, CHANGE, APPEND, INSERT и READ. Звуком сопровождается выход из редактируемого поля.

    1. Установка частоты и длительности звукового сигнала

    SET BELL ТО <частота>, <длнтельиость>

    Команда задает частоту звуконого сигнала в герцах в диапазо­не от!9Гцдо 10000 Гц и длительность звучания сигнала в секун­дах от I сек до 19 сек.

    1. ЭЛЕМЕНТЫ УПРАВЛЕНИЯ

    При создании пользовательского интерфейса удобно использо­вать элементы управления. Элементы управления можно как про­граммировать с помощью команд FoxPro, так и, используя лист формы, располагать на форме готовые элементы управления.

    Для описания элементов управления, как правило, использу­ется команда @ GET с опцией FUNCTION или PICTURE. Элементы управления можно располагать как на экране, так и на форме. Если элемент управления надо расположить на форме, то программный код этого элемента упраатения помещают на лист программного кода формы (двойной щелчок на листе формы выводит на экран лист программного кода формы). При описа­нии элемента управления с помощью команд создастся либо тер­минальный элемент (TERMINATING), который при своем опи­сании требует команду считывания READ, и при работе задает выполнение какой-либо команды (например печать); либо не­терминальный элемент (NOTERM1NATING), который пред­назначен для определения особенностей выполнения действий терминального элемента (например определение режимов печа­ти)- При составлении шаблонов для опций FUNCTION и PIC­TURE первый символ шаблона определяет функциональный код создаваемого элемента упраатения:

    * — кнопки различных типов;

    Л — списки различных типов.

    Второй символ шаблона указывает на конкретный вид элемента управления:

    *R — радиокнопка (Radio Button).

    *С — флажок (CheckBox).

    •пробел — невидимая кнопка (Invisible Button). Если пробел есть, то кнопка будет видима. Если пробела нет, то кнопка — невидима Лпробел — раскрывающийся список (СошЬоВох).

    Дня создания списка (List Box) вместо опции FUNCTION используют опцию FROM.

    При описании некоторых элементов можно использовать третий символ, который замешает опцию по умолчанию:

    N — нетерминальная кнопка.

    Т — терминальная кнопка.

    Н — расположение элементов по горизонтали (HORIZONTAL). V — расположение элементов по вертикали (VERTICAL).

    После установки двух (или трех) символов шаблона обяза­тельно устанавливается пробел. Шаблоны для опций FUNC­TION и PICTURE пишутся одинаково, но для опции PICTURE шаблон всегда начинается с символа

    Стандартные элементы управления, взятые с панели инстру­ментов, могут располагаться только на форме.

    1. СОЗДАНИЕ ЭКРАННОЙ ФОРМЫ

    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 экранная форма существует как функциональный объект проектирования. На экранной форме объединяются визуальные компоненты, элементы управления и сервисные (вспомогательные) элементы.

    1. Создание экранной формы

    с помощью Мастера форм — 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].

    1. Создание экранной формы

    с помощью Конструктора форм — 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.

    1. Форма

    Саму форму можно рассматривать как компонент. Форма имеет свойства и методы. Форма имеет размеры, может располагаться на экране произвольным образом, при открытии формы предва­рительно могут выполняться какие-то действия (и при закрытии тоже). Под настройкой экранной формы понимают определение ее размеров, положения на экране, описание заголовка и, при не­обходимости, задание среды окружения. Если на поле формы Щелкнуть левой кнопкой мыши, то форма станет активной, и в окне 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 на экран выводится список имен таблиц, которые могут быть источником данных для сод аваемой экранной фор­мы. Задание таблиц производится стандартным способом.

    Рассмотрим основные свойства компонент, располагаемых на экранной форме.

    1. Label - надпись

    Компонент Label размешает текстовую информацию в любом месте экранной формы. В окне Properties можно задать следую­щие свойства.

    Caption — содержит текст, который надо расположить на экран­ной форме.

    BackStyle — задает фон под надписью. Свойство может содер­жать одну из констант:

    Opaque — устанавливаемый цвет. Константа по умолчанию.

    Transparent — фон надписи совпадает с фоном экранной формы.

    BackCoIor — задаст цвет фона надписи. Это свойство имени смысл, если свойство BackStyle содержит константу Opaque. FontName, FontStyle и FontSizc — определяют соответственно тип, стиль и размер шрифта надписи.

    BorderStyle — задает рамку вокруг надписи. Свойство может содержать одну из констант:

    None — рамки нет. Константа по умолчанию;

    FixedSingle — рамка в виде одиночной линии.

    1. 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, то ярлычок не отображается.

    1. EditBox - поле редактирования

    Основное назначение полей редактирования — внесение изме­нений в поля большого размера и Memo-поля. Основные свой­ства:

    ScrollBars — управляет выводом на экран полосы прокрутки. Свойство может содержать одну из констант:

    None — полоса прокрутки отсутствует;

    Vertical — выводит вертикальную полосу прокрутки.

    Остальные свойства аналогичны свойствам компонента TextBox.

    1. CommandButton - командная кнопка

    Кнопка предназначена для постановки на выполнение различ­ных процедур. Основные свойства и методы:

    Caption — размещает надпись на кнопке.

    Picture — размещает пиктограмму па кнопке, при этом на экран выводится диалоговая панель для задания имени файла пик­тограммы.

    Click — метод определяет, какие команды будут выполняться при нажатии на кнопку. Для написания команд реакции нажатия на кнопку надо либо дважды щелкнуть на кнопке для того, чтобы открылось окно редактора программных кодов, либо на вкладке Methods щелкнуть мышью на имени метода Click. Полный спи­сок метолон представлен на вкладке Methods.

    1. CommandGroup - группа командных кнопок

    Некоторые компоненты являются составными объектами: CommandGroup и OptionGroup. То есть в их состав входит не­сколько однотипных объектов, каждый из которых имеет свои собственные свойства и методы. Если курсор мыши расположить на составном объекте и правой кнопкой мыши вызвать на экран контекстное меню, то команда Edit из контекстного меню по­зволит перевести весь компонент в режим редактирования. При включенном режиме редактирования весь составной компонент заключается в голубую рамку. В режиме редактирования каждым элементом, входящим в составной компонент, можно управлять как самостоятельным компонентом: перемешать внутри голубой рамки, изменять другие свойства. Для выхода из режима редак­тирования надо щелкнуть мьпнью на поле формы.

    После установки составного компонента на форме надо за­дать количество элементов, входящих в составной компонент с помощью свойства ButtonCount. По умолчанию свойство ButtonCount имеет значение 2.

    Все остальные свойства и методы каждого отдельного элемен­та составного компонента CommandGroup аналогичны свойст­вам и методам компонента CommandButton.

    1. OptionGroup - радиогруппа

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

    Style — задает вид переключателя. Свойство может содержать одну из констант:

    Standard — стандартный стиль исполнения;

    Graphical — графический тип. Отсутствует место фиксации выбора пользователя. При выборе элемента пользователем кнопка «углубляется».

    Left, Тор — определяютрасстоянис меаду кнопками соответствен­но при горизонтальном и вертикальном расположении кнопок. BorderStyle — задает обрамление компонента. Свойство может содержать одну из констант:

    None — обрамление отсутствует;

    Fixed Single — обрамление одиночной линией.

    1. CheckBox - флажок

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

    • Caption — задает название флажка.

    • FontName и FontSize — задают тип и размер шрифта соот­ветственно.

    • ForeColor — задает цвет шрифта названия флажка.

    • BackColor — задает цвет фона названия флажка.

    • Click — метод описывает реакцию на включение и выклю­чение флажка.

    1. 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, на экране занимает только одну’ строку. Раскрывающийся спи­сок имеет те же свойства и методы, что и список.

    1. Spinner - счетчик

    Счетчик предназначен для задания полю числового значения, которое находится в заданном д иапазоне. Основные свойства: SplnnerHightValue — минимальное значение, вводимое из компонента.

    SpinncrLowValue — максимальное значение, вводимое из компо­нента.

    KeyboardllightValue — минимальное значение, вводимое с клавиатуры.

    KeyboardLowValuc — максимальное значение, вводимое с клави­атуры.

    Increment — шаг изменения значения, вводимого из компонента.

    Остальные свойства аналогичны рассмотренным выше компонентам.

    1. Line - линия

    Компонент Line предназначен для проведения на форме разгра­ничительных линий, с целью отделения одной группы компо­нентов от другой. Компонент носит декоративный характер. Линия на форме рисуется следующим способом: на панели инс­трументов выбирают компонент Line. Затем курсор мыши уста­навливают в точку начала линии и зажимают левую кнопку' мыши. Курсор мыши буксируют в нужном направлении. В точке окончания линии кнопку мыши отпускают. Затем на вкладке свойств Properties задают свойства нарисованной линии. Основ­ные свойства:

    BorderColor — задает цвет линии.

    BorderStyle — задает тип линии. Свойство может содержать од­ну из констант:

    Transparent — линия отсутствует, но цвет фона может быть. Solid — тонкая линия. Свойство по умолчанию.

    Dash — штриховая линия.

    Dot — пунктирная линия.

    Dash-Dot — штрих-пунктирная линия.

    Dash-Dot-Dot — линия, состоящая из штриха и двух пунктиров.

    Border Width — залает толщину линии в пунктах.

    DrawMode — определяет отображение линии на экране совмест­но со свойствами цветов. Свойство может содержать одну из кон­стант:

    Manual — ручное управление отображением линии. Automatic — автоматическое управление отображением линии.

    1. 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 — задает цвет узора заполнения.

    1. Image - размещение графического изображения

    Компонент Image предназначен для расположения на форме графического изображении. Допускается размещение графиче­ского объекта с расширением .bmp. а также экспорт графиче­ского объекта с расширением .рсх . Основные свойства:

    Picture — предназначено для предварительного просмотра и вставки графического файла. После выделения курсором этого свойства надо в строке свойства дважды щелкнуть левой кноп­кой мыши и в диалоговой панели Open указать имя нужного графического файла. Кнопка Preview на диалоговой панели Open прелназначена для предварительного просмотра графиче­ского файла. В этом свойстве явно указывается путь к графиче­скому файлу.

    1. 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. Примеры

    Пример 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

    В результате выполнения команды на экран выводится диало­говая панель Data Environment (рис. 10.2), в рабочее поле которой надо поместить таблицы, данные из которых будут помешены во входную форму.

    О

    D la Envnonntent - FonnDocI

    си

    1. idds keyjam name Jam

    QDndexes.

    name

    1. 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()

    1. Кнопка «Клиент»

    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 £ ИМЯ

    ; Г

    /'Гсздд ~ Уякцз Г Клиент

    floBatxtt

    i

    Уучи.кчЬхпьтза

    Поиск

    |w J

    Фильтр

    J

    Персая | Слгдющэя | Пргдыдацая | f П« -адндя | 8ыюд' | Рис. 10.5. Фильтрация таблицы «Имя».

    лы внутри условия фильтра запрещены. Результат фильтрации приведен на рис. 10.5.

    При добавлении значений в родительскую таблицу («Фа­милия», «Имя» и «Отчество») поле ключа не заполняется. Уникальное значение первичного ключа присваивается автома­тически.

    1. Контрольные вопросы

    1. Для каких целей используют элементы управления?

    2. Что такое класс?

    3. Что такое объект?

    4. Назовите ключевые слова для доступа к объектам.

    5. Что из себя представляет экранная форма и для каких целей она используется?

    6. Назовите два способа создания экранной формы.

    7. Укажите назначение и основные принципы работы с Мастером форм.

    8. Укажите назначение и основные принципы работы с Конструкто­ром форм.

    9. Укажите назначение режима проектирования в Конструкторе форм.

    10. Как установить режим проектирования в Конструкторе форм?

    11. Укажите назначение рабочего режима в Конструкторе форм.

    12. Как перейти в рабочий режим в Конструкторе форм?

    13. Укажите назначение панели инструментов Form Controls в Конст­рукторе форм.

    14. Укажите назначение панели инструментов Fomi Designer и Конст­рукторе форм.

    15. Укажите назначение панели инструментов Layout в Конструкторе форм

    16. Укажите назначение панели инструментов Color Palette в Конст­рукторе форм.

    17. Какие действия надо выполнить для размещения компонента на форме?

    18. Как сделать компонент активным (пассивным)?

    19. Укажите назначение окна Properties. Для какого компонента пред­назначено окно Properties?

    20. Объясните назначение вкладок окна Properties: All. Data, Methods, Layout и Other.

    21. Назовите два способа задания свойств и методов компонента.

    22. Как удалить компонент с формы?

    23. Как установить на форме вспомогательную сетку?

    24. Что такое фокус управления?

    25. Как изменить порядок обхода элементов управления (компо­нент)?

    26. Укажите основные свойства и методы компонента «Форма».

    27. Укажите основные свойства и методы компонента «Label».

    28. Укажите основные свойства и методы компонента «TextBox*.

    29. Укажите основные свойства и методы компонента «EditBox*.

    38 Укажите основные свойства и методы компонента

    «Command Button».

    Укажите основные свойства и методы компонента

    «CommandG roup*.

    * Укажите основные свойства и методы компонента «Option Group».

    . Укажите основные свойства и методы компонента «CheckBox».

    и» Ui и* и* ы и> ы

    « 90 9\ 'Л ^ Ы

    . Укажите основные свойства и методы компонента ListBox».

    . Укажите основные свойства и методы компонента «ComboВох». . Укажите основные свойства и методы компонента «Spinner».

    . Укажите основные свойства и методы компонента «Line*.

    . Укажите основные свойства и метопы компонента «Shape».

    . Укажите основные свойства и методы компонента «Image».

    40. Укажите основные свойства и методы компонента «General*.

    Глава 11

    ОСНОВЫ ЯЗЫКА ЗАПРОСОВ SQL

    Структурированный язык запросов SQL является универсаль­ным средством управления базами данных. Этот язык предус­мотрен практически во всех системах управления базами данных. С помощью языка SQL можно как создавать новые объекты, так и управлять существующими объектами. Рассмотрим основные команды языка SQL.

    1. СОЗДАНИЕ ТАБЛИЧНОГО ФАЙЛА

    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

    В любом из трех случаев программист должен следить за со- °тветствием типов вводимых данных типам полей таблицы.

    1. РЕДАКТИРОВАНИЕ ЗАПИСЕЙ ТАБЛИЦЫ

    Любую запись (или группу записей) в таблице можно отредакти­ровать. Для этого предназначена команда:

    UPDATE <нчя таблицы> ;

    SET <имя поля 1> = <значение 1> [, <ммя поля 2>

    <значенис 2> ... ] ;

    WHERE <нмя поля ионска> = <)словие нонска>

    Если опция WHERE опущена, то замена значения будет про­изведена во всем столбце.

    1. ВЫБОР ДАННЫХ ИЗ ТАБЛИЦЫ

    Команда 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. Примеры

    Пример 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 {Северянин

    Результат работы программы показан на рис. 11.3.

    Пример 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

    Сологуб')

    SET DEFAULT TO E:\Prim_bd USE Catalog IN 2 ALIAS Cat IN 5 ALIAS Fax IN 7 ALIAS Im IN 10 ALIAS Ct OFF

    Допускается использование краткого формата команды.

    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 опущена, то замена значения будет про­изведена во всем столбце.

    1. Контрольные вопросы

    L Укажите область применения языка запросов SQL.

    1. Какие операции надданными можно выполнитьс помощью команд языка запросов SQL?

    2. Укажите два варианта создания табличного файла с помощью команды CREATE TABLE.

    1. Как задать контроль правильности вводимых значений в поле с помощью команды CREATE TABLE?

    2. Как задать значение по умолчанию для поля с помощью команды CREATE TABLE?

    Как задать первичный и внешний ключи с помощью команды CRATE TABLE?

    Как задать условия ссылочной целостности с помощью команды CREATE TABLE?

    9- Укажите команду для добавления записей в табличный файл.

    5- Напишите команду SELECT для выборки всех записей из ■таблицы.

    1. Напишите команду SELECT для выборки из таблицы записей, удов­летворяющих некоторому условию (условиям).

    2. Напишите команду SELECT для выборки всех записей из таблицы, с указанием сортировки по возрастанию (по убыванию) по значени­ям какого-либо поля.

    3. Напишите команду SELECT для выборки некоторых полей из раз­ных таблиц, удовлетворяющих некоторым условиям

    4. Напишите команду SELECT для выборки всех записей из таблицы, с указанием группировки данных по значениям некоторого поля.

    ФУНКЦИИ СУБД

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

    1. МАТЕМАТИЧЕСКИЕ ФУНКЦИИ

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

    1. Вычисление абсолютного значения

    ABS(<Bbip. N>)

    Функция возвращает абсолютное значение числа, заданного константой или переменной <выр. N>.

    Примеры.

    SET TALK OFF

    БАЗЫ ДАННЫХ 2

    Оглавление 4

    От автора 6

    Справочник команд, операторов и функций 9

    ... 114

    ... | 156

    I 207

    Литература 364

    1. Проверка на принадлежность интервалу значений

    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

    1. Получение целого числа, большего или равного аргументу

    CEILING(<Bbip. N>)

    Функция возвращает целое число, которое больше или равно числовому выражению <выр. N>.

    Примеры.

    ? CEILING (6.3) £с& Выводит на экран 7

    ? CEILING(-8.4) &Ь Выводит на экран -8

    1. Получение целого числа, меньшего или равного аргументу

    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. Выбор максимального значения из списка

    ^АХ(выр .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Ч(<выр. 1>, <выр. 2>, <выр. 3>,...)

    Функция возвращает минимальное значение из заданного ря­да значений. Все элементы ряда должны иметь один тип данных. Примером, в п. 12.1.6.

    1. Целочисленный остаток от деления

    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 && Восстановить вывод на экран

    указанное по умолчанию количество разрядов дробной части числа.

    1. Ю. Генератор псевдослучайных чисел от 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

    1. Определение знака числа

    SlGN(<BUp. N>)

    Функция возвращает I, если число положительное. Функция возвращает -1, если число отрицательное. Функция возвращает 0, если число равно нулю.

    Пример.

    STORE 10 ТО Numl STORE -10 ТО Num2 STORE 0 ТО Per_Zero CLEAR

    1

    -1

    0

    ? SIGN (Numl) USc Выводит на экран

    ? SIGN(Num2) && Выводит на экран

    ? SIGN (Per_Zero) && Выводит на экран

    1. Экспонента

    ЕХР(<выр. N>)

    функция возвращает основание натурачьного логарифма, возведенное в степень <выр. N>.

    Пример.

    ? ЕХР(О) £г£г Выводит ча экран 1.0000

    ? ЕХ?(1) && Зыводит на экран 2.7183

    1. Натуральный логарифм

    ШС(<выр. N>)

    Функция возвращает значение натурального логарифма от аргумента < выр. М>, но аргумент должен быть больше 0.

    Пример.

    CLEAR

    SET TALK OFF

    ? LOG(1) &£t Выводит на экран С.0000

    STORE EXP(2) TO peri

    ? LOG (peri) £c£c Зыводит на экран 2.0000

    1. Десятичный логарифм

    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

    1. Извлечение квадратного корня

    SQRT(<Bbip. N>)

    Функция возвращает значение квадратного корня от аргу­мента <выр. N>, но аргумент должен быть положительным.

    Пример.

    CLEAR

    ? SQRT{4) && Выводит на экран 2.0000

    ? SQRT(2*SQRT(2))&& Выводит на экран 1.6818

    1. Вычисление синуса

    81Н(<выр. N>)

    Функция возвращает значение синуса от аргумента <выр. N>, но аргумент задается в радианах.

    Пример.

    CLEAR

    БАЗЫ ДАННЫХ 2

    Оглавление 4

    От автора 6

    Справочник команд, операторов и функций 9

    ... 114

    ... | 156

    I 207

    Литература 364

    1. Вычисление косинуса

    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

    ? RTOD(ASIN(0)) && Выводит

    STORE 1 TO peri ? RTOD(ASIN(perl)) && Выводит

    ? RTOD(ASIN(SQRT(2)/2)) Выводит

    1. Вычисление 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))

    1. Вычисление тангенса

    TAN(<Bup. N>)

    r

    Функция возвращает значение тангенса угла. <выр. N> зада­йся в радианах.

    1. Вычисление арккотангенса

    АТГЧ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

    1. Числовое значение pi РЮ

    Функция возвращает значение 3.141592 Примеры см. в п. 12.1.19—12.1.21.

    1. Преобразование градусов в радианы

    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. СТРОКОВЫЕ ФУНКЦИИ

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

    1. Функции анализа

    1. Наличие вхождения

    <выр. С1>$<выр. С2>

    Если <вырС1> содержится внутри <вырС2>, то возвращается значение «истина» (.Т.), в противном случае — значение «ложь» (F.).

    Пример.

    ? 'база'$'база данных* && Выводит на экран .Т.

    1. Поиск по строке слева направо

    АТ]АТС(<выр. С1>, <выр. С2>, <выр. N>)

    г Поиск слева направо в строке <выр. С2> позиции, начиная с которой <выр. С1> входит в <выр. С2>. <Выр. N> указывает, ка­кое по счету вхождение интересует (по умолчанию <выр. N> = 1)

    Примеры.

    БАЗЫ ДАННЫХ 2

    Оглавление 4

    От автора 6

    Справочник команд, операторов и функций 9

    ... 114

    ... | 156

    I 207

    Литература 364

    Команда АТ() различает большие и маленькие буквы, а АТСО — различия не делает.

    1. Поиск по строке справа налево

    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

    1. Поиск выражения в списке

    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

    1. Проверка на цифру

    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 Выводит на экран.Т.

    1. Подсчет числа символов LEN(<Bbip. О)

    Функция возвращает количество символов в <выр. О. Пример.

    ? 1>ЕЫ('база данных') Выводит на экран 11

    1. Определение вхождения

    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

    1. Определение количества вхождений

    OCCURS(<Bbip. С1>, <выр. С2>)

    Функция возвращает число, обозначающее, сколько раз <выр. С1> входит в <выр. С2>.

    Пример.

    ? OCCURS('а','база данных') && Выводит на экран 3|

    1. Функции выделения

    1. Ввделение начала строки

    ШТ(<выр. О, <выр. N>)

    Выделение из <выр. О первых <выр. N> символов. ЕслМ <выр. N> длиннее <выр. О, то выделяется <выр. О целиком.

    Пример.

    ? LEFT('база данных',4) && Вьзодит на экран «база»

    1. Выделение конца строки

    ИСНТ<<выр. О, <выр. N>)

    Выделяет из строки <выр. О последние <выр. N> симво­лов.

    Пример.

    ? RIGHT('база данных',6) Выводит на экран «данных»

    1. Выделение произвольной подстроки

    SUBSTR(<Bbip. 0,<вач. позиция>, <число символов>)

    Выделяет из строки <выр. С> подстроку, начиная с <нач. позиция>, длиной в <число символов>.

    Пример.

    ? SUBSTR('база исходных данных *,6,8)

    * Выводит на экран ''исходных''

    1. Удаление пробелов из символьного выражения

    LTRIM(<Bup. О) | RTRIM(<Bbip. О) | АШШМ(<выр. О)

    Функции удаляют пробелы от выражения <выр.О слева, справа, слева и справа одновременно соответственно.

    1. Функции преобразования

    1. Конвертация (кодирование) символов

    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,Р)

    && Выводит на экран БАЗА ДАННЫЙ

    1. Повторение выражения несколько раз

    REPLICATE(<Bup. О, <выр. N>)

    Повторяет <выр. О <выр. N> раз.

    Пример.

    ? REPLICATE('Привет ' , 3)

    && Выводит на экран Привет Привет Призер

    1. Формирование строки пробелов

    SPACE(<Bbip. N>)

    Пробел повторяется <выр. N> раз.

    1. Редактирование (замена) части строки

    STUFF(<Bbip. С1>, <нач. позицня>,<число сичволов>, <выр. С2>)

    В строке <выр. С1> заменяется <число символов>, начиная с символа <нач. позиция>, на символы строки <выр. С2>.

    Если <число символов>=0, то <выр. С2> вставляется в <выр. С1> в позицию <нач. позиция>, не затирая (отодвигая) часть строки <выр. С1>.

    Если <выр. С2> пустая строка, то из строки <выр. С1> уда­ляется <чнсло символов>, начиная с <нач. позиция> с одновре­менным сжатием <выр. С1>.

    Пример.

    х='база исходных данных'

    ? STUFF(х,6,9, 'конечных') &.& Выводит на экран » '' база конечных данных''

    ? STUFF(х.6,9, " ) && Выводит на экран

    * ''база данных''

    1. Поиск и замена часта строки

    STRTRAN(<Bbip. С1>, <выр. С2>, <выр. С3>, <вир. Nl>, <выр. N2>)

    В строке <выр. С1>, начиная с позиции <выр. Nl>, ищется подстрока <выр. С2>. Если <выр. С2> найдено в строке <выр. С1>, то оно заменяется на <выр. С3>. Процесс поиска замены продолжается до позиции <выр. N2>.

    Если <выр. С3> отсутствует, то все найденные <выр. С2> бу­дут превращены в пустую строку. Если не указано <выр. Nl>, то поиск начинается с первой позиции. Если не указано <выр. N2>, то поиск продолжается до конца строки <выр. С1>.

    Пример.

    ? STRTRAN('база данных','а','А')

    && Выводит на экран ''бАзА дАнных*'

    ? STRTRAN('база данных','н')

    && Выводит на экран ''база даых''

    STRTRAN('база данных','а','*',2)

    && Выводит на экран ''баз* д*нных''

    1. Задание шаблона вывода данных

    ^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(). Только с мемо-полями работают следующие функции.

    ии:

    1. Определение первого вхождения подстроки

    ATLINE| ATCLINE(<Bbip. С1>,<мемо-поле>)

    Ищет первое вхождение <выр. С1> в <мемо-поле> и возвра­щает номер строки, где было найдено <выр. С1>. Если <выр. СР не найдено, то возвращается 0. •1 _

    ATCLINE не различает строчные и прописные буквы, а фунК- J ция ATLINE — различает. Далее найденная строка может обраба­тываться другими функциями.

    1. Определение последнего вхождения подстроки

    RATLI\E{<Bbip. С1>, <мемо-поле>)

    Определяет место последнего вхождения <выр. С1> в <мемо- Поле> и возвращает номер строки мемо-поля.

    Пример.

    employee Открытие таблицы

    STORE 'Японец' ТО per STORE MLINE(notes, RATLINE(per, notes));

    TO Per_FileLine ? per_FileLine

    1. Выбор строки по ее номеру

    MLINE(<MCMo-nwie>, <»чр. N>)

    Возвращает строку с номером <выр. N> Если <выр. N> боль­ше числа строк, то возвращается пустая строка.

    12.2.4А Определение количества строк в мемо-поле

    MEMLINES(<4cyo-ncuie>)

    Возвращает число строк и мемо-поле.

    Длина строки определяется командой SET MEMOWIDTII (но умолчанию — 50) При разбиении текста мемо-поля функция ями MLINE0 и MEMLINES0 на строки учитывается и уже име­ющееся разбиение, сделанное с помощью Enter. Фиксация нажа­тия клавиши Enter и обозначается CHR(13).

    1. Функции конвертирования и распознавания букв

    1. Определение начала слова

    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

    .Т.

    DISPLAY Name_bOok

    ? IS ALPHA (Name_Jx>ok) && Выводит на экран

    DISPLAY Price

    ? ISALPHA(CHR<Price)) && Выводит на экран

    1. Определение строчной (малой) буквы

    [SLOWER(<iwp. О)

    Если слово <выр. О начинается с малой буквы, то возвраща­ется значение «истина».

    Пример.

    CLEAR

    ? ISLOWER('привет') UU Выводит на экран .Т.

    ? ISLOWER('Привет') && Выводит на экран .F.

    1. Определение нулевого значения

    ISNULL(<«bip.>)

    Функция возвращает значение «истина» (Т.), если значение выражения <выр.> равно нулю

    1. Определение прописной (большой) буквы ISUPPER(<*up. О)

    Если <выр. О начинается с большой буквы, то возвращается значение «истина» (.Т.).

    Пример.

    CLEAR

    ? ISUPPER('Привет') && Выводит на экран .Т.

    ? ISUPPER('привет') Ьй Выводит на экран .F.

    1. Преобразование букв в строчные

    1^WER( <выр.О)

    Преобразует все буквы, содержащиеся в <выр.О, в строчные (малые).

    1. Преобразование букв в прописные

    рЙОРЕД(<*кф.О)

    • Преобразует буквы, содержащиеся в <выр.О, следующим °бразом: первая буква — прописная (большая), остальные — СтР°чные (малые).

    1. Преобразование букв в прописные

    иРРЕЩ<вьф.О>

    Преобразует все буквы, содержащиеся в <выр.О, в пропис­ные (большие).

    1. Функции работы с датами

    1. Преобразование даты из символьной формы в форму дать

    СТОЩ<выр. О)

    Преобразует <выр. О в американский тип даты (ме- сяц/дснь/год, если не установлен другой тип командой 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'

    1. День недели в символьной форме CDOW(<Bwp. D>)

    Функция возвращает день недели в символьной форме.

    1. Имя месяца в символьной форме

    СМ(ЖТН(<выр. D>)

    Функция возвращает имя месяца в символьной форме.

    1. Системная дата DATEO

    функция возвращает текущую системную дату

    12.2.6.5 Месяц в числовой форме 1)ЛУ(<выр. D>)

    функция возвращает день месяца указанной даты в числовой форме

    1. Преобразование формата даты в символьный формат

    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

    1. Определение порядкового номера дня недели бО\У(<Выр. Ц>)

    Функция возвращает порядковый номер дня недели.

    1. Преобразование типа дата в строку символов бТОС(<аир. D>)

    Функция возвращает указанную дату в виде символьной ^оки

    1. Определение новой даты

    СОМО!ЧТН(<выр. 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

    1. Определение номера месяца

    MONTH(<Bbip. D>)

    Функция возвращает порядковый номер месяца указанн^ даты.

    1. Определение номера года

    YEAR(<Bbip. D>)

    Функция возвращает номер года.

    1. Функции преобразования типов данных

    1. Определение кода первого символа

    ASC(<Bbip. О)

    Возвращает ASCII-код первого символа из <выр. О.

    Пример.

    дТОКЗ 'ABCDEFGHIJ' ТО peri && 10 символов

    clear

    poR i = 1 ТО 10

    ? SUBSTR(perl, i, 1) && Выводит на экран

    • символ

    ? > ASC(SU3STR(perl, i)) && Выводит на экран

    • ASCII код символа ENDFOR

    1. Преобразование числа в символ

    СНИ(<выр. N>)

    Преобразует <выр. N>, где N — целое число в диапазоне I...255, в соответствующий символ из таблицы ASCII. Функции ASC0 и CHR() обратны друг другу. 112].

    Пример.

    CLEAR

    FOR i = 65 ТО 75

    ? i && Выводит на экран ASCII код

    символа

    ?? ' ' + CHR(i) && В текущую строку добавляет

    символ

    ENDFOR

    1. Преобразование числа в строку символов

    sTR(<Bup. Nl> [, <выр. N2> [, <выр. N3> ] J)

    Функция преобразует числовое выражение в строку симво­лов. <выр. Nl> исходное числовое значение, <выр. N2> общая возвращаемой строки символов, <выр. N3> определяет количество символов в строке для обозначения дробной части Числа. Если <выр. N2> определяет короткую строку и не хватает количества символов для отображения числа, то функция воз­вращает серию звездочек.

    12.2J.4. Преобразование символьного типа в числовой тип VAL(<>up. С1>)

    Функция преобразует число, записанное символами, в число­вой тип.

    1. Преобразование денежного типа в числовой тип

    МТОГЧ(<денежное выражение>)

    Функция возвращает денежное выражение в числовой форме

    1. ФУНКЦИИ ПРОВЕРКИ ФАЙЛОВ И ДИСКОВ

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

    Ниже необязательный параметр <область> предоставляет возможность работать в любой пассивной рабочей области Пас­сивная область задается своим номером.

    1. Определение начала файла

    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

    ACTIVATE SCREEN 0 2.1 CLEAR TO 2,50 0 2,1 SAY 'Название книги: RETURN -T.

    1. Определение имени табличного файла

    DBF([<o(wiacTb>])

    Возвращается прописными буквами полное имя (с указанием пути) открытого табличного файла (БД) в текущей или указа! ной рабочей области. Если открытого файла нет, то возвра: ся пустая строка.

    Пример.

    IN 2 ALIAS Cat IN 7 ALIAS Aut

    CLOSE ALL

    USE Е: \Princ_bd\Catalog USE E:\Prim_bd\Author CLEAR

    ? DBF(2) && Выводит на экран путь к табличному

    • файлу, открытому во 2 рабочей области

    ? DBF{'Aut')

    &£с Выводит на экран путь к табличному

    • файлу, открытому в рабочей области с

    • псевдонимом Aut

    1. Определение свободного места на активном диске

    DISKSPACEO

    Возвращает число свободных байт на активном диске. Пример.

    ? 'На текущем диске свободно ', DISKSPACEO, ' байт

    1. Определение помеченных к удалению записей

    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 снять пометку к удалению

    1. Определение конца файла

    ^р([<область>])

    Функция возвращает значение «истина* (.Т.) когда сделана °Пытка прочитать следующую (за последней) запись, а не когда Достигнута последняя запись табличного файла. Во всех осталь- w случаях возвращает значение «ложь* (.F.).

    Пример см. вп. 12.3.1.

    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

    1. Определение имени поля

    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))

    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

    1. Определение количества полей в открытой базе данных

    FCOUNT(L<o6.iatnv>])

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

    Пример см. в 12.3.7.

    1. Определение действующего значения фильтра

    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 Выводит на экран результаты первого (восстановленного) фильтра

    1. Поиск значения поля по значению другого поля

    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()

    && Выводит на экран дату последнего изменения базы данных

    1. Определение имени главного индексного файла

    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) СеСс Выводит на экран полное имя

    • главного индексного файла

    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

    1. Определение общего количества записей в ВД

    КЕСС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

    1. Определение размера записи файла БД

    RECSIZE(l<o&»acib>])

    Выводит размер записи в байтах.

    Пример.

    См. пример п. 12.3.15.

    1. Определение размера заголовка БД

    HEADER([<o6jiacTb>])

    Выводит размер заголовка БД в байтах. Примерно: 32*(N + О байт, где N — число полей в БД.

    См. пример в п. 12.3.15.

    1. Поиск записи в индексированной ЕД

    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 Если запись найдена, то на экран выводится .Т.

    1. Анализ работы команды READ UPDATEO

    Возвращает значение «истина* (.Т.), если при выполнении последней команды READ данные в ее областях GET каким-ли­бо образом изменялись. В противном случае — значение «ложь» (. F.). Экономит время на перезаписи данных на диск, если они не менялись.

    1. Вывод имени текущей директории

    ССРОШ([диск])

    Возвращает прописными буквами имя текущей директории на заданном диске. Если такого диска нет, то возвращается пус­тая строка.

    Пример.

    CLEAR

    ? 'Текущий каталог: CURDIRO

    SCOldDir = SET('DEFAULT') + SYS(2003)

    SET DEFAULT TO (HOMEO)

    'Каталог Visual FoxPro : CURDIRO

    SET DEFAULT TO (gcOldDir)

    В1 'Текущий каталог: ', CURDIRO

    1. Вывод имени активного диска

    SYS(5)

    Возвращает имя активного по умолчанию диска. Активный является либо стартовый диск, либо диск, установленный коман­дой: SET DEFAULT ТО.

    Пример.

    CLEAR

    IF _DOS OR „WINDOWS SET DEFAULT ТС C:

    ZKDI?

    ? SYS(5) && Выводит на экран имя активного диске!

    1. Вывод имени директории, где хранится FoxPro SYS(2004)

    Возвращает полное имя директории, где хранится FoxPro. 1 Пример.

    CLEAR. г

    ? 'Visual FoxPro размещен в каталоге: ', SYS(2004)

    1. Вывод имени текущей директории SYS(2003)

    Возвращает имя текущей директории на диске по умолчанщо. Имя диска не выводится. (12].

    См. пример в п. 12.3.20.

    1. Определение положения курсора

    COL0

    Возвращает номер текущей колонки на экране/окне. Пример.

    CLEAR

    в 5,5 SAY "

    @ ROW(), COL<)+12 SAY 'Привет'

    @ ROW(), $+12 SAY 'Hello'

    1. Определение положения курсора

    ROW0

    Возвращает номер текущей строки на экране или в окне. См. пример в п. 12.4.1.

    1. Определение позиции печати

    PCOL0

    Возвращает номер текущей колонки на принтере.

    Пример.

    CLEAR

    9 PROW{) , PCOLO+12 SAY 'Привет'

    Э PROW<), $+12 SAY 'Hello'

    1. ФУНКЦИИ ПОЗИЦИОНИРОВАНИЯ ВЫДАЧИ ДАННЫХ

    При формировании и выводе на печать отчетов различной форМЧ широко используются функции позиционирования, то есть ук*в ния начала строки (начала печати). Стандартными функшй^И предусмотрены практически все возможности вывода текста на пИ чать и создания собственных функций, как правило, не требует^И

    1. Определение позиции печати

    PRovvo

    Возвращает номер текущей строки на принтере.

    Применение команды EJECT (прогон) устанавливает PRO\V() в ноль. 112].

    См. пример в п. 12.4.4.

    1. ФУНКЦИИ РАБОТЫ С МЫШЬЮ

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

    1. Определение положения маркера мыши

    MCOL([<okiio>J)

    Возвращает номер колонки, где находится маркер мыши. Ес­ли <окно> не указано, то выдается положение относительно эк­рана или текущего окна. Если маркер находится вне экрана, то возвращается—I.

    Пример.

    CLEAR ? MCOL()

    1. Определение положения маркера мыши

    MRO\V([<okho>1)

    Возвращает номер строки, где находится маркер мыши (ана­логично МСОЦ)).

    Пример.

    CLEAR ? MR0WO

    1. Контроль нажатия левой кнопки

    MDOWN0

    Возвращает значение «истина» (.Т.), если левая кнопка мьпш* была нажата во время выполнения функции, и значение «ложь! (.F.) — в противном случае [12]

    Пример.

    CLEAR

    £2,2 SAY 'Нажмите <Esc> для выхода to exit'

    DO WHILE .Т.

    STORE MDOWNO TO per £4,2 CLEAR TO 4,6 £4,2 SAY per ENDDO

    1. ТЕХНИЧЕСКИЕ ФУНКЦИИ

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

    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

    1. Определение имени переменной (поля), куда вводятся данные

    VARREAD0|SYS(18)

    Полностью идентичные функции возвращают (прописными буквами) имя поля/переменной при вводе данных командой если было выполнено прерывание от клавиши с помощью процедуры ON KEY... или сделан вызов пользовательской функ- в опциях VAL1D/WH EN. Функция удобна при вызове на эк­

    ран подсказок при вводе данных: для каждого поля — своя под. сказка. Функции можно использовать совместно с командами BROWSE/CHANGE (в параметрах :W, :V, :Е) или с командой ON KEY LABEL <клавиша> DO <процсдура> WITH VARREAD().

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

    1. Включение/выключение курсора на экране

    SYS(2002[,1])

    Включает/выключает (с параметром 1) курсор на экране. Функция аналогична команде: SET CURSOR ON/OFF.

    1. Определение статуса 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.

    1. Определение типа процессора

    SYS(17)

    Возвращаеттип процессора 18086/88; i80286; i80386 i80486 и т. Д-

    1. Олреление типа видеоадаптера и монитора

    SYS(2006)

    Возвращаеттип платы адаптера и монитора ПК.

    && Возвращает ega/Color

    1. Пример:

      ? SYS(2006)

      Определение готовности принтера

    SYS(13)

    Возвращает прописными буквами статус готовности принтера READY — готов; OFFLINE — не готов.

    1. Проверка готовности принтера

    PRINTSTATUSO

    Возвращает значение «истина* (.Т.), если принтер готов, и значение «ложь» (.F.) — если не готов. Эта функция удобнее SYS(13).

    Пример:

    I? 1 PR_NTSTATL'S ()

    ? «Подготовьте принтер» EKDIF

    Лфф XX U* Ы

    1. Определение объема свободной основной оперативной памяти

    SYS(12)

    Возвращает число свободных байтов основной оперативной памяти (из 640Кб).

    1. Определение объема свободной (доступной) оперативной памяти

    MEMoryo

    Возвращает число килобайтов доступной оперативной памя- 111 Для загрузки внешних программ по команде RUN или !

    1. Определение общего объема оперативной памяти

    SYS(lOOl)

    Возвращает размер всей имеющейся оперативной памяти (до 1Мб).

    1. Определение объема оперативной памяти, занятой временными файлами

    SYS(16)

    Возвращает число — объем оперативной памяти, занятой пе­ременными, окнами, меню, открытыми файлами.

    1. Определение типа монитора

    ISCOLOR0

    Возвращает значение «истина» (.Т.), если монитор цветной и значение «ложь» (-F.), если монохроматический.

    1. Определение цветовой пары

    SCHEME* <вырГЧ1> [,<BMpN2>D

    Возвращает цветовую пару номер <BbipN2> списка цветовых пар из схемы цветов номер <вырМ>. Если <BbjpN2> опушено, то выдается весь список.

    1. Определение версии FoxPro

    VERSION([l])

    Возвращает номер версии пакета FoxPro, а если указан пара­метр I, то и дату создания и номер самого пакета.

    1. ФУНКЦИИ ВРЕМЕНИ

    Для управления параметром «время* программисту предложен широкий набор функций времени.

    12-7.1 • Определение времени в часах

    HOlR(<Bbip. Т>)

    Функция возвращает количество часов из указанного выра­жения в 12-часовом или 24-часовом формате.

    1. Определение времени в минутах

    MINUTE(<Bup. т>)

    Функция возвращает количество минут из указанного выра­жения.

    1. Определение времени в секундах

    SEC(<Bbip. Т>)

    Функция возвращает количество секунд из указанного выра­жения.

    1. Определение времени в секундах

    SECONDS0

    Функция возвращает количество секунд на отрезке между по­луночью и текущим моментом времени в чистовом формате с точностью .001 сек.

    1. Определение времени в секундах

    SYS(2)

    Возвращает число секунд (в виде строки символов), считая от Полуночи.

    1. Определение текущего (системного) времени

    ПМЕ()

    Функция возвращает текущее (системное) время в 24-часо- ®°м формате.

    1. ФУНКЦИИ АНАЛИЗА УСЛОВИИ

    1. Выбор значения по условию

    HF(<ycJiOBHe>, <выр1>, <выр2>)

    Если <условие> истинно (True), то функция возвращает <выр!>, а если ложно (False), то — <выр2>.

    Эта функция может быть помешена практически в любую ко­манду в качестве <выражения> или в другую функцию. Необхо­димо только соблюсти тип выражения. Допускается вложение функций IIF.

    1. ФУНКЦИИ АНАЛИЗА ТИПА И НАЛИЧИЯ ДАННЫХ

    При программном обращении к данным необходимо знать, есть ли данные вообще, а если они есть, то какого типа. Исходя из получен­ного ответа, строится дальнейший алгоритм обработки данных.

    1. Проверка заполнения поля (переменной)

    ЕМРТУ(<выр.>)

    Возвращает значение "истина” (.Т.), если <выр.> (ноле или переменная) не имеет данных, в противном случае — значение ’’ложь” (.F.).

    Поле (переменная) считается пустым в зависимости от его ти­па и содержания (табл. 12.1).

    Таблица 12.1

    Тип

    пробелы

    Содержание

    символьное

    знаки табуляции

    возврат каретки

    переводы строки

    цифровое

    даты

    False

    нулевое значение {..} или {)

    логические

    memo

    отсутствует содержимое мемо-поля

    1. Определение типа данных в поле (переменной)

    ТУРЕ(<выр. О)

    Возвращает прописной буквой символ, обозначающий тип данных <выр. О:

    С — символьный;

    N — числовой;

    D — лата;

    L — логический;

    М— мемо-полс,

    U — неопределенный.

    Имя анализируемой переменной (<выр. С>) должно быть взя­то в апострофы или кавычки.

    1. ФИНАНСОВЫЕ ФУНКЦИИ

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

    1. Возврат кредита равными долями

    PAYMENT(<Bwp. Nl>, <выр. N2>, <выр. N3>)

    Вычисляет размер периодических выплат за взятый кредит, на который установлен определенный процент и указано число периодов погашения кредита:

    <вьимата>=РАУМЕКТ(<кредит>, <процснт>, <число периодов>)

    Расчет производится по сложной ставке процентов.

    Пример. В банке взят кредит на 2 года в сумме 100000 руб- Лей из расчета 10% годовых по сложной ставке процентов с еже­месячным погашением кредита равными долями.

    ? PAYMENT(ЮСООО, 0.1/12,241 && выводит на экран 4614.49

    Если погашать кредит 1 раз в год двумя выплатами, то:

    7 ?Aykent(100000,0.1,2) && выводит на экран 56719.05

    1. Определение общей суммы, полученной вкладчиком

    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

    1. Определение суммы за будущие платежи

    FV(<»np. Nl>, <выр. N2>, <вьф. N3>)

    <выплата>=РУ(<период выплаты>, <процент>, <число пе­риодов^

    Пример. За аренду помещения надо платить ежегодно по 10000 рублей. Срок аренды — 3 года (30000 рублей). Годовая став­ка процентов — 10%. Какую сумму надо заплатить вперед (сегод ня) за 3 года аренды?

    ? PV(10000,0.1/12,36) && выводит на экран 25826.03

    1. ФУНКЦИИ ПОДСТАНОВКИ

    Эти функции дают возможность формировать имена перемен­ных. функции и команды непосредственно в программе.

    1. Функция макроподстановки

    &<снмв. псремеииая>[<выр. О]

    Превращает содержимое <снмв. пере енной> или мемо-поля непосредственно в объект, который она изображает.

    Пример.

    а=''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'

    &х&у

    1. Вычисление результата выражения

    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. НЕКОТОРЫЕ ПОЛЕЗНЫЕ ОПЕРАТОРЫ

    1. Оператор комментария

    Скоманда | функция | оператор > && < строчной комментарий

    В некоторых случаях удобно текст программ снабжать строч­ным комментарием. Строчный комментарий облегчает чтение программы. Оператор && означает, что далее следует текст-по­яснение.

    1. Оператор сравнения

    <выр. 1> # <выр. 2>

    Если <выр. 2> не входит в <выр. 1>, то оператор возвращает значение «истина* (.Т.).

    1. Комментарий в целую строку

    • < комментарий >

    Комментарий занимает всю строку. Оператор « * * пишется с первой позиции.

    1. Оператор продолжения строки

    Наличие символа «;» в конце строки означает, что следующая стРока — продолжите этой строки.

    При работе с базами данных информация хранится в таблицах. Просмотр табличной информации в явном виде неудобен. Поэто­му информацию из таблицы (или таблиц) извлекают, группи­руют, сортируют и выводят на экран или бумагу. Под отчетом понимают отформатированную информацию, которая выводится на экран, принтер или в файл. FoxPro позволяет создать несколь­ко видов отчетов:

    • одностраничный табличный отчет;

    • многостраничный табличный отчет;

    • отчет в свободной форме;

    • почтовая этикетка.

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

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

    Почтовая этикетка является разновидностью отчета в свобод­ной форме. На части печатного листа формируют почтовый адрес адресата и адресанта. Затем созданный блок многократно размно­жают на листе. При этом в каждую почтовую этикетку будет поме­щен уникальный почтовый адрес адресата (клиента фирмы) ** одинаковый почтовый адрес адресанта (самой фирмы).

    РРР

    А

    -

    М ,|.

    &

    V

    £ »*vxv#

    . ' Г

    Гг.

    Л

    i/I-

    J

    .

    < с'

    VV

    .И*

    E3 Fgrni

    ■ 5Я?33

    £? Lsbri.

    MiciotuM Vitud FonPtb

    1 " - '■

    Рис. 13.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 — создание отчета по данным одной таблицы.

    1. СОЗДАНИЕ ТАБЛИЧНОГО ОТЧЕТА ПО ДАННЫМ

    ОДНОЙ ТАБЛИЦЫ С ПОМОЩЬЮ МАСТЕРА ОТЧЕТОВ

    В диалоговой панели 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.

    Rcpoit Wizoid

    У 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Ш

    Рис. 13.7. Задание вычисления итогового значения.

    кнопки 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.

    ] Ыер 5 ■ Sort eecidt How do ward, tc sort the teeotdt?

    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

    Cot vet { <Boctt | dj-M >. :} Fntih

    Рис. 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].

    1. СОЗДАНИЕ ТАБЛИЧНОГО ОТЧЕТА ПО ДАННЫМ

    НЕСКОЛЬКИХ ТАБЛИЦ С ПОМОЩЬЮ МАСТЕРА ОТЧЕТОВ

    В этом случае отчет строится аналогичным способом по значени­ям выбранных полей родительской и дочерней таблин.

    Первый шаг «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) Масгсра отчетов завершает создание отчета аналогичным способом.

    1. СОЗДАНИЕ ОТЧЕТА

    С ПОМОЩЬЮ КОНСТРУКТОРА ОТЧЕТОВ

    Для запуска Конструктора отчетов в диалоговой панели New Report (см. рис. 13.2) надо выбрать кнопку New Report — экране появится рабочее окно Конструктора отчетов (рис. 13.13).

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

    Г

    Нерон Datmnet

    Report?

    ПР1Е1

    [ё. . ft- • Р .

    . . .1»; . .fr..И.. .,Я.. .1'°. В» lia... Ц

    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 — информация размешается один раз после основного отчета и содержит общие суммы или текст, подводящий итог содержимого отчета.

    При создании и редактировании отчета возможны следующие операции:

    1. Задание среды окружения

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

    Для задания среды окружения сначала запускают Конструктор отчетов, а затем выполняют одно из действий:

    • из главного меню подают команду View -» Data Environment;

    • из контекстною меню выбирают команду Data Environment.

    В любом случае на экран выводится диалоговая панель Data Environment (рис. 13.14), куда с помощью команды Add контек­стного меню добавляются таблицы. Взаимосвязи устанавливают­ся буксировкой общих (ключевых) нолей.

    >j8ock labtoi т! dslabaw

    Add

    Рис. 13.15. Определение состава таблиц.

    Add Т abf о> View

    После выбора команды Add на экран выводится диалоговая панель Add Table or View (рис. 13.15) для определения таблиц, по значениям полей которых будет построен отчет.

    Имя нужной таблицы надо выделить курсором, затем нажать кнопку 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 * “ „•.

    oiT 1

    Сапой

    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

    1 key_bock

    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

    Для задания шрифта сначала выделяют нужный объект, а затем из главного Meiuo подают команду Format -> Font и опре­деляют желаемый шрифт.

    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

    СдЫ-уст» { JlotWhmI

    Рис. 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.

    Как правило, в верхней полосе размешают название (заголо­вок) группы, а в нижнеи полосе — итоговые суммы по группе.

    1. СОЗДАНИЕ ПОЧТОВОЙ ЭТИКЕТКИ

    В некоторых изданиях почтовые этикетки называют многоколон­ным отчетом. Создают многоколонный отчет по 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].

    1. Примеры

    П р и м е р I. Создать отчет по данным одной таблицы с помощью Мастера отчетов.

    Создать простой отчет по значениям таблицы CATALOG из базы данных PRIMER с помошыо Мастера отчетов.

    Запустим Мастер отчетов, выполнив следующие действия.

    • Bepat Wizaid

    Do»ob»c* aodtdbtes

    Bsiep 1 • SekdfKld» 3

    Whcti Felds isjiouwan! r jjv »рйГ?

    Seterf e da’obew о Free T a2. (wr.. r«-ec( a liUe tx via*, and (hen eetec) fro )*> is you (•*-*.

    ACCOUNT

    AUTCR

    CATALOG

    E CUSTOMER В FAM ЕЭ IM

    jdectad MdK .

    PfJaire book жТ,

    -e-

    Volume

    ^ Price

    L

    tleb | Carcc | --i | > ) £n?n j

    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

    ДёИ >

    Рис. 13.24. Задание сортировки строк внутри групп строк.

    В появившейся на экране .аналоговой панели 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).

    ПримерЗ. Создать отчет по данным из нескольких таблиц с помощью Конструктора отчетов.

    Oi кройте нужную базу данных и выведите па экран диалого­вую панель Database Designer. Из меню

    А1 I Data j Documwits

    выберите команду Data и на строке имени базы данных Book дважды щелкните левой кнопкой мыши.

    AT able « Vie»

    yirr.r

    0*4Етчомс*) -ВорейОаогкч ПермН

    ЙГвИс I Uy.lwi IWMjlT

    IOlndt'ti гшт

    IM

    key Ьо^

    kjyjen

    WTik*

    I neme_rt UJntbci

    пгэгсгс

    ГгИЬ

    17 ПЫ

    Г?

    Р £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

    |n«c bock ~ | |те^7^|рг1се_ froljj [ringe__Zl [поде сока )

    : :$*ЯВ

    ж г-едеёоом

    ( 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

    t Ы IT. n к». . •» -it

    Каталог книг

    И.О. с» тор a Hat book

    Теш Price Volta Vlea«e Ж*

    1 Геи, ptag feet 1».?.мв^ Inaio^booK

    ШЯИШШШU

    tfHi

    TE(J_

    tr-

    Ш 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

    icdex_

    =L

    toiTTi «пав» tovn_

    ■dees cust.

    ПЛЙЖ cust.

    street r.sn* street.

    Мге«_ош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-А

    АаякпаяоЛсков 7-4 д. 12/3

    Кому : ООО "МихроЫы *

    ToJWKOurxutl Огдаиом

    Кому : Александр

    Коржаяим Нави Игоревич

    Куда : ЗЩ734 Россия Таганрог

    Абрикосоаский ncp. д. 2 коря.4

    KoMV '.АО "Русскийляс’

    Дроздов Владимир Еорисович

    КуДЯ t 456231 Россия Моасаа

    Автомоторная ул 6.1 стр.З

    Кому : ЗА О "Скопа"

    Некрасов Николай Александрович

    Куда : 191234 Россия Можайск

    КУДЯ : 101111 Россия Александров

    Рис. 13.37. Фрагмент многоколонного отчета

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

    Для задания печати па одном листе нескольких почтовых эти­кеток надо из главного меню подать команду File -> Page Setup и задать свойства в соответствии с рис. 13.36.

    Далее выполним предварительный просмотр и сохранение на диске созданного многоколонного отчета. Результат работы пред­ставлен на рис. 13.37.

    1. Контрольные вопросы

    1. Что такое отчет?

    2. Какие виды отчетов можно создавать в среде Visual FoxPro?

    3. Какие способы создания отчетов имеются в среде Visual FoxPro?

    4. Назовите преимущества и недостатки использования Мастера отчетов.

    5. Назовите преимущества и недостатки Конструктора отчетов.

    6. Расскажите как создать вычисляемое поле в отчете.

    7. Как изменить начертание шрифта в отчете?

    8. Что называют объектом при создании отчета?

    9. Как объект сделать активным (пассивным)?

    10. Как вывести на экран панель инструментов?

    11. Что называют окружением при создании отчета?

    12. В каких случаях окружение задается автоматически?

    13. Какие действия можно выполнить над активным (пассивный) объ­ектом?

    14. Назовите имена и назначение основных полос при создании отчета.

    15. Назовите имена и назначение дополнительных паюс отчета.

    16. Как задать дополнительные полосы при создании отчета?

    17. Как задать таблицы, но данным которых будет построен отчет?

    18. Как запустить Мастер отчетов?

    19. Как запустить Конструктор отчетов?

    20. Как задать несколько колонок при создании многоколонного отчета?

    21. Как задать вычисление промежуточных итогов н Мастере отчетов?

    22. Как задать вычисление промежуточных итогов в Конструкторе отчетов?

    23. Как задать группировку данных в Конструкторе отчетов?

    24. Как вызывается на экран контекстное меню при работе с различны­ми диалоговыми окнами?

    25. Назовите отличия при задании заголовка отчета при работе с Масте­ром и Конструктором отчетов.

    ПРИЛОЖЕНИЕ

    Компакт-диск содержит примеры к главам учебника. В каталоге GL-Ои хранятся примеры главы и. Каждый файл каталога имеет название Ехтр_0А_0/я, который означает, что это пример номер т главы к.

    Литература

    1. Лгалъиов В. II. Примерная программа диспнп.1>шы. «Базы шны - М.. Изда­тельский отп'л llVlllCnO. 1998,16с.

    2. Каратыгин С, Тихонов А, Тихонова Л. Visual FoxPro 6.0. Полное руководство пользователя с ирииершнн. М.. Бином. 2000. ~В4с.

    3. НэМок Р., Петерсен Д., ТалмейОж. Vn ч1 FoxPro 6. Pajpaftor а корпоративных лрюижемй. М., ДМ К, 2000,392 с.

    4. Ьаш I V., Использование Visual FoxPro 6 ГПо БХВ — Петербург, 2000.928 с.

    5. Горев А, Ахали Р., Мскашарипов С Эффективная работа с СУБД СПб.. Питер, 1997,704с.

    6. ОмевьченкоЛ. Самоучитель Visual FoxPro 6.0 СПб, БХВ— Петербург, 2000,512 с.

    7. Каратыгин С., Тихонов А., Тихонова Л. Работа в Visual FoxPro к примерах. Vi., Бином. 1995,312с.

    8. С" _№ Ч. Visual FoxPro для профессионалов. М., ЭНТ1 ОН, Киев, ВЕК+, 1999,

    576 с.

    1. Гончаров A FoxPro па примерах СПб.. Питер, 1995,160с.

    2. Смирнов А А Разработка прикладного программного обеспечения в среде FoxPro for WINDOWS Учсбис ; пособие М., Моск. Гос. Уи-тэкономики, статистики н информатики. 1997,93 с.

    3. Кузьменко В. Г Системы управления Г зами данвп. Учебное пособие. VI.. Изд во VI И. 1977.73 с.

    4. ПсповА А Программирование в среде СУБД FoxPro 2.0 М., Радио и связь. 1994, 352 с.

    5. Диго С. Л/. П юектировани н кснслыование баз данных. М.- Финансы и сытпсгакь, 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 выполните следующие действия.

  • Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]