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


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

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

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

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

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


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


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