Числовой тип (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;