Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Импорт уникальных записей из двух связанных таблиц [D7, FireBird 2]


ruslan-id ©   (2008-06-27 12:25:00) 

Здравствуйте!
Возникла такая проблема:
База данных Firebird 2
есть таблицы main и info связь один ко многим

есть аналогичные таблицы main.dbf и info.dbf с выгруженными данными
из другой копии программы

в базе данных в таблице main есть уникальный индекс не пропускающий
повторные записи

пытаюсь сделать загрузку данных след. образом

k:=0;
 while not Timport.Eof do
 begin
   ok := true;
   try
     for i:=0 to Timport.FieldCount-1 do
Table1.Params[i].Value:=Timport.Fields[i].value;
     if (Danie.pFIBTransactionWrite.Active = false) then
Danie.pFIBTransactionWrite.StartTransaction;
     Table1.ExecQuery;
     k:=k+1;
     if (k mod 500)=0 then Danie.pFIBTransactionWrite.Commit;
   except
   ok := false;
   povtor:=povtor+1;
   end;

   if ok then
   begin
     T_info.First;
     while not T_info.Eof do
       begin
       for j:=1 to T_info.FieldCount-1 do
Table2.Params[j].Value:=T_info.Fields[j].value;
       Table2.ExecQuery;
       T_info.Next;
     end;
   end;

   Timport.Next;
   Gauge1.Progress:=Gauge1.Progress+1;
 end;


т.е подтверждаю транзакцию через каждые 500 записей, получается что если
одна из 500 повторится то отменяться все 500,
если делать ролбэк.

как загрузить только уникальные записи из таблицы main.dbf и соответствующие им записи из таблицы info.dbf

связь
info.dbf (masterkey)-> main.dbf(key) один ко многим
и в базе тоже
info (masterkey)-> main(key) один ко многим

не хотелось бы каждую запись оформлять в транзакцию. Записей может быть достаточно много и делается это достаточно часто.

Спасибо за ответы


ruslan-id   (2008-06-27 18:16:00) [1]

Я нашел такие решения:
1. решение
1 загружаю все в промежуточную таблицу
2 загружаю из main_exp в main не повторяющиеся записи
3 удаляю из info все записи соответствующие main_exp
4 загружаю все записи из info_exp в info

2 решение
загружаю все уникальные записи из main_exp в main
создал уникальный индекс в таблице info (masterkey + data_p)
загружаю все уникальные записи из info_exp в info


Виталий Панасенко(дом)   (2008-06-27 16:21:00) [2]

опять недосмотрел...
try Table1.ExecSQL except end;


Anatoly Podgoretsky   (2008-06-27 16:20:00) [3]

not exists


Виталий Панасенко(дом)   (2008-06-27 16:20:00) [4]

да, недосмотрел...тогда самое простое - try post except cancel end;


Johnmen   (2008-06-27 16:13:00) [5]


> Почему только они? а эти куда деть

А эти у него уже есть.


Виталий Панасенко(дом)   (2008-06-27 16:10:00) [6]


> В результате в базу должна добавится в main только запись
> 003 и соответств. записи из info_exp в info

Почему только они? а эти куда деть
0001  иванов иван иванович
0002  Петров петр петрович?


Johnmen   (2008-06-27 14:20:00) [7]

Пост [11] снимается по внимательном рассмотрении.


Johnmen   (2008-06-27 14:15:00) [8]

Кстати, так [0] записи не добавляют. Ибо тормоза и расход памяти...


Johnmen   (2008-06-27 14:11:00) [9]

Т.е. проблема сводится к откидыванию дубликатов по ключу?


ruslan-id   (2008-06-27 14:02:00) [10]

допустим есть базе таблицы с данными

main (уникальный индекс F,I,O)

KEY      F            I          O
0001  иванов иван иванович
0002  Петров петр петрович


info

MASTERKEY   data_p        result
001            01.01.2004    2
001            01.02.2004    1
002            01.03.2004    2
002            01.04.2004    3
002            01.06.2004    1


есть выгруженные данные (таблицы dbf или промежуточные таблицы в базе данных)
main_exp


KEY      F            I          O
0001  иванов иван иванович
0002  Петров петр петрович
0003  Сергеев Сергей Сергеевич


info_exp

MASTERKEY   data_p        result
001            01.01.2004    2
001            01.02.2004    1
002            01.03.2004    2
002            01.04.2004    3
002            01.06.2004    1
003            01.04.2004    3
003            01.06.2004    1


В результате в базу должна добавится в main только запись 003 и соответств. записи из info_exp в info

Как это сделать?


Виталий Панасенко(дом)   (2008-06-27 13:40:00) [11]

select distinct from dbf.. раз уж мы отбрасываем дубли.. я так и не понял, где используется переменная povtor


Sergey13   (2008-06-27 13:26:00) [12]

> [6] ruslan-id   (27.06.08 13:13)

Ключевое слово NOT EXISTS


ruslan-id   (2008-06-27 13:13:00) [13]


> Залей ВСЕ в промежуточные таблицы, а потом запросом из нее
> новые.

Хорошая идея. Поможешь составить запрос


ruslan-id   (2008-06-27 13:00:00) [14]


> Сорри, про .dbf не сразу уловил.
> Правда гетерогенный запрос можно в BDE выполнить, если он
> "поддерживает" FB :)


У меня не используется BDE
База данных FireBird
а для выгрузки и загрузки используется TDBF
Уникальность состоит в наличии в таблице main уникального индекса включающего набор полей


Sergey13   (2008-06-27 12:59:00) [15]

> [0] ruslan-id   (27.06.08 12:25)

Залей ВСЕ в промежуточные таблицы, а потом запросом из нее новые.


ЮЮ   (2008-06-27 12:41:00) [16]

Сорри, про .dbf не сразу уловил.
Правда гетерогенный запрос можно в BDE выполнить, если он "поддерживает" FB :)


ЮЮ   (2008-06-27 12:35:00) [17]

> как загрузить только уникальные записи из таблицы main.dbf
> и соответствующие им записи из таблицы info.dbf


Уникальность в чем состоит?


ЮЮ   (2008-06-27 12:34:00) [18]

Написать и выпонить один запрос, а не "циклить" на клиентском НД.


Наверх

Титульная страница Поиск, карта сайта Написать письмо