Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];




Вниз

Приветствую Мастеров ! Как удалять одинаковые строки в базе 2 ? 


IronHawk   (2002-04-02 11:34) [0]

НО: нельзя сортировать данные, нельзя сдвигать одинаковые строки перед удалением в конец базы, нельзы оставлять пустые строки после удаления!
Дано 2:
Есть база GUP.dbf (с 12 столбцами и от 1 до 80 строк)и файло с индексами idkey.ndx !
Это должно упростить задачу !

... заранее длагодарен !



sniknik   (2002-04-02 11:50) [1]

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



IronHawk   (2002-04-02 11:54) [2]


> sniknik © (02.04.02 11:50)

Немогу смягчать, то что идёт после "НО" и до "Дано 2" игнорить нельзя, иначе задача неимеет смысла !



sniknik   (2002-04-02 12:16) [3]

простой перебор
RecNo:= 1;
while not Table.eof do begin
... сохранить запись
Table.Next;
while not eof do begin
if (запись равна сохраненной) then Удалить;
Table.Next;
end
RecNo:= RecNo+1;
Table.Goto(RecNo);
Table.Next;
end
примерно так. совсем без индексов но заколебешся ждать при более менее большой таблице.



sniknik   (2002-04-02 12:24) [4]

Сорри за небольшие ошибки, смысл думаю ясен.



fnatali   (2002-04-02 12:28) [5]

В добавление к sniknik:
Можно сделать запрос select DISTINCT ....
и потом
query1.first;
while not query1.eof do begin
...
может, чуть быстрее будет.



IronHawk   (2002-04-02 12:36) [6]


> sniknik © (02.04.02 12:16)

Спасибо!

> sniknik © (02.04.02 12:24)
> Сорри за небольшие ошибки, смысл думаю ясен.

Я тож так думаю .... :-)

> fnatali © (02.04.02 12:28)

Немного быстрее, но скорость на такой базе - некритична.
Лучше больше дисковых операций, чем сьедание памяти !



IronHawk   (2002-04-02 13:18) [7]

Всем спасибо !
Трабл урегулирован, благодаря добрым людям!

Если появяться глюки обязательно напишу :-))) !



panov   (2002-04-04 10:54) [8]

Вот пример для удаления одинаковых записей в таблице, состоящей только из текстовых полей без использования TQuery и индексов.

procedureTForm1.Button1Click(Sender: TObject);
var
index,i: Integer;
s: String;
tL1 : TStringList;
begin
tL1 := TStringList.Create;
try
Table1.First;
while not Table1.Eof do
begin
s := "";
for index := 0 to Table1.FieldCount-1 do
begin
s := s + Table1.Fields[index].AsString;
end;
tL1.Add(s);
Table1.Next;
end;

for index := 0 to tL1.Count-1 do
begin
if Integer(tL1.Objects[index]) <> 0 then Continue;
tL1.Objects[index] := Pointer(2);
for i := 0 to tL1.Count-1 do
begin
if ( (tL1[i] = tL1[index]) and (index<>i)) then tL1.Objects[i] := Pointer(1);
end;
end;

Table1.Last;
index := tL1.Count-1;
while not Table1.Bof do
begin
if Integer(tL1.Objects[index]) <> 1 then
begin
Table1.Prior;
end
else Table1.Delete;
Dec(Index);
end;
finally
tL1.Free;
end;
end;



IronHawk   (2002-04-04 12:32) [9]


> panov © (04.04.02 10:54)

Класс, работает просто обалденно !
Быстро, просто и правильно !
Ай да модератор, ай молодец :-) !

Отлично, рульный вариат !

Всем спасибо !




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.041 c
1-80887           Freeflayer            2002-04-14 13:23  2002.04.25  
Как с помощью одной функции можно удалить файл или полн/пуст dir


1-80987           Starkom               2002-04-12 15:21  2002.04.25  
Вопрос по конструкторам объектов


6-81024           reki                  2002-02-14 15:59  2002.04.25  
ФТП сервер?


7-81092           МАРАТ                 2002-01-30 08:54  2002.04.25  
Заставить печатать конкретный принтер?


14-81076          Дмитрий               2002-03-21 12:09  2002.04.25  
1C-Архив