-
ruslan-id (27.06.08 12:25) [0]Здравствуйте!
Возникла такая проблема:
База данных 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) один ко многим
не хотелось бы каждую запись оформлять в транзакцию. Записей может быть достаточно много и делается это достаточно часто.
Спасибо за ответы -
ЮЮ © (27.06.08 12:34) [1]Написать и выпонить один запрос, а не "циклить" на клиентском НД.
-
ЮЮ © (27.06.08 12:35) [2]> как загрузить только уникальные записи из таблицы main.dbf
> и соответствующие им записи из таблицы info.dbf
Уникальность в чем состоит? -
ЮЮ © (27.06.08 12:41) [3]Сорри, про .dbf не сразу уловил.
Правда гетерогенный запрос можно в BDE выполнить, если он "поддерживает" FB :) -
> [0] ruslan-id (27.06.08 12:25)
Залей ВСЕ в промежуточные таблицы, а потом запросом из нее новые. -
ruslan-id (27.06.08 13:00) [5]
> Сорри, про .dbf не сразу уловил.
> Правда гетерогенный запрос можно в BDE выполнить, если он
> "поддерживает" FB :)
У меня не используется BDE
База данных FireBird
а для выгрузки и загрузки используется TDBF
Уникальность состоит в наличии в таблице main уникального индекса включающего набор полей -
ruslan-id (27.06.08 13:13) [6]
> Залей ВСЕ в промежуточные таблицы, а потом запросом из нее
> новые.
Хорошая идея. Поможешь составить запрос -
> [6] ruslan-id (27.06.08 13:13)
Ключевое слово NOT EXISTS -
Виталий Панасенко(дом) (27.06.08 13:40) [8]select distinct from dbf.. раз уж мы отбрасываем дубли.. я так и не понял, где используется переменная povtor
-
ruslan-id (27.06.08 14:02) [9]допустим есть базе таблицы с данными
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
Как это сделать? -
Т.е. проблема сводится к откидыванию дубликатов по ключу?
-
Кстати, так [0] записи не добавляют. Ибо тормоза и расход памяти...
-
Пост [11] снимается по внимательном рассмотрении.
-
Виталий Панасенко(дом) (27.06.08 16:10) [13]
> В результате в базу должна добавится в main только запись
> 003 и соответств. записи из info_exp в info
Почему только они? а эти куда деть
0001 иванов иван иванович
0002 Петров петр петрович? -
> Почему только они? а эти куда деть
А эти у него уже есть. -
Виталий Панасенко(дом) (27.06.08 16:20) [15]да, недосмотрел...тогда самое простое - try post except cancel end;
-
Anatoly Podgoretsky © (27.06.08 16:20) [16]not exists
-
Виталий Панасенко(дом) (27.06.08 16:21) [17]опять недосмотрел...
try Table1.ExecSQL except end; -
ruslan-id (27.06.08 18:16) [18]Я нашел такие решения:
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