Распечатать страницу

Упаковка таблиц в Visual FoxPro

« Назад

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

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

&& Упаковка таблиц базы данных HomeLibrary

&&

#define NEXTLINE Chr(13) + Chr(10)

&&

nOfTbls = 5                        && Число таблиц

declare aTbls(nOfTbls, 3)   && Массив таблиц

aTbls(1, 1) = 'Authors'

aTbls(2, 1) = 'Books'

aTbls(3, 1) = 'BooksAuthors'

aTbls(4, 1) = 'BooksContent'

aTbls(5, 1) = 'WorkType'

for ind = 1 to nOfTbls

&& Элемент равен .T., если таблица будет упаковываться

aTbls(ind, 2) = .T.

next

&&

&& Определяем используемые таблицы, проставляя для них

&& в элемент aTbls(*, 2) значение .F.

&& Формируем для начала массив arrayOfSessions с номерами сессий данных

Asessions(aOfSessions)

for each nOfDs in aOfSessions

&& Формируем массив aUsedTbls с псевдонимами таблиц, открытых

&& в сессии данных с номером nOfDs

nOfOpTbls = Aused(aUsedTbls, nOfDs)

for k = 1 to nOfOpTbls

usedTbl = aUsedTbls(k, 1)

for ind = 1 to nOfTbls

if Upper(aTbls(ind, 1)) = usedTbl then

&& Таблица открыта, поэтому упаковываться не будет

aTbls(ind, 2) = .F.

aTbls(ind, 3) = nOfDs

endif

next

next

next

&&

&& Открываем таблицы, для которых aTbls(ind, 2) = .T.,

&& в режиме монопольного доступа

for ind = 1 to nOfTbls

if aTbls(ind, 2) then

tblPath = appPath + aTbls(ind, 1)

use (tblPath) in 0 exclusive && Употребляем выражение с именем

endif

next

&&

&& Упаковка таблиц

for ind = 1 to nOfTbls

if aTbls(ind, 2) then

select (aTbls(ind, 1))

pack

endif

next

&&

&& Закрываем упакованные, монопольно открытые таблицы

for ind = 1 to nOfTbls

if aTbls(ind, 2) then

select (aTbls(ind, 1))

use

endif

next

&&

&& Вывод отчета

sft = Set('SAFETY')

set safety off

set textmerge on

set textmerge to d:\a.txt noshow

\\Упакованы таблицы: <<NEXTLINE>>

set textmerge to d:\a.txt additive noshow

for ind = 1 to nOfTbls

if aTbls(ind, 2) then

\\<<aTbls(ind, 1) + NEXTLINE>>

endif

next

\\<<NEXTLINE>>Не упакованы таблицы:<<NEXTLINE>>

for ind = 1 to nOfTbls

if not aTbls(ind, 2) then

\\<<aTbls(ind, 1)>>; открыта в сессии данных №

\\ <<Transform(aTbls(ind, 3)) + NEXTLINE>>

endif

next

set safety &sft                     && Употребляем макроподстановку

set textmerge to

modify file d:\a.txt noedit

Возможный результат:

Упакованы таблицы:

Books

BooksAuthors

BooksContent

Не упакованы таблицы:

Authors; открыта в сессии данных № 1

WorkType; открыта в сессии данных № 4