Форум » [x]Harbour » Открытие баз RDD CDX » Ответить

Открытие баз RDD CDX

Loach: Доброго времени суток всем! Подскажите, гуру, открываю несколько баз: use base1 new use base2 new и т.п. Свободные рабочие области при "new" выбираются начиная с 1 или в произвольном порядке (как карта ляжет). Если например у меня открыты 2 базы в 33 и 44 области, а я делаю use ... new, то база в 1 области откроется? Пасиб!

Ответов - 13

Pasha: Судя по функции hb_rddSelectFirstAvailable( void ), РО просматриваются с единицы, т.е. 1-я область, если она не используется, откроется

Loach: СпасиБО! Вразумили...

Andrey: Loach пишет: Подскажите, гуру, открываю несколько баз: use base1 new use base2 new и т.п. А зачем к базе обращаться по SELECT(1) 2, 3 и т.д. Используй АЛИАС базы: USE base1 ALIAS Main_BASE new и тому подобное... А обращаться уже: SELECT Main_BASE


Dima: Andrey пишет: Используй АЛИАС базы +1

Loach: Andrey пишет: Используй АЛИАС базы: Не, дело не в этом. Кстати, может еще у кого какие мысли будут по поводу следующего: Я проверяю периодически (пишу в протокол) какие базы у меня открыты в данный момент. Делаю это так: Function Bazy() local otvet:='*', n for n = 1 to 256 if ! Empty( Alias( n ) ) otvet += Str( n, 3 ) + ": " + If( Select() == n,"=>", "" ) + alltrim(Alias( n ))+"*" endif next return otvet Если я знаю, что больше 50 баз я не открываю, то можно естественно for n = 1 to 50 Вот и все. Может кто-нибудь решал это дело по-другому?

AlexMyr: А если при открытии базы писать инфу про это в отдельную базу и при закрытии тоже, то получиться, что мы имеем любой отчет в данный момент времени - кто, когда и тд ...

Loach: AlexMyr пишет: писать инфу про это в отдельную базу Может конечно это и выход... Просто я открытыми стараюсь держать минимум баз. Открываю и закрываю вспомогательные походу работы. Иногда естественно закрывать забываю и ... А так сделал протокольчик работы пользователя. В начале, конце и ключевых моментах каждой функции - запись в протокол, чего он там делает, чего воротит, и заодно, какие базы открыты в текущий момент.

wad1: Динамическое открытие/закрытие таблиц вносит существенные тормоза в работу. Причем не всегда можно в нужный момент открыть таблицу, если кто-то надумал ее сжать, или еще для чего-то захватить монопольно. Поэтому для всех проектов у меня создается список таблиц с индексами (DISTR.DBF), по которому выполняется открытие и закрытие таблиц стандартной процедурой - с проверкой корректности индексов, шифрованием, корректировкой уникальных кодов.

Andrey: wad1 пишет: шифрованием, А вот здесь поподробней пожалуйста....

Dima: wad1 пишет: с проверкой корректности индексов Хотелось бы взглянуть на твою процедуру проверки.

wad1: Абсолютно точно проверить индексы не просто. У нас применяются быстрые проверки, которые во многих случаях помогают. Но не всегда. Что проверяется: 1. Дата модификации DBF-файла реальная и зафиксированная в DISTR.DBF (при корректном закрытии таблиц последним пользователем эта дата запоминается). При последующем входе в программу первого пользователя (если сумел открыть таблицу монопольно, значит первый) проверяются эти даты. Если не совпадают, то автоматическая переиндексация. Естественно при открытии индексов подменяется блок обработки ошибок. Если случился облом, индекс уничтожается и создается заново. REINDEX иногда не исправляет ситуацию. Индексы открываются отдельно от DBF-файлов: если испорчен DBF, автоматически сделать что-то нельзя (не умеем). 2. Проверяется последний уникальный код таблицы, если он есть. Физически он должен находиться в конце таблицы, хотя не обязательно последним. Под концом понимается последние 10 записей. Если это не так, значит индекс скорее всего некорректный. Код фиксируется в DISTR, в строке с индексом по соответствующему полю. Это помогает вычислять следующий код при добавлении записей одновременно с нескольких станций. Шифрование. В DISTR есть поле, в котором указывается необходимость шифрования таблиц. Если признак есть, то открытие выполняется с расшифровкой. Дальнейшая работа с таблицей выполняется как обычно.

Andrey: wad1 пишет: то открытие выполняется с расшифровкой. Дальнейшая работа с таблицей выполняется как обычно. А пример можно ?

wad1: Пример чего? Как открыть таблицу с шифрованием? Об этом неоднократно здесь уже писали. Примерно так: ****************** static function OpenTable(cDatabase,cAlias,lShared,lPassWord) ****************** lShare := !empty(lShared) lReadOnly := !empty(lReadOnly) dbUseArea(.T.,,cDatabase,cAlias,lShared,lReadOnly) if lPassWord sx_SetPass(SlPassWord(),1) endif if lPassWord.and.( Sx_TableType() = 1 ) nalert("Внимание!;Таблица "+cDatabase+" должна быть зашифрована!") BREAK endif if !lPassWord.and.( Sx_TableType() = 2 ) nalert("Внимание!;Таблица "+cDatabase+" не должна быть зашифрована!") BREAK endif return **************** function SlPassWord // Получить пароль **************** return "PRIVETHARBOUR" Таблицу перед таким открытием нужно зашифровать. У нас для этого есть утилита, но действие она делает простое: use mtable sx_DBFencrypt(SLPassWord())



полная версия страницы