Поиск:

Ответ в темуСоздание новой темы Создание опроса
> копирование новых записей 
V
    Опции темы
dize
Дата 16.9.2009, 15:56 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть 2 таблицы, одна пустая(z) или с устаревшими данными, другая(x) обновляется в реальном времени. Необходимо сравнить эти две таблицы и скопировать те данные которые изменились(с заменой). Либо скопировать все данные из более новой таблицы в старую с замещением всех совпадающих данных, причем столбцы, которых нет в другой таблице, в которую происходит копирование, не трогать.  В более старой таблице есть столбец с данными, значения которого всегда должны оставаться неизменными(id_g).
--------------------
- Скажите, Большой Брат существует в том же смысле что и я? - Вы не существуете.
PM MAIL   Вверх
Данкинг
Дата 16.9.2009, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


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

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



И в чём вопрос?


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


Шустрый
*


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

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



Вопрос в том как это организовать, может у кого-то есть некий шаблон для реализации вышеперечисленного?
--------------------
- Скажите, Большой Брат существует в том же смысле что и я? - Вы не существуете.
PM MAIL   Вверх
vovk
Дата 17.9.2009, 05:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Почитайте про запросы, а конкретно  Update


Это сообщение отредактировал(а) vovk - 17.9.2009, 05:45
PM MAIL   Вверх
Frees
Дата 17.9.2009, 06:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



лучше почитать про репликацию и не изобретать велосипед


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
dize
Дата 17.9.2009, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Почитал про репликацию access, спасибо за подсказку, довольно удобно и доступно написано. Но все же, интересно как это возможно реализовать на уровне delphi. Пробую сейчас на основании старой таблицы с помощью массивов записать необходимые данные в новую, но что-то не выходит правильно заполнить..
Код

var
f,g,count,count1:integer;
id_kli,id_group:array of string;
begin
//заполнение массива с id_kli
  ADOQ_f.Close;
  ADOQ_f.SQL.Clear;
  ADOQ_f.SQL.Add('SELECT Dengi.Kod_klienta');
  ADOQ_f.SQL.Add('FROM Dengi INNER JOIN groups ON Dengi.id_group=groups.id_group');
  ADOQ_f.Open;

  SetLength(id_kli,ADOQ_f.RecordCount);
  count:=ADOQ_f.RecordCount-1;
  f:=0;
  while (not ADOQ_f.Eof) do
   begin
      id_kli[f]:=ADOQ_f.FieldByName('Kod_klienta').AsString;
      ADOQ_f.Next();
      f:=f+1;
   end;

//заполнение массива с id_group
  ADOQ_g.Close;
  ADOQ_g.SQL.Clear;
  ADOQ_g.SQL.Add('SELECT Dengi.id_group');
  ADOQ_g.SQL.Add('FROM Dengi INNER JOIN groups ON Dengi.id_group=groups.id_group');
  ADOQ_g.Open;

  SetLength(id_group,ADOQ_g.RecordCount);
  count1:=ADOQ_g.RecordCount-1;
  g:=0;
  while (not ADOQ_g.Eof) do
   begin
      id_group[g]:=ADOQ_g.FieldByName('id_group').AsString;
      ADOQ_g.Next();
      g:=g+1;
   end;

//сохранение в таблицу
  for f:=0 to count do
  begin
  for g:=0 to count1 do
  begin
  sql:= 'INSERT INTO Dengi_b (Kod_klienta, id_group ) VALUES ("'+id_kli[f]+'", "'+id_group[g]+'")';

    ADOQ_g.Close;
    ADOQ_g.SQL.Clear;
    ADOQ_g.SQL.Text:=sql;
    ADOQ_g.ExecSQL;
  end;
  end;
end;

Работает без ошибок, но вставляет не верно. Каждого клиента добавляет столько раз,  сколько всего различных id_group, присваивая ему по очереди все id_group которые есть в Dengi, причем которые ему даже не соответствуют. id_group у каждого клиента есть всего 1 и добавление в бд должно соответствовать форме 1клиент - 1id_group. Никак не соображу, как нужно изменить условия выборки, чтобы заполняло нормально =\
--------------------
- Скажите, Большой Брат существует в том же смысле что и я? - Вы не существуете.
PM MAIL   Вверх
dize
Дата 18.9.2009, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Неужели никто не сталкивался с подобной задачей?
P.S.: возможно ли использовать locate для этих целей т.е. ищем все записи, где есть id_group и добавляем построчно в другую таблицу? А потом совершаем нечто обратное, т.е. ищем в двух таблицах совпадение по определенному полю и в случае если отсутствует id_group в каких-либо записях добавляем его по соответствию kod_klienta.

Это сообщение отредактировал(а) dize - 18.9.2009, 15:39
--------------------
- Скажите, Большой Брат существует в том же смысле что и я? - Вы не существуете.
PM MAIL   Вверх
vovk
Дата 18.9.2009, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



всёже настойчиво рекомендую Update... 
PM MAIL   Вверх
dize
Дата 18.9.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(vovk @  18.9.2009,  16:19 Найти цитируемый пост)
всёже настойчиво рекомендую Update... 

Можешь описать алгоритм при использовании update, трудно доходит как он может здесь пригодиться.
--------------------
- Скажите, Большой Брат существует в том же смысле что и я? - Вы не существуете.
PM MAIL   Вверх
vovk
Дата 18.9.2009, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Если я правильно понял, то нужно обновлять определённые поля в записях по опять же определённому условию. Всё это позволяет сделать Update. Если ещё и нужно добавлять записи то ясно дело инсерт.. 
в общем у меня сейчас уже ночь устал, и вникать особо не получается, вроде из постов понял что используеш ACCESS, а компоненты ADO. Как можно подробнее изложи суть, какие таблицы есть (состав полей), из какой таблицы берём данные,  в какой обнавляем, поля которые требуется обновить, условие по которому обновляем (то есть как понять какую запись обновлять а какую нет). 
Сегодня уже соображаю .. мягко выражаясь туго, завтра с утра разгребу работу срочную, вникну, и постараюсь помочь 

А сейчас я спать

Это сообщение отредактировал(а) vovk - 18.9.2009, 17:34
PM MAIL   Вверх
dize
Дата 18.9.2009, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да, все верно, access и ado.
Есть 2 таблицы: dengi(id_money(счетчик), Kod_klienta, Tek_sredstva, Firma, id_group, val, gryppa) и dengi_b (id(счетчик), id_group, Kod_klienta). Таблица dengi имеет записи во всех полях, кроме id_group, значения которого есть не у всех. Данные берем из dengi по принципу, если у kod_klienta есть id_group, то добавляем kod_klienta и id_group в таблицу dengi_b, потом переходим к следующему. В итоге получается таблица dengi_b, в которой у всех Kod_klienta есть id_group. Может случиться так, что спустя некоторое время после записи этих данных в таблице dengi исчезнут все id_group у всех Kod_klienta. В этом случае нужно id_group из таблицы dengi_b присвоить каждому Kod_klienta в таблице dengi по соответствию Kod_klienta и id_group в dengi_b. id_group может быть как разным так и одинаковым для разных Kod_klienta. Все это будет привязано к кнопкам, т.к. я точно знаю в каком случае все вышеописанные операции нужно совершать.

Это сообщение отредактировал(а) dize - 18.9.2009, 18:02
--------------------
- Скажите, Большой Брат существует в том же смысле что и я? - Вы не существуете.
PM MAIL   Вверх
Akella
Дата 18.9.2009, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Да проще простого:
В цикле по основной таблице проверяешь записи второй таблицы. Если такая запись во второй таблице существует, то заменяешь все поля, если не существует, то добавляешь новую запись.
PM MAIL   Вверх
dize
Дата 21.9.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



За выходные перерыл пол интернета в поисках подобного решения, нашел только отдаленные примеры, в которых это реализовано частично. Не могли бы вы привести пример?
--------------------
- Скажите, Большой Брат существует в том же смысле что и я? - Вы не существуете.
PM MAIL   Вверх
former
Дата 21.9.2009, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


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

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



Цитата(dize @  21.9.2009,  14:49 Найти цитируемый пост)
За выходные перерыл пол интернета в поисках подобного решения

dize, теперь надо вторую половину просмотреть. smile 
Тебе же Akella все уже разжевал.
Вот простейший шаблон.
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  BDataSet.First;
  while not BDataSet.Eof do
  begin
    //Ищем такую же запись/и
    if DataCompare=False then
    begin
      //Копируем запись в другую таблицу
    end;
    BDataSet.Next
  end;
end;

function TForm1.DataCompare:Boolean;
begin
  BQuery.Close;
  BQuery.SQL.Text:='SELECT ... FROM ... WHERE ....';
  BQuery.ParamByName('...').AsString:=BDataSet.FieldByName('..').AsString;
  //...указываем другие параметры
  if BQuery.RecordCount<>0 then Result:=True
  else Result:=False;
end;


Это сообщение отредактировал(а) former - 21.9.2009, 16:32


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Akella
Дата 21.9.2009, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



former, ты его ещё больше запутал
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0589 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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