В VFP база данных и таблицы - это отдельные файлы на диске. Очень желательно размещать базу данных и относящиеся к ней таблицы в одном каталоге !!! Со временем количество таблиц растет и есть смысл размещать различные базы данных и их таблицы в разных каталогах - системную БД в папке System, бухгалтерию в папке Account и т.д.
После создания БД в соответствующей папке будет три файла:
D_MyName.DBC - аналог DBF - таблица
D_MyName.DBT - аналог FPT - MEMO поля таблицы
D_MyName.DCX - аналог CDX - индексный файл
При добавлении в БД таблиц следите за размещением их в той же папке, что и файлы базы данных. Когда мы создаем таблицу, на диске появляется файл T_MyName.DBF. Если в структуре таблицы есть MEMO поля (текстовые поля большого размера) или поля GENERAL(поля хранения объектов), рядом с файлом таблицы повляется файл T_MyName.MEM. При добавлении к таблице одного или нескольких индексов появляется файл T_MyName.CDX - файл компаундных индексов.
Все файлы одной таблицы представляют единое целое и потеря некоторых из них приводит к фатальным ошибкам. Наиболее "легкой" потерей можно считать потерю индексного файла. Индексы можно восстановить вручную или собственной специальной процедурой.
Наиболее удобно создавать базы данных и таблицы в окне проекта на закладке Data.
Для работы с таблицами используются следующие команды:
* * выбираем рабочую область для таблицы select 1 * открываем таблицу use .\System\T_Tables * выбираем другую рабочую область select 2 * открываем другую таблицу use .\System\T_Users *
Следует заметить, что рабочих областей для открытия таблиц у VFP - 32767 !!! Когда-то их было 10, потом 25, потом 254.
Функция select() может использоваться для получения информации о рабочих областях:
* выводит номер текущей рабочей области ?select(0) * выводит максимальный номер рабочей области (32767) ?select(1) *
В зависимости от установки совместимости можно получить следующие результаты:
* выводит номер текущей рабочей области set compatible off ?select() * выводит минимальный номер неиспользуемой рабочей области set compatible on ?select()
Одну и ту же таблицу можно открыть несколько раз в различных рабочих областях:
select 1 use .\System\T_Tables * select 2 use .\System\T_Tables again
Для обращения к открытой таблице удобно использовать псевдоним:
select 1 use .\System\T_Tables again alias AliasTables * select 2 use .\System\T_Registry again alias AliasRegistry * * переход между областями по номерам рабочих областей select 1 :::::. select 2 :::::. * переход между областями по псевдонимам select AliasTables :::::. select AliasRegistry :::::.
Некоторые операции над таблицей можно осуществлять только выполнив переход в ее рабочую область.
select AliasTables * перемещение по таблице scan ?FldStrName endscan *
Ряд операций можно осуществлять прямым обращением к рабочей области.
* выводим значения полей из разных таблиц без * явного перехода в их рабочие области ?AliasTables.FldStrName ?AliasRegistry.FldStrKey * * выполняем запрос к двум таблицам, открытым * одновременно в разных рабочих областях select * from AliasTables A, AliasRegistry B where A.FldStrCodeUniq = B.FldStrKey *
После работы с таблицами их нужно закрывать командой USE.
select 1 use select 2 use
А можно и так:
use in AliasTables use in AliasRegistry
А еще лучше написать функцию с проверкой:
function CloseAlias * локальный параметр - доступен только в текущей функции lparameter strLocPrmAlias * локальная переменная local logLocReturn * проверка открытого псевдонима if used(strLocPrmAlias) use in (strLocPrmAlias) && закрываем таблицу logLocReturn = .T. && таблица была закрыта else logLocReturn = .F. && нет открытого псевдонима endif return logLocReturn && возвращаем результат
Комментарий в VFP - это строка, начинающаяся символом *.
Для указания комментария в командной строке необходимо использовать два символа &&.
Каждая команда должна начинаться с новой строки. Для переноса длинных команд необходимо использовать ;.
select * from AliasTables A, AliasRegistry B ; where A.FldStrCodeUniq = B.FldStrKey ; order by A.FldStrName
После ;(переноса команды) нельзя использовать &&.
Мы написали функцию закрытия таблицы. В следующем шаге мы начнем создавать функцию открытия таблицы.