Глава 4. Язык Clipperа.

Глава содержит общую информацию о программировании с помощью Clipperа
- техническая спецификация Clipperа
- файлы, используемые Clipperом
- синонимы файлов
- поля
- постоянные
- переменные
- операторы
- выражения
- правила синтаксиса
- макроподстановки (&)
- функции, определенные пользователем
- установление к файлу множественных отношений
- создание конкретных подсказок для конкретных программ
- деление на ноль
- математический сопроцессор
- задание в командах области применения
- индексные файлы, совместимые с DBASE III PLUS
- таблицы клавиш для полноэкранных действий

Техническая спецификация.



Файлы баз данных количество полей 1 миллиард (если позволяет
место на диске)

Записи структура последовательная; поля
фиксированной длины

Поля символьные 32 Кбайт максимум
числовые 19 цифр (байт) максимум
даты 8 цифр (байт)
логические 1 символ (байт)
мемо 64 Кбайт (символов) макс.

- 20 -
Тип индексирования Б-дерево

Переменные количество 2048 максимум
размер символьные - 64 Кбайт
числовые - 19 цифр

Массивы количество 2048 максимум (каждый счи-
тается за одну переменную)
элементы 2048 (если позволяет память)
размер элемента так же как у переменных

Файлы открытые одновре- 255 максимум (для MSDOS 3.3)
менно
активные индексы 15 на каждую рабочую область
максимум
Ключи 250 символов на файл
индексирования (максимум)

Процедур в неограничено
файле
Прочее численная точность 18 десятичных знаков
(не включая десятичную точку)

Файлы

Имена файлов

Имя файлов обозначается идентификатором, состоящим из двух
частей : имени и расширения, разделенных точкой. Расширения
определяют тип файла и описаны ниже.
Имя может состоять из любых латинских букв, цифр и символов,
кроме "минуса". Имена должны начинаться с буквы и не могут содержать
внутри пробелы. Максимальная длина имени - 8 символов. Clipper
требует, чтобы Вы давали каждой процедуре, функции, файлам программ и
форматов уникальное имя, поскольку компилятор учитывает каждое имя
файла наравне с другими идентификаторами.

Указание имен в командах

В большинстве команд Вы не должны указывать расширение файла,
если используется стандартное для этого типа файла расширение. Если
команда создает файл, то она присваивает нужное расширение
автоматически.
Однако команды COPY FILE, DELETE FILE, ERASE, RENAME и TYPE
требуют, чтобы Вы указали имя вместе с расширением.

Файлы, используемые Clipperом

Файлы баз данных - содержат определение структуры строки и полей и
собственно данные для каждой строки. Расширение по
умолчанию".dbf".
Файлы мемо-полей - содержат все мемо-поля для конкретного файла базы
данных. Расширение по умолчанию".dbt".
Индексные файлы создаются с целью упорядочивания записей в файле базы
данных. К одному файлу базы данных могут относится несколько

- 21 -
индексных файлов. Индексные файлы Clipperа могут иметь одно из
двух расширений : ".ntx" (формат Clipperа) или ".ndx" (формат
DBASE).
Файлы памяти - содержат идентификаторы и содержимое переменных,
записанных при работе программы. Расширение по умолчанию".mem".
Файлы форм наклеек - содержат инструкции и определения, требующиеся
для печати наклеек командой LABEL FORM. Расширение по
умолчанию".lbl".
Файлы форм отчетов - содержат инструкции и определения, требующиеся
для печати отчетов командой REPORT FORM. Расширение по
умолчанию".frm".
Файлы формата - содержат команды отображения на экране
(@...SAY...GET), вызываемые командой SET FORMAT TO. Файл формата
- это ASCII текстовый файл и он может быть создан или
отредактирован текстовым редактором. Расширение по
умолчанию".fmt".
Альтернативные файлы - используются для сохранения информации,
выдаваемой на экран и создаются командой SET ALTERNATE TO. Эта
команда отправляет экранную выдачу многих команд в указанный
дисковый файл. Расширение по умолчанию".txt".
Файлы программ - содержат команды Clipperа для доступа к файлам,
манипуляции данными, работы с экраном и управления процессом.
файл программы - это ASCII текстовый файл и он может быть создан
или отредактирован текстовым редактором. Расширение по
умолчанию".prg".
Файлы процедур - содержат одну или больше частей программы,
обозначенные как PROCEDURE или FUNCTION. Это ASCII текстовый
файл и он может быть создан или отредактирован текстовым
редактором. Файлы процедур включаются в программу автоматически
при компиляции по команде SET PROCEDURE TO, если Вы не
компилируете с опцией (- m). Расширение по умолчанию".prg".

Синонимы файлов

Указание синонима.

Синоним - это альтернативное имя для базы данных. Он
устанавливается при открытии базы данных командой USE и используется
для доступа к полям базы данных, открытой в другой рабочей области.
Clipper не позволяет такого доступа без указания синонима.
Можно открыть до 255 баз данных в 255 различных областях (это
возможно только в DOSе 3.3; в противном случае предел - 15 баз данных
в 15 рабочих областях). Для передвижения из области в область
используется команда SELECT. Областям автоматически присваивается
синоним в виде букв от A до L или в виде чисел от 1 до 255 в
зависимости от количества открытых областей.

USE Customers
SELECT 2
USE Invoices

Вы также можете указать свой синоним :

USE Customers ALIAS Clients


- 22 -
Автоматические синонимы

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


<синоним>-><имя поля>

где <синоним> - любой из них.

Использование синонимов для доступа к полям в других рабочих
областях обычно производится после выполнения команды SET RELATION
TO.

Поля

Поля используются для строки и хранения единиц информации в
файле базы данных. Имя поля может содержать буквы, цифры или символ
подчеркивания (_), и не может содержать пробелы внутри. Первым
символом должна быть буква. Длина имени может быть до 10 символов.
Различные типы полей, указанные ниже хранятся как часть структуры
файла базы данных.

Символьные поля - могут содержать любую комбинацию букв, цифр,
пробелов и специальных символов и могут быть до 32 Кбайт длиной.
Числовые поля - содержат только числовые значения и могут
применятся в арифметических операциях. Числовое поле может
содержать до 19 цифр, включая до 18 десятичных знаков. В
числовое поле Вы можете вводить только цифры, знаки "плюс" и
"минус" и десятичную точку.
Поля дат - хранят даты и всегда имеют длину 8 символов. Сортировка по
полям дат всегда производится в хронологическом порядке. Clipper
не позволяет вводить заведомо неправильные даты.
Логические поля - хранят один символ, показывающий логическую
"истину" или "ложь". Эти поля задаются при создании базы данных
вводом их имени и типа "L". Clipper не разрешает ввод символов в
логические поля, хотя логические значения в них хранятся именно
как символы "T" и "F".
Мемо-поля - содержат текстовую информацию. Текст для всех записей
хранится в отдельном .dbt файле. Clipper присваивает мемо-полю в
.dbf файле длину 10 символов. Реальная длина поля в .dbt файле
определяется, когда информация введена, и, может составлять до
64 К символов.


Константы

Константа - это значение, которое может быть "буквально"
истолковано Clipperом. Константы означают действительную информацию,
в отличие от переменных или полей, идентифицируемых по имени. В
следующем примере "Creditlimit" - постоянная :

SEEK "Creditlimit"

- 23 -


Символьные постоянные,иногда называемые "строки", могут содержать до
64К букв, цифр пробелов и специальных символов. Символьные
постоянные обозначаются одинарными (' ') или двойными (" ")
кавычками или квадратными скобками ([ ]). Эти символы называются
ограничителями. Должны присутствовать открывающий и закрывающий
ограничители и они должны быть одинаковыми.

@ 1,5 SAY "Введите сумму"

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

? ["Добро пожаловать", сказал мэр города. ]


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

memvar = 0

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

null = ""

Переменные

Переменные временно хранят информацию в оперативной памяти
компьютера. Переменные и их значения уничтожаются при выполнении
команд RETURN, RELEASE ALL или CLEAR MEMORY если Вы не сохранили их
командой SAVE TO.

Имена переменных.

Имя, которое Вы присваиваете изменяемой, может содержать буквы,
цифры и символ подчеркивания (_). Первой в имени должна быть буква.
Имя может быть до 10 символов длиной. Clipper разрешает иметь до 2048
активных переменных одновременно, если позволяет размер свободной
памяти. Переменные создаются командой STORE или используя знак
равенства как оператор присваивания :

STORE 0 TO price, total_cost
start_row = 5

Переменные можно сохранить в файле на диске командой SAVE TO.
Тип изменяемой устанавливается в момент ее создания, он соответствует

- 24 -
типу сохраняемой в ней величины. Для примера, если Вы сохраняете символы,
то будет создана переменная символьного типа. Переменная может иметь
такое же имя, как и поле базы данных. При совпадении имен поле базы
данных имеет приоритет перед изменяемой. Если имена изменяемой и поля
совпадают, а Вам нужно указать переменную, то используйте в качестве
синонима "M"

M-><имя изменяемой>

Список переменных. Некоторые команды позволяют указывать несколько
переменных в качестве аргументов. Перечисляя их, отделяйте
каждую запятой, После запятой можно добавлять пробелы для
наглядности, поскольку для Clipperа пробелы не существенны.
Области определения переменных. Переменные классифицируются как
глобальные (PUBLIC) и локальные (PRIVATE). По умолчанию (без
объявления типа), программы и процедуры создают локальные
переменные. Когда Вы объявляете переменную глобальной, она
становится доступной всем клиппер-программам и процедурам (в пределах
данного .EXE файла и его оверлейных частей). Локальные
переменные используются только клиппер-программами и процедурами, их
породившими и в процедурах более низкого уровня (вложенных).
Локальные переменные уничтожаются при возврате в процедуру более
высокого уровня.
Создание локальных переменных. Использование команды PRIVATE в
подклиппер-программах для указания вида переменных снимает проблему
переопределения переменных с этим же именем, но определенных
выше. Этот подход позволяет писать программы и процедуры,
содержащие только локальные переменные. Объявление изменяемой
"локальной" "прячет" существующие переменные с таким же именем.
Следующая клиппер-программа демонстрирует эту концепцию. Переменная
"mem1", объявленная в вызванной процедуре как локальная, не
изменилась :

SET TALK OFF
mem1 = "one"
mem2 = "two"

DO Capitals && вызов процедуры
? mem1 && результат : "one"
? mem2 && результат : "TWO"
RETURN

PROCEDURE Capitals
PRIVATE mem1 && спрятать определенную выше mem1
mem1 = "ONE" && изменить только локальную mem1
mem2 = "TWO" && изменить вышеопределенную mem2
? mem1 && результат : "ONE"
? mem2 && результат : "TWO"
RETURN



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

- 25 -
использована для объявления массива, содержащего 10 элементов:

DECLARE memvar[10]

Вы можете обратиться к любому элементу массива, указав его
номер в квадратных скобках :

FOR n = 1 TO 10
? memvar[n]
NEXT


Операторы

Clipper использует четыре типа операторов :

Математические - производят вычисления над числовыми выражениями

Отношения - сравнивают два выражения и возвращают логическое
значение "истина" или "ложь"

Логические - сравнивают два логических выражения и возвращают
"истину" или "ложь"

Символьные - объединяют (конкатенация) два или более
символьных выражения



Математические Операторы


Таблица 4-1. Математические Операторы
------------------------------------------------------------
Символ Действие
------------------------------------------------------------
+ сложение
- вычитание
* умножение
/ деление
% взятие модуля
** или ^ экспоненцирование
() группировка
------------------------------------------------------------

Оператор модуля возвращает остаток от операции деления. Если
нужен только остаток от деления, то используйте оператор "%" вместо
"/".
Математические операторы можно использовать и для работы с
выражениями типа "дата", однако тут есть особенности. Числовые
выражения можно только прибавлять к, или вычитать из датных
выражений. Результат будет числом дней, добавленных или вычтеных из
даты.

Операторы Отношения.

Два сравниваемых выражения должны быть одного и того же типа.

- 26 -

Таблица 4-2. Операторы Отношения
------------------------------------------------------
Символ Цель
------------------------------------------------------
< меньше, чем
> больше, чем
= равно
<>,#,!= не равно
<= меньше или равно
>= больше или равно
$ содержится в множестве
== сравнивает символьные типы на точное
соответствие или сравнивает первые 12 значащих
цифр числовых типов
для остальных типов равнозначен "="
() изменяет порядок операций

------------------------------------------------------

На оператор "знак доллара" влияет команда SET EXACT. Если SET
EXACT установлено в ON, то для получения ответа "истина" оба
символьных выражения должны быть идентичны по содержанию и одинаковы
по длине.

Логические операторы.

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

Таблица 4-3. Логические операторы
------------------------------------------------------
Оператор Возвращает "истину", если :
------------------------------------------------------
.AND. оба выражения истинны
.OR. одно из выражений истинно
.NOT. или ! выражение ложно
$ первое символьное выражение содержится во
втором символьном выражении
------------------------------------------------------
Можно еще использовать скобки для группировки частей
сравниваемых логических выражений.

Строковые операторы.

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

Таблица 4-4. Строковые Операторы
------------------------------------------------------
Оператор Действие
------------------------------------------------------
+ используется для склеивания двух и более символьных
строк. Замыкающие пробелы в каждом выражении
остаются на своих местах.
- используется для склеивания двух и более

- 27 -
символьных выражений. Замыкающие пробелы первого
выражения изымаются и переносятся в конец второго
операнда.
------------------------------------------------------

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

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

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

Математические операторы

1. операторы, содержащиеся в скобках и функции (вычисляются
слева направо)
2. экспоненцирование
3. умножение и деление (слева направо)
4. сложение и вычитание (слева направо)

В первом примере внизу, умножение имеет приоритет перед
сложением. 3 прибавляется к 20. Во втором примере скобки дают
сложению приоритет и сумма, равная 7, умножается на 5.

3 + 4 * 5 = 23
(3 + 4) * 5 = 35

Строковые операторы

1. операторы и функции, содержащиеся в скобках
2. слева выражения направо

Операторы отношения

1. операторы и функции, содержащиеся в скобках
2. слева направо

Логические операторы

1. операторы и функции, содержащиеся в скобках
2. .NOT.
3. .AND.
4. .OR.


Выражения

- 28 -

Выражение состоит из одного или более элементов, вычисляемых
Clipperом. Эти элементы могут быть :
- полями
- переменными
- литералами (числовыми и символьными)
- функция (FUNC)ми
- операторами
Различные типы выражений показаны следующим образом :
<выр> - может быть выражением любого типа
<вырЧ> - числовое выражение
<вырС> - символьное выражение
<вырД> - датное выражение
<вырЛ> - логическое выражение
Некоторые команды и функции требуют, чтобы Вы ввели указанное
количество выражений - параметров. Информация, требующаяся для
каждого выражения, будет объяснена в соответствующих разделах
определения команд и функций. Многочисленные параметры показаны в
виде <выр1>, <выр2> ,<выр3> и т.д., где каждое выражение отделено
запятой.

Примеры на каждый тип выражений :
? TRIM(Firstname) + " " + Lastname && символьное
? creditlimit + curbalance && числовое
? creditdate + 90 && датное
? curbalance > creditlimit && логическое




Правила синтаксиса.


Существуют правила использования команд и функций. Эти правила и
называются синтаксисом.

Команды.

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

Продолжение командной строки.

Clipper позволяет при написании программы продолжить на
следующую строку, закончив первую символом "точка с запятой". Каждая
строка может содержать до 256 символов, и , с учетом переносов,
практически нет предела количеству символов в описании команды.
Чтобы перенести символьную строку закончите ее символом кавычки
("), затем знак (+), затем точка с запятой (;). Вторая строка должна
начинаться с кавычки, содержать остаток строки , и заканчиваться
кавычкой.

@ 23,0 say "Вводите заказ только если кредит "+;
"подтвержден !"

- 29 -

Заметьте, что команда SET PATH TO не позволяет использовать
"точку с запятой" для продолжения строки. Смотри описание SET PATH TO
в главе 5.

Функции.

Функции состоят из ключевого слова, за которым следуют левая и
правая круглые скобки. Аргументы внутри этих скобок могут быть
обязательными или по желанию. Следующая функция (FUNC), UPPER(), возвращает
символьный аргумент буквами верхнего регистра:

?UPPER(firstname)

Ключевые слова.

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

Символы.

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

[] квадратные скобки говорят, что эта часть команды не обязательна.
Не вводите сами скобки.
<> угловные скобки ограничивают информацию, которую Вы должны
задать, такую как имя базы данных, поле, файл или переменную.
Не вводите сами скобки.
... многоточие показывает, что здесь будет много строк команды,как
показано в синтаксисе команды DO CASE...CASE...ENDCASE.
/ косая черта означает "или-или". В этом случае одновременно можно
использовать только один из возможных вариантов.


ПРИМЕР СИНТАКСИСА:

LIST [OFF] [SCOPE <список_полей>] [FOR <условие>] [WHILE
<условие>] [TO PRINT] [TO FILE<имя файла>]

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

МАКРОПОДСТАНОВКА.

Макроподстановка позволяет подставить в командную строку
содержимое символьной изменяемой. Содержимое этой изменяемой
понимается Clipperом буквально. Переменной должен предшествовать знак
(&).
Клипер позволяет использовать макроподстановку повсюду в
предложениях DO WHILE, а также использовать вложенные и рекурсивные
макроподстановки. Клипер должен знать все элементы команды в момент
компиляции программы, поэтому он может сразу проверить годность
каждого предложения и сгенерировать соответствующий объектный код.
Каждая, содержащая команду или функцию, строка должна содержать всю

- 30 -
требуемую пунктуацию.

ПРИМЕЧАНИЕ: макроподстановки не могут содержать команды или
любую их часть (включая запятые).

Следующая таблица показывает разрешенные и неразрешенные
макроподстановки.
Таблица 4-5. Макро в Clipperе
-------------------------------------------------------------------
можно нельзя
-------------------------------------------------------------------
file = "abc" file = "USE abc"
USE &file &file
comp = "Nmbr2 > nmbr1" comp = "Name,City FOR
Nmbr2>nmbr1
LIST Name,City FOR &comp LIST &comp
-------------------------------------------------------------------
Поскольку макроподстановки не могут содержать команды или их
части, следующий пример показывает метод сочетания команды с макро:

LIST Name FOR Name="JONES"

можно переписать в виде:

condition='name="JONES"'
LIST Name FOR & condition

ФУНКЦИИ, ОПРЕДЕЛЕННЫЕ ПОЛЬЗОВАТЕЛЕМ.
Clipper дает Вам большие возможности, позволяя создавать свои
собственные функции. Это позволяет подстраивать Clipper под Ваши
задачи.

Используется следующий формат:

FUNCTION <имя>
*
* определение параметров, которые будут передаваться
* функции
*
[ PARAMETERS <список переменных> ]
< предложения текста программы >
* затем команда RETURN , и значение которая функция (FUNC)
* возвращает
RETURN <значение>

Следующий текст определяет функцию Center и алгоритм
центрирования строки.

FUNCTION Center
* синтаксис : Center(<вырС>,<вырЧ>)
* Возвращает вырС сцентрированное в ширине вырЧ путем
* добавления начальных пробелов
PRIVATE string,width
PARAMETERS string,width
IF LEN(string) >= width && слишком длинная строка
RETURN (string)
ENDIF

- 31 -
RETURN SPACE(INT(width/2) - INT(LEN(string)/2) +;
string


Самостоятельно определенные функции могут быть помещены в конце
Вашей программы или в файлах процедур. При этом они могут быть
использованы в любом месте Вашей программы, включая ключи
индексирования и условие VALID команды @...SAY...GET
Самостоятельно определенные функции можно также написать на Си
или Ассемблере и прикомпоновать к Вашей программе. (Подробности и
примеры в главе Система расширения).

УСТАНОВЛЕНИЕ МНОЖЕСТВЕННЫХ ОТНОШЕНИЙ К ФАЙЛУ.

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

Items.dbf - содержит описания товаров, количество на руках и
т.д., файл индексирован по полю Item_no.
Invoice.dbf - содержит номер счета и отгрузочную информацию по
каждому заказу. Проиндексирован по Order_no.
Detail.dbf - содержит запрошенные количества по каждому товару
для конкретного заказа. Проиндексирован по Detail.

Чтобы установить отношения для этой системы, введите следующие
команды:

SELECT 3
USE Items INDEX Item_no
SELECT 2
USE Invoice INDEX Order_no
SELECT 1
USE Detail INDEX Detail


- 32 -
* определим отношения между файлами
SET RELATION TO Item_no INTO Items,;
Order_no INTO Invoice


Теперь, когда Вы шагаете (SKIP) по файлу Detail.dbf, Клипер
помещает указатели в этих файлах на первые строки, соответствующие
текущему полю в родительском файле, из которого было установлено
отношение.
Ключевое выражения может совпадать , а может и нет, с ключевым
выражением в детском файле. Для примера Вы можете соотнести поле
Items->Item_no с полем Invoice->Order_no. Клипер находит
соответствия, основанные на содержимом файла, если он индексирован,
или по номерам записей если нет. Для нечисловых полей каждый детский
файл должен быть индексирован. Информация в ключевом выражении
родительского файла может быть подмножеством информации в ключевом
выражении детского.

СОЗДАНИЕ ПОДСКАЗКИ ДЛЯ КОНКРЕТНОЙ ПРОГРАММЫ.

Контекстно-специфичная подсказка.

Когда пользователь нажимает клавишу F1, чтобы вызвать
специфичную подсказку Вашей программы, Клипер посылает три параметра
написанной Вами программе HELP.prg. Нажатие F1 эквивалентно строке :

do help with call.prg,line_num,input_var.

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

1. Call.prg - имя процедуры, вызывающей HELP.prg. Это символьная
переменная, содержащая имя вызывающей процедуры. Все буквы в
этой изменяемой будут в верхнем регистре. Любое сравнение,
производимое с именем процедуры, должно быть с буквами верхнего
регистра.
2. line_num - числовая переменная, содержащая номер строки исходного
текста обрабатываемой команды REAL в программе, вызвавшей HELP.prg.
3. Input_var - символьная переменная, содержащая имя изменяемой,
ожидающей ввода от пользователя. Все буквы в этой изменяемой
будут в верхнем регистре. Команды "состояния ожидания" передадут
в этом параметре "нулевую строку". Любое сравнение, проводимое с
именем вводимой изменяемой, должно быть с буквами верхнего регистра.

ПРИМЕРЫ:
input_var='loans' && неправильно
input_var='LOANS' && правильно

Рекурсивные вызовы HELP.PRG создадут проблемы и их следует
избегать следующим приемом в начале файла HELP.PRG:

IF call_prg="HELP"
RETURN
ENDIF
Программа HELP.PRG пишется следующим образом:
Начните с предложения PARAMETER, принимающего три параметра,

- 33 -
передаваемых Clipperом. Это предложение должно присутствовать, даже
если параметры не используются.

ВАЖНЫЕ ЗАМЕЧАНИЯ:

Нельзя использовать команды CLEAR и READ, т.к. они стирают все
недовведенные GETы. Для очистки экрана используйте "@ строка, столбец
CLEAR", для ввода данных команды WAIT,ACCEPT,MENU TO или функцию
INKEY().
Укажите конкретные инструкции для каждой изменяемой, как в
следующем примере:

* Пример контекстно-специфичной подсказки HELP.PRG
*
* Когда, перед вводом очередной изменяемой, нажата клавиша F1,
* Clipper вызывает систему помощи, как если бы была выполнена команда
* DO HELP WITH call_prg, line_num, input_var
*
* Опишем формальные параметры
PARAMETERS call_prg, line_num, input_var
*
DO CASE
CASE call_prg = "CUSTMAST";
.AND. line_num = 125;
.AND. input_var = "LOANS"
@ 23,5 SAY "введите процент для типа займа " + &loantype
CASE call_prg = "CUSTMAST";
.AND. line_num = 231;
.AND. input_var = "ACCOUNT"
@ 23,5 SAY "введите процент платежей за этот месяц"
ENDCASE
RETURN

Обобщенная подсказка

Является альтернативной или дополняющей способностью подсказки
для пользователя. Этот метод позволяет создать набор экранов с
пояснениями или обеспечить другую помощь. Действуйте так:

1. При разработке прикладной программы определите глобальную
переменную help_code (или с другим именем). Определите ее значение в
каждом разделе программы, как в нашем примере :


* клиппер-программа CUST_SVC, демонстрирующая использование изменяемой
* help_code
*
* для первого раздела программы присвоим help_code значение "01"
*
<текст программы : DO, IF, CLEAR ...>
* для второго раздела программы присвоим help_code значение "02"
<текст программы : DO, IF, CLEAR ...>
*
* и т.д.

2. Напишите программу HELP.PRG, реализующую помощь,
предоставляемую для каждого значения help_code, т.е. для каждой части

- 34 -
программы. Когда, во время пользования программой, пользователь
нажмет клавишу F1, то будет вызвана Ваша клиппер-программа HELP.PRG и она
обеспечит запрограммированную в ней помощь. Для примера :

* пример программы обобщенной помощи HELP.PRG
*
* предположим, что глобальная переменная help_code определена
* в главной программе
*
* Примечание. Использованные в данном примере команды SAVE SCREEN и
* RESTORE SCREEN исключают необходимость повторного рисования экрана
* после того, как пользователь просмотрел подсказку
*
IF help_code = "01"
SAVE SCREEN
* очистка экрана без стирания GETов
@ 0,0 CLEAR
* далее Вы выводите на экран (командами ?, @...SAY) текст подсказки
* для пользователя - что нужно ввести, какие клавиши нажать и т.д.
? "Чтобы ввести ... "
.
.
.
? "Чтобы просмотреть ... "
?
? " Нажмите :"
? " клавишу F6 - чтобы увидеть результаты вычислений"
? " клавишу F7 - чтобы сохранить новые значения"
? " клавишу F8 - чтобы выйти из программы"
? " любую клавишу - чтобы вернуться к экрану данных"
WAIT " "
RESTORE SCREEN
RETURN
ENDIF

IF help_code = "02"
SAVE SCREEN
@ 0,0 CLEAR
? "Смотрите страницы 2-343 руководства или свяжитесь "
? " с администратором"
WAIT
RESTORE SCREEN
RETURN
ENDIF


Деление на ноль

При попытке делить на ноль Clipper выдаст сообщение об ошибке
исполнения программы. Такое иногда случается при делении на числовое
поле, которое не было проинициализировано. В таком случае будет
выдано сообщение об ошибке.
Следующая функция (FUNC) при попытке делить на ноль не выдаст
сообщения об ошибке и вернет 0 :
var1 = 25
var2 = 0
? ZERO(var1,var2)

- 35 -
* вернет 0
RETURN

FUNCTION Zero
PARAMETERS znum1, znum2
IF znum2 <> 0
RETURN (znum1/znum2)
ENDIF
RETURN (0)


Микросхема математического сопроцессора

Сопроцессор типа 8087,80287 или 80387 ускорит все арифметические
действия с плавающей точкой. Clipper хранит все числа в базе данных
как ASCII символы, но переводит их к типу с плавающей запятой перед
всеми арифметическими операциями, используя сопроцессор, если он
установлен.

Использование области определения (SCOPE)

Задание <области определения> совместимо с DBASEIIIPLUS. Опции
FOR и WHILE не являются исключениями из этого правила.

Пример : SEEK "CA"
LIST Balance, Company, Phone FOR Balance <> 0;
WHILE State = "CA"

Индексы, совместимые с DBASEIIIPLUS

DBASE использует расширение ".ndx" для файлов индексов, тогда
как Clipper обозначает их ".ntx". Хотя и тот и другой - файлы
индексов, но они не совместимы между собой. Если Вы хотите создать
файлы индексов, совместимые с DBASEIIIPLUS, то Вам нужно прилинковать
к программе объектный файл NDX.OBJ.
Индексные файлы создаются Clipperом посредством стандартной
команды INDEX ON. Clipper создает (.ntx) файлы если Вы не
прилинковали файл NDX.OBJ, подавляющий схему (.ntx) индексирования.
Файл NDX.OBJ используется следующим образом :
С линкером DOSа :

LINK MYPROG+NDX,,,\CLIPPER\CLIPPER

С линкером PLINK86-PLUS :

PLINK86 FI MYPROG, NDX LIB \CLIPPER\CLIPPER

Любая из этих команд соединяет файлы MYPROG.OBJ и NDX.OBJ,
создавая исполняемый файл MYPROG.EXE, использующий DBASE-совместимый
индекс (.ndx).
Команды SET ORDER TO и SET INDEX TO также поддерживают
использование файлов типа (.ndx).

Примечание : нельзя использовать оба типа индексов (.ndx и .ntx)
одновременно в одной и той-же программе. Есть заметная разница между
этими типами, которую полезно учитывать : .ntx файлы работают заметно
быстрее. Кроме того, имейте в виду, что все программы, одновременно

- 36 -
использующие конкретные .ndx файлы должны быть одного типа - все под
DBASEом или все после Clipperа. Нельзя использовать DBASEовское
приложение, работающее с .ndx файлом с одной станции и Clipperное
приложение, использующее его же с другой станции.


Таблицы клавиш для полноэкранных режимов


При строки экрана GETов курсор можно передвигать
следующими клавишами :

Таблица 4-6. Клавиши передвижения по экрану
-------------------------------------------------------------------
Клавиша Действие
-------------------------------------------------------------------
Стрелка_влево, На символ вправо. Не переходит к предыдущему
Ctrl-S GETу

Стрелка_вправо, На символ вправо. Не переходит к предыдущему
Ctrl-D GETу

Ctrl-Стрелка_влево На слово влево
Ctrl-A

Ctrl-Стрелка_вправо На слово вправо
Ctrl-F

Стрелка_вверх На предыдущий GET
Ctrl-E

Стрелка_вниз На следующий GET
Ctrl-X

Return На следующий GET
Ctrl-M

Home В начало окна GETа

End В конец окна GETа

Ctrl-Home В начало первого GETа

Ctrl-End В начало последного GETа
-------------------------------------------------------------------



Таблица 4-7. Клавиши редактирования
-------------------------------------------------------------------
Клавиша Действие
-------------------------------------------------------------------
Del Удаляет символ над курсором
Ctrl-G

BackSpace Удаляет символ слева от курсора
Ctrl-H

- 37 -

Ctrl-T Удаляет слово слева

Ctrl-Y Удаляет все от курсора до конца строки

Ctrl-U Восстанавливает текущий GET в исходном
значении
-------------------------------------------------------------------

Таблица 4-8. Клавиши выхода из редактирования
-------------------------------------------------------------------
Клавиша Действие
-------------------------------------------------------------------
Ctrl-W, Ctrl-C, Закончить обработку READ, сохранив
PgUp, PgDn текущий GET

Return, Ctrl-M Закончить обработку READ, если клавиша
нажата на последнем GETе

Esc Прекратить обработку READ без сохранения
текущего GETа
-------------------------------------------------------------------


Таблица 4-9. Клавиши режима ввода
-------------------------------------------------------------------
Клавиша Действие
-------------------------------------------------------------------
Ins, Ctrl-V Переключение режимов "вставка" и "замена"