-------------------------------------------------------------------
?|?? Вывод одного или нескольких значений на консоль
-------------------------------------------------------------------

?/?? <список выр>


Аргументы

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

Применение

Имеется две формы этой команды. Команда? сама посылает на экран
CR/LF перед выводом результатов списка выражений. Команда ??,
наоборот, посылает вывод без вывода CR/LF, что позволяет
последовательности команд ?? производить вывод на туже строку.

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

Для форматирования выражений вы можете использовать функцию
TRANSFORM() или пользовательскую функцию. Если вам необходимо вырав-
нивание, используйте функцию PAD() для выравнивания слева, справа
или центрирования.

Пример использования

Этот пример выводит на экран файл базы данных используя комманды ? и
?? в комбинации с функцией PAD():

LOCAL nPage := 0, nLine := 99
USE Salesman INDEX Salesman NEW
SET PRINTER ON
SET CONSOLE OFF
DO WHILE !EOF()
IF nLine > 55
IF nPage != 0
EJECT
ENDIF
? PADR("Page", LTRIM(STR(nPage++)), 72)
?? DTOC(DATE())
?
?
? PADC("Sales Listing", 79)
?
nLine := 5
ENDIF
? Name, Address, PADR(RTRIM(City) + "," + State, 20), ZipCode
nLine++
SKIP
ENDDO


9


SET CONSOLE ON
SET PRINTER OFF
CLOSE Salesman

Library: CLIPPER.LIB.

-------------------------------------------------------------------
@...BOX Рисование на экране прямоугольной рамки
-------------------------------------------------------------------

@ <вырN1>,<вырN2>,<вырN3>,<вырN4> BOX <вырС>

Аргументы

<вырN1> - верхняя строка. Значение может изменятся от 0 до 24.

<вырN2> - самая левая колонка. Значение может изменятся от 0 до 79.

<вырN3> - нижняя строка. Значение может изменятся от 0 до 24.

<вырN4> - самая правая колонка. Значение может изменятся от 0 до 79.

<вырС> - строка из восьми граничных символов и одного символа
для заполнения внутренности рамки. @...BOX рисует рамку, используя
эту строку начиная с верхнего левого угла рамки и далее по часовой
стрелке.

Применение

@...BOX рисует рамку на экране используя знаки граничных символа и
символа заполнения, используя <вырС>, указанное в комманде. Если
не указан девятый символ заполнения рамки, то рамка не
закрашивается.

Пример использования

Следующие примеры рисуют 2 рамки, используя объявленные константы в
файле заголовков Box.ch. :

#include "Box.ch"

// Рисует рамку с двойной линией наверху и одинарной сбоку
@ 1, 1, 22, 79 BOX B_DOUBLE_SINGLE

// Рисует рамку заполняя её пробелами
@ 1, 1, 22, 79 BOX B_DOUBLE_SINGLE + SPACE(1)

Library: CLIPPER.LIB.

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

10


@ <вырN1>,<вырN2> CLEAR [TO <вырN3>,<вырN4>]

Аргументы

<вырN1...вырN2> определяют координаты верхнего левого угла.
Первое выражение задает координату строки а второе координаты
столбца.

TO: Предложение с TO определяет координаты нижнего правого угла
(<вырN3>) и (<вырN4>) области, которую надо очистить. Если это
предложение отсутствует, то по умолчанию координатами этого угла
будут по строке 24, а по столбцу 79.

Применение

@...CLEAR стирает прямоугольную область экрана заполняя указанную
область пробелами, используя текущую установку цвета.

Пример использования

SETCOLOR("BG+/B")
@ 10, 10 CLEAR TO 20, 40
@ 10, 10 TO 20,40

Library: CLIPPER.LIB.

-------------------------------------------------------------------
@...GET Создает новый Get объект и выводит его на экран
-------------------------------------------------------------------

@ <вырN1>, <вырN2>
[SAY <выр>
[PICTURE <вырС1>]]
GET <вырС2>
[PICTURE <вырС3>]
[WHEN <вырL>]
[RANGE <вырN1>, <вырN2>] | [VALID <вырL>]

Аргументы

<вырN1> и <вырN2> указывают координаты ряда и колонки. Если
предложение SAY определено, то <вырN1> и <вырN2> указываются для
SAY, и GET выводится справа после вывода SAY. Если SAY не определен,
то <вырN1> и <вырN2> определяют координаты для GET.

SAY^ <выр> выводит значение выражения по указанным координатам.
Если предложение PICTURE <вырС1> определено, то <выр> форматируется
в соответствии с правилами заданными в <вырС1>.

GET <вырС2> указывает имя переменной, связанной с GET. <вырС2>
может быть любого класса.

PICTURE <вырС3> указывает формат вывода и правила


11

редактирования для GET.

WHEN <вырL> определяет выражение, которое должно быть
удовлетворено перед тем как курсор будет допущен в GET во время
выполнения READ.

VALID <вырL> определяет выражение, которое должно быть
удовлетворено перед тем как курсор покинет GET во время выполнения
READ.

RANGE u<вырN1>, <вырN2> определяют предел возможных
значений для ввода в GET. Если новое вводимое значение не
удовлетворяет значению, указанному в пределе, то во время выполнения
комманды READ, курсор не покинет этот GET.

Применение
@...GET комманда создает новый Get объект, выводит его значение и
добавляет его к массиву с GetList. Если массив не определен в ранее
используемых процедурах он создается как PUBLIC. Комманда READ
активизирует Get, содержащийся в массиве GetList и позволяет
пользователю редактировать его.

Каждый Get объект имеет связанную переменную, указанную в <вырС2>.
Переменная может быть любого класса, включая переменные поля,
локальные, глобальные и статические.

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

Автоматическая проверка: Когда выполняется комманда READ
осуществляется автоматическая проверка для чисел, дат и логических
значений, вводимых пользователем путем анализа каждой нажатой
клавиши.

Пред-условие: Предложение WHEN определяет условие, которое
должно быть удовлетворено перед тем как курсор будет допущен в Get
для ввода. Во время выполнения комманды READ, <вырL> вычисляется
всякий раз, когда пользователь пытается передвинуть курсор в Get.
Если условие принимает значение истинно (.T.), ввод допускается,
иначе - Get пропускается.

Пост-условие: Пост-условие может быть использовано в
предложениях VALID или RANGE. VALID определяет условие, которое
должно быть удовлетворено перед тем как курсор покинет Get. <вырL>
вычисляется когда пользователь пытается передвинуть курсор из Get
при выполнении команды READ. Если условие принимает значение истинно


12

(.T.), то курсор покидает Get, иначе - курсор остается в текущем
Get. RANGE определяет предел возможных значений для чисел или дат,
вводимых в Get. Если вводимое значение не входит в указанный предел,
то курсор не может покинуть Get.

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

Функции: Функция PICTURE - это символ перед которым стоит знак
"@". Если символ шаблона следует за функцией, то перед ним должен
быть по крайней мере один пробел. Заметим что в пределах одного
PICTURE может быть применено несколько функций. Следующая таблица
суммирует все доступные функции:
Символы функций в PICTURE
???????????????????????????????????????????????????????
Фун. Тип Действие
???????????????????????????????????????????????????????
A C В GET'е разрешаются только буквы
B N Отображение чисел с левым выравниваем
C N Отображение CR после положительных чисел
D D,N Отображение дат в формате заданном SET DATE
E D,N Отображение дат в формате BRITISH, а чисел
с левым в европейском формате
(резервируются запятая и точка)
K Все Очистка GET, если первая функциональная
клавиша не клавиша управления курсором
R C Вставка символов отличных от символов шаблона
S<n> C Допускает горизонтальный скролинг внутри GET
X N Отображение DB после отрицательных чисел
Z N Отображение нулей в виде пробелов
( N Заключает отрицательные числа в скобки с
пробелами впереди
) N Заключает отрицательные числа в скобки
без пробелов впереди
! C Преобразует прописные буквы в строчные
???????????????????????????????????????????????????????

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

Символы шаблона в PICTURE
???????????????????????????????????????????????????????
Шаблон Действие
???????????????????????????????????????????????????????
A Отображение только букв
N Отображение только букв и чисел
X Отображение любых символов


13


9 Отображение цифр для любого типа данных,
включая знак для чисел
# Отображение цифр, знаков и пробелов для
любого типа данных
L Отображение логических значений как .T. или .F.
Y Допускает только "Y" или "N"
! Преобразует прописные буквы в строчные
$ Отображение знака доллара в числе вместо
пробелов впереди
* Отображение звездочки в числе вместо
пробелов впереди
. Задание позиции десятичной точки
, Задание позиции запятой
???????????????????????????????????????????????????????

SCOREBOARD: Если введенное значение содержит ошибку на экране
появляется сообщение, выводимое в нулевой строке экрана. Сообщения
могут быть разрешены или отменены с помощью комманды SET SCOREBOARD.

Выход с помощью Esc: Если пользователь выходит из Get, путем
нажатия клавиши Esc, Get переменная восстанавливает свое значение,
которое было перед вводом и комманда READ заканчивается. Постусловие
не выполняется. Эти действия могут быть определены путем
использования комманды SET ESCAPE.

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

Существование Get объектов: Get объекты, как и массивы,
существуют пока существуют ссылки на них в текущей программе. Массив
GetList обслуживает ссылку на Get объект; Get освобождается, когда
освобождается или переназначается GetList. Комманды CLEAR и CLEAR
GETS назначают пустой массив, то же делает комманда READ с
предложением SAVE.

Назначение: Каждый Get связывается с переменной, указанной в
<вырС2> комманды @...GET. Во время редактирования <вырС2> может быть
назначена текущему значению буфера Get объекта. Это происходит в
следующих случаях:

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

После нажатия пользователем SET KEY

Буфер текущего Get объекта обновляется из <вырС2> и выводится в
следующих случаях:

После окончания процедуры SET KEY

После вычисления выражения за WHEN


14


После вычисления выражения за VALID

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

Пример использования

Пример использования предложения VALID для проверки ввода в GET:

LOCAL nNumber := 0
@ 10, 10 SAY "Введите число:" GET nNumber VALID nNumber > 0

В этом примере ввод "Y" в поле Insured показывает клиента, имеющего
страховку, и пользователь допускается для ввода информации. Если
клиент не имеет страховки, курсор передвигается на поле Accident:
@ 10, 10 GET Insured PICTURE "Y"
@ 11, 10 GET InsNumber WHEN Insured
@ 12, 10 GET InsCompany WHEN Insured
@ 13, 10 GET Accident PICTURE "Y"
READ

Пример использования GET во второй рабочей области:

USE Invoice NEW
APPEND BLANK
USE Inventory NEW
@ 1, 1 GET Invoice->CustNo
READ

Пример использования функции @K, которая предлагает вводимое имя
файла по умолчанию, но удаляет его, если первая нажатая клавиша не
RETURN или не клавиша управления курсором:

LOCAL cFile := "Accounts"
@ 1, 1 SAY "Введите имя файла" GET cFile PICTURE "@K"
READ


Library: CLIPPER.LIB.

-------------------------------------------------------------------
@...PROMPT Отображение альтернатив меню на экране
-------------------------------------------------------------------

@ <вырN1>,<вырN2> PROMPT <вырC> [MESSAGE <вырС>]

Аргументы

<вырN1> определяют координаты строки, где отображается данная
альтернатива меню.

15

<вырN2> определяют координаты столбца, где отображается данная
альтернатива меню.

<вырC> строка-альтернатива меню.


MESSAGE: Предложение с MESSAGE определяет сообщение, которое
будет каждый раз выводится при установке светового маркера активной
позиции меню. Сообщение выводится в строке, определяемой командой
SET MESSAGE.

Применение

@...PROMPT - это отображающая часть системы меню со световым
маркером Clipper. Каждый оператор @...PROMPT выводит на экран
соответствующую альтернативу меню и определяет связанное с ней
сообщение выводимое на строке, задаваемой SET MESSAGE TO. Меню со
световым маркером затем может быть вызвано Командой MENU TO.
Альтернативы могут быть выведены на экран в любом порядке и
расположение строк и столбцов. MENU TO проходит по ним в том порядке
в котором они были определены.

Пример использования

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

LOCAL nChoice := 1
SET WRAP ON
SET MESSAGE TO 2
@ 1, 3 PROMPT "Файл" MESSAGE "Доступ к данным "
@ ROW(), COL() + 2 PROMPT "Ред-ие" MESSAGE "Ред-ие текущей записи"
MENU TO nChoice

Library: CLIPPER.LIB.

-------------------------------------------------------------------
@...SAY Отображение данных в заданных позициях строки и столбца
-------------------------------------------------------------------

@ <вырN1>,<вырN2>[SAY<выр>[PICTURE<вырC>]]

Аргументы

<вырN1> - координаты строки.

<вырN2> - координаты столбца.


SAY: предложение SAY отображает результат вычисления <выр> любого
типа (включая мемо-поле) в заданных координатах активного


16


устройства.

PICTURE <вырС> определяет маску для вывода <выр>. Клиппер предлагает
два механизма управления процессом форматирования: функции и
шаблоны.

Применение

@...SAY полноэкранная комманда, которая выводит результаты <выр> на
экран или принтер по указанным координатам ряда и колонки с
контролем выводимых данных, если указано предложение PICTURE.

При выполнении комманды @...SAY вывод из <выр> посылается на текущее
устройство, определенное в SET DEVICE. Текущим устройством (DEVICE)
может быть SCREEN или PRINTER.

Если текущим устройством является SREEN, то вывод направляется на
экран (принято системой по умолчанию). Если текущим устройством
является PRINTER, то вывод направляется на принтер. Для управления
координатами вывода используйте функции SETPRC(), PROW(), PCOL().

Если текущим устройством является PRINTER, вывод может быть назначен
в файл, используя комманду SET PRINTER TO <файл>.

Комманда @...SAY осуществляет вывод с контролем при использовании
предложения PICTURE с <вырС>. Эти же действия выполняет функция
TRANSFORM(). <вырС> может содержать функцию или шаблон.

Функции: Функция PICTURE - это символ перед которым стоит знак "@".
Если символ шаблона следует за функцией, то перед ним должен быть по
крайней мере один пробел. Заметим что в пределах одного PICTURE
может быть применено несколько функций. Следующая таблица суммирует
все доступные функции:

Функции PICTURE для SAY и TRANSFORM()
???????????????????????????????????????????????????????????????????
Функция Действие
???????????????????????????????????????????????????????????????????
B Отображение чисел с левым выравниваем
C Отображение CR после положительных чисел
D Отображение дат в формате заданном SET DATE
E Отображение дат и чисел в формате BRITISH
R Вставка символов отличных от символов шаблона
X Отображение DB после отрицательных чисел
Z Отображение нулей в виде пробелов
( Заключает отрицательные числа в скобки с
пробелами впереди
) Заключает отрицательные числа в скобки
без пробелов впереди
! Преобразует прописные буквы в строчные
???????????????????????????????????????????????????????????????????

Шаблоны: Символы шаблона, если они есть, следуют в строке


17


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

Символы шаблона для SAY и TRANSFORM()
???????????????????????????????????????????????????????????????????
Шаблон Действие
???????????????????????????????????????????????????????????????????
A,N,X,9 Отображение чисел для любых типов данных
включая знак для чисел
L Отображение логических значений как .T. или .F.
Y Допускает только "Y" или "N"
! Преобразует прописные буквы в строчные
$ Отображение знака доллара в числе вместо
пробелов впереди
* Отображение звездочки в числе вместо
пробелов впереди
. Задание позиции десятичной точки
, Задание позиции запятой
???????????????????????????????????????????????????????????????????

Пример использования

Пример использования предложения PICTURE для контроля
выводимых значений:

nNetIncome = 7125.50
nNetLoss = -125.50
cPhone = "2134567890"
cName = "Катя"
//
@ 1, 1 SAY nNetIncome PICTURE "@E 9,999.99" //Результат: 7,125.50
@ 2, 1 SAY nNetLoss PICTURE "@)" //Результат: (125.50)
@ 3, 1 SAY cPhone PICTURE "@R (999)999-9999" //Результат: (213)456-7890
@ 4, 1 SAY cName PICTURE "@!" //Результат: КАТЯ

Пример с использованием комманды SET DEVICE для управления выводом
на принтер, SETPRC() используется для отмены EJECT:

USE Salesman INDEX Salesman NEW
SET DEVICE TO PRINTER
DO WHILE !EOF() // Печать всех записей
@ 2, 5 SAY RTRIM(FirstName) + " " + LastName
@ 3, 5 SAY Street
@ 4, 5 SAY RTRIM(City) + ", " + State + " " + PostalCode
@ 6, 0 SAY SPACE(1)
SETPRC(0, 0) // Отменить прогон бумаги
SKIP // Следующая запись
ENDDO
SET DEVICE TO SCREEN
CLOSE Salesman

Library: CLIPPER.LIB.


18

-------------------------------------------------------------------
@...TO Рисование на экране одинарной или двойной рамки
-------------------------------------------------------------------

@ <вырN1>,<вырN2> TO <вырN3>,<вырN4> [DOUBLE]

Аргументы

<вырN1...вырN4> определяют координаты рамки. ВырN1 и вырN2
определяют координаты верхнего левого угла, а <вырN3> и (<вырN4>
определяют координаты нижнего правого угла. Если обе координаты
строк (<вырN1> и <вырN3>) равны, то Сlipper проводит горизонтальную
линию. Если обе координаты столбцов (<вырN2> и <вырN4>) - равны
значения, то Сlipper проводит вертикальную линию.

Предложение c DOUBLE рисует рамку с двойной границей. Если это
предложение отсутствует, то будет нарисована рамка с одинарной
границей.

Применение

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

Пример использования
@ 10, 10 CLEAR TO 20, 40
@ 10, 10 TO 20, 40 DOUBLE

-------------------------------------------------------------------
ACCEPT Ввод строки символов с клавиатуры в заданную переменную
-------------------------------------------------------------------

ACCEPT [<вырС1>] TO <вырС2>

Аргументы

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

<вырС2> - это имя переменной памяти, куда будет помещено то, что
вводится с клавиатуры.

Применение

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


19

Пример использования

LOCAL cVar
ACCEPT "Введите значение: " TO cVar
IF cVar == ""
? "Пользователь нажал Return"
ELSE
? "Пользователь ввёл:", cVar
ENDIF

Library: CLIPPER.LIB.

-------------------------------------------------------------------
APPEND BLANK Добавление новой записи в конец текущей базы данных
-------------------------------------------------------------------

APPEND BLANK

Применение

APPEND BLANK добавляет пустую запись и делает ее текущей записью.

Сеть

Когда предложение выполняется в сети и текущий файл базы данных
открыт в режиме разделения, то APPEND BLANK пытается добавить
запись, а затем запрещает доступ к этой записи. Если другой
пользователь запретил доступ к файлу базы данных или при попытке
APPEND BLANK в тоже самое время, функция NETERR() возвращает (.T.).
Заметим что вновь добавленная (APPENDed) запись остается запертой до
тех пор, пока не будет заперта другая запись или выполнено
предложение UNLOCK. Заметим также, что добавление пустой записи
(APPENDing BLANK) не освобождает FLOCK() наложенный текущим
пользователем.

Сетевой пример В этом примере добавляется пустая запись, и
используется функция NETERR() для проверки правильности выполнения
операций:

USE Sales SHARED NEW
.
. <комманды>
.
APPEND BLANK
IF !NETERR()
<обновить пустую запись>...
ELSE
? "Повторить не выполненную операцию "
BREAK
ENDIF


20

Library: CLIPPER.LIB.

-------------------------------------------------------------------
APPEND FROM Добавление записей в файл базы данных из другого файла
-------------------------------------------------------------------

APPEND FROM <файл>
[FIELDS <список полей>]
[<диапазон>] [WHILE <условие>] [FOR <условие>]
[SDF | DELIMITED [WITH BLANK | <ограничитель>]]

Аргументы

FROM <файл> - имя исходного файла. Если опция типа не задана, то по
умолчанию предполагается (.dbf) и задавать расширение не требуется.
Если же эта опция задана, то предполагается расширение (.txt), если
оно не задано явно.
FIELDS: Если задано предложение FIELDS, то данные добавляются в
конец только для описанных полей.

<диапазон> задает ту часть исходного файла базы данных из которого
производится добавление (APPEND FROM). Для Клиппер фраза NEXT <n>
добавляет в конец (APPENDS) первые <n> записей и перекрывает любые
условия FOR И WHILE. RECORD <n> добавляет в конец (APPENDs) целевого
файла базы данных только запись с номером <n> из исходного файла
базы данных. По умолчанию диапазон записей ALL.

FOR <условие>: Предложение FOR задает множество условий на записи
которые добавляются (APPEND FROM) в пределах заданного диапазона.

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

SDF задает что будет использоваться файл в системном формате данных
ASCII. Каждая запись имеет фиксированную длину, оканчивается CR и
LF, а признаком конца файла служит Ctrl-Z (1A - в шестнадцетиричной
системе).

DELEMETED задает текстовый файл ASCII, в котором поля разделяются
запятыми, а символьные поля ограничены двойными кавычками
(ограничитель по умолчанию). Заметим что эти разделители не
требуются и Клиппер правильно добавляет (APPENDs) символьные поля и
не ограниченные разделителями. Поля и записи могут быть переменной
длинны и заканчиваться CR и LF. Признаком конца файла служит Ctrl-Z
(1A - в шестнадцетиричной системе).

DELEMETED WITH BLANK задает текстовый файл ASCII, в котором поля
разделяются одним пробелом, а символьные поля не ограничены
разделителями.

DELEMETED WITH <ограничитель> задает текстовый файл ASCII с


21


разделителями, где символьные поля ограничены заданным разделителем.

???????????????????????????????????????????????????????????????????????
Внимание

Если DELIMITED WITH указано в COPY TO или в APPEND FROM, то оно
должно быть последним в командной строке.
???????????????????????????????????????????????????????????????????????

Применение

Помеченные на удаление записи из исходного файла базы данных
добавляются (APPEND) в конец целевого файла базы данных, но не
помечаются на удаление. Если включено состояние DELETED ON, то не
одна из помеченных на удаление записей не добавляется в целевой
файл.

Только поля с одинаковыми именами и типами добавляются в конец. Но в
отличие от dBASE III PLUS поля исходного и целевого файлов должны
быть одного и того же типа. Если это не так то будет получено
сообщение об ошибке: "Type cjnflict in REPLACE (Q/A/I)?", когда
будет выполняться команда APPEND FROM.

Соответствие длин: Если поле целевого файла длиннее, то Clipper
дополняет исходные данные для заполнения его. Если поле целевого
файла короче, то Клиппер усекает исходные данные.

Пример использования

Следующий пример команды APPEND FROM использует список полей:

USE Sales NEW
APPEND FROM BranchFile FIELDS Branch, Salesman, Amount;
FOR Branch = 100

Этот пример показывает использование диапазона для задания одной
записи:

APPEND RECORD 5 FROM Temp

Library: CLIPPER.LIB.

-------------------------------------------------------------------
AVERAGE Вычисление средних для ряда числовых выражений
-------------------------------------------------------------------

AVERAGE [<список выр>] TO <список перем_пам>
[<диапазон>] [FOR <условие>] [WHILE <условие>]

Аргументы

<список выр> - это список числовых значений, которые усредняются
(AVERAGE) по всем обрабатываемым записям.


22

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

Диапазон: <Диапазон> - это часть текущего файла базы данных, по
которой будет проводится усреднение. По умолчанию участвуют все
записи (ALL).

Условие: Предложение FOR определяет условное множество записей по
которым будет проводится усреднение внутри заданного диапазона.
Предложение WHILE определяет множество записей по которым
удовлетворяющих условию до тех пора пока оно не нарушится.

Пример использования

USE Sales NEW
AVERAGE Amount TO nAvgAmount FOR Branch = "100"

Library: CLIPPER.LIB.

-------------------------------------------------------------------
CALL* Выполнение процедуры написанной на Си или Ассемблере
-------------------------------------------------------------------

CALL <процедура> WITH <список выр.>

Аргументы

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

Применение

Вызываемая программа должна быть определена как FAR процедура
заканчивающаяся ассемблерной командой FAR RET. Все ссылки на данные
содержат четырех байтовые указатели в формате сегмент:смещение и
помещаются на верх стека в порядке передачи (смотри пример ниже).
Все типы данных передаются по ссылке. Ваша программа должна
сохранять первоначальные значения регистров BP, SS, SI, DI, ES и DS.

Замечание: Компилятор Microsoft C версии 5.0 помещает символ
подчеркивания перед именем откомпилированной функции. Поэтому ее
вызов должен иметь форму:

CALL _<имя функции>

Передаваемые параметры: Список параметров в команде CALL может
иметь до 7 параметров. Регистры DX:BX и ES:BX указывают на первый
параметр, как в dBASE III PLUS. Если вы хотите преобразовать
загрузочные модули dBASE III, то добавьте следующие предложения в


23


ваш .ASM файл:

PUBLIC <имя процедуры>
и
push ds
mov ds, dx

Символьная строка, передаваемая по ссылки оканчивается нулем (байт 0
в конце строки). Длинна данных любого типа должна быть сохранена
т.к. область данных содержит много типов данных, расположенных
последовательно в памяти. Если некоторые данные увеличат свою длину,
то они затрут другие.

Числовые значения передаются как восьми байтовое число с плавающей
точкой с 53 битовой мантиссой и 11 битовым порядком по основанию
1023. Передать числовое значение можно функцией WORD(), преобразовав
его из внутреннего формата Clipper'а в целое. Если передаваемое вами
числовое значение больше +/-32 767, то оно не может быть передано и
применять функцию WORD() к нему не нужно.

Даты передаются как существуют пока существуют ссылки на них в текущей программе.lt;в /pырN2 Масbr /сив числа длиной 4 байта, логические значения -
длиной 2 байта.

Заметьте, если вы передаете целое число функцией WORD(), то оно
передается по значению.

Компиляция и компановка: Вызываемые командой CALL процедуры
должны соответствовать следующим правилам:

Процедура должна выть в формате объектного файла INTEL 8086 с
расширением .OBJ.

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

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

Замечание

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

Library: CLIPPER.LIB.

-------------------------------------------------------------------
CANCEL* Заканчивает выполнение программы.
-------------------------------------------------------------------

24


CANCEL * | QUIT

Применение

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

Код возврата: Если программа закончилась с фатальной ошибкой, код
возврата равен 1. Если программа закончилась нормально, код возврата
устанавливается равным 0 или в программе код возврата анализируется
с помощь функции ERROLEVEL().

Library: CLIPPER.LIB.

-------------------------------------------------------------------
CLEAR ALL* Закрытие всех открытых файлов и освобождение переменных
-------------------------------------------------------------------

CLEAR ALL

Применение

Закрывает все открытые файлы базы данных (и все соответствующие
индексные, форматные, и мемо файлы), освобождает все переменные
памяти, и выбирает (SELECT) рабочую область 1. CLEAR ALL -
совместимая команда и поэтому не рекомендована. Ее использование
заменяется командой или функцией, которая выполняет необходимые вам
действия. Для закрытия файлов используйте различные формы команды
CLOSE, для освобождения переменных - команду RELEASE.

Library: CLIPPER.LIB.

-------------------------------------------------------------------
CLEAR GETS Очищает все не оконченные GETS.
-------------------------------------------------------------------

CLEAR GETS

Применение

CLEAR GETS освобождает все Get объекты в текущем массиве GetList и
заканчивает выполнение комманды READ, если была выполнена процедура
SET KEY или пользовательская функция, указанная в предложении VALID.
CLEAR GETS освобождает Get объекты путем обнуления массива GetLIst.
Существует два механизма автоматического освобождения Get объектов:
CLEAR GETS и комманда READ с предложением SAVE.

Library: CLIPPER.LIB.

25


-------------------------------------------------------------------
CLEAR MEMORY Уничтожает переменные памяти
-------------------------------------------------------------------

CLEAR MEMORY

Применение

Предложение CLEAR MEMORY используется, когда нужно освободить как
глобальные, так и локальные переменные памяти. Оно работает в
противоположность RELEASE ALL, которое освобождает только локальные
переменные памяти область действия, которых текущая процедура.

Library: CLIPPER.LIB.

-------------------------------------------------------------------
CLEAR SCREEN Очистка экрана
-------------------------------------------------------------------

CLEAR [SCREEN] | CLS

Аргументы

SCREEN не освобождает Get объекты из текущего массива GetList.

Применение

CLEAR полноэкранная комманда, которая очищает экран, освобождает
GET. Если указано предложение SCREEN Get объекты не освобождаются.

CLS является синонимом для CLEAR SCREEN.

Если при редактировании GET, выполнить комманду CLEAR внутри
процедуры SET KEY или внутри пользовательской функции, указанной в
предложении VALID, то при возврате в комманду READ программа будет
прервана. Для очистки экрана без освобождения GET используйте
комманду CLEAR SCREEN или CLS.

Library: CLIPPER.LIB.

-------------------------------------------------------------------
CLEAR TYPEAHEAD Уничтожает буфер клавиатуры
-------------------------------------------------------------------

CLEAR TYPEAHEAD

Применение

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


26


работе с ACHOICE() и DBEDIT().

Library: CLIPPER.LIB.

-------------------------------------------------------------------
CLOSE Закрывает определенные классы файлов
-------------------------------------------------------------------

CLOSE [<алиас> | ALL | ALTERNATE | DATABASES | FORMAT | INDEX ]

Аргументы

<алиас> указывает рабочую область, где все файлы закрываются.

ALL:Закрываются все альтернативные, индексные и файлы баз данных
во всех рабочих областях. Дополнительно, эта опция освобождает все
активные фильтры, отношения, и форматы.

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

bSET ALTERNATE TO <имя-файла>. SET ALTERNATE TO без аргумента
также закрывает альтернативный файл.

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

FORMAT:Освобождает текущий формат, выполняя то же действие, что
и SET FORMAT TO без аргумента.

INDEX:Закрывает все индексные файлы, открытые в текущей рабочей
области.

Применение

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

QUIT

CANCEL

RETURN с наивысшего уровня процедуры

CLEAR ALL

USE без аргумента

Library: CLIPPER.LIB.


27


-------------------------------------------------------------------
COMMIT Выполнение принудительной записи на диск из всех областей
-------------------------------------------------------------------

COMMIT

Применение

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

Пример использования

USE Sales EXCLUSIVE NEW
MEMVAR->Name = Sales->Name
MEMVAR->Amount = Sales->Amount
//
@ 10, 10 GET MEMVAR->Name
@ 11, 10 GET MEMVAR->Amount
READ
//
IF UPDATED()
APPEND BLANK
REPLACE Sales->Name WITH MEMVAR->Name
REPLACE Sales->Amount WITH MEMVAR->Amount
COMMIT
ENDIF

Library: CLIPPER.LIB.

-------------------------------------------------------------------
CONTINUE Перевод указателя на следующую запись условия LOCATE
-------------------------------------------------------------------

CONTINUE

Применение

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

Если CONTINUE закончился удачей, то удовлетворяющая условию
записстановится текущей записью и функция FOUND() возвращает
значение "истинно" (.T.). В противном функция FOUND() всегда
возвращает значение "ложно" (.F.), а позиционирование указателя
записи зависит от диапазона управляемого ждущим оператором LOCATE.

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


28


тех пор пока не будет задано условие заданное новой командой LOCATE.

Пример использования

Этот пример показывает простейший поиск одной записи:

LOCAL nRunTotal := 0
USE Sales NEW
LOCATE FOR Sales->Salesman = "1002"
DO WHILE FOUND()
? Sales->Salesname, nRunTotal += Sales->Amount
CONTINUE
ENDDO

Этот пример показывает как продолжить поиск, используя предложение
WHILE в комманде LOCATE:

LOCAL nRunTotal := 0
USE Sales INDEX Salesman NEW
SEEK "1002"
LOCATE REST WHILE Sales->Salesman = "1002" FOR Sales->Amount > 5000
DO WHILE FOUND()
? Sales->Salesname, nRunTotal += Sales->Amount
SKIP
LOCATE REST WHILE Sales->Salesman = "1002";
FOR Sales->Amount > 5000
ENDDO

Library: CLIPPER.LIB.

-------------------------------------------------------------------
COPY FILE Копирует файл в новый файл
-------------------------------------------------------------------

COPY FILE <файл1> TO <файл2>

Аргументы

<файл1> - имя исходного файла с расширением, который требуется
копировать.

<файл2> - имя выходного файла с расширением.

Применение

COPY FILE копирует файлы с устройства и каталога Клиппер по
умолчанию.

Пример использования

COPY FILE Test.prg TO Real.prg
? FILE("Real.prg") // Результат: .T.

29


-------------------------------------------------------------------
COPY STRUCTURE Создание пустой базы данных по другой базе
-------------------------------------------------------------------

COPY STRUCTURE [FIELDS <список полей>TO <файл>

Аргументы

FIELDS <список полей> - это множество полей, которые будут
скопированы в заданном порядке в новую структуру базы данных. Если
не указано, то копируются все поля.

TO<файл> - имя выходного файла базы данных. По умолчанию, если не

Применение

COPY STRUCTURE - комманда базы данных, которая создает пустую базу
данных с полями из текущей базы данных. Если файл уже существует, он
перезаписывается.
Пример использования

USE Sales NEW
COPY STRUCTURE TO Temp
USE Temp NEW
DO WHILE lMore
APPEND BLANK
@ 10, 10 GET Temp->Salesman
@ 11, 11 GET Temp->Amount
READ
IF UPDATED()
SELECT Sales
APPEND BLANK
REPLACE Sales->Salesman WITH Temp->Salesman
REPLACE Sales->Amount WITH Temp->Amount
SELECT Temp
ZAP
ELSE
lMore := .F.
ENDIF
ENDDO
CLOSE DATABASES

Library: CLIPPER.LIB.
-------------------------------------------------------------------
COPY STRUCTURE EXTENDED Создание базы данных содержащей определенияполей
-------------------------------------------------------------------

COPY STRUCTURE [FIELDS <список полей>] TO <файл>

Аргументы

30


FIELDS <список полей> определяет порядок полей для копирования в
новый файл структуры базы данных. Если не определен, копируются все
поля.

TO <файл> имя файла куда копируется структура базы данных. По
умолчанию имеет расширение (.dbf).

Применение

COPY STRUCTURE EXTENDED создает файл базы данных с четырьмя полями:
Field_name, Field_type, Field_len, Field_dec. Создаваемый файл
содержит структуру текущего файла базы данных с одной записью для
определения каждого поля.

Используется в прикладных программах, это позволяет в программе
создавать или модифицировать структуру файла базы данных. Для
создания нового файла базы данных из файл с расширенной структурой
надо использовать команду CREATE FROM. Если необходим пустой файл с
расширенной структурой надо использовать CREATE.

Пример использования

USE Sales NEW
COPY STRUCTURE EXTENDED TO Struct
USE Struc NEW
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.

-------------------------------------------------------------------
COPY TO Копирование всей или части текущей базы данных в новый файл
-------------------------------------------------------------------

COPY [FIELDS <список полей>] TO <файл>
[<диапазон>] [WHILE <условие>] [FOR <условие>]
[SDF | DELIMITED [WITH BLANK | <разделитель>]]

Аргументы

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

TO <файл> определяет имя нового файла. Если предложение с типом
файла отсутствует, то по умолчанию принимается (.dbf) и задавать
расширение не надо. Если предложение с типом файла присутствует, то


31


если только не задано расширение, по умолчанию принимается (.txt).

SCOPE <диапазон> - это часть текущего файла базы данных, которая
будет участвовать в COPY. Умолчание предполагает ALL.

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

WHILE <условие> задает множество записей удовлетворяющих условию,
начиная с текущей записи исходного файла пока условие не нарушится.

SDF задает выходной файл в системном формате данных ASCII. Записи
имеют фиксированную длину, каждая из которых отделяется парой CR и
LF. Поля имеют фиксированную длину и между ними нет разделителей.
Символьные поля дополняются в конце пробелами, числовые поля
дополняются в начале пробелами, поля типа "дата" записываются в виде
"yyyymmdd", а логические поля записываются в виде T/F. Признаком
конца файла служит Ctrl-Z (1A - в шестнадцетиричной системе).

DELEMETED задает тип выходного файла ASCII-файл с разделителями.
Записи имеют переменную длину и разделяются посредством пары CR/LF.
Поля имеют переменную длину и разделяются запятыми. Символьные поля
ограничены разделителями (двойные кавычки используются по умолчанию
до тех пор пока не будет задан другой символ, используемый в предло-
жении WITH). Ведущие и хвостовые пробелы для числовых и символьных
полей усекаются, поля дат записываются в виде "yyyymmdd", а логичес-
кие поля записываются в виде T/F. Ctrl-Z (1A hex) является меткой
конца файла.

DELIMITED WITH BLANK задает тип выходного файла ASCII-файл с
разделителями. В качестве разделителей использует пробелы.

DELIMITED WITH <разделитель> задает тип выходного файла ASCII-файл с
определенными разделителями. В качестве разделителя может
использоваться буквенный символ или символьное выражение,
заключенное в круглые скобки.

????????????????????????????????????????????????????????????????????
Внимание

Если предложение DELIMITED WITH указано в комманде COPY или APPEND,
то оно должно быть указано последним.
?????????????????????????????????????????????????????????????????????

Применение

Все записи содержащиеся в активном файле базы данных будут
копироваться пока не будут ограничены диапазоном или предложением
FOR/WHILE. Записи помеченные на удаление будут копироваться если
только не включено состояние DELETED ON или установлен фильтр.

Пример использования

32


Пример копирования файла базы данных в другой файл:

USE Sales NEW
COPY TO Temp

Этот пример показывает использование SDF:

USE Testdata NEW
COPY NEXT 1 TO Temp SDF
TYPE Temp.txt

Результат:

Character 12.0019890801T

Этот пример показывает использование DELIMITED:

COPY NEXT 1 TO Temp DELIMITED
TYPE Temp.txt

Результат:

"Character",12.00,19890801,T

Этот пример показывает использование DELIMITED, в качестве
разделителя используя ",";

COPY NEXT 1 TO Temp DELIMITED WITH '
TYPE Temp.txt

Результат:

'Character',12.00,19890801,T

Library: CLIPPER.LIB.

-------------------------------------------------------------------
COUNT Эта команда выполняет подсчет записей рабочей области
-------------------------------------------------------------------

COUNT TO <пер>[<диапазон>] [WHILE <условие>] [FOR <условие>]

Аргументы

TO <пер> - переменная памяти, назначаемая для приема результата
работы команды COUNT. Если переменная не существовала или была не
числовая, то команда COUNT создает ее числовой.

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

FOR <условие> задает множество условий на записи по которым
производится подсчет в пределах заданного диапазона.


33

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

Применение

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

Пример использования

USE Sales NEW
COUNT TO nBranchCnt FOR Branch = 100
? nBranchCnt // Результат: 4

USE Branch INDEX Branch NEW
SEEK 100
USE Sales INDEX SalesBranch NEW
SEEK 100
COUNT TO Branch->Count WHILE Branch = 100

Library: CLIPPER.LIB.

-------------------------------------------------------------------
CREATE Создает пустой файл описания структуры базы данных
-------------------------------------------------------------------

CREATE <файл>

Аргументы

<файл> - имя файла структуры пустой базы данных.

Применение

Команда CREATE, также как COPY STRUCTURE EXTENDED, создает файл
описания структуры полей базы данных со следующими именами полей:
Field_name, Field_type, Field_len, Field_dec и может использоваться
вместе с командой CREATE FROM для создания новой структуры базы
данных. В отличии от команды COPY STRUCTURE EXTENDED, команда CREATE
создает пустой файл базы данных и, поэтому, не требует наличия базы
данных источника для ее создания.

Пример использования

CREATE TempStru
APPEND BLANK
REPLACE Field_name WITH "Name";
Field_type WITH "C";
Field_len WITH 25;
Field_dec WITH 0
CLOSE


34

CREATE NewFile FROM TempStru

Library: CLIPPER.LIB.

-------------------------------------------------------------------
CREATE FROM Создание новой базы данных из файла описания структуры
-------------------------------------------------------------------

CREATE <файл1> FROM <файл2>

Аргументы

<файл1> - имя создаваемой базы данных по структуре, описанной в
файле структуры <файл2>. Определение полей новой базы данных берется
из из записей файла <файл2>.

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

Применение
Команда CREATE FROM создает новый файл базы данных по описанию
структуры взятому из содержимого файла описания структуры. Файл
описания структуры базы данных должен иметь следующие поля:

Структура файла описания структуры.
?????????????????????????????????????????????????????
Поле Имя Тип Длина Десятичные
?????????????????????????????????????????????????????
1 Field_name Символьное 10
2 Field_type Символьное 1
3 Field_len Числовое 3 0
4 Field_dec Числовое 4 0
?????????????????????????????????????????????????????

Словарь данных: Чтобы создать словарь данных, вы можете иметь любое
количество полей в файле описания структуры для занесения в них
информации о атрибутах полей базы данных. Вы, например, можете иметь
поля для описания таких атрибутов полей, как описание, ключевой
флаг, метка, цвет, шаблон и выражение для проверки в фразе VALID. По
команде CREATE FROM, Клиппер создает новую базу данных только по
четырем требуемым полям. Все другие поля в описании структуры полей
базы данных будут игнорироваться. Однако, Клиппер не чувствителен к
порядку следования требуемых полей описания структуры базы данных.

Пример использования

Следующий пример показывает процедуру имитирующую интерактивную
утилиту CREATE:

CreateDatabase("NewFile")
RETURN

35

FUNCTION CreateDatabase( cNewDbf )
CREATE TmpExt // Создание пустой базы данных
USE TmpExt
lMore = .T.
DO WHILE lMore // Ввод нового имени поля
APPEND BLANK
CLEAR
@ 5, 0 SAY "Name.....: " GET Field_name
@ 6, 0 SAY "Type.....: " GET Field_type
@ 7, 0 SAY "Length...: " GET Field_len
@ 8, 0 SAY "Decimals.: " GET Field_dec
READ
lMore := (!EMPTY(Field_name))
ENDDO
DELETE ALL FOR EMPTY(Field_name) // Удаление пустых записей
PACK
CLOSE
CREATE (cNewDbf) FROM TmpExt // Создание нового файла
ERASE TmpExt.dbf
RETURN NIL
Library: CLIPPER.LIB.

-------------------------------------------------------------------
DELETE Помечает записи для уничтожения в текущей базе данных
-------------------------------------------------------------------

DELETE [<кол-во>] [FOR <условие>] [WHILE <условие>]

Аргументы

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

Условие: Фраза FOR определяет набор записей, удовлетворяющих условию
для удаления в рамках указанного количества. Фраза WHILE определяет
набор удаляемые записи, удовлетворяющие условию, начиная с текущей и
до тех записей, для которых условие не выполняется.

Применение

Команда DELETE создает метку записи для удаления, которые потом
могут быть отфильтрованы командой SET DELETED ON, проверены функцией
DELETED() и физически удалены из базы данных командой PACK. К тому
же, команды вывода записей, такие как LIST и DISPLAY указывают на
помеченные для удаления записи звездочкой (*). Помеченную для
удаления запись можно восстановить командой RECALL. Если вы хотите
удалить все записи из базы данных, то лучше использовать команду ZAP
вместо DELETE ALL и PACK.

Пример использования


36

USE Sales INDEX Salesman NEW
DELETE ALL FOR Inactive

Library: CLIPPER.LIB.

-------------------------------------------------------------------
DELETE FILE Удаляет файл с диска
-------------------------------------------------------------------

DELETE FILE | ERASE <файл>

Аргументы

<файл> имя файла, который будет удален с диска. Имя файла должно
быть с расширением. Возможно указание устройства или пути.

Применение

DELETE FILE является синонимом для комманды ERASE, которая удаляет
файл с диска. Файл удаляется, если он найден в текущем директории
или указан путь для нахождения файла.

?????????????????????????????????????????????????????????????????????
Внимание

Файлы должны быть закрыты перед удалением.
?????????????????????????????????????????????????????????????????????

Пример использования

? FILE("Temp.dbf") // Результат: .T.
DELETE FILE Temp.dbf
? FILE("Temp.dbf") // Результат: .F.

Library: CLIPPER.LIB.


-------------------------------------------------------------------
DIR* Вывод списка файлов по указанному маршруту
-------------------------------------------------------------------

DIR [<шаблон>]

Аргументы

<шаблон> формируется стандартными символами универсального
сопоставления (* и ?). Если он указан, то выводится список
соответствующих файлов, иначе выводится список файлов базы данных.

Применение

Команда DIR имеет два формата вывода списка файлов в зависимости от


37


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

Если не указан маршрут, DIR выводит файлы из текущего директория до
тех пор, пока не выполнена команда SET DEFAULT для смены устройства.

DIR - совместимая комманда и поэтому не рекомендована. Она
заменяется функцией DIRECTORY(), которая возвращает массив
информации о файлах.

В прикладных системах, где присутствует информация о каталоге
используйте функцию ADIR() вместо DIR. Эта функция позволяет вам
заполнить элементы массива атрибутами файлов. С помощью этого
массива и функции ACHOICE() вы можете создать любой вид меню выбора
файла.

Пример использования

cFilespec = "*.*"
DIR (cFilespec) // Вывод всех файлов
DIR // Вывод всех (.dbf) файлов
DIR *.prg // Вывод всех программ

Library: CLIPPER.LIB.

-------------------------------------------------------------------
DISPLAY Для вывода на экран одного или более записей
-------------------------------------------------------------------

DISPLAY <список выражений>
[TO PRINTER] [TO FILE <файл>]
[<диапазон>] [WHILE <условие>] [FOR <условие>] [OFF]

Аргументы

<список выражений> - список значений выводимых на экран для
каждой обрабатываемой записи.

TO PRINT позволяет печатает в режиме эхо вывод на принтере.

TO FILE позволяет выводить в режиме эхо выводимые данные в заданный
файл.

<диапазон> - это часть текущего файла базы данных, которая будет
выводится на экран (DISPLAY). По умолчанию это текущая запись. Если
задано условие, то диапазон охватывает все записи (ALL).

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

38

WHILE <условие> задает условное множество записей, которые будут
выводится на экран из заданного диапазона записей, пока условие не
нарушится.

OFF: предложение OFF подавляет вывод на экран номеров записей.

Применение

DISPLAY посылает результаты получаемые при обработке <списка
выражений> на экран в табулированном формате, при котором каждый
столбец отделен пробелом. Однако в отличие от других диалектов этот
оператор не выводит на экран заголовки столбцов и не делает паузу
каждые 15 записей.

Пример использования
USE Sales NEW
DISPLAY DATE(), TIME(), Branch
DISPLAY Branch, Salesman FOR Amount > 500;
TO PRINT
Для прерывания оператора DISPLAY можно использовать функцию INKEY() в
качестве части условия следующим образом:

USE Sales NEW
DISPLAY Branch, Amount, Salesman FOR INKEY() != 27

Library: CLIPPER.LIB.

-------------------------------------------------------------------
EJECT Подводит бумагу к началу новой страницы
-------------------------------------------------------------------

EJECT

Применение

По команде EJECT на печатающее устройство подается управляющий код
подачи формата (ASCII 12), в результате чего печатающая головка
устанавливается в начале новой страницы. Кроме того, обнуляются
текущие значения номеров строки и столбца.

Для обнуления этих значений без подачи формата используется функция
SETPRC().

Пример использования

LOCAL nLine := 99, nPage := 0
USE Sales NEW
SET PRINTER ON
SET CONSOLE OFF
DO WHILE !EOF()
IF nLine > 55
EJECT


39


? "Page " + LTRIM(STR(++nPage, 3))
? "Date " + CTOD(DATE())
?
? "Salesman", "Amount"
?
nLine := 6
ENDIF
? Sales->Salesman, Sales->Amount
nLine++
SKIP
ENDDO
SET PRINTER OFF
SET CONSOLE ON
CLOSE

Library: CLIPPER.LIB.

-------------------------------------------------------------------
ERASE Удаляет файл с диска
-------------------------------------------------------------------

ERASE | DELETE FILE <файл>

Аргументы

<файл> определяет имя файла, включая расширение, который будет
удален с диска.

Применение

ERASE комманда удаления файла. Файл удаляется, если он найден в
текущем директории или указан путь для нахождения файла.

????????????????????????????????????????????????????????????????????
Внимание

Файлы должны быть закрыты перед удалением.
????????????????????????????????????????????????????????????????????

Пример использования

? FILE("Temp.dbf") // Результат: .T.
ERASE Temp.dbf
? FILE("Temp.dbf") // Результат: .F.
? FILE("Temp.dbf") // Результат: .T.
ERASE Temp.dbf
? FILE("Temp.dbf") // Результат: .F.

Library: CLIPPER.LIB.

-------------------------------------------------------------------
FIND* Осуществляет поиск определенной записи по ключу
-------------------------------------------------------------------


40

FIND <символьная строка>

Аргументы

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

Применение

По команде FIND осуществляется просмотр индексного файла, начиная с
первого индекса. Поиск заканчивается с обнаружением записи,
удовлетворяющей заданному параметру, или с превышением значения
этого параметра в индексном ключе очередной записи. В первом случае
указатель устанавливается на соответствующую запись файла базы
данных. Если же поиск завершился неудачно, то возможны два случая.
Во-первых, если ранее командой SET SOFTSEEK ON был разрешен
"относительный" поиск, указатель записи будет установлен на первой
записи, значение индексного ключа которой превышает поисковый
параметр. В этом случае функция FOUND() возвращает логическую ложь
(.F.). Функция EOF() при отсутствии записей со значениями индексных
ключей, превышающими поисковый параметр, выдает логическую истину
(.T.). Во втором случае, когда "относительный" поиск не разрешен
(SOFT SEEK OFF), указатель записи принимает значение LASTREC()+1,
функция EOF() возвращает логическую истину (.T.), а FOUND() -
логическую ложь (.F.).

FIND - совместимая комманда и поэтому не рекомендована. Ее
использование заменяется коммандой SEEK.

Пример использования
USE Sales INDEX Branch
FIND ("500")
? FOUND(), EOF(), RECNO() // Результат: .F. .T. 85

FIND 200
-------------------------------------------------------------------gt; - это часть текущего файла базы данных, кpотораяbr /? FOUND(), EOF(), RECNO() // Результат: .T. .F. 5

FIND "100"
? FOUND(), EOF(), RECNO() // Результат: .T. .F. 1

Library: CLIPPER.LIB.

-------------------------------------------------------------------
GO Перемещение указателя записи на заданную запись
-------------------------------------------------------------------

GO[TO] <вырN> | BOTTOM | TOP

Аргументы

<вырN> - управляющее выражение. Если его значение истина (.T.), то


41

все последующие команды выполняются до тех пор пока не встретится
ELSE или ENDIF. Если вычисленное значение ложь (.F.), то управление
передается первой команде следующей за оператором ELSE, если он при-
сутствует. В противном случае управление передается оператору прог-
раммы непосредственно следующему за оператором ENDIF.

BOTTOM устанавливает указатель записи на последнюю логическую запись
текущей рабочей области, если есть активный индекс и на запись с
номером LASTREC(), если его нет. Если SET DELETED в состоянии ON или
есть активный фильтр, то это будет последняя запись в диапазоне
действия фильтра.

TOP устанавливает указатель записи на первую логическую запись
текущей рабочей области, если есть активный индекс и на запись с
номером 1 если нет индекса в команде USE. Если SET DELETED в
состоянии ON или есть активный фильтр, то это будет первая запись в
диапазоне действия фильтра.

Пример использования
USE Sales NEW
? LASTREC() // Результат: 84
//
GO TOP
? RECNO() // Результат: 1
//
GO BOTTOM
? RECNO() // Результат: 84
//
GO 5
? RECNO() // Результат: 5
//
GO 5 + 15
? RECNO() // Результат: 20

Library: CLIPPER.LIB.

-------------------------------------------------------------------
INDEX Создание индексного файла ключевых записей
-------------------------------------------------------------------

INDEX <ключ. выр> TO <имя файла> [UNIQUE]

Аргументы

<ключ. выр.> выражение для каждой записи базы данных помещаемое
как значение ключа в индексный файл. Максимальная длина индексного
ключевого выражения 250 символов.

<имя файла> имя создаваемого индексного файла, обычно, с расширением
(.ntx ). Однако, если вы скомпануете программу с модулем NDX.OBJ то
для того чтобы использовать совместимые с dBASE III PLUS индексные
файлы, у них будет расширение (.ndx ).


42

UNIQUE определяет, что <ключ. выр.> содержит только единственное
значение ключа.

Применение

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

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

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

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

Определение переменных: Локальные и статические переменные не могут
быть использованы в индексном выражении.

Индексирование по убыванию: Для создания индекса по убыванию или
убывающего подмножества можно использовать функцию DESCEND(). Эта
функция принимает как аргумент данные любого типа и возвращает
значение наоборот.

Помните о необходимости применения во время выполнения
последовательного поиска функции DESCEND() как части выражения для
команды SEEK.

Совместимость индексных файлов: Клиппер поддерживает создание
уникальных индексов по команде SET UNIQUE. Когда указано UNIQUE ON,
Клиппер добавляет только уникальные индексы в создаваемый индексный
файл. Помните, однако, что команда UNIQUE является не только атрибу-
том индексного файла, но и относится к выполнению других команд. Это
значит, что когда установлено UNIQUE OFF, то все ключи (не только
уникальные ) будут добавлены к индексам, даже если индексный файл
создавался в режиме UNIQUE ON. И, наоборот, когда установлено UNIQUE
ON, то в открытых индексных файлах исправляются не только уникальные


43


ключи.

Функция TRIM() в ключевом выражени: Размер индексного ключа в
Клиппер вычисляется по оценке ключевого выражения для пустой записи.
Поэтому функция TRIM() в любой части ключевого выражения,
содержащего поля, всегда оценивается как нулевая строка. Это может
привести к несоответствию размеров между желаемой и определяемой
длиной ключа. Используя функцию TRIM() внутри ключевого выражения
примените PADR() для фиксации длины:

USE Customer NEW
INDEX ON PADR(RTRIM(Last) + First, 40) TO CustName

Пример использования

Простейший пример индексации файла:

? TYPE("Branch") // Результат: C
INDEX ON Branch TO Branch
? TYPE("Amount") // Результат: N
INDEX ON Amount TO Amount
? TYPE("Date") // Результат: D
INDEX ON Date TO Date

Пример индексации по убыванию :

USE Invoices NEW
INDEX ON DESCEND(InvDate) TO InvStack
INDEX ON Customer + DESCEND(DTOS(InvDate)) TO CustStack

Library: CLIPPER.LIB.

-------------------------------------------------------------------
INPUT Ввод выражения с клавиатуры в переменную
-------------------------------------------------------------------

INPUT [<приглашение>] ТО <перем. памяти>

Аргументы

<перем. памяти> - имя переменной памяти, куда помещается
результат ввода.

Приглашение: Строка <приглашение> появляется на экране перед
областью ввода.

Применение

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


43

"ESC" не прерывает команду INPUT.

Ввод неверного выражения генерирует ошибку выполнения.

Пример использования

LOCAL exp
INPUT "Выражение: " TO exp
IF exp != NIL
? exp
ELSE
? "Выражение не введено"
ENDIF

Library: CLIPPER.LIB.

-------------------------------------------------------------------
JOIN Создание новой базы данных объединением записей и полей
-------------------------------------------------------------------
JOIN WITH <алиас> ТО <файл> FOR <условие> [FIELDS <список полей>]

Аргументы

<алиас> - рабочая область для объединения с записями активной
рабочей области.

<файл> - имя файла результата выполнения команды.

FOR: Выражение FOR <условие> выбирает записи, удовлетворяющие
указанному условию.

FIELDS: <список полей> состав полей из двух рабочих областей для
новой базы данных. Ссылки на имена полей во вторичной рабочей
области должны иметь имена с псевдонимами. Если слово FIELDS не
указано, то все поля из первичной области будут включены в итоговый
файл базы данных.

Применение

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

?????????????????????????????????????????????????????????????????????
Внимание

Помните, что количество обрабатываемых записей будет равно значению
функции LASTREC() для первичной рабочей области умноженное на


44


LASTREC() вторичной. Например, если есть две базы данных по 100
записей в каждой, то команда JOIN будет обрабатывать такое же
количество записей, как для одной базы данных в 10 000 записей.
Поэтому, применяйте эту команду осторожно.
????????????????????????????????????????????????????????????????????

Пример использования

Следующий пример команды JOIN объединяет базу данных Customers
(клиенты) с базой Invoices (счета) в базу Purchases (закупки):

USE Invoices NEW
USE Customers NEW
JOIN WITH Invoices TO Purchases;
FOR Last = Invoices->Last;
FIELDS First, Last, Invoices->Number, Invoices->Amount

Library: CLIPPER.LIB.

-------------------------------------------------------------------
KEYBOARD Помещает строку в буфер клавиатуры
-------------------------------------------------------------------

KEYBOARD <вырС>

Аргументы

<выр.С.> - строка, помещаемая в буфер.

Применение

Команда KEYBOARD используется в комбинации с командами и функциями,
ожидающими ввода данных с клавиатуры и управляющие информацией. Это
могут быть команды ожидания ввода, такие как АССЕРТ, INPUT и READ,
или функции обмена - ACHOISE(), DBEDIT(). MEMOEDIT() и INKEY().

Помните, каждое обращение команды KEYBOARD очищает буфер клавиатуры.

Пример использования

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

#include "Inkey.ch"

LOCAL cVar1 := SPACE(10), nVar := 2500, cVar2 := SPACE(10)
CLEAR
@ 09, 10 GET cVar1
@ 10, 10 GET cVar2 WHEN PickList()
@ 11, 10 GET nVar
READ
RETURN

45


FUNCTION PickList
STATIC aList := { "First", "Second", "Three", "Four" }
LOCAL cScreen, nChoice, nKey := LASTKEY()
cScreen := SAVESCREEN(10, 10, 14, 20)
@ 10, 10 TO 14, 20 DOUBLE
IF (nChoice := ACHOICE(11, 11, 13, 19, aList)) != 0
KEYBOARD CHR(K_CTL_Y) + aList[nChoice] + CHR(nKey)
ENDIF
RESTSCREEN(10, 10, 14, 20, cScreen)
RETURN .T.

Library: CLIPPER.LIB.

-------------------------------------------------------------------
LABEL FORM Выводит метки по формату, содержащемуся в файле (.lbl)
-------------------------------------------------------------------

LABEL FORM <файл1>
[TO PRINTER] [TO FILE <файл2>]
[<кол-во>] [WHILE <условие>] [FOR <условие>]
[SAMPLE]

Аргументы

<файл1> - имя файла (.lbl), содержащего определение формата меток
LABEL. Если расширение в имени не указано, добавляется ( .lbl).

<кол-во> размер обрабатываемой части базы данных. По умолчанию все
(ALL).

<условие> После FOR указывается условный набор записей для обработки
в команде в рамках определенного количества. Фраза WHILE определяет
набор записей, удовлетворяющих условию, от текущей до той записи,
для которой условие выполняется.

TO PRINTER дублирует вывод на печатающее устройство.

TO FILE дублирует вывод в указанный файл с именем <файл2>. Если
расширение не указано, добавляется расширение (.txt).

SAMPLE позволяет проверить как выводится содержимое записей в
заданном формате меток. Тест выводит содержимое меток как ряд
звездочек. Каждая проверяемая метка имеет количество столбцов и
строк как определено в формате. После вывода теста метки,
запрашивается "Do you want more samples ?" ("Нужны еще примеры ?").
Ответ "Y" (да) приводит к продолжению вывода тестов меток. "N" (нет)
указывает команде LABEL FORM прервать проверку и продолжить вывод
самих меток, удовлетворяющих условию.

Применение

Команда LABEL FORM показывает метки в соответствии с формой,
содержащейся в (.lbl) файле. Этот файл формата меток можно создать


46


программой RL.EXE

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

Пример использования

Показаны две формы комманды LABEL FORM:

LOCAL cLabel := "Sales", cFile := "Sales"
USE Sales INDEX Sales NEW
LABEL FORM Sales TO PRINTER TO FILE Sales
LABEL FORM (cLabel) TO PRINTER TO FILE (cFile)

Пример прерывания комманды LABEL FORM, используя INKEY() для анализа
нажатия клавиши Esc :

#define K_ESC 27
USE Sales INDEX Salesman NEW
LABEL FORM Sales FOR INKEY() != K_ESC

Library: CLIPPER.LIB.

-------------------------------------------------------------------
LIST Вывод записей, удовлетворяющих условию выражения
-------------------------------------------------------------------

LIST <список выражений>
[TO PRINTER] [TO FILE <файл>]
[<диапазон>] [WHILE <условие>] [FOR <условие>] [OFF]

Аргументы

<список выражений> это список выражений, значения которых будут
выводиться на экран.

TO PRINTER дублирует вывод на принтер.

TO FILE <файл> дублирует вывод в указанный файл. Если расширение не
указано, то добавляется (.txt).

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

<условие>: Фраза FOR определяет условный набор записей,
обрабатываемый командой в рамках указанного количества. Фраза WHILE
указывает набор записей, удовлетворяющих условию, начиная с текущей
и до тех записей, для которых выполняется условие.

OFF: Фраза OFF подавляет вывод номеров записей.

Применение


47

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

Пример использования

Простейший вывод на принтер условием :

USE Sales
LIST DATE(), TIME(), Branch
LIST Branch, Salesman FOR Amount > 500 TO PRINTER

Пример использования INKEY() для прерывания вывода после нажатия
клавиши Esc:

#define K_ESC 27
USE Sales INDEX Salesman NEW
LIST Branch, Salesman, Amount FOR INKEY() != K_ESC

Library: CLIPPER.LIB.

-------------------------------------------------------------------
LOCATE Поиск записи базы данных, соответствующей условию поиска
-------------------------------------------------------------------

LOCATE [<кол-во>] FOR <условие> [WHILE <условие>]

Аргументы

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

<условие>: Условие фразы WHILE определяет набор записей,
соответствующих данному условию, по которым будет производиться
поиск до первой записи не удовлетворяющей условию. После того, как
будет найдена первая удовлетворяющая условию запись, условием фразы
WHILE перестанет работать.

Применение

При первом выполнении команды LOCATE поиск ведется с первой записи
до записи, удовлетворяющей условию в базе данных текущей рабочей
области. Поиск прекращается, как только будет найдена
соответствующая запись или будет просмотрено указанное количество
записей. Если поиск удачен, то найденная запись становится текущей и
функция FOUND() принимает значение "истинно" (.Т.). При неудачном
поиске указателя функция FOUND() выдает значение "ложно" (.F.), и
позиция текущей записи зависит от величины, определенной в опции
<кол-во>.

Каждая рабочая область может иметь свое значение количества для


48


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

Команда LOCATE работает вместе с командой CONTINUE. Затем, вы можете
продолжить поиск от указателя текущей записи с помощью команды
CONTINUE.

Замечание

CONTINUE: Когда указаны <диапазон> и WHILE <условие> для
продолжения поиска комманда CONTINUE не применяется. В этом случае,
для продолжения поиска в указанном диапазоне, необходимо применить
комманду SKIP, а затем LOCATE REST WHILE <условие>.

Пример использования:

Простейший поиск:

USE Sales INDEX Salesman
LOCATE FOR Branch = "200"
? FOUND(), EOF(), RECNO() // Результат: .T. .F. 5

LOCATE FOR Branch = "5000"
? FOUND(), EOF(), RECNO() // Результат: .F. .T. 85

Пример использования LOCATE с WHILE условием, которое продолжается,
используя LOCATE REST:

SEEK "Bill"
LOCATE FOR Branch = "200" WHILE Salesman = "Bill"
DO WHILE FOUND()
? Branch, Salesman
SKIP
LOCATE REST FOR Branch = "200" WHILE Salesman = "Bill"
ENDDO

Library: CLIPPER.LIB.

-------------------------------------------------------------------
MENU TO Выполнение режима выбора из меню с помощью светящейся линии
-------------------------------------------------------------------

MENU TO <переменная памяти>

Аргументы

<переменная памяти>: переменная, куда команда MENU помещает
результат процесса выбора. Если переменная памяти не существует, то
она создается как переменная числового типа. Если же она существует,
то MENU TO по ней определяет положение светящейся линии выбора из
альтернатив, задаваемых фразой PROMPT.

Применение


49

Эта команда - специальный механизм выбора Clipper'а в системе меню.
Перед выполнением команды нужно определить элементы меню и
соответствующие сообщения командой MESSAGE и серией команд
@...PROMPT. И, затем, активизировать элементы меню командой MENU TO.
Если переменная памяти не существует, то MENU TO создает ее и
помещает светящуюся линию выбора на раздел меню, заданный первой
фразой PROMPT. Если эта переменная существует, то она определяет на
какой PROMPT будет указывать светящаяся линия выбора.

Перемещение по меню и выбор: Нажатие клавиш стрелок вверх/вниз
перемещает линию выбора на предыдущие или следующие разделы меню.
Когда светящаяся линия указывает на разделы меню, то на экран
выводится связанное с ним сообщение в строке с номером,
установленным командой SET MESSAGE TO. Если установлен режим WRAP ON
то, нажатие клавиши стрелка вверх приводит к перемещению светящейся
линии выбора на раздел, заданный последней фразой PROMPT.
Соответственно, стрелка вниз переводит с последнего PROMPT на
первый. Выбор производится нажатием клавишу "ввод" или первого
символа приглашения, указанного в команде PROMPT. После этого MENU
TO возвращает в переменной памяти число, соответствующее позиции
выбранного раздела меню. Клавиша "ESC" прерывает выполнение команды,
выбор не производится и возвращается нулевое значение в переменной
памяти. Следующая таблица приводит список клавиш задействованных в
команде MENU TO:

??????????????????????????????????????????????????????
Клавиши Действие
??????????????????????????????????????????????????????
Вверх предыдущее приглашение
Вниз следующее приглашение
Home первое приглашение
End последнее приглашение
Влево предыдущее приглашение
Вправо следующее приглашение
PgUp выбор приглашения, возвращение позиции
PgDn выбор приглашения, возвращение позиции
Ввод выбор приглашения, возвращение позиции
Esc прекращение выбора, возвращает 0
Первый символ выбор приглашения с таким же первым
символом, возвращает позицию
??????????????????????????????????????????????????????

Процедура SET KEY: Команды MENU TO могут быть вложенными с помощью
процедуры SET KEY без очистки не оконченного ввода на приглашение
(не похоже на GET/READ). Однако, если одно и тоже имя переменной
будет использоваться для вложенных меню, то она будет сохранять
старое значение, если не объявлена как локальная переменная
(PRIVATE) в процедуре SET KEY. Поэтому, рекомендуется применять
разные переменные памяти для каждого меню. В процедуре SET KEY можно
получить имя переменной с помощью функции READVAR(). Это полезно для
информации о состоянии или для перехода к новой позиции раздела меню
в вызывающем меню.


50

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

Пример использования

Пример создания простейшего меню с сообщениями, выводимыми на строке
23 посередине строки:

LOCAL nChoice := 2
SET WRAP ON
SET MESSAGE TO 23 CENTER
@ 6, 10 PROMPT "Добавление" MESSAGE "Новые действия"
@ 7, 10 PROMPT "Редактирование" MESSAGE "Изменение"
@ 9, 10 PROMPT "Конец" MESSAGE "Выход в DOS"
MENU TO nChoice
//
DO CASE
CASE nChoice = 0
QUIT
CASE nChoice = 1
NewAccount()
CASE nChoice = 2
ChangeAccount()
CASE nChoice = 3
QUIT
ENDCASE
RETURN

Library: CLIPPER.LIB.

-------------------------------------------------------------------
NOTE * Помещает комментарии в строку или после оператора команды
-------------------------------------------------------------------

NOTE [<текст>]

Аргументы

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

Применение

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

NOTE - совместимая комманда и поэтому не рекомендована. Ее


51


использование заменяется знаками комментариев как в языке Си ("/*" ,
"*/", "//), также используются знаки комментариев языка dBASE ("*" и
"&&").

Пример использования

NOTE Это комментарий
* это тоже комментарий
SET TALK ON && Еще комментарий

-------------------------------------------------------------------
PACK Физическое удаление записей, помеченных для удаления
-------------------------------------------------------------------

PACK

Применение

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

Пример использования

USE Sales NEW
? LASTREC() // Результат: 84
//
DELETE RECORD 4
PACK
? LASTREC() // Результат: 83

Library: CLIPPER.LIB.

-------------------------------------------------------------------
QUIT Прекращение выполнения программы, закрытие всех файлов
-------------------------------------------------------------------

QUIT | CANCEL*

Применение

QUIT или CANCEL можно применять в любом месте программы, где нужно
прекратить выполнение системы и выйти в ДОС. Команда RETURN в
процедуре самого высшего уровня приводит к таким же действиям.

Замечание

Код возврата: Когда программа Клиппер закончила свое выполнение
нормально, код возврата устанавливается в 0. Если программа была


52


прервана при возникновении фатальной ошибки, код возврата
устанавливается равным 1.

Пример использования

Ниже приводится пример выхода из программы, применяющей окно
диалога:

IF YesNoBox(10, 10, "Выйти из DOS", ;
"RG+/B,B/W", "W/W,N/W", 2)
QUIT
ENDIF
RETURN


Library: CLIPPER.LIB.

-------------------------------------------------------------------
READ Включение режима полноэкранного редактирования информации
-------------------------------------------------------------------

READ [SAVE]

Аргументы

SAVE: Эта опция сохраняет содержимое текущего GetList после
завершения комманды READ. Позднее вы можете редактировать эти же Get
объекты, используя другую комманду READ. Если не указана, то текущий
GetList обнуляется при окончании READ.

Применение

Команда READ осуществляет полноэкранное редактирование, используя
все Get объекты, созданные и добавленные в GetLIst, пока не
выполнены комманды CLEAR, CLEAR GET, CLEAR ALL или READ. Если была
процедура установки формата, то READ передает управление ей перед
полноэкранным редактированием.

При работе команды READ, вы можете редактировать содержимое каждого
GET объекта и передвигаться между ними. Перед вводом в Get объект
управление передается на фразу WHEN <пред-условие> (если она
указана). Если <пред-условие> "истинно" (.T.), то пользователь
допускается к редактированию содержимого Get объекта. В противном
случае, управление передается следующему Get объекту.

Если вы нажмете клавишу окончания редактирования GET, управление
сразу передается на фразу VALID <пост-условие> или RANGE (если они
указаны). Если каждое условие "истинно" (.T.), то редактирование Get
объектов заканчивается и управление передается следующему Get
объекту. В противном случае управление остается в текущем Get
объекте, пока не будет удовлетворено <пост-условие> или пользователь
не нажмет Esc.

53


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

Клавиши полноэкранного перемещения.
?????????????????????????????????????????????????????
Клавиша Действие
?????????????????????????????????????????????????????
Влево, Перемещение на символ влево. Не перемещает
Ctrl-S курсор на предыдущий GET

Вправо, Перемещение на символ вправо. В конце
Ctrl-D GET переводит курсор на следующий GET.

Ctrl-Влево, Перемещение на слово влево.
Ctrl-A

Ctrl-Вправо, Перемещение на слово вправо.
Ctrl-F

Вверх, Предыдущий GET.
Ctrl-E

Вниз, Следующий GET.
Ctrl-X,
Ввод,
Ctrl-M
Home Начало GET.
End Конец GET.

Ctrl-Home Начало первого GET.
Ctrl-End Начало последнего GET.
????????????????????????????????????????????????????

Клавиши полноэкранного редактирования.
?????????????????????????????????????????????????????
Клавиша Действие
?????????????????????????????????????????????????????
Удаление, Стирание символа в позиции курсора.
Ctrl-G
Backspace, Стирание символа перед курсором.
Ctrl-H
Ctrl-T Стирание слова справа.
Ctrl-Y Стирание символов справа от курсора.
Ctrl-U Восстановление для текущего GET
первоначального значения.
??????????????????????????????????????????????????????

Клавиши переключения режимов.
?????????????????????????????????????????????????????
Клавиша Действие
?????????????????????????????????????????????????????
Вставка, Переключение режима вставки.


54


Ins,
Ctrl-V
?????????????????????????????????????????????????????

Клавиши прекращения редактирования
?????????????????????????????????????????????????????
Клавиша Действие
?????????????????????????????????????????????????????
Ctrl-W, Закончить редактирование GET и
Ctrl-C, запомнить текущее значение
PgUp,
PgDn

Ввод, Закончить READ для последнего GET.
Ctrl-M,

Esc Прервать READ без запоминания текущих
значений GET.
?????????????????????????????????????????????????????

Замечания

Вложенность READ: Чтобы выполнить вложенные READ внутри SET KEY,
VALID, or WHEN процедуры или пользовательской функции, определите
или создайте новый GetList, выполните серию комманд @...GET и затем
READ. Когда процедура закончится, новый GetList обнулить ся и
предыдущий GetList станет снова доступен. Смотри пример ниже.

Окончание READ: READ заканчивается при выполнении комманд BREAK,
CLEAR, CLEAR GETS, или CLEAR ALL внутри SET KEY процедуры или
пользовательской функции, указанной в VALID.

UPDATED(): Если буфер Get объекта был изменён при выполнении текущей
комманды READ, то UPDATED() возвращает значение истинно (.T.).

Пример использования

Пример определения нескольких GET и затем - READ:

CLEAR
cVar1 := cVar2 := cVar3 := SPACE(10)
@ 10, 10 SAY "Переменная один:" GET cVar1 VALID !EMPTY(cVar1)
@ 11, 10 SAY "Переменная два:" GET cVar2 WHEN RTRIM(cVar1) != "One"
@ 12, 10 SAY "Переменная три:" GET cVar3 VALID !EMPTY(cVar3)
READ

Пример вложенных READ внутри SET KEY, WHEN, или VALI процедуры или
пользовательской функции:

LOCAL cName := SPACE(10)
@ 10, 10 GET cName VALID SubForm( cName )
READ
RETURN


55


FUNCTION SubForm( cLookup )
LOCAL GetList := {} // Создание нового GetList
USE Sales INDEX Salesman NEW
SEEK cLookup
IF FOUND()
@ 15, 10 GET Salesman // Добавить Get объекты в новый GetList
@ 16, 10 GET Amount
READ // READ из нового GetList
ENDIF
CLOSE Sales
RETURN .T. // Обнулить new GetList

Library: CLIPPER.LIB.

-------------------------------------------------------------------
RECALL Восстанавливает записи помеченной для удаления
-------------------------------------------------------------------
RECALL [<кол-во>] [FOR <условие> [WHILE <условие>]

Аргументы

<кол-во>: Указывает восстанавливаемый размер части базы данных. По
умолчанию - одна текущая запись. Если указывается условие, то по
умолчанию команда действует над всеми записями.

<условие>: Для фразы FOR, условие определяет набор обрабатываемых
записей из указанного количества. WHILE определяет набор записей,
удовлетворяющих условию от текущей записи до первой, для которой
условие не выполняется.

Применение

RECALL - комманда базы данных, которая восстанавливает записи,
помеченные на удаление. Если указано DELETED ON, то команда RECALL
восстанавливает текущую запись или определенное в команде RECORD
запись.

Пример использования

USE Sales NEW
//
DELETE RECORD 4
? DELETED() //Результат: .T.
//
RECALLПрименение. Все
?br /p DELEbr /lt;диапазонbr /TED() //Результат: .F.


Сеть:

В среде локальной сети команда RECALL требует блокировки текущей


56

p


записи функцией FLOCK(). Для восстановления одной записи нужно
заблокировать ее командой FLOCK(). Восстановить одной командой
RECALL можно несколько записей, если база данных была открыта как
USE...EXCLUSIVE.

Library: CLIPPER.LIB.

-------------------------------------------------------------------
REINDEX Реорганизация всех открытых индексных файлов
-------------------------------------------------------------------

REINDEX

Применение

Результаты работы команды REINDEX зависит от режима, установленного
командой SET UNIQUE. Если указано UNIQUE ON, будьте уверены, что все
индексные файлы в текущей рабочей области были созданы как UNIQUE
ON, иначе система создаст их заново. Помните, что режим SET UNIQUE
глобальный и не относится только к индексам.

Сеть:

В окружении сети команда REINDEX требует открытия файла текущей базы
данных как USE EXCLUSIVE.

Пример использования

USE Sales INDEX Salesman, Territory NEW
REINDEX

Library: CLIPPER.LIB.

-------------------------------------------------------------------
RELEASE Уничтожение переменных памяти
-------------------------------------------------------------------

RELEASE <список переменных>
RELEASE ALL [LIKE | EXCEPT <шаблон>]

Аргументы

<список переменных> это список удаляемых переменных.

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

Применение

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


57


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

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

Переменные, объявленные как LOCAL или STATIC не удаляются коммандой
RELEASE. Локальные переменные удаляются автоматически, когда
процедура или пользовательская функция, где они были определены,
закончила свое выполнение. Статические переменные не могут быть
удалены во время выполнения программы.

Library: CLIPPER.LIB.

-------------------------------------------------------------------
RENAME Переименование файла
-------------------------------------------------------------------

RENAME <файл1> TO <файл2>

Аргументы

<файл1> имя файла который будет переименован. Имя файла должно
включать расширение.

<файл2> новое имя файла с расширением.

Применение

RENAME изменяет имя указанного файла на новое. Для переименования
файла, находящегося в другом директории необходимо указание пути.

??????????????????????????????????????????????????????????????????
Внимание

Файлы должны быть закрыты перед переименованием. Попытка
переименовать открытый файл приведет к не предсказуемым результатам.
???????????????????????????????????????????????????????????????????

Пример использования

xcOldFile := "OldFile.txt"
xcNewFile := "NewFile.txt"
IF !FILE(xcNewFile)
RENAME (xcOldFile) TO (xcNewFile)
ELSE
? "Файл уже существует"
ENDIF

58


Library: CLIPPER.LIB.

-------------------------------------------------------------------
REPLACE Заменяет содержание указанных полей на результат выражения
-------------------------------------------------------------------

REPLACE <поле1> WITH <выр1>,
[<поле2> WITH <выр2>...]
[<кол-во>] [WHILE <условие>] [FOR <условие>]

Аргументы

<поле> имя заменяемого поля. Может быть любого типа, включая поля
памяти. Если указано с алиасом, заменяется поле в указанной области.

<выр> выражение для замены.

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

Условие: Для фразы FOR, условие определяет набор обрабатываемых
записей из указанного количества. WHILE определяет набор записей,
удовлетворяющих условию от текущей записи до первой, для которой
условие не выполняется.

Применение

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

REPLACE выполнят те же действия, что и оператор присвоения (:=),
отличаясь лишь тем, что он допускает не алиасное указание на
переменную поля. Вы можете присвоить новое значение переменной поля
используя комманды присвоения указанием специального алиаса поля
FIELD или использовать оператор определения поля FIELD.

?????????????????????????????????????????????????????????????????????
Внимание

Когда REPLACE выполняется над ключевым полем, индексный файл
обновляется и позиция указателя записи внутри индексного файла
изменяется. Когда выполняется комманда REPLACE с указанием условия и
количества записей над ключевым полем, могут возникнуть не
предсказуемые результаты. В этом случае перед выполнением комманды
REPLACE выполните SET ORDER TO 0. Все индексные файлы будут
обновлены.
????????????????????????????????????????????????????????????????????

Пример использования

Простейшее использование REPLACE:

59


USE Customer NEW
APPEND BLANK
USE Invoices NEW
APPEND BLANK
//
REPLACE Charges WITH Customer->Markup * Cost,;
Custid WITH Customer->Custid,;
Customer->TranDate WITH DATE()

Применение оператора присвоения вместо REPLACE :

FIELD->Charges := Customer->Markup * FIELD->Cost
FIELD->Custid := Customer->Custid
Customer->TranDate := DATE()

Library: CLIPPER.LIB.

-------------------------------------------------------------------
REPORT FORM Вывод табличного отчета
-------------------------------------------------------------------

REPORT FORM <файл1>
[TO PRINTER] [TO FILE <файл2>]
[<кол-во>] [WHILE <условие>] [FOR <условие>]
[PLAIN | HEADING <вырС>] [NOEJECT] [SUMMARY]

Аргументы

<файл1> - имя файла форм (.frm). Если не указано расширение, то
предполагается (.frm).

TO PRINTER дублирует вывод на принтер.

TO FILE: дублирует вывод в файл с именем <файл2> без символов
перевода страницы (ASCII 12). Если расширение не указано, по
умолчанию добавляется (.txt).

Кол-во: Размер части текущей базы данных, выдаваемой в отчете.
По умолчанию все записи.

Условие: Для фразы FOR, условие определяет набор обрабатываемых
записей из указанного количества. WHILE определяет набор записей,
удовлетворяющих условию от текущей записи до первой, для которой
условие не выполняется.

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

HEADING: Фраза HEADING помещает результат выражения <вырС> в первую
строку каждой страницы. Выражение <вырС> вычисляется только один раз
в начале отчета перед перемещением указателя записи.

60


NOEJECT: Подавляет перевод страницы в начале отчета, когда указана
фраза TO PRINT.

SUMMARY: Фраза SUMMARY указывает команде REPORT FORM выводить только
группы, подгруппы и итоговые строки. Полный вывод подавляется.

Применение

Команда REPORT FORM создает отчет по форме, предварительно
определенной в файле (.frm). Файл (.frm) можно создать программой
RL.EXE.

Замечания

Прерывание REPORT FORM: Для прерывания вывода отчета используйте
комманду INKEY() как часть условия FOR для анализа нажатой клавиши
прерывания.

Вывод в файл: Для вывода в файл используйте комманду REPORT FORM TO
FILE, для вывода на принтер, используйте комманду SET PRINTER:

SET PRINTER TO <xcFile>
REPORT FORM <xcReport> TO PRINTER
SET PRINTER TO

Пример использования

Пример двух указаний имени отчета в REPORT FORM:

LOCAL xcReport := "Sales"
USE Sales INDEX Sales NEW
REPORT FORM Sales TO PRINTER FOR Branch = "100" HEADING "Branch 100"
REPORT FORM (xcReport) TO PRINTER FOR Branch != "100"

Пример прерывания REPORT FORM с помощью INKEY():

#define K_ESC 27
USE Sales INDEX Sales NEW
REPORT FORM Sales FOR INKEY() != K_ESC

Library: CLIPPER.LIB.

-------------------------------------------------------------------
RESTORE Восстановление переменных памяти из файла памяти (.mem)
-------------------------------------------------------------------

RESTORE FROM <файл> [ADDITIVE]

Аргументы

<файл> имя файла для загрузки из него переменных.

ADDITIVE: Опция указывает, что переменные из файла будут добавляться


61


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

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

Применение

RESTORE восстанавливает переменные памяти, объявленные ранее как
PUBLIC или PRIVATE из файла памяти (.mem), если они были сохранены
коммандой SAVE. Массивы и локальные переменные не могут быть
сохранены SAVE и восстановлены RESTORE.

При восстановлении переменных памяти из файла, они инициализируются
как PRIVATE для данной процедуры, если не указаны в команде PUBLIC
перед RESTORE или добавлены с фразой ADDITIVE.

Локальные и статические переменные не восстанавливаются RESTORE.
Если локальная или статическая переменная была объявлена в текущей
процедуре или пользовательской функции и переменная с этим же именем
восстанавливается коммандой RESTORE, то только локальная или
статическая переменная является видимой, если не было ссылки на
алиас MEMVAR.

Пример использования

Следующий пример показывает типичное применение команд SAVE и
RESTORE. Здесь переменные памяти, содержащие экран запоминаются
командой SAVE и восстанавливаются командой RESTORE FROM из файла
памяти.

// Создание и использование псевдо-массива экрана
SAVE SCREEN TO cScreen1
SAVE ALL LIKE cScreen* TO Screens
//
<комманды>...
//
RESTORE FROM Screens ADDITIVE
nNumber = "1"
RESTORE SCREEN FROM ("cScreen" + nNumber)

Library: CLIPPER.LIB.

-------------------------------------------------------------------
RESTORE SCREEN* Восстановление предварительно сохраненного экрана
-------------------------------------------------------------------

RESTORE SCREEN [FROM <переменная памяти>]

FROM: Фраза FROM восстанавливает экран из определенной переменной
памяти <переменная памяти>. Если FROM не указана, экран
восстанавливается из буфера экрана.


62


Применение

Команда RESTORE SCREEN применяется в основном вместе с командой SAVE
SCREEN, чтобы дать возможность восстановить первоначальный экран,
временно замененный другой информацией. Заметьте, что <переменная
памяти> обычная строковая переменная и ее можно создавать и
обрабатывать так как вы хотите.

Синонимом команды RESTORE SCREEN является функция RESTCREEN(),
которая восстанавливает сохранённый экран.

RESTORE SCREEN - совместимая комманда и поэтому не рекомендована.
Используйте функции SAVESREEN() и RESTSCEEN().

Пример использования

Следующий пример использования маленького окна ввода:
IF FileAlert()
COPY FILE Them.txt TO My.txt
ELSE
BREAK
ENDIF
RETUN

FUNCTION FileAlert
LOCAL Lanswer := .F. , cScreen
SAVE SCREEN TO cScreen
@ 10, 10 CLEAR TO 12, 45
@ 10, 10 TO 12,45 DOUBLE
@ 11, 12 SAY "Файл существует, затирать (Y/N)?";
GET Lanswer PICTURE "Y"
READ
RESTORE SCREEN FROM cScreen
RETURN Lanswer

Library: CLIPPER.LIB.

-------------------------------------------------------------------
RUN Выполнение команды DOS или программы
-------------------------------------------------------------------

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

Аргументы

<команда DOS> - любые выполняемые программы, включая резедентные
команды DOS и COMMAND.COM.

Применение

При запуске команды RUN Клиппер выполняет копию файла COMMAND.COM,


63

передавая DOS команду запустить его. Здесь могут быть две проблемы.
Первая, вы должны иметь достаточное количество памяти для запуска
COMMAND.COM (27 К для DOS 3.2) или программы, которую вы хотите
выполнять. Второе, файл COMMAND.COM должен быть доступен по
указанному в команде COMSPEC маршруту (по умолчанию корневой каталог
на диске, с которого загружается DOS). Если файл COMMAND.COM
находится на другом диске, то сначала необходимо установить командой
SET COMSPEC маршрут к нему, и потом запускать программы или команды
из Clipper.

????????????????????????????????????????????????????????????????????
Внимание

Не запускайте из Клиппер резидентные программы, т. к. можете после
их выполнения потерять часть памяти. since
?????????????????????????????????????????????????????????????????????

Пример использования
Следующий пример демонстрирует как вы можете, используя команду RUN
в комбинации с функциями MEMOREAD() и MEMOWRIT(), создать функцию
пользователя, которая вызывает ваш редактор с текущим содержимым
поля памяти:

lSuccess = EditorMemo("Qedit", "Notes")
RETURN

FUNCTION EditorMemo( cEditor, cMemofld )
IF MEMOWRIT("Clipedit.tmp", &cMemofld.)
RUN (cEditor + " Clipedit.tmp")
REPLACE &cMemofld. WITH MEMOREAD("Clipedit.tmp")
ERASE Clipedit.tmp
RETURN .T.
ELSE
RETURN .F.
ENDIF

Одной из опций вы можете получить прямой доступ к DOS:

RUN COMMAND

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

echo off
prompt Dir: $p$_Type EXIT to return.$_$q
<имя вашей прикладной программы>
prompt $p$q

64


Затем проинструктируйте пользователя как вставить имя выполняемого
файла .EXE в пакетный файл.

Library: CLIPPER.LIB.

-------------------------------------------------------------------
SAVE Запоминание переменных памяти в файл (.mem)
-------------------------------------------------------------------

SAVE TO <файл> [ALL [LIKE | EXCEPT <шаблон>]]

Аргументы

<файл> имя файла в котором указанные переменные памяти будут
сохранены. Если расширение не указано, то Клиппер создает файл с
расширением (.mem) по умолчанию.

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

Применение

Команда SAVE копирует переменные памяти в файл. Массивы, локальные и
статические переменные не могут быть сохранены. Заметьте, спрятанные
переменные памяти (PRIVATE или LOCAL) не сохраняются.

Пример использования

Пример сохранения всех видимых переменных памяти в
Temp.mem:

PRIVATE cOne := "1"
SAVE ALL TO Temp

Пример сохранения всех видимых переменных памяти с именами,
начинающимися на "с" в Myvars.mem:


SAVE ALL LIKE c* TO MyVars

Пример сохранения всех видимых переменных памяти с
именами, не начинающимися на "с" в Myvars2.mem:

SAVE ALL EXCEPT c* TO MyVars2

Library: CLIPPER.LIB.

-------------------------------------------------------------------
SAVE SCREEN* Сохраняет текущий экран в буфер или переменную памяти
-------------------------------------------------------------------

SAVE SCREEN [TO <переменная памяти>]

65


TO определяет переменную памяти в которую будет сохранен текущий
экран. Эта переменная создается как символьная и длинна экрана равна
4000 байт.

Применение

Несколько экранов могут выть сохранены в разные переменные памяти.
Команда SAVE SCREEN применяется совместно с командой RESTORE SCREEN
для того, чтобы сохранить первоначальный вид экрана, когда он
временно заменяется на другой.

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

SAVE SCREEN - совместимая команда и поэтому не рекомендована.
Используйте функцию SAVESCREEN(), которая может сохранить весь экран
или его часть.

Пример использования

Пример использования статического массива для сохранения экранов:

STATIC aScreens[10]
SAVE SCREEN TO aScreens[1]
//
<команды>
//
RESTORE SCREEN FROM screens[1]

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

USE Screens INDEX Name NEW
APPEND BLANK
Screens->Name := "Screen001"
SAVE SCREEN TO Screens->Image
//
<команды>
//
SEEK "Screen001"
RESTORE SCREEN FROM Screens->Image

Library: CLIPPER.LIB.

-------------------------------------------------------------------
SEEK Поиск по индексу записи с ключом соответствующим выражению
-------------------------------------------------------------------

SEEK <выр>

Аргументы


65


<выр> выражение для поиска и сравнения с индексным ключом.

Применение

Команда SEEK контролирует индексы начиная с первого и проверяет их
пока не найдет такой, для которого ключ имеет значение больше, чем
аргумент поиска. Если они совпадают, то указатель записи
устанавливается на номер записи, найденной по индексу. Если
установлено SOFTSEEK OFF (режим по умолчанию) и SEEK не нашла
соответствующей записи, то указатель записи позиционируется на
записи с номером LASTREC() + 1.Функция EOF() возвращает значение
(.T.), а FOUND() выдает значение "ложно" (.F.). Если установлен
режим SOFTSEEK ON, то указатель записи будет установлен на первой
записи, для которой значение ключа больше аргумента поиска и FOUND()
возвратит значение ложь (.F.). Если же в файле нет записей для
которых ключи поиска больше аргумента поиска, то функция EOF()
выдаст значение "истинно" (.T.).
Пример использования

Пример использования комманды SEEK:

USE Sales INDEX Branch NEW
SEEK "100"
? FOUND(), EOF(), RECNO() // Результат: .T. .F. 1

Пример использования пользовательской функции в файле
Invoice (Накладная):

USE Invoice INDEX Invoice NEW
IF SeekExact("10001")
? "Invoice on file"
ELSE
? "Invoice not on file"
ENDIF
RETURN

FUNCTION SeekExact( cSearch )
SEEK PADR(cSearch, LEN(&(INDEXKEY(0))))
RETURN (FOUND())

Library: CLIPPER.LIB.

-------------------------------------------------------------------
SELECT Изменение текущей рабочей области
-------------------------------------------------------------------

SELECT <рабочая область> | <алиас>

Аргументы

<рабочия область> - число между 0 и 254 включительно. Ноль


66


означает первую доступную рабочую область, начинается c единицы.

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

Применение

Клиппер поддерживает 254 рабочие области. Команда SELECT 0 выбирает
первую не используемую область. В каждой рабочей области вы можете
открыть файл базы данных и до 15 индексных файлов. Каждая область
имеет набор определенных атрибутов.

Пример использования
last_area = SELECT()
SELECT 0
USE Newfile
*
<команды>
*

SELECT (last_area)

-------------------------------------------------------------------
SET Набор команд установки режимов и параметров
-------------------------------------------------------------------

-------------------------------------------------------------------
SKIP Изменение позиции указателя записи
-------------------------------------------------------------------

SKIP <вырN1> [ALIAS <рабоч. область>/<псевдоним>/(<вырN2>)]

Аргументы

<вырN1> указывает количество записей на которое нужно переместить
указатель записи, чтобы перейти к следующей. Положительное значение
перемещает указатель вперед, а отрицательное значение двигает указа-
тель записи назад. Нулевое значение наполняет буфер текущей рабочей
области из буфера ДОСа.

ALIAS: Фраза ALIAS перемещает указатель записи в определенной
рабочей области вместо текущей рабочей области.

Применение

Команда SKIP без аргументов перемещает указатель текущей записи на
следующую запись. SKIP назад доходит до начала файла и указывает на
первую запись, функция BOF() возвращает значение (.T.). Перемещение
указателя записи вперед до конца файла, устанавливает его на запись
с номером LASTREC() + 1 и функция EOF() возвращает значение
(.T.).

Если используются индексные файлы, команда SKIP перемещает указатель


67


в определенную позицию в соответствии с порядком индексов.

Заполнение буферов Clipper: Любые команды, приводящие к чтению
записей в внутренний буфер Клиппер заполняют текущий буфер файла
базы данных из буфера DOS, если после чтения с диска были сделаны
изменения. Команда SKIP 0 заставляет выводить содержимое буфера на
диск без перемещений указателя записей. Помните, что время записи
информации на диск зависит от DOS, если вы не выполните команду
SUMMIT специально для записи на диск. Команда SKIP 0 не всегда
означает непосредственную запись на диск. Обратите внимание, что эта
команда не заполняет буфера индексных файлов.

Пример использования
USE Customers NEW
? RECNO() // Результат: 1
SKIP
? RECNO() // Результат: 2
SKIP 10
? RECNO() // Результат: 12
SKIP -5
? RECNO() // Результат: 7

Следующий пример перемещает указатель записи в указанной (4) рабочей
области:

SKIP ALIAS 4

Это тоже, что:

SELECT 4
SKIP
SELECT 1

Library: CLIPPER.LIB.

-------------------------------------------------------------------
SORT Сортировка и копирование записей базы данных
-------------------------------------------------------------------

SORT [<кол-во>] ON <поле1> [/A][/C][/D] [,<поле2>
[/A][/C][/D]]... TO <файл>/(<вырС>)
[FOR <условие>][WHILE <условие>]

Аргументы

<поле1...полеN> поля используемые как ключи сортировки. Команда SORT
не работает со строками и выражениями в ключе.

<файл> имя файла в который помещаются отсортированные записи. Если
не указано расширение, то новому файлу базы данных добавляется
расширение (.dbf).

Порядок сортировки: Команда SORT поддерживает следующие типы


68

сортировки:

/A сортировка в порядке возрастания.
/D сортировка в порядке убывания.
/C сортировка без учета типа символов,
определенного символьного поля.

Если тип сортировки не указан, то по умолчанию берется сортировка по
возрастанию значения полей.

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

<условие>: Фраза FOR определяет набор записей для сортировки в
рамках указанного количества. Фраза WHILE определяет набор записей
от текущей и до первой, для которой условие выполняться не будет.

Применение
Клиппер сортирует символьные поля в соответствии с кодами символов в
кодировке ASCII по каждому символу в строке. Числовые поля
сортируются в числовом порядке, а даты сортируются хронологически.
Логические и поля памяти сортировать нельзя.

Команда SORT пытается поместить в памяти максимальное количество
информации и, потом, открывает временный файл на диске
(Clipsort.pmt). Он может быть таким же большим, как исходный файл
базы данных. Помните, что SORT использует три дискриптора файлов для
исходной базы данных, создаваемой и временного файла.

Помеченные для уничтожения записи: Команда SORT копирует помеченные
для уничтожения записи в создаваемую базу данных, но они остаются
помеченными для удаления.

Сеть:

В среде сети файл базы данных, который будет сортироваться, должен
быть заблокирован функцией FLOCK() или открываться как USE
EXCLUSIVE.

Library: CLIPPER.LIB.

-------------------------------------------------------------------
STORE Присвоение значения переменным
-------------------------------------------------------------------

STORE <выр> TO <список переменных>

Аргументы

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

69

<список переменных> это список имен переменных памяти которым
будет присваиваться значение. Имена переменных памяти могут иметь до
10 символов в длину, включая литеры, цифры и символ подчеркивания.
Однако, первым символом должна быть литера.

Применение

Команда STORE одновременно создает и присваивает значение одной или
нескольким переменным любого класса (локальным, статическим,
глобальным, переменным поля). STORE идентична простейшим операторам
присвоения (=) и (:=). Оператор (:=) используется для обработки
препроцессором.

Для замены объявления переменой вы можете указать имя переменной,
используя алиас. Если переменная является переменной поля,
используйте имя рабочей области. Для переменных памяти используйте
алиас переменных памяти (MEMVAR->). Для присвоения переменной поля в
текущей рабочей области используйте алиас поля (FIELD->).
Присвоение поля типа памяти новой переменной памяти создает эту
переменную как символьную.

Пример использования

Пример создания и присвоения значений переменным без их объявления:

STORE "строка" TO var1, var2, var3
var1 = "строка2"
var2 = Memvar->var1

Пример присвоения значений нескольким переменным, используя оператор
STORE и (:=). Оба метода идентичны.

STORE "строка" TO var1, var2, var3
var1 := var2 := var3 := "строка"

Пример присвоения значения полю при использовании алиаса. Первое
присвоение использует алиас поля, второе - алиас имени :

USE Sales NEW
FIELD->Custbal = 1200.98
Sales->Custbal = 1200.98

Library: CLIPPER.LIB.

-------------------------------------------------------------------
SUM Суммирует числа в переменные
-------------------------------------------------------------------

SUM [<кол-во>] <список вырN> TO <список переменных>
[FOR <условие>] [WHILE <условие>]

Аргументы


70

<список вырN> - список выражений с числовыми значениями для
суммирования каждой записи.

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

Количество: Размер части базы данных по которой будет подсчитана
сумма. По умолчанию - все записи.

Условие: Условие фразы FOR определяет набор записей из указанного
<количества> для которых будет производиться суммирование. Фраза
WHILE выделяет набор записей, удовлетворяющих данному условию
начиная с текущей записи и до первой не соответствующей условию.

Пример использования
USE Sales NEW
SUM Amount + 10, Amount TO sum1, sum2
? sum1 // Результат: 151515.00
? sum2 // Результат: 150675.00

Library: CLIPPER.LIB.

-------------------------------------------------------------------
TEXT Вывод блока текста на экран или в файл
-------------------------------------------------------------------

TEXT [TO PRINT] [TO FILE <файл>]
<текст>
ENDTEXT

Аргументы

<текст> - блок литерных символов для вывода та экран. Текст
выводится так, как он отформатирован.

TO PRINT: Фраза TO PRINT включает дублирование вывода на принтер.

FILE: Фраза FILE направляет вывод в указанный файл. Если не указано
расширение в имени файла, то добавляется (.txt).

Применение

Макро переменные, найденные в тексте между командами TEXT и ENDTEXT
заменяются на свои значения. Но внутри команд TEXT и ENDTEXT нет
переноса слов с одной строки на другую. Текст выводится в том виде,
как встречается в файле. TEXT ... ENDTEXT совместимая комманда и
поэтому не рекомендована. Используйте MEMOLINE() вместе с MLCOUNT()
для переноса больших строк или используйте комманды форматированного
вывода ?, @...SAY.


71

Пример использования

USE Sales NEW
DO WHILE !EOF()
FormLetter()
SKIP
ENDDO
RETURN

Function FormLetter
LOCAL dDate := DTOC(DATE()), cSalesman := RTRIM(Salesman)
TEXT TO PRINTER

&dDate

Dear &cSalesman.,

Как дела?

ENDTEXT
EJECT
RETURN NIL

-------------------------------------------------------------------
TOTAL Подводит итог по ключевым значениям
-------------------------------------------------------------------

TOTAL ON <ключ. выр> [<кол-во>] [FIELDS <список полей>]
TO <файл>/(<вырС>) [FOR <условие>] [WHILE <условие>]

Аргументы

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

<файл> - имя файла, являющийся результатом копирования в него
итоговых записей. Если расширение не указано, предполагается (.dbf).

FIELDS: Фраза FIELDS определяет список числовых полей по которым
вычисляется итог. Если FIELDS не указано, то по числовым полям итогRELEASE уничтожает переменные заголовок отчета выводится только в верхней части отчета. памяти п GET Lanswer PICTURE Для замены объявления переменой вLibrary: CLIPPER.LIB.ы можете указать имя переменной,амяти двумя осbr /???????????????????????????????????????????????????????????????????? новными способами./p p предварительно отсортирована по ключевому выражению, примеbr /няемому
не вычисляется. Иначе, в итоговом файле каждое числовое поле
содержит значение первой записи соответствующей ключевому выражению.

<кол-во>: Это размер части обрабатываемый размер базыpbr /Применяя эту технику, вы можете также захотеть изменить форму/p данных по
которой вычисляется итог. По умолчанию все записи (ALL).

<условие>: Для фразы FOR, условие определяет набор
обрабатываемых записей из указанного количества. WHILE определяет
набор записей, удовлетворяющих условию от текущей записи до первой,


72


для которой условие не выполняется.

Применение

В Клиппер подведение итогов имеет два типа и зависит от того,
указали вы фразу FIELDS или нет. Если команда содержит фразу FIELDS,
то TOTAL суммирует указанные числовые поля итогового файла,
группируя их по определенным ключевым выражениям. А, если FIELDS не
указано, то команда TOTAL копирует только записи с уникальными
ключами в итоговый файл базы данных. Таким способом, вы можете
убрать записи с повторяемыми значениями ключей.

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

Пример использования
USE Sales NEW
? LASTREC() // Результат: 84
TOTAL ON Branch + Salesman;
FIELDS Amount;
TO Summary

USE Summary NEW
? LASTREC() // Результат: 5

Library: CLIPPER.LIB.

-------------------------------------------------------------------
TYPE Выводит содержание текстового файла
-------------------------------------------------------------------

TYPE <файл>.<расшир.> [TO PRINT] [TO FILE <файл>]

Аргументы

<файл>.<расширение> - имя файла, включая расширение, для вывода на
экран.

PRINT: Фраза TO PRINT дублирует вывод на принтер.

FILE: Фраза TO FILE дублирует вывод в указанный файл с именем
<файл>. Если расширение не указано, добавляется (.txt).

Применение

Приостановить вывод можно клавишами "Ctrl-S". Помните, прервать
вывод файла клавишей "ESC" нельзя.

Пример использования

73


TYPE Main.prg TO PRINT

Library: CLIPPER.LIB.

-------------------------------------------------------------------
UNLOCK Освобождает заблокированный файл или набор записей
-------------------------------------------------------------------

UNLOCK [ALL]

ALL: Фраза ALL освобождает все текущие заблокированные записи во
всех рабочих областях. Если не указана, то освобождение происходит
для текущей рабочей области.

Library: CLIPPER.LIB.

-------------------------------------------------------------------
UPDATE Исправляет текущую базу данных из другой
-------------------------------------------------------------------

UPDATE ON <ключ. выр> FROM <псевдоним> REPLACE <поле1>
WITH <выр1>[,<поле2> WITH <выр2>]...[RANDOM]

Аргументы

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

<псевдоним> - имя псевдонима рабочей области источника
используемое для корректировки записей текущей рабочей области.

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

<выр1...вырN> - определяет значения для замены полей. Поля рабочей
области источника должны указываться с именем псевдонима перед
именем поля.

RANDOM: Фраза RANDOM разрешает чтение записей файла базы данных
источника в любом порядке. Если данная опция указана, то
результирующий файл должен быть проиндексирован по ключу <ключ.
выр>.

Применение

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

Отношения между рабочими областями: Команда UPDATE поддерживает


74


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

Типы замены: Во время корректировки записей, выражение используемое
во фразе REPLACE, определяет тип производимых изменений в итоговом
файле. Если команда UPDATE добавляет к полю итогового файла формула
будет:

REPLACE <итоговое поле> WITH <итоговое поле> + <вырN>

Наоборот, если команда UPDATE вычитает из итогового поля, то формула
будет:

REPLACE <итоговое поле> WITH <итоговое поле> - <вырN>

Помеченные для удаления записи: Если установлен режим DELETED ON, то
все итоговые записи корректируются вместе с помеченными для
удаления. Помеченные для удаления записи базы данных источника
игнорируются.

Сеть:

Команда UPDATE в среде сети, работает с заблокированными записями
итоговой базы данных функцией FLOCK() или командой USE...EXCLUSIVE.
Файл источник исправления может быть заблокирован или нет.

Пример использования

Этот пример корректирует файл базы данных Customers (клиенты),
добавляя новые значения (Amount) счетов (Invoices):

USE Customers
SELECT B
USE Invoices
SELECT Customers
*
UPDATE FROM Invoices RANDOM;
ON Last;
REPLACE Owed WITH;
Owed + Invoices->Amount

Library: CLIPPER.LIB.

-------------------------------------------------------------------
USE Открывает существующую базу данных (.dbf) и связанные с ней файлы
-------------------------------------------------------------------

USE [<файл>/(<вырС>)] [INDEX <список файлов>/(<вырС>)
[,(<вырС>)]...] [EXCLUSIVE][ALIAS <псевдоним>/(<вырС^>)

75


Аргументы

<файл> имя открываемой базы данных.

INDEX: Фраза INDEX <список файлов> определяет имена до 15
индексных файлов в текущей рабочей области.

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

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

Применение

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

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

Пример использования

USE Accounts EXCLUSIVE
IF NETERR() // команда оказалась неудачной
? "Файл Accounts недоступен"
ELSE
SET INDEX TO Acct_ID
ENDIF

Library: CLIPPER.LIB.

-------------------------------------------------------------------
WAIT* Приостановка выполнения программы до нажатие клавиши
-------------------------------------------------------------------

WAIT [<приглашение>] [TO <символьная переменная>]

<Приглашение>: Это символьная строка, которую выводит команда
WAIT. Если приглашение не указано, то по умолчанию выводится
сообщение "Prass any key to continue" ("Нажмите любую клавишу для
продолже- ния").

Переменная памяти: Фраза TO <символьная переменная> создает
указанную символьную переменную памяти, которая содержит введенный
символ.

Применение

76


Команда WAIT возвращает символ, введенный с клавиатуры в указанной
переменной памяти. Если введен непечатный символ WAIT возвращает
значение 0. Функциональные клавиши игнорируются, если не установлена
реакция на них командой SET FUNCTION или SET KEY.

WAIT - совместимая команда и поэтому не рекомендована. Ее
использование заменяется командами @ ...GET/READ и INKEY().

Для приостановки программы без приглашения используйте WAIT "" или
INKEY(0).

Пример использования

WAIT "Нажмите клавишу..." TO key

Library: CLIPPER.LIB.

-------------------------------------------------------------------
ZAP Уничтожает все записи в выбранной базе данных
-------------------------------------------------------------------

ZAP

Применение

Команда ZAP аналогична команде DELETE ALL и потом PACK, но
значительно быстрее.

Пример использования

USE Sales NEW
? LASTREC() // Результат: 84
COPY TO Archive
ZAP
 ? LASTREC() // Результат: 0