##
Редактор DBF-файлов BDBFS.EXE

### ПРЕДУПРЕЖДЕНИЕ

        Портирование BDBFS на платформу CLIP началось не так давно и
    идет не без затруднений, что связано, прежде всего, с использованием в
    оригинальном, досовском варианте BDBFS довольно большого количества
    ассемблерных вставок и вообще различных трюков.
    	Поэтому на данный момент возможно возникновение самых
    разнообразных ошибок в самых неожиданных местах, а несомненные
    преимущества CLIP пока используются мало. Прошу Вас - будьте
    толерантны. Ну а познакомиться с оригинальным BDBFS и сопутствующими
    утилитами можно на сайте программы.

### Инструкция программиста

    	Нижеследующее не претендует на полное описание, но, возможно,
    кому-нибудь и пригодится.

    	Текущее описание соответствует версии
    			BDBFS 1.26.

Читайте далее:

- 1.Почему BDBFS ?
- 2.Поддерживаемые форматы данных.
- 3.Редактирование записей.
- 4.Режимы Replace.
- 5.Append/Copy.
- 6.SUM.
- 7.Поиск по индексу(тэгу).
- 8.Выражения условий.
- 9.Set Fields.
- 10.Вычисление выражений.
- 11.Задание переменных.
- 12.Модификация структуры.
- 13.Вставка записи.
- 14.TOTAL и SORT.
- 15.Сохранение/восстановление окружения.
- 16.Инициализационные файлы.
  - 16.1.Auto Open файлы.
- 17.Макроклавиши.
- 18.Выход в DOS.
- 19.Использование мышки.
- 20.Совместимость с FoxPro.
- 21.Работа в сети и мультизадачных системах.
- 22.Обработка ошибок.
- 23.Выражения цветности.
- 24.Работа с буфером обмена.
- 25.История условий и выражений.
- 26.Стек позиций.
- 27.Редакция memo-полей и внешних файлов.
- 28.Печатные формы.
- 29.Клавишные коды.
- 30.Пользовательское меню.
- 31.Проверка/коррекция базы.
- 32.Плагины.
- 33.Запуск BDBFS.
- 34.Форсированный режим.
- 35.Видео-режимы.
- 36.Языковый интерфейс.
- 37.Планы.
- 38.Чего в BDBFS нет по сравнению с "конкурентами".
- 39.Известные проблемы.
- 40.Благодарности.
- 41.Дальнейшие ругательства.
- 42.Форма распространения.
- ПРИЛОЖЕНИЕ 1.Сводка клавиш.
- ПРИЛОЖЕНИЕ 2.СООБЩЕНИЯ.
- ПРИЛОЖЕНИЕ 3.Поддерживаемые функции.
- ПРИЛОЖЕНИЕ 4.BDBFS-PRO.
  - A. Системные переменные
  - B. Вызываемые функции
    1. Функции вычисления
    2. Функции преобразования
    3. Команды установки SET
    4. Прочие системные функции
    5. Интерфейсные функции
    6. Банковские функции

#### 1.Почему BDBFS ?

####

####

####

####

####

####

####

####

####

####

####

####

####

####

####

#####

#####

#####

#####

#####

#####

#####

#####

#####

#####

#####

#####

#####

#####

####

####

####

####

####

####

####

####

####

####

####

####

####

####

####

####

####

####

####

####

####

####

####

####

####

####

####

####

#####

######

######

######

######

######

######

######

#####

######

######

#####

#####

#####

#####

#####

#####

#####

####

####

####

#####

#####

######

######

######

######

######

######

    	И в самом деле - аналогов полно, только автору на данный момент
    известны следующие viewer/browser-ы:

    	- dbview Трофименко ~3к !!!!
    	- dbview Царенко ~32k но с редакцией и поиском
    	- popdbf Bowen-software - единственный известный мне резидент
    	- vdbf Родионова, послуживший толчком для разработки
    	- d123 Deveza
    	- dbeditor Jeff Parnau
    	- dbfedit Lau Preston
    	- dbed Дмитриева
    	- cdbf Чехуты
    	- dbc Кресина

    и при этом я нисколько не сомневаюсь, что перечислено далеко не все.
    Можно также пользоваться и фирменным DBU Clipper. В конце концов, можно
    просто зайти в Fox или там Delphi какой-нибудь ;-).

    Тем не менее, у BDBFS есть своя ниша. При его написании девизом было:
    	"Сделаем с выбранной базой, все что захотим !"
    Имеются ввиду практически все функции, необходимые для повседневной работы
    с базами, особенно при сопровождении. При этом хотелось запускать его
    достаточно быстро и максимальное количество функций вынести на горячие
    клавиши. Кроме того, желательно иметь под рукой единый продукт для работы
    с разными форматами баз и индексов.

    	Итак, BDBFS умеет:

    	 - автоматически или принудительно выбирать формат индексов и MEMO
    	 - редактировать записи в режиме BROWSE и EDIT
    	 - печатать выбранную базу, в т.ч. и в файл, причем всю или по
    	   условию
    	 - формировать отчеты
    	 - модифицировать структуру базы
    	 - выводить структуру на принтер или в файл
    	 - оптимизировать структуру
    	 - искать по условию LOCATE / CONTINUE
    	 - искать контекст без привязки к полям
    	 - искать в текущем поле
    	 - копировать записи
    	 - копировать содержимое отдельных полей слева, справа,
    	   снизу и сверху
    	 - устанавливать существующий индекс (или tag)
    	 - делать новый индекс (или tag)
    	 - реиндексировать индексы и полностью перестраивать тэги
    	 - производить "мягкий" поиск по индексу
    	 - производить "расширенный" поиск по индексу
    	 - Replace по условию
    	 - Sum, Count, Total по условию
    	 - Delete/Recall по условию
    	 - Copy to File / Append from, в т.ч. по условию и в текстовых
    	   форматах. Возможно преобразование и переименование полей,
    	   в том числе преобразование формата MEMO-полей
    	 - создавать HTML, XML, XLS файлы, в т.ч. из командной строки
    	 - Устанавливать фильтры
    	 - Сортировать базу
    	 - устанавливать нужный порядок и количество полей, их заголовки.
    	   Возможны вычисляемые поля! При этом выбранный разрез может
    	   быть распечатан и сохранен для дальнейшего использования!
    	 - задавать переменные
    	 - вычислять любое Clipper-выражение
    	 - задавать макросы
    	 - менять диск и директорию
    	 - вызывать второй командный процессор
    	 - очищать сразу всю запись
    	 - делать различные преобразования в текстовых полях
    	 - менять режимы ввода
    	 - работать с мышью
    	 - выбирать все условия по истории
    	 - сохранять и восстанавливать окружение
    	 - читать инициализационные файлы
    	 - выделять цветом различные ячейки по условию
    	 - работать с буфером обмена
    	 - самостоятельно отдавать TimeSlice
    	 - "замораживать" поля для просмотра
    	 - искать максимум/минимум
    	 - прогуливаться по дискам/каталогам (Filer)
    	 - использовать длинные имена Win9?

    	 - и прочие приятные мелочи.

    	Почти все функции можно вызвать как через горячие клавиши, так
    и через меню.

    	Большинство функций понятно любому xBase-систу (хотя знакомство с
    Clipper желательно). Некоторые пояснения ниже. Назначение всех клавиш
    см. в HELP и сводке клавиш.

    2.Поддерживаемые форматы данных.

    	Поддерживаются основные на сегодняшний день форматы xBase-файлов:

    		dBASE3/Clipper	(DBT/NTX)
    		FoxPro		(FPT/IDX/CDX)
    		Visual FoxPro   (измененный заголовок, новые типы полей)
    		CLIP		(CTX, новые типы полей)
    		SIX		(новые типы полей)

    	Если у базы есть memo-поле, то соответствующий драйвер выбирается
    автоматически. Иначе применяется драйвер по-умолчанию, который можно задать
    в ini-файле или в установках(через меню).
    Если в ini-файле ничего не задано, используется драйвер FoxPro (DBFCDX).

    	Форматы dBASE4-5, FlagShip, FlexMemo поддерживаются
    в форсированном режиме.

    3.Редактирование записей.

    	При входе в BDBFS программа находится в режиме VIEW. Для входа
    в режим редакции надо нажать на Enter в выбранном поле, тогда Вы
    получаете практически Browse FoxPro, т.е. доступны клавиши вверх, вниз,
    PgUp, PgDn, Tab, Shift+Tab. Кроме того, BDBFS переходит в режим BROWSE
    при нажатии любой "простой" клавиши в зависимости от типа поля. Например,
    при нахождении курсора в поле типа Numeric, переход в редакцию
    произойдет по нажатию любой цифры, причем эта цифра сразу отображается.
    Для выхода из режима Browse надо нажать Escape или Ctrl+W.
    В отличие от FoxPro(dBase), для редактирования memo-поля специальной
    клавиши нажимать не нужно.

    	Существуют четыре режима ввода в Browse - в обычном("Usual")
    нажатие Enter в последнем поле записи просто останавливает ввод;
    в режиме "Enter/skip" в этом случае происходит переход на первое
    поле следующей записи; в режиме "Lock Enter" нажатие Enter в любом
    поле приводит к спуску на запись ниже в том же поле. В режиме
    "Enter/stop" после нажатия Enter происходит переход к режиму VIEW.
    Режимы можно переключать во время ввода.

    	Кроме режима Browse существует режим Edit с "разворотом"
    записи по вертикали. В него можно перейти из режима View, нажав
    	Alt+E(dit).
    	Иногда удобно отредактировать символьное поле, превышающее
    размер экрана, как memo-поле. Это можно сделать по нажатию клавиши
    	Alt+W(ide).

    	Может быть осуществлен откат изменений (по клавише Ctrl+U, Alt+BS)
    при редакции текущей базы. Размер буфера откатов задается в
    переменной _UndoSize и может быть в пределах от 0 до 4095 действий (по
    умолчанию - 1024). Все глобальные изменения базы (PACK, ZAP, etc)
    приводят к очистке буфера.

    4.Режимы Replace.

    	BDBFS поддерживает три режима Replace в текущем поле:
    		- константным выражением (Alt+F4)
    		- переменным выражением  (Ctrl+F4)
    		- в текущей записи	 (Alt+R)

    	Разницу между Alt+F4 и Ctrl+F4 поясним на примере.

    	Пусть мы стоим в поле NUM на 15 записи. Теперь задаем
    выражение замены Recno()+2 и условие - все записи.

    	Теперь по Alt+F4 во всех записях будет внесено значение 17,
    а по Ctrl+F4 - соответственно 3,5,7..

    	Могут спросить: а зачем нужен Repl в текущей записи, можно ведь
    просто зайти и исправить? Но представьте, что у Вас в поле стоит
    3242756 и его надо умножить на 234. По Alt+R все просто - Field*234.

    	Если при вызове функций замены держать нажатым Shift (например,
    Ctrl+Shift+F4), то на каждой записи, подлежащей замене, будет запрошено
    подтверждение (с показом текущей и предполагаемой величины поля). Это
    особенно удобно при замене переменным выражением.

    	При разборе выражений BDBFS может сделать попытку преобразования
    к текущему типу. Например, если поле символьное, а задается выражение
    замены 123, то оно будет преобразовано к символьному виду. Если текущее
    поле типа DATE, а выражение задается в виде {<date>}, то это будет
    воспринято не как массив, а как константа типа DATE. В случае, когда
    преобразование невозможно, выдается сообщение о несовместимости типов.

    5.Append/Copy.

    	По клавише F3 просто добавляется пустая запись, Alt+F3 предлагает
    скопировать содержимое текущей или последней записи.

    	Можно также нажать F3 в режиме Browse, тогда будет образована
    новая запись со скопированным текущим полем.

    	Можно также сделать Append из файла (Ctrl+F9), причем если в
    имени файла указано расширение не .DBF, то будет сделан запрос на тип
    присоединяемого файла: SDF, WITH DELIMITERS, DBF. То же относится и к Copy
    File (Ctrl+F3).

    	Можно сделать Append из "самого себя", при этом будет задан
    дополнительный вопрос.

    	При присоединении могут возникать конфликтные ситуации двух
    типов: несовпадение типов полей и числовое переполнение. До версии
    BDBFS 1.07 при обнаружении таких ситуаций такие поля оставались
    незаполненными. Начиная с версии 1.07 было принято (спорное) решение
    о максимальном выполнении операций. Это означает, что:
    	при несовпадении типов полей будет выполнена попытка
    преобразования;
    	при числовом переполнении в поле будет записано максимально
    возможное число.Так, если длина поля в текущей базе=3, а присоединяемое
    число=1200, то будет записано 999.

    	При копировании файла можно указать только требуемые поля
    (вручную или подобрав их по Alt+F2).

    	Доступно также преобразование и переименование полей
    при копировании (в базу, но не в SDF). Это своего рода мини
    Query By Example. Например, вы можете задать выражения
    в списке полей:
    	Num,Num*2 AS Double,Upper(Char),CTOF(Char) AS Shifr

    	Если в выражении поля задано ключевое слово "AS", то поле в
    новой базе будет названо так, как Вы попросите (Num*2 AS Double -
    поле в копируемой базе будет называться DOUBLE). Если целевое поле не
    названо (слово AS не употреблено), то поле будет названо Exp_??, где ?? -
    порядковый номер в списке (аналогично FoxPro). Если выражение не может
    быть вычислено, оно игнорируется. См. также описание функции DBTrans().

    	Можно также экспортировать базу в форматы HTML, XML,
    MS EXCEL (XLS). Эти операции доступны через меню Файл -> Экспортировать
    в HTML, Экспортировать в XML, Экспортировать в XLS.

    	При экспорте (в любой формат) по умолчанию выдается запрос на
    перекодировку OEM -> ANSI. Если Вы не хотите, чтобы он выдавался (что
    особенно уместно при вызове экспорта из командной строки,
    нужно в инициализационном файле установить переменную
    _lexp_o2aq:=.F.. Переменная _lexp_o2a при этом будет отвечать за
    необходимость перекодировки: если lexp_o2a==.T. - перекодировка будет
    произведена.

    	Экспорт в XLS осуществляется в формате Biff5/Biff7, т.е. не в
    уникоде. Примечания не записываются, так что длина символьных полей
    ограничена 255 символами. Создаваемая книга содержит 1 лист. Данные
    записываются, начиная со столбца 2 (B), в первом проставляется символ *
    для записей, помеченных к удалению.

    	При экспорте в XML:
    		- в качестве имени корневого тэга используется имя базы
    		  (если оно начинается с цифры - добавляется символ "_");

    		- в качестве имени тэга для записей используется слово
    		  "Record";

    		- поля описываются как тэги, а не как атрибуты;

    		- используются внутренние DTD;

    		- в качестве атрибутов записи используются:
    			- ее физический номер (RecNo);
    			- номер в индексе при установленном индексе
    			  или тэге (KeyNo);
    			- признак удаленности (Deleted - при наличии);

    		- в качестве обязательных атрибутов тэга используются:
    			- "type" - тип поля;
    			- "len"  - длина поля;

    		- в качестве дополнительных атрибутов тэга используются:
    			- "dec" - при наличии дробной части;
    			- "realtype" - когда тип данных отличается от
    			  типа поля (например, Strongly-type VariFields
    			  или для "форсированных" полей);
    			- "valtype" - для полей переменного типа
    			  (Weakly-Typed VariFields или поля типа Variant);

    		- все текстовые поля описываются как секции CDATA;

    		- поля типа DATE выводятся в виде DTOS();

    		- логические поля выводятся как 1/0;

    		- в комментарии записываются:
    			- имя базы;
    			- описание из файла descript.ion (при наличии);
    			- выражение индекса (при установленном индексе).

    См. также описание функций Tb2Html(), Tb2Xml(), Tb2Xls().

    6.SUM.

    	Суммирование всегда происходит по текущему полю, в т.ч.
    можно выбрать и вычисляемое поле.
    	Суммировать можно по числовому или символьному полю
    (т.е. SUM( VAL(field) )). Подразумевается, что Вы знаете, что
    делаете.  Можно использовать и функцию Sum().

    7.Поиск по индексу(тэгу).

    	При поиске по индексу типа DATE не обязательно писать CTOD.
    Так, одинаково правильно
    		12/03/93  CTOD('12/03/93')  DATE()

    	При поиске по индексу символьного типа значение надо заключать
    в кавычки. Впрочем, если выражение поиска начинается с цифры или символа
    с кодом более 127, то кавычки не обязательны.

    	По умолчанию поиск ведется в режиме SoftSeek OFF
    (SET NEAR - для привычных к FoxPro). Чтобы задать режим SoftSeek ON
    надо сделать
    		{Alt+G} Set(9,.t.)	// см. Set.CH,
    или задать =Set(9,.T.) в ini-файле.

    	Иногда бывает нужным найти неуникальные записи в индексе.
    Это можно сделать с помощью клавиши Alt+2. Курсор при этом установится
    на дублирующую запись.

    	Доступен также поиск по маске (естественно, в индексе символьного
    типа). Правила задания маски аналогичны DOS. Например, можно задать:

    	{Alt+[} 'B?LL',	// Найдено: BILL
    	{Alt+Shift+[}		// Продолжили и нашли: BYLL

    	{Alt+[} "*МОСКОВС*"	// Найдено: МОСКОВСКАЯ ПЛОЩАДЬ
    	{Alt+Shift+[}		// МОСКОВСКАЯ УЛИЦА
    	{Alt+Shift+[}		// ПРОСПЕКТ МОСКОВСКИЙ

    8.Выражения условий.

    	При выборе многих функций BDBFS, у Вас будет запрошено
    условие отбора или поиска. Варьировать выражения в таких условиях
    можно достаточно широко. Могут быть применены любые как системные,
    так и пользовательские функции. Единственное ограничение - длина
    выражения(не более 255 символов).

    9.Set Fields.

    	По Ctrl+F2 Вы можете задать содержание, названия и порядок
    полей. Содержанием поля может быть любое допустимое выражение.
    	В названии допустимы символы нац.алфавитов, причем эти названия
    будут выводиться и при печати.

    	Пример:
    		Содержание поля: IS+DOS-KOS
    		Название: Исходящий остаток

    	Для поля также может быть задан шаблон вывода и печати (picture).
    Например, 999,999.99. Форматы шаблонов можно посмотреть в документации
    к любому xBase. Кроме того, можно принудительно установить ширину поля.
    Обычно это имеет смысл, когда ширина данных поля значительно меньше
    ширины заголовка.

    	При пометке поля, как удаленного, оно блокируется для вывода и
    редакции. При помощи клавиш F8/F7 можно блокировать/разблокировать сразу
    все поля, начиная с текущего.

    	Установка нужного порядка полей осуществляется при помощи
    Ctrl+Up или Ctrl+Down (обмен полей местами).

    	Завершить изменения можно клавишей F10. Наблюдайте результат.
    Если затем вновь нажать Ctrl+F2, будет восстановлено исходное состояние
    базы.

    	Вычисляемые поля редакции не подлежат (при переходе на такое поле
    курсор не виден). Тем не менее, их можно использовать в выражениях.

    	Требуемый порядок и содержание полей можно устанавливать
    последовательно. Предположим, мы убрали из просмотра поле S2. Нажали
    F10. Посмотрели и решили, что не хотим видеть и поле S3, а не только S2.
    Последовательность действий: Ctrl+F2 (восстановили все поля), снова
    Ctrl+F2, затем F5 и получаем предыдущие установленные поля. Правим
    дальше, etc.

    	На Copy File Set Fields влияние не оказывает.

    10.Вычисление выражений.

    	По нажатию Shift+F6 (Alt+G(o),?) можно вычислить почти любое
    корректное Clipper выражение длиной до 255 символов. Не говоря уж о
    том, что частенько нужно вспомнить н-р, какое число было Date()-21
    или быстренько взять Log(Exp(1)) :-), получился довольно интересный
    тренажер Clipper-иста. Можно, например, поэксперементировать
    с параметрами Memoedit, понять, наконец, чем отличается Bin2i от Bin2w
    или поинтересоваться, что такое Descend('rs|Аpd').

    	Можно использовать почти все функции из Clipper.Lib и Extend.Lib,
    ряд полезных (на мой взгляд) функций известных библиотек Six3, NanFor,
    Clipper Tools, Netto, Blinker, эмуляцию некоторых функций FoxPro, а также
    специальные функции BDBFS.
    	Список функций приведен в Приложении IV.

    11.Задание переменных.

    	По Ctrl+F5 вы можете проинициализировать переменную (или
    задать ей новое значение).

    	Для простой переменной нужно просто выполнить присвоение

    		new=5
    		word:='папа'
    		today=date()

    	Для объявления массива его надо описать:

    		arr[20] или arr=Array(20)

    	Затем уже можно сделать Arr[3]=Exp(12.09).
    	Впрочем, можно и прямо написать: Arr={10,20,'пример'}

    	В правой части допустимы любые верные Clipper выражения.

    	Зачем все это нужно ?

    	Иногда удобно вычислить выражение, а потом его использовать
    в условиях или Replace. Используя присвоение переменных и вычисление
    выражений можно даже писать небольшие программки. Попробуйте, н-р, сделать
    следующее:
    	{Ctrl+F5}	aPrg=Array[Adir('*.prg')]
    	{Alt+G}		Adir('*.prg',aPrg)
    	{Alt+G}		ForAch(5,10,24,'Программы',aPrg)

    	У вас в директории есть индекс, который имеет нестандартное
    расширение.

    	{Ctrl+F5}	_oldind='MyOwn.FIL'
    	{Ctrl+F5}	_req=0

    	Нужно выбрать базу из резервных копий.

    	{Ctrl+F5}	_mask='*.bak'
    	{F4}

    	Хотите напечатать базу мелким шрифтом и с лозунгом.

    	{Ctrl+F5}	_PSCode='Б У Д Ь М О !!!'+chr(15)
    	{F2}

    	Можно присвоить блок кода

    	{Ctrl+F5}	bck={|i|i+1}	, затем
    	{Alt+G}		Eval(num)

    	И вообще: была бы возможность, применение найдется.
    	Несколько примеров есть в Examples.Ini.

    12.Модификация структуры.

    	После изменения структуры предыдущая версия остается с
    расширением BAK. Если существовал memo-файл, то он остается
    с расширением TBK.

    	Если при модификации возникает ситуация числового переполнения,
    то в поле будет занесен 0.

    	В программе реализован известный Clipper-истам трюк - образование
    символьных полей с длиной более >255 символов. Это делается так: в поле
    Field_Dec записывается Mod(L,256), в поле Field_Len - остаток. Например:
    длина поля 700. Тогда Field_Dec=2, Field_Len=188. Но чтобы ввести нужную
    длину в BDBFS достаточно исправить Field_len. Нужные величины будут
    занесены автоматически.

    	По клавише F9 (кроме драйвера SIXMDX) вызывается функция
    оптимизации структуры. Она проводится с использованием VariField полей
    по следующим правилам:
    	- символьные поля с длиной > 16 преобразуются в формат V10;
    	- MEMO поля преобразуются в формат V6 (ZeroField);
    	- числовые поля с длиной от 5 до 10 байт преобразуются в
    	  формат V4 (Integer);
    	- поля даты преобразуются в формат V3.

    	Могут быть заданы поля, названные не-по-английски.

    13.Вставка записи.

    	Как известно, Clipper операции INSERT не имеет. Но иногда очень
    хочется. Поэтому приходится идти тяжким путем:APPEND, сдвинуть все вниз,
    очистить верхнюю. На больших базах это может быть долго. При
    включенном индексе или тэге INSERT не работает.

    14.TOTAL и SORT.

    	Отличия команды TOTAL в BDBFS и в Clipper:

    	- не поддерживается TOTAL без установки индекса/тэга
    	  (в отсортированной базе);
    	- в целевую базу копируются все поля (в Clipper memo-поля
    	  исключаются);
    	- если существует поле TOTALCOUNT, то в него будет
    	  записываться количество подсуммированных записей по
    	  каждому ключу;
    	- не поддерживаются поля заданные через alias (а зачем?).

    	Отличия команды SORT в BDBFS и в Clipper:

    	- может быть сортировка по memo-полю (по первым 255 символам);
    	- удаленные записи сохраняют свой статус в отсортированной базе.

    15.Сохранение/восстановление окружения.

    	Вы можете определить любые переменные, задать условия поиска и
    суммирования, определить индекс и необходимые поля и проч., а затем
    сохранить все это в обычном memo-файле, нажав Shift+F1.
    	Если затем нажать Shift+F5 и задать имя этого файла, все
    окружение, включая используемый DBF, будет, по-возможности, восстановлено.
    Мало того, можно сразу загрузить окружение, задав имя MEM-файла в командной
    строке. Разумеется, может быть сколько угодно файлов окружения в каталоге.
    	По умолчанию используется файл BDBFS.MEM.
    	Если в INI-файле (или непосредственно из программы) определена
    переменная _AutoSave:=.T., то в текущем каталоге файл BDBFS.MEM создается
    автоматически при выходе.
    	Если в INI-файле определена переменная _AutoRestore:=.T. и
    BDBFS.EXE запускается без параметров, то файл BDBFS.MEM из текущего
    каталога считывается автоматически.

    16.Инициализационные файлы.

    	Вы можете при загрузке (bdbfs <файл.ini>) или позже, по нажатию
    Ctrl+F12, прочитать содержимое файла инициализации. Файл инициализации
    представляет из себя обычный текстовый файл, содержащий присвоение
    переменных, а также, возможно, выполнение некоторых функций,
    мини-программ. Фактически, большинство операций, используемых
    в Clipper и прочих xBase-диалектах, допустимы в ini-файлах. Переменные,
    определенные в ini-файлах, будут затем доступны в программе. Операторы,
    определенные специально для BDBFS должны предваряться символом #.
    В операторах, совпадающих по синтаксису с Clipper символ # может
    отсутствовать (если этого не требует синтаксис самого Clipper).

    	Определены следующие операции.

    A.Присвоение.

    	Синтаксис:
    		<var>:=<expression>		или
    		<var> = <expression>		или
    		#define <var> [<expression>]	или
    		#undefine <var>

    	Примеры:
    		MyVar=100
    		MyVar := 100
    		MyVar=Sqrt(4)
    		#define MyVar 100
    		#undef MyVar

    	В случае #define, в отличие от include файлов Clipper и C,
    переменные будут объявлены и доступны не только во время чтения файла
    инициализации. Если в #define опущено , оно принимается равным
    .T. . Операция #undef уничтожает переменную.
    	Полезным может оказаться задание в ini-файле блоков кода.
    Позже их можно будет вычислять, обращаясь как к функции.

    	Пример:
    	// в ini-файле
    		Squart = {|i|	'Площадь круга радиуса '+STR(i,3)+;
    				' = '+LTRIM(STR(3.1415 * i * i,16,2))}

    	// в программе
    		{?} Squart(4)		или
    		{?} Eval(Squart,4)

    B.Вычисление функции без присвоения переменной.

    	Синтаксис:
    		=<expression>	или
    		<expression>

    	Пример:
    		=Tone(440,3)
    		Eval(bEval, 100)

    	Использование формы с начальным символом "=" обязательно если
    символ "=" есть и в самом выражении. В остальных случаях операторы
    эквивалентны
    		=Devout('S='+S)		// Обязательно с первым =

    C.Включение вторичного файла инициализации.

    	Синтаксис:
    		#include <FileSpec>

    	<FileSpec> может включать путь и/или расширение (по умолчанию -
    .ini). Если путь не задан, то файл будет искаться последовательно в:
    	- текущем каталоге
    	- каталогах, определенных глобальной переменной _PlugDir (по
    	  умолчанию - каталог bdbfs.exe\PLUGINS)
    	- в каталогах, определенных переменной окружения SET INCLUDE.

    	Примеры:
    		#include second.ini
    		#include 'second'
    		#include c:\my\second.ini

    	Поскольку поддерживается операция #define, то можно включать
    стандартные клипперовские файлы определений, такие, как inkey.ch, Set.ch.
    Надо только иметь в виду, что #define с параметрами не поддерживается.

    	Вниманию клипперистов и С-онистов: имя файла можно задавать без
    кавычек.

    D.Определение команды.

    	Синтаксис:
    		#xcommand <matchPattern> => <resultPattern>

    	Примеры:

    	  #xCommand INVERT =>;
    		DBEval({||Rlock(), IF(DELE(),dbRecall(),dbDelete())})

    	  #xCommand MODIFY COMMAND <x> => ModiFile(<x>)

    	  #xCommand EOM(<x>) => FT_LDAY(<x>)

    	В отличие от команд препроцессора Clipper, поддерживается только
    один параметр (или отсутствие параметров).

    	Наиболее естественно применять команды из вычисления выражений,
    например:
    		? INVERT

    E.Определение локальной таблицы команд.

    	Синтаксис:
    		#LOCALTABLE

    	Команды (определенные оператором #xcommand) занимают определенное
    место в памяти и несколько замедляют выполнение операций вычисления (так
    как для каждого выражения проверяется подстановка). Поэтому может
    оказаться полезным держать в памяти команды только тогда, когда они
    реально могут понадобиться.

    	Пример:
    		#LOCALTABLE
    		#include MyCmd.ch
    		...

    	В файле MyCmd.ch определен ряд команд, которые используются в
    текущем ini-файле. Предварительное задание #LOCALTABLE гарантирует, что
    после завершения интерпретации ini-файла, ресурсы, занятые под эти
    команды, будут высвобождены.

    F.Определение макрокоманд.

    	Синтаксис:
    		#MACRO <код клавиши> => <последовательность нажатий>, или
    		#MACRO_IN_[область действия] <код клавиши> =>
    					     <последовательность нажатий>

    	Последовательность нажатий может быть задана либо как символьная
    строка(формат KEYBOARD), либо как массив кодов(формат INKEY). Во втором
    случае можно задать функциональные и расширенные клавиши, но длина
    последовательности до 16 нажатий (см. описание устройства буфера клавиатуры).
    Последовательность может быть задана блоком кода, что позволяет выполнять
    переменные действия.

    	Могут быть заданы следующие модификации области действия
    макрокоманды:
    		#MACRO_IN_BROWSE - основной режим,
    		#MACRO_IN_DIALOG - режим задания условий, списка полей,
    		#MACRO_IN_FIELD  - режим коррекции поля,
    		#MACRO_IN_MEMO	 - режим редакции MEMO и текстовых файлов.

    	Если область действия не указана, макрокоманда действует всегда.

    	Примеры:
    		#MACRO 307 => {-9,'ч','5'}
    		;банковские функции через меню на Alt+Б

    		#MACRO_IN_FIELD 308 => 'Это будем частенько нажимать при
    		редакции'
    		;на Alt+>

    		#MACRO_IN_DIALOG 383 => 'Like("*",&_C_F)'+REPL(CHR(19),9)
    		;На Alt+* удобное задание шаблона для поиска

    		#MACRO_IN_DIALOG 276 => {|| Time()}
    		;По Alt+T в диалоге вводится текущее врем

    G.Объявление переменных.

    	Синтаксис:
    		LOCAL <v1>[:=<xv1>],<v2>[:=<xv2>] или
    		PRIVATE <v1>[:=<xv1>],<v2>[:=<xv2>] или
    		PUBLIC <v1>[:=<xv1>],<v2>[:=<xv2>]

    	Переменные, объявленные LOCAL и PRIVATE будут автоматически
    освобождаться по завершению интерпретации ini-файла. BDBFS на данный
    момент не различает объявления LOCAL и PRIVATE. Оператор PUBLIC, вообще
    говоря, не обязателен, поскольку все ранее необъявленные переменные будут
    объявлены PUBLIC. Но PRIVATE и PUBLIC введены для большей совместимости с
    уже существующими программами на диалектах xBase.

    	Примеры:
    		#LOCAL cFile, nSum

    		LOCAL cFile:="MyFile"

    		PUBLIC summa

    H.Аварийное прекращение интерпретации.

    	Синтаксис:
    		#BREAK	или
    		#BREAK <условие>

    	Если задан #BREAK без параметров, интерпретация немедленно
    прекращается, в противном случае, выход происходит при выполнении условия.

    	Пример:
    		#BREAK !FILE("NeedFile")

    I.Параметры и возвращаемые значения.

    	Инициализационному файлу можно передать до 5 параметров, при
    интерпретации они будут доступны через идентификаторы _1.._5
    соответственно. Можно также определить значащие имена параметров в
    операторе PARAMETERS.
    	Синтаксис:
    		PARAMETERS <Список>

    	Пример:
    		PARAMETERS nVal,cVal,xVal

    	Если ini-файл должен вернуть какое-то значение, необходимо
    определить оператор #RETURN.
    	Синтаксис:
    		RETURN <expression>

    	Примеры:
    		#RETURN 4
    		RETURN _1*_2

    	Оператор #RETURN не заканчивает программу немедленно, а только
    присваивает возвращаемое значение.

    	Вызов ini-файла с параметрами и возвратом можно осуществлять
    через вызов функции чтения ini-файлов или прямым вызовом по имени
    ini-файла.
    	Примеры:
    		// Вызов в программе
    		{?} RestoreIni("MyPlug",par1,par2)	или
    		{?} MyPlug(par1,par2)

    		// Вложенный вызов из ini-файла:
    		MySqrt:=RestoreIni("Sqrts.prb",32.1,3)	или
    		MySqrt:=Sqrts(32.1,3)

    	Единственное ограничение при прямом вызове по имени - ini-файл
    должен иметь расширение ini, что необязательно в случае использования
    RestoreIni(). Так, во втором примере вызов MySqrt:=Sqrts(32.1,3) не
    сработает, т.к. файл Sqrts имеет нестандартное расширение.

    J.Ветвление по условию.

    	Синтаксис:
    		IF <условие1>
    			<команды>
    		[ELSEIF <условие2>
    			<команды>
    		[ELSE]
    			<команды>
    		ENDIF

    	Аналог обыкновенного IF. Допускается вложенность до 10
    операторов IF в одном ini-файле. Объявления с символом # и без него
    можно смешивать.

    	Пример:

    	#IF Continue("Do you want to make something?")
    		...
    		операторы, этот самый Something осуществляющие
    		...
    	#ELSE
    		Nfind("May be next time...")
    	#ENDIF

    	Частный случай оператора #IF - это операторы #IFDEF, #IFNDEF,
    часто использующиеся в include-файлах для предотвращения повторной
    загрузки файла.

    	Примеры:

    	// из set.ch Clipper
    	#IFNDEF _SET_CH
    		... объявления констант

    		#DEFINE _SET_CH
    	#ENDIF

    	// из PLUGINS\clipper.ch
    	#IFDEF _CLIPPER_CH
    		#BREAK		// если уже читали - сразу выйдем
    	#ENDIF
    	...
    	#DEFINE _CLIPPER_CH

    	В операторах #IFDEF, #IFNDEF символ # обязателен.

    K.Ветвление CASE

    	Синтаксис:
    		DO CASE
    			CASE <условие1>
    				<команды>
    			[CASE <условие2>
    				<команды>
    			...
    			[OTHERWISE]
    				<команды>
    		ENDCASE

    	Аналог обыкновенного CASE. Допускается вложенность до 10
    операторов CASE в одном ini-файле. Операторы DO CASE и IF/ELSEIF
    эквивалентны. Фактически, можно даже смешивать синтаксис, то есть писать,
    например,
    		DO CASE .. CASE .. ELSE .. ENDCASE,
    хотя это, разумеется, не рекомендуется.

    	Пример:

    	DO CASE
    		CASE  _1 < 0
    			s := s - _1
    		CASE  _1 = 0
    			s := 0
    		OTHER
    			s := s * _1
    	ENDCASE

    L. Цикл WHILE

    	Синтаксис:
    		[DO ]WHILE <условие>
    			<команды>...
    			[EXIT]
    			<команды>...
    			[LOOP]
    		ENDWHILE или ENDDO

    	Аналог обыкновенного WHILE. Допускается вложенность до 10
    операторов #WHILE в одном ini-файле.

    	Примеры:

    	sum:=0
    	#WHILE !EOF()
    		sum:=sum+FieldGet(1)+FieldGet(2)
    		DBSKIP()
    	#ENDWHILE

    	WHILE .T.
    		....
    		IF inkey(0)=27	//ESC
    			EXIT
    		ENDIF
    	ENDDO

    M. Цикл FOR.

    	Синтаксис:
    		FOR <счетчик> = <от> TO <до> [STEP <шаг>]
    			<команды>...
    			[EXIT]
    			<команды>...
    			[LOOP]
    		NEXT или ENDFOR

    	Аналог обыкновенного FOR. Допускается вложенность до 10
    операторов FOR в одном ini-файле.

    	Пример:
    		FOR i:=1 TO 100 STEP 2
    			s:=s+i
    		NEXT

    	Для организации циклов в ini-файлах можно также воспользоваться
    функциями For() и While() - см. приложение IV.
    Использование функций по сравнению с операторами FOR и WHILE менее
    наглядно, но дает значительный выигрыш в скорости.

    N. "Пустые" операторы

    	Синтаксис:
    		MEMVAR 	или
    		FIELD 	или
    		EXTERNAL

    	Эти операторы игнорируются при считывании и введены для большей
    совместимости с уже существующими программами.

    	Инициализационные файлы, аналогично #include, ищутся помимо
    текущего каталога в пути, определенном переменной _PlugDir, а
    затем в пути, заданной переменной окружения SET INCLUDE.

    	В демонстрационном файле Examples.ini и в каталоге PLUGINS
    содержится много различных примеров. См. также п.32.

    	При старте программы всегда делается попытка считать файл
    BDBFS.INI, находящийся в каталоге запуска BDBFS.EXE. Если файл
    инициализации не задан в командной строке то затем делается попытка
    считать файл BDBFS.INI, находящийся в текущем каталоге (при его отсутствии
    ищется BDBF.INI - для совместимости c предыдущими версиями BDBF).

    	Вызов ini-файла из программы (например, через Ctrl+F12) приводит к
    принудительному переоткрытию текущей базы. Если Вы этого не хотите, в
    любом месте ini-файла необходимо определить переменную
    	lNoReOpen:=.T.

    16.1.AutoOpen файлы.

    	Кроме обычных, дополнительно могут быть заданы инициализационные
    файлы, считываемые при открытии соответствующей базы (AutoOpen файлы).
    Такой файл должен иметь расширение .AOP и может содержать команды, меню,
    переменные, специфичные для данной базы. Кроме того, может быть задан
    список и/или названия полей, а также формат их вывода. Список полей
    должен быть задан как массив с именем Fields, список названий - как
    массив с именем Heads, список форматов - Pictures, список "ширин" полей -
    Widths. Могут задаваться и вычисляемые поля. Если для поля не задано
    имя, формат, ширина - используются умолчательные величины.

    Пример:
    	Fields:={'Char','Num','Num*2'}
    	Heads:={'Строка','Число','Двойное;число'}
    	Pictures:={, '999,999.99'}
    	Lens:={7,,,}

    	Иногда возникает необходимость показывать все поля, кроме
    некоторых. В этом случае можно (особенно, если полей много) не
    перечислять все нужные поля, а указать исключаемые. Это делается с
    помощью оператора #EXCLUDE.

    	Синтаксис:
    		#EXCLUDE <Список исключаемых полей>

    	Пример:
    		#EXCLUDE Secret, KeyField

    	В AutoOpen файлах можно хранить и другие полезные инструкции,
    для успешного применения которых желательно изучить Приложение IV.
    Так, например, можно заставить базу открываться с уже установленным тэгом.
    Для этого можно написать __TagNom:=NN, где NN - номер нужного тэга,
    или __TagName:='CC', где CC - имя нужного тэга.

    	Вы можете интерактивно задать нужные поля (через Ctrl+F2),
    установить активный тэг или индекс, а затем сохранить все это в AOP-файле
    по Ctrl+Shift+F1.

    	Вы можете также задать действия, выполняемые при закрытии базы,
    то есть в момент выхода из программы или смены текущей базы. Операторы,
    выполняемые при закрытии должны располагаться в AutoOpen файле после
    определения секции [close].

    	Пример:

    	// При открытии запомним время создания файла
    	aD:=Directory('WrkBase.DBF')
    	tOld:=aD[1,4]

    	[close]
    	// Резервное копирование после возможных изменений
    	DBCommit()	// Убедимся, что буфера сброшены
    	aD:=Directory('WrkBase.DBF')
    	IF tOld <> aD[1,4]
    		__DbCopy('Z:\ARCHIVE\RsrvBase')
    	ENDIF

    17. Макроклавиши.

    	По нажатию Ctrl+F1 вызывается последовательность символов,
    запомненная в переменной _MACRO. В режиме просмотра эта возможность
    работает как Set Key, в редакции - как Set Function.

    	Пример:

    	{Ctrl+F5} 	_Macro=chr(4)+chr(4)+chr(13)

    	Теперь, в режиме просмотра, по {Ctrl+F1} вы войдете в редакцию поля
    CurrentField+2

    	{Ctrl+F5}	_macro='Bravo !'

    	Теперь, в режиме редакции, по Ctrl+F1 в поле будет записан текст
    Bravo !

    	Это удобно, когда надо в интерактивном режиме занести во многие поля
    сходную информацию.

    	В режиме редакции дополнительно определены следующие макросы:
    		Alt+(	=	() и курсор внутри скобок
    		Alt+)	=	() и курсор снаружи
    		Alt+{	=	{}
    		Alt+"	=	[]
    		Alt+A	=	.AND.
    		Alt+O	=	.OR.
    		Alt+B	=	{||}
    		Alt+C	=	CTOD("//")

    	Это особенно удобно при задании выражений условия.

    	Можно определить и свои макроклавиши:

    		{Alt+G} __SetFunction(<код клавиши>,<macros>),
    	или с помощью команды #MACRO в ini-файле.
    	Кроме того, в режиме редакции доступны "горячие" клавиши
    преобразований текущего фокуса ввода (такие же действуют и в BROWSE):
    		Alt+U	= UpperCase
    		Alt+L	= Lower
    		Alt+K	= Capitalize
    		Alt+P	= Proper
    		Alt+Q	= QWERTY->ЙЦУКЕН (если вы случайно набрали что-то
    			  в "английской" раскладке вместо "русской").
    		Alt+Y	= наоборот.

    18.Выход в OS.

    	При выходе в DOS (Alt+F10) BDBFS занимает в памяти 8k.

    	Если Вы хотите прямо запустить из под BDBFS большую программу,
    можно воспользоваться функцией

    	{Alt+G} BliRun('FoxPro').

    19.Использование мышки.

    		В режиме просмотра действуют следующие правила:

    	- любая кнопка на строке названия базы = Select Base
    	- любая кнопка на строке названий полей = Set Fields
    	- любая кнопка на функциональной строке = соответствующей
    	  функции (исключение: правая на F10 заканчивает без спроса),
    	  в т.ч. и с Ctrl, Shift и Alt
    	- любая кнопка на нижней полоске скроллинга - сдвижка на
    	  относительную позицию поля в файле
    	- любая кнопка в основном пространстве (4-MaxRow()-3 строка) =
    	  переход на это поле
    	- левая кнопка на том же самом поле = Enter
    	- правая - вызов контекстного меню
    	- любая кнопка на MaxCol() колонке - сдвижка в файле на
    	  относительную позицию.

    		В режиме выбора по Achoice (н-р, при выборе индекса):

    	 - правая=Escape
    	 - левая на верхней рамке = PgUp
    	 - левая на нижней рамке = PgDn
    	 - левая внутри - первый раз:встать на элемент, второй:выбрать

    		В меню и в режиме редакции:

    	 - правая=Escape
    	 - левая=Enter

    		При выводе предупреждающих сообщений - любая=Аникею.

    20.Совместимость с FoxPro.

    	BDBFS умеет смотреть и редактировать файлы FoxPro, в т.ч.
    Visual Foxpro. Полностью поддерживаются индексные файлы, за исключением
    некомпактных.

    	Как уже отмечалось, в Browse поддерживаются клавиши
    Tab, Shift+Tab, Ctrl+T.
    	Системные переменные печати и количества обработанных записей имеют
    те же названия, что и в FoxPRO.
    	В выражениях можно использовать почти все функции FoxPro,
    не связанные с экранными (Screen, Menu) и печатными формами.
    	Обеспечивается правильность блокировок в сети.

    	Существует "языковая" проблема в BDBFS, связанная с разницей
    в диалектах Clipper и FoxPro.
    	Существует CDX, одноименный с базой(а это чаще всего).
    	В этом CDX есть тэг, созданный с помощью некорректного (с точки
    зрения CLIPPER, но не FOXPRO) выражения. В этом случае драйвер
    отказывается работать с таким CDX вообще, с сообщением об ошибке в
    выражении. BDBFS же работу продолжает, но индексы не открыты. Где
    возможно, надо такие тэги заменить на корректные.

    	Если в текущем каталоге есть файл EUROPEAN.MEM, он считывается
    при старте.

    21.Работа в сети и мультизадачных системах.

    	Все файлы открываются в режиме совместного использования для
    записи, что позволяет различным процессам использовать одну и ту же базу.
    	Проверки проводились в сети NOVELL и в сессиях WINDOWS, OS/2, DV.

    	Гарантируется совместная работа с xBase приложениями,
    использующими стандартный режим блокировок. Не гарантируется совместна
    работа, н-р, с Dbview от Norton-a.

    	BDBFS самостоятельно отдает TimeSlice, так что при работе в
    многозадачных системах нет необходимости в посторонних программах
    типа TAME.

    22.Обработка ошибок.

    	Вообщем-то, предпринято немало мер к тому, чтобы неправильные
    действия не завершали полностью работу. Кроме того, ряд возможных
    конфликтных ситуаций обходятся до их возникновения.

    	Все же ошибки программы не исключены.
    	В этом случае BDBFS рисует рамочку и пишет что-то вроде
    		"Неверное выражение	трам-тарарам "
    Большая просьба: запишите это трам-тарарам и сообщите автору.
    Но имейте в виду, что такое сообщение может возникнуть и в результате,
    н-р, Вашего неверного ввода выражения, тогда надо просто поправиться.

    	Существует, однако, ряд невосстанавливаемых ошибок, н-р,
    "Disk full". Возникнуть она может, например, при копировании файла
    (проверить заранее трудно, т.к. неизвестно, сколько места займет файл,
    отобранный по условию).

    23.Выражения цветности.

    	Вы можете выделить цветом в текущем поле записи, отвечающие
    определенному условию. Например,

    		{Alt+B} data > date()

    	Цвет определяется 6 и 7 парой основного цвета редакции.
    Имейте ввиду, что удаленные записи показываются 4 и 5 парой.

    	Изменить цвета можно, исправив переменную _bm, через
    задание выражений или меню Файл - Установки - Цвета.

    	Чтобы снять подсветку (вернуться к стандартным цветам), надо нажать
    Alt+Shift+B.

    24. Работа с буфером обмена.

    	В BDBFS поддерживается буфер обмена, который действует и в
    режиме View и в режиме Get. Для записи значения текущей ячейки в режиме
    View или текущего значения редакции - нажмите Ctrl+Grey+. Для ввода в
    ячейку (при соответствии типов) - Alt+GreyEnter или Ctrl+Grey-.

    	 Непосредственно с ClipBoard и текущей ячейкой можно производить
    операции 	+ - * /
    (последние 2, естественно, только с числовыми значениями), нажима
    Alt+соответствующие серые. Посмотреть текущее значение ClipBoard можно
    по Ctrl+Enter.

    	В режиме редактирования memo-полей доступен вывод из ClipBoard.
    Во время вывода результата вычисления, суммирования, etc доступна
    запись вычисленного в ClipBoard. Впрочем, можно и прямо в поле.

    	Операции занесения в буфер доступны и при выводе результатов
    операций.

    	Очень удобно пользоваться ClipBoard для задания различных
    условий. Например, Вы задали длинное выражение поиска. Запомните
    его по Ctrl+. Теперь Вы хотите все записи, удовлетворяющие этому
    условию скопировать. Перейдите в диалог копирования и при запросе
    условия нажмите Ctrl-.

    	Буфер содержит все значения, помещенные в него в текущем сеансе.
    Если их больше одного, то при вставке предлагается выбор. Если Вам не
    нравится такое поведение, можно через меню или в файле инициализации задать
    значение переменной _ClipChoice:=.F., тогда всегда будет использоваться
    последнее значение.

    	При работе в Windows доступен и системный ClipBoard.
    Туда (и оттуда) можно скопировать текущее поле. Эти операции доступны
    через Ctrl+Ins, Shift+Ins (серые). Для использования системного буфера
    в Windows 2000/XP необходимо наличие утилиты bdb_wclp (включена в
    поставку) где-нибудь в пути.

    25.История условий и выражений.

    	Все условия, выражения, списки полей, задаваемые во время сеанса
    работы, а также результаты вычислений, суммирования, подсчетов заносятся
    в историю, при этом проводится контроль на неповторяемость. Соответственно,
    при задании условий и выражений, можно эту историю использовать.
    	Клавиша F4 (Ctrl+Down) вызывает историю текущего условия,
    		Alt+F4 (Ctrl+Shift+Down) - всех условий,
    		Ctrl+F4 - результатов.

    Ненужные условия можно стирать при помощи клавиш F8 или Ctrl+D.

    26.Стек позиций.

    	Можно запомнить до 10 позиций(записей) в базе и переходить к ним
    по мере надобности. Такая возможность характерна для текстовых редакторов;
    не знаю, насколько она будет полезна здесь. Тем не менее, WordStar &
    Borland были "ограблены" и по Ctrl+K 0..9 устанавливаются закладки,
    восстанавливаемые по Ctrl+Q 0..9. После нажатия Ctrl+K или Ctrl+Q нажатие
    0..9 ожидается в течение 20 секунд, затем сбрасывается.

    27.Редакция memo-полей и внешних файлов.

    	Для редакции memo-полей, а также внешних файлов (по нажатию F4
    в файлере или через меню "Файл" - "Редактировать текст"), можно
    использовать внутренний или внешний редактор. Внутренний редактор
    использует стандартный MemoEdit и используется, если не задана (например,
    в ini-файле) переменная _MemoEditor. Переменная может быть задана как
    строка, например, _MemoEditor:='c:\medit\me.exe' (тогда всегда будет
    вызываться MultiEdit) или как массив массивов вида:
    	{Маска названия поля,	// н-р "BMP*"
    	 Внешний редактор,	// н-р "ME"
    	 Смещение в memo-поле,	// по умолчанию 0 - все поле
    	 Дополнительные опции,	// по умолчанию отсутствуют
    	 Временный файл		// по умолчанию $$BDBF$$.COM
    	 }.

    	Внешний редактор может быть не задан, тогда предполагается, что в
    memo-поле находится программа (например, скрин-сейвер), которая и
    запускается на выполнение. Смещение в memo-поле бывает нужно задать,
    если, скажем, memo-поле хранит разнородную информацию. Например, база -
    пример из поставки Delphi (fish.dbf) содержит поле BMP, в котором сама
    картинка хранится с 9 позиции.

    Пример:
    	_MemoEditor:={	{'BMP','pv',9,' /d'},;
    			{'SAVER','',0,'','tmp.com'},;
    			{'*','ME',0,''} }
    	Итак, на поле с названием BMP будет вызываться PV.EXE, поле с
    названием SAVER содержит исполняемые программки, а для редакции всего
    остального будет вызван MultiEdit.

    	Внутренний редактор не может редактировать файлы размером более
    64K. Но и при использовании внешнего редактора надо помнить, что
    memo-поля формата DBT не способны хранить секции более 64K. Если Ваш файл
    имеет большую длину, то при записи его в поле формата DBT он будет
    обрезаться.

    28.Печатные формы.

    	Помимо обычной печати по F2, можно использовать специальные
    определения для печати форм из любых баз. Формы хранятся в обычных
    текстовых файлах и содержат инструкции для определения колонок,
    группировок, суммировок и т.п..

    	В печатных формах (файлах-репортах) применяются следующие
    переменные:

    	_aExpr - массив выражений для каждой колонки.
    	_aHead - массив заголовков колонок. Умолчание == _aExpr
    	_aElen - массив ширин колонок. По умолчанию принимается
    максимальным из ширины поля, ширины заголовка колонки и ширины шаблона
    (_aPict) для данного поля. Если ширина выводимого поля больше,
    чем ширина колонки, то делается корректный перенос (до 10-и строк на
    колонку) по разделителям: пробел, точка, запятая, точка с запятой,
    табуляция.

    	_aPict - массив шаблонов колонок
    	_aTitle - массив заголовка отчета. Умолчание - ничего.
    		  Может быть задан как строка или массив строк
    	_cFile - файл вывода. Умолчание - имя базы+'.PRN'
    	_aSum - массив необходимости суммирования данной колонки
    	_fCondit - условие печати
    	_aFooter - имя дополнительной процедуры, печатающей подвал или
    		   массив, содержащий подвал
    	_pEveryStep - имя дополнительной процедуры или блока выполняющейся
    перед печатью каждой строки, удовлетворяющей условию _fCondit

    	_aGroup - массив, задающий подбивку по группе.
    		Структура массива:
    		{ <Выражение группирования>,;
    		  [<массив или блок для печати заголовка группы>],;
    		  [<массив или блок для печати подвала группы>],;
    		  [<печать суммы только если в группе более 1 элемента>]
    		}.
    	Умолчание для:	заголовка группы: 'Код '+&<Выражение группировки>.
    			подвала группы: 'Всего'.
    			печати суммы: .F. (печатать сумму всегда).

    _nDouble - признак необходимости вывода в две колонки на листе.
    	   Если 0 или не задан - печатается одна. Если задан числовой
    	   параметр - воспринимается как количество пробелов между двум
    	   колонками.

    _NoAsk - ничего не спрашивать (принимаются заданные в файле условие
    	 печати, файл вывода, диапазон все/оставшиеся)

    _NoShow - не предлагать файл для просмотра и печати. Это удобно, если
    	  нужно задать нестандартную обработку выведенного файла или вывода
    	  нескольких автономных частей общего отчета в один файл.

    _aPage - массив, задающий подбивку по странице.
    	Структура: {<массив или блок для печати заголовка страницы>,;
    		    <массив или блок для печати подвала страницы>}.
    	Если определен, то печатаются итоги по странице, причем Header
    	печатается, начиная со второй.

    cDivideT, cDivide - символ разделения колонок соответственно, в
    		    заголовке и информационных строках (умолчание - ':').

    _nCounter - если >0, то слева выводит порядковый номер шириной _nCounter

    CountName - название колонки "Номер по порядку" (умолчание "П/П"). Это
    	    имеет смысл только задан _nCounter>0.

    _PrintZero - печать нулевых значений, по умолчанию - .F.

    	Следующие переменные могут быть дополнительно настроены прямо из
    программы (по нажатию F9 в диалоге начала печати).

    Печать заголовков колонок на каждой
    странице				_NeedHeadPage
    Печать номеров страниц			_NeedPrPage
    Прогон страниц после вывода листа	_NeedEject
    Печать стандартной шапки отчета		_NeedMainHead
    Печать шапки на каждой странице		_lTitleAll
    Печать цифровых заголовков для колонок
    	- на первой странице		_lDgtHdr
    	- на следующих страницах	_lDhAll
    Стартовая последовательность принтера	_PSCode
    Конечная последовательность принтера	_PECode
    Левая граница				_LMargin
    Длина страницы (0=лента)		_Plength
    Устройство-принтер			_printer
    Дописывать ли файл вывода		_NeedApFile

    	Файлы - отчеты имеют стандартное расширение .BPF и могут быть
    загружены через меню "База" - "Считать файл-отчет".

    См. также пример в поставке BDBFS.

    29.Клавишные коды.

    	Нажимая в BDBFS на клавиши, обратите внимание на левый верхний
    угол, где высвечивается код нажатой клавиши. Так можно обнаружить
    ряд недокументированных в Clipper кодов.

    30.Пользовательское меню.

    	Помимо общего меню, в BDBFS можно определить дополнительное меню
    пользователя, доступное по F12. Для этого надо в инициализационном
    файле определить два массива: UserMenuPrompts и UserMenuActs. Первый
    следует заполнить строчками, предлагаемыми на выбор в меню, второй -
    соответствующими блоками кода. Например, Вы хотите иметь возможность
    запускать FoxPro из под BDBFS. Тогда в BDBFS.INI надо записать:
    	UserMenuPrompts:={'Запуск FoxPro'}
    	UserMenuActs:={ {||BluRun('Fox.exe')} }.

    	Несколько примеров есть в Examples.Ini.

    31.Проверка/коррекция базы.

    	Меня долго просили (а я упирался) сделать логический контроль
    соответствия размера базы заголовку. Упирался я потому, что не желал
    иметь дело с результатами работы кэшей и разнообразных сетевых
    приложений. Да и утилит такого рода достаточно. Тем не менее, учитывая
    тот факт, что ни одна из просмотренных утилит меня полностью не
    удовлетворила, все-таки пришлось "спасаться своими руками" и така
    проверка была включена. Сверяются 3 размера: логический (на основании
    структуры), проставленный в заголовке и реальный физический. Если все
    размеры совпадают, выдается сообщение об отсутствии ошибок. Иначе будет
    показано меню с информацией о расхождениях и возможностью
    синхронизировать размеры по одному из них. Рекомендую выбирать
    логический, но у Вас, разумеется, может быть свое мнение и причины
    предпочесть иное.

    32.Плагины.

    	Ну какой нынче программный продукт без плагинов! Видно, иначе
    нельзя! "Плагины" BDBFS - это обычные ini-файлы, реализующие законченную
    функцию. Несколько (возможно даже небесполезных) примеров есть в каталоге
    PLUGINS. Присылайте мне плоды Вашего творчества. Лучшее будет опубликовано
    на страничке и включено в поставку следующих версий. С указанием автора,
    естественно.

    	Плагины (и #include) файлы ищутся помимо текущего каталога в
    пути, определенном переменной _PlugDir, а затем в пути, заданной
    переменной окружения SET INCLUDE. По умолчанию, _PlugDir=каталог
    запуска\Plugins. Вы можете задать (например, в BDBFS.INI) несколько
    каталогов: _PlugDir:='c:\bdbfs\plugins; d:\MyOwn\plugins'

    	К плагинам в программе можно обращаться как к обычным функциям,
    если они имеют стандартное расширение .INI. Пусть, скажем, у Вас есть
    плагин MyPlug.ini, вычисляющий некоторую функцию, основываясь на полях
    базы. Тогда можно делать, например:
    	{?} MyPlug()			// Вычислить текущее
    	{Ctrl+F5} xVar:=MyPlug()*2	// Присвоить значение
    	{F7} MyPlug() > 100		// Поиск

    Плагину можно передать параметры (до 5).

    	Пример: MyPlug(2,3,'Hello')

    Для вызова плагина из плагина, а также в случае, когда плагин имеет
    нестандартное расширение, используйте функцию RestoreIni().

    	Пример: RestoreIni('MyPlug',2,3,'Hello')

    33.Запуск BDBFS.

    	Обычный запуск - BDBFS <имя файла>[.DBF].

    	Можно запустить с параметром * - тогда будут предложены
    файлы на выбор. Можно запустить BDBFS *.Str - на выбор будут предложены
    файлы с расширением STR. Можно использовать и символ ?.

    	Параметр /i=<indexname> задает загрузку файла вместе с указанным
    индексом.

    	Параметр /BW настраивает цвета на монохром. Впрочем,
    на черно-белом EGA/VGA и так видно отлично.

    	Порядок параметров /BW и /i= можно чередовать.

    	При запуске с параметром-именем файла окружения делается попытка
    это окружение восстановить. Аналогично, с файлом инициализации.

    	Пример:
    	 	BDBFS Envr.mem

    	Параметры /DBFNTX /DBFCDX /DBFCTX /VFPCDX /SIXCDX /DBFIDX
    устанавливают соответствующий драйвер по умолчанию (обычно он определяется
    в BDBFS.INI). Можно также использовать короткую форму: /NTX /CDX /CTX /IDX.

    	Примеры:
    		BDBFS MyBase /VFPCDX		//Visual FoxPro driver

    		BDBFS MyBase /ntx /i=char

    	Параметр /CREATE позволяет начать работу с создания новой базы.

    	Пример:
    		BDBFS MyNew /CREATE

    	Кроме того, есть несколько параметров, заставляющих BDBFS работать
    в пакетном режиме - REINDEX, REBUILD, HTML, XML, XLS, PACK, CHECK, PRINT и
    разновидности параметра STRUCT_. В пакетном режиме BDBFS выполняет
    заданную операцию и завершает свою работу.

    	Параметр REINDEX вызывает переиндексацию базы. Составной индекс
    (CDX,NSX,MDX) переиндексируется автоматически, для переиндексации простого
    индекса его надо указать в третьем параметре с ключом /i. Если ни одного
    индекса не найдено, то будет выдано соответствующее сообщение.

    	Примеры:
    		BDBFS f_w_cdx REINDEX
    		BDBFS f_w_ntx REINDEX /i=MyNtx.ntx

    	Параметр REBUILD вызывает полную перестройку составного индекса
    (CDX,NSX,MDX). Это дольше, чем переиндексация, зато в ряде случаев
    позволяет избавиться от странных глюков и, почти всегда, ведет к
    уменьшению размера индексного файла.

    	Пример:
    		BDBFS f_w_cdx /REBUILD

    	Параметры HTM (HTML), XML, XLS вызывают экспорт файла DBF в
    указанный формат.

    	Примеры:
    		BDBFS MyDbf HTM			// генерируется MyDbf.htm
    		BDBFS MyDbf HTML=e:\1		// генерируется e:\1.htm
    		BDBFS MyDbf /XLS	//генерируется MyDbf.xls

    	Предупреждение о существовании файла выдается в любом случае,
    так что если Вы желаете принудительно переписать существующий файл,
    сначала уничтожьте его.
    	Дополнительные сведения об экспорте содержатся в главе
    "Append/Copy".

    	Параметр PACK вызывает упаковку базы. Поскольку операция эта
    опасная, дополнительный запрос все равно задается.

    	Параметр PRINT вызывает печать файла печатной формы.
    Если имя файла не указано, ищется файл с именем, соответствующим базе.

    	Примеры:
    		BDBFS MyDbf /PRINT=Customer	// ищется Customer.BPF
    		BDBFS MyDbf /PRINT		// ищется MyDbf.BPF

    	Параметр CHECK вызывает проверку заголовка базы.

    	Параметр STRUCT_ позволяет задать автоматическое выполнение
    операций, доступных интерактивно в режиме показа структуры (Alt+F2) через
    клавиши F2, F4-F6, F10.
    	Разновидности параметра:
    		STRUCT_PRINT	- вывод структуры на печать.
    		STRUCT_FILE	- файл описания структуры (расширение STP)
    		STRUCT_EXTENDED	- файл структуры формата COPY STRU EXTENDED
    				  (с расширением STE)
    		STRUCT_COPY	- файл-копия структуры (расширение STR)
    		STRUCT_PROGRAM	- создание программы, генерирующей эту
    				  структуру и тэги компаундного индекса
    				  (расширение STG).

    	Все постфиксы параметра могут быть сокращены до 4-х символов.

    	Пример:
    		BDBFS MyDbf /STRUCT_PROG

    	Параметр /FORCED запускает форсированный режим.

    	Для работы с каталогом можно применять команду FOR.

    	Примеры:
    // все переиндексировать
    		FOR %%a in (*.DBF) DO bdbfs %%a REINDEX

    // создать HTML в подкаталоге _HTMLS_
    		echo y | DEL _HTMLS_\*.HTM
    		FOR %%a in (*.DBF) DO bdbfs %%a HTM=_HTMLS_\%%a
    		REN _HTMLS_\*.DBF _HTMLS_\*.HTM

    Счастливые обладатели 4DOS могут сэкономить команду (и время):
    		DEL /y _HTMLS_\*.HTM
    		FOR %a in (*.DBF) DO bdbfs %a HTM=_HTMLS_\%@NAME[%a]

    // создать документацию по базам данных
    		FOR %%a in (*.DBF) DO BDBFS %%a /STRUCT_FILE
    		ECHO Документация по базам данных системы > All_Dbf.txt
    		FOR %%a in (*.STP) DO COPY All_DBF.TXT+%%a All_Dbf.TXT
    		DEL *.STP

    34. Форсированный режим.

    	Стандарт файла DBF появился много лет назад. Уже вскоре после
    принятия выявились его ограничения, особенно это касалось MEMO-полей, да
    и бинарную информацию хотелось хранить и использовать более эффективно.
    Не мудрено, что начали появляться всевозможные расширения формата, такие
    как FPT файлы FoxPro, Varied поля и криптованные базы SIX и т.д.. Причем,
    в последние несколько лет процесс ускорился, а взаимное "непонимание"
    углубилось (несмотря на реализованную в Clipper правильную по сути идею
    RDD). В частности, существующие стандартные и SIX-овские драйверы не
    позволяют обрабатывать новые конструкции dBASE5, FlagShip и т.д..
    Существуют также программы, позволяющие "обозвать" поля нестандартным
    способом (например, начинающиеся с цифры). Clip, в свою очередь умеет
    обрабатывать базы Visual FoxPro, но не понимает форматы dBase4 и т.д..

    	Всё это привело меня к мысли написать программу, позволяющую "на
    лету" приводить нестандартные файлы к стандартным, а после завершения
    работ - править "обратно". Такой режим и будем называть "форсированным".

    	Итак, в форсированном режиме BDBFS понимает и поддерживает
    следующие форматы:
    	 - dBASE4, dBASE5 (поля типа Bitmap, новые заголовки);
    	 - FlagShip (поля типа 2,4,8, новые заголовки);
    	 - FoxBase 1.0 (заголовок);
    	 - FlexMemo (memo-поля);
    	 - и, потенциально, все другие возможные типы полей, которые в
    этом случае будут считаться и обрабатываться, как символьные.

    	Нестандартные названия полей преобразуются следующим
    образом:
    	- если в заголовке указан CodePage FoxPro от 1200 до
    	  1299, то выполняется AnsiToOem()
    	- неалфавитно-цифровые символы заменяются на символ "_"
    	- если название начинается с цифры, то оно предваряется
    	  символом "_".

    	На сегодняшний день действуют следующие ограничения для работы
    в форсированном режиме:

    	- база используется только в монопольном режиме (напомню, ее
    	  приходится для этого специальным образом исправлять);
    	- если "форсированная" база содержит memo-поля, запрещена
    	  упаковка;
    	- запрещена модификация структуры;

    	Форсированный режим включается либо указанием ключа командной
    строки /FORCED (например, BDBFS mybase /forced), либо указанием
    переменной _lForced:=.t. в инициализационном файле. Кроме того, если
    нестандартная структура обнаружена при открытии файла, а форсированный
    режим еще не включен, задается вопрос о включении с указанием
    предположительного формата.

    	Для доступа к некоторым "нестандартным" типам полей (например, при
    использовании в выражениях, при поисках) нужно использовать специальные
    функции (обычные редакция, просмотр, замещение дополнительных усилий не
    требуют):
    	- содержимое memo-поля, полей типа bitmap
    		MemoSrc(<field_name>) - возвращает строку
    	- поле типа 2
    		Bin2I(<field_name>) - возвращает число

    	Пример:
    // Установить фильтр для поля Cur1 типа Currency
    		{Alt+Shift+F} YToCurs(Cur1)>100

    	Еще раз напомню, для обработки базы в форсированном режиме,
    приходится исправлять её заголовок! Поэтому, если во время работы,
    например, мигнет свет, или, скажем, Вы по ошибке прибили сессию, то
    структура базы будет испорчена!

    	ПОЭТОМУ, ИСПОЛЬЗУЙТЕ ЭТОТ РЕЖИМ НА СВОЙ СТРАХ И РИСК!

    35.Видео-режимы.

    	BDBFS корректно поддерживает все ранее установленные текстовые
    режимы - от 40*25 до 132*60 и т.д.. Однако, если Вы запустили из под
    BDBFS программу, изменившую режим экрана - возможны неприятности.

    36.Языковый интерфейс.

    	Может вызвать удивление смешение в сообщениях и Help-ах
    русского и английского. Ориентация здесь была такая: то, что стандартно
    и адресовано, в основном, программисту - английское, остальное по-русски.
    Help Вы можете сами переписать, как вздумается - см.файл BDBFS.HLP.
    Каждая главка заканчивается символом ~. Соответственно, его использовать
    в тексте нельзя. В остальном ограничений нет, пишите как сочтете нужным.
    Если кто-то удосужится переписать HELP полностью на английском,
    украинском или любом другом языке - я буду очень признателен за версию.

    37.Планы.

    	BDBFS уже почти не развивается, во-первых, из-за достаточной
    полноты; во-вторых, из-за нехватки времени; в третьих, из-за малого
    количества пожеланий :-). Вы можете это исправить :-) ! Естественно,
    вышесказанное не относится к портированию на CLIP и другие платформы
    - тут работы непочатый край.

    38.Чего в BDBFS нет по сравнению с "конкурентами".

    	Мне приходилось видеть в продуктах аналогичного назначения
    некоторые возможности, отсутствующие сейчас в BDBFS.
    Вот их перечень:

    	* календарь - не вижу смысла, IMHO не ORGANIZER это, но мнения...
    	* экспорт/импорт 1-2-3 - IMHO слишком специализировано.
    	* Подсчет стат-величин типа девиации и т.п. - аналогично
    	  предыдущему пункту. А может быть кто-то плагином сделает.
    	* Графики по полям базы - не будет, IMHO это дело спец-программ.
    	* Просмотр экрана DOS - может быть...

    	Буду благодарен за любые мнения по этому поводу.

    39.Известные проблемы.

    	Помимо вновь обнаруживаемых ошибок, существует ряд известных
    проблем, которые, возможно, будут устранены в будущем. К их числу
    относятся:

    	Базы новых форматов DBASE4, DBASE5, FlagShip, FlexMemo
    поддерживаются только в форсированном режиме.

    	Не поддерживается #define с параметрами в ini-файлах.
    	Не поддерживается #xCommand с более, чем один параметром.

    	Невосстанавливаемая ошибка "Переполнение диска".
    	Проверить заранее свободное место трудно из-за того, что
    неизвестно, сколько места займет скопированный файл.

    	Индексы FoxPro, содержащие выражения типа alias.field (вместо
    alias->field) вызывают ошибку при любой операции, вызывающей изменение
    индекса. Даже и не знаю, что с этим делать...

    	Некомпактные IDX (FoxBase) не поддерживаются. Желающие могут
    воспользоваться специальной версией (BDBFP), которая может быть загружена
    с моей странички.

    	Не работает поиск в индексах FoxPro, сделанных с установленной
    COLLATE.

    40.Благодарности.

    	Nantucket(CA принципиально не буду), American Cybernetics,
    Assembler Software, Borland, SuccessWare - за использованные продукты.

    	Портирование на CLIP было бы невозможно без
    Юрия Хныкина uri@itk.ru и всей команды CLIP - www.itk.ru

    	Авторам Софтпанорамы и эхо-конференций.

    	Всем корреспондентам, присылавшим замечания и предложения.

    	Особая признательность Кужию Л.Б.(Львов) за тщательное
    тестирование и множество дельных предложений.

    41.Дальнейшие ругательства.

    	Присылать по адресу:
    		Луганск, 91024, Ленинградская 8,
    		Бондарю Евгению Леонидовичу

    		[0642] 46-34-19	E-Mail:elb@lg.bank.gov.ua
     			или Bondar_Eugen@yahoo.com

    	Страничка: http://www.geocities.com/bondar_eugen/

    42.Форма распространения.

    	BDBFS распространяется в бСССР свободно, причем версия дл
    CLIP - в исходных текстах. Любое вознаграждение, в т.ч. моральное ;-),
    будет принято с благодарностью.

    ПРИЛОЖЕНИЕ 1.Сводка клавиш.

    	Помните, что ряд функций доступен только через меню.

    A.Главный режим.

    Позиционирование:

    	По полям		Up Down Left Right PgUp PgDn

    	На  последнее  поле	Ctrl+End
    	На первое поле		Ctrl+Home

    	Go top			Ctrl+PgUp
    	Go  Bottom		Ctrl+PgDn

    	К началу  следующей	Alt+PgDn
    	страницы

    	К началу предыдущей	Alt+PgUp
    	страницы

    Функции управления:

    	Вызвать главное меню		F10, Alt+V
    	Вызвать пользовательское меню 	F12

    	Выбрать базу			F4
    	Открыть предыдущую базу		Ctrl+O

    	Выбрать индексный файл		F5
    	Реиндексировать			Alt+F5
    	Индексировать			Alt+F9

    	Добавить запись			F3, Ins
    	Добавить с копированием		Alt+F3
    	Вставить новую запись		Shift+F3

    	Count   по  условию		Ctrl+F6
    	Суммировать   текущее   поле	Alt+F6
    	Total  по  текущему выражению	Alt+Shift+F6
    	индекса

    Замена:
    			    Без подтверждения   С подтверждением
       Текущее поле - выражением	Alt+R		Alt+Shift+R
       Поле во всех записях
    	постоянным выражением	Alt+F4		Alt+Shift+F4
       Поле во всех записях
    	переменным выражением	Ctrl+F4		Ctrl+Shift+F4

    	Редактировать  одну  запись    (EDIT)	Alt+E

    	Редактировать символьное поле		Alt+W
    	как memo-поле (для широких полей)
    	Инвертировать логическое поле		Пробел

    	Справка  о  базе  и  окружении		Alt+F1
    	Показать/напечатать структуру		Alt+F2

    	Присоединить из базы (текста)		Ctrl+F9
    	Скопировать  в  базу (текст)		Ctrl+F3
    	Копировать с преобразованием		Ctrl+Shift+F3
    	формата MEMO-поля

    	Сортировать				Alt+S, Ctrl+F11
    	Меню установки фильтра			Alt+F, Alt+F11
    	Установить фильтр по условию		Alt+Shift+F, Alt+Shift+F11

    	Напечатать базу [принтер/файл]		F2
    	Вывести запись в  <base.rec>		Ctrl+P

    	Изменить  структуру			Shift+F2
    	Установить  поля и заголовки		Ctrl+F2

    	"Заморозить"  текущее  поле 		Alt+Z
    	и все поля левее

    	Установить условие подсветки		Alt+B
    	Вернуть стандартный цвет поля		Alt+Shift+B

    	Создать HTML				Alt+>

    Функции поиска:

    	Встать на запись NN		F6
    	Искать  по  индексу  (SEEK) 	F9
    	Искать по условию  (LOCATE) 	F7
    	Продолжить поиск (CONTINUE) 	Alt+F7
    	Искать  по всем полям сразу 	Alt+I
    	(контекстный поиск)
    	Продолжить контекстный поиск	Alt+Shift+I
    	Искать в текущем поле		F11
    	(спец.для юзеров)
    	Меню  поиска  в текущем поле 	Ctrl+Shift+F11
    	Искать максимум/минимум		Alt+M
    	Искать самое длинное		Ctrl+L
    	значение в текстовом поле
    	Искать дубль в индексе		Alt+2
    	Искать  по  маске в индексе 	Alt+[
    	Продолжить  поиск  по маске 	Alt+Shift+[

    Уничтожение/восстановление:

    	Пометить/восстановить
    	текущую запись			Del, Ctrl+T
    	Пометить по условию		Ctrl+F8
    	Восстановить по условию		Ctrl+F7
    	Инвертировать пометки		Ctrl+Shift+F8

    	Упаковать     (PACK) 		F8
    	Уничтожить все (ZAP)		Alt+F8

    	Очистить текущее поле		Shift+F4
    	Очистить  все  поля  записи 	Ctrl+Y

    Буфер обмена:

    	Записать  в  буфер  Windows 	Ctrl+Ins
    	Записать из  буфера Windows 	Shift+Ins
    	Записать во внутренний буфер	Ctrl+Grey+
    	Записать из  буфера 		Ctrl+Grey-, Alt+GreyEnter
    	Буфер = Буфер + Поле 		Alt+Grey+
    	Буфер = Буфер - Поле		Alt+Grey-
    	Буфер = Буфер / Поле		Alt+Grey/
    	Буфер = Буфер * Поле		Alt+Grey*
    	Показать буфер			Ctrl+Enter

    Прочее:

    	Закончить  работу   			Esc
    	Закончить  без  подтверждения		Alt+X

    	Вызов  2-го  командного  процессора  	Alt+F10
    	Сменить  диск  и  директорию		Ctrl+F10

    	Выполнить макро-функцию			Ctrl+F1
    	Установить  переменную  или  массив  	Ctrl+F5
    	Вычислить выражение			Shift+F6, Alt+G, ?

    	Перевести в строчные			Alt+L
    	Перевести в прописные			Alt+U
    	Первая=Alt+U, остальные=Alt+L		Alt+K
    	(капитализация)
    	Преобразовать QWERTY->ЙЦУКЕН		Alt+Q
    	Преобразовать ЙЦУКЕН->QWERTY		Alt+Y
    	QWERTY->ЙЦУКЕН->QWERTY			Ctrl+Shift+X
    	Выровнять 				Alt+J

    	Скопировать поле сверху			Alt+Up
    	Скопировать поле снизу			Alt+Down
    	Скопировать поле слева			Alt+Left
    	Скопировать поле справа			Alt+Right

    	Обменяться  с верхней записью		Ctrl+Up
    	Обменяться  с нижней записью		Ctrl+Down

    	Обменять поле с верхней записью		Alt+Shift+Up
    	Обменять поле с нижней записью		Alt+Shift+Down

    	Установить закладку			Ctrl+K + 0..9
    	Перейти  к закладке			Ctrl+Q + 0..9

    	Сохранить обстановку			Shift+F1
    	Восстановить обстановку			Shift+F5
    	Сохранить обстановку
    	в  AutoOpen  файле 			Ctrl+Shift+F1

    	Загрузить инициализационный файл      	Ctrl+F12

    	Вызвать Filer				Alt+F12

    	Освежить  просмотр  (в сети) 		Ctrl+R

    	Отменить  исправления  в  поле		Ctrl+U, Alt+BS

    Работа с компаундными индексами (CDX,MDX,NSX):

    	Выбрать TAG				Alt+T, Shift+F12
    	Установить  TAG  по  номеру 		Shift+F7
    	Установить  TAG  по   имени 		Shift+F8
    	Сделать  новый  TAG			Shift+F9
    	Удалить TAG				Shift+F10
    	Установить другой CDX			Shift+F11

    B.Режим ввода по GET

    Позиционирование:

    	Передвижение в поле		Left, Right
    	Передвижение между записями 	Up, Down, PgUp, PgDn
    	Не меняя позиции от начала поля	Shift+Up, Shift+Dn, Shift+PgUp, Shift+PgDn

    	Следующее поле			Tab
    	Предыдущее поле			Shift+Tab

    Функции управления:

    	Добавить запись 			F3
    	Переключить режим вставки/переписи	Ins
    	Очистить  поле  			Ctrl+Y
    	Завершить ввод без записи		Esc
    	Завершить ввод с записью		Enter, Ctrl+W, Ctrl+End
    	Отменить изменени			Ctrl+U, Alt+BS

    	Переключить режим ввода 		F4
    	Вставить строку символов из "MACRO"	Ctrl+F1
    	Рассматривать следующую комбинацию
    	клавиш,  как код			Ctrl+Q, Ctrl+2

    	Скопировать поле сверху 		Alt+Up
    	Скопировать поле снизу  		Alt+Down
    	Инвертировать логическое		Пробел

    	Перевести в строчные    		Alt+L
    	Перевести в прописные   		Alt+U
    	Первая-прописная, остальные-строчные	Alt+K
    	(капитализация)
    	Преобразовать QWERTY->ЙЦУКЕН    	Alt+Q
    	Преобразовать ЙЦУКЕН->QWERTY    	Alt+Y
    	QWERTY->ЙЦУКЕН->QWERTY  		Ctrl+Shift+X

    	Записать в буфер			Ctrl+Grey+
    	Записать из буфера			Ctrl+Grey-, Alt+GreyEnter
    	Записать в буфер Windows		Ctrl+Ins
    	Записать из буфера Windows		Shift+Ins

    	Пометить/восстановить текущую   	Shift+Del

    C.Режим SET FIELDS.

    	Убрать поле из списка   		DEL, Ctrl+Y
    	Изменить порядок			Ctrl+Down, Ctrl+Up
    	Восстановить предыдущие установки	F5
    	Завершить изменения     		F10
    	Отменить изменения			Esc, Alt+X

    D.Режим MODIFY STRUCTURE

    	Изменить реквизит (если возможно)	Enter
    	Добавить новое поле     		F3
    	Удалить поле    			F8
    	Вставить поле перед текущим		F5, Ctrl+N
    	Установить нужный тип   		C,N,D,L,M,F,V
    	(находясь в поле типа)
    	Оптимизировать структуру		F9
    	Завершить и сохранить изменения  	F10
    	Отменить изменения			Esc

    E.Режим просмотра структуры

    	Печать на устройство-принтер		F2, Shift+Tab
    	Вывод в текстовый файл (*.STP)		F4
    	Вывод  в  файл  со структурой (*.STR)	F6
    	-"- с расширенной  структурой (*.STE)	F5
    	Настройка  печати     			F9
    	Создание программы, генерирующей эту 	F10
    	структуру и тэги компаундного индекса
    	(*.STG)
    	Перейти на текущее поле			ENTER

    F. Диалоги (условия или выражения)

    	Подобрать выражение из истории:
    		данного условия 		F4, Ctrl+Down
    		всех условий    		Alt+F4, Ctrl+Shift+Down
    		результатов     		Ctrl+F4
    	Ввести имя текущего поля		F2
    	Имя любого поля  			Ctrl+F2
    	Заголовок текущего поля 		F3
    	Заголовок любого поля   		Ctrl+F3
    	Значение текущего поля  		F5
    	Значение текущего поля в кавычках	CTRL+F5
    	Наименование текущей базы		F6
    	Окавычить веденное			Alt+Shift+"
    	Меню ввода      			F10

    	В диалоге REPLACE символьного поля	F7
    	меню функций

    	В диалоге задания списка полей  	Alt+F2
    	(COPY, SORT) - выбор полей

    G.Режим просмотра результата (после вычисления, суммирования и т.п.)

    	Продолжить вычисления с результатом	F2
    	Вывод результата в текущее поле 	F5
    	Занесение результата в буфер    	Ctrl+Ins
    	Преобразовать в "денежный" формат	$
    	(519234 - > 5,192.34)
    	Меню занесения  			F10

    H.Режим редакции текстового файла или широкого поля (MEMOEDIT)

    	Печать  				F2
    	Сохранение в файле			F3
    	Загрузка из файла			F4
    	Переключение режима авто-переноса
    	строк   				F5
    	Запись в текущую позицию буфера
    	Windows - 95/98/ME			F6, Shift+Ins
    	Настройка переменных просмотра  	F9
    	Запись в текущую позицию внутреннего
    	буфера  				Ctrl+Grey
    	Удаление текущей строки 		Ctrl+Y
    	Удаление слова справа   		Ctrl+T
    	Реформирование параграфа		Ctrl+B
    	Запись изменений и выход		F10, Ctrl+W
    	Выход с подтверждением  		Esc
    	Выход без сохранения    		Alt+X

    I.Режим выбора файлов (Filer)

    	Смена текущего диска    		F2
    	Просмотр текущего файла 		F3
    	Редакция текущего файла 		F4
    	Возврат к каталогу,
    	с которого начался поиск		F5
    	Смена маски просматриваемых файлов	F9
    	Просмотр описания текущего файла
    	из файла descript.ion   		F10

    ПРИЛОЖЕНИЕ 2. СООБЩЕНИЯ.

    	При открытии базы могут быть выданы следующие сообщения:

    	<имя файла> - поврежден или блокирован
    		Заголовок базы поврежден или база захвачена другим процессом,
    		или база помечена как ReadOnly. Для работы с файлами ReadOnly
    		можно использовать BDBFS-Viewer. См. информацию о загрузке.

    	<имя файла> - поврежден
    		Есть повреждения в списке полей базы

    ПРИЛОЖЕНИЕ 3. Поддерживаемые функции.

    	Как уже отмечалось, можно использовать почти все системные
    	функции Clipper.

    AADD		ABS		ACHOICE		ACLONE		ACOPY
    ADEL		ADIR		AEVAL		AFIELDS		AFILL
    AINS		ALIAS		ALLTRIM		ARRAY		ASC
    ASCAN		ASIZE		ASORT		AT		BIN2I
    BIN2L		BIN2W		BOF		BREAK		CDOW
    CHR		CMONTH		COL		CTOD		CURDIR
    DATE		DAY		DAYS		DBAPPEND  	DBCLEARFILTER
    DBCLEARINDEX	DBCLEARREL	DBCLOSEALL	DBCLOSEAREA	DBCOMMIT
    DBCOMMITALL	DBCREATE  	DBCREATEINDEX	DBDELETE  	DBEVAL
    DBF		DBFILTER  	DBGOBOTTOM	DBGOTO		DBGOTOP
    DBRECALL  	DBREINDEX 	DBSEEK		DBSELECTAREA	DBSETFILTER
    DBSETINDEX	DBSETORDER	DBSETRELATION	DBSKIP		DBSTRUCT
    DBUNLOCK  	DBUSEAREA 	DELETED		DESCEND		DEVOUT
    DEVPOS		DIRECTORY 	DISKSPACE 	DISPBOX		DOW
    DTOC		DTOS		ELAPTIME  	EMPTY		EOF
    EVAL		EXP		FCLOSE		FCOUNT		FCREATE
    FERASE		FIELDGET  	FIELDNAME 	FIELDPUT  	FILE
    FLOCK		FOPEN		FOUND		FREAD		FREADSTR
    FRENAME		FSEEK		FWRITE		GETE		GETNEW
    HEADER		I2BIN		IF		INDEXKEY  	INKEY
    INT		ISCOLOR		ISPRINTER 	L2BIN		LASTKEY
    LASTREC		LEFT		LEN		LENNUM		LOG
    LOWER		LTRIM		MAX		MAXCOL		MAXROW
    MEMOEDIT  	MEMOREAD  	MEMORY		MEMOWRIT
    MIN		MOD		MONTH		NETERR		NEXTKEY
    PAD		PADC		PADL		PADR		PCOL
    PCOUNT		PROCNAME  	PROW		QOUT		QQOUT
    RAT		READEXIT  	READKEY		READMODAL 	READVAR
    RECCOUNT  	RECNO		RECSIZE		REPLICATE 	RESTSCREEN
    RIGHT		RLOCK		ROUND		ROW		RTRIM
    SAVESCREEN	SCROLL		SECS		SECONDS		SELECT
    SET		SETBLINK  	SETCOLOR  	SETCURSOR  	SETKEY
    SETPOS		SOUNDEX		SPACE		SQRT		STR
    STRTRAN		STRZERO		STUFF		SUBSTR		TBCOLUMNNEW
    TBROWSEDB  	TBROWSENEW	TIME		TONE		TRANSFORM
    TSTRING		TYPE		VAL		VALTYPE		UPDATED
    UPPER		USED		WORD		YEAR,

    а также часть специальных недокументированных функций, начинающихся с __ .
    Заядлые клипперисты меня поймут, остальные все равно пользоваться не будут.
    Специально для "заядлых"! Я не гарантирую, что все __ функции всегда будут
    вести себя так, как Вы привыкли. Часть из них была в специальных целях
    переписана.

    Функции SIX

    BAG2TAG		SXCHAR		SXDATE		SXLOG		SXNUM
    SX_BLOB2FILE	SX_DATEVAL	SX_DBFDECR	SX_DBFENCR	SX_DECRYPT
    SX_DTOP		SX_ENCRYPT	SX_FILE2BLOB	SX_FILEORDER	SX_FINDREC
    SX_FNAMEPARSER	SX_GETLOCK	SX_IDTYPE  	SX_INDEXCOUNT	SX_INDEXNAME
    SX_ISFLOCK	SX_ISLOCKED	SX_ISREADONLY	SX_ISSHARE	SX_KEYADD
    SX_KEYCOUN	SX_KEYDATA	SX_KEYDROP	SX_KEYGOTO	SX_KEYNO
    SX_KILLTAG	SX_MEMOBLK	SX_MEMOEXT	SX_ORDERCOUNT	SX_PTOD
    SX_RLOCK  	SX_SETFILE	SX_SETMEMOBLOCK	SX_SETPASS	SX_SETTAG
    SX_SLIMFAST	SX_TABLENAME	SX_TABLETYPE	SX_TAGCOUN	SX_TAGINFO
    SX_TAGNO  	SX_TAGS		SX_TAGUNIQ	SX_VALDATE	SX_VFGET
    SX_WILDMATCH	SX_WILDSEEK

    M6_ADDSCOPED	M6_CHGOWNER	M6_DBEVAL  	M6_DBFILTER	M6_FILTADDREC
    M6_FILTCHGREC	M6_FILTCOPY	M6_FILTCOUNT	M6_FILTDROPREC	M6_FILTINFO
    M6_FILTINVERSE	M6_FILTJOIN	M6_FREEFILTER	M6_GETAREAFILT	M6_ISFILTER
    M6_ISFILTREC	M6_ISOPTIMIZE	M6_NEWFILTER	M6_RECCOUNT
    M6_REFRESHFILT	M6_ORDCOND	M6_ORDCREATE	M6_SET
    M6_SETAREAFILT	M6_SETFILTER	M6_SETTEMP

    Функции Nantucket Forum

    FT_AADDITION	FT_AAVG		FT_ADESSORT	FT_AEMAXLEN	FT_AEMINLEN
    FT_AMEDIAN	FT_ANOMATCHES	FT_ASUM		FT_AT2
    FT_BYT2BIT	FT_BYT2HEX	FT_BYTEAND	FT_BYTENEG	FT_BYTENOT
    FT_BYTEOR  	FT_BYTEXOR	FT_BITCLR  	FT_BITSET  	FT_D2E
    FT_DEC2BIN	FT_DOSVER  	FT_E2D		FT_ELAPSED	FT_FDAY
    FT_FINDITH	FT_GCD		FT_GETE		FT_GETMODE	FT_INT86
    FT_ISBIT  	FT_HEX2DEC	FT_ISBITON	FT_ISPrint	FT_LASTKEY
    FT_LDAY		FT_MADD		FT_METAPH  	FT_NOOCCUR	FT_PUTKEY
    FT_ORIGIN  	FT_RAND1  	FT_ROUND  	FT_SQZN		FT_SYSMEM
    FT_TEMPFIL	FT_UNSQZN  	FT_WORKDAYS	FT_XTOY

    Функции Netto

    FN_BIN2HEX	FN_BIN2I  	FN_CONNID  	FN_CONNINF	FN_CONNNUM
    FN_DEFCID  	FN_DEVTYPE	FN_ERROR  	FN_FSNAME  	FN_GETSN
    FN_HEX2BIN	FN_I2BIN  	FN_INETADD	FN_NAMEL
    FN_NETVER  	FN_NONULL  	FN_OBJCNUM	FN_PEEKSTR	FN_PFCONID
    FN_POKESTR	FN_PRCONID	FN_SPFCID  	FN_SPRCID  	FN_STAADDR
    FN_WHOAMI  	FN_WRCONNI	FN_WRFSNAM

    Функции FoxPro

    ALEN		ANSITOOEM  	ATC		BETWEEN		BINTOC
    CDX		CEILING		CHRTRAN		CTOBIN		CTOT
    DATETIME  	DMY		EVALUATE  	FILTER		FLOOR
    GOMONTH		ID		INLIST		ISBLANK		KEY
    NDX		OCCURS		OEMTOANSI  	PI		PROPER
    SEEK		SIGN
    SYS(0-3,5,6,10-16,21-23,1001,2000,2003,2012,2020,2021)

    Функции Clipper Tools

    CTOF            FTOC            XTOC            LIKE            Expand
    CharOnly        CharRem         CharSpread

    Функции, определенные специально для BDBFS, описаны в приложении IV.

    ПРИЛОЖЕНИЕ 4.BDBFS-PRO.

    	Информация в этом приложении предназначена для желающих максимально
    полно освоить BDBFS. Здесь приводятся сведения о вызове процедур и
    функций BDBFS, а также использовании внутренних переменных.

    	 A. Системные переменные.

    	Вы можете как угодно использовать в выражениях (примеры
    выше) следующие переменные:

                                                                Умолчание
                                                                ---------
    Переменные условий:
    	Условие Locate          	_LCONDIT                ''
    	Выражение поиска        	_GSearch                ''
    	Условие Seek            	_FCONDIT                ''
    	Условие Sum             	_SumCOND                ''
    	Условие Print           	_PCOND                  ''
    	Условие Count           	_CountCOND              ''
    	Условие Delete          	_DelCOND                ''
    	Условие вычисления       	_ECOND                  ''
    	Условие Replace         	_RCOND                  ''
    	Выражение Replace       	_Repl                   ''
    	Условие фильтра         	_FltrCond               ''
    	Условие сортировки      	_SortCond               ''
    	Файл    сортировки      	_SortFile               ''
    	Условие TOTAL           	_TotalCond              ''
    	Файл    TOTAL           	_TotalFile              ''
    	Выражение сортировки    	_ckSort                 ''
    	Поля копирования        	_ckField                ''
    	Условие экспорта в HTML 	_HtmlCond               ''
    	Файл HTML               	_HtmlFile               ''
    	Условие экспорта в XML  	_XmlCond                ''
    	Файл XML                	_XmlFile                ''
    	Условие экспорта в XLS  	_XlsCond                ''
    	Файл XLS                	_XlsFile                ''
    	Условие цветности       	_cb                     ''
    	Условие индекса(тэга)   	_IndexFor               ''
    	Глобальная история условий	_aGlbHcond              {}

    Переменные результатов:
    	Последняя сумма 		__Sum                    0
    	Последний Count 		__Count                  0
    	Последний результат     	__Go                     0
    	Содержимое ClipBoard    	_ClipText               {}
    	Выбор по истории при
    	занесении из него		_ClipChoice             .T.
    	Конвертация OEM/ANSI при
    	работе с буфером WINDOWS	_lCnvWClip              .T.
    	Директория перехода     	_newDir                 ''
    	Количество обработанных 	_Tally                   0
    	записей
    	Глобальная история      	_aGlbHRes               {}
    	результатов

    Установки печати:
    	Центровка чисел при выводе		_NeedCentr      .F.
    	Печать символа 0 при нулевом числе	_PrintZero      .F.
    	Печатать ли номера записей		_NeedRec        .T.
    	Печать стандартной шапки отчета 	_NeedMainHead   .T.
    	Печать шапки на каждой странице 	_lTitleAll      .F.
    	Печать заголовков колонок на каждой
    	странице				_NeedHeadPage   .T.
    	Печать номеров страниц  		_NeedPrPage     .T.
    	Печать цифрового заголовка      	_lDgtHdr        .F.
    	для колонок
    	 - в т.ч. на каждой странице    	_lDhAll         .F.
    	Прогон страниц после    		_NeedEject      .T.
    	Стартовая последовательность    	_PSCode         ''
    	принтера
    	Конечная последовательность     	_PECode         ''
    	принтера
    	Левая граница   			_LMargin        0
    	Длина страницы  			_Plength        0(лента)
    	Устройство-принтер			_printer        PRN
    	Дописывать ли файл вывода		_NeedApFile     .F.
    	Суммировать ли числовые поля     	_NeedSum        .T.
    	Ширина вывода Memo-полей		_MemoPrnt       50
    	при печати
    	Максимальное количество строк при	_MemoNumLines   10
    	выводе memo и широких текстовых
    	полей
    	Символ, разделяющий клетки в отчете	_DefaultBorder   :
    	                      - в заголовке	_DefaultHBorder  :

    Цветовая гамма:
    	Основной цвет 		_Bm	 	'w/b,n/bg,N,r/w+,w+/r,w+/b,w+/r'
    	Цвет Help и запросов 	_Im	 	'n/w+,g+/n'
    	Цвет результатов       	_Cm	 	'Gr+/N,W+/B'
    	Цвет меню    		_MenuColor	'Gr+/b,g+/b'
    	Цвет невыбираемых
    	элементов меню		HiddenColor	'w/b'
    	Заголовки панелей  	_HdColor  	'G+/b*'

    Интерфейс:
    	Вывод индикатора        _lMeter 		.T.
    	Шаг вывода индикатора   _Sx_Step		100
    	Редактор Memo           _MemoEditor		'' (встроенный)
    	Просмотрщик файлов      _TextViewer		'' (встроенный)
    	Шаг табуляции memo      _nMemoTab		  8
    	Граница автопереноса    _nMemoWrap		255
    	Замер времени           _Timing 		.T.
    	исполнения
    	Ширина показа имен      _DirShow        	 16
    	файлов в Файлере
    	Реакция на нажатие	__aExt			{}
    	ENTER в Файлере
    	(структура массива: {{маска1, команда1}, {маска2, команда2}...} )

    Прочее:
    	Текущая база                    _base
    	Текущий индексный файл          _oldind
    	TBrowse object                  _BDBFBrow
    	Текущее поле                    _C_F
    	Содержимое текущего поля        __Content
    	Текущий тэг                     _TagName
    	Текущий компаунд                __CDX
    	Маска поиска файлов             _Mask           '*.dbf'
    	Текущий RDD                     _DefaultRDD     'DBFCDX'
    	Текущее расширение Memo         _DefaultMemo    'FPT'
    	Текущее расширение компаунда    _DefaultCDX     '.CDX'
    	Пользовательское меню
    		Строки                  UserMenuPrompts   {}
    		Действия                UserMenuActs      {}
    	Авто-сохранение окружения       _AutoSave       .F.
    	Авто-восстановление окружения   _AutoRestore    .F.
    	Стандартная клавиатура          _Usa_Keyboard   'QWERTY......'
    	Национальная клавиатура         _My_Keyboard    'ЙЦУКЕН......'
    	DOS (866) кодировка             _Oem_Set        'АБВГДЕ......'
    	WINDOWS (1251) кодировка        _Ansi_Set       'L+T+-+......'
    	Максимальное количество
    	отображаемых полей              _nBrowMaxField  170
    	Размер буфера UNDO              _UndoSize       1024
    	Форсированный режим             _lForced        .F.
    	Запрос на перекодировку
    	OEM -> ANSI при экспорте        _lexp_o2aq      .T.
    	Необходимость перекодировки     _lexp_o2        .T.
    	Путь поиска плагинов            _PlugDir        Путь к BDBFS\PLUGINS

    B.Вызываемые функции.

    	Любую внутреннюю функцию BDBFS, также как и системную, можно
    вызвать в любых режимах BDBFS. Наиболее естественным выглядит
    использование либо в режиме вычисления (Shift+F6, Alt+G, ?),
    либо в режиме присвоения (Ctrl+F5).

    	Примеры:
    	{Alt+G}	Aver('Example')
    	{Ctrl+F5}	UPC=Aver('Example')

    	Для наглядности пояснения будем вести на учебной базе

    	NAME	 S02	S03	S04
    	Your	 12	 1	13
    	Your1	 32	 2	33
    	My	 10	 3	10
    	My1	 30	 4	 0

    1.Функции вычисления.

    	SUM(<ExprC>[,<CondC>]) --> Число

    	Суммирует базу по выражению ExprC для условия CondC.

    	Примеры:
    		{Alt+G}	(1)	Sum('S02+S03','[My] $ Name')
    			(2)	Sum('S02','.t.')

    	(1) возвратит 47 		(2) - 84

    	Умолчание для CondC - все записи.

    	Кроме возвращаемого значения результат запоминается в переменной
    __Sum.

    	AVER(<ExprC>[,<CondC>]) --> Число

    	Вычисляет среднее по выражению ExprC для условия CondC.

    	Умолчание для CondC - все записи.

    	Пример: {Ctrl+F5}	MediumS2=Aver('S02','[My] $ Name')

    		 возвратит 21

    	COUN(<CondC>) --> Число

    	Подсчитывает количество записей, удовлетворяющих условию Condc.

    	Пример: {Ctrl+F5}	CntMy=Coun('[My] $ Name')

    		 возвратит 2

    	Умолчание для CondC - все записи.

    	Кроме возвращаемого значения результат запоминается в переменной
    __count.

    	SumLine([поле1],[поле2]) --> Число

    	Суммирует поля "вдоль" записи, от номера поля1 до номера поля2.
    Если отсутствует FromField подсчет идет от первого, если отсутствует
    ToField - до последнего. Нечисловые поля игнорируются.

    	Примеры: (для первой записи)
    		SumLine()	--> 26
    		SumLine(1,2)	--> 12
    		SumLine(3)	--> 14

    	Кроме возвращаемого значения результат запоминается в переменной
    __Go.

    	Like(cEtalon,cTest)

    	Сравнивает 2 строки с учетом символов расширения ? и *.
    В отличие от маски DOS допускает несколько * в имени. Показала те же
    скоростные результаты, что и такая же функция Clipper Tools (наверное,
    алгоритм тот же-напрашивающаяся рекурсия). Но EXE на 0.5 к меньше.

    	Примеры:
    		{F7} Like('spr*.dbf',FileName)

    		{Alt+G} Like('?уб*a','дубина') --> .t.

    	Crc32(<ExprC>)

    	Считает контрольную сумму строки. Используется алгоритм PKZIP.

    	Пример: Контрольная сумма всех полей:
    		Crc32( Name+XTOC(s02)+XTOC(s03)+XTOC(s04) )

    	Rand([<ExprN>])

    	Возвращает псевдослучайное число в диапазоне от 0 до 1.
    От каждого ExprN возвращается одинаковая последовательность.

    	Пример: Rand(Seconds())

    	Random(<nMin>,<nMax>)

    	Возвращает целое псевдослучайное число в диапазоне от
    nMin до nMax.

    	Пример: Random(0,1000)

    	RoundIt(<nVar>,<nPlace>)

    	Правильное округление. Clipper не всегда правильно выполняет
    операцию округления.

    	Пример:
    		Round(1.025,2)		-->	1.02
    		RoundIt(1.025,2)	-->	1.03

    2. Функции преобразования.

    	Capitalz(<ExprC>) --> ExprC

    	Преобразует символьное выражение в строку с первой заглавной.
    При отсутствии параметра возвращает пустую строку.

    	Пример:
    		Capitalz('ЛУГАНСК')	--> Луганск

    	Padj(<ExprC>,<cAlign>,<cFill>,<nLen>) --> ExprC

    	Выравнивает строку по длине <nLen>.

    	<nlen> по умолчанию = длине текущего поля.

    	Тип выравнивания определяется параметром <cAlign>:
    		"L" - Строка выравнивается по левому краю.
    		"C" - Строка выравнивается по центру.
    		"R" - Строка выравнивается по правому краю.
    		"J" - Строка выравнивается по ширине (выключка).
    		"E" - Строка расширяется символом <cFill>.

    	Если <cAlign> не задан, предлагается выбор.

    	<cFill> - символ-заполнитель, по умолчанию пробел.

    	Примеры:
    		//Пусть длина текущего поля=12
    		PADJ("Отчет",'C')	-->	"   Отчет    "
    		PADJ("Отчет",'E')	-->	"О т ч е т   "
    		PADJ("Мой отчет",'J')	-->	"Мой    отчет"

    	OemToAnsi(<ExprC>)

    	Преобразует строку в Windows кодировку (1251).
    Украинские буквы поддерживаются согласно ГОСТ Украины.

    	Вы можете изменить кодировку под ваши нужды, задав переменные
    _Oem_Set, _Ansi_Set.

    	Пример:
    		OemToAnsi('ЛУГАНСК')	--> TL+L=T│

    	AnsiToOem(<ExprC>)

    	Обратная функция к OemToAnsi().

    	SplitLine(<ExprC>)

    	Преобразует строку в массив. Элементы массива отделяются по
    запятым.

    	Пример:
    		SplitLine("Раз, Два, Три") --> {"Раз", "Два", "Три"}

    	dbTrans(cNewBase,Fields [,bFor,bWhile,nNext,lRest])

    	Копирует базу в заданную с возможностью переименования или
    преобразования полей.
    	Список полей задается либо в кавычках (как строка), либо как
    массив (что необходимо при задании выражений с запятыми). Если в списке
    полей не заданы вычисляемые поля, то работает аналогично системной команде
    COPY. См. также п.5. Append/Copy.

    	Примеры:
    		DBTrans('NewFile','Char,Num AS Digit,Num*2 AS Double')

    		DBTrans('NewFile',{'LEFT(Char,2) AS Symbol','Num'},;
    				  {||Num<>0})

    	TB2Html([<cHtmlFile>] [, <cTitle] [, <aDesign>])

    	Экспортирует базу в формат HTML. Если название файла не задано -
    запрашивается. Заголовок cTitle по умолчанию - имя базы.
    Массив цветов aDesign имеет структуру:

    		{background color,
    		 table background,
    		 text color для таблицы и заголовка,
    		 text color для помеченных как DELE() записей}.

    	По умолчанию используются: "navy","blue","white","red".

    	Пример:
    		Tb2Html('MyBase','WWW FOREVER!',;
    			{'fffffc0','fffff80','00000ff','black'})

    	TB2Xml([<cXmlFile>] [, <cTitle] [, <lYesNo>] [, <cRecName>])

    	Экспортирует базу в формат XML. Если название файла не задано -
    запрашивается. Заголовок cTitle, записываемый в комментарии, по
    умолчанию - имя базы (описание из Descript.ion записывается в
    комментарии всегда). Параметр cRecName задает имя тэга для записи, по
    умолчанию - "Record". Если задан параметр lYesNo=.T., то для вывода
    логических величин используются строки Да/Нет, иначе - .T.,.F..

    	Пример:
    		Tb2Xml('MyBase',,"Employes",.T.)

    	TB2Xls([<cXlsFile>] [, <cTitle] [, <lYesNo>])

    	Экспортирует базу в формат XLS. Если название файла не задано -
    запрашивается. Заголовок cTitle по умолчанию не задан. Если задан параметр
    lYesNo=.T., то для вывода логических величин используются строки Да/Нет,
    иначе - .T.,.F..

    	Пример:
    		Tb2Xls('MyBase','Таблица продаж')

    3. Команды установки SET.

    	А. Команды-переключатели. Формат SetKKKK(<ExprL>)
    	При задании параметра <ExprL> со значением .T. устанавливаются в ON.

    	SetBell=Set Bell		SetDele=Set Deleted
    	SetConf=Set Confirm		SetExac=Set Exact

    		SetDate(.t.) = Set Date BRITISH
    		SetDate(.f.) = Set Date AMERICAN

    	Б.Команды-модификаторы.

    	SetInde([<ExprC>]) --> .F.

    	=Set Index

    	Без параметра(или неверным параметром) = Set Index To

    	Пример:
    		SetIndex('D:\TMP.NTX')

    	SetPrint([<ExprC>]) --> .F.

    	=Set Printer

    	Без параметра(или неверным параметром) = Set Printer To

    	Пример:
    		SetPrint('LPT2')	Переназначает вывод на LPT2

    	SetFilt([<ExprC>]) --> выражение фильтра

    	=Set Filter

    	Без параметра(или неверным параметром) = Set Filter To

    	Пример:
    		SetFilt([ 'My' $ Name ])

    	SetFunc(<ExprC>,<KeyCode>) --> .F.

    	=Set Function

    	Пример:
    		SetFunc('Example',-6)

    	 В режиме редактирования при нажатии F7 будет выводиться
    'Example'

    4. Прочие системные функции.

    	ModiFile(<FileName>)	--> .T. при успешной записи

    	Простейший текстовый редактор. Поскольку использует MemoEdit,
    то редактирует файлы до 64K. В условиях малого количества памяти, этот
    размер может уменьшаться.

    	Пример:
    		ModiFile('c:\config.Sys')

    	Scatter()

    	Записывает содержимое текущей записи в массив с именем _Scatter.
    Признак удаления записывается в последнем элементе массива. Массив может
    не существовать до вызова.

    	Gather()

    	Записывает в текущую запись массив с именем _Scatter, обычно
    созданный функцией Scatter(). Признак удаления записывается в последнем
    элементе массива.

    	SWAP(<recno1>,<recno2>)

    	Обменивает через буфер содержимое 2-х записей с физическими
    номерами recno1, recno2.

    	Пример:
    		Swap(1,3)

    	SwapAll(<nSrc>,<nDst>,<nMuch>[,<lRev>])

    	Обменивает через буфер содержимое nMuch записей, начина
    с физической записи nSrc. Если задано lRev=.T., то замена будет
    проводиться, начиная с последней записи в диапазоне, что имеет
    значение при пересекающихся диапазонах.

    	Примеры:
    		SwapAll(1, 100, 3)	//1<->100, 2<->101,3<->102

    		SwapAll(1, 10, 10, .T.)	//10<->19 .. 1<->10

    	InsertAll(<nMuch>)

    	Вставляет nMuch записей перед текущей. При включенных индексах
    не работает.

    	WORK(<HEAD>) --> ExprC

    	Определяет истинное название поля по заголовку. Это бывает нужно
    в случае задания полей по Ctrl+F2, когда Вы не помните, как же реально
    называлось поле, а его имя надо указать, например, в поиске.

    	Пример:
    		Work('Мое имя для 2-го поля') --> 'S02'

    	FindMax(<NeedMax>,[<FieldName>],[<EvalBlock>]) --> MaxVal

    	Универсальная функция поиска максимума/минимума.

    	Параметры:
    		NeedMax - .T., если нужен максимум,
    			  .F. - минимум
    		FieldName - поле или выражение, по умолчанию -
    			    текущее поле.
    		EvalBlock - блок кода, вычисляемый для сравнения,
    			    по умолчанию - значение FieldName ( {|i| i } )

    	Примеры:
    		FindMax(.T.,'S02') --> 32

    		FindMax(.F.,'S02') --> 10

    	// длина самого длинного имени

    		FindMax(.T.,'Name',{|i| Len(Trim(i))}) --> 5
    			(найдено 'Your1')

    	PrintEdit([<FileName>])

    	Выводит текущую запись на устройство печати в развернутом виде.
    Без параметра - на принтер. По нажатию Ctrl+P в BDBFS -
    в файл с именем <currentbase>.Rec . Допись/перепись файла
    зависит от соответствующей настройки принтера.

    	Пример:

    	NEW.DBF Запись 1
    	------------------------------------
    	NAME				Your
    	S02				12
    	S03				1
    	S04				13

    	 For(<nFrom>,<nTo>,<bEval>)

    	Цикл For. Может пригодиться, например, в INI-файлах.
    Блоку bEval в качестве параметра передается переменная цикла.

    	Пример:
    		cSet:=''
    		For(1,254,{|_1|cSet:=cSet+CHR(_1)})

    	 While(<cCondition>,<bEval>[,<cFor>][,<lBase>])

    	Цикл While. Если передан lBase==.T. то после выполнения bEval
    делается SKIP.

    	Пример:
    		cName:=''
    		While( '!EOF()', {|| cName+= Name},,.T.)

    	Результат:	 'YourYour1MyMy1'

    		cName:=''
    		While( '!EOF()', {|| cName+= Name},'s02 < 30',.T.)

    	Результат:	 'YourMy'

    5. Функции организации интерфейса.

    	Эти функции применимы, главным образом, в плагинах. См. также
    включаемый файл bdbfs.ch, облегчающий применение этих функций.

    	NFIND((<_mess>,[<_var>],[<_color>],[<_Footer>],;
    		[<lNeedTone>],[<nTimeWait>],;
    		[<nlShine>],[<nMuch)] )

    	Универсальная функция показа результата.

    	Параметры:
    		_mess - сообщение любого типа
    		_var - переменная результата. Если определена, то:
    			- результат записывается в глобальную историю
    			- с ним можно производить дополнительные действия.
    		_color - цвет вывода, по умолчанию _im
    		_Footer - сообщение появляющееся на нижней рамке
    		lNeedTone - необходимость звукового сообщения
    		nTimeWait - время показа в секундах (по умолчанию - до
    			    нажатия клавиши)
    		nlShine - позиция в строке вывода, с которой надо
    			  подсветить другим цветом (_HdColor)
    		nMuch - сколько символов подсветить.

    	Примеры:
    		Nfind('Готово')

    		Nfind("Готово",,,,.T.)	//со звуком

    		Nfind(Date(),,,'Сегодня:')

    		nSum:=Sum('s01+s02+s03')
    		Nfind(nSum, nSum, ,"Результат суммирования",.T., 30)

    		Nfind(nls,,,"Подсвечен контрольный разряд",,,,5,1)

    	Meter(<nStep>,[<cMsg>],[<nCurr>],[<nTotal>])

    	Универсальная функция показа прогресс-индикатора.

    	Параметры:
    		nStep - этап. Допустимые значения:
    			1 - Старт (начальная разрисовка экрана)
    			2 - Показать (собственно, прогресс)
    			3 - Финиш (восстановить экран)

    		cMsg - предупреждающее сообщение, по умолчанию -
    			"Подождите..."
    		nCurr - порядковый номер обрабатываемой записи, по
    			умолчанию - номер ключа в индексе или номер
    			записи без индекса
    		nTotal - всего записей, которые нуждаются в обработке,
    			по умолчанию - общее количество записей с учетом
    			фильтра, индекса и признака Все/Оставшиеся.

    	Пример:
    		Meter(1, 'ВЫЧИСЛЕНИЕ КОНТРОЛЬНЫХ СУММ')
    		GO TOP
    		_tally:=0
    		WHILE !EOF()
    			_Field->Crc:=Crc32( Name+XTOC(s02)+XTOC(s03))
    			IF RECNO()-_tally > 10
    				_tally:=RECNO()
    				Meter(2)
    			ENDIF
    		ENDDO
    		Meter(3)

    	CheckEsc([<lStart>],[<nTotal>]) -->lContinue

    	Функция организует вызов прогресс индикатора с интервалом,
    заданным в системной переменной _SX_STEP, с проверкой
    возможного прерывания процесса пользователем по ESC.

    	Пример:
    		Meter(1)
    		CheckEsc(.T.)	//Обнулить счетчик
    		DO WHILE CheckEsc()
    			...
    		ENDDO
    		Meter(3)

    	CheckFound([<lFnd>])

    	Функция:
    		- закрывает Meter(),
    		- при переданном lFnd, и !FOUND() говорит, что поиск
    		  неуспешен, в противном случае, сообщает, что, мол,
    		  готово.

    	GetName(<chead>,<_varName>,[<cMask>],[<cGetMask>],;
    		[<lCanSelect>],[<lReturn>],[<lPsw>]) -->lRes

    	Универсальная функция ввода/подбора системных переменных.
    Может предлагать выбор из истории, подбор файла в файлере,
    выбор списка полей.

    	Параметры:
    		 cHead - заголовок окна.
    		 _VarName - имя редактируемой переменной. Должно
    			   начинаться с символа _.
    		 cMask - маска выбора файлов в файлере (по F9)
    		 cGetMask - маска ввода
    		 lCanSelect - если .T. - добавляется диалог выбора полей
    			      по Alt+F2
    		 lReturn -  надо вернуться в текущий каталог в
    			    случае "прогулок" в файлере.
    		 lPsw - Режим ввода пароля (символы не отображаются).

    	Примеры:
    		m->_OutFile:='CopyFile'
    		IF GetName("Задайте имя файла копии",'_Outfile')
    			__CopyFile('MyFile.DBF',_OutFile)
    		ENDIF

    		_snds:=0
    		IF !GetName("Задайте сумму вместе с НДС","_snds")
    			RETURN 0
    		ENDIF

    		IF GetName("Задайте поля для обработки",'_ckField',,,.T.)
    			...
    		ENDIF

    		IF GetName("Файл для уничтожения",'_DelFile',;
    			   '*.BAK',,,.T.)
    			FERASE(_DelFile)
    		ENDIF

    	Panel(<nTop>,<nLeft>,<nBottom>,<nRight>,;
    	      <aMess>,<aColor>,<nBottomBord>)

    	Рисует "3-х мерную" панель.

      nTop,nLeft
       +-------------------------------------------+
       │               aMess[1]                    │
       │                 ...                       │
       │               aMess[n]                    │
       │ +---------------------------------------+ │
       │ │                                       │ │
       │ │                                       │ │
       │ │                                       │ │
       │ +---------------------------------------+ │ nBottomBord
       +-------------------------------------------+ nBottom,nRight

    	Внешний прямоугольник рисуется выпуклым, внутренний - вогнутым.
    При передаче массива сообщений (или строки; допускается также
    передача в виде строки, разделенной запятыми, - для отделения частей
    сообщения), каждая строчка сообщения записывается с первой строки
    после внешней рамки.
    Внутренний прямоугольник рисуется со следующей после сообщения строки
    и до строки nBottom-nBottomBord [по умолчанию - 1].

    	Может быть передан массив цветов aColor из 3-х элементов или
    соответствующая строка стандартных цветовых определений.
    Если массив цветов или его компоненты не заданы - используется SetColor().
    Применение элементов массива цветов:
    	1 - цвет внешнего окна
    	2 - цвет сообщения
    	3 - цвет внутреннего окна.

    	Примеры:

    	Panel(10,10,16,69,'Ошибка записи !, Нажмите что-нибудь',AlarmColor)

    	Panel(10,10,17,69,{'Табло',''},{m->_cm,m->_im,m->_cm},2)

    	ReadCycle(<aGets>,<aSets>,<sc_Row>,<sc_col>) -->lRes

    	Универсальная функция ввода любых величин. Редакция выполняется
    в цикле до принудительного нажатия ESC или F10. Обычно применяется для
    конфигурации.

    	Параметры:
    		aGets - массив массивов параметров GET для каждой
    			переменной. Структура:
    				{row,col,msg,[picture],[validblock]}
    		aSets - массив переменных для редактирования
    		sc_row, sc_col - координаты на экране, в которых
    			выводится индикатор Вставка/Замена

    	Пример:
    		См. PLUGINS\pvi.ini в поставке.

    6. Банковские функции.

    	Vkrz1(mfo)

    	Возвращает правильный номер МФО по 5 или 6 - разрядному номеру.

    	Параметр может быть числовым или символьным, возвращаемое
    значение - числовое.

    	Примеры:
    		Vkrz1(30403) --> 304030
    		Vkrz1('304039') --> 304030

    	Vkrz14(account,mfo)

    	Возвращает правильный счет по плану счетов НБ Украины,
    соответствующий заданному номеру МФО.

    	Параметры могут быть числовыми или символьными,	возвращаемое
    значение - числовое.

    	Примеры:
    		Vkrz14(1210072810,300001) --> 1210772810
    		{F7} Vkrz14(Nls,Mfo)<>Nls	// найти неверные счета

    	Vkrz20(account,Rkc)

    	Возвращает правильный счет по плану счетов Госбанка России,
    соответствующий заданному номеру РКЦ или кредитной организации.

    	Параметры могут быть числовыми или символьными,	возвращаемое
    значение - символьное.

    	Пример:
    		Vkrz20('30114В84К00000000501',312) --> 30114В84600000000501