Компьютерные науки - Учебники на русском языке - Скачать бесплатно
PROCLINE() Возвращает номер строки исходного текста текущей
программы или процедуры.
- 18 -
PROCNAME() Возвращает имя текущей процедуры или программы.
READVAR() Возвращает имя текущей переменной GET/MENU или нулевую
строку, если все GETы обработаны.
SCROLL() Позволяет прокручивать вверх и вниз назначенную часть
экрана или очищать ее.
SECONDS() Возвращает системное время в виде <эсекунд>, <эсотых>.
Возвращенное значение есть число секунд, прошедшее с полуночи по 24 -
часовой системе, в диапазоне от 0 до 86399.
SELECT() Возвращает номер текущей рабочей области.
SETPRC() Устанавливает внутренние PROW() и PCOL() в указанные
значения.
UPDATED() Возвращает логическую "истину", если последний READ
изменил какие - либо данные в соответствующих GETах.
УТИЛИТЫ КЛИППЕРА
Дистрибутив содержит специальные утилиты для создания и
редактирования файлов вне Клиппера:
DBU.EXE Программа, позволяющая Вам создавать и редактировать
файлы базы данных, файлы индексов и данные. Вы также можете
моделировать структуры данных, используя отношения и фильтры без
написания отдельных программ или использования интерпретатора.
RL.EXE Позволяет создавать и редактировать формы LABEL и
REPORT. Программа написана на Клиппере и поставляется с исходным текстом.
LINE.EXE Выводит Ваши программы на экран или на принтер с
указанием номеров строк.
MAKE.EXE Используется для описания зависимостей исходных или
объктных файлов для компилятора и для определения
цикла компиляции и линковки.
Подробности в главе 12.
МОДИФИЦИРОВАНИЕ ПРОГРАММ, НАПИСАННЫХ ДЛЯ DBASE III PLUS
Примечание: Различия между Клиппером и Dbase III plus, описанные
в этом разделе, относятся к Dbase III plus версия 1.1.
Синтаксис и логика Клиппера эмулируют, насколько возможно, язык
программирования Dbase III plus. Однако есть отличия и там, где они
встречаются, потребуется модифицировать Ваши программы, чтобы Клиппер
мог их успешно компилировать.
Вам потребуется модифицировать программы, если выполняется хотя
бы одно из следующих трех условий:
- 19 -
--- программа содержит одну из команд, которые не
поддерживаются Клиппером или поддерживаются по
другому. Приложение С содержит список таких команд.
--- Вы хотите вставить какие - либо из расширений
Клиппера.
--- Программа использует макроподстановку, содержащую
слово команды или запятую команды, которые не
разрешены в Клиппере. (Годные выражения, включая
функции, разрешены в макро).
Заметьте, что программы, в которые включены расширения Клиппера,
не будут работать под управлением Dbase, если они не были объединены
в условные предложения IF, связанные с глобальной переменной CLIPPER.
Глава 4. Язык Клиппера.
Глава содержит общую информацию о программировании с помощью Клиппера
- техническая спецификация Клиппера
- файлы, используемые Клиппером
- синонимы файлов
- поля
- константы
- переменные
- операторы
- выражения
- правила синтаксиса
- макроподстановки (&)
- функции, определенные пользователем
- установление к файлу множественных отношений
- создание конкретных подсказок для конкретных программ
- деление на ноль
- математический сопроцессор
- задание в командах области применения
- индексные файлы, совместимые с DBASE III PLUS
- таблицы клавиш для полноэкранных действий
Техническая спецификация.
Файлы баз данных количество полей 1 миллиард (если позволяет
место на диске)
Записи структура последовательная; поля
фиксированной длины
Поля символьные 32 Кбайт максимум
числовые 19 цифр (байт) максимум
даты 8 цифр (байт)
логические 1 символ (байт)
мемо 64 Кбайт (символов) макс.
- 20 -
Тип индексирования Б-дерево
Переменные количество 2048 максимум
размер символьные - 64 Кбайт
числовые - 19 цифр
Массивы количество 2048 максимум (каждый счи-
тается за одну переменную)
элементы 2048 (если позволяет память)
размер элемента так же как у переменных
Файлы открытые одновре- 255 максимум (для MSDOS 3.3)
менно
активные индексы 15 на каждую рабочую область
максимум
Ключи 250 символов на файл
индексирования (максимум)
Процедур в неограничено
файле
Прочее численная точность 18 десятичных знаков
(не включая десятичную точку)
Файлы
Имена файлов
Имя файлов обозначается идентификатором, состоящим из двух
частей : имени и расширения, разделенных точкой. Расширения
определяют тип файла и описаны ниже.
Имя может состоять из любых латинских букв, цифр и символов,
кроме "минуса". Имена должны начинаться с буквы и не могут содержать
внутри пробелы. Максимальная длина имени - 8 символов. Клиппер
требует, чтобы Вы давали каждой процедуре, функции, файлам программ и
форматов уникальное имя, поскольку компилятор учитывает каждое имя
файла наравне с другими идентификаторами.
Указание имен в командах
В большинстве команд Вы не должны указывать расширение файла,
если используется стандартное для этого типа файла расширение. Если
команда создает файл, то она присваивает нужное расширение
автоматически.
Однако команды COPY FILE, DELETE FILE, ERASE, RENAME и TYPE
требуют, чтобы Вы указали имя вместе с расширением.
Файлы, используемые Клиппером
Файлы баз данных - содержат определение структуры записи и полей и
собственно данные для каждой записи. Расширение по
умолчанию".dbf".
Файлы мемо-полей - содержат все мемо-поля для конкретного файла базы
данных. Расширение по умолчанию".dbt".
Индексные файлы создаются с целью упорядочивания записей в файле базы
данных. К одному файлу базы данных могут относится несколько
- 21 -
индексных файлов. Индексные файлы Клиппера могут иметь одно из
двух расширений : ".ntx" (формат Клиппера) или ".ndx" (формат
DBASE).
Файлы памяти - содержат идентификаторы и содержимое переменных,
записанных при работе программы. Расширение по умолчанию".mem".
Файлы форм наклеек - содержат инструкции и определения, требующиеся
для печати наклеек командой LABEL FORM. Расширение по
умолчанию".lbl".
Файлы форм отчетов - содержат инструкции и определения, требующиеся
для печати отчетов командой REPORT FORM. Расширение по
умолчанию".frm".
Файлы формата - содержат команды отображения на экране
(@...SAY...GET), вызываемые командой SET FORMAT TO. Файл формата
- это ASCII текстовый файл и он может быть создан или
отредактирован текстовым редактором. Расширение по
умолчанию".fmt".
Альтернативные файлы - используются для сохранения информации,
выдаваемой на экран и создаются командой SET ALTERNATE TO. Эта
команда отправляет экранную выдачу многих команд в указанный
дисковый файл. Расширение по умолчанию".txt".
Файлы программ - содержат команды Клиппера для доступа к файлам,
манипуляции данными, работы с экраном и управления процессом.
файл программы - это ASCII текстовый файл и он может быть создан
или отредактирован текстовым редактором. Расширение по
умолчанию".prg".
Файлы процедур - содержат одну или больше частей программы,
обозначенные как PROCEDURE или FUNCTION. Это ASCII текстовый
файл и он может быть создан или отредактирован текстовым
редактором. Файлы процедур включаются в программу автоматически
при компиляции по команде SET PROCEDURE TO, если Вы не
компилируете с опцией (- m). Расширение по умолчанию".prg".
Синонимы файлов
Указание синонима.
Синоним - это альтернативное имя для базы данных. Он
устанавливается при открытии базы данных командой USE и используется
для доступа к полям базы данных, открытой в другой рабочей области.
Клиппер не позволяет такого доступа без указания синонима.
Можно открыть до 255 баз данных в 255 различных областях (это
возможно только в ДОСе 3.3; в противном случае предел - 15 баз данных
в 15 рабочих областях). Для передвижения из области в область
используется команда SELECT. Областям автоматически присваивается
синоним в виде букв от A до L или в виде чисел от 1 до 255 в
зависимости от количества открытых областей.
USE Customers
SELECT 2
USE Invoices
Вы также можете указать свой синоним :
USE Customers ALIAS Clients
- 22 -
Автоматические синонимы
Если в команде USE не указан синоним, то Клиппер присваивает имя
файла базы данных в качестве ее синонима, (в дополнение к присвоенным
букве и цифре).
Для указания поля в базе данных, открытой в другой области,
можно указывать любой из синонимов : букву, цифру, указанный или
автоматически присвоенный. Обращаться к полям нужно следующим образом
<эсиноним>-><эимя поля>
где <эсиноним> - любой из них.
Использование синонимов для доступа к полям в других рабочих
областях обычно производится после выполнения команды SET RELATION
TO.
Поля
Поля используются для записи и хранения единиц информации в
файле базы данных. Имя поля может содержать буквы, цифры или символ
подчеркивания (_), и не может содержать пробелы внутри. Первым
символом должна быть буква. Длина имени может быть до 10 символов.
Различные типы полей, указанные ниже хранятся как часть структуры
файла базы данных.
Символьные поля - могут содержать любую комбинацию букв, цифр,
пробелов и специальных символов и могут быть до 32 Кбайт длиной.
Числовые поля - содержат только числовые значения и могут
использоваться в арифметических операциях. Числовое поле может
содержать до 19 цифр, включая до 18 десятичных знаков. В
числовое поле Вы можете вводить только цифры, знаки "плюс" и
"минус" и десятичную точку.
Поля дат - хранят даты и всегда имеют длину 8 символов. Сортировка по
полям дат всегда производится в хронологическом порядке. Клиппер
не позволяет вводить заведомо неправильные даты.
Логические поля - хранят один символ, показывающий логическую
"истину" или "ложь". Эти поля задаются при создании базы данных
вводом их имени и типа "L". Клиппер не разрешает ввод символов в
логические поля, хотя логические значения в них хранятся именно
как символы "T" и "F".
Мемо-поля - содержат текстовую информацию. Текст для всех записей
хранится в отдельном .dbt файле. Клиппер присваивает мемо-полю в
.dbf файле длину 10 символов. Реальная длина поля в .dbt файле
определяется, когда информация введена, и, может составлять до
64 К символов.
Константы
Константа - это значение, которое может быть "буквально"
истолковано Клиппером. Константы означают действительную информацию,
в отличие от переменных или полей, идентифицируемых по имени. В
следующем примере "Creditlimit" - константа :
SEEK "Creditlimit"
- 23 -
Символьные константы,иногда называемые "строки", могут содержать до
64К букв, цифр пробелов и специальных символов. Символьные
константы обозначаются одинарными (' ') или двойными (" ")
кавычками или квадратными скобками ([ ]). Эти символы называются
ограничителями. Должны присутствовать открывающий и закрывающий
ограничители и они должны быть одинаковыми.
@ 1,5 SAY "Введите сумму"
Может быть использована любая из трех разных пар
ограничителей. Если вторую пару требуется вложить внутрь первой,
то эта вторая должна отличаться от первой. Таким образом, три
вида ограничителей позволяют иметь три уровня вложенности.
Например :
? ["Добро пожаловать", сказал мэр города. ]
Числовые константы обозначают числа и могут использоваться в
арифметических операциях. Числовые константы не должны быть
ограничены чем-либо. Если число взято в ограничители, то оно
превращается в символьную константу и не может уже быть
использовано в вычислениях, кроме как аргумент функции VAL().
memvar = 0
Нулевые строки. Некоторые символьные операции дают результат, который
не содержит ничего. Он называется "нулевой строкой". Символьные
переменные, содержащие нулевую строку, можно создать сохранением
пустой строки (двух кавычек подряд). Длина нулевой строки равна
нулю.
null = ""
Переменные
Переменные временно хранят информацию в оперативной памяти
компьютера. Переменные и их значения уничтожаются при выполнении
команд RETURN, RELEASE ALL или CLEAR MEMORY если Вы не сохранили их
командой SAVE TO.
Имена переменных.
Имя, которое Вы присваиваете переменной, может содержать буквы,
цифры и символ подчеркивания (_). Первой в имени должна быть буква.
Имя может быть до 10 символов длиной. Клиппер разрешает иметь до 2048
активных переменных одновременно, если позволяет размер свободной
памяти. Переменные создаются командой STORE или используя знак
равенства как оператор присваивания :
STORE 0 TO price, total_cost
start_row = 5
Переменные можно сохранить в файле на диске командой SAVE TO.
Тип переменной устанавливается в момент ее создания, он соответствует
- 24 -
типу сохраняемой в ней величины. Например, если Вы сохраняете символы,
то будет создана переменная символьного типа. Переменная может иметь
такое же имя, как и поле базы данных. При совпадении имен поле базы
данных имеет приоритет перед переменной. Если имена переменной и поля
совпадают, а Вам нужно указать переменную, то используйте в качестве
синонима "M"
M-><эимя переменной>
Список переменных. Некоторые команды позволяют указывать несколько
переменных в качестве аргументов. Перечисляя их, отделяйте
каждую запятой, После запятой можно добавлять пробелы для
наглядности, поскольку для Клиппера пробелы не существенны.
Области определения переменных. Переменные классифицируются как
глобальные (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
Операторы
Клиппер использует четыре типа операторов :
Математические - производят вычисления над числовыми выражениями
Отношения - сравнивают два выражения и возвращают логическое
значение "истина" или "ложь"
Логические - сравнивают два логических выражения и возвращают
"истину" или "ложь"
Символьные - объединяют (конкатенация) два или более
символьных выражения
Математические Операторы
Таблица 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 -
Выражение состоит из одного или более элементов, вычисляемых
Клиппером. Эти элементы могут быть :
- полями
- переменными
- литералами (числовыми и символьными)
- функциями
- операторами
Различные типы выражений показаны следующим образом :
<эвыр> - может быть выражением любого типа
<эвырЧ> - числовое выражение
<эвырС> - символьное выражение
<эвырД> - датное выражение
<эвырЛ> - логическое выражение
Некоторые команды и функции требуют, чтобы Вы ввели указанное
количество выражений - параметров. Информация, требующаяся для
каждого выражения, будет объяснена в соответствующих разделах
определения команд и функций. Многочисленные параметры показаны в
виде <эвыр1>, <эвыр2> ,<эвыр3> и т.д., где каждое выражение отделено
запятой.
Примеры на каждый тип выражений :
? TRIM(Firstname) + " " + Lastname && символьное
? creditlimit + curbalance && числовое
? creditdate + 90 && датное
? curbalance > creditlimit && логическое
Правила синтаксиса.
Существуют правила использования команд и функций. Эти правила и
называются синтаксисом.
Команды.
Команда состоит по меньшей мере из одного слова , называемого
ключевым. Команда также может требовать дополнительной информации,
которую обеспечивает пользователь. Следующая команда, USE , открывает
файл Customers.dbf: USE Customers. Команды могут содержать
дополнительные ключевые слова и агументы, по желанию.
Продолжение командной строки.
Клиппер позволяет при написании программы продолжить на
следующую строку, закончив первую символом "точка с запятой". Каждая
строка может содержать до 256 символов, и , с учетом переносов,
практически нет предела количеству символов в описании команды.
Чтобы перенести символьную строку закончите ее символом кавычки
("), затем знак (+), затем точка с запятой (;). Вторая строка должна
начинаться с кавычки, содержать остаток строки , и заканчиваться
кавычкой.
@ 23,0 say "Вводите заказ только если кредит "+;
"подтвержден !"
- 29 -
Заметьте, что команда SET PATH TO не позволяет использовать
"точку с запятой" для продолжения строки. Смотри описание SET PATH TO
в главе 5.
Функции.
Функции состоят из ключевого слова, за которым следуют левая и
правая круглые скобки. Аргументы внутри этих скобок могут быть
обязательными или по желанию. Следующая функция, UPPER(), возвращает
символьный аргумент буквами верхнего регистра:
?UPPER(firstname)
Ключевые слова.
Для написания ключевых слов в настоящем руководстве использованы
большие буквы. Ключевые слова нельзя использовать в качестве имен
файлов, полей или переменных.
Символы.
Для различения, являются ли требуемая синтаксическая информация
обязательной или "по желанию" используются следующие символы.
[] квадратные скобки говорят, что эта часть команды не обязательна.
Не вводите сами скобки.
<> угловные скобки ограничивают информацию, которую Вы должны
задать, такую как имя базы данных, поле, файл или переменную.
Не вводите сами скобки.
... многоточие показывает, что здесь будет много строк команды,как
показано в синтаксисе команды DO CASE...CASE...ENDCASE.
/ косая черта означает "или-или". В этом случае одновременно можно
использовать только один из возможных вариантов.
ПРИМЕР СИНТАКСИСА:
LIST [OFF] [SCOPE <эсписок_полей>] [FOR <эусловие>] [WHILE
<эусловие>] [TO PRINT] [TO FILE<эимя файла>]
Вы предоставляете информацию, указанную буквами нижнего
регистра. Если в синтаксисе появляется запятая, то она должна быть
использована для разделения фраз.
МАКРОПОДСТАНОВКА.
Макроподстановка позволяет подставить в командную строку
содержимое символьной переменной. Содержимое этой переменной
понимается Клиппером буквально. Переменной должен предшествовать знак
(&).
Клипер позволяет использовать макроподстановку повсюду в
предложениях DO WHILE, а также использовать вложенные и рекурсивные
макроподстановки. Клипер должен знать все элементы команды в момент
компиляции программы, поэтому он может сразу проверить годность
каждого предложения и сгенерировать соответствующий объектный код.
Каждая, содержащая команду или функцию, строка должна содержать всю
- 30 -
требуемую пунктуацию.
ПРИМЕЧАНИЕ: макроподстановки не могут содержать команды или
любую их часть (включая запятые).
Следующая таблица показывает разрешенные и неразрешенные
макроподстановки.
Таблица 4-5. Макро в Клиппере
-------------------------------------------------------------------
можно нельзя
-------------------------------------------------------------------
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
ФУНКЦИИ, ОПРЕДЕЛЕННЫЕ ПОЛЬЗОВАТЕЛЕМ.
Клиппер дает Вам большие возможности, позволяя создавать свои
собственные функции. Это позволяет подстраивать Клиппер под Ваши
задачи.
Используется следующий формат:
FUNCTION <эимя>
*
* определение параметров, которые будут передаваться
* функции
*
[ PARAMETERS <эсписок переменных> ]
< предложения текста программы >
* затем команда RETURN , и значение которая функция
* возвращает
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 -
передаваемых Клиппером. Это предложение должно присутствовать, даже
если параметры не используются.
ВАЖНЫЕ ЗАМЕЧАНИЯ:
Нельзя использовать команды CLEAR и READ, т.к. они стирают все
недовведенные GETы. Для очистки экрана используйте "@ строка, столбец
CLEAR", для ввода данных команды WAIT,ACCEPT,MENU TO или функцию
INKEY().
Укажите конкретные инструкции для каждой переменной, как в
следующем примере:
* Пример контекстно-специфичной подсказки HELP.PRG
*
* Когда, перед вводом очередной переменной, нажата клавиша F1,
* Клиппер вызывает систему помощи, как если бы была выполнена команда
* 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
Деление на ноль
При попытке делить на ноль Клиппер выдаст сообщение об ошибке
исполнения программы. Такое иногда случается при делении на числовое
поле, которое не было проинициализировано. В таком случае будет
|