Шаг 6 - Базы данных и таблицы VFP

В 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

После ;(переноса команды) нельзя использовать &&.

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


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Сергей Платонов - 3.02.2000