Упаковка таблиц в 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 |