Числовой тип (NUM) имеет внутреннее представление в виде числа с плавающей точкой двойной точности (double). Это дает возможность оперировать с числами, имеющими до 18 значащих десятичных цифр.
Символьный тип (CHAR) служит для описания строк символов длиной до 64 килобайт.
Датовский тип (DATE) служит для задания дат. Данные этого типа имеют длину 8 байт и хранятся в формате 'YYYYMMDD' ('ГГГГММДД').
Логический тип (LOG) описывает однобайтовые злементы, принимающие значение .TRUE. (.T.) или .FALSE. (.F.), что соответствует во внутреннем представлении 1 и 0.
Числовая константа - десятичное число в виде целой или действительной величины со знаком или без знака. Может иметь до 18 значащих цифр. Поддерживается также формат с экспонентой, т.е. в конце числа может быть указано En или en, где n -целое число со знаком или без знака (это соответствует умножению числа на 10 в степени n).
Символьная константа (строка) - последовательность символов, заключенных в кавычки (" ") или апострофы (' '). Длина константы - до 64 килобайт.
"Это строка символов",
"" -пустая строка,
'------"123"---------' (кавычки в строке)
Логическая константа имеет вид (регистр букв не важен):
В выражениях используются следующие типы данных:
Порядок выполнения (приоритет) операций :
1. () Скобки
2. ** ^ Степень
3. * / Умножение и деление
4. + - Сложение и вычитание (в т.ч. строк и дат)
5. < > <= >= Операции отношений
= # <>
$ Вхождение строки
6. .NOT. Логическое НЕ
7. .AND. Логическое И
8. .OR. Логическое ИЛИ
9. ?: Условная
10. => +> Присваивание и накопление
Описание (в порядке приоритетов) Примеры ------------------------------------------------------------------- 1. () Для групповых выражений (4-3) * (12/N1) 2. **, ^ Возведение в степень 3**2 + 2^3 3. *, / Умножение и деление 2*7 + 8/4 4. +, - Сложение и вычитание 4+15 - N1Арифметические операции используются с числовыми данными.
Описание Примеры
-------------------------------------------------------------------
+ Объединение (конкатенация) строк '123 '+'45' ->'123 45'
- Объединение строк с переносом '123 '-'45' ->'12345 '
концевых пробелов первой строки
в конец итоговой строки
$ Сравнение. Проверяет вхождение '34' $ 'ABC34D' -> .T.
первой строки во вторую
Описание Примеры
------------------------------------------------------------
+ Сложение date()+20
/* к текущей дате прибавить 20 дней */
- Вычитание date()-20
/* из текущей даты вычесть 20 дней */
date()-ctod('20000209')
/* разница 2-х дат в днях */
Описание Примеры (для всех результат =.T.) ----------------------------------------------------------------- < Меньше, чем (12+3)<43 > Больше, чем 'ABC'>'AB1' = Равно 'ABC'='AB' <> # Не равно 'AB'#'ABC' <= Меньше или равно (12+3)<=43 >= Больше или равно date()+20>=date()
Описание (в порядке приоритетов) Примеры ----------------------------------------------------------------- 1. () Для групповых выражений (@L1.or.A2>30) .and. @L2 2. .NOT. Логическое отрицание .not. S1 $ 'ABCD' 3. .AND. Логическое И A1 > 10 .and. @L1 4. .OR. Логическое ИЛИ A1 < 20 .or. @L1
Можно выделить следующие виды операторов:
Функция (процедура) может быть встроенной (стандартной) и пользовательской (описанной с помощью оператора PROC). Аргументы (фактические параметры) представляют собой выражения соответствующих типов и передаются по значению.
/* пример вызова */
dks_init( Num_pos + 1, ' ')
Оператор присваивания передает значение левой части в правую часть.
@S0 + Rtrim( old->FIO) => new->FIO ; /* CHAR тип */
"Символьная константа" => @S2 ; /* CHAR тип */
old->Date + 10 => new->Date ; /* DATE тип */
a > b => @L0 /* LOG тип */
Операция накопления определена только для числовых значений и заключается в добавлении вычисленного значения левой части оператора в правую часть.
1 +> count [1] ; /* добавление единицы к элементу массива */
Sum +> ALL_Sum /* накопление общей суммы в перемеменной */
Операции присваивания-накопления могут быть использованы в цепочке,например :
Данный оператор по своему действию аналогичен двум операторам:
Операции присваивания и накопления в цепочке могут чередоваться, например :
Данный оператор по своему действию аналогичен двум операторам:
Условный оператор имеет вид:
где
NM > 5 ? { 0 => COD ; WRITE() }
Это означает, что если поле NM имеет значений больше 5, то
обнуляется поле COD и производится запись в базу нового
значения текущей записи.
NM > 5 .and. Sum < 100 ?
{ 0 => COD ; WRITE() } : Sum +> ALL_Sum
Это означает, что если NM > 5 и SUM <100, то обнуляется
поле COD и производится запись в базу нового значения
текущей записи, в противном случае в переменную ALL_Sum
добавляется значение переменной Sum.
Оператор CYCLE позволяет организовать цикл выполнения одного или нескольких операторов и имеет вид:
где
Пример:
-------
/* Мax уровень налогов =
Max поля '1' код. таблицы kptab */
0 => Max_Level ;
Cycle( 1, Codemax( kptab))
{
Val( Codefield( kptab, @J, '1')) => Cur_Level ;
Cur_Level > Max_Level ? Cur_Level => Max_Level ;
}
Оператор WHILE позволяет организовать цикл выполнения одного или нескольких операторов и имеет вид:
где
Первая форма - проверка условия в начале цикла (тело цикла может не
выполниться ни разу);
вторая форма - проверка условия в конце цикла (тело
цикла выполняется хотя бы один раз).
Примеры:
--------
1 => EXT_ ; .T. => @L0 ;
While ( @L0 )
{ /* пытаемся найти вексель в картотеке */
Seek( blanks:bl_id, script->Type +
STR(script->Num_fr+@J,sizeof(blanks->Number)) +
script->Series + STR(script->Nominal,15,2) +
STR(EXT_,Sizeof(blanks->Ext))
) ;
/* если у бланка пуста ссылка на документ приема ,
то остаемся на этом бланке, иначе продолжаем цикл */
Empty(blanks->Nknd)
? .F. => @L0 : 1 +> EXT_ ;
} /* Конец цикла WHILE */
/* ---- Удаление пробелов в начале строки -----*/
0 => Nm1; Len(Per) => Nm2;
do 1 +> Nm1 while(Nm1 < Nm2 .and. Substr(Per,Nm1) = " ");
Substr(Per,Nm1) => Per;