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


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

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

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

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

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


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


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-полей
	 - Устанавливать фильтры
	 - Сортировать базу
	 - устанавливать нужный порядок и количество полей, их заголовки.
	   Возможны вычисляемые поля! При этом выбранный разрез может
	   быть распечатан и сохранен для дальнейшего использования!
	 - задавать переменные
	 - вычислять любое Clipper-выражение
	 - задавать макросы
	 - менять диск и директорию
	 - вызывать второй командный процессор
	 - очищать сразу всю запись
	 - делать Upper и Lower в текстовых полях
	 - менять режимы ввода
	 - работать с мышью
	 - выбирать все условия по истории
	 - сохранять и восстанавливать окружение
	 - читать инициализационные файлы
	 - выделять цветом различные ячейки по условию
	 - работать с буфером обмена
	 - самостоятельно отдавать TimeSlice
	 - "замораживать" поля для просмотра
	 - искать максимум/минимум
	 - прогуливаться по дискам/каталогам (Filer)
	 - использовать длинные имена Win9?

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

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

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


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


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

		dBASE3/Clipper  (DBT/NTX)
		FoxPro          (FPT/IDX/CDX)
		dBASE4          (DBT/MDX)
		SIX3            (SMT/NSX)

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

	Кроме стандартных Clipper-овских, поддерживаются поля типа
		Float (FoxPro), VariField (SIX).

	При открытии закриптованной базы SIX, запрашивается пароль.

	Форматы Visual FoxPro, dBASE5, FlagShip, FlexMemo поддерживаются
в форсированном режиме (см. п.34).

	Реально можно сделать поддержку NDX, если это кому-то еще
нужно. Что касается остальных существующих форматов (Comix,Inx,etc), то
на данный момент у меня нет драйверов :-(.


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), то на каждой записи, подлежащей замене, будет запрошено
подтверждение (с показом текущей и предполагаемой величины поля). Это
особенно удобно при замене переменным выражением.



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.
Эта операция доступна через меню Файл -> Создать HTML. См. также описание
функции Tb2Html().


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, будет восстановлено исходное состояние
базы.

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

	Требуемый порядок и содержание полей можно устанавливать
последовательно. Предположим, мы убрали из просмотра поле F2. Нажали
F10. Посмотрели и решили, что не хотим видеть и поле F3, а не только F2.
Последовательность действий: 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.


	Есть некоторые отличия команды TOTAL в BDBFS и в Clipper:

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


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


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


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


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

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


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

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

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

	В случае #define, в отличие от include файлов Clipper и C,
переменные будут объявлены и доступны не только во время чтения файла
инициализации. Если в define опущено <expression>, оно принимается равным
.T. .
	Полезным может оказаться задание в 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+* удобное задание шаблона для поиска


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

	Синтаксис:
		#LOCAL <v1>,<v2>...	или
		LOCAL <v1>,<v2>...

	Переменные, объявленные таким образом будут автоматически
освобождаться по завершению интерпретации ini-файла.

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

	В отличие от программ Clipper нельзя делать немедленное
присвоение, то есть неверно

		LOCAL cFile:="MyFile"


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

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

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

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


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

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

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

	Вызов ini-файла с параметрами и возвратом необходимо
организовывать через вычисление или пользовательское меню:

		{?} RestoreIni("MyPlug",par1,par2)

	Можно также использовать вложенный вызов непосредственно из
ini-файла:
		MySqrt:=RestoreIni("Sqrt.prb",32.1,3)

	Начиная с версии 1.21 можно использовать и прямой вызов ini-файла
как функции:
		{?} MyPlug(par1,par2)

	Единственное ограничение при этом - ini-файл должен иметь
расширение ini, что необязательно в случае использования RestoreIni().

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


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

	Синтаксис:
		#IF <условие>	(или IF <условие>)
			...
		#ELSE		(или ELSE)
			...
		#ENDIF		(или 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. Цикл WHILE

	Синтаксис:
		#WHILE <условие>	или  WHILE <условие>
			...
		#ENDW[hile]		или ENDWHILE или #ENDDO или ENDDO

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

	Пример:

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


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

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

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

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

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

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

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

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

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


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-файле (см.п.16).
	Кроме того, в режиме редакции доступны "горячие" клавиши
преобразований текущего фокуса ввода (такие же действуют и в BROWSE):
		Alt+U	= UpperCase
		Alt+L	= Lower
		Alt+K	= Capitalize (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 с memo-полями.
Полностью поддерживаются индексные файлы.

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


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

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

	Поля типа GENERAL и все новые типы Visual FoxPro поддерживаются
в форсированном режиме (см. п.34).


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-.

	При работе в win9х (не NT !) доступен и ClipBoard Windows.
Туда (и оттуда) можно скопировать текущее поле. Эти операции доступны
через Ctrl+Ins, Shift+Ins (серые).


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 или не задан - печатается одна. Если задан числовой
	   параметр - воспринимается как количество пробелов между двумя
	   колонками.

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

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

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

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

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

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

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

Печать заголовка на каждой странице	_NeedHeadPage
Печать номеров страниц			_NeedPrPage
Прогон страниц после вывода листа	_NeedEject
Стартовая последовательность принтера	_PSCode
Конечная последовательность принтера	_PECode
Левая граница				_LMargin
Длина страницы (0=лента)		_Plength
Печать стандартного заголовка		_NeedMainHead
Устройство-принтер			_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.Проверка/коррекция базы.


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


32.Плагины.


	Ну какой нынче программный продукт без плагинов! Видно, иначе
нельзя! "Плагины" BDBFS - это обычные ini-файлы (см. п.16), 
реализующие законченную функцию. Несколько (возможно даже небесполезных)
примеров есть в каталоге 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


	Параметры /NTX /CDX /MDX /NSX устанавливают соответствующий
драйвер по умолчанию (обычно он определяется в bdbfs.ini). Можно также
использовать форму /SIX[driver].

	Примеры:
		BDBFS MyBase /SIXNSX

		BDBFS MyBase /ntx /i=char


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

	Пример:
		BDBFS MyNew /CREATE

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

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

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


	Параметр HTM (HTML) вызывает генерацию файла HTML.

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

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


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


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

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


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

	Параметр 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 запускает форсированный режим (см. п.34).


	Для работы с каталогом можно применять команду 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-овские драйверы не
позволяют обрабатывать новые конструкции Visual FoxPro, dBASE5, FlagShip
и т.д.. Существуют также программы, позволяющие "обозвать" поля
нестандартным способом (например, начинающиеся с цифры).

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

	Итак, в форсированном режиме BDBFS понимает и поддерживает
следующие форматы:

	- Visual FoxPro (поля типа Currency, DateTime, General,
Picture, Integer, Double, новый формат memo-полей, новый заголовок);
	- dBASE4, dBASE5 (поля типа Bitmap, новые заголовки);
	- FlagShip (поля типа 2,4,8, новые заголовки);
	- FoxBase 1.0 (заголовок);
	- FlexMemo (memo-поля);
	- и, потенциально, все другие возможные типы полей, которые
в этом случае будут считаться и обрабатываться, как символьные.

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

	Форсированный режим можно также применять для обработки баз,
содержащих memo-поля длиной более 64K, так как использование стандартных
драйверов приводит в этом случае к внутренней ошибке Clipper.

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

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


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

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

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


	Еще раз напомню, для обработки базы в форсированном режиме,
приходится исправлять её заголовок! Поэтому, если во время работы,
например, мигнет свет, или, скажем, Вы по ошибке прибили сессию, то
структура базы будет испорчена! В случае с Visual FoxPro даже весьма
существенно!
	ПОЭТОМУ, ИСПОЛЬЗУЙТЕ ЭТОТ РЕЖИМ НА СВОЙ СТРАХ И РИСК!


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.Известные проблемы.


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

	Поля типа GENERAL FoxPro, типа BMP DBASE4, базы новых
форматов Visual FoxPro, DBASE4, DBASE5, FlagShip, FlexMemo
поддерживаются только в форсированном режиме (см. п.34).

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

	Проблемы с индексами MDX (ограничение драйвера):
	 - не доступны номер ключа в индексе и количество записей в
	   фильтре (без подсчета), что отражается на правильности
	   показа индикаторов;
	 - не доступен поиск по маске в индексах;

	Неправильно работает в 2000 году функция LUPDATE() Clipper.

	"Превышение лимита". Из-за ошибки в реализации в Clipper объекта
TBROWSE, показываются не все поля в базе с большим количеством полей.
По умолчанию количество полей, показываемых в BDBFS ограничено 170
(экспериментальный предел у меня на машине составляет 173). Вы можете
поэкспериментировать, задавая в INI-файле переменную _nBrowMaxField.
По сообщениям пользователей, удавалось добиться 210.

	Длинные имена в файлере показываются до 16-символов.

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

	Внутренняя ошибка 1112. Возникает на базах с memo-полем длиной
более 64K. Это - глюк Clipper 5.2 (в 5.01 его не было). Можно либо
работать с такими базами в форсированном режиме (см. п.34),
либо исключать такие поля из просмотра при помощи AutoOpen файлов (см. п.16).
Доступ к ним во втором случае возможен через функцию SX_Blob2File().

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

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

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


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


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

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

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

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

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


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


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

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

	Страничка:


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


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


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


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

	
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

	Напечатать базу [в файл]		F2
	Напечатать запись [в <base.rec>]	Alt+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
	(спец.для юзеров)
	Искать максимум/минимум		Alt+M
	Искать самое длинное значение	Ctrl+L
	в текстовом поле
	Искать дубль в индексе		Alt+2
	Искать по маске в индексе	Alt+[
	Продолжить поиск по маске	Alt+Shift+[


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

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

	Упаковать			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

	Скопировать поле сверху			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

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

	Up Down Left Right PgUp PgDn

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

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

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

	Переключить режим ввода			F4
	(см.п.1)
	Вставить строку символов из "MACRO"	Ctrl+F1

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

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

	Записать в буфер			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
	Переключить режим сортировки: "да/нет"	F6
	Завершить изменения			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
	Ввести наименование текущей базы	F6
	Меню ввода 				F10

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

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


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

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


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

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


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

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


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


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

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

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

	<имя файла> - неверный формат
		Или это вообще не DBF по структуре или это база с
		незнакомым типом поля. Попробуйте запустить bdbfs с
		параметром /FORCED.


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


	Как уже отмечалось, можно использовать почти все системные
	функции 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		CDX
CEILING		CHRTRAN		CTOT		DATETIME	DMY
EVALUATE	FILTER		FLOOR		GOMONTH		INLIST
ISBLANK		KEY		NDX		OCCURS		OEMTOANSI
PI		PROPER		SEEK		SIGN
SYS(2,3,5,6,12-16,21-23,1001,2000,2003,2012,2020,2021)


Функции Clipper Tools

CTOF	FTOC	XTOC	LIKE


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


ПРИЛОЖЕНИЕ IV.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		''
	Условие цветности		_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.
	Печать заголовка на каждой странице	_NeedHeadPage	.T.
	Печать номеров страниц			_NeedPrPage	.T.
	Прогон страниц после 			_NeedEject	.T.
	Стартовая последовательность принтера	_PSCode 	''
	Конечная последовательность принтера	_PECode 	''
	Левая граница				_LMargin	0
	Длина страницы				_Plength	0(лента)
	Печать стандартного заголовка		_NeedMainHead	.T.
	Устройство-принтер			_printer	PRN
	Дописывать ли файл вывода		_NeedApFile	.F.
	Суммировать ли числовые поля при печати _NeedSum	.T.
	Ширина вывода Memo-полей при печати	_MemoPrnt	50
	Максимально количество строк при	_MemoNumLines	10
	выводе memo и широких текстовых полей
	Символ, разделяющий клетки		_DefaultBorder	 :


Цветовая гамма:
	Основной цвет 		_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	'SIXCDX'
	Текущее расширение Memo		_DefaultMemo	'FPT'
	Текущее расширение компаунда	_DefaultCDX	'.CDX'
	Пользовательское меню
		Строки			UserMenuPrompts	{}
		Действия		UserMenuActs	{}
	Авто-сохранение окружения	_AutoSave	.F.
	Авто-восстановление окружения	_AutoRestore	.F.
	"Стандартная" клавиатура	_Usa_Keyboard	'QWERTY......'
	"Моя" клавиатура		_My_Keyboard	'ЙЦУКЕН......'
	DOS кодировка			_Oem_Set	'АБВГДЕ......'
	WINDOWS кодировка		_Ansi_Set	'юабцде......'
	Максимальное количество
	отображаемых полей		_nBrowMaxField	170
	Размер буфера UNDO		_UndoSize	1024
	Форсированный режим		_lForced	.F.
	Путь поиска плагинов		_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>,Пример: Round(1.025,2) --> 1.02 RoundIt(1.025,2) --> 1.03
2. Функции преобразования.

	
Capitalz(<ExprC>) --> ExprC Преобразует символьное выражение в строку с первой заглавной. При отсутствии параметра возвращает пустую строку. Пример: Capitalz('ЛУГАНСК') --> Луганск
OemToAnsi(<ExprC>) Преобразует строку в Windows кодировку (1251). Украинские буквы поддерживаются согласно ГОСТ Украины. Вы можете изменить кодировку под ваши нужды, задав переменные _Oem_Set, _Ansi_Set. Пример: OemToAnsi('ЛУГАНСК') --> ксцюмяй
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]) Преобразует текущий TBrowse объект в формат HTML. Если название файла не задано - запрашивается. Массив цветов aDesign имеет структуру: {background color, table background, text color для таблицы и заголовка, text color для помеченных как DELE() записей}. По умолчанию используются: "navy","blue","white","red". Пример: Tb2Html('MyBase','WWW FOREVER!',; {'fffffc0','fffff80','00000ff','black'})
3. Команды установки SET.

	А. Команды-переключатели. Формат SetКККК(<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)
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]) Выводит текущую запись на устройство печати в развернутом виде. Без параметра - на принтер. По нажатию Alt+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. Банковские функции.
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