Учебное пособие 487
.pdfется также операция включения $: A$B выдает истину, если строка A включена в B как под-
строка и ложь в противном случае.
Строковые: +(сцепление строк) и – (сцепление с переносом пробелов из конца первой строки в конец второй):операция
“Петров”+”Иван” даст “Петров Иван”, а “Петров”-“Иван” даст “ПетровИван”.
ВЫРАЖЕНИЯ
Различные комбинации операций и функций, применяемых к полям баз данных, пере-
менным, массивам и константам образуют выражения. Тип выражения определяется типом
выдаваемого значения. В дальнейшем мы будем обозначать выражения следующим образом:
<выр> |
произвольное выражение |
<вырN> |
числовое выражение |
<вырC> |
текстовое (строковое) выражение |
<вырL> |
логическое выражение |
<вырD> |
выражение типа дата |
|
ФУНКЦИИ |
Все функции в Foxpro имеют одинаковый формат: имя функции, а затем, в круглых скоб-
ках, список параметров. Если параметров нет, всѐ равно скобки ставятся. Системных функ-
ций в Foxpro более сотни, мы перечислим лишь наиболее необходимые на первое время.
СТРОКОВЫЕ ФУНКЦИИ:
LTRIM (<вырC>), RTRIM (<вырC>), ALLTRIM (<вырC>) - убирают пробелы: первая – в
начале строки, вторая – в конце, третья – в начале и в конце.
LOWER (<вырC >), UPPER (<вырC >), PROPER (<вырC >) – преобразует маленькие буквы в большие (первая) и наоборот (вторая), третья делает первую букву в строке большой,
а остальные маленькими. Работает только с английскими буквами.
LEFT (<вырC >), RIGHT (<вырC >) – позволяет выделить из строки первые или послед-
ние <вырN> символов соответственно. Комбинация этих функций позволяет выделять лю-
бую подстроку в строке.
ФУНКЦИИ ДАТ:
DATE () – выдает текущую дату.
ФУНКЦИИ ПРЕОБРАЗОВАНИЯ ТИПОВ ДАННЫХ:
ASC (<вырC>) – преобразует первую букву в <вырC > в еѐ ASCII-код (здесь следует на-
помнить, что все символы в компьютере хранятся в числовом виде – каждый символ имеет свой код и именно его помнит машина; при вводе-выводе этот код преобразуется в графиче-
ское изображение на экране или принтере; для IBM PC используется таблица кодировки под названием ASCII – American Standart Code for Informaion Interchange ).
CHR (<вырN>) – выполняет обратную операцию - по числовому коду (<вырN> может принимать значения от 0 до 255) выдает соответствующий символ. Отметим, что на самом деле в таблице кодов присутствуют не только обычные буквы, цифры и знаки препинания,
но и некоторые специальные символы (например CHR (2) выдаст Вам _) и даже издавание звуков (CHR(7)). Поэтому, например, REPEAT(CHR(7),20) выдаст Вам 20-ти кратный “би-
ип“.
DTOC (<вырD>), CTOD (<вырC>) –преобразует переменную типа дата в еѐ строковое изображение и наоборот.
STR (<вырN>), VAL (<вырC>) – преобразует число в его строковое изображение и на-
оборот.
EVALUATE (<вырC>) –вычисляет выражение, “формула” которого написана в строке
<вырC>, например:
EVALUATE(“2**3”)
выдаст число 8.
НЕКОТОРЫЕ ДРУГИЕ ФУНКЦИИ:
IIF (<вырL>, <выр1>, <выр2>) – выдает <выр1> если <вырL> истинно и <выр2>, если
<вырL> ложно.
EOF(), BOF() – признаки конца и начала файла. Первый выдает истину, когда в текущей базе данных мы оказались “за” последней записью (а там стоит специальный символ, указы-
вающий на конец файла). Второй – когда мы оказались “перед” первой записью (на самом деле файл базы данных начинается с заголовка, в котором указаны названия полей, их тип,
размер и т.д.) – на заголовке базы данных.
RECNO () –выдает номер текущей позиции в текущей базе данных.
ПРОСТЕЙШИЙ ВВОД-ВЫВОД
Для опробования работы функций удобно пользоваться простейшими командами ввода-
вывода:
? <выр>, ??<выр> - которые выводят значение указанного выражения. Их отличие друг от друга в том, что первая выводит значения с новой строки, а вторая – с той позиции, на которой остановилась предыдущая команда вывода.
КОМАНДЫ
Ещѐ один момент, который нам надо предварительно обсудить – это структура команд
Foxpro. При написании формата команд мы будем пользоваться ставшими уже стандартными обозначениями: большими буквами пишутся ключевые слова (например BROWSE), в угло-
вых скобках указывается содержательный смысл того выражения или текста, который дол-
жен быть поставлен на их место (например <поле> <вырN> <условие>). В квадратных скоб-
ках ставятся элементы команд, которые являются необязательными. Вертикальной чертой разделены альтернативные опции.
ГЛАВА 3
ИНДЕКСИРОВАНИЕ
ЧТО ТАКОЕ ИНДЕКС
Индекс удобнее всего представлять себе в виде таблички, в одной колонке которой сто-
ят значения некоторого поля базы данных, упорядоченные по возрастанию (убыванию), а в другой – номер соответствующей записи в БД.
ТИПЫ ИНДЕКСА
В Fox Pro можно создать два типа индексных файлов: простой (файл с расширением
.IDX ) и сложный, или мультииндекс (файл с расширением .CDX). Они отличаются друг от друга тем, что, грубо говоря, в простом индексе хранится одна “табличка” , а в сложном – несколько (соответственно разным принципам индексирования одной и той же базы данных,
например, одна – по фамилии, другая – по городу, третья – по ученой степени и т.д.). Каж-
дую “табличку”, входящую в него называют “тег”(английское “tag”). Чтобы различать теги сложного индекса, им присваивают персональные имена, поэтому всегда ссылка на тег со-
стоит из имени тега и имени файла.
Мультииндексные файлы могут быть двух видов: структурный и именованный. Струк-
турный мультиндексный файл всегда имеет имя совпадающее с именем базы данных, он яв-
ляется как бы “стандартным” и открывается и закрывается независимо от нас вместе с соот-
ветствующей базой данных. Именованный мультииндексный файл имеет произвольное имя,
и для использования необходимо его, так же, как и простые индексы, предварительно откры-
вать.
СОЗДАНИЕ ИНДЕКСА
Создание индексного файла осуществляется командой
INDEX ON <выр>
TO<IDX-файл>/TAG <имя тага> [OF <CDX-файл>] [FOR <условие>]
[COMPACT] [DESCENDING] [UNIQUE] [ADDITIVE]
Мультииндексный файл всегда компактный. Обычный (IDX) индексный файл строится обычным образом, если не указан параметр COMPACT.
Опции команды:
<выр>
- индексное выражение. Если требуемое выражение “не умещается” в указанных размерах,
его обычно “сбрасывают” в пользовательскую функцию, а в команде индексирования указы-
вают имя этой функции.
TO <IDX-файл>/TAG<имя тега> [OF<CDX-файл>]
- задает имя создаваемого простого индекса (TO <idx-файл>) или тега в мультииндексном файле (TAG<имя тега> [OF <CDX-файл>] ). В последнем случае если в команде присутству-
ет фраза OF <CDX-файл>, то будет создан именованный мультииндексный файл, если нет – будет создан структурный мультииндексный файл с именем, совпадающим с именем базы данных. Команда может использоваться как для создания нового мульииндексного файла,
так и для дополнения уже существующего CDX-файла новым тегом.
FOR <условие>
- эта функция позволяет индексировать (т.е. учитывать в “табличке” не все записи базы дан-
ных, а только те, которые удовлетворяют указанному условию).
COMPACT
- эта опция используется только для IDX – файлов. Она означает, что этот файл должен быть
“компактным”. DESCENDING
- индексирование будет выполнено по убыванию. Этот режим можно указывать только для мультииндексных CDX-файлов.
UNIQUE
-означает, что, если в базе данных встречаются записи с одинаковым значением индексного выражения, то все такие записи, кроме одной, игнорируются (не включаются в индекс).
УПОРЯДОЧЕНИЕ ПО ИНДЕКСУ
По существу это – главная операция при работе с индексами. Индекс, по которому база данных упорядочена, называют главным, или управляющим индексом. Говорят также, что база данных находится под управлением соответствующего индекса. Упорядочение осущест-
вляется командой
SET ORDER TO
[<вырN1>/<idx-файл>/ [TAG] <имя тега> [OF <cdx file>] [IN <expN2> | <expC] [ASCENDING | DESCENDING]
Она устанавливает упорядочение по индексу, имя которого указано либо уже привычным для нас способом (<idx-файл>/[TAG] <имя тега> [OF <cdx file>] ), либо по номеру (<вырN2>).
Команды
SET ORDER TO
SET ORDER TO 0
“разупорядочивают” базу данных, т.е. никакой индекс не является главным, управляющим.
ПРИМЕРЫ УПОРЯДОЧЕНИЯ
SET ORDER TO TAG surname
-упорядочить базу в текущей рабочей области по тегу surname структурного индекса
SET ORDER TO towns IN 1
-упорядочить базу в рабочей области с номером 1 простому индексу towns.
SET ORDER TO TAG snl OF persons.cdx DESCENDING
-упорядочить в обратном порядке базу в текущей рабочей области по теге snl мультииндекс-
ного файла persons.cdx.
SET ORDER TO moscow IN address
-упорядочить базу в рабочей области с базой address по простому индексу moscow (файл moscow.idx).
ОТКРЫТИЕ ИНДЕКСА
Для того, чтобы использовать уже существующие индексы, их надо предварительно открыть. Автоматически открывается:
а) структурный индекс,
б) вновь создаваемый индекс.
Открытие индекса осуществляется командой
SET INDEX TO [<список индексных файлов>] [ORDER <вырN>/<IDX-файл>/
[TAG] <имя тега> [OF <CDX-файл>] [ASCENDING / DESCENDING]] [ADDITIVE]
ДРУГИЕ ОПЕРАЦИИ С ИНДЕКСАМИ И СПРАВОЧНЫЕ ФУНКЦИИ
ПЕРЕИНДЕКСИРОВАНИЕ При изменении базы данных все открытые при этом индексы автоматически пере-
страиваются. Однако это может оказаться неудобным: для больших баз с достаточным коли-
чеством индексов переиндексирование нередко начинает занимать существенное время и тормозит работу с базой. Для того, чтобы этого избежать, на время изменения базы данных индексы закрывают, а потом – снова открывают и обновляют (один раз!) командой
REINDEX
КОПИРОВАНИЕ И УНИЧТОЖЕНИЕ ИНДЕКСОВ
COPY INDEXES <IDX-файлы>/ ALL [TO <CDX-файл>]
- скопировать все открытые (ALL) или перечисленные через запятую открытые <IDX – фай-
лы> в структурный или именованный мультииндексный <CDX-файл>.
Обратную функцию выполняет команда
COPY TAG <тег> [OF <CDX-файл>] TO <IDX – файл>
- скопировать <тег>, находящегося в указанном именованном или ( по умолчанию) струк-
турном мультииндексном <CDX-файле> в idx-файл. Файл, из которого осуществляется ко-
пирование, должен быть открыт.
Команды
DELETE TAG <тег1> [OF <CDX-файл1>] [,<тег2>[OF<CDX-файл2>]]…
DELETE TAG ALL [OF <CDX – файл>]
- удаляют указанные или все (ALL) теги из открытого в текущей рабочей области CDX –
файла.
СПРАВОЧНЫЕ ФУНКЦИИ
ORDER( [<область>] )
- возвращает имя главного индексного файла или главного тега из мультииндексного файла для текущей рабочей области ( если [<область>] не указана) или для области, заданной но-
мером или псевдонимом. Аналогично ей действует функция
SYS(22[,<область>] )
с той только разницей, что в SYS область задается только числом.
NDX (<вырN>[,<область>] )
- выдает прописными буквами полное имя индексного файла с номером <вырN> (напомним,
индексные файлы нумеруются в порядке их открытия), открытого в текущей или указанной рабочей области.
CDX(<вырN>[,<область>] )
MDX(<вырN>[,<область>] )
- возвращают имя открытого CDX – файла с номером <вырN> (напомним, первым является всегда структурный индексный файл), открытого для базы данных в рабочей области <об-
ласть>.
TAG ([<CDX – файл>,]<вырN1> [,<область>] )
- возвращается имя индекса ( тега из <CDX-файла> или IDX – файла) для базы данных из текущей или указанной рабочей области <область>.
ГЛАВА 4
ПОИСК В БАЗАХ ДАННЫХ И СВЯЗИ МЕЖДУ НИМИ
ПОСЛЕДОВАТЕЛЬНЫЙ (БЕЗИНДЕКСНЫЙ) ПОИСК
Последовательный поиск осуществляется командой
LOCATE FOR <вырL1> [<границы>] [WHILE <вырL2>] [NOOPTIMIZE]
и состоит в нахождении, путем перебора, записи, удовлетворяющей условию <вырL1>. По-
иск ограничивается опциями
[<границы>]
(возможные границы ALL, REST, NEXT<вырN>, RECORD<вырN>, по умолчанию – ALL) и
[WHILE<вырL2>]
которая завершает процедуру поиска как только условие <вырL2> оказывается ложным.
В результате поиска либо будет найдена первая запись, удовлетворяющая всем усло-
виям, и тогда указатель записей будет установлен на эту запись (т.е. эта запись станет теку-
щей). Либо такая запись найдена не будет ( или ее вообще нет, или поиск прервался через
WHILE – условие раньше, чем она была найдена) – тогда поиск считается “неудачным” и
указатель записей устанавливается на конец файла.
Результаты поиска могут анализироваться с помощью ряда служебных функций ( при непосредственной работе в них нужды нет – взял и посмотрел в базе данных, что там проис-
ходит, однако при написании программ такие функции бывают полезны: если вы предусмат-
риваете различные результаты поиска и указываете машине, что делать в каждом случае, то ваша программа будет работать без сбоев даже в “неудачных” ситуациях).
FOUND( )
- выдает истинное значение, если поиск был удачен и ложное, если поиск был неудачен ( это позволяет использовать конструкции типа IF FOUND ( ) THEN… - по поводу IF см. раздел
“Основные конструкции языка FoxPro”). EOF ( )
BOF ( )
-признаки конца и начала файла. Выдают истину, если мы находимся на конце или начале файла соответственно и ложь в противоположном случае.
RECNO ( [<область>] )
-выдает номер текущей записи в базе данных, находящейся в указанной рабочей области
(область указывается либо номером, либо именем или псевдонимом базы данных) или в те-
кущей, если параметр не указан.
Если нас интересует не та запись, которая найдена первой, а и другие, удовлетворяю-
щие тому же условию, поиск можно повторить командой
CONТТNUE
ИНДЕКСНЫЙ ПОИСК
Индексный файл не только упорядочивает базу данных для просмотра, но и позволяет ускорить поиск в ней. Если база данных находится под управлением индекса, то поиск мож-
но осуществлять с помощью команды
SEEK <выражение>
Эта команда работает следующим образом: указанное <выражение> ищется не в са-
мой базе данных, а в индексе (методом двоичного поиска, который мы обсуждали в разделе
“Реляционная модель данных” ), а затем устанавливает указатель записей на тот номер, кото-
рый найден в индексе. Команда SEEK разыскивает только одну первую запись, в которой значение индексного выражения = <выражение> (напомним, что сравнение строк в FoxPro
производится по длине второго операнда ) и не имеет аналога команде CONTINUE в безин-
дексном поиске.
Функции RECNO( ), FOUND ( ), EOF ( ) реагируют на результаты поиска командой
SEEK точно так же, как и командами LOCATE и CONTINUE. Если поиск удачный, RECNO ( ) равно номеру найденной записи, FOUNDO = T., EOF ( ).; если нет, RECNO( ) равно числу записей в базе данных плюс единица, FOUND ( ) =.T.. Все это относится и к индексам с FOR
– условием.
Для индексированных баз существует модификация функции указания номера записи с аргументом нуль – RECNO ( 0), которая в случае неудачного поиска возвращает номер за-
писи, имеющей самое близкое значение индексного выражения к тому, которое было указано в команде SEEK.
ЧТО ТАКОЕ СВЯЗЬ МЕЖДУ БАЗАМИ ДАННЫХ
В FoxPro допускается работа сразу с многими базами данных и при этом возможно установление связей между ними. Установление связи означает, что указатель записей в од-
ной базе двигается синхронно с указателем в другой базе.
КОМАНДА УСТАНОВЛЕНИЯ СВЯЗЕЙ
Связь между базами данных устанавливается командой
SET RELATION TO <ключ> INTO <область>
[,<ключ> INTO <область>…] [ADDITIVE]
Здесь <ключ> - выражение, построенное для управляющей базы данных, <область> - номер области, где находится управляемая база данных или имя ( псевдоним) управляемой базы.
Как видно из формата команды, в FoxPro имеется возможность устанавливать связи с не-
сколькими базами одновременно. К существующим связям можно добавить новые, однако при этом нужно не забывать поставить ключ [ADDITIVE] (иначе все связи, которые сущест-
вовали до того, будут ликвидированы. Кроме того, что допускается сцепление одной базы с несколькими другими, младшие базы могут, в свою очередь, быть связаны с базами следую-
щего уровня и т.д. При этом не допускается две вещи: зацикливание (A->B->C->A) и (что,
вообще говоря, является частным случаем зацикливания) связь базы данных с собой. Впро-
чем, эти ограничения можно частично обходить, открывая несколько экземпляров одной и той же базы в различных рабочих областях ( по этому поводу см. раздел “Работа с несколь-
кими базами”).
Команда
SET RELATION TO
(без параметров ) разрывает все связи, идущие “от” текущей базы данных к другим. Связь с одной отдельной базой в заданной области осуществляется командой
SET RELATION OFF INTO <область>
СВЯЗЬ ВИДНА ОДНА-СО-МНОГИМИ
Может оказаться, что использование правила ключа не только невозможно, но и про-
тиворечит смыслу задачи. Так бывает, если одному и тому же реальному объекту в управляе-
мой базе соответствуют несколько записей. Например, один и тот же математик мог участво-
вать в нескольких конференциях или опубликовать несколько статей. Тогда в соответст-
вующих базах (например, к каталоге статей) одной фамилии будет соответствовать несколь-
ко статей. Для работы с такого рода соответствием можно модифицировать связь, установ-
ленную командой SET RELATION и превратить ее в связь, называемую одна – со – многими.
Это делается командой
SET SKIP TO [<область1> [,<область2>]…]
Связь может быть установлена сразу с несколькими младшими базами находящимися в ука-
занных <областях>.
Команда
SET SKIP TO
без параметров удаляет связи типа одна - со - многими (а точнее, возвращает их к состоянию обычной связи).
Эффект команды SET SKIP можно почувствовать на примере команды LIST или в режиме Browse просмотра баз данных.
ГЛАВА 5
СИСТЕМНЫЙ ИНТЕРФЕЙС
Системный интерфейс FOXPRO состоит из:
-системное меню;
-набора диалоговых блоков ( экранов ), вызываемых с помощью этого меню;
-командного окна, позволяющего водить команды и выполнять их в режиме интер-
претатора.
Системное меню состоит из строки меню (верхняя строка экрана) и набора подменю.
Действие каждого из пунктов этих подменю мы обсудим ниже. Как правило, каждый пункт подменю вызывает какой – то диалог уточнения параметров команды.
ДИАЛОГОВЫЙ БЛОК
Диалоговый блок позволяет задать требуемые для выполнения соответствующего пункта подменю параметры и содержит обычно следующие объекты:
- Check boxes (кнопки – выключатели, флажки) – квадратные скобки, в которых мо-
жет стоять или не стоять крестик. Крестик ставится и убирается клавишей пробел.
Radio buttons (радиокнопки, кнопки – переключатели) – набор пар круглых скобок с сопроводительными надписями, которые предоставляют нам выбор одного из нескольких возможных вариантов. Выбранный вариант помечается точкой, стоящей внутри скобок (.),
точка переставляется клавишей пробела.
Popups (всплывающие меню) – окаймленный в двойную рамку текст, который на са-
мом деле является одним из пунктов некоторого списка. Сам список появляется при нажатии
ENTER на области, ограниченной рамкой и именно он называется обычно всплывающим меню. Выбор другого пункта из списка осуществляется с помощью стрелок с последующим нажатием ENTER.
Push buttons (командные кнопки) – одна или несколько надписей (команд), заключен-
ных в угловые скобки. При нажатии такой кнопки (нажатие ENTER) будет выполнено соот-
ветствующие действие. Одна из надписей может быть заключена между “o” и “п” – эта ко-
манда будет выполнена при нажатии комбинации Ctrl + ENTER независимо от того, где в этот момент находится курсор.
Lists (список-меню) – список однотипных объектов (например, файлов или полей ба-
зы данных, или индексов), из которого можно выбрать один нажатием ENTER или пробела,
или, в некоторых случаях, нескольких нажатием комбинации Shift + Spacе.
СИСТЕМНОЕ МЕНЮ
Системное меню состоит из двух частей: