Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с базами

Аноним
Есть маленькая программа для работы с базами. Надо чтобы при её каждом открытии она проверяла все свои базы с которыми работает, а их не так много(6-15) и если какая-нибудь база не найдена, выдавала сообщение об ошибке и о востановлении базы из архива. И если можно, как сделать, чтобы через какое-то время, которое задаёт пользователь, программа автоматически сохраняла себя в архиве. Помогите чайнику, плз!
591
28 ноября 2001 года
x77
40 / / 20.03.2000
Допустим, все базы (т.е. TTable) валяются в DataModule. Тогда для проверки можно сделать такую вот процедурку

procedure CheckTables;
var
i integer;
begin
with DataModule1 do begin
for i = 0 to ControlCount - 1 do
if Controls is TTable then begin
if not FileExists ((Controls as TTable {TQuery}).TableName then
        // Восстановление из архива
      end;
end;
end;

А на открытие/закрытие можно сделать так

procedure SetDbState (DbState boolean);
var
  i integer;
begin
  with DataModule1 do begin
    for i = 0 to ControlCount - 1 do
      if Controls is TTable then
(Controls as TTable).Active = State;
  end;
end;

Обе процедуры перебирают все TTable'ы в DataModule и первая проверяет, что такая таблица физически существует на диске, а вторая - для всех устанавливае свойство Active (т.е. открывает или закрывает их).

Теперь что касается архива. Основная проблема в том, чтобы прога н еначала себя архивировать, скажем, в тот момент, когда пользователь редактирует накладную (или вообще меняет данные). Зесь есть два варианта.

1-й - отслеживать текущее состояние программы, и если в данный момент это не допустимо, не запускать архиварование. Реалтзуется технически достаточно просто (обыкновенной глобальной переменной), но муторно.

2-й вариант - отключать таймер перед наступлением такого события, кога база архивироваться не должна. Например, пользователь меняет данные

Timer1.Enabled = FALSE;
DoSomethingUseful;
Timer1.Enabled = TRUE;

Само архивирование при этом будет прописано в Timer1.OnTimer.

Недостаток обеих подходов в том, что реальный интервал между архивациями может значительно отличаться и зависеть от интенсивности работы пользователя. Можно немного усложнить это всё, например, не отключать таймер, а при срабатывании устанавливать какую-то глобальную переменную (например, TimeToArchivate = TRUE). После этого каждый раз, когда состояние базы допускает архивацию, проверять значение этой переменной и, если она имеет значение TRUE, запускать архивацию, которая установит её обратно в FALSE. Проверку эту можно делать, например, после каждого поста. Но в любом случае жёстко выдерживать интервал архивации не удасться, иначе вам придётся принудительно откатывать все сделанные пользователям изменения (при вставке новой записи, например), что мало какому пользователю понравится.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог