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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2008, 17:05   #1
Tanuska___:)
Пользователь
 
Аватар для Tanuska___:)
 
Регистрация: 22.04.2008
Сообщений: 84
По умолчанию обмен данными из двух таблиц (одинаковой структуры) но в разных базах

Скажите как правильно сформировать алгоритм по обмену данными между 2 одинаковыми базами (аксесс) но которые находятся на разных дисках.
Но условие такое , если запись с ID есть в обеих таблицах то обновление данных.
Если ключ только в одной таблице то вставка записи.
я тут пробовала делать так (может и коряво ... как умею)
использую 2 ADOConnection для соединения с базами.
Код:

var tex:string;//для формирования запроса
d:TDateTime;// для проверки на пустую строку в поле для дат
i,g,j:integer;

теперь непосредственно соединение:


// с первой базой (находиться в корневом каталоге)
With DataModule1.Connection do
    Begin
      Connected:=False;      ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+GetCurrentDir+'\Zalob.mdb;Mode=ReadWrite;Persist Security Info=False';
      Connected:=True;
    End;

//соединение со второй базой


With ADOConnection1 do
    Begin
      Connected:=False;
      ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=L:\..\...\Zalob.mdb;Mode=ReadWrite;Persist Security Info=False';
      Connected:=True;
    End;


далее на форме кинула 3 ADOQuery.
связь с соединением: ADOQuery1,ADOQuery3-ADOConnection1
ADOQuery2-DataModule1.Connection

далее заношу в ADOQuery1  и ADOQuery2 данные из одинаковых таблиц разных баз


with ADOQuery1 do
  begin
  close;
  sql.Clear;
  sql.Add('select * from Zurnal order by PorNomer');
  Open;
    end;
    with ADOQuery2 do
    begin
  close;
  sql.Clear;
  sql.Add('select * from Zurnal order by PorNomer');
  Open;
  end;


// вот тут у меня и состоит сложность т.к. ключи проверяются не так как мне нужно ... то есть позиция одного остается а другого меняется и при этом пытается вставить уже существующую запись :


while not ADOQuery1.Eof do begin
    g:=StrToInt(ADOQuery1.Fields.Fields[1].AsString);
    j:=StrToInt(ADOQuery2.Fields.Fields[1].AsString);
  If (g = j)  then begin// наверно я тут условие неверно //написала на поиск одинаковых значений , но как исправить //не знаю :((
tex:='update Zurnal set StatusKol ='+QuotedStr(ADOQuery2.Fields.Fields[3].AsString)+',fio=' +QuotedStr(ADOQuery2.Fields.Fields[4].AsString)+ ',KemPereslano='+QuotedStr(ADOQuery2.Fields.Fields[5].AsString)+',Adress='+QuotedStr(ADOQuery2.Fields.Fields[6].AsString)+',Soderganie='+QuotedStr(ADOQuery2.Fields.Fields[7].AsString)+',Ispolnitel='+QuotedStr(ADOQuery2.Fields.Fields[8].AsString)+',Status='+QuotedStr(ADOQuery2.Fields.Fields[9].AsString)+',Ident='+QuotedStr(ADOQuery2.Fields.Fields[11].AsString)+'';
if TryStrToDateTime(DateTimeToStr(ADOQuery2.Fields.Fields[2].AsDateTime), d) then tex:=tex + ', DataPost='+QuotedStr(DateTimeToStr(ADOQuery2.Fields.Fields[2].AsDateTime))+'';
if TryStrToDateTime(DateTimeToStr(ADOQuery2.Fields.Fields[10].AsDateTime), d) then tex:=tex+ ', DataIspolnen='+QuotedStr(DateTimeToStr(ADOQuery2.Fields.Fields[10].AsDateTime))+'';
  tex:=tex+ ' where PorNomer = '+QuotedStr(ADOQuery1.Fields.Fields[1].AsString)+'';
ADOQuery3.Close;
ADOQuery3.SQL.Clear;
ADOQuery3.SQL.Text:=tex;
ADOQuery3.ExecSQL;
  end  else begin
tex:= 'insert into Zurnal (PorNomer,DataPost,StatusKol,fio,KemPereslano,Adress,Soderganie,Ispolnitel,Status,DataIspolnen,Ident) values('+QuotedStr(ADOQuery2.Fields.Fields[1].AsString)+','+QuotedStr(DateTimeToStr(ADOQuery2.Fields.Fields[2].AsDateTime))+','+QuotedStr(ADOQuery2.Fields.Fields[3].AsString)+','+QuotedStr(ADOQuery2.Fields.Fields[4].AsString)+','+QuotedStr(ADOQuery2.Fields.Fields[5].AsString)+','+QuotedStr(ADOQuery2.Fields.Fields[6].AsString)+','+QuotedStr(ADOQuery2.Fields.Fields[7].AsString)+','+QuotedStr(ADOQuery2.Fields.Fields[8].AsString)+','+QuotedStr(ADOQuery2.Fields.Fields[9].AsString)+','+QuotedStr(DateTimeToStr(ADOQuery2.Fields.Fields[10].AsDateTime))+','+QuotedStr(ADOQuery2.Fields.Fields[11].AsString)+')';

ADOQuery3.Close;
ADOQuery3.SQL.Clear;
ADOQuery3.SQL.Text:=tex;
ADOQuery3.ExecSQL;
  end;
ADOQuery1.next;
end;
Tanuska___:) вне форума Ответить с цитированием
Старый 26.11.2008, 19:41   #2
Mitriy08
Пользователь
 
Регистрация: 11.07.2008
Сообщений: 91
По умолчанию

Первый вопрос который напрашивается это - зачем вы это вообще делаете?
Если вторая база у вас служит, как бэкап первой базы, то не проще ли на физическом уровне скопировать ее (перед этим удалить предыдущий бэкап)?

Если это не так, интересует как вы ведете согласование ID в двух таблицах?
Код:
'insert into Zurnal (PorNomer,DataPost,StatusKol,fio,KemPereslano,Adress,Soderganie,Ispolnitel,Status,DataIspolnen,Ident)
Исходя из этого я понимаю, что у вас ID - автоинкримент

Второе: у вас получается так, если во второй табличке дата при первом не заполнена она у вас ни когда не проапдэйтится...

Третье: если ли у вас какое то не соглашение в типах, либо плохо получается писать запросы делайте это через параметры (у вас 2 лишние операции одна переводит дату в строку, вторая переводит ее в дату)...

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

Или же сразу удаляются все записи со второй таблицы и происходит инсерт с первой во вторую...

Последний раз редактировалось Mitriy08; 26.11.2008 в 22:20.
Mitriy08 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обмен данными между С++ и С# Stellvertreter Общие вопросы C/C++ 0 14.11.2008 14:18
Обмен данными между формами Maks1978 Общие вопросы C/C++ 3 22.07.2008 15:35
из двух заданных массивов В и С одинаковой длины построить новый массив Absent Помощь студентам 4 11.03.2008 21:38
Обмен данными по сети Altera Работа с сетью в Delphi 2 23.02.2008 00:13
обмен данными с сервером BioS Работа с сетью в Delphi 15 12.02.2007 15:32