ГЛАВА 3
ВЫРАЖЕНИЯ
Аргументы команд PAL называются выражениями. Например, в команде MESSAGE:
MESSAGE "Tomorrow's date is", TODAY()+1
есть два аргумента: "Tomorrow's date is" и TODAY()+1.
Выражения состоят из:
- величин данных (констант);
- переменных и элементов массивов;
- операторов;
- спецификаторов полей;
- функций.
Эта глава описывает каждый из этих элементов и его применение. Здесь также описано:
- как выражения выводятся и вычисляются;
- как работать со строками, календарными датами и кодами клавиш в выражениях.
ЧТО ТАКОЕ ВЫРАЖЕНИЕ?
Выражением может являться величина или группа из одного или нескольких элементов, связанных различными операторами, обработка которых приводит к величине. Величины - это данные, имеющие один из типов: строковый, численный, тип валюты, короткий численный, тип календарных дат и логический. Так как команды выполняют действия над величинами, вы увидите, что многие из команд и функций PAL имеют выражения в качестве аргументов или параметров.
Вот некоторые примеры выражений:
5 ; число 5 (тип - численный) "abracadabra" ; строка abracadabra (тип - строковый) "Hi, "+"there" ; строка Hi, there (тип - строковый)
pi*(r*r) ; величина, получающаяся путем умножения ; величины переменной pi на квадрат ве ; личины переменной r (тип - численный) GETCHAR() ; код ASCII символа, вводимого с клавиа ; туры (тип - численный) TODAY()<12/31/87 ; истина или ложь в зависимости от ; сегодняшнего числа (тип - логический)
В первом выражении число 5 является примером численной величины. Вторая величина является строковой, а третья - сцеплением двух строковых величин. В четвертом выражении с помощью арифметических операторов обрабатываются величины переменных, пятое выражение является функцией, а последнее - сравнением между величиной функции и календарной датой. Длина выражения может быть не более 132 символов.
Типы данных
Выражения PAL оперируют с данными одного из шести типов:
- строковыми (строками длиной от 1 до 255 символов, обозначения:A1-A255);
- численными (N);
- типа валюты ($);
- короткими численными (S);
- календарными датами (D);
- логическими или булевыми (L).
Вы видите, что первые пять типов данных являются стандартными типами полей системы Paradox. Они подробно обсуждены в главе 2 руководства пользователя системы Paradox.
Последний тип данных - логический, доступен только внутри скриптов PAL, вы не можете использовать его в качестве поля таблицы (хотя вы можете получить эффект логического поля, используя шаблоны PAL, описание смотри в главе 5). Логические величины - это True и False. Например, выражение:
TODAY() < 12/31/87
дает величину TRUE, если текущая дата меньше, чем 31 декабря 1987 года, и величину False в ином случае.
Соблюдая некоторые ограничения, вы можете использовать в выражении несколько типов данных одновременно, а PAL автоматически присвоит значению выражения нужный тип. Ограничения и правила, используемые для определения типа смешанного выражения показаны в таблице 3-1.
Таблица 3-1. Тип результата смешанных выражений
Второй | | | | | | | элемент| | | | | | | | N | A | D | $ | S | L | Первый | | | | | | | элемент | | | | | | |
Числовой N | N | * | * | $ | N | * |
| | | | | | | Строковый A | * | A | * | * | * | * |
| | | | | | | Календарные | | | | | | | даты D | D | * | N | * | * | * |
| | | | | | | Валюта $ | $ | * | * | $ | $ | * |
| | | | | | | Короткий | | | | | | | числовой S | N | * | * | $ | S | * |
| | | | | | | Логический L | * | * | * | * | * | L |
| | | | | | |
Вычисление выражений
Выбирая опцию Value из меню PAL, можно вычислить значение текущего выражения в любой момент времени. Режим Value,работающий как калькулятор, позволяет вам выяснять величины переменных, элементов массива или любого выражения в процессе отладки, работая в системе Paradox. Дополнительная информация содержится в главе 8.
Порядок вычисления выражений обсуждается позднее в настоящей главе.
ЭЛЕМЕНТЫ ВЫРАЖЕНИЯ
Выражения PAL могут включать пять типов элементов:
- константы;
- переменные и элементы массивов;
- операторы;
- спецификаторы полей;
- функции (как встроенные, так и пользовательские).
Константы
Простейшими элементами выражения являются: строковые, числовые, календарные и логические константы. Константы - это величины, не меняющиеся в течении всего времени работы скрипта.
Строковые константы -------------------
Строковые константы называются также строками, так как они представляют собой набор символов ASCII. В командах PAL строковые константы всегда заключаются в кавычки для того, чтобы отличить их от ругих типов выражений. Длина строки может быть не более 255 символов. Например:
"Hello"
" This one contains punctuations,.! and spaces at the ends"
"99.994"
"1/31/85"
Хотя два последних примера выглядят как числовые и календарные величины, они являются строками, так как заключены в кавычки. Некоторые символы ASCII не могут быть введены непосрественно в строковую константу по одной из двух причин:
- для них не имеется соответствующей клавиши (как, например, для греческой буквы альфа и некоторых других символов IBM);
- соответствующая клавиша является специальной клавишей скрипта (как, например, кавычки) или редактора (как клавиша F10).
Существуют два способа включения этих символов в константу. Оба используют коды символов ASCII, перечисленные в приложении C.
- Держа клавишу {Alt} в нажатом состоянии, наберите на правой цифровой клавиатуре код ASCII требуемого символа. Например, чтобы ввести символ альфа, требуется набрать на правой клавиатуре число 224.
- Включите в строковую константу код ASCII требуемого символа, перед которым поставьте знак .
Ниже приведены несколько строк с использованием обратной косой черты ().
"Quote mark coming" ; текст заканчивается кавычками
"Backslash away\" ; текст заканчивается обратной
; косой чертой
"Give me a Ctrl-R: 18" ; текст заканчивается символом
; Ctrl-R
" 12" ; символ перевода страницы
Определенные, часто использдуемые коды ASCII, такие как символ табуляции (Ctrl-I) имеют специальные представления, похожие на те, что используются в языке Си. Эти представления,показанные в таблице 3-2, являются более предпочтительными в строковых константах, так как они более легко читаемы, чем их численные эквиваленты. Они наиболее часто используются для управления принтером в команде PRINT.
Любой символ, не указанный в таблице 3-2, если он встретится после обратной косой черты, воспринимается буквально - т.е. обратная косая черта игнорируется. Например, "a" является тем же самым, что и "a".
Таблица 3-2. Последовательности клавиш, начинающихся с "".
Последовательность Функция Эквивалент
клавиш
t Табуляция {Ctrl}{I} n Новая строка {Ctrl}{J} f Новая страница {Ctrl}{L} r Возврат каретки {Ctrl}{M} " Кавычки " \ Обратная косая черта
Числовые константы ------------------
Числовой константой называется любая последовательность цифр, перед которой может находиться знак "-" и внутри которого может содержаться десятичная точка.
Числа могут быть записаны также в форме, соержащей мантиссу и порядок, разделенные буквой E. Порядок может иметь знак "+" или "-".
Ниже приведены несколько примеров числовых констант:
25.
3.1514
-17.00000001
5.6E+9
Следует заметить, что числовые константы не должны содержать знака $ или разделителя чисел, и заключение их в скобки не меняет их знак.
Числовые константы запоминаются в шестидесятичетырехразрядные ячейки памяти для чисел с плавающей точкой и могут находиться в пределах от +/- 1.E-307 до +/- 1.E+308. Числа определены с точностью до 15 значащих цифр. Числовые константы могут быть использдованы для обозначения числовых (N), валютных ($), и коротких числовых величин (S).
Если при установке системы Paradox было введено, что она может быть использована в стране, имеющей отличный от США стандарт написания чисел, то числа будут выводиться в международном числовом формате (т.е. число одна тысяча сорок шесть и семь десятых будет представлено как 1.046,7 ). Формат чисел может быть изменен с использованием программы задания конфигурации покупателя ( см. главу 14 руководства пользователя системы Paradox).
Если вы используете международный формат для чисел и валюты, все операции будут производиться с числами в этом формате, при одном исключении: ввод числовых констант в выражение. Если вы хотите ввести числовую константу в выражение необходимо использовать американский формат чисел. Таким образом, следующие выражения правильны:
y=2.1
x=y+3.2
даже если используется международное соглашение о формате чисел.
Использование численных констант в условиях действия международного соглашения показано ниже:
x=23.5 ; присвоение только с использованием амери ; канского соглашения
@1,1??x ; будет высвечено число 23,5
y=2.4 ;
@2,2??x+y ; будет высвечено 25,9
z=strval(25,99) ; числовые параметры необходимо передавать с
; использованием американского формата
Календарные константы ---------------------
Календарные константы могут представляться как в виде: mm/dd/yyyy, dd-Mon-yyyy или dd.mm.yyyy . Для чисел двадцатого столетия первые две цифры года можно опустить. Например, следующие даты эквивалентны:
12/17/1983
12/17/83
17-Dec-1983
17.12.83
Даты, принадлежащие к первому тысячелетию, должны содержать три или четыре цифры года ( например, 12/17/043 или 12/17/0043). Этого опускать нельзя. Календарная константа должна иметь смысл. Системе Paradox известно, какие месяцы содержат 30 дней и какие - 31, а также в какие годы февраль содержит 29 дней. Система Paradox знает также, в какие столетия изменялся календарь. Полная информация о работе с датами содержится в главе 2 руководства пользователя системы Paradox.
Логические константы --------------------
Существуют две логические константы:
True
False
Вы можете вводить их в верхнем, нижнем регистре, или используя буквы обоих регистров. Используя функцию FORMAT, (см. главы 5 и 21) можно изменить значения логических выражений с True/False на On/Off или Yes/No.
Незаполненные величины
В системе Paradox, если поле не содержит данных, то его величина считается незаполненной. Величина любого из выражений PAL (кроме логических выражений) может быть также незаполненной. Незаполненная строковая величина обозначается пустой строкой (""), а не пробелом ( код ASCII равен 32). Незаполненные числа и даты генерируются соответственно функциями BLANKNUM и BLANKDATE. Для проверки, является ли переменная незаполненной, используется функция ISBLANK.
Если вы хотите, чтобы величина численного поля таблицы системы Paradox была равна 0, то следует ввести это значение а не оставлять поле незаполненным.
С помощью специальной опции Blank=Zero вводится режим, в котором система Paradox считает все незаполненные величины нулевыми. Если не выбран этот режим, то любое вычисление выражения, содержащего незаполненные величины, приведет к ошибке скрипта. Для проверки, установлен ли этот режим, используется функция ISBLANKZERO.
Переменные и массивы
Переменная предназначена для временного хранения единицы информации, используемой в скрипте. Массив преставлдяет собой набор переменных.
Имена переменных и массивов должны начинаться с буквы, иметь длину не более 132 символов и не содержать пробелов. Переменные нельзя называть именами, идентичными командам и функциям PAL. Детали правил именования изложены в главе 7.
Переменные ----------
Переменные используются для временного хранения величин любого типа данных PAL. Существование переменной начинается с присвоения ей величины - нет необходимости явно определять переменную. Например:
x="abc"
присваивает строковую величину "abc" переменной x. Если этой переменной ранее была присвоена другая величина, она окажется потеряной.
Определенные команды, такие как FOR, SHOWMENU, ACCEPT и LOCATE, также в ходе своего выполнения присваивают величины переменным.
Перед тем, как использовать переменную в выражении, ей необходимо присвоить величину. Если, например, команда:
MESSAGE "The value of x is ", x
выполняется перед тем, как переменной x присвоена величина, возникает ошибка скрипта. Для проверки, присвоена ли переменной величина, можно использовать функцию ISASSIGNED. Заметьте, что переменным любого типа, кроме логического, можно присвоить незаполненную величину (см. выше).
Вы можете использовать в программе столько переменных, сколько вам необходимо. Переменные размещаются в памяти с помощью системы управления виртуальной памятью системы Paradox, что предоставляет в ваше распоряжение практически неограниченный объем памяти.
Нет необходимости явно задавать типы переменных PAL. Типом переменной является просто тип величины, которая присвоена ей в настоящей момент. Например, последовательность команд:
x="abc"
x=5+5
x=7-Dec-1987
приводит к тому, что x сначала становится строковой переменной, затем числовой, а затем календарной.
Для включения величины переменной в выражение достаточно просто ввести туда ее имя. Несколько примеров:
MESSAGE "The value of x is ", x ; высвечивает величину x
MOVETO [Date Hired] ; передвигается к полю TYPEIN hired ; Date Hired и вводит вели ; чину переменной hired
IF NOT (ISASSIGNED(rank)) ; присваивает 0 переменной
THEN rank=0 ; rank, если она неопределе ENDIF ; на
Для использования переменной в формулировке запроса перед ее именем поставьте знак ~ (тильда), как показано на рис.3-1.
Извне тел процедур переменные PAL всегда глобальны - они сохраняют свои величины в течении всего сеанса работы с системой Paradox. Например, вы можете присвоить величину переменной в одном скрипте и использовать ее в другом скрипте. Величина переменной забывается, если:
- вы вышли из системы Paradox;
- вы присвоили другую величину;
- вы освободили переменную с помощью команды RELEASE.
Внутри процедур правила для определения области видимости переменной более сложны (см. главу 6).
Скрипт на рис.3-1 предназначен для нахождения заказчика, чье имя присвоено переменной "name". Если заказчик найден, высвечивается соответствующая запись, если нет, то высвечивается сообщение.
QUERY
Customer | Cust ID | Last Name | Init | Street | City |
| Check | Check~Name | Check | Check | Check |
| | | | | | | | | | | |
ENDQUERY
DO_IT! ; выполнение запроса
IF (ISEMPTY("Answer")) ; не найдено
THEN MESSAGE name, "was not found" ELSE
FORMKEY ; режим просмотра WAIT RECORD ; пока пользователь смотрит за ; пись MESSAGE "Press F2 when done" UNTIL "F2"
ENDIF
Рис 3-1. Использование переменных с тильдой в запросах.
По желанию можно использовать команду SAVEVARS для сохранения текущих величин определенных (или всех) переменных в специальном скрипте, который сохраняется в файле savevars. Вы можете востановить переменные, запустив этот скрипт. Это средство весьма полезно для отладки, так как оно позволяет получить "слепок" текущего состояния скрипта.
Считается хорошим тоном в программировании удалять из памяти все переменные с помощью функции RELEASE перед окончанием работы прикладной системы или скрипта верхнего уровня и передачей управления системе Paradox. Это высвобождает память, занятую переменными и гарантирует, что их значения не будут случайно переданы скриптам, запускаемым позднее. Конечно,если вы хотите передать данные другому скрипту, запускаемому позднее в этом же сеансе работы системы Paradox, вам не следует использовать RELEASE. Но если вы не удалили переменные, имейте в виду, что пользователь может изменить значение переменных в режиме MiniScript меню PAL или запустить другой скрипт, использующий те же самые имена переменных.
Заметьте, что, если вы используете процедуры, ограниченные переменные автоматически удаляются при завершении каждой процедуры. Кроме того, при завершении скрытых процедур автоматически удаляются все переменные, определенные внутри них. Подробности см. в главе 6.
Существуют три системных переменных, используемых в PAL - retval, autolib, errorproc. Эти переменные, их применение описано в разделе "Системные переменные" главы 7.
Массивы -------
Массивы используются для сохранения групп величин. Наиболее важным способом их использования в PAL является сохранение и манипулирование записями.
В отличие от переменных массивы надо объявлять перед их использованием (исключение составляют массивы, созданные командой COPYTOARRAY). Объявление производится с помощью команды ARRAY. При этом в памяти выделяется пространство для объявляемого массива. В команде ARRAY вы можете использовать любое численное выражение, например:
ARRAY a[5]
и
x=2
ARRAY a[x+3]
объявляют один и тот же массив, состоящий из пяти элементов.
Массивы PAL являются одномерными. Заметьте, что вам необязательно объявлять тип данных для всего массива, так как его элементы могут иметь различные типы. Как и для переменных для массивов память автоматичеки выделяется системой управления виртуальной памятью. Вы можете объявить столько массивов, сколько вам необходимо, причем длина каждого может быть до 15 000 элементов. Элементы массива определяются индексами, заключенными в квадратные скобки; например a[2] обозначает второй элемент массива a. Вы можете рассматривать каждый элемент массива как отдельную переменную, так как правила их использования не отличаются друг от друга. Как и для переменных, для элементов массива важно, чтобы они были определены перед тем, как они используются в выражении:
ARRAY b[5] ; объявление массива b из пяти элементов x=2 ; присвоение переменной x величины 2 b[x+1]=190 ; присвоение переменной b[3] величины 190
@2,0?b[3]+2 ; вывод величины 192
@4,0?b[4]+2 ; ошибка скрипта так как b[4] не определено
В выражении b[x+1] x+1 называется индексным выражением. Индексное выражение должно давать целое значение между 1 и размером массива, к которому происходит обращение. В особых условиях значением индексного выражения может быть имя поля таблицы системы Paradox. Эти вопросы рассмотрены в описании команд в COPYTOARRAY и COPYFROMARRAY в главе 14.
В отличие от большинства языков программирования PAL позволяет запоминать в одном массиве элементы данных различных типов. Например, следующий участок программы абсолютно правилен:
ARRAY b[3] ; объявление массива b из трех элементов b[1]="abc" ; присвоение элементу b[1] строковой величины b[2]=3.1415 ; присвоение элементу b[2] числовой величины b[3]=12/17/86; присвоение элементу b[3] календарной величины
Переопределение элемента массива приводит к потере предыдущей величины и может изменить тип элемента. Как и переменные, массивы и их элементы сохраняют свои величины в течение всего сеанса работы с системой Paradox. Для удаления массивов можно использовать команду RELEASE VARS. Если массив удален или переопределен, его предыдущее определение и величины всех его элементов теряются.
Если массив определен внутри процедуры, то правила его использования несколько сложны (см. главу 6). Массивы особенно полезны для временного хранения записей таблицы системы Paradox. Например, вы хотите отредактировать запись или перенести ее из одной таблицы в другую. Для этого можно использовать массивы.
Для облегчения работы с записями и массивими существуют специальные команды PAL COPYTOARRAY и COPYFROMARRAY. При их использовании вы можете обозначать элементы массива с помощью имен полей соответствующей записи, используя эти имена в качестве индексов. Подробности и примеры работы с массивами и записями смотри в главе 14.
Операторы
Для обработки величин и элементов данных в выражениях вы можете использовать операторы. В таблице 3-3 содержится полный список операторов языка PAL.
Таблица 3-3. Операторы PAL.
Оператор Функция
Строковые (A)
+ сцепление
Числовые (N,$,S)
+ сложение - вычитание или замена знака * умножение / деление Календарные (D) + сложение - вычитание или интервал дней Сравнение = равно <> не равно < меньше чем <= меньше или равно > больше чем >= больше или равно Логические (L) AND логическое И OR логическое ИЛИ NOT логическое НЕТ
В примерах этого раздела предполагается, что переменным присвоены следующие величины:
Age=50.2
Deathly=" Tax"
NewYear=1-Jan-1987
Оператор + ----------
Действие оператора + зависит от типа выражения, над которым производится операция:
- число + число - сложение двух чисел;
- строка + строка - сцепление двух строк;
- календарная дата + число - добавление определенного числа дней к календарной дате.
45+50.2+5 ; дает величину 100.2 45+Age+5 ; дает величину 100.2 "Income"+" Tax" ; дает строку "Income Tax" "Income"+Deathly; дает строку "Income Tax" 12/17/83+7 ; дает дату 12/24/83 NewYear+1 ; дает дату 2-Jan-87
Все остальные случаи употребления оператора + с различными типами данных не разрешены. Например, пятый пример не может быть написан в виде 7+12/17/83, так как порядок "число + дата" не разрешен.
Оператор - ----------
Оператор - используется в следующих случаях:
- число - число - вычитание второго числа из первого;
- -число - изменяет знак числа на противоположный (унарная операция);
- дата - число - вычитает определенное число дней из календарной даты;
- дата - дата - вычисляет интервал между датами в днях.
76.5-Age ; дает 26.3
-Age ; дает -50.2
NewYear-3 ; дает 28-Dec-1986
Today()-NewYear; дает число дней, прошедших после первого
; января 1987 года
Ни какие другие комбинации аргументов в операции "-" не разрешены. В частности, не разрешается использование оператора "-" со строковыми аргументами. Однако существуют функции для выделения подстрок из строки, смотри раздел "Работа со строками".
Операторы * и / ---------------
Операторы умножения (*) и деления (/) используются только с числовыми аргументами. Умножение или деление на ноль дает в результате ноль ( т.е. деление на ноль не приводит к ошибке, для обработки этой ситуации как ошибки следует написать простую процедуру).
Операторы сравнения -------------------
Операторы сравнения, перечисленные в таблице 3-3, используются для сравнения величин любого типа данных, включая логический. Результат операции имеет логический тип. Действия операторов сравнения зависит от типа сравниваемых аргументов.
Таблица 3-4. Правила сравнения.
Тип данных Порядок сравнения Упорядочение
числовой порядок чисел меньшие<больших строковый алфавитный порядок зависит от порядка сортировки(*) календарный хронологический ранние < поздних порядок логический False<True
- сравнение строковых величин зависит от порядка сортировки,
устанавливаемого файлом PARADOX3.SOR. В порядке сортировки, задаваемом ASCII, A<Z<a<z, но это не верно для других порядков сортировки, например для словарного порядка (когда символы сортируются
в алфавитном порядке, независимо от регистра). Подробности о порядке сортировки содержатся в главе 2 руководства пользователя
системы Paradox. Порядок сортировки, используемый системой
Paradox, определяется в момент установки системы, но может изменяться (смотри главу 14 руководства пользователя системы Paradox).
Считается, что незаполненные величины меньше чем любые другие величины того же типа данных. При сравнении данных различных типов знак "<>" дает величину True, а другие операторы возвращают False. Например:
5 + 1 < 6 * 2 ; True
Age>21 ; True
7/4/1776 = NewYear; False, так как даты не совпадают
"Abc"="ABC" ; False, так как не совпадает регистр
"Abc">"ABC" ; True в порядке ASCII, иначе False
Age>Age+5 ; False
3="Abc" ; False, так как не совпадают типы 3<>"Abc" ; True, так как не совпадают типы
Заметьте, что знак равенства используется и как оператор сравнения внутри выражений, и как операция присваивания. Знак равенства рассматривается как оператор присваивания, если слева от него стоит имя переменной, иначе переменные справа и слева от знака равенства сравниваются. Допускается использование нескольких знаков равенства подряд, например:
x=3=3
При этом первый знак "=" - это оператор присваивания, а второй - оператор сравнения. Чтобы избежать путаницы, следует писать так:
x=(3=3)
Логические операторы (AND,OR,NOT) ---------------------------------
Логические выражения используются в качестве аргументов логических операторов:
- x AND y дает True, если оба аргумента True
- x OR y дает True, если хотя бы один из аргументов True
- NOT x дает True, если аргумент False.
Так, например:
3 =4 AND 7 = 8 ; False,так как оба аргумента False 3 =4 OR 7 = 8 ; False,так как оба аргумента False 3 =3 OR 7 = 8 ; True,так как первый аргумент True NOT(3 =4 AND 7 = 8); True,так как аргумент False
NOT False ; True,так как аргумент False 3 <>4 ; True.
Заметьте разницу между оператором сравнения "<>" и логическим оператором NOT. Оператор "<>" сравнивает две величины, а оператор NOT отрицает логическую величину.
Порядок вычисления ------------------
В выражениях, содержащих более одного оператора, операции производятся в порядке предпочтения, указанном в таблице 3-5. Любое выражение, заключенное в скобки, вычисляется первым, при этом раньше всего обрабатываются выражения в самых внутренних скобках. Если встречаются подряд несколько операторов с одинаковым приоритетом, они обрабатываются слева направо.
Таблица 3-5. Порядок предпочтения операций PAL.
Приоритет Операции
1 () 2 *, / 3 +, - 4 =, <>, <, <=, >, >= 5 NOT 6 AND 7 OR
Спецификаторы полей
Спецификаторы полей PAL облегчают использование величин полей в образцах рабочей области системы Paradox. Все спецификаторы полей заключаются в квадратные скобки, как показано в таблице 3-6. Они всегда указывают на текущую запись образца.
Спецификаторы полей можно использовать для обращения к полям текущих таблиц и в образцах запросов. Причем нет никакой разницы между тем, находится ли образец в виде таблицы или в виде формы.
В текущем образце текущим полем называется то поле, где находится курсор. В других образцах текущим полем считается то, где был курсор в последний раз при последнем обращении к ним.
При использовании спецификатора поля в выражении он обычно замещает величину введенную в поле. Исключением является команда MOVETO, описанная далее в этой главе. В высвечиваемом образце величина имеет тот же самый тип данных, что и поле. В образце запроса величина должна быть строковым представлением содержимого поля.
Таблица 3-6. Спецификаторы полей.
Формат Значение
[] текущее поле текущего образца [#] текущий номер записи текущего образца [field] поле field текущего образца [table->] текущее поле таблицы table [table->field] поле field таблицы table [table(n)->] текущее поле n-го образца таблицы table [table(n)->field] поле field n-го образца таблицы table [table(Q)->] текущее поле образца запроса таблицы table [table(Q)->field] поле field образца запроса таблицы table
Использование спецификаторов полей в выражениях -----------------------------------------------
Спецификаторы полей можно использовать в выражениях так же, как используются константы и переменные. Например:
x = 3 + [] ; присваивает x значение суммы 3 и ве ; личины текущего поля IF ([Date] > 1/1/86) ; проверяет, больше ли значение поля ; Date, чем 1/1/86 []=x ; присваивает величину x текущему полю
Как показано в последнем примере, можно изменять величину поля в образце, определяя поле слева от знака "=". Например:
[Quantity] = [Quantity]+1
увеличивает на единицу величину поля Quantity текущей записи текущего образца.
Предположим, что рабочая область выглядит так, как на рис 3-2, причем курсор находится в поле City, таблицы Customer. Метки на рисунке указывают, какому из полей соответствует каждый спецификатор поля. Когда в рабочей области находится более чем один образец какой либо таблицы, необходимо указывать, какой из них вы имеете в виду. По умолчанию принимается текущий образец. При обращении к высвечиваемому образцу не учитываются образцы запросов и номер образца соответствует порядковому номеру высвечиваемого образца таблицы, считая с вершины рабочей области.
Viewing Customer table 7-24 Main Record 19 of 33
ORDERS---Order #-Cust ID---Stock $--Quant----Date-----Emp #--- find ^| | 9884 ^^| | | | |
| | | | | | | | | | | | | |
(^ - [orders(Q) -> #], ^^ - [orders(Q) -> Cust ID]).
ORDERS---Order #-Cust ID---Stock $--Quant----Date-----Emp #--- 1 | 2200 | 4277 | 130 ^| 1 | 4/22/87| 775 | 2 | 3351 | 3266 | 519 | 1 |12/16/90| 422 | 3 | 8870 | 6125 | 632 | 8 | 6/04/90| 146 | 4 | 6236 | 2779 | 890 | 1 | 8/01/88| 517 | 5 | 1442 | 9004 | 519 | 2 |10/27/86| 146 |
| | | | | | |
(^ - [orders(Q) -> Stock #]).
CUSTOMER--Cust ID----Last Name--Init-----Street---------City----- 19 ^^^^| 5720|Helas ^^^ | D |52 Red Street |Cambridge^,^^| 20 | 5055|Chin | F |Hotel Orient |Jurong | 21 | 6125|Hawes-Andersen| D |Waves Cottage |Palm Springs | 22 | 6666|Matthews | J |10 12th Street|New York |
| | | | | |
(^ - [], ^^ - [customer ->], ^^^ - [customer -> Last Name], ^^^^ - [#]).
ORDERS---Order #-Cust ID---Stock $--Quant----Date-----Emp #--- 1 | 2200 | 4277 ^| 130 | 1 | 4/22/87| 775 | 2 | 3351 | 3266 | 519 | 1 |12/16/90| 422 | 3 | 8870 | 6125 | 632 | 8 | 6/04/90| 146 | 4 | 6236 | 2779 | 890 | 1 | 8/01/88| 517 | 5 | 1442 | 9004 | 519 | 2 |10/27/86| 146 |
| | | | | | |
(^ - [orders(2) -> Cust ID]).
Рис. 3-2. Обращение к полям.
Использование спецификатора полей в операторе присваивания допустимо только тогда, когда система Paradox находится в режиме Edit или Coedit. Это эквивалентно:
- передвижению курсора к выделенному полю таблицы;
- очистке этого поля;
- введению новой величины;
- возврату курсора в первоначальное положение.
Тип вводимой в поле величины должен быть совместим с типом поля, т.е. вы не сможете присвоить значение календарной даты числовому полю. Однако, вы можете свободно обращаться с полями чис лового типа и типа валюты.
Перемещение в заданное поле ---------------------------
В команде MOVETO, предназначенной для перемещения курсора в заданное поле, можно также использовать спецификатор поля. Например,
MOVETO[Orders(Q) -> Date]
перемещает курсор в поле Date образца запроса к таблице Orders. Для этого же вы можете использовать ключевой слово FIELD.
MOVETO FIELD "Date"
Кроме того, команда MOVETO может быть исподльзована для перемещения к определенному образцу или записи:
MOVETO 3 ; перемещение к третьему образцу MOVETO RECORD 55 ; перемещение к 55 записи текущего образца
Функции
Функции выглядят похожими на команды, но на самом деле является встроенными формулами, вычисляющими величины для вашего скрипта или выражения. PAL обладает обширной библиотекой встроенных функций для:
- поиска, обработки и форматирования строк;
- обработки календарных дат и времени;
- выполнения тригонометрических и логарифмических вычислений;
- выполнение статистических вычислений, таких как нахождение среднего и стандартного отклонения;
- выполнение финансовых вычислений;
- преобразование величин из одного типа данных в другой;
- обмена информацией с экраном, клавиатурой, принтером и файлами;
- получения информации о таблицах, образцах и текущем состоянии системы Paradox.
Вы можете определить ваши собственные функции, используя процедуры. Функции используются путем обращения к ним - введения в скрипт имени функции, за которым следует список аргументов в скобках. Так как функции вычисляют величины, они почти всегда используются справа от знака присваивания, например:
Num = SQRT(49) ; переменной Num присваивается зна
; чение 7 Str = UPPER("abc") ; переменной Str присваивается зна
; чение "ABC" Tym = TIME() ; переменной Tym присваивается зна ; чение текущего времени Result=UPPER(GETCHAR()) ; Символ, введенный с клавиатуры, ; обращается в верхний регистр и ; присваивается переменной Result
NewDate = Future(TODAY()); переменной NewDate присваивается
; величины, вычисленная пользова ; тельской функцией Future
Заметьте, что скобки после имени функции необходимы , даже если она не имеет аргументов. Последние два примера показывают, что аргументы могут быть в виде любого допустимого выражения, включая обращения к любой другой функции.
Справочник функций в главе 21 содержит полный список функций PAL. Некоторые из них описаны в следующем разделе.
ОПЕРАЦИИ С ВЕЛИЧИНАМИ
Операции со строками
Сцепление и сравнение строк ---------------------------
Операция сцепления строк обозначается "+", например:
Pgm= "Pair a " + "docks"
обозначает присвоение Pgm значения "Pair a docks". Вы можете сцеплять строки, общая длина которых не превосходит 255 символов, в противном случае возникнет ошибка.
Вы можете также сравнивать строки. Обрабатывая операторы "=" и "<>", система Paradox проверяет точное совпадение строк. Например, используя строку, определенную выше, мы можем сравнить:
IF (Pgm="Paradox")
THEN MESSAGE "By jove, they're the same!"
ELSE MESSAGE "Sorry, no match"
ENDIF
Если переменной Pgm присвоено "Pair a docks" или даже "Paradox " (обратите внимание на пробел в конце слова) - точного посимвольного совпадения не будет. Для того, чтобы две строки были равными, требуется, чтобы они содержали одинаковое число символов и эти символы совпадали.
Для строк можно использовать также операторы "<" и ">". При этом PAL сравнивает первые символы строк. Если они совпадают PAL переходит ко вторым символам и начинает сравнивать их, и так до тех пор, пока не будут найдены несовпадающие символы, которые сравниваются по правилам сравнения для символов. Упорядочение строк происводится в соответствии с текущим файлом PARADOX3.SOR :
"A" < "B" ; для всех порядков сортировки "A" < "a" ; для сортировки по кодам ASCII "Pair a docks" < "Paradox" ; так как для первых несовпадаю ; щих символов верно "i" < "r"
Функции над строками --------------------
Для работы со строками предназначены функции PAL, перечисленные в таблице 3-7. Они описаны подробнее в главе 21.
Таблица 3-7. Функции над строками.
Тип Функция Действие
преобразование ASC преобразует символ в код ASCII CHR преобразует код ASCII в символ DATEVAL преобразует строку в календ. дату LOWER преобразует символы в нижний регистр NUMVAL преобразует строку в число STRVAL преобразует любой тип данных в строку UPPER преобразует символы в верхний регистр информация LEN вычисляет длину строки MATCH проверяет соответствие строки шаблону SEARCH вычисляет позицию подстроки в строке разное FILL заполняет всю строку определенным символом FORMAT форматирует строку определенным образом MENUCHOICE возвращает имя текущего режима меню SPACES заполняет строку пробелами SUBSTR выделяет подстроку из строки WINDOW возвоащает текущее сообщение в окно
Заметьте, что функции NUMVAL и DATEVAL, преобразуют строки в календарные даты и числа. Если вы хотите выполнить арифметические операции с датами или числами, записанными в виде строк, следует сначала использовать эти функции, затем выполнить операции, а после этого с помощью STRVAL перевести результат в строковый тип. Например:
TextNum = "209"
TextNum = STRVAL(NUMVAL(TextNum)-35)
Операции с календарными датами
Форматы календарных дат -----------------------
PAL поддерживает одинадцать различных форматов для вывода календарных дат, как показано на таблице 3-8.
Таблица 3-8. Форматы календарных дат.
Маска формата Пример
1 mm/dd/yy 7/22/89 2 Month dd,yyyy Juli 22,1989 3 mm/dd 7/22 4 mm/yy 7/89 5 dd-Mon-yy 22-Jul-89 6 Mon yy Jul 89 7 dd-Mon-yyyy 22-Jul-89 8 mm/dd/yyyy 7/22/1989 9 * dd.mm.yy 22.07.89 10 * dd/mm/yy 22/07/89 11 * yy-mm-dd 89-07-22
* - форматы, не поддерживаемые системой Paradox версий 1.0, 1.1.
Функция FORMAT используется для вывода календарных дат в любом из перечисленных форматов независимо от того, в каком виде даты хранятся в таблице. Для печати даты в формате 7 следует задать спецификатор d7 в качестве параметра функции FORMAT:
d = FORMAT ("d7", 7/22/1987) ; d = 22-Jul-1987
или используя спецификатор поля:
d = FORMAT ("d7", [Date Hired])
Заметьте, что для заполнения оставшихся позиций, если день или месяц содержит одну цифру, пробелы используются в начале даты, а нули можно использовать в остальных случаях. Это касается всех форматов кроме второго.
Операции с календарными датами ------------------------------
Если календарные даты представлены в одном из трех внутренних форматов системы Paradox, их можно использовать в вычислениях. Для сравнения двух дат и нахождения промежутка между ними можно использовать операторы "+" и "-".
SendCards = 12/25/87 - 12 ; присваивает дату за 12 дней
; до рождества Returns = 12/25/87 + 7 ; присваивает дату на семь
; дней позже рождества Shopping = 12/25/87 - 9/1/87 ; присваивает количество дней
; от первого сентября до рож ; дества
Операторы сравнения календарных дат можно использовать даже если они выражены в различных форматах:
DaysLeft = 12-25-87 - 22-Jul-87
Более ранние даты считаются меньшими, чем более поздние. Операторы "*" и "/" к датам не применяются.
Функции над календарными датами -------------------------------
Для обработки календарных дат предназначены функции PAL, описанные в таблице 3-9. Подробное их описание содержится в справочнике функций в главе 21.
Таблица 3-9. Функции над календарными датами.
Функция Действие
BLANKDATE генерирует незаполненную дату DATEVAL преобразует строку в дату DAY возвращает день месяца DOW возвращает день недели в виде строки MONTH возвращает номер месяца MOY возвращает имя месяца в виде строки STRVAL преобразует дату к строковому виду TIME возвращает текущее время * TODAY возвращает текущую дату * YEAR возвращает номер года из четырех цифр
- - основана на системных часах компьютера
Функции над датами работают с календарными датами, выраженными в одном из трех внутренних форматов.
Шаблоны календарных дат -----------------------
Чтобы узнать даты определенного месяца года, можно использовать операторы шаблонов, описанные в главе 4 руководства пользователя системы Paradox. Вспомним, что оператор @ заменяет любой одиночный символ, а оператор ".." заменяет последовательность из любого числа символов. Вы можете пользоваться этими операторами, строя поле календарных дат запроса:
../../63 ; для поиска любой даты в 1963 году 6/../63 ; для поиска любой даты в июне 1963 года ../../6@ ; для поиска любой даты в 1960-ых годах
Заметьте, что шаблон, используемый в запросе, должен отражать текущий формат дат, установленный по умолчанию. Например, если установлен формат dd-Mon-yy, то примеры,приведенные выше не будут работать.
Хотя не возможно использовать операторы шаблонов в выражениях над датами, результатов можно достичь, используя функции над датами, как это сделано в следующих фрагментах программ:
IF(YEAR([Date]) = 1963) ; для поиска любой даты
; 1963 года ...
IF(MONTH([Date]) = 6 ; для поиска любой даты AND (YEAR([Date]) = 1963)) ; в июле 1963 года
...
IF(YEAR([Date]) >= 1960) ; для поиска любой даты в AND (YEAR([Date]) <= 1969)) ; 1960-ые годы
...
Коды клавиш PAL
Определенные команды и функции PAL, особенно такие как ASC, KEYPRESS,SETKEY и WAIT , требуют кодов клавиш в качестве аргументов. Используя эти коды клавиш, можно представить любую клавишу клавиатуры или их комбинацию, а также любой символ в виде кода ASCII или расширенного кода IBM. Коды клавиш имеют несколько видов:
- строки из одного символа;
- строки, представляющие имена функциональных клавиш;
- строки, представляющие имена специальных клавиш;
- положительные числа, представляющие коды ASCII;
- отрицательные числа, представляющие расширенные коды IBM.
Как будет показано ниже, ко многим клавишам можно обращаться несколькими путями, а к некоторым - только одним способом. Наиболее удобный метод может быть выбран только вами. Все коды клавиш PAL перечислены в приложении B настоящего руководства.
Строки из одного символа ------------------------
Буквы, цифры и другие символы, которые могут быть введены с клавиатуры, можно вводить в программу в качестве строк из одного символа. Например:
"A" ; заглавная буква A
"a" ; строчная буква a
"5" ; цифра пять
Кроме букв и цифр, вы можете обращаться к следующим символам:
! @ # $ % ^ & * ( ) _ - + = { } [ ] : ; ' ~ < , > . ? / | "
Символы, которые не могут быть введены непосредственно с клавиатуры, вводятся так: держа в нажатом состоянии клавишу {Alt}, набираем на цифровой клавиатуре код требуемого символа. Например, чтобы ввести символ, код которого 254, введите {Alt} 254 (на цифровой панели). При этом на экране появится символ "¦" .
Для опрделенных символов можно использовать коды с обратной косой чертой:
"t" ; соответствует знаку табуляции {Ctrl}{I} "n" ; соответствует знаку перехода на новую стро ; ку {Ctrl}{J} "f" ; соответствует знаку перехода на новую страни ; цу {Ctrl}{L} "r" ; соответствует знаку возврата каретки ; {Ctrl}{M} """ ; соответствует знаку " "\" ; соответствует знаку "t" ; соответствует знаку табуляции {Ctrl}{I}
Для обращения к любой другой клавише вам необходимо воспользоваться одним из четырех методов, описанных ниже.
Функциональные клавиши ----------------------
Для обращения к функциональным клавишам и их комбинациям можно использовать строки от "F1" до "F40":
- от "F1" до "F10" соответствует десяти функциональным клавишам;
- от "F11" до "F20" соответствует десяти функциональным клавишам, нажатым совместно с {Shift};
- от "F21" до "F30" соответствует десяти функциональным клавишам, нажатым совместно с {Ctrl};
- от "F31" до "F40" соответствует десяти функциональным клавишам, нажатым совместно с {Alt}.
Например:
"F1" ; соответствует {F1} "F13" ; соответствует {Shift}{F3} "F31" ; соответствует {Alt}{F1}
Имена клавиш, принятые в системе Paradox ----------------------------------------
Специальные клавиши системы Paradox, такие как Do_It {F2}, Rotate {Ctrl}{R}, а также {Home}, имеют специальные имена, которыми они обозначаются в скриптах. Эти имена можно использовать в выражениях. Например:
DO_IT ; соответствует {F2} INSTANTRECORD ; соответствует {Alt}{F3}
ROTATE ; соответствует {Ctrl}{R} HOME ; соответствует {Home}
При написании имен специальных клавиш можно пользоваться как верхним, так и нижним регистром.
Положительные величины кодов ASCII ----------------------------------
ASCII (стандартный код информационного обмена США) является стандартным способом описания группы символов, используемых IBM PC и совместимыми ЭВМ. Вы можете использовать любой из этих 256 положительных десятичных кодов для обращения к соответсвующему символу. Например:
65 ; соответствует заглавной букве A
18 ; соответствует {Ctrl}{R}
255 ; соответствует символу "¦"
Полный набор кодов ASCII и соответствующих им символов представлен в приложении C.
Отрицательные величины расширенных кодов IBM --------------------------------------------
Фирма IBM установила дополнительный набор кодов для обращения к важным клавишам и их комбинациям, не представленным в наборе символов ASCII. Расширенные коды IBM соответствуют:
- всем клавишам управления курсором;
- комбинациям клавиш с клавишей {Alt};
- функциональным клавишам, нажатым отдельно или совместно с {Shift}, {Ctrl}, {Alt}.
Расширенные коды являются отрицательными числами от -132 до -1. Например:
-30 ; соответствует {Alt}{A}
-71 ; соответствует {Home}
-104 ; соответствует {Alt}{F1}
При задании отрицательного кода будьте осторожны. Положительные номера соответствуют обычным кодам ASCII, а отрицательные - расширенным кодам IBM. Полный набор кодов ASCII и IBM представлен в приложении B.
Использование кодов в выражениях --------------------------------
Итак, вы видите, что для обращения к большинству клавиш существует несколько способов. Например, все команды, приведенные ниже, дают возможность пользователю изучать таблицу в рабочей области до тех пор, пока он не нажмет клавишу Do_It! :
WAIT TABLE UNTIL "F2" ; представлена именем функциональ
; ной клавиши
WAIT TABLE UNTIL DO_IT! ; представлена именем специальной
; клавиши системы Paradox
WAIT TABLE UNTIL -60 ; представлена расширенным кодом
; IBM
Альтернативные формы обращения к одной и той же клавише перечисленны в приложении B. Клавишу можно также представить в виде выражения, возвращающего один из допустимых кодов клавиши. Например:
x = "2"
WAIT TABLE UNTIL "F"+x ; представлена именем функциональ
; ной клавиши F2
Для выяснения, какую клавишу нажал пользователь, можно применять функцию GETCHAR. Она возвращает код клавишы в виде положительного кода ASCII или отрицательного кода IBM. Однако такое представление не всегда удобно. Для преобразования других форматов кодов клавиш в коды ASCII можно воспользоваться функцией ASC. Например:
MenChar = ASC("Menu") ; вычисляется код клавиши меню {F10} IF (GETCHAR()=MenChar) ; сравнение с символом, введенным
; пользователем THEN MESSAGE "User pressed Menu " ELSE MESSAGE "User didn't press Menu "
ENDIF
Для перехода к различным участкам скрипта в зависимости от имени клавиши, набранной пользователем, можно применить функции ASC и GETCHAR, а также команды SWITCH и CASE.
Как вы увидите в главе 13, для предоставления возможности выбора пользователю удобнее воспользоваться командой SHOMENU. На рис 3-3 представлен искусственный пример, показывающий вам, как этой же цели можно достичь с помощью оператора CASE. В этом примере первый оператор CASE использдует имя специальной клавиши, второй - имя функциональной клавиши, третий - строку из одного символа, а последний - код ASCII. Этот пример демонстрирует несколько способов обращения к клавише.
c = GETCHAR() ; ожидание нажатия клавиши SWITCH
CASE c = ASC("Menu") : ; нажата клавиша меню?
PLAY "Menusels" ; да, запустим скрипт menusels
CASE c = ASC("F11") : ; нажата клавиша Shift-F1?
PLAY "Showhelp" ; да, запустим скрипт showhelp
CASE c = ASC("Q") : ; нажата клавиша Q?
QUIT ; да, покинем систему
CASE c = 113 : ; нажата клавиша q(код 113)?
QUIT ; да, покинем систему
ENDSWITCH
Рис 3-3. Ветвление в зависимости от клавиши, нажатой пользователем.
| <<
| <
| >
| >>
| Содержание |