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

Методичка. Базы данных (ПОВТ) 2009

.pdf
Скачиваний:
54
Добавлен:
14.02.2015
Размер:
2.1 Mб
Скачать

Следующая команда сохраняет в <файле> или <мемо-поле> с заданным именем все или часть из имеющихся к текущему моменту переменных:

SAVE ТО <файл>/ТО MEMO <мемо-поле> [ALL LIKE/EXCEPT <маска>1

Если задано ALL LIKE, то сохраняются только переменные, соответствующие маске, если ALL EXCEPT - все, за исключением соответствующих маске. По умолчанию имени файла придается расширение MEM. Маска может содержать знаки, принятые в MS DOS:"?" и "*". Примеры сохранения переменных в файле FFF.MEM:

SAVE TO fff && сохраняется все переменные;

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

SET SAFETY OFF

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

Загрузкапеременныхвпамять

Принеобходимостиработатьсранеесохраненнымипеременнымииспользуетсякоманда

RESTORE FROM <файл>| FROM MEMO <мемо-поле> [ADDITIVE]

Команда загружает в память все переменные из указанного файла типа MEM или <мемо-поля>. Все имеющиеся в памяти к этому времени переменные уничтожаются. Чтобы этого избежать, можно включить фразу ADDITIVE.

Пример: RESTORE FROM FFF ADDITIVE

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

Активное использование временных переменных позволяет строить эффективные и быстрые системы обработки данных. Однако возможности сохранения в памяти компьютера значительного числа таких переменных ограничены ее емкостью. Ввиду этого память следует при необходимости периодически очищать от ненужных в данный момент или сохраненных в МЕМ-файлах переменных командой RELEASE:

RELEASE <переменные> | RELEASE ALL [LIKE | EXCEPT <маска>]

Команда удаляет только указанные <переменные>, или все (ALL), или соответствующие (LIKE), или не соответствующие (EXCEPT) <маске>. Уничтожение всех переменных может быть выполнено также командой

CLEAR MEMORY

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

В любой момент при отладке программ может понадобиться просмотр переменных памяти. Использование команды "?" слишком трудоемко при просмотре большого количества переменных. Следующаякомандапредъявляетсразувсенужныепеременныепамяти:

DISPLAY MEMORY [LIKE <маска>] [ТОPRINTER/FILE <файл>]

Команда показывает с паузами после выдачи каждых 20 строк все активные переменные и массивы, их статус (PUBLIC или PRIVATE), тип и значения. Кроме того, она показывает размер памяти, занятой под переменные, окна и меню. Если нужно просмотреть только все пользовательские переменные, введите команду DISPLAY MEMORY LIKE *. Аналогичные функции, но без остановок, выполняеткомандаLIST MEMORY.

Все вышеперечисленные в этом разделе команды, кроме команд просмотра, не распространяютсянасистемныепеременныеFoxPro.

КОМАНДЫ УПРАВЛЕНИЯ Команды управления являются важнейшим средством построения программ. Эти команды не

могутбытьопробованыииспользованывинтерактивномрежиме, атольковпрограммах.

Команда IF. В зависимости от условия команда выполняет те или иные <команды>, находящиесявнутриконструкцииIF...ENDIF.

IF <условие> <команды>

31

[ELSE <команды>]

ENDIF

Если условие истинно, выполняются все <команды>, следующие от IF до ELSE, если ложно, то <команды> от ELSE до ENDIF. Если необязательная фраза ELSE отсутствует и условие ложно, все внутренние <команды> пропускаются и выполняется команда, следующая за ENDIF. Допустимо вложение друг в друга конструкций типа IF ... ENDIF и других структурных команд.

Команда DO CASE. Конструкция DO CASE ... ENDCASE решает задачи, аналогичные команде IF, но в ней может быть указано сразу несколько условий, которые последовательно проверяются во всехфразахCASE.

DO CASE

CASE <условие 1> <команды> CASE <условие2> <команды>

[OTHERWISE <команды>]

ENDCASE

Если встретилось истинное <условие>, выполняются нижеследующие <команды> до следующей фразы CASE, или OTHERWISE, или ENDCASE, и конструкция завершается. Если ни одно из CASE-условий не истинно, выполняются <команды>, стоящие за фразой OTHERWISE до ENDCASE, если фраза OTHERWISE отсутствует, не выполняется ни одна команда.

В случае, если найдено истинное CASE-условие, остальные условия не проверяются и выполняется команда, стоящая за ENDCASE. Кроме перечисленных команд IF и DO CASE, в СУБД FoxPro имеется очень полезная функция анализа условия - IIF(<условие>,<выражение

1>,<выражение 1>).

Организация циклов

ВFoxPro имеются развитые средства организации программных циклов, которые в зависимости от постановки задачи могут быть классифицированы на циклы с условием (итерационные циклы) ициклыспараметром(арифметическиециклы).

Цикл с условием. Реализация так называемых итерационных циклов, т.е. циклов с заранее известным условием их окончания и неизвестным числом повторов, выполняется следующей конструкцией:

DO WHILE <условие> <команды>

ENDDO

Команды, заключенные между DO WHILE иENDDO, будутвыполняться до тех пор, пока <условие> истинно. Если оно ложно или становится ложным, осуществляется переход к команде, следующейзаENDDO.

Вязыке FoxPro отсутствует понятие "метка", т.е. нет естественной возможности перейти в другоеместопрограммы. Этосоздаетнекоторые(кажущиеся) сложности, которыелегкопреодолеть. Так, еслитребуетсявыйтизапределыцикла, необходимоиспользоватькоманду

EXIT

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

Следующаякомандаосуществляетпередачууправлениявцикле, новпротивоположнуюсторону-

вегоначало, насамукомандуцикла:

LOOP

32

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

Цикл с параметром. Арифметический цикл предполагает наличие переменной, ограничивающейчислоциклов.

FOR <переменная>=<вырН1> ТО<вырН2> [STEP <вырN>] <команды>

ENDFOR

В цикл FOR могут включаться команды EXIT и LOOP.

Цикл сканирования базы данных. Следующая команда применяется для перемещения в базеданныхивыполнения<команд> длякаждойвстреченнойзаписи, котораяотвечаетусловиям.

SCAN [<границы>] [FOR <условие>] [WHILE <условие>] <команды>

ENDSCAN

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

SCAN-цикл может быть завершен как по достижении <границ> его действия, так и при встрече конца базы данных. Выяснить это обстоятельство можно с помощью функции EOF()- Если EOF()=.t., цикл завершен раньше времени. Исключение составляет цикл с FORусловием - такой цикл всегда продолжается додостиженияконцафайла.

Следуетзаметить, чтовыполнениекаждойкомандыENDSCAN перемещаетуказательзаписей. Этозначит, чтозавершениеSCAN-цикласWHILE-условиемпереноситнасзапределыдействияэтого условия.

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

функцияанализаусловий

ПF(<условие>,<выр1>,<выр2>) - выдает значение <выр1>, если <условие> истинно, и <выр2> - если ложно. Функция удобна для применения в командах индексирования, в команде BROWSE, при печати, при описании меню и т.д., поскольку ее можно непосредственно включать в команды (например, ?, @...SAY и др.). Вообще, функция IIF() может быть помещена практически вместо любого <выражения>, присутствующего в команде или другой функции. Важно только, чтобы тип этого выражения соответствовал разрешенному в данномместе.

Функцииподстановки

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

&<символьная переменная>

Функция называется функцией макроподстановки и превращает содержимое <символьной переменной> илимемо-полянепосредственновобъект, которыйонаизображает.

МАССИВЫ ПЕРЕМЕННЫХ Одним из важных инструментов программиста является возможность работы с массивами

временныхпеременных.

Описаниемассивов

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

DECLARE | DIMENSION <переменная> (<вырН1> [,<вырН2>]) [,<переменная> (<вырН1> [,<вырН2>])]

Нумерацияэлементовмассиваначинаетсясединицы. Например: DIMENSION a(3,8), b(4)

33

Здесь описываются два массива: двумерный массив А (размерностью 3 х 8) и одномерный В (длиной четыре элемента). Сразу после описания массивов командой DIMENSION всеихэлементыполучаютлогическийтипсозначением.F. Вдальнейшемэлементыв результате присваиваний могут получать новые типы и значения. Тип каждого отдельного элемента определяется результатом последнейкомандыприсваивания(=, STORE, SCATTER).

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

Каждый массив использует для своего имени одну переменную и может иметь до 3600/65000 элементов (стандартная/расширенная версии). Разрешено использовать до 3600/65000 массивов. Практическиеограничениязависятотдоступнойпамятикомпьютера.

Обменданнымисбазойданных

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

Работа с одномерными массивами/переменными. Следующая команда последовательно переносит значения полей только из текущей записи активного файла базы данных в последовательные элементы одномерного массива (если указана опция <массив>) или временные (еслиуказаноMEMVAR). Всетакиепеременныеполучают те же типы и размеры, что и поля базы данных. С опцией BLANK создаютсяпустыепеременные.

SCATTER [FIELDS <поля>][МЕМО] ТО <массив> | ТО <массив> BLANK | BLANK | MEMVAR BLANK

Если массив ранее не был описан или его длина недостаточна, он будет создан командой. Если переменные ранее не существовали, они будут созданы с теми же именами, что и соответствующие поля. Для того чтобы СУБД могла отличить одинаковые имена полей и переменных, к последним нужно обращаться с префиксом "М". Например, М->Х или М.Х для переменной X. В случаях, если префикса нет, СУБД сначала ищет поле с указанным именем, и толькоилиегоненаходит- переменную.

Если использовано слово BLANK, то создается множество незаполненных переменных или элементовмассива, имеющихтежетипы, чтоиполябазыданных.

ЕслирежимFIELDS неуказан, переносятсявсеполязаписи.

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

Действие команды GATHER обратно действию команды SCATTER:

GATHER FROM <Maссив> | MEMVAR [FIELDS <поля>] [MEMO]

Команда переписывает в <поля> текущей записи активного файла базы данных элементы <массива> или одноименные переменные (опция MEMVAR), созданные ранее командой SCATTER, включая мемо-поля (если указана опция MEMO).

Типы соответствующих полей и элементов массива должны совпадать. Если отсутствует слово FIELDS, элементы переносятся в последовательные поля, начиная с первого.

Есличислоэлементовмассиваиполейнесовпадает, лишниеигнорируются. Рассмотренная пара команд очень удобна, если предстоит сложная обработка полей

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

34

МОДУЛЬНОСТЬ ПРОГРАММ

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

Эти средства удобно использовать для реализации некоторых одинаковых процессов обработки данных. Тогда такой процесс программируется один раз в виде одного из перечисленных выше средств и вызывается в системе по мере необходимости.

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

Встречая обращение к процедуре, FoxPro ищет ее в следующей последовательности: 1. Втекущейпроцедуре; 2. Впроцедурном файле, если он подключен;

3. Снизу вверх встарших процедурах относительно текущей, если ониесть; 4. На диске в виде отдельной программы. Рассмотрим средства структурирования.

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

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

Обращение к процедуре выполняется командой DO:

DO <имя командного файла> [WITH <список параметров>] [IN <файл>]

Если не указано расширение имени файла, процедура ищется СУБД на диске в следующей последовательности: сначала в ЕХЕ, затем в АРР, FXP и, наконец, в PRG-файле. Процедура вообще может находиться внутри другого IN <файла> как его внутренняя процедура.

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

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

Параметры, указанные в команде DO после слова WITH в вызывающей программе, как принято в алгоритмических языках, называются фактическими, а соответствующие им параметры

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

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

PARAMETERS()

Завершаютсяфайлы-процедурыоднимизследующихобразов:

1. Достижениемпоследнейкомандыфайлаосуществляетсявозвратвстаршуювызвавшую программуилинакомандныйуровень, еслиэтосамыйстаршиймодуль;

2. КомандойRETURN - возвратвстаршуюпрограмму;

3. КомандойCANCEL - выходнакомандныйуровень;

4. КомандойQUIT - выходизFoxPro вDOS. КомандаRETURN можетсодержатьопции

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

Здесь фраза RETURN TO MASTER указывает на переход к самому верхнему уровню вызывающих процедур, a RETURN TO <Процедура> - возврат на процедуру с указанным

35

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

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

RETRY

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

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

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

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

PROCEDURE <имяпроцедуры>

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

Процедурныйфайл

Множество внешних, обычно "родственных" процедур иногда удобно объединить в один процедурный файл (также типа PRG), которыйвызывается(загружаетсявпамять) командой

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

Только после этого можно командой DO вызывать из него отдельныепроцедуры.

Вкаждый момент может быть открыт только один процедурный файл. Чтобы его закрыть, нужно использовать команду SET PROCEDURE TO безпараметров.

Процедуры-функции

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

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

ВнутренняяПФдолжнаначинатьсяскоманды

FUNCTION <Имя функции>

Если в ПФ передаются параметры, второй командой обязательно должна быть команда

PARAMETERS.

Завершается ПФ командой RETURN вида RETURN <выр>, где <выр> является результатомфункции. Еслиэтакомандаопущена, подразумеваетсяRETURN .Т. .

FoxPro не делает различий между процедурами и процедурами-функциями. К ПФ можно обращаться и как к процедуре - командой DO. Вэтом случае при возврате висходную программу значение<выр> вкомандеRETURN игнорируется.

Параметры, передаваемые в функцию через команду PARAMETERS, хотя и могут изменяться внутри функции, в вызывающей программе останутся неизменными, поскольку они передаются"позначению". Способомпередачипараметровуправляеткоманда

SET UDFPARMS TO VALUE | REFRENCE

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

через команду RETURN, но и какие-то из измененных параметров, следует воспользоваться установкойREFRENCE ("поссылке").

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

36

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

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

Рассмотримстатусиобластьдействияпеременных.

Глобальные переменные. Переменные и массивы, будучи объявленными как глобальные, имеют силу всюду в среде СУБД - во всех ее программах, подпрограммах и процедурах. Более того, они остаются в СУБД, даже если создавшая их программа закончена и удалена из памяти. Такиепеременныеобъявляютсякомандой

PUBLIC <переменные> [,<массивыпеременных>]

Например, команда

''

PUBLIC А, В, R(10),

2(2,6)

объявляет глобальными

переменные А и В и массивы R и Z. Применение команды

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

А=3

В='КНИГА'

переменные А и В будут считаться глобальными (PUBLIC) и останутся в памяти в случае загрузки в нее программ, где могут быть изменены.

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

Локальные переменные. Переменные, объявляемые локальными (PRIVATE), существуют тольковданноммодулеивсехмладшихпоотношениюкнемумодуляхвмоментыихвызова.

PRIVATE <переменные>

Возможнообъявлениелокальнымигрупппеременныхбезихпоименногоперечисления.

PRIVATE ALL LIKE | EXCEPT <маска>

ПараметрыLIKE иEXCEPT разъясненыранеевкомандеSAVE.

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

КОМАНДЫ ЯЗЫКА ЗАПРОСОВ SQL

В язык FoxPro включен ряд команд из языка запросов SQL (Structured Query Language). Он хорошо известен многим пользователям, работавшим на больших ЭВМ, и считается стандартом. Хотя первоначально включение SQL в пакет FoxPro было вызвано желанием скорее придать формальную полноту средствам СУБД, чем потребностями программистов, рассматриваемыенижекомандыявляютсяполезным ибыстрым инструментом обработкиданных. КомандыSQL могутнепосредственновключатьсявпрограммынарядуссобственнымикомандами

FoxPro.

Созданиебазданных

CREATE DBF <DBF-файл> (<имя поля> <тип> [(<размер>[,<дробных разрядов>]) [,<имяполя>...]])

| FROM ARRAY <массив>

37

Команда создает новую базу данных <DBF-файл> с указанным именем. Длякаждогополя задаются его имя, тип (одной из букв С, N, D, M, F, L), длина и число десятичных разрядов. Длина и точность не задаются для типов дата (D), логический (L) и примечаний (М), а точность - для символьноготипа (С). Всетребования к описанию полибазыданныхстандартные. Созданнаябаза сразуоткрывается.

Описание полей может быть задано и из <массива> при использовании опции FROM ARRAY. Такой двумерный массив из четырех столбцов и строк в количестве, совпадающем с количеством полей, должен иметь указанное выше наполнение. Например, функция AFIELDSO какразгенерируеттакоймассивизоткрытойбазыданных.

Пример. СозданиебазыKADR.DBF.

CREATE DBF Jcadr (FAM С (25), TAB N(3), DTK D, POL C(l), ; SEM C(l), DET N(l), POOR С (15), SZAR N(7), PER M )

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

Дополнениебазы

INSERT INTO <файл БД> [(<поле1> [, <поле2> [, ...]])] VALUES (<выр1> [, <выр2>

[,...]])

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

INSERT INTO <имяБД> ARRAY <массив> | FROM MEMVAR

Переносит данные, содержащиеся в указанном <массиве> (опция ARRAY), или данные из временных переменных (опция MEMVAR). Такие переменные должны существовать и иметь те же самые имена, что и поля базы данных (но с префиксом М). Такие переменные, например, вырабатываются по команде SCATTER MEMVAR. Поля, для которыхнетпеременныхсподходящими именами, останутсяпустыми.

Таким образом, команда INSERT соответствует паре команд -APPEND BLANK и REPLACE, новыполняетсябыстрее.

В следующей команде база KADR.DBF дополняется новой записью с данными для полей

FAM, TAB иSZAR.

INSERT INTO kadr (fam, tab, szar) VALUES ('ПетровВ.П.', 860, 560000)

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

Формированиезапросовизбазыданных

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

Команда имеет массу опций-возможностей. Ввиду этого сначала приведем ее предварительныйсинтаксис, которыйпозволитзатемлучшеосознатьдетали.

SELECT <что выводится> FROM <откуда (источник)> INTO <куда (получатель)> WHERE <каким условиям должно отвечать> GROUP BY <колонки, по которым выполняется группирование> HAVING <условие группирования записей в одну строку> ORDER BY <вкакомпорядкевыводитьданные>

Команда SELECT и вообще команды SQL мало зависят от текущего состояния среды FoxPro. Они сами открывают нужные им базыданныхииндексныефайлы. Еслинеобходимыхдля выполнения команды индексов нет, они будут созданы, а по завершении команды уничтожены. Однако, конечно, лучше, чтобы применялись готовые индексы - для этого они должны быть

38

открыты(используютсятолькокомпактные индексы). Исключение составляют структурные CDXиндексы. Открытие соответствующей базы данных (например, с помощью команды SELECT) открываетииндекс. Теперьрассмотримееболееполныйформат.

SELECT

[DISTINCT] [<псевдоним>.]<выражение> [AS <колонка>] [,[<псевдоним>.]<выражение> [AS <колонка>]...] FROM <БД> [,<БД> ...] [[INTO <получатель> ] | TO FILE <файл>

[ADDITIVE] | TO PRINTER]] [NOCONSOLE] [PLAIN] [NOWAIT] [WHERE <условие

связи>

[AND <условиесвязи>...] [AND | OR <условиеотбора>

[AND | OR <условие отбора>...]]] [GROUP BY <колонка> [, <колонка> ...]] [HAVING <условиеотбора> ]

[ORDER BY <колонка> [ASC | DESC] [,<колонка> [ASC | DESC]...]]

Работа в сети

Работа в сети дня пользователя означает просто доступ к еще одному диску, где располагаются данные, доступные и другим пользователям. Одновременное чтение данных разнымипользователяминевызываетпрактическиникакихпроблемприработевсети.

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

Исполняемый файл программы может находиться где угодно - на сервере или на рабочей станции. Однако с точки зрения скорости загрузки, лучше, если на каждой рабочей станции находится свой экземпляр exe-файла, а с точки зрения сопровождения прикладной программы удобнее иметь единственную копию приложения. В случае, если программа все-таки находится насервере, дляускоренияработысистемывременныефайлывсе равно должны формироваться на локальном диске. Для этого в файл CONFIG.FP каждой станции следует включить директивы, указывающееместоихрасположения(напримерС:\ТМР\):

SORTWORK=C:\TMP\

EDITWORK=C:\TMP\

PROGWORK=C:\TMP\

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

По степени конфликтности и, соответственно, уровню сложности разработок сетевых приложений их можно условно разделить на несколькогрупп:

1.Ввод/редактирование данных выполняется с одного рабочего места. Остальные пользователи имеют доступ только для чтения. Схема: "Один работник, много начальников". Это довольно распространеннаяситуациячистоинформационнойсистемы.

2.Несколько операторов могут иметь одновременный доступ для редактирования одной и той же записи. Например, одновременная обработка операционистками одного и того же счета в банке по запросу разных клиентов. Здесь отсутствие контроля может даже повлечь снятиесосчетабольшей суммыденег, чемтамимеется(повторноеснятие).

3.Несколько операторов могут иметь одновременный доступ для редактирования нескольких записей, например одновременная обработка пересекающихся списков товаров, запрошенных

39

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

4.Несколькооператоровмогутиметьодновременныйдоступсразу комногимилидаже всем записям базы данных. Например, руководство торговой организации может пожелать изменить цены всех товаров из-за изменения курса доллара и при этом обслуживание клиентов (отпуск товаров) с рабочихместнедолжнопрекращаеться.

5.Пользователь может захотеть сделать радикальные изменения данных, например изменить структуру базы данных. Такие действия совершенно исключают доступ к базе с других рабочих мест как для редактирования, так и для просмотра и вообще не могут быть выполнены в многопользовательском режиме. К этим командам относятся команды INSERT [BLANK],

MODIFY STRUCTURE, PACK, REINDEX, ZAP.

Приработевсетибазыданныхмогутнаходитьсяводномизчетырехсостояний:

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

• Пользователь захватывает файл для ввода/преобразования/вывода данных. Остальные операторы в это время могут только читать такой файл. Эта ситуация очевидна в случае необходимости одновременного изменения нескольких и тем более всех (REPLACE ALL) записей. Формирование отчетов и сводных справок также может потребовать блокировки файлов. Если этого не сделать, в некоторых случаях возможно получение неполноценного документа. Решение о блокировке принимается в зависимости от важности справки. С учетом этого, можно предоставить пользователю возможность самому принять решение о блокировке/неблокировке базы в зависимости от требуемой достоверности отчета за счет временного отключения других пользователей. Впрочем, без очереди даже и начальник не сможет захватить файл/запись. Здесь уместно сказать, что формирование сложного и, следовательно, требующегозаметного времениотчета нужно попытаться организовать не из рабочей базы/баз, а из ее копии. Копирование базы во временный файл обычно происходит гораздо быстрее, чем формирование капитального отчета. Это позволит уменьшить время блокировки базы. Далее можно сколько угодно исследовать и преобразовывать такую базу-копиюбез ущерба для других пользователей.

• Пользователь захватывает запись для ввода данных. Остальные операторы в это время могуттолькочитатьэтузапись.

• Никто из пользователей не изменяет/выводитданные. База полностьюдоступна.

В зависимости от потенциальной конфликтности действий операторов, программирование сетевых приложений усложняется на 10-100% сравнительно с однопользовательскими и часто вносит серьезные ограничения на используемые средства СУБД и технологию обработки данных. Если в однопользовательском режиме программист совершенно не ограничен в выборе средств обработкиданных, топриработевсетиондолженпостоянноучитыватьналичиедругихпользователей

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

Работа в сети, по крайней мере, теоретически, не требует специальных приемов и команд. С помощью только обычной команды READ можно редактировать запись непосредственно в базе данных. При этом происходит автоматический захват записи (READ LOCK). Другие пользователи в это время могут ее только читать. Их попытки редактирования пресекаются с выдачей системного сообщения, на которое они могут реагировать сами или же оно может быть обработано как ERROR-событие. Режим повторных запросов здесь может быть определенспомощьюустановкипараметровкоманадыSET REPROCESS TO.

40