ГЛАВА 5. Команды Clipperа (часть 2)
CANCEL / QUIT
Написание: CANCEL / QUIT
Прекращает работу программы, закрывает все открытые файлы и
возвращает управление в DOS. CANCEL или QUIT можно использовать
в любом месте программы для прекращения работы и возврата в DOS.
Выполнение команды RETURN в процедуре наивысшего уровня
производит те же действия.
Library: CLIPPER.LIB
См. также: QUIT,RETURN
CLEAR
Написание: CLEAR
Очищает экран, очищает ждущие обработки GETы и ставит курсор в
исходное положение (строка 0, столбец 0).
Если Вы редактируете GETы, не ставьте CLEAR в текст процедур,
вызываемых через SET KEY либо VALID, поскольку она удалит все
еще не обработанные GETы. Для очистки экрана без порчи GETов
используйте @0,0 CLEAR.
library: CLIPPER.LIB
См. также: @...CLEAR,CLEAR GETS
CLEAR ALL
Написание: CLEAR ALL
Закрывает все открытые файлы БД (и связанные с ними файлы
индексов, форматов и мемо), удаляет все переменные и переходит в
рабочую область No 1.
library: CLIPPER.LIB
- 57 -
См. также: CLEAR MEMORY,CLOSE,RELEASE
CLEAR GETS
Написание: CLEAR GETS
Удаляет все необработанные GETы.
library: CLIPPER.LIB
См. также: @...CLEAR,CLEAR
CLEAR MEMORY
Написание: CLEAR MEMORY
Удаляет все глобальные и локальные переменные. Используется,
когда Вы хотите удалить как те, так и другие переменные, в
отличие от RELEASE ALL, которая удаляет только локальные
переменные, определенные в текущей процедуре.
Пример: PUBLIC var
var=SPACE(10)
?TYPE("var") && результат: C
CLEAR MEMORY
?TYPE("var") && результат: U
library: CLIPPER.LIB
См. также: CLEAR ALL,RELEASE ALL
CLEAR TYPEAHEAD
Написание: CLEAR TYPEAHEAD
Опустошает буфер клавиатуры. Полезна в процедурах интерфейса с
пользователем, для того, чтобы гарантировать, что принятые из
буфера клавиатуры нажатия клавиш относятся именно к текущей
деятельности, а не остались от прошлых диалогов. Особенно это
относится к собственным функция (FUNC)м, используемым в ACHOICE() и
DBEDIT().
library: CLIPPER.LIB
См. также: KEYBOARD,SET TYPEAHEAD,ACHOICE(),DBEDIT(),
LASTKEY(),NEXTKEY()
- 58 -
CLOSE
Написание: CLOSE ALL/ALTERNATE/DATABASES/FORMAT/INDEX
Закрывает указанные классы файлов.
ALL: - закрывает все файлы БД, альтернативные и индексные во
всех рабочих областях. Кроме того, выключает все активные
фильтры, отношения и форматы.
ALTERNATE: - закрывает открытый текущий альтернативный файл, но
не удаляет имя альтернативного файла, установленное командой SET
ALTERNATE TO <имя файла>. Команда SET ALTERNATE TO без аргумента
также закрывает альтернативный файл.
DATABASES: - закрывает все открытые файлы БД и связанные с ними
индексы во всех рабочих областях и выключает все активные
фильтры. На активный формат никакого влияния не оказывает.
FORMAT: - выключает текущий формат, выполняя те же действия, что
и команда SET FORMAT TO без аргумента.
INDEX: - закрывает все индексные файлы, открытые в текущей
рабочей области.
Многие другие команды Clipperа также закрывают файлы. Среди них :
QUIT
CANCEL
RETURN (из процедуры высшего уровня)
CLEAR ALL
USE (без аргумента)
Clipper также закрывает файлы при обработке ошибок исполнения
программы. Когда Вы прекращаете работу программы в ответ на
сообщение об ошибке, то файлы закрываются при следующих ответах:
- "Q" (QUIT) в ответ на предложение (Q/A/I);
- "N" в ответ на вопрос "Continue?" (продолжить?);
При этом закрываются все файлы и происходит возврат в DOS.
library: CLIPPER.LIB
См. также: CANCEL, CLEAR ALL, CLEAR MEMORY, QUIT, RETURN, SET
ALTERNATE TO, USE
COMMIT
Написание: COMMIT
- 59 -
Выполняет запись на диск для всех рабочих областей. COMMIT
"выталкивает" все буферы Clipperа в DOS не дожидаясь их
выполнения и, затем, записывает их на диск.
Требует использования DOS 3.3 и выше.
Пример: CLEAR
USE Dbf
FOR i=1 to 10
APPEND BLANK
REPLACE Fld1 with i
COMMIT && запись буфера на диск
NEXT
library: CLIPPER.LIB
См. также: SKIP
CONTINUE
Написание: CONTINUE
Продолжает поиск, начатый по команде LOCATE, в текущей рабочей
области.
CONTINUE ищет, начиная с текущей строки, следующую запись,
удовлетворяющую условию последней выполняемой в данной рабочей
области команды LOCATE. Поиск прекращаетя, когда найдена искомая
запись или достигнут конец области поиска, определенной в
LOCATE.
Если запись найдена, то она становится текущей и функция (FUNC) FOUND()
возвращает истину (.T.). Если она не найдена, то FOUND() всегда
возвращает ложь (.F.), а положение указателя текущей строки
зависит от указания области определения в LOCATE.
Каждая рабочая область может иметь такое активное условие
поиска. В Clipperе условие для LOCATE остается в силе, пока не
будет указано новое. Никакие другие команды не снимают это
условие.
Пример: USE Sales
? LASTREC() && результат : 6
LOCATE FOR Salesman = "1002"
? FOUND(), RECNO(), EOF() && .T. 3 .F.
CONTINUE
? FOUND(), RECNO(), EOF() && .T. 4 .F.
CONTINUE
? FOUND(), RECNO(), EOF() && .F. 6 .T.
library: CLIPPER.LIB
См. также: LOCATE,FOUND()
COPY
Написание: COPY TO <файл>/(<вырС1>)[<обл.опр.>]
[FIELDS<список полей>][FOR<условие>]
- 60 -
[WHILE<условие>][SDF/DELIMITED/
DELIMITED WITH<ограничитель>/(<вырС2>)]
Копирует весь или часть текущего файла БД в новый файл.
<файл> - имя нового файла. Если тип файла не указан, то, по
умолчанию, тип будет (.dbf) и добавлять расширение не нужно.
Если тип создаваемого файла указан,то расширение предполагается
(.txt), если не указано иначе.
FIELDS: - определяет список полей, подлежащих копированию в
целевой файл. По умолчанию все поля.
<обл.опр.> - часть текущего файла, из которой нужно копировать.
По умолчанию весь файл (ALL).
<условие> - в опции FOR определяет множество записей, в пределах
области определения, подлежащих копированию. - в опции WHILE
определяет множество записей, отвечающих условию, начиная с
текущей и пока условие выполняется.
SDF: - указывает, что тип выходного файла - ASCII-файл
системного формата данных. Записи фиксированной длины, каждая
отделена парой символов возврат каретки/перевод строки. Поля -
фиксированной длины и не имеют разделителей. Символьные поля
дополняются замыкающими пробелами, поля даты записываются в
форме "ггггммдд" и логические поля в форме T/F. Признак конца
файла - Ctrl-Z (шестнадцатеричное 1A).
DELIMITED: - определяет тип выходного файла как ASCII-файл с
ограничителями. Записи изменяемой длины, каждая отделена парой
возврат каретки/перевод строки. Поля изменяемой длины и
разделены запятыми. Символьные поля охвачены ограничителями (по
умолчанию - двойными кавычками, если Вы не указали другой
символ, используя опцию WITH). Начальные и замыкающие пробелы в
числовых и символьных полях обрезаются, поля даты записываются в
форме "ггггммдд" и логические поля в форме T/F. Признак конца
файла - Ctrl-Z (шестнадцатеричное 1A).
Примечание: Опции типов DELIMITED WITH BLANK,DIF,SYLK и WKS
с ключевым словом TYPE не поддержаны (в отличие
от DBASE).
Копируются все строки, содержащиеся в активном
файле БД и соответствующие области определения
и условиям FOR и WHILE.
Пример: Демонстрация копирования в другой (.dbf) файл.
USE Sales
?LASTREC() && результат: 84
COPY TO Temp
USE Temp
?LASTREC() && результат: 84
В следующих примерах используется файл Testdata.dbf, имеющий
четыре поля, по одному на каждый тип данных. Char, Num, Date,
Logical. Файл содержит следующие данные:
- 61 -
USE Testdata
?Char,Num,Date,Logical
Результат:
Character 12.00 08/01/87 .T.
Пример копирования в SDF-файл:
COPY NEXT 1 TO Temp SDF
TYPE Temp.txt
Результат:
Character 12.0019870801T
Пример копирования в файл с ограничителями:
COPY NEXT 1 TO Temp DELIMITED
TYPE Temp.txt
Результат:
"Character",12.00,19870801,T
Пример копирования в файл с нестандартными ограничителями:
COPY NEXT 1 TO Temp DELIMITED WITH '
TYPE Temp.txt
Результат:
'Character',12.00,19870801,T
Работа в сети: Когда Вы копируете при работе в сети, Clipper
открывает файл целевой БД в монопольном режиме.
library: CLIPPER.LIB
См. также: APPEND FROM,COPY FILE,COPY STRUCTURE,SET DELETED
COPY FILE
Написание: COPY FILE <файл1>.<расш.>/(<вырС2>)
TO <файл2>.<расш.>/(<вырС2>)
<файл1> - имя файла-источника.
<файл2> - имя целевого файла.
Расширения обязательны в обоих случаях.
Команда COPY FILE копирует файлы любого типа с текущего диска и
директория Clipperа.
Пример: COPY FILE Test.prg TO Real.prg
?FILE("Real.prg") && результат .T.
library: CLIPPER.LIB
См. также: CLOSE,COPY,SET DEFAULT,USE
- 62 -
COPY STRUCTURE
Написание: COPY STRUCTURE TO <файл>/(<вырС>)
[FIELDS<список полей>]
Создает пустой файл БД, с определениями полей, взятыми из
текущего файла БД.
<файл> - имя целевого файла. Расширение по умолчанию - .dbf.
FIELDS: <список полей> - это множество полей, подлежащих
копированию в новую структуру, в перечисленном порядке. По
умолчанию, копируются все поля.
Пример: USE Sales
?LASTREC() && результат: 84
*
COPY STRUCTURE FIELDS Branch,Salesman TO Temp
USE Temp
?LASTREC() && результат: 0
library: CLIPPER.LIB
См. также: COPY STRUCTURE EXTENDED,CREATE
COPY STRUCTURE EXTENDED
Написание: COPY TO <файл>/(<вырС>) STRUCTURE EXTENDED
[FIELDS <список полей>]
Создает файл БД, чьим содержимым являются определения полей
текущего файла.
<файл> - имя файла расширенной структуры.
FIELDS: <список полей> - одно или больше полей в текущем файле
БД, Чьи определения появятся, в виде записей, в новом файле БД,
в перечисленном здесь порядке.
Команда COPY STRUCTURE EXTENDED создает файл БД с четырьмя
полями: Field_name, Field_type, Field_len и Field_dec. В
результате, созданный файл содержит по одной строки на каждое
поле исходного файла (или на каждое поле, перечисленное в
списке).
При использовании в прикладных клиппер-программах это позволяет Вам
создавать или модифицировать структуру файла БД программным
путем. Чтобы создать из этого файла расширенной структуры новый
файл БД, используйте команду CREATE FROM. Если Вам нужен только
файл расширенной структуры, используйте команду CREATE.
Пример: USE Sales
COPY STRUCTURE EXTENDED TO Struc
- 63 -
USE Struc
LIST Field_name,Field_type,Field_len,Field_dec
Результат:
1 BRANCH C 3 0
2 SALESMAN C 4 0
3 CUSTOMER C 4 0
4 PRODUCT C 25 0
5 AMOUNT N 8 2
library: CLIPPER.LIB
См. также: CREATE,CREATE FROM,FIELD(),TYPE()
COUNT
Написание: COUNT [<обл.опр.>][ FOR <условие>]
[ WHILE <условие>] TO <переменная>
Подсчитывает количество записей в текущей рабочей области,
удовлетворяющих области определения и условиям.
<переменная> - переменная в памяти, которой присваивается
результат COUNT. Если эта переменная не существует, или она
нечислового типа, то COUNT создает ее, как числовую.
<обл.опр.> - часть текущего файла БД, внутри которой нужно
подсчитать строки. По умолчанию во всем файле (ALL).
<условие> - опция FOR указывает условное множество записей,
подлежащих подсчету внутри данной области определения. Опция
WHILE указывает множество записей, отвечающих условию, начиная с
текущей и пока условие выполняется.
Пример: USE Sales
?LASTREC() && результат: 84
COUNT FOR Branch="100" TO Branch_cnt
?Branch_cnt && результат: 4
library: CLIPPER.LIB
См. также:AVERAGE,SUM,TOTAL,LASTREC()
CREATE
Написание: CREATE <файл>/(<вырС>)
Генерирует файл пустой расширенной структуры базы данных.
<файл>- имя файла пустой расширенной структуры. Подобно COPY
STRUCTURE EXTENDED, CREATE порождает файл с четырьмя следующими
- 64 -
полями:Field_name(имя поля), Field_type (тип поля),
Field_len(ДЛИНА ПОЛЯ), Field_dec(количество знаков после
запятой). В отличие от COPY STRUCTURE EXTENDED, CREATE порождает
пустой файл базы данных и не требует присутствия другого файла
базы данных.
library:CLIPPER.LIB
Рекомендовано смотреть : CREATE FROM, COPY CTRUCTURE EXTENDED
CREATE FROME
Написание : CREATE <файл1>/(<вырС1>) FROME <файл2>/(<вырС2>)
Создает новый файл базы данных на основании файла структуры.
<файл1> - имя нового файла базы данных,сгенерированного на
основании структурного файла<файл2>.
<файл2> - имя структурного файла, используемого для определения
структуры нового файла базы данных.
CREATE FROME порождает новый файл базы данных со структурой
полей, определенной содержанием структурного файла. Архитектура
структурного файлавыглядит следующим образом:
Поле Имя Тип Длина Кол-во знаков после запятой
1 Field_name Символ 10
2 Field_type Символ 1
3 Field_len Число 3 0
4 Field_dec Число 3 0
Можно иметь любое количество полей внутри структурного файла для
описания атрибутов полей. Однако, при выполнении CREATE FROME,
Clipper генерирует новый файл базы данных, используя только
требуемые (описанные выше) поля. Все другие поля в структурном
файле будут проигнорированы.
Существует способность создать символьное поле диной более 999
символов. Для этого необходимо определить Field_dec равным INT()
от желаемой длины, деленной на 256, а Field_len равным остатку
от этого деления.
Примеры:
CREATE New FROME Struc
USE New
?LASTREC( ) && Результат: 0
Следующий пример показывает возможный вид CREATE - процедуры
интерактивного создания структуры нового файла базы данных:
CREATE New_stru
USE New_stru
more_flds=.T.
* Установка атрибутов полей нового файла базы данных
DO WHILE more_flds
APPEND BLANK
@5,0 SAY "Имя поля:" GET Field_name
- 65 -
@6,0 SAY "Тип поля:" GET Field_type
@7,0 SAY "Длина поля:" GET Field_len
@8,0 SAY "Знаки после зпт:" GET Field_dec
READ
more_flds=(.NOT.EMPLY(Field_name))
ENDDO
* Удаление пустых записей
DELETE ALL FOR EMPTY (Field_name)
PACK
USE
* Генерация нового файла данных
CREATE Newfile From New_stru
ERASE New_stru.dbf
Генерация поля из 4000 символов:
Fiel_dec=INT(4000/256)=15
Field_len=4000%256=160
REPLASE, Field_name WHITH"Note";
Field_type WITH "c",;
Field_len WITH 160,;
Field_dec With 15
library: CLIPPER.LIB
Рекомендовано смотреть: COPY STRUCTURE EXTENDED, CREATE
DECLARE
Сиснтаксис: DECLARE<массив1>[<вырЧ1>][,<массив2>[<вырЧ2>]]...
Создает один или более массивов переменных.
<массив> - имя создаваемого массива. Можно создать несколько
массивов, используя один DECLARE оператор.
<вырЧ> - количество элементов массива (max: до 2048). При
объявлении массива с <вырЧ> меньше 1, этот параметр
приравнивается к 1, а в случае объявления его больше 2048, он
будет равен 2048.
Внимание: квадратные скобки вокруг <вырЧ> являются необходимой
частью сиснтаксиса команды и в этом случае не обозначают
необязательный аргумент.
DECLARE позволяет создать одномерный массив. Сгенерированный
массив занимет одну единицу в списке локальных переменных. В
отличие от переменных массивы и их элементы не могут быть
обработаны при помощи SAVE или объявлены PUBLIC (глобальными).
Для назначения определенной величины элементу массива
используется оператор присвоения (=) или команда STORE. Для
присвоения определенно го значения всем элементам массива
следует использовать AFILL( ).
Для того чтобы обратиться к какому-нибудь элементу массива
необходимо использовать индексное выражение, указывающее на
позицию элемента в массиве.
Для определения количества элементов в массиве удобно
- 66 -
использовать LEN( ) с указанием имени массива в качестве
аргумента функции. Элементы внутри массива могут быть различных
типов и в этом смысле правила их использования совпадают с
правилами для обычных переменных. TYPE( ) возвращает "А"
(массив) всякий раз, когда аргументом является массив. Чтобы
определить тип определенного элемента массива, необходимо
присвоить значение этого элемента обычной изменяемой и лишь
затем использовать TYPE( ).
Массивы не имеют ограничений по использованию в
макро-переменных. Существует только одно ограничение: скобки не
могут быть использованы в макро-переменных при употреблении
DECLARE (см.пример). Массив и элементы маасива могут быть
использованы как пересылаемые параметры в Clipper-процедурах,
пользовательских функция (FUNC)х и внешних процедурах, использующих
Расширенную систему (Extend System) (см. гл.11, Система
расширения). Массивы пересылаются в качестве ссылок (by
reference), элементы массивов пересылаются как значения (by
value). Нельзя, однако, пересылать весь массив во внешнюю
процедуру, используя команду CALL. В этом случае можно переслать
элементы массива по одному и как значения (by value).
Примеры:
Следующий пример иллюстрирует процесс создания массива,
присвоения его элементам определенных значений и индикации
последних:
DECLARE array[s]
array[1]="HELLO"
array[2]=1234
?array[1] &&Результат: HELLO
?array[2] &&Результат: 1234
Следующий пример демонстрирует способность применения массивов
совместно с макро-переменными:
name = "array"
number = 5
name_len = "array[1]"
*
* это правильное использование
DECLARE &name[number] &&Создание массива из 5 элементов
&name_len = 100 &&Элементу 1 присваивается значение 100
&name[3]="abs" &&Элементу 3 присваивается значение "abs"
*
* Это неправильное использование
DECLARE &name_len &&Cкобки не м.б.внутри макро-изменяемой
library: CLIPPER.LIB
См. также: ADEL( ), ADIR( ), AFILL( ),ASCAN( ), ASORT( )
DELETE
- 67 -
Написание: DELETE[<обл.опр.>][FOR<условие>][WHILE<условие>]
Помечает строки в текущем файле данных, предназначенные для
удаления.
<обл.опр.> - обозначает часть файла данных для удаления. Если
эта часть не указана, то DELETE действует только по отношению к
текущей строки.
Если <условие> указано, то по умолчания область определения -
все строки файла . DELETE помечает строки таким образом, что они
могут быть потом отфильтрованы при помощи SET DELETED ON,
запрошены DELETED( ) или физически удалены из файла при помощи
PACK. К тому же такие команды индикации как LIST и DISPLAY
отмечают предназначенные к удалению строки символом "*". Уже
помеченные строки можно восстановить в правах с помощью RECALL.
Если необходимо удалить все строки из файла данных, следует
использовать ZAP вместо DELETE ALL и PACK.
При использовании в сетях команда DELETE требует, чтобы текущая
запись была "заперта" при помощи RLOCK( ) в случае, если
удаляется единичная запись. Если необходимо удалить несколько
записей, текущий файл данных должен быть "заперт" при помощи
FLOCK( ) или открыт (USE) в монопольном режиме - EXCLUSIVE
library: CLIPPER.LIB
См. также: PACK,RECALL,SET DELETE, ZAP, DELETED( ), EMPTY( )
DIR
Написание: DIR[<дисковод>:][<путь>\][<шаблон>]
Показывает список файлов из указанного каталога на диске.
<шаблон> - стандартный указатель совпадений (* или ?). Если он
используется , то будут выданы все совпадающие файлы, если не
используется - выдаются только файлы данных.
DIR осуществляет вывод в двух различных форматах, в зависимости
от того был ли использован <шаблон>. Если нет, то выводится
стандартный список файлов указанного директория, включающий в
себя имя файла, дату последнего применения и количество записей.
Если же <шаблон> используется, список включает в себя имя файла,
расширение, количество байт и дату внесения последнего
изменения. В ситуациях, когда необходимо выдать пользователю
информацию об имеющихся файлах, удобно воспользоваться ADIR()
вместо DIR. ADIR() позволяет поместить атрибут файлов в массивы,
что удобнее для дальнейшего их использования.
library: CLIPPER.LIB
См. также : ADIR( )
DISPLAY
Написание: DISPLAY [OFF][<обл.опр.>] <список выражений>
[FOR<условие>] [WHILE <условие>]
- 68 -
[TO PRINT][TO FILE<файл>/(вырС)]
Показывает одно или несколько выражений для каждой обработанной
строки.
<explist> - список величин индицируемых для каждой строки.
Опции :
<обл.опр.>: обозначает часть текущего файла данных. По умолчанию
- текущая запись. Если используется <условие>, то <обл.опр.>
принимает значения ALL - все.
<условие>: FOR устанавливает условие для индикации определенных
записей внутри выбранного <обл.опр.>. WHILE предоставляет
способность производить вывод пока верно <условие> WHILE.
OFF : подавляет вывод количества записей.
PRINT : вызывает дублирование вывода на принтер.
FILE: TO FILE вызывает пересылку информации в файл <файл>.
Расширение по умолчанию .txt.
DISPLAY вызывает индикацию <списка выражений> в табулированном
формате, где каждая колонка отделена от другой пробелом.
Заголовок не печатается, пауз во время выводов не предусмотрено.
DISPLAY аналогичен LIST за исключением того, что в LIST по
умолчанию <обл.опр.> принимает значение NEXT 1, а не ALL.
Примеры:
USE Sales
DISPLAY DATE( ), TIME( ), Brauch
DISPLAY Brauch,Salesman FOR Amount>500 TO PRINT
*Для просмотра удобно включить INKEY( ) в условие FOR:
DISPLAY Brouch, Amount FOR INKEY( ) <>27
library: CLIPPER, LIB
Рекомендовано смотреть: LIST
DO
Написание: DO <процедура> [WITH<список параметров>]
Цель: выполнение процедуры.
<процедура> - имя процедуры. Это может быть процедура на
Clipperе, Си или Ассемблере.
Необязательное условие WITH <список параметров> позволяет
переслать в процедуру список (до 128) параметров. Параметрами
могут быть переменные или выражения. Переменные могут быть здесь
использованы в качестве ссылок или значений.
Для пересылки параметров необходимо в вызываемой процедуре иметь
оператор PARAMETERS со списком переменных, принимающих
пересылаемые ссылки или значения. Если пересылаемый параметр
(выражение, поле или переменная) заключены в скобки, то в
вызываемую процедуру передается только его значение. В случае
же, если параметр (переменная) не заключен в скобки, он
- 69 -
перемылается в качестве ссылки и любое изменение
соответствующего ему параметра в процедуре отразится на его
значении в вызывающей программе.
Следует отметить, что поля могут быть пересланы только как
значения. (См. PARAMETRS для более детального ознакомления).
library: CLIPPER.LIB
См. также: PARAMETRS, PRIVATE, PROCEDURE, PUBLIC, RETURN, SET
PROCEDURE.
DO CASE
Написание: DO CASE
CASE<условие>
<команды>...
[CASE<условие>]
<команды>...
[OTHERWISE]
<команды>...
ENDCASE
Осуществляет ветвления по условиям. В случае, если ни одно из
указанных условий не выполняется, управление передается
командам, следующим за ENDCASE. При тех же условиях, но в
присутствии OTHERWISE выполняются команды, следующие за
OTHERWISE до ENDCASE.
Любое количество команд, включая также структуры как DOWHILE,
DOCASE, IF, FOR, могут быть вложены внутрь одного DOCASE.
Количество CASE указателей внутри DOCASE неограничено.
library: CLIPPER.LIB
См. также: DO, DO WHILE, IF, IF( )/IIF( )
DO WHILE
Сиснтаксис: DO WHILE<условие>
<команды>...
[EXIT]
<команды>...
[LOOP]
<команды>...
ENDDO
Выполняет цикл DO WHILE - ENDDO пока верно условие
(<условие>=.T.)
Опции :
EXIT: выполнение этого указателя вызывает безусловный переход на
первый после ENDDO оператор.
- 70 -
LOOP : передает управление на последнюю выполненную строку DO
WHILE
DO WHILE структура повторяет выполнение заданных команд пока
выполняется условие на входе. Когда условие верно (.Т.)
управление передается на первый оператор последовательности,
которая исполняется до появления команд: EXIT, LOOP, ENDDO.
ENDDO возвращает управление на DO WHILE и процесс повторяется.
LOOP в основном используется когда необходимо предотвратить
выполнение определенной части операторов внутри цикла. Для примера:
DO WHILE <условие>
<начальное исполнение>...
IF<промежуточное условие>
LOOP
ENDIF
<продолжение выполнения>...
ENDDO
Следующие два примера иллюстрируют возможности DO WHILE при
просмотре файлов данных :
DO WHILE .NOT. EOF()
<операторы>...
SKIP
ENDDO
LOCATE FOR <условие>
DO WHILE FOUND( )
<операторы>...
CONTINUE
ENDDO
Макроопределения применяются без ограничений в любой части DO
WHILE.
library: CLIPPER.LIB
Рекомендовано смотреть: FOR, IF, LIST, RETURN
EJECT
Написание: EJECT
EJECT устанавливает печатающую головку в начало новой страницы
путем подачи на принтер управляющего символа ASCII 12. Кроме
того, EJECT устанавливает в нуль значения строки и столбца
внутреннего счетчика.
Если необходимо "сбросить на нуль" внутренний счетчик принтера,
не посылая ASKII 12, можно воспользоваться SETPRC()
library: CLIPPER.LIB
См. также: SETPRC( )
- 71 -
ERASE/DELETE FILE
Написание: ERASE/DELETE FILE<файл>.<расш.>
Удаляет указанный файл с диска.
<файл>.<расш.> - имя файла (с расширением), предназначенного для
удаления.
Внимание: файл перед удалением должен быть закрыт.
library: CLIPPER.LIB
См. также: CLOSE, USE, FILE( )
EXTERNAL
Написание: EXTERNAL<список процедур>
Объявляет имена для программы - компоновщика.
<procedure list> - список подпрограмм, пользовательских функций
и форматных файлов.
Перечисленные структуры должны быть объявлены как EXTERNAL
(внешние) в случае, если они вызываются с применением
макрообъявлений или, если они располагаются в оверлейных
структурах.
Пример:
EXTERNAL P1, P2, P3
routine="1"
DO P&routine
library: CLIPPER.LIB
FIND
Написание: FIND<символьная строка>/(<вырС>)
Просматривает индексный файл с целью обнаружения первого
совпадения указанной строки символов с содержимым ключевого
элемента в индекс-файле. Устанавливает указатель строки в
соответствующее значение на найденную запись.
<символьная строка> - вся или часть значения искомого ключевого
элемента. В случае использования (<вырС>) вместо литеральной
символьной строки, FIND работает аналогично SEEK.
FIND просматривает индекс-файл, начиная с первого ключа и
продолжает до совпадения или до превышения значения текущего
- 72 -
ключа над заданным для поиска. В случае совпадения указатель
строки устанавливается в соответствующее значение.
Если SET SOFTSEEK установлен в OFF и FIND не нашел строки, то
указатель устанавливается в значение LASTREC() + 1, EOF( )
возвращает .Т., а FOUND( ) возвращает .F.
В случае SOFTSEEK установленного ON, указатель строки
устанавливается в значение, соответствующее строки для первого
ключа, превышающего искомое значение. FOUND( ) в этом случае
возвращает .F., а EOF( ) - .T.
Начальные пробелы в символьном аргументе участвуют в определении
совпадений наряду со всеми другими символами. Поисковый аргумент
может быть и макроизменяемой.
Clipper хранит числовые ключи индекс-файлов с использованием
предшествующих нулей. Это значит, что если искать числовой ключ
с помощью символьного аргумента, то необходимо дополнить
аргумент нулями слева.
Пример:
USE Sabs INDEX Brouch
?LASTREC( ) &&Результат: 84
?INDEXKEY( ) &&Результат: BRANCH
FIND 200
?FOUND( ), EOF( ), RECNO( ) &&Результат: .T. .F. 5
FIND 500
?FOUND(), EOF(), RECNO() && Результат: .F. .T. 85
string = "200"
FIND &string
?FOUND(), EOF(), RECNO() && Результат: .T. .F. 5
FIND "100"
?FOUND, EOF(), RECNO() && Результат: .T. .F. 1
library : CLIPPER.LIB
Смотри также : INDEX, LOCATE, SEEK, SET INDEX, SET ORDER, SET
SOFTSEEK, EOF(), FOUND()
FOR...NEXT
Написание: FOR <переменная> = <вырЧ1> TO <вырЧ2> [STEP<вырЧ3>]
<commands>...
[EXIT]
<commands>...
NEXT
Организует циклы.
<переменная> - управляющая переменная цикла
<вырЧ1>, <вырЧ2> - начальное и конечное значения изменяемой
цикла.
Необязательный параметр - STEP устанавливает шаг изменения
значения управляющей изменяемой: <вырЧ3>. По умолчанию шаг равен
единице.
- 73 -
EXIT передает управление следующему за NEXT оператору.
library: CLIPPER.LIB
См. также: DO CASE, DO WHILE, IF
FUNCTION
Написание: FUNCTION <процедура>...RETURN<выр.>
Объявляет функцию, определенную пользователем.
<процедура> - имя функции (до 10 символов)
<выр.> - значение, возвращаемое функцией
Пользовательская функция (FUNC) - это структура, аналогичная
подпрограмме (PROCEDURE), но с двумя исключениями. Во-первых,
описание функции должно начинаться с оператора FUNCTION и,
во-вторых, оператор RETURN обязан содержать возвращаемое
функцией значение.
Пользовательская функция (FUNC) вызывается также, как и
предопределенные в Clipperе функции.
FUNCTION (<список параметров>)
Параметры пересылаются как значения (by value), за исключением
двух случаев. Во-первых, если пересылаемый параметр является
элементом массива, то весь массив пересылается как ссылка (by
reference). Во-вторых, если параметр в списке предшествует знак
@, то он (параметр) пересылается как ссылка.
Примеры:
@12, Center("Hi there") SAY "Hi there"
RETURN
*
FUNCTION Center
PARAMETRS string
RETURN INT((80-LEN(string))/2)
value=10
?Changvar<value)
?value &&Результат: 10
?Changvar(@value)
?Value &&Результат: 20
RETURN
*
FUNCTION Changvar
PARAMETER var
var=var*2
RETURN(var)
- 74 -
library: CLIPPER.LIB
Рекомендовано смотреть: PROCEDURE, PARAMETERS, RETURN
GO/GOTO
Написание: GO/GOTO <вырЧ1> / BOTTOM/ TOP
Устанавливает указатель на определенную запись в текущей рабочей
области.
<вырЧ> - номер строки. GOTO установит указатель на эту запись,
даже если DELETED-ON или, если это потребует выхода за пределы
области, определенной текущим фильтром.
Опции
BOTTOM устанавливает указатель в последнюю логическую запись,
если существует активный индекс-файл и в LASTREC(), если
индекс-файл не активен. В случае DELETED-ON или в присутствии
активного фильтра последняя запись отыскивается в определенной
фильтром области.
TOP устанавливает указатель в первую логическую запись, если
существует активный индекс-файл или запись номер 1 в случае
отсутствия последнего. Если DELETED-ON или существует активный
фильтр, то устанавливается первая запись в определенной области.
library: CLIPPER.LIB
См. также: SKIP, LASTREC( ), RECNO( )
IF
Написание: IF<условие>
<commands>...
[ELSE]
<commands>
ENDIF
Условное выполнение блока команд.
<условие> - выражение, управляющее ветвлением. Если в процессе
работы оно принимает значение .Т., то выполняются все следующие
команды до появления ELSE или ENDIF.
В случае <условие>=.F. управление передается первой команде за
оператором ELSE, если он существует. В противном случае
выполняется первая команда за ENDIF.
ELSE предваряет команды, предназначенные к выполнению в случае
<условие>=.F.
Структуры : IF...ENDIF могут быть вложены друг в друга и в
другие подобные структуры.
- 75 -
library: CLIPPER.LIB
Рекомендовано смотреть: DO CASE, IF( )/IIF( )
INDEX
Написание: INDEX ON <ключевое выражение>TO<файл>/(<вырС>)
Создает файл, содержащий индекс к записям активного файла
данных.
<ключевое выражение> - выражение, которое возвращает для каждой
строки в текущем файле данных ключевое значение для последующего
использования его в качестве индекса определенной строки.
Максимальная длина ключевого выражения до 250 символов.
<файл> - имя создаваемого индекс-файла. По умолчанию расширение
файла должно быть (.ntx).
Для пользования dBASE - совместимыми файлами индексов (с
расширением (.ndx)) необходимо при линковке программы включить в
список NDX.OBJ.
При использовании индекс-файла строки файла данных располагаются
в порядке возрастания (или убывания) ключевого выражения, хотя
физическое расположение записей не изменяется. Такая способность
позволяет быстро создавать различные порядки записей. Записи,
предназначенные к удалению и фильтрованные индексируются наравне
с остальными.
Для ключей, содержащих дату в качестве части ключевого
выражения, необходимо использовать DTOS( ) для перевода
"дата-символ". Для примера:
USE Invoices
INDEX ON Customer + DTOS(Inv_date) TO Invoice
Для того чтобы создать убывающий порядок следования в
индекс-файле, можно воспользоваться DESCEND(). Эта функция (FUNC) в
состоянии инвертировать любой тип данных.
Для примера, следующий фрагмент создает упорядоченный список с
убывающей хронологией даты заведения счета:
USE Invoices
INDEX ON DESCEND(Inv_date) TO Inv_stack
При последующем использовании SEEK также необходимо употребление
DESCEND().
Clipper поддерживает DBASE III PLUS-индекс-файлы, если при
линковке использовать NDX.OBJ.
В случае, если в файле данных присутствуют строки с одинаковыми
значениями ключевого выражения, порядок их обработки
регулируется оператором SET UNIQUE ON/OFF. В случае UNIQUE ON в
индексированные списки не включаются строки с одинаковыми
значениями ключа. Необходимо заметить, что UNIQUE не является
- 76 -
аттрибутом индесного файла. Из этого следует, что в случае
UNIQUE OFF совпадающие ключи могут быть добавлены в индексный
файл, даже если он создан при UNIQUE ON.
Использование функции TRIM() для части ключевого выражения,
содержащего поле, всегда возвращает нулевую строку. Это может
привести к несовпадению по размеру сравниваемых ключей. Однако
функцией можно пользоваться, если впоследствие заполнить
удаленные части поля необходимым количеством пробелов.
library: CLIPPER.LIB
Рекомендовано смотреть: CLOSE, FIND, REINDEX, SEEK, SET INDEX, SET ORDER,
SET UNIQUE, USE, DTOS(), INDEXEXT(), INDEXKEY(), INDEXORD()
INPUT
Написание: INPUT [<приглашение>] TO <переменная>
Вводит выражения с клавиатуры и размещает его в определенной
изменяемой.
<переменная> - имя изменяемой для хранения выражения.
<приглашение> - сообщение, сопровождающее ввод.
Реализует ввод с клавиатуры выражений любого типа даных. Ввод
выражения заканчивается нажатием клавиши Return. Если введено
только Return, то переменная не будет создана.
library: CLIPPER.LIB
Рекомендовано смотреть: ACCEPT, WAIT
KEYBOARD
Написание : KEYBOARD <вырС>
Заполняет строкой символов буфер клавиатуры.
<вырС> - строка символов.
KEYBOARD используется вместе с командами и функция (FUNC)ми,
опрашивающими буфер клавиатуры. Это могут быть команды
"ожидания", такие как ACCEPT, INPUT, READ или "внешние" функции
ACHOICE() и DBEDIT().
Типичный пример применения KEYBOARD - использование внутри SET
KEY процедуры для переназначения клавиш в режиме ожидания.
Необходимо заметить, что каждое выполнение KEYBOARD очищает
буфер клавиатуры.
Пример:
В этом примере буфер клавиатуры заполняется последовательностью
- 77 -
символов, позволяющих вернуться с глубины трех уровней в
основное меню, нажав одну клавишу. Здесь "Q" и "Возврат каретки"
вызывают "подъем" на один уровень:
KEYBOARD "Q" + CHR(13) + "Q" + CHR(13) + "Q" + CHR(13)
library: CLIPPER.LIB
Рекомендовано смотреть: SET KEY, CHR(), LASTKEY(), NEXTKEY().
JOIN
Cинтаксис: JOIN WITH <синоним>/(<вырС1>) TO <файл>/(<вырС2>)
FOR <условие>[FIELDS <список полей>]
Создает новый файл данных путем слияния выбранных записей и
полей из двух рабочих областей.
<синоним> - рабочая область, предназначенная для объединения с
текущей.
<файл> - имя нового файла данных.
FOR <условие> - выбор записей, соответствующих определенным
условиям.
<список полей> - список полей обеих рабочих областей для
формирования нового файла. Если FIELDS не будет использовано то
все поля текущей рабочей области будут присутствовать в новом
файле данных.
JOIN работает следующим образом: для каждой строки в текущей
рабочей области осуществляется просмотр всех записей
вспомогательной области и в каждом случае выполнения условия
(<условие>) cоздается новая запись ( с полями FIELDS ) в новом
файле данных.
Необходимо помнить, что количество записей, выдаваемых JOIN
равно произведению от количества записей, удовлетворяющих
условиям, в двух рабочих областях.
Пример:
Объединение текущего файла Customers с дополнительным Invoices
для создания нового Purchases.
USE Customers
SELECT 2
USE Invoices
SELECT 1
*
JOIN WITH Invoices TO Purchases;
FOR Last=Invoices->Last;
FIELDS First,Last,Invoices->Number,Invoices->Amount
library: CLIPPER.LIB
Рекомендовано смотреть: APPEND FROM, REPLACE, SET RELATION
- 78 -
LABEL FORM
Cинтаксис: LABEL FORM <файл1>/(<вырС1>)[<обл.опр.>][FOR <условие>]
[WHILE<условие>][SAMPLE][TO PRINT][TO FILE <файл2>/
(<вырС2>)]
Индикация меток, определенных в (.lbl) файле.
<файл1> - имя файла (.lbl), содержащего информацию о метках.
<обл.опр.> - определяет часть текущего файла данных для
индикации меток. По умолчанию - ALL.
FOR отбирает соответствующие заданному условию (<условие>)
строки в файле данных внутри заданной области (<обл.опр.>).
WHILE позволяет просматривать строки, начиная с текущей, до
первого невыполнения соответствующего условия.
TO PRINT организует параллельный вывод на печать.
TO FILE вызывает параллельную загрузку информации на диск в виде
файла <файл2> (расширение по умолчанию (.txt))
SAMPLE вызывает индикацию тестовых меток в виде строк звездочек.
Каждая метка имеет то же значение столбца и строки, что и ее
определение. Далее необходимо ответить на вопрос: "Do you want
more samples ?" ( "Требуются еще примеры ?"). Ответ "Y" вызывает
повторение индикации тестовых меток. Ответ "N" позволит
индицировать реальные метки для выбранных <обл.опр.> и
<условие>.
LABEL FORM индицирует метки, используя определения хранимые в
(.lbl) файле. (.lbl) можно создать, используя RL.EXE (см. главу
12, Утилиты Clipperа).
Содержимое поля LABEL должно быть допустимым выражением.
Необходимо отметить, что Clipper не поддерживает список
выражений в содержимом LABEL FORM. Все следующее за запятой в
LABEL FORM игнорируется.
library: CLIPPER.LIB
Рекомендовано смотреть: REPORT FORM.
LIST
Написание: LIST [OFF] [<обл.опр.>] <список выражений> [FOR <условие>]
[WHILE <условие>] [TO PRINT] [TO FILE <файл>/(<вырС>)]
Вывод одного или более выражений для каждой обрабатываемой
строки.
<список выражений> - список выводимых значенийй для каждой
строки.
- 79 -
<обл.опр.> - часть текущего файла данных, обрабатываемая LIST.
По умолчанию ALL (все строки).
FOR - отбирает соответствующие заданному условию строки в файле
данных внутри заданной области (<обл.опр.>).
WHILE - позволяет просматривать строки начиная с текущей до
первого невыполнения условия.
OFF - подавляет индикацию номеров записей.
TO PRINT - вызывает параллельный вывод на печать.
TO FILE - вызывает параллельную загрузку информации на диск,
используя для этого файл <файл>(.txt).
LIST индицирует список значений в табулированном формате с
колонками, разделенными пробелом. LIST аналогичен DISPLAY, за
исключением значения принимаего <обл.опр.> по умолчанию: LIST -
ALL, DISPLAY - NEXT 1.
Пример:
USE Sales
LIST DATE(),TIME(),Branch
LIST Branch,Salesman FOR Amount > 500 TO PRINT
Для прерывания выполнения LIST можно пользоваться INKEY() в
качестве части условия, как в следующем примере, который
позволяет прервать выдачу, нажав Esc:
USE Sales
LIST Branch,Amount FOR INKEY()<>27
library: CLIPPER.LIB
Рекомендовано смотреть: DISPLAY.
LOCATE
Написание: LOCATE [<обл.опр.>] FOR <условие> [WHILE <условие>]
Поиск в текущей рабочей области первой строки, соответствующей
заданным условиям.
<обл.опр.> - часть текущего файла данных, в котором работает
LOCATE. По умолчанию ALL.
FOR - отбирает соответствующие заданному условию строки в файле
данных внутри заданной области (<обл.опр.>).
WHILE - позволяет просматривать строки начиная с текущей до
первого невыполнения условия.
LOCATE производит поиск начиная с строки, определяемой
<обл.опр.>. Поиск заканчивается в случае обнаружения совпадения
по условиям или по достижении последней строки из <обл.опр.>.
Если поиск закончился успешно, то найденная запись становится
текущей и FOUND() возвращает .Т.. Если же поиск окончился
безрезультатно, то FOUND() возвращает .F., а позиция указателя
записей будет зависить от значения <обл.опр.>.
- 80 -
Каждая рабочая область может иметь свою собственную область
действия LOCATE (<обл.опр.>), остающуюся активной до объявления
другого LOCATE в текущей рабочей области.
LOCATE может работать в комбинации с CONTINUE. Эта команда
позволяет возобновить поиск с текущей строки.
Пример:
USE Sales
? LASTREC() && Результат: 84
LOCATE FOR Branch = "200"
? FOUND(), EOF(), RECNO() && Резульатат: .T. .F. 5
library: CLIPPER.LIB
Рекомендовано смотреть: CONTINUE, FIND, FOUND(), STRTRAN().