Удаление повторяющихся записей!
Как удалить все записи содержащие одинаковое поле в TTable (TDataSet) ? Другими словами очистить БД от дублей.
тут есть ссылочка но незнаю покатит тебе такое http://ibase.ru/devinfo/deldupes.htm
если нет открывай таблу запросом с удадалением повторяющихся записей SELECT DISTINCT ...
FROM .... (он будет местер)
цепляй к нему дочерний набор
И двигайся по мастеру, при этом проверяй сколько записей в дочернем наборе данных , если более одной оставляй какая те надо а остальные удаляй.
Цитата:
Originally posted by Voha
А с какой базой работаешь то?
А с какой базой работаешь то?
База dBase, без запросов надо как-то решить (средствами TDataSet)...
>>FROM .... (он будет местер)
>>цепляй к нему дочерний набор
>>И двигайся по мастеру, при этом проверяй >>сколько записей в дочернем наборе данных , если >>более одной оставляй какая те надо а остальные >>удаляй.
это относилось к ДБФ
если не устраивает такой вариант (самый простой)
то еще можно так
Сортируй таблу (строй индекс и подключай его) по признаку по которому ты олпределяешь дубликаты.
Запускай цикл движения по табле, запоминай текущее значения ключа (признака дублирования), переходи на следующую запись, если значение запомненного ключа совпадает с заначением текущей записи, то значит запись продублирована и ее надо удалить, удаляе, потом поиском на запомненную запись и т.д.
Но лучше через запрос, как в передыдущем варианте.
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); !
Не знаешь чего?
Может потому что bm = nil в твоем случае, тыже ее заремил//.
и еще тут
next;
while (not EOF) or (FieldByName(STR_ADDRESS).AsString = tmp) do
begin
Delete; // delete dup item
inc(cnt);
end;//так будет быстрее