Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Удаление повторяющихся записей!

2.2K
02 ноября 2003 года
csr
22 / / 22.06.2003
Как удалить все записи содержащие одинаковое поле в TTable (TDataSet) ? Другими словами очистить БД от дублей.
2.0K
03 ноября 2003 года
Voha
74 / / 20.01.2003
А с какой базой работаешь то?
тут есть ссылочка но незнаю покатит тебе такое http://ibase.ru/devinfo/deldupes.htm

если нет открывай таблу запросом с удадалением повторяющихся записей SELECT DISTINCT ...
FROM .... (он будет местер)
цепляй к нему дочерний набор
И двигайся по мастеру, при этом проверяй сколько записей в дочернем наборе данных , если более одной оставляй какая те надо а остальные удаляй.
2.2K
03 ноября 2003 года
csr
22 / / 22.06.2003
Цитата:
Originally posted by Voha
А с какой базой работаешь то?


База dBase, без запросов надо как-то решить (средствами TDataSet)...

2.0K
03 ноября 2003 года
Voha
74 / / 20.01.2003
>>если нет открывай таблу запросом с удадалением >>повторяющихся записей SELECT DISTINCT ...
>>FROM .... (он будет местер)
>>цепляй к нему дочерний набор
>>И двигайся по мастеру, при этом проверяй >>сколько записей в дочернем наборе данных , если >>более одной оставляй какая те надо а остальные >>удаляй.

это относилось к ДБФ

если не устраивает такой вариант (самый простой)
то еще можно так
Сортируй таблу (строй индекс и подключай его) по признаку по которому ты олпределяешь дубликаты.
Запускай цикл движения по табле, запоминай текущее значения ключа (признака дублирования), переходи на следующую запись, если значение запомненного ключа совпадает с заначением текущей записи, то значит запись продублирована и ее надо удалить, удаляе, потом поиском на запомненную запись и т.д.

Но лучше через запрос, как в передыдущем варианте.
2.2K
04 ноября 2003 года
csr
22 / / 22.06.2003
Идею понял. Вот что накалякал:

procedure TRecDlg.deldups_bClick(Sender: TObject);
var bm:TBookmark;
tmp:string;
cnt:integer;
begin
if MainForm.dbf.RecordCount < 2 then exit;
Mainform.StatusBar1.Panels[0].Text := 'Finding and deleting all duplicate addresses ...';
cnt := 0;

with MainForm.DBF do begin
DisableControls;
first;

repeat
tmp := FieldByName(STR_ADDRESS).AsString;
// bm := GetBookmark;
while not EOF do begin
next;
if FieldByName(STR_ADDRESS).AsString = tmp then begin
Delete; // delete dup item
inc(cnt);
end;

end;

// if BookmarkValid(bm) then
GotoBookmark(bm);
// first;
// Locate(STR_ADDRESS, tmp,[]);

if not EOF then
next
else break;
until true;


// FreeBookmark(bm);
enableControls;
end;

Mainform.StatusBar1.Panels[0].Text := inttostr(cnt)+' dup address(es) was seeked and destroied!';
Mainform.StatusBar1.Panels[1].Text := 'Addresses: '+inttostr(MainForm.dbf.RecordCount);
end;

Но чего-то вылазит ошибка на GotoBookmark(bm); !
Не знаешь чего?
2.0K
04 ноября 2003 года
Voha
74 / / 20.01.2003
А что пишет?
Может потому что bm = nil в твоем случае, тыже ее заремил//.
и еще тут

next;
while (not EOF) or (FieldByName(STR_ADDRESS).AsString = tmp) do
begin
Delete; // delete dup item
inc(cnt);
end;//так будет быстрее
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог