Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сравнение полей в таблицах БД Access и добав. нов. полей в сущ. таблицу без потерь данных 
V
    Опции темы
ADAM83
Дата 15.6.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 13.1.2006

Репутация: нет
Всего: нет



Здравствуйте! У меня такой вопрос: есть 2 БД в Access, кот. содержит по одному таблицу (поля таблицы 1 БД: id, Name1) (поля таблицы 2 БД: id, Name2), здесь БД не пустые! 
Теперь, как можно программным путем сравнить эти 2 БД, точнее структуру этих баз, и к первой БД добавить новые поля с данными из второй БД (примерно так: id, Name1, Name2), так чтоб данные первой БД не стерлись после модификации?

Спасибо заранее!
PM MAIL   Вверх
Keeper89
Дата 15.6.2009, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 1
Всего: 58



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


--------------------
PM MAIL WWW   Вверх
ADAM83
Дата 15.6.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 13.1.2006

Репутация: нет
Всего: нет



Keeper89
Цитата

А источник не сотрется никак, если вы трогать его не будете smile 

хорошо, я понял что данные сами по себе не сотрутся!  smile  


Цитата

Далее можно проверять содержимое полей, например, в цикле, сравнивая содержимое источника с преемником.

как теперь организовать сравнение полей между БД? 

PM MAIL   Вверх
Romikgy
Дата 15.6.2009, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 4
Всего: 146



Цитата(ADAM83 @  15.6.2009,  14:24 Найти цитируемый пост)
как теперь организовать сравнение полей между БД? 

запросом видать можно сравнить (точнее найти отличия и показать одинаковый) только индексы заюзать для быстроты работы
+добавление полей юзать alter 
))


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
flomaster
Дата 16.6.2009, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 28.12.2007
Где: СПб

Репутация: нет
Всего: нет



Если требуется получить две одинаковые таблицы, то зачем сравнивать?
Удалить неполную таблицу, и вставить целиком полную.
Это же не Оракл и млрд записей.

Если уперлось искать отсутствующие поля:
Отправляем одинаковый запрос к обеим базам
DataSet1.CommandText:="Select * From Table"; //К первой БД
DataSet2.CommandText:="Select * From Table"; //Ко второй БД
...Open;
Дальше просматриваем список полей, сравниваем названия. И находим отсутствующие.

Если шла речь о сравнении в цикле  значений полей - это глупость.
PM MAIL   Вверх
Keeper89
Дата 16.6.2009, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 1
Всего: 58



Цитата(flomaster @  16.6.2009,  01:58 Найти цитируемый пост)
Удалить неполную таблицу, и вставить целиком полную.

Найти недостающие поля во второй гораздо вычитанием (1 запросом) , как сказал Romikgy, и добавлением к преемнику недостающих данных, а не удалением ВСЕЙ таблицы и вставки новой. И не в миллиарде записей дело.


--------------------
PM MAIL WWW   Вверх
ADAM83
Дата 16.6.2009, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 13.1.2006

Репутация: нет
Всего: нет



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

здесь БД не пустые! 
 извиняюсь за неверную инфу! smile 

Наверно мой вопрос некорректно звучал, мне нужно было изменить структуру первой БД на основании структурой второй БД (как бы слить в одну).

Код

type
  TB1 = record
    f1: Integer;
    f2: String;
  end;
......
var a: array of TB1;
.....
ADOTable1.First;
  i := 0; //элементы в массиве нач-ся с нуля
  while not ADOTable1.Eof do
  begin
    a[i].f1 := ADOTable1.FieldValues['f1'];
    a[i].f2 := ADOTable1.FieldValues['f2'];
    i := i + 1;
    ADOTable1.Next;
  end;
......
  ADOConnection1.Connected := false;
  ADOConnection2.Connected := false;
  ADOTable1.Close;
  ADOTable2.Close;
  if RenameFile(dir2+'tbTMP.mdb',dir2+'tb.mdb') then
    CopyFile(PChar(dir2+'tb.mdb'),PChar(dir1+'tb.mdb'),false);
  RenameFile(dir2+'tb.mdb',dir2+'tbTMP.mdb');
  ADOConnection1.Connected;
  ADOConnection2.Connected;
  ADOTable1.Open;
  ADOTable2.Open;
  for i := 0 to rCnt-1 do
  begin
    ADOTable1.Append;
      ADOTable1.FieldValues['f1'] := a[i].f1;
      ADOTable1.FieldValues['f2'] := a[i].f2;
    ADOTable1.Post;
  end;

С этим моя проблема решена. Спасибо всем кто откликнулся!
PM MAIL   Вверх
Данкинг
Дата 16.6.2009, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



ADAM83, зачем там какие-то временные файлы? smile Перебираешь поля первой таблицы (первый цикл) и пытаешься найти их во второй (второй цикл). Если поле не найдено, то добавляешь через обычный alter table...

Это сообщение отредактировал(а) Данкинг - 16.6.2009, 15:49


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
flomaster
Дата 16.6.2009, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 28.12.2007
Где: СПб

Репутация: нет
Всего: нет



Цитата(Keeper89 @  16.6.2009,  01:14 Найти цитируемый пост)
Найти недостающие поля во второй гораздо вычитанием (1 запросом)
Будьте так добры, покажите этот запрос.

Данкинг, перебор полей и присвоение значений в цикле - ошибка.
Используйте запрос на добавление или обновление. TADOCommand.
TADOTable - зло. Используйте TADODataSet.

Это сообщение отредактировал(а) flomaster - 16.6.2009, 22:47
PM MAIL   Вверх
Данкинг
Дата 16.6.2009, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(flomaster @  16.6.2009,  23:43 Найти цитируемый пост)
перебор полей и присвоение значений в цикле - ошибка.

В чём ошибка, не понял? При чём тут присвоение значений? Я про то, что надо перебрать имеющиеся поля одной таблицы на предмет наличия/отсутствия в другой таблице.

Цитата(flomaster @  16.6.2009,  23:43 Найти цитируемый пост)
Используйте запрос на добавление или обновление.

Совершенно солидарен: без запроса на добавление добавить новое поле никак не получится. smile 

Цитата(flomaster @  16.6.2009,  23:43 Найти цитируемый пост)
TADOTable - зло. 

Не знаю, не замечал. Хотя чаще юзаю AdoQuery.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
flomaster
Дата 16.6.2009, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 28.12.2007
Где: СПб

Репутация: нет
Всего: нет



Данкинг, промашка с адресом "вышла".
да... вкурил, что там в цикле, озадачился еще больше.
Отказался от использования и Table, и Query в пользу Dataset (заменяет их обоих).

Это сообщение отредактировал(а) flomaster - 16.6.2009, 23:17
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1208 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.