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

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

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


IronHawk ©   (2002-04-02 11:34:00) 

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

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


IronHawk   (2002-04-04 12:32:00) [1]


> panov © (04.04.02 10:54)

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

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

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


panov   (2002-04-04 10:54:00) [2]

Вот пример для удаления одинаковых записей в таблице, состоящей только из текстовых полей без использования 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-02 13:18:00) [3]

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

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


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


> sniknik © (02.04.02 12:16)

Спасибо!

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

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

> fnatali © (02.04.02 12:28)

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


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

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


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

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


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

простой перебор
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
примерно так. совсем без индексов но заколебешся ждать при более менее большой таблице.


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


> sniknik © (02.04.02 11:50)

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


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

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


Наверх

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