Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Учебное пособие 487

.pdf
Скачиваний:
4
Добавлен:
30.04.2022
Размер:
441.77 Кб
Скачать

ется также операция включения $: 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е.

СИСТЕМНОЕ МЕНЮ

Системное меню состоит из двух частей: