Глава 5. Стандартные функции
5.1. Группы (категории) функций
1. Преобразование типов и значений
AT Поиск подстроки
CHAR Символ для кода ASCII
CODE Код ASCII символа
CONVERT Сумма прописью в рублях и копейках
CTOD Преобразование строки в дату
CTOI ?
DAY День месяца
DOSWIN Перекодирование строки из DOS в WINDOWS
DTOC,DTOS Преобразование даты в строку
FROMBYTE ? Преобразование байта в число
FROMWORD ? Преобразование двухбайтового слова в число
HEXSTR Преобразование строки в шестнадцатеричный вид
ITOC ?
LOWER Перевод строки в нижний регистр
LTRIM Усечение пробелов слева
MONTH Месяц года
RDATE Перевод даты в письменный вид
ROUND Округление числа
RTRIM Усечение пробелов справа
STR Преобразование числа в строку
STRCUT Выделение фрагментов строки по границам слов
STRZ,
STRZERO Преобразование числа в строку с лидирующими нулями
SUBSTR Выделение подстроки
TOBYTE ? Преобразование числа в байт
TOWORD ? Преобразование числа в двухбайтовое слово
UPPER Перевод строки в верхний регистр
VAL Преобразование строки в число
WOFFSET Смещение слова от начала строки
WORD Выделение слова из строки
YEAR Год даты
2. Работа с базой данных
ADJUST Подрезание базы данных
ALIAS Псевдоним базы данных
BUFFER Буфер текущей записи
CONTEXT,
CONTEXTLN Поиск записи по характерным фрагментам
COPY Копирование буферов
DBFINFO Информация о базе данных
DBMODE Режим доступа к базе данных
DEL Первый символ буфера записи
DELETED Проверка признака удаления записи
GO Перемещение к записи по ее порядковому номеру
GOBOTTOM Позиционирование к последней записи
GOTOP Позиционирование к первой записи
INDEX Установка/отмена текущего индексного файла
INITBUF Инициализация буфера пробелами
KEY Установка/отмена текущего ключа
MARK Удаление/восстановление записи
MARKBUF Пометка буфера записи
OLD Буфер записи до изменений
POPB Восстановление состояния базы из стека
PUSHB Сохранение текущего состояния базы в стеке
RECCOUNT Полное число записей в базе данных
RECNO Номер текущей записи
REINDEX Перестройка индекса базы данных
SEEK Индексный поиск записи
SEEKALL Индексный поиск записи (ближайшей)
SEEKINIT Индексный поиск записи с инициализацией
SIZEOF Размер поля базы данных
SKIP Перемещение относительно текущей записи
UPDATED Проверка флага модификации буфера
WRITE Запись информации в базу данных
3. Работа с кодовыми таблицами и массивами
CODEFIELD Поле кодовой таблицы
CODEMAX Число элементов кодовой таблицы
CODENUM Номер строки кодовой таблицы
CODESTR Строка кодовой таблицы
FSUM Суммирование элементов массива
RESET Обнуление массива
TABMENU Представление кодовой таблицы в виде меню
TABSET Установка строки и фильтра кодовой таблицы
4. Прикладное программирование и интерфейс
COLOR Цвет гнезда/панели
DEFAULT Восстанавливает стандартную реакцию на событие
EDSTOP Отмена режима редактирования
EXIT Выход из фрейма
FRESH Перерисовка гнезд ввода-вывода фрейма
FRESH_ALL Перерисовка записи и зависимых фреймов
HELP Выдача подсказки
INKEY Ввод символа с клавиатуры
LASTCHAR Последний введенный символ
MENU Всплывающее меню
NEXT Перемещение фокуса редактирования
PANEL Смена панели экранной формы
REPLY Выполнение файла отчета
REPORT Выполнение отчета
RPTWRITE,
RPTWRITELN Запись строки в отчет
SAY Вывод сообщения на экран
SHOW Перерисовка табличной формы
VIDEO Выполнение экранной формы
VIEW Просмотр файла на экране
5. Вспомогательные функции
BEEP Звуковой сигнал
CODEPAGE Кодовая страница для ввода-вывода
CRYPT Шифрование строки
DATE Текущая или вычисляемая дата
EMPTY Проверка пустоты значения
EXEC Выполнение строки с кодом
IIF Условное выражение
KBDMODE Режим клавиатуры
LEN Длина строки
LINE Текущая строка отчета
PAGE Текущая страница отчета
SPACE Строка пробелов
SYSTIME Текущее время в секундах
TIME Текущее или вычисляемое время
USER Выполнение пользовательской функции
USERNAME Имя пользователя
6. Сетевые функции (п.5.4.)
7. Серверные функции
ADDRIGHTS
GETUSER
GETUSERADDR
GETUSERTIME
HALT
SETNETMODE
8. Функции для работы с файлами
FCOPY Копирование файла
FILE Проверка наличия файла
FILECLOSE Закрытие файла
FILECOPY См. FCOPY
FILEEOF Конец файла
FILEEXIST См. FILE
FILEOFFSET Позиция указателя файла
FILEOPEN Открытие файла
FILEREAD Чтение из файла
FILESIZE Размер файла
FILEWRITE,
FILEWRITELN Запись в файл
REMOVE Удаление файла
5.2. Описание функций
Описание функций дается в алфавитном порядке. Перейти к другим функциям
группы (категории) можно по ссылке "Группа".
Тип возращаемого функцией результата указывается после метки "%Тип:".
В описании функций используются следующие обозначения параметров:
Dbf - Ссылка на базу данных, псевдоним
(соответствует номеру региона >=0, выделяемому базе
данных при открытии);
Fld - Имя поля базы данных. Если база данных
не текущая, то используется описание Dbf->Fld ;
expC - Выражение, имеющее тип CHAR ;
expN - Выражение, имеющее тип NUM ;
expD - Выражение, имеющее тип DATE ;
Key - Строковое выражение, играющее роль ключа поиска ;
Ind - Ссылка на индексный файл. Применяется только с указанием
базы данных - Dbf:Ind.
Наименования индексных файлов и кодовых таблиц указываются
без кавычек. Смысл остальных параметров понятен по контексту.
ADDRIGHTS`
Группа
ADJUST -Подрезание базы данных
Группа
ADJUST( [Dbf,] [expN] )
%Тип: N
Функция "подрезает" базу данных Dbf так, что число
записей в ней становится равным expN.
Если опущен параметр Dbf, используется текущая база,
если не задан параметр expN, он принимается равным 0
(полная очистка базы данных ).
При этом производится переиндексация всех индексных
файлов, если таковые имеются.
Пример
Adjust(); /* Текущ. база до 0 записей */
Adjust( 3); /* Текущ. база до 3 записей */
Adjust( Exm); /* База Exm до 0 записей */
Adjust( Exm, 3); /* База Exm до 3 записей */
Пример 2.1
ALIAS -Псевдоним базы данных
Группа
ALIAS( [Dbf])
%Тип: C
Возвращает псевдоним базы данных из региона с
номером Dbf ( >= 0), по умолчанию - из текущего.
Пример
USE "exm", Headfile = Base1 ("exm");
USE "Exm";
Say(" "); Reply( Alias( 1)); /* 'Exm' */
Say(" "); Reply( Alias( 0)); /* 'Base1' */
Say(" "); Reply( Alias()); /* 'Exm' */
AT -Поиск подстроки
Группа
AT( expC1, expC2)
%Тип: N
Возвращает позицию подстроки expC1 в строке expC2.
Если подстрока не найдена, выдает 0.
Пример
AT( 'из ', 'Строка из 4 слов')=>N1; /* 8 */
BEEP -Звуковой сигнал
Группа
BEEP()
%Тип: L
Функция выдает звуковой сигнал.
Пример 2.2
Пример 2.4
BUFFER -Буфер текущей записи
Группа
BUFFER( [Dbf])
%Тип: C
Возвращает значение буфера базы данных Dbf
(по умолчанию - текущей базы данных).
Особенностью данной функции является то, что ее
значение можно редактировать и использовать в правой
части оператора присвоения.
Пример
'' => Buffer( sech_cl) ;
Пример 2.1
CHAR -Символ для кода ASCII
Группа
CHAR( expN)
%Тип: C
Возвращает символ, соответствующий коду ASCII,
заданному параметром expN.
Пример
'Символ ' + CHAR( 64) => S_; /* 'Символ @' */
CODE -Код ASCII символа
Группа
CODE( expC)
%Тип: N
Возвращает код ASCII, соответствующий первому символу
строки expC.
Пример
CODE( '@123') => @0; /* 64 */
CODEFIELD -Поле кодовой таблицы
Группа
CODEFIELD( Fld [, Value] , KeyChar | DicName, Value, KeyChar)
%Тип: C
Возвращает символьное значение поля кодовой таблицы DicName
или таблицы, связанной с кодированным полем Fld.
Имя поля кодовой таблицы - однобайтовое, задается
параметром символьного типа KeyChar.
Если параметр Value символьного типа, он рассматривается как
ключ и в кодовой таблице ищется строка с этим ключом.
Если параметр Value числового типа, он рассматривается как
номер строки кодовой таблицы.
При отсутствии специфицируемой строки кодовой таблицы или
специфицируемого поля возвращается пустая строка ''.
Примеры
Rtrim( Codefield( prdtab, @180, 'D')) => @S0 ;
Vid = 'У' ? Codefield( schtab, Num, '*' ) :
Vid = 'И' ? Codefield( invtab, Num, '*' ) :
'????' ;
Пример 3.3
Пример 3.2
CODEMAX -Число элементов кодовой таблицы
Группа
CODEMAX( DicName | Fld)
%Тип: N
Возвращает количество строк в кодовой таблице DicName
или в таблице, связанной с полем Fld.
Пример 3.3
CODENUM -Номер строки кодовой таблицы
Группа
CODENUM( DicName,Key | Fld [,Key] )
%Тип: N
Возвращает номер строки, которая начинается с ключа Key,
имеющего тип CHAR, из кодовой таблицы DicName или из кодовой
таблицы, которая связана с кодированным полем Fld.
Если строка не найдена, то возвращается 0 .
Если параметр Key отсутствует, то возвращается номер строки,
началом которой служит строка Fld из кодовой таблицы,
связанной с полем Fld.
Пример
Cycle( 2, Codenum( Dks->Arcd)) Lastchar( "DOWN") ;
Tabmenu( prdtab, 2, 10, 35, 11) => @180 ;
Пример 3.1
CODEPAGE -Кодовая страница для ввода-вывода
Группа
CODEPAGE(Num)
%Тип: L
Устанавливает кодовую страница (у клиента)
при вводе/выводе данных.
Параметр Num может иметь значения:
0 - DOS-866,
3 - KOI8-R,
4 - CP-1251 (Windows russian).
Кодовая страница DOS-866 используется для внутреннего
хранения (в базах данных) и по умолчанию для ввода-вывода.
Пример
Codepage(3); /* KOI-8 */
CODESTR -Строка кодовой таблицы
Группа
CODESTR( DicName , Value | Fld )
%Тип: C
Возвращает строку из кодовой таблицы DicName или
из кодовой таблицы, связанной с кодированным полем Fld.
Если Value имеет тип NUM, то возвращается строка с номером Value,
при этом если строки с таким номером нет, то возвращается
пустая строка ''.
Если Value имеет тип CHAR, то этот параметр интерпретируется как
ключ, и возвращается строка, которая начинается с этого ключа.
Если строка не найдена, то возвращается '' .
Если параметр Value отсутствует, то первым параметром обязательно
должно быть кодированное поле, и возвращаемым значением в этом
случае будет строка, началом которой служит Fld.
Примеры
Codestr( Vkt ) => S_ ; /* Vkt - Вид картотеки товаров */
/* Vd -Вид документа */
Substr( Codestr( vdtab, @1), 1, Sizeof( dks->Vd)) => @S3 ;
/* Строка с номером Num берется из кодовой таблицы,
определяемой по значению поля Vid */
Vid = 'Д' ? Codestr( dsptab, Num ) :
Vid = 'А' ? Codestr( anltab, Num ) :
Vid = 'Ф' ? Codestr( fiztab, Num ) :
'????' ;
COLOR -Цвет гнезда/панели
Группа
COLOR( expC)
%Тип: L
Переустанавливает цветовые характеристика текста и фона
для выводимых на экран данных.
Параметр expC имеет значение вида "^nm",
где знак ^ являются первым символом, а nm - двухразрядное
шестнадцатиричное число, первая цифра которого задает цвет
фона, а вторая - цвет текста.
Каждый бит данного числа отвечает за определенную составляющую
цвета:
| Старшая цифра | Младшая цифра |
-----------|---------------|---------------|
Бит | 7 6 5 4 | 3 2 1 0 |
-----------|---------------|---------------|
Функция | b R G B | I R G B |
-----------|--------------------------------
| Ф О Н | СИМВОЛ |
b - Мерцание символа
I - Интенсивность цвета символа
R - Красная составляющая цвета
G - Зеленая составляющая цвета
B - Синяя составляющая цвета
Так шестнадцатиричное число 1C имеет следующее
побитовое представление и означает:
1 (0001) - на синем фоне
С (1100) - ярко красный символ
Функция Color() может переустанавливать цвета ( в порядка убывания
приоритета ) для каждого поля экранной формы, на все поля раздела
HEAD, на каждую запись раздела REPEAT, на все записи раздела
REPEAT . Необходимо иметь в виду, что действие функции Color()
локально, и она не заменяет собой глобальные переменные,
содержащие установку цветов по умолчанию и описанные
в файле Z.CFG .
Пример
CHAR _dcol:3;
"^17" => _dcol; /* "^17" - серый текст на синем фоне */
...
PREVIOUS : Del() = '*' ? Color( _dcol) ;
Пример 5.1
CONTEXT, CONTEXTLN -Поиск записи по характерным фрагментам
Группа
CONTEXT( [ Dbf,] expC)
CONTEXTLN( [ Dbf,] expC)
%Тип: L
Поиск записи в базе данных Dbf по характерным фрагментам записи.
Функции аналогичны. CONTEXTLN отличается от CONTEXT
индикацией поиска динамической "линейкой" в командной строке.
Поиск ведется от текущей записи и до конца базы данных.
Если параметр Dbf не задан, поиск ведется в активной базе.
Поиск эффективен для неиндексированных баз. Перед использованием
данной функции рекомендуется отключить текущий индексный файл
с помощью функции INDEX( 0) ;
Возвращает логическое значение .TRUE. или .FALSE. в зависимости
от результатов поиска. Поиск ведется до первой найденной записи.
Шаблон поиска (expC) представляет собой строку, в которой через
пробелы заданы от одного до 20 поисковых фрагментов. Найденной
считается запись, в которой присутствуют все поисковые
фрагменты в указанной последовательности.
Пример
CONTEXT( client, "МОСКВА АРИОН") ;
Пример 2.3
CONVERT -Сумма прописью в рублях и копейках
Группа
CONVERT( expN)
%Тип: C
Возвращает словесное описание числа expN
(денежной суммы) в виде строки, содержащей
сумму прописью в рублях и копейках.
Пример
Num N1;
1500145.37 => N1;
CONVERT( N1) =>S_;
/*Один миллион пятьсот тысяч сто сорок пять рублей 37 копеек*/
COPY -Копирование буферов
Группа
COPY( Dbf_to [, Dbf_from] )
%Тип: L
Копирует буфер текущей записи базы данных Dbf_from
(по умолчанию - активной базы данных) в буфер записи
базы данных Dbf_to. При этом необходимо, чтобы длины
записей в обеих базах данных были одинаковыми.
Копирование производится целым буфером без проверки на
совпадение наименований и расположения полей записи.
Пример 2.3
Пример 2.4
CRYPT -Шифрование строки
Группа
CRYPT( expC, expN )
%Тип: C
Шифрует сообщение expC и возвращает строку длины expN.
При этом должны соблюдаться следующие условия :
Len( expC) < 21 , 4 < expN < 20 .
Пример 5.1
CTOD -Преобразование строки в дату
Группа
CTOD( expC)
%Тип: D
Возвращает значение типа DATE, содержащее дату в стандарте
xBase ( ГГГГММДД ). Параметр expC должен иметь формат "ГГГГММДД".
Пример 1.1
`CTOI
Группа
CTOI( expC)
%Тип: N
Преобразует символьное значение expC (длиной 1,2 или 4 символа)
в целочисленное значение.
Пример
Ctoi('1') => @1; /* 49 */
Ctoi('A5') => @1; /* 13633 */
Ctoi('A512') => @1; /* 842085697 */
DATE -Текущая или вычисляемая дата
Группа
DATE( [expN])
%Тип: D
Без параметра возвращает текущую дату;
c параметром expN (время в секундах, отсчитываемое начиная
с 00:00:00 GMT 1 января 1970 года) - соответствующую дату.
Формат даты - в стандарте xBase ( ГГГГММДД ).
Примеры
Say( Rdate( Date())); Inkey();
Date( Systime() - 200000) => @D1;
Reply( Dtoc(@D1));
Date( 0) => @D1; Reply( Dtoc( @D1)); /* '19700101' */
DAY -День месяца
Группа
DAY( expD)
%Тип: N
Возвращают день месяца для параметра expD,
имеющего тип DATE.
Пример 1.1
DBFINFO -Информация о базе данных
Группа
DBFINFO( [Dbf])
%Тип: C
Возвращает строку с информацией о базе данных Dbf
(по умолчанию - текущей базе данных).
Строка (38 байт) содержит следующие данные:
5 байт - число полей
5 байт - длина буфера
3 байт - количество индексных файлов
8 байт - количество записей
8 байт - длина следа
5 байт - размер области комментариев
4 байт - сетевая версия
Пример
USE "Podr";
Dbfinfo() => @S0; /* ' 2 41 1 1063 0 0 0' */
DBMODE -Режим доступа к базе данных
Группа
DBMODE( [Dbf])
%Тип: C
Возвращает данные о режиме доступа к базе данных Dbf
(по умолчанию - текущей базе данных) в виде строки
из 3 байтов.
1-й байт (режим открытия базы данных):
'L' - локальный или через NFS
'M' - режим MASTER ( USE -m) с репликациями
'S' - режим SLAVE ( USE -s) с репликациями
'A' - режим ALONE ( SLAVE в отсутствие MASTER), только чтение
'N' - режим Клиент-Сервер ( USE -n)
'?' - иначе
2-й байт:
'W' - разрешена запись в базу данных
'R' - разрешено только чтение
3-й байт:
'r' - резидентная база данных (USE -r)
' ' - иначе
Пример
USE "Podr";
Dbmode(Podr) => @S0; /* 'LW ' */
`DEBUG (Не используется)
DEFAULT -Восстанавливает стандартную реакцию на событие
Группа
DEFAULT()
%Тип: L
Восстанавливает стандартную (запрограммированную в ядре)
реакцию на событие.
Пример
ENTER : Recno() < 1
? Default()
: Video( Word( Codefield( Vd, '6'), 1)) ;
Пример 4.1
DEL -Первый символ буфера записи
Группа
DEL( [Dbf])
%Тип: C
Возвращает содержимое первого байта буфера текущей записи
базы данных Dbf. Обычно, это пробел или звездочка ('*' -
для помеченных на удаление записей).
Если параметр отсутствует, берется активная база данных.
Пример
PREVIOUS : Del() = '*' ? Color("^17") ;
DELETED -Проверка признака удаления записи
Группа
DELETED( [Dbf])
%Тип: L
Возвращает логическое значение .T., если буфер текущей записи
базы данных Dbf помечен символом '*' (иначе возвращает .F.).
Если параметр отсутствует, берется активная база данных.
Пример
F8 : Deleted() ? Mark(' ')
: Substr( @RIGHTS,1,1) = '1' ? Mark('*') ;
DOSWIN -Перекодирование строки из DOS в WINDOWS
Группа
DOSWIN( expC)
%Тип: C
Преобразует строку (с русскими буквами) из DOS-кодировки (866)
в WIN-кодировку (1251).
Пример
'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп'+
'рстуфхцчшщъыьэюя'=>@S0;
Rptwriteln( @S0);
Rptwriteln( Doswin(@S0));
DTOC,DTOS -Преобразование даты в строку
Группа
DTOC( expD)
DTOS( expD)
%Тип: C
Возвращает строку, содержащую дату в формате
"ГГГГММДД". Параметр expD имеет тип DATE.
(Функции DTOC и DTOS эквивалентны.)
Пример
DATE() => @D0; DTOC( @D0) =>S_;
/* "20000714" для даты 14 июля 2000 г. */
D_` (Не используется)
EDSTOP -Отмена режима редактирования
Группа
EDSTOP()
%Тип: L
Отменяет редактирование текущего поля или всей
текущей записи в зависимости от того, в каком месте она
вставлена в программу.
Обычно эта функция используется в событии ED_BEG .
Пример
ED_BEG : Substr( @RIGHTS, 1, 1) # '1' ? EdStop() ;
EMPTY -Проверка пустоты значения
Группа
EMPTY( exp)
%Тип: L
Проверяет значение выражение exp на "пусто". Можно
использовать для разных типов выражения (C, N, D).
Примеры
Empty( @S5) ? Next(0);
Empty( @D0) ? Date() => @D0;
Empty( Sum) ? Reply( 'Сумма нулевая');
Пример 2.4
EXEC -Выполнение строки с кодом
Группа
EXEC( expC )
%Тип: (зависит от типа expC)
Интерпретирует и выполняет код, заданный в строке expC.
Пример
Exec( "Substr( '12345', 3, 2)") => @S0; /* '34' */
Exec( '10.5 + 0.7 * 2') => @0; /* 11.90 */
Exec( 'Date() - 30') => @D1;
Пример 3.2
EXIT -Выход из фрейма
Группа
EXIT()
%Тип: L
Осуществляет немедленный выход из текущего фрейма.
Пример
ENTER : { Nksb => @99; Exit() }
FCOPY, FILECOPY -Копирование файла
Группа
FCOPY( Dest, From)
FILECOPY( Dest, From)
%Тип: N
From - Имя (спецификация) копируемого файла
Dest - Имя (спецификация) нового файла
Имя файла может содержать путь (если не задан - используется
текущий каталог) и расширение.
Если выходной файл существует и не защищен от записи, он
заменяется новым.
В случае ошибки возвращается отрицательное число,
иначе - размер скопированного файла в байтах.
Пример
Fcopy("tst\a1", "xyz.txt") > 0 ? Reply("Ok") : Reply("Error");
/* Копирование файла xyz.txt из текущего каталога
в подкаталог tst с именем a1*/
FILE, FILEEXIST -Проверка наличия файла
Группа
FILE( expC)
FILEEXIST( expC)
%Тип: L
Возвращает значение "истина" (.t.), если файл с именем expC
существует, иначе - "ложь" (.f.). Имя файла может включать путь (по
правилам ОС), если он не указан - файл ищется в текущем каталоге.
Пример
File("N:\LOGIN\HELLO.EXE") ? Reply("Ok") : Reply("No");
`FILECLOSE - Закрытие файла
Группа
FILECLOSE( expN)
%Тип: L
Закрывает файл, связанный с дескриптором (номером) expN, который
формируется при вызове функции FILEOPEN.
Возвращает значение "истина" (.t.) при успешном выполнении закрытия
файла (иначе - .f.).
`FILEEOF -Проверка на конец файла
Группа
FILEEOF( expN)
%Тип: L
Возвращает значение "истина" (.t.), если для файла с номером expN
достигнут конец файла (т.е. позиция указателя => размера файла),
иначе возвращает значение .f..
`FILEOFFSET - Позиция указателя файла
Группа
FILEOFFSET( expN1 [,expN2])
%Тип: N
Функция возвращает текущее значение указателя файла с номером expN1,
и, если задан параметр expN2, устанавливает указатель в новую позицию,
которая находится на expN2 байтов относительно начала файла.
В случае ошибки номера файла возвращается значение -1.
Пример
Fileoffset(n1,5) => n2; Reply(" Исх. смещение="+Str(n2,4));
Fileoffset(n1) => n2; Reply(" Новое смещение="+Str(n2,4));
`FILEOPEN - Открытие файла
Группа
FILEOPEN( expC)
%Тип: N
Открывает в режиме "чтение+запись" файл с именем expC.
Если такого файла нет - он создается. Имя файла может включать путь (по
правилам ОС), если путь не указан - файл ищется в текущем каталоге.
При успешном завершении функция возвращает целое неотрицательное число -
логический номер (дескриптор) открытого файла. Указатель файла (указатель
текущей позиции) устанавливается на начало файла.
При ошибке функция возвращает значение -1.
Пример
NUM nf1;
Fileopen('x.tmp') => nf1;
nf1 > 0 ? Reply(" N файла="+Str(nf1,4)) : Reply(" Ошибка открытия");
`FILEREAD - Чтение из файла
Группа
FILEREAD( expN1, expN2)
%Тип: C
Функция читает из файла с номером expN1 от текущего указателя файла
до expN2 байтов (в пределах текущей строки файла) и возвращает их
в виде строки.
Пример
Say(' ');
NUM n1;
Fileopen('x.tmp') => n1;
While( .not. Fileeof( n1)) {
Fileread( n1,6) => @S0; Reply( Str( Len( @S0)));
}
`FILESIZE - Размер файла
Группа
FILESIZE( expN)
%Тип: N
Функция возвращает текущий размер в байтах файла с номером expN1,
и, если задан параметр expN2 < размера файла, усекает его до expN2 байтов.
В случае ошибки номера файла возвращается значение -1.
Пример
Filesize(n1,30) => n2; Reply(" Исх. размер файла="+Str(n2,6));
Filesize(n1) => n2; Reply(" Нов. размер файла="+Str(n2,6));
`FILEWRITE, FILEWRITELN - Запись в файл
Группа
FILEWRITE( expN, expC)
FILEWRITELN( expN, expC)
%Тип: L
Выполняет запись строки expC в файл с номером expN с текущей позиции
указателя файла. Функция FILEWRITELN добавляет после строки символы
конца строки.
Пример
Fileoffset( n1, Filesize( n1));
Filewriteln( n1, "===Продолжение текста===");
FRESH -Перерисовка гнезд ввода-вывода фрейма
Группа
FRESH( [expN] )
%Тип: L
Перечитывает из буфера записи и перерисовывает на экране
содержимое поля, которое следует через expN позиций от
текущего (редактируемого) поля экранной формы .
Отсутствие параметров приводит к перерисовке всей экранной формы.
Следует иметь в виду, что функция Fresh(), использует только
содержимое буфера записи без обращения к базе данных, а также
не перерисовывает зависимые фреймы.
Обычно эта функция используется в программах обработки событий.
Примеры
F3 : { Video("bank"); LastChar() # 'Esc' ?
@S19 => Mfob; Fresh(0) }
ED_END: Fresh(+1);
FRESH_ALL-Перерисовка записи и зависимых фреймов
Группа
FRESH_ALL()
%Тип: L
Перечитывает из буфера записи и перерисовывает на экране
содержимое всей текущей записи, а также выполняет все
зависимые фреймы.
Пример
ED_END : {
Dreg = Ctod(' ') ? {
Date => Dreg ;
Fresh_all () ;
}
}
FROMBYTE -Преобразование байта в число
Группа
FROMBYTE( expC)
%Тип: N
Возвращает значение первого байта символьного параметра expC
в виде числа в интервале 0 - 255.
FROMWORD -Преобразование двухбайтового слова в число
Группа
FROMWORD( expC)
%Тип: N
Возвращает значение двухбайтового символьного параметра expC
в виде числа в интервале 0 - 65535.
FSUM -Суммирование элементов массива
Группа
FSUM ( Array [, expN1 [, expN2]])
%Тип: N
Возвращает сумму элементов массива Array, начиная с
элемента expN1 по элемент expN2 включительно.
Если expN2 отсутстувет, то суммируются элементы массива
до последнего включительно. Если expN1 отсутствует, то
суммируются все элементы массива с нулевого по последний.
Пример
Fsum( Nal_sum) => SumDoc ;
GETUSER`
Группа
GETUSERADDR`
Группа
GETUSERTIME`
Группа
GO -Перемещение к записи по ее порядковому номеру
Группа
GO( [ Dbf,] expN )
%Тип: L
Выполняет переход к записи с номером expN в базе данных Dbf.
При отсутствии параметра Dbf берется текущая база данных.
Пример
Go( client, 1) ;
Пример 2.2
GOBOTTOM -Позиционирование к последней записи
Группа
GOBOTTOM( [ Dbf ] )
%Тип: L
Перемещает указатель на последнюю физически или
логически (с учетом активного индекса и ключа) запись
базы данных Dbf.
При отсутствии параметра берется текущая база данных.
Функция не приводит к перерисовыванию экрана.
Пример 2.1
Пример 2.5
GOTOP -Позиционирование к первой записи
Группа
GOTOP( [Dbf])
%Тип: L
Перемещает указатель на первую физически или логически
(с учетом активного индекса и ключа) запись базы
данных Dbf.
При отсутствии параметра берется текущая база данных.
Функция не приводит к перерисовыванию экрана.
Пример 2.5
GOTOXY`
HALT`
Группа
HELP -Выдача подсказки
Группа
HELP( expC)
%Тип: L
Выдает на экран пpи нажатии клавиш "Alt+F1"
сообщение (подсказку) с меткой expC из
файла пользовательских подсказок USER.HLP
Пример
HELP : Help( "main.П08") ;
/* Пpи нажатии "Alt+F1" выдается подсказка,
помеченная меткой "main.П08", из файла "USER.HLP" */
HEXSTR -Преобразование строки в шестнадцатеричный вид
Группа
HEXSTR( expC)
%Тип: C
Преобразует символьную строку expC в последовательность
шестнадцатеричных значений, объединяя два соседних символа
исходной строки в один байт.
Возвращает строку шестнадцатеричных чисел.
Применяется, в частности, для программного задания
символов управления печатью, построения графических
фрагментов в отчетах и т.п.
Пример
HEXSTR( '3534')=>S_; /* '54' */
IIF -Условное выражение
Группа
IIF( expL, exp1, exp2)
%Тип: (тип exp1)
Выполняет выражение exp1 или exp2 (их типы должны совпадать)
и возвращает значение :
exp1 ( если expL = .T.) или exp2 ( если expL = .F.).
Пример
iif( @L10, Doc->Nkd, Doc->Nkk) => @99;
Go( client, @99) ;
INDEX -Установка/отмена текущего индексного файла
Группа
INDEX( Dbf:Ind )
%Тип: N
Делает активным индексный файл, на который ссылается
параметр. Если параметр равен 0 (или -1) или Dbf:0,
то отменяется сортировка, и записи следуют в порядке
возрастания номеров.
Примеры
/* Отмена индекса */
PREPROC : Index(0);
/* Выбор индекса и ключа по условию */
PREPROC : {
@L1 ? { Index( bank:b_mfo) ; Key( '') } :
{ Index( bank:b_mfos); Key( @S1 ) }
}
Пример 2.5
INITBUF -Инициализация буфера пробелами
Группа
INITBUF( [ Dbf] )
%Тип: L
Заполняет символами пробела буфер текущей
записи в базе данных Dbf (по умолчанию берется
активная база данных).
Примечание: Вместо этой функции можно использовать
функцию BUFFER()
INKEY -Ввод символа с клавиатуры
Группа
INKEY( [expN])
%Тип: C
Функция без параметров ждет нажатия клавиши на клавиатуре
и возвращает мнемоническое название нажатой клавиши.
Возвращаемые мнемонические наименования те же, что и для
функции LASTCHAR.
Если параметр expN имеет положительное значение, он
интерпретируется как время ожидания нажатия клавиши в секундах.
По истечении времени ожидания функция возвращает пустую строку;
если же в течение этого времени была нажата клавиша,
возвращается ее мнемоническое обозначение.
Если параметр expN имеет отрицательное значение, функция
проверяет, была ли нажата клавиша к моменту ее вызова. Если
было нажатие, возвращается мнемоническое обозначение нажатой
клавиши, иначе возвращается пустая строка ''.
Пример
/* Проверка мнемонич.обозначений клавиш (выход по 0) */
CHAR s:12;
do say( inkey()+space(12)=>s ) while (s # '\0')
Пример 2.2
ITOC`
Группа
ITOC( expN1, expN2)
%Тип: C
Преобразует целочисленное значение expN1
в символьное значение длиной expN2 (1, 2 или 4) символа).
(Функция - обратна функции CTOI).
Пример
49 => @1; Itoc( @1,1) => @S0; /* '1' */
13633 => @1; Itoc( @1,2) => @S0; /* 'A5' */
842085697 => @1; Itoc( @1,4) => @S0; /* 'A512' */
KBDMODE -Режим клавиатуры
Группа
KBDMODE( [expN])
%Тип: N
Выводит (без параметра) или изменяет режим ввода символов
клавиатуры.
expN = 0 - латинские строчные символы
expN = 1 - русские заглавные символы
Изначально клавиатура приводится к русскому алфавиту.
Пример
Kbdmode(0);
Say(' ');
Reply( Str( Kbdmode())); /* ' 0' */
KEY -Установка/отмена текущего ключа
Группа
KEY( [ expC1 [, expC2 ]])
%Тип: C
Переустанавливает верхнюю и нижнюю границы для доступа
к записям текущей базы данных соответственно на
значения expC1 и expC2.
При этом подразумевается, что база данных проиндексирована,
а выражения expC1 и expC2 являются начальной частью ключевого
выражения. Длина значений expC1 и expC2 не более 78 символов.
Если присутствует только один параметр expC1, то становятся
доступными только записи, у которых значения ключа совпадает
с выражением expC1.
Вызов функции Key(''), где параметром является пустая строка,
отменяет границы для доступа к записям.
Функция Key() (без параметров) возвращает текущую границу
(ее можно запомнить и восстановить).
Пример
/* Выбор индекса и ключа по условию */
PREPROC : {
@L1 ? { Index( bank:b_mfo) ; Key( '') } :
{ Index( bank:b_mfos); Key( @S1 ) }
}
Пример 2.5
LASTCHAR -Последний введенный символ
Группа
LASTCHAR( [Char])
%Тип: C
Возвращает мнемоническое название последней нажатой
клавиши. Имеются следующие строковые наименования :
"Ctrl_Home", "Ctrl_End", "Ctrl_PageUp",
"Ctrl_PageDown", "Ctrl_RIGHT", "Ctrl_LEFT",
"F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10",
"Alt_F1", "Alt_F2", "Alt_F3", "Alt_F4", "Alt_F5", "Alt_F6",
"Alt_F7", "Alt_F8", "Alt_F9", "Alt_F10",
"Alt_1", "Alt_2", "Alt_3", "Alt_4", "Alt_5", "Alt_6", "Alt_7",
"Alt_8", "Alt_9", "Alt_0",
"Alt_A", ..., "Alt_Z", (Alt_M ->free memory)
"Shift_F1", "Shift_F2", "Shift_F3", "Shift_F4", "Shift_F5",
"Shift_F6", "Shift_F7", "Shift_F8", "Shift_F9", "Shift_F10",
"Space", "Enter", "UP", "DOWN", "LEFT", "RIGHT", "PageUp",
"PageDown", "Home", "End", "Insert", "Delete", "BackSpace",
"Esc", "Tab", "+", "F+", "-", "F-", "*", "/", "F*", "F/";
"RECEIVE", "TIMEOUT" (см. описание функции RECV())
и "MOUSE" (нажатие левой или правой кнопки мыши).
Для других символьных клавиш выдается мнемоническое обозначение
символа со знаком "\", например : "\А", "\Б", "\0", "\=" и т.д.
(комбинация Shift +{клавиша} позволяют получить символ другого
регистра).
Если в качестве параметра Char будет указано одно из описанных
мнемонических обозначений, соответствующий символ будет
возвращен в буфер ввода и это будет эквивалентно нажатию
клавиши на клавиатуре. С помощью такого приема можно
программировать серию "нажатий".
Примеры
Lastchar() # "Esc" .and. @99 > 0 ?
{ Go (client, @99) ; Show( 1) } ;
Lastchar() = "Enter" ? EdStop() ;
Lastchar( "F4") ;
F3 : { Video("bank"); LastChar() # 'Esc' ?
@S19 => Mfob; Fresh(0) }
LEN -Длина строки
Группа
LEN( expC)
%Тип: N
Возвращает длину строки expC.
Примечание: Для символьного поля базы данных возвращается
длина значения без конечных пробелов.
Пример
Len( Word(Mfo,1) ) < 8 ?
{ Reply("КОД НЕКОРРЕКТЕН !!!"); Updated(0); }
LINE -Текущая строка отчета
Группа
LINE( [ expN ])
%Тип: N
Функция устанавливает значение expN в качестве текущего
номера строки отчета.
При этом возвращается новое значение номера строки.
Функция, вызванная без параметра, возвращает текущее значение
номера строки отчета. (При переходе к формированию следующей
страницы отчета счетчик строк автоматически обнуляется).
Пример
Line() >= 59 ? Line( 101)
/* На новую страницу (если установлено LINES 100
и номер строки >=59 )*/
LISTEN -Ставит на прослушивание /снимает с прослушивания
Группа
LISTEN( <сокет>, 1) Ставит сокет на прослушивание
LISTEN( <сокет>, 0) Снимает сокет с прослушивания
%Тип: N
Пример: LISTEN( @100,1)
LOWER -Перевод строки в нижний регистр
Группа
LOWER( expC)
%Тип: C
Переводит строку expC в нижний регистр.
Функция корректно работает с символами как латинского
алфавита, так и кириллицы.
Пример
LOWER('Один Два Три AaBbCc') /* 'один два три aabbcc' */
LTRIM -Усечение пробелов слева
Группа
LTRIM( expC)
%Тип: C
Отбрасывает левые пробелы строки expC
и возвращает полученную строку.
Пример
'Строка'+LTRIM( ' ...')=>S_; /* 'Строка...' */
MARK -Удаление/восстановление записи
Группа
MARK( [ Dbf, ] Sym )
%Тип: L
Помечает буфер текущей записи базы данных Dbf
символом Sym и осуществляет запись буфера на диск.
Если параметр Dbf отсутствует, берется текущая база данных.
Пример
F8 : Deleted() ? Mark(' ') : Mark('*') ;
MARKBUF -Пометка буфера записи
Группа
MARKBUF( [ Dbf, ] Sym )
%Тип: L
Помечает буфер текущей записи базы данных Dbf символом Sym.
Если параметр Dbf отсутствует, берется текущая база данных.
Функция аналогична Mark(), но не производит запись на диск.
Пример
REPEAT {}
Npd_New => Npd,
Scl_sum [Codenum( Kp)] => Sum,
Scl_sum [Codenum( Kp)] = 0 ? Markbuf( '*') : Markbuf( ' '),
0 => Scl_sum [Codenum( Kp)],
Write() ;
MENU -Всплывающее меню
Группа
MENU( MnuName, X, Y, Lenght, Height, ColMenu, ColSel )
%Тип: N
Функция интерпретирует файл MnuName, который по умолчанию имеет
расширение .MNU, как вертикальное меню.
Параметры X и Y задают координаты левого верхного угла
меню, параметры Lenght и Height задают ширину и высоту меню,
параметры ColMenu и ColSel задают цветовые характеристики
меню и текущей строки. Формат описания параметров ColMenu
и ColSel см. в описании функции Color().
Каждый пункт меню в файле MnuName программируется. Программа
выбранного пункта выполняется интерпретатором после выбора
данного пункта клавишей .
Пример 4.1
MONTH -Месяц года
Группа
MONTH( expD)
%Тип: N
Возвращают номер месяца для параметра expD,
имеющего тип DATE.
Пример 1.1
NEXT -Перемещение фокуса редактирования
Группа
NEXT( expN)
%Тип: N
Переводит фокус редактирования на expN гнезд относительно
текущего редактируемого гнезда.
Обычно эта функция используется в программе обработки события
ED_END для изменения естественного порядка обхода гнезд
при редактировании экранной формы. В частности, функцией
NEXT( 0) можно застопорить перемещение фокуса редактирования.
Пример
NEXT : Empty(Oblb) ? Next(0);
OLD -Буфер записи до изменений
Группа
OLD( exp)
%Тип: тип exp
Позволяет использовать исходные ("старые") данные
буфера записи базы данных до выполнения обновления данных
записи из текущего буфера.
Выражение exp может содержать имена полей базы данных, а также
другие функции и выражения. Функцию Old можно использовать
до выполнения действия WRITE (в том числе в триггере WRITE
dbh -файла на сервере).
Пример
Recno() > 0 ? /* корректируем существующую проводку */
Old( .not. Deleted() .and. Empty( Fcod)) ? /* проводка действующая */
{
Substr( Dtos( Old( Date)), 1, 4) => @S0 ; /* старый год */
Val( Substr( Dtos( Old( Date)), 5, 2)) => @0 ; /* старый месяц */
....
/**** Пересчитываем состояние по дебету ****/
Old( Sum) * 100 => @2 ;
@S13 = '0' .or. @S13 = '1' ? 0 => @1 :
{ Old( Kold) * 1000 => @1 ;
-Round( @1) => @1 +> state->Kold [@0] ;
}
-Round( @2) => @2 +> state->Sumd [@0] ;
Write( state) ;
...
}
PAGE -Текущая страница отчета
Группа
PAGE( [Page [, Line ]])
%Тип: N
Функция устанавливает значения Page и Line в качестве текущих
значений номера страницы отчета и номера строки отчета
соответственно. При этом возвращается новое значение номера
страницы.
Функция, вызванная без параметров, возвращает текущее значение
счетчика страниц.
Пример
TOP
{
Страница XXX
+-------+-------+--------------------------------+-------------------+
| 1 | 2 | 3 | 4 |
+-------+-------+--------------------------------+-------------------+
}
Page () ;
PANEL -Смена панели экранной формы
Группа
PANEL( expN)
%Тип: N
Функция программного переключения сменных панелей
(типа TAIL) в видеоформе. В качестве параметра указывается
номер панели, которую нужно воспроизвести. Панели нумеруются
в естественном порядке, начиная с нуля.
POPB -Восстановление состояния базы из стека
Группа
POPB()
%Тип: L
Извлекает из стека состояние базы данных,
последним помещеное в стек функцией PUSHB.
Пример 2.2
PUSHB -Сохранение текущего состояния базы в стеке
Группа
PUSHB( [ Dbf ] )
%Тип: L
Запоминает в стеке состояние базы данных Dbf:
номер записи, состояние буфера, индексный файл,
параметры ключа.
Если параметр отсутствует, запоминается состояние
текущей базы данных.
Глубина стека ограничена свободной памятью.
Пример 2.2
QUERY`
RDATE -Перевод даты в письменный вид
Группа
RDATE( expD)
%Тип: C
Возвращает словестное описание даты expD на русском языке.
Возвращаемая строка имеет длину 16 байт.
Пример
CHAR S_;
Rdate( Ctod( '19950523')) =>S; /* "23 мая 1995" */
Пример 1.1
RECV -Получает данные из сети
Группа
RECV( <сокет>, [<время>])
%Тип: C
Получает данные из сети. Результат - полученная дейтаграмма
(строка).
<время> - время ожидания (в секундах) прихода данных
(по умолчанию 0).
Побочный эффект: функция LASTCHAR() возвращает значение
"RECEIVE", если прием состоялся и "TIMEOUT" - в противном случае.
RECCOUNT -Полное число записей в базе данных
Группа
RECCOUNT( [Dbf])
%Тип: N
Возвращает количество записей в базе данных Dbf.
Если параметр отсутствует, возвращается количество записей
текущей базы данных. Результат вычисляется по фактической
длине файла.
Пример
NEWBUF : {
'УЛЬЯНОВСК' => Town ;
Reccount() + 1 => Nks ;
}
RECNO -Номер текущей записи
Группа
RECNO( [Dbf])
%Тип: N
Возвращает номер текущей записи базы данных Dbf.
Если параметр отсутствует, берется активная база данных.
Пример
Recno( client) => sech_cl->RecNum [1];
Пример 2.5
REINDEX -Перестройка индекса базы данных
Группа
REINDEX( Dbf:Ind )
%Тип: N
Переиндексация базы данных по индексу, на который ссылается
параметр.
Пример
PREPROC : Reindex(bank:b_mfo);
REMOVE -Удаление файла
Группа
REMOVE( expC)
%Тип: L
Удаление файла, имя которого задано параметром expC
(если путь не задан - используется текущий каталог).
Пример
Remove( 'tmp.txt');
REPLY -Вывод сообщения на экран с подтверждением
Группа
REPLY( expC [, X [, Y [, Color]]])
%Тип: C
Выдает на экран сообщение expC, сопровождаемое звуковым
сигналом, и ждет нажатия клавиши. После нажатия любой клавиши
сообщение исчезает с экрана и программа продолжает свою работу.
Строка expC может быть вычисляемым выражением.
Необязательные параметры X, Y, Color задают, соответственно,
координаты X (0 - 79), Y (0 - 24) и цвет строки.
По умолчанию X = 0, Y = 23, Color = "^07".
Пример
Reply("ИНН Должен быть не менее 10 знаков !!!");
Пример 2.4
REPORT -Выполнение отчета
Группа
REPORT( expC1 [,expN [,expC2]])
%Тип: L
Функция начинает работать с программой, имя файла которой
задано параметром expC1, в режиме отчета.
По умолчанию этот файл имеет расширение .BLK и ищется
в каталоге программ отчетов.
Параметр expN определяет режим вывода отчета :
0 - вывод файла отчета сначала на экран
1 - сразу начинает вывод на печать
2 - создает файл отчета без вывода на просмотр
Если параметр expN не задан, используется режим 0.
Результат работы выводится в файл REPORT.PRN или в
файл с именем, заданным параметром expC2.
Пример
Report("cmp", 2, "dif.prn") ;
/* Вывод отчета в файл dif.prn без просмотра */
Пример 4.1
RESET -Обнуление массива
Группа
RESET( Array)
%Тип: N
Заполняет массив Array нулями.
Пример 3.1
ROUND -Округление числа
Группа
ROUND( expN1 [ , expN2 ] )
%Тип: N
Возвращает результат округления числа expN1 до expN2
значащих десятичных разрядов. Округление производится до
ближайщего округленного числа по правилу :
[ expN1 / ( 10 ** expN2 ) + 0.5 ] * ( 10 ** expN2)
Примеры
Num N1;
Round( 123456 , 3) => N1; /* 123000 */
Round( 35001.8 , 4) => N1; /* 40000 */
Round( 543.2332, -2) => N1; /* 543.23*/
Round( 12.3456 , -3) => N1; /* 12.346 */
Round( -1.12 , -1) => N1; /* -1.1 */
Round( -1.27 , -1) => N1; /* -1.3 */
RPTWRITE, RPTWRITELN -Запись строки в отчет
Группа
RPTWRITE( expC)
RPTWRITELN( expC)
%Тип: C
Выполняет прямую запись строки expC в файл отчета.
Функция RPTWRITELN после строки вставляет символ(ы)
конца строки.
Пример
HEAD {} Rptwriteln( "===Начало отчета===");
RTRIM -Усечение пробелов справа
Группа
RTRIM( expC)
%Тип: C
Отбрасывает правые пробелы строки expC
и возвращает полученную строку.
Пример
RTRIM( 'Строка ')+'...'=>S_; /* 'Строка...' */
SAY-Вывод сообщения на экран
Группа
SAY( expC [, X [, Y [, Color]]] )
%Тип: C
Выдает на экран сообщение expC.
Необязательные параметры X, Y, Color задают, соответственно,
координаты X (0 - 79), Y (0 - 24) и цвет строки.
По умолчанию X = 0, Y = 23, Color = "^07". О формате
переменной, задающей цвет текста и фона см. функцию Color.
Следует иметь в виду, что функция Say() не сохраняет содержимое
экрана, поверх которого было выдано сообщение, в отличие от
функции Reply() она не прерывает работу программы, а просто
помещает сообщение на экран.
Стереть сообщение можно, применив Say() с достаточно широкой
строкой из пробелов .
Пример
Say( Str( Reccount(), 6), 72, 11) ;
Пример 2.2
SEEK -Индексный поиск записи
Группа
SEEK( Dbf [:Ind], Key )
%Тип: N
Осуществляет индексный поиск в индексированной базе
данных Dbf записи, ключевое выражение которой совпадает
с ключом поиска Key.
Если в качестве первого параметра используется имя базы данных
(Dbf), поиск осуществляется по текущему индексному файлу.
Если в качестве первого параметра используется имя
индексного файла (Dbf:Ind), поиск осуществляется по
указанному индексному файлу.
Если запись не найдена, указатель текущей записи
устанавливается в конец базы (на запись с номером 0).
Применение этой функции приводит к тому, что в той базе данных,
в которой осуществляется поиск, указатель оказывается на
найденной записи. Поэтому в случае необходимости сохранения
текущей позиции нужно использовать вариант :
Recno( Dbf) => @1 ; /* Запоминаем текущую позицию в @1 */
Seek( Dbf, ...) ; /* Ищем нужную запись */
.........
Go( Dbf, @1) ; /* Возвращаемся к прежней позиции */
Пример
NEXT : .not.Seek( bank:bnkmfo, MfoB) ?
Reply( "Нет такого банка !!!");
Пример 2.2
SEEKALL -Индексный поиск записи (ближайшей)
Группа
SEEKALL( Dbf [:Ind], Key )
%Тип: N
Аналогична функции SEEK, но если запись не найдена
текущей становится запись ближайшая по ключу поиска.
Пример:
.NOT. Empty( @S0) ? {
Index( doc_11:d_vkd)
Seekall( doc_11:d_vkd, @S0 + Str( _Ndoc, Sizeof( doc_11->Ndoc))) ;
Key( @S0) ;
}
SEEKINIT - Индексный поиск записи с инициализацией
Группа
SEEKINIT( Dbf [:Ind], Key )
%Тип: N
Аналогична функции SEEK, но если запись не найдена
формирует буфер новой записи и инициализирует значения
ключевых полей на основе ключа поиска. (Ввод новой записи
происходит только после редактирования c сохранением
или выполнения функции WRITE ).
Пример:
ED_BEG : {
Vktd = 'У' ? Edstop() : Empty( cprice->Name) ?
Tovar_name( Vktd, Nktd) => cprice->Name ;
}
{ SeekInit( cprice:cprice1, Vktd + Str( Nktd) + Vkk + Str( Nkk) ) ;
cprice->Name ;
} , /* -- Наименование товара у поставщика -- */
....
SELECT`
SEND -Посылает строку данных в сеть
Группа
SEND( <сокет>, <строка>, <адрес>)
%Тип: N
Посылает строку данных в виде дейтаграммы в сеть.
( <строка> - символьное выражение или константа.)
Пример:
Socket( "INET", 23000) => @100 ;
Send( @100, "Hello, World", "172.18.93.1:20002") ;
Socket( "IPX", 23000) => @100 ;
Send( @100, "Hello, World", "00009202:0080C854B89C:20002") ;
SETCONTXT`
SETDOUBLE`
SETNETMODE`
Группа
SETWR`
SHOW -Перерисовка табличной формы
Группа
SHOW( [expN])
%Тип: L
Перерисовывает экранную форму и выполняет все сопутствующие
события, кроме установки индексного файла, ключевых выражений
и события START.
Функция удобна в использовании совместно с функциями
Index() и Key().
Параметр expN играет роль модификатора и может принимать
следующие значения:
1 - перерисовывается текущая строка и низ табличной формы
2 - перерисовывается верх, текущая строка и низ табличной формы
Если параметр expN отсутствует, база данных устанавливается
на начало, текущая строка переносится в начало табличной формы
и перерисовывается вся табличная форма.
Пример
Lastchar() # "Esc" .and. @99 > 0 ?
{ Go (client, @99) ; Show( 1) } ;
SHUTDOWN -Закрывает сокет
Группа
SHUTDOWN( <сокет>)
%Тип: N
Закрывает указанный сокет.
SIZEOF -Размер поля базы данных
Группа
SIZEOF( Fld )
%Тип: N
Возвращает длину поля базы данных Fld.
Пример
key_ = Vd_tmp +Str(Old_Nd, Sizeof( Nd)) +Old_Nde +Old_Pd;
Пример 3.1
Пример 3.2
SKIP -Перемещение относительно текущей записи
Группа
SKIP( [ Dbf,] expN )
%Тип: L
Перемещает указатель в базе данных Dbf на expN записей
по активному индексному файлу от текущей позиции.
При отсутствии параметра Dbf берется активная база данных.
Значение параметра expN может быть и отрицательным,
в этом случае перемещение осуществляется в сторону уменьшения
ключа или счетчика записей, если база данных неиндексирована.
Функция не приводит к перерисовыванию экрана.
Пример 2.1
SOCKET -Открывает порт для обмена
Группа
SOCKET( <протокол>, <порт>)
%Тип: N
Открывает порт на данной машине для обмена данными.
Возвращает номер сокета.
Пример:
20001 => @101 ;
SOCKET( "IPX", @101) => @100 ;
SOCKET( "INET", 20001) => @100 ;
SPACE -Строка пробелов
Группа
SPACE( expN)
%Тип: C
Возвращает строку пробелов длиной expN.
Пример
Ctod(Space(8)) => veksel->Dated ;
Пример 3.2
STR -Преобразование числа в строку
Группа
STR( expN1 [, expN2 [, expN3 ] ] )
%Тип: C
Возвращает строковый эквивалент числа expN1.
Параметр expN2 задает длину возвращаемой строки, а expN3 -
количество десятичных знаков после запятой. При необходимости
результат округляется.
Параметры expN2 и expN3, являются необязательными:
- для поля базы данных их значения по умолчанию соответствуют
параметрам поля;
- для программных переменных по умолчанию expN2 = 12 и expN3 = 0.
Если значение числа выходит за заданные границы, возвращается
строка, содержащая звездочки.
Примеры
NUM N1; CHAR S_;
1512145.57=>N1;
STR( N1 , 12 , 3 ) =>S_; /*" 1512145.570" */
STR( N1 , 8 , 3 ) =>S_; /*" ********" */
STR( N1 ) =>S_; /*" 1512146" (с округлением) */
STRCUT -Выделение фрагментов строки по границам слов
Группа
STRCUT( expC, expN1, expN2)
%Тип: C
Выделяет из строки expC, начиная со смещения expN2
от ее начала, такой ее фрагмент, который полностью умещался
бы в гнезде длиной expN1 по границе слов.
Функция возвращает длину такого фрагмента.
Пример
Выделим фрагменты длиной до 20 байт из строки S_:
"Сто двадцать пять тысяч триста семьдесят шесть."
STRCUT( S_, 20, 1) => @1 => @0 ; /* @1 = 18, @0 = 18 */
SUBSTR( S_, 1, @1) => S1 ; /* "Сто двадцать пять" */
STRCUT( S_, 20, 1 + @0) => @1 ; /* @1 = 13 */
SUBSTR( S_, 1 + @0, @1) => S2 ; /* " тысяч триста" */
@1 +> @0 ; /* @0 = 31 */
STRCUT( S_, 20, 1 + @0) => @1 ; /* @1 = 16 */
SUBSTR( S_, 1 + @0, @1) => S3 ; /* " семьдесят шесть." */
/* Получены фрагменты S1, S2, S3 */
STRZ, STRZERO -Преобразование числа в строку с лидирующими нулями
Группа
STRZ( expN1 [, expN2 [, expN3 ] ] )
STRZERO( expN1 [, expN2 [, expN3 ] ] )
%Тип: C
Функция аналогична функции STR(), но возвращает значение
с ведущими нули.
Примеры
STRZ( 15125.57 , 9, 2 ) =>S /* "015125.57" */
STRZ( 15125.57 , 9) =>S /* "000015126" */
STRZ( 15125.57 ) =>S /* "000000015126" */
SUBSTR -Выделение подстроки
Группа
SUBSTR( expC , expN1 [, expN2 ] )
%Тип: C
Возвращает подстроку строки expC.
Параметр expN1 задает начальную позицию, а expN2 - число
символов, выделяемых из исходной строки (если expN2 не задано
или выводит за конец строки - берется правая часть строки,
начиная с символа номер expN1).
Пример
Substr( '1234abcdABCD', 3, 4) /* => "34ab" */
Substr( '1234abcdABCD', 3) /* => "34abcdABCD" */
Substr( '1234abcdABCD',10, 5) /* => "BCD" */
SYSTIME -Текущее время в секундах
Группа
SYSTIME()
%Тип: N
Выдает текущее время в секундах, отсчитываемое начиная
с 00:00:00 GMT 1 января 1970 года.
Примеры
Say(' ');
Reply( Str( Systime()));
Systime() => SYSDAT[1] /* SYSDAT -поле с описанием C 4 0 8 0 */
TABMENU -Представление кодовой таблицы в виде меню
Группа
TABMENU( DicName[, X [, Y [, Lenght [, Height ] ] ] ] )
%Тип: N
Позволяет просмотреть кодовую таблицу DicName как
вертикальное меню. При этом движение по меню осуществляется
стрелками, выбор строки - нажатием клавиши .
Функция возвращает номер выбранной строки из кодовой таблицы.
Доступ к строке можно получить при помощи функции Codestr().
Возврат из режима просмотра таблицы DicName возможен и по
нажатию . В этом случае возвращаемое значение равно 0.
Пример
Tabmenu( prdtab, 2, 10, 35, 11) => @180 ;
TABSET -Установка строки и фильтра кодовой таблицы
Группа
TABSET( expN [, expC, KeyChar] )
%Тип: L
Позициирует курсор в кодовой таблице на строку с номером expN
и фильтрует ее строки по значению expC поля с односимвольным
именем KeyChar.
Пример 3.4
TIME -Текущее или вычисляемое время
Группа
TIME( [expN])
%Тип: C
Без параметра возвращает текущее время в формате "HH:MM:SS";
c параметром expN (время в секундах, отсчитываемое начиная
с 00:00:00 GMT 1 января 1970 года) - соответствующее время.
Примеры
Reply( Time(10)); /* "03:00:10" */
HEAD
{
---------------------------------------------------------
Текущие проводки на XXXXXXXX время XXXXXXXX
---------------------------------------------------------
} DATE(),TIME();
TOBYTE -Преобразование числа в байт
Группа
TOBYTE( expN)
%Тип: C
Преобразует число expN к беззнаковому байту в
интервале 0 - 255 и возвращает однобайтовую строку.
TOWORD -Преобразование числа в двухбайтовое слово
Группа
TOWORD( expN)
%Тип: C
Преобразует число expN к беззнаковому двухбайтовому числу в
интервале 0 - 65535 и возвращает двухбайтовую строку.
UPDATED -Проверка флага модификации буфера
Группа
UPDATED( [ Dbf [,Flag] | Flag ] )
%Тип: L
Устанавливает флажок редактирования текущей записи
в базе данных Dbf. Параметр Flag может принимать значения
0 или 1.
Функция возвращает логическое значение .Т. , если флажок
редактирования взведен, и .F. в противном случае.
После применения функции UpDated(0) запись базы данных считается
нередактированной, и поэтому записи на диск по умолчанию не
производится.
Наиболее естественное применение эта функция находит в проверке
корректности условий записи в событиях WRITE и ED_END.
Пример
'' = New_Nde ?
{ Reply( "Номер нельзя использовать") ;
Updated( 0) ;
} : New_Nde => Nde ;
Пример 2.4
UPPER -Перевод строки в верхний регистр
Группа
UPPER( expC )
%Тип: C
Переводит строку expC в верхний регистр.
Функция корректно работает с символами как латинского
алфавита, так и кириллицы.
Пример
UPPER('Один Два Три abc') /* 'ОДИН ДВА ТРИ ABC' */
`USER -Выполнение пользовательской функции
Группа
USER( FuncN [, Par1 [, Par2 ] ] )
? В новой версии zCode не поддерживается.
USERNAME -Имя пользователя
Группа
USERNAME( )
%Тип: C
Возвращает имя текущего пользователя (клиента) сервера.
Обычно это табельный номер, вводимый пользователем при входе в систему.
Пример
Val( UserName()) => SYSUSE[1] ;
VAL -Преобразование строки в число
Группа
VAL( expC)
%Тип: N
Возвращает числовой эквивалент строки expC.
Пробелы слева игнорируются. Число берется до первого
нечислого символа строки.
Примеры
VAL(' 987.65 ') /* 987.65 */
VAL(' 98a7.65 ') /* 98 */
VAL('a7.65 ') /* 0 */
VAL('98e2') /* 9800 (экспоненциальная форма) */
VIDEO -Выполнение экранной формы
Группа
VIDEO( expC )
%Тип: L
Функция выполняет программу, имя файла которой
задано параметром expC1, в режиме экранной формы.
По умолчанию этот файл имеет расширение .PAN .
Пример
F3 : { Video("bank"); LastChar() # 'Esc' ?
@S19 => Mfob; Fresh(0); }
VIEW -Просмотр файла на экране
Группа
VIEW( expC)
%Тип: L
Осуществляет просмотр на экране содержимого файла
с именем expC (расширение, если оно есть, надо указывать,
если путь не указан - файл из домашнего каталога).
Пример
HELP : View( "doc_all.txt") ;
WOFFSET -Смещение слова от начала строки
Группа
WOFFSET( expC, expN)
Возвращает смещение (в байтах) от начала строки expC
слова номер expN.
Разделителями слов являются символы пробела или табуляции.
Пример
WOFFSET('Это строка из пяти слов',4 )=>N1; /* 14 */
WORD
Группа
WORD( expC, expN)
%Тип: C
"Вырезает" слово номер expN из строки expC.
Разделителями слов являются символы пробела или табуляции.
Возвращемое значение имеет тип CHAR и имеет длину,
равную длине "вырезанного" слова.
Примеры
WORD('Это строка из пяти слов',4 )=>S_; /* "пяти" */
Len( Word(Mfo,1) ) < 8 ?
{ Reply("КОД НЕКОРРЕКТЕН !!!"); Updated(0); }
WRITE -Запись информации в базу данных
Группа
WRITE( [ Dbf [,expN]] | expN ])
%Тип: L
Осуществляет запись текущего буфера базы данных Dbf
на диск на место записи с номером expN (или новой записи,
если expN=0).
Если присутствует только параметр Dbf, функция
Write( Dbf) выполняет те же действия, что и функция
Write( Dbf, Recno( Dbf) ).
Если присутствует только параметр expN, берется
активная база данных.
Если параметры отсутствуют вообще, производится запись
текущего буфера активной базы данных.
На время работы функции Write() производится автоматический
захват записи и счетчика записей базы данных.
Пример
Write( sech_cl, 0) ; /* добавление записи в базу sech_cl */
Пример 2.3
Пример 5.1
YEAR
Группа
YEAR( expD)
%Тип: N
Возвращают номер года для параметра expD,
имеющего тип DATE.
Пример 1.1
5.3. Примеры использования функций
Пример 1.1 (CDOT,RDATE,DAY,MONTH,YEAR)
CHAR S_:80; DATE D_;
CTOD( '19991015')=>D_; RDATE( D_)=>S_;
/* "15 октября 1999" */
STR(DAY( D_),2)+ STR(MONTH( D_),3)+ STR(YEAR( D_),5)=>S_
/* "15 10 1995" */
Пример 2.1 (ADJUST,GOBOTTOM,SKIP,EMPTY,BUFFER...)
/* Удаление пустых записей в конце базы данных */
Use -i "dks" ;
GoBottom() ?
{
While( Empty( Buffer()) .and. Recno() > 0) Skip( -1) ;
Adjust( Recno() ) ;
}
Пример 2.2 (PUSHB,SEEK,POPB,INKEY,SAY,GO)
Pushb() ;
Seek( Doc:d_pvd, Vd + Str( Nd) + Nde + Pd) => @L1 ;
Popb() ;
@L1 ? { Say( "Такой документ уже существует.") ;
Beep() ; InKey( 5) ; /* Ждем ответа 5 сек. */
Say( " ") ;
Go( Doc, Recno() ) ; /* Восстанавливаем */
} : .T. => @L0 ;
Пример 2.3 (CONTEXTLN,COPY,WRITE...)
/* Очистка базы sqlm и ее буфера */
Adjust( sqlm, 0) ; '' => Buffer( sqlm ) ;
/* Контекстный поиск в базе mater и копирование
найденных записей в базу sqlm
(строка шаблона Patm считается заданной) */
While( Contextln( mater, Patm) ) {
Copy( sqlm, mater) ;
Write( sqlm, 0) ;
}
Пример 2.4 (COPY,EMPTY,UPDATED,BEEP,REPLY)
ED_BEG : Copy(clnbuf);
ED_END : {
'' => @S19;
Empty(Countb) ? @S19 + "СЧЕТ " => @S19;
Empty(Mfob) ? @S19 + "МФО " => @S19;
Empty(Oblb) ? @S19 + "ОБЛАСТЬ " => @S19;
@S19 > ' ' ? {
Beep(); Beep();
Reply("ВЫ HЕ ЗАПОЛHИЛИ ПОЛЯ : " + @S19);
Updated(0);
} ;
}
Пример 2.5 (INDEX,KEY,GOTOP,GOBOTTOM,RECNO)
Index( dks:r_vdp) ;
Key( dks->Vd + Str( dks->Nd) + dks->Nde + dks->Pd) ;
Gotop( dks) ; Recno( dks)=>N1 ;
/* Первая по индексу r_vdp с учетом ключа запись */
Gobottom( dks) ; Recno( dks)=>N2 ;
/* Последняя по индексу r_vdp с учетом ключа запись */
Пример 3.1 (CODENUM,RESET,SIZEOF)
/* Расчет итоговых значений по позиции документа
(или документу в целом, если @S0='') .
VD -Вид документа
PD -Подразделение документа
ND -Номер документа
NPD -Номер позиции в документе
KP -Код позиции в документе (+ кодовая табл. kptab)
SUM -Сумма проводки
index = r_pvdpk ("VD+PD+STR(ND)+STR(NPD)") ;
*/
select dks ;
index = r_pvdpk ;
key = doc->Vd + doc->Pd + Str( doc->Nd, Sizeof( Nd)) + @S0 ;
HEAD { }
Reset( Nal_sum), /* Зануление массива Nal_sum */
0 => @1 ;
REPEAT { } /* Накопление сумм */
Codenum( Kp ) > 0 ? {
Sum +> Nal_sum [Codenum (kptab, Kp)] ;
Kp = ' ' ? Kol +> @1 ;
} ;
Пример 3.2 (CODEFIELD,SPACE,SIZEOF,EXEC)
Codefield( doc->Vd, '2') = Space( Sizeof( doc->Nkd )) ? {
.T. => @L1 => @L3 ;
0 => doc->Nkd ;
} : {
Exec( Codefield( doc->Vd, '2')) => doc->Nkd ;
doc->Vkd # ' ' ? .T. => @L1 : .F. => @L1 ;
doc->Nkd # 0 ? .T. => @L3 : .F. => @L3 ;
}
Пример 3.3 (CODEMAX,CODEFIELD)
/* М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 ;
}
Пример 3.4 (TABSET,TABMENU, CODEMAX,CODEFIELD)
Codetab prdtab ;
_SIDE = 'D' .or. _SIDE = 'K' ?
{
0 => @0 ; /* подсчет числа выводимых строк */
Cycle( 1, Codemax( prdtab))
Codefield( prdtab, @J, _SIDE) = '*' ? 1 +> @0 ;
Tabset( @200, '*', _SIDE) ;
/* Фильтр по значению '*' поля 'D' или 'K',
@200 -номер начальной строки
*/
} :
{
Codemax( prdtab) => @0 ;
Tabset( @200) ;
} ;
/* Вывод в меню заданных строк таблицы */
Tabmenu( prdtab, 20, 5, 40, @0, "^30", "^70") => @200 ;
Пример 4.1 (CODEFIELD,DEFAULT,MENU,REPORT)
F9 : Empty( Codefield( Vd, "7")) ? Default()
: { Codefield( Vd, "7") = '*' ?
Menu( Substr( Codefield( Vd,'7') , 2),
25, 5, 38, 8, "^30", "^70")
: Report( Codefield( Vd, '7')) ;
} ;
Пример 5.1 (CRYPT,COLOR,WRITE,..)
/* Ввод значения нового пароля */
select passwd ;
POSITION 20 5 39 3
NOSKIP
NOCOPY
WCOL ^30
PCOL ^30
HEAD
{
------------------------------------
Ваш новый пароль XXXXXXXX
------------------------------------
}
ED_BEG : { '' => @S1 ; Color( "^44") ; @L1 ? Edstop(); }
ED_END : Lastchar() = 'Enter' ?
{ Crypt( @S1, Sizeof( Passw)) => Passw ;
Write() ; .T. => @L1 ;
}
{ @S1 ; Color( "^33") ; @S1 ; } ;
PREVIOUS : .F. => @L1 ;
Пример 6.1 (Сетевые функции)
** DGRAM1.PAN ***
20002 => @101 ;
"00009202:0080C854B89C:20001" => @S1 ;
frame sendmsg <<
POSITION 2 2 70 4
SIDES 5
HEAD
{
Сообщение: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
}
@S0 ;
ED_END : Send( @100, @S0, @S1) ;
>>
frame -v <<
HEAD
{
}
;
START : {
Socket("IPX", @101) => @100 ;
Listen( @100, 1) ;
}
TAB : sendmsg( 2) ;
RECEIVE : {
Recv( @100) => @S0 ;
Reply("<" + @S0 +">") ;
}
RETURN : Shutdown( @100) ;
ESC : Shutdown( @100) ;
>>
5.4. Сетевые функции
LISTEN Ставит на прослушивание /снимает с прослушивания
RECV Получает данные из сети
SEND Посылает строку данных в сеть
SHUTDOWN Закрывает сокет
SOCKET Открывает порт для обмена
См.также событие RECEIVE
Прямое управление сетью на уровне zCode заключается в передаче
и приеме дейтаграмм. Для этого возможно использование 2-х протокольного
стека: либо UDP/IP, либо IPX. Доставка дейтаграмм не является
гарантированной, забота об этом лежит на программисте.
Схема работы следующая:
* Открыть порт функцией SOCKET() (возвращает номер сокета).
* Для отправки данных использовать функцию SEND().
* Для разрешения получения данных поставить сокет на прослушивание
функцией LISTEN(<сокет>,1).
* Прием данных возможен в одном из двух режимах:
-асинхронном (с помощью события RECEIVE и функции RECV()),
-синхронном (с помощью функций RECV() и LASTCHAR()).
* Приостановить прослушивание можно функцией LISTEN(<сокет>,0).
* Закрыть сокет функцией SHUTDOWN(0).
Описание сетевых функций дается в порядке их использования.
(См.также Пример 6.1 )
При описании используются следующие обозначения:
<протокол> :
"IPX" - IPX -протокол,
"INET" - TCP/IP -протокол.
<порт> - номер используемого порта (двухбайтовое слово),
может принимать значение от 1025 до 65535 (номера до 1024
зарезервированы под общесистемные сервисы);
<сокет> - точка соединения (IP-адрес + номер порта).
<адрес> - адрес получателя
для" IPX"-протокола адрес включает:
- 16-ный номер сети (4 байта),
- 16-ный номер сетевой карты (6 байт),
- 10-ный номер порта получателя (2 байт)
(например:" 00009202:0080C854B89C:20002") ;
для" INET" - протокола адрес включает:
- IP -адрес машины,
- номер порта получателя (2 байт)
(например:" 172.18.93.1:20002")
Указатель функций алфавитный
ADDRIGHTS
ADJUST
ALIAS
AT
BEEP
BUFFER
CHAR
CODE
CODEFIELD
CODEMAX
CODENUM
CODEPAGE
CODESTR
COLOR
CONTEXT
CONTEXTLN
CONVERT
COPY
CRYPT
CTOD
CTOI
D_
DATE
DAY
DBFINFO
DBMODE
DEBUG
DEFAULT
DEL
DELETED
DOSWIN
DTOC,DTOS
EDSTOP
EMPTY
EXEC
EXIT
FCOPY
FILE
FILECOPY
FILECLOSE
FILEEOF
FILEEXIST
FILEOFFSET
FILEOPEN
FILEREAD
FILESIZE
FILEWRITE
FILEWRITELN
FRESH_ALL
FRESH
FROMBYTE
FROMWORD
FSUM
GETUSER
GETUSERADDR
GETUSERTIME
GO
GOBOTTOM
GOTOP
HALT
HELP
HEXSTR
IIF
INDEX
INITBUF
INKEY
ITOC
KBDMODE
KEY
LASTCHAR
LEN
LINE
LISTEN
LOWER
LTRIM
MARK
MARKBUF
MENU
MONTH
NEXT
OLD
PAGE
PANEL
POPB
PUSHB
QUERY
RDATE
RECCOUNT
RECNO
RECV
REINDEX
REMOVE
REPLY
REPORT
RESET
ROUND
RPTWRITE
RPTWRITELN
RTRIM
SAY
SEEK
SEEKALL
SEEKINIT
SELECT
SEND
SETCONTXT
SETDOUBLE
SETNETMODE
SETWR
SHOW
SHUTDOWN
SIZEOF
SKIP
SOCKET
SPACE
STR
STRCUT
STRZ
STRZERO
SUBSTR
SYSTIME
TABMENU
TABSET
TIME
TOBYTE
TOWORD
UPDATED
UPPER
USER
USERNAME
VAL
VIDEO
VIEW
WOFFSET
WORD
WRITE
YEAR