Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2008, 11:34   #1
Any
 
Регистрация: 14.07.2008
Сообщений: 4
Вопрос Delphi+Paradox

Добрый день!

Нужна помощь специалистов

Подскажите пожалуйста, как сделать полное копирование папки с вложенными объектами в нужное мне место и архивацию копии (например, RAR`ом)? А потом, по надобности, обратный процесс: разархивация копии и копирование в изначальное место (откуда была сделана копия) с добавлением изменений (если такие есть)

Заранее, спасибо за ответ
Any вне форума Ответить с цитированием
Старый 14.07.2008, 17:40   #2
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Например, так:
Код:
WinExec('с:\program files\winrar\rar.exe a -o+ -r -s -y с:\test1.rar d:\1', CREATE_NEW_CONSOLE );
1) Сперва указываете директорию, где установлен сам WinRar.
2) Далее идут некоторые команды и ключи для работы с WinRar. Расписывать что они означают не буду, так как, значения всех команд вы можете увидеть в командой строке выполнив следующую команду:
с:\progra~1\winrar\rar.exe /?
3) Далее указываем путь, где будет создан и храниться архив
4) Указываем то, что будем архивировать
edgy вне форума Ответить с цитированием
Старый 16.07.2008, 07:28   #3
Any
 
Регистрация: 14.07.2008
Сообщений: 4
По умолчанию

Пасибо, я попробую

А как быть с обратным процессом и обновлением баз? Извиняюсь, конечно, за наглость ))

Последний раз редактировалось Any; 16.07.2008 в 10:47.
Any вне форума Ответить с цитированием
Старый 16.07.2008, 17:49   #4
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Аналогично. Только в данном случае вызываем UnRar.
Код:
 WinExec('c:\program files\winrar\UnRar.exe e C:\Test.rar C:\',CREATE_NEW_CONSOLE);
edgy вне форума Ответить с цитированием
Старый 16.07.2008, 18:06   #5
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

А лучше хорошенько разберитесь с командами и ключами WinRar. Там много чего интересного.
Почитать про них вместе с примерами можно в файле rar.txt ( находится в каталоге, где установлен WinRar ).
edgy вне форума Ответить с цитированием
Старый 17.07.2008, 08:06   #6
Any
 
Регистрация: 14.07.2008
Сообщений: 4
По умолчанию

edgy большое вам спасибо, но я разобралась с rar-ом. Проблема вся в обновлении базы...
Any вне форума Ответить с цитированием
Старый 18.07.2008, 07:35   #7
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Цитата:
Сообщение от Any Посмотреть сообщение
Проблема вся в обновлении базы...
Что значит "проблема в обновлении базы"? Я так понял, что у вас есть так называемая "общая" база данных, куда сливается вся информация. Далее вы копируете ее на рабочие места, где забивается какая-то информация. Затем БД (архив) с рабочих мест сливается на комп, где расположена эта "общая" БД. И добавляется информация которая была изменена/добавлена. Я правильно вас понял?
Если все это вы делаете так, как я предположил, то имхо все это лишний геморой. Можно попроще. Например, перейти на архитектуру "клиент-сервер"/"трехзвенка". В этом случае все пользователи работают с одной БД. И у вас нет проблем с обновлением данных. Правда в этом случае вам скорее всего придется забыть про Paradox.
Если вы хотите все оставить по-старому, то варианты тоже есть. Но в данном случае придется делать больше ненужных телодвижений . Итак, например, можно сравнивать построчно две таблицы соответственно "общей" БД и изменной пользователем. Если данные какой-либо строки были изменены или какая-то строка не найдена ( добавлена новая или удалена ), то делаете соответствующие изменения в вашей "общей" БД.
Есть вариант с добавлением в каждую таблицу логических полей, указывающих на то, что данная строка была изменена. А потом уже в зависимости от того, что в данном логическом поле указано, изменять или не изменять данные в "общей" БД.
Так что, что в общем вам выбирать, что для вас лучше подходит.
Но, имхо, вариант "клиент-сервер" здесь наилучший вариант.
edgy вне форума Ответить с цитированием
Старый 21.07.2008, 09:21   #8
Any
 
Регистрация: 14.07.2008
Сообщений: 4
По умолчанию

Вы все правильно поняли, но я не могу использовать одну БД... Так как рабочие места находятся в разных уголках города.
И кроме как с Парадоксом я больше ни с чем не работала, а изучать что-то новое совсем нет времени ((
Я прошу прощения за наглость, а можно прислать примерный код обновления БД?
Any вне форума Ответить с цитированием
Старый 22.07.2008, 07:46   #9
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Цитата:
Сообщение от Any Посмотреть сообщение
но я не могу использовать одну БД... Так как рабочие места находятся в разных уголках города.
Ну это вовсе не проблема.
Проблема здесь скорее всего в вашем нежелании уйти от использования БД, которая не приспособлена для решения ваших текущих задач. Было бы правильным грамотно спроектировать архитектуру вашей системы, ну или в крайнем случае использовать СУБД, которая поддерживает репликацию.

Цитата:
Сообщение от Any Посмотреть сообщение
а можно прислать примерный код обновления БД?
Здесь много нюансов, чтобы сразу выдать готовое решение. Но тем не менее, давайте попробуем не углубляясь в детали проанализировать вашу ситуацию Итак, имеем 2 БД, одну - главную, и одну пользовательскую. Цель проверить по-таблично пользовательскую БД на наличие изменений данных и сделать соотвествующие изменения в главной БД. Допустим у нас имеются 2 таблицы: назовем их "MainTable" ( одна из таблиц вашей "главной" БД ) и "UserTable" ( та же таблица из пользовательской БД ). Самые элементарное здесь - это проверить на наличие новых и удаленных записей и сделать соответсвующую изменения в главной БД. В принципе это можно сделать запросом:

Вставка новых записей:

Код:
insert into MainTable
select *
from UserTable
where UserTable.id not in
( select MainTable.id
    from MainTable )
Удаление:

Код:
delete from MainTable
where MainTable.id not in 
( select UserTable.id
    from UserTable )
При наличии множества таблиц для сравнения здесь могут быть проблемы, так как id новых записей у разных пользователей будут совпадать. Поэтому придется в данном случае генерить новые значения id. И это только одна из проблем.

Сравнивать поля строк 2-х таблиц можно так ( примерный код, который требует большой доработки ):

Код:
var
  i, j : integer;
begin
  ADODataSet1.First;
  ADODataSet2.First;
  for i := 0 to ADODataSet1.RecordCount - 1 do begin
     for j := 0 to ADODataSet1.FieldCount - 1 do begin
        if ( ADODataSet1.Fields[ j ].Value <> ADODataSet2.Fields[ j ].Value ) then begin
          // Выполняем обновления
        end;
     end;
     ADODataSet1.Next;
     ADODataSet2.Next;
  end;
end;
P.S. Все вышеприведенное, это скорее информация для размышления а не руководство к действию. Так что вам придется разбираться и разбираться.
edgy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Редактор баз Paradox Dux БД в Delphi 11 08.08.2008 23:36
Портативность Paradox DB Veiron БД в Delphi 2 12.05.2008 19:21
Поключение к Paradox alexfin БД в Delphi 3 17.02.2008 12:22
Таблицы Paradox Help User77 Помощь студентам 2 12.02.2008 17:15
Работа с БД Paradox Алёна БД в Delphi 1 11.03.2007 15:54