Форум: "Базы";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
ВнизКак правильно удалить запись в таблице. Найти похожие ветки
← →
Scorpio © (2004-12-20 10:27) [0]Создаю таблицу ч/з ADOCOmand пишу SELECT * INTO LILI FROM AS1, AS2, AS3 where ...
Теперь работаю с новой таблицей, делаю проверку по номерам, и если встречаются 2 одинаковых, то один из них мне нужно удалить, как мне это сделать ??
Пишу Table1.Delete - неработает.
Table1["NI"] := "" - неработает
Table1["NI"] := 0 - неработает
Если удалять ч/з DBNavigator1 визуально то работает, а как мне удалить ч/з него программно в программе. ??
База DOS FOX
← →
Соловьев © (2004-12-20 10:35) [1]Пишу Table1.Delete - неработает.
Чушь. Может упаковать надо еще? Тоько вот не как это сделать через твоего провайдера...
Table1["NI"] := "" - неработает
Table1["NI"] := 0 - неработает
Интересный подход... Еще с бубном потанцевать не пробовал?
← →
msguns © (2004-12-20 10:42) [2]>Пишу Table1.Delete - неработает.
Таблица перед удалением открыта ? Как там на счет прав (какой коннект) ?
> Table1["NI"] := "" - неработает
Table1["NI"] := 0 - неработает
Несколько вопросов:
1. Прежде чем корректить запись, ей был дан Edit ?
2. Поле NI что, допускает и строку, и интежер ?
3. Опять же а) таблица открыта ? б) какой коннект ?
← →
Anatoly Podgoretsky © (2004-12-20 10:44) [3]DBNavigator просто делает Table1.Delete
← →
Scorpio © (2004-12-20 11:08) [4]Мне нужно либо удалить всю строку где встречаются 2 одинаковых номера, либо одному из номеров присвоить 0.
Поле INTEGER
К таблице имею полный доступ.
← →
Anatoly Podgoretsky © (2004-12-20 11:11) [5]Table1.Delete
← →
sniknik © (2004-12-20 11:20) [6]ADOCOmand это ADOCommand?
то значит и Table1 это ADOTable?
> и если встречаются 2 одинаковых
то значит ни ключевого поля, ни полной идентификации принадлежности к конкретной записи нет... (раз есть 2 как минимум одинаковые)
и отсюда следует, что
> Пишу Table1.Delete - неработает.
неработает это означает что удаление всетаки происходит (удаляет обе) а ошибку выкидывает о том, что "одновление влияет на много строк"...
(DBNavigator возможно просто это игнорирует)
решить можно разными способами, вернутся на BDE, взять другой компонент/провайдер для базы работающий локальными методами, и (самое сложное ;о)) добавить уникальное поле и забыть о том что у записи есть порядковый номер, ...наверное чтото еще...
← →
Scorpio © (2004-12-20 11:20) [7]Она мне сейчас выдала "Table1: Dataset not in edit or insert mode", причем ч/з DBNavigator удаляет, как мне еще можно удалить, может возможно ч/з SQL?
Команда DISTINCT мне неподходит, там есть одно поле которое неповторяется.
← →
Scorpio © (2004-12-20 11:25) [8]Она мне сейчас выдала "Table1: Dataset not in edit or insert mode", причем ч/з DBNavigator удаляет, как мне еще можно удалить, может возможно ч/з SQL?
Команда DISTINCT мне неподходит, там есть одно поле которое неповторяется.
Вообще я пишу:
while not Table1.Eof do
begin
N1 := Table1["NI"];
Table1.Next;
if n1 = Table1["NI"] then
Table1.delete;
end;
Так она доходит до конца таблицы, вместо тогог чтобы выйти из нее она удаляет все записи от конца и до начала, причем записи исчезают, но если открыть ч/з SQL то все записи наместе а TABLE их невидит ниодной. Как это лечить ??
← →
msguns © (2004-12-20 11:31) [9]>Scorpio © (20.12.04 11:25) [8]
Оригинално !
Естественно, она удалит все ! А пошаговая отладка не для мушкетеров ? Я уж вообще молчу о "карандашном" методе.
По поводу того, что "SQL видит", а "TABLE не видит" - хоть что-нибудь почитай о коннекшинах и их свойствах, таких как подтверждения изменений, например.
← →
sniknik © (2004-12-20 11:40) [10]> возможно ч/з SQL?
конечно возможно! если умудришся составить условие удаления одной записи из 2х совершенно одинаковых... ;о))
DELETE FROM Table1 WHERE NI=0 AND ....???
(0 допустим признак этих обоих записей)
это можно только на провайдере который или поддерживает внутренний счетчик, либо есть доступ к номеру записи (что само по себе будет идентификатором)
> Так она доходит до конца таблицы, вместо тогог чтобы выйти из нее она удаляет все записи от конца и до начала, причем записи исчезают,
> но если открыть ч/з SQL то все записи наместе а TABLE их невидит ниодной. Как это лечить ??
ну судя по всему отключить режим ltBatchOptimistic.
> Вообще я пишу:
> while not Table1.Eof do
> begin
> N1 := Table1["NI"];
> Table1.Next;
> if n1 = Table1["NI"] then
> Table1.delete;
> end;
неправильно (даже если бы это было верно логически для локального движка)
n1:= -1; //любое невозможное в таблице значение
while not Table1.Eof do begin
if n1 = Table1["NI"] then Table1.delete
else begin
Table1.Next;
N1 := Table1["NI"];
end;
end;
и то это только если таблица отсортирована по N1 (одинаковые значения рядом)
← →
sniknik © (2004-12-20 11:45) [11]хотя возможно и у меня ошибка, давно с локальными таблицами не работал.
delete на последней записи переведет курсор на Eof или так и останется на последней (уже предпоследней)?
← →
Scorpio © (2004-12-20 11:50) [12]Я обрабатываю три таблицы и данные вношу в отдельную.
ADOCommand1.Parameters.ParamValues["LI1"] := Edit1.Text;
ADOCommand1.CommandText := "SELECT LI.NI, LI.LA_, LI.LB_, LI.LC_, LI.LD_, LI.LJ_, LI.LP_, LI.LI_, LI.HP_, RA.JA_ into opi from LI, LNK, RA WHERE LI.HP_ like ""%5"" AND int(LI.LI_) = :LI1 AND LNK.IDL=35 AND LNK.REC1=LI.NI AND RA.NI=LNK.REC2 AND RA.JA_<DATE()";
ADOCommand1.Execute;
Теперь я получаю таблицу OPI.dbf. Там номера по полю NI могут продублироваться, мне нужно либо удалить одну запись, либо номеру присвоить 1.
Как мне правильно написать выборку??
Уже неделю бьюсь, но фоксе сделал, а на дельфе неполучается.
← →
msguns © (2004-12-20 12:02) [13]>sniknik © (20.12.04 11:45) [11]
Лучший способ удаления повторяющихся:
- Отсортировать так, чтобы повторы были рядом
- Пройтись по НД и отметить дубли, ничего не удаляя.
- Удалить помеченные.
>Scorpio © (20.12.04 11:50) [12]
Однако, ты определись все же, чтО у тебя является критерием, по которому запись НЕ удаляется из группы с одинаковыми значениями анализируемого поля. Может, это и есть типа UID ? Тогда все проще. Если же такого поля нет, то введи суррогатное, типа автоинкремента. Именно по этому полю и будешь удалять.
Либо делай так, как я посоветовал в предыдущем абзаце.
← →
sniknik © (2004-12-20 12:02) [14]и не получится... ;о) пока все глюки не исправиш (для этого логику работы не поймеш)
сдесь к примеру параметру значение задаеш раньше чем он создается... нехорошо. ;о))
← →
Соловьев © (2004-12-20 12:03) [15]самое простое - создать таблицу с выборки с disctinct
← →
sniknik © (2004-12-20 12:07) [16]msguns © (20.12.04 12:02) [13]
> Лучший способ удаления повторяющихся:
для удаления полностью совпадающих записей? а как метку ставить? ;о))
лучший способ (рабочий в любом случае и для локального и клиент серверного движка поддерживающего sql)
SELECT DISTINCT * INTO Table2 FROM Table1
и удалить/переименовать таблицу.
← →
msguns © (2004-12-20 12:12) [17]>sniknik © (20.12.04 12:07) [16]
>для удаления полностью совпадающих записей? а как метку ставить? ;о))
Очень сложный вопрос. И философский. Но если глотнуть граммов 300, то приходит в голову простая мысль - записать в это самое повторяющееся поле что-нить типа "Тетя Феня - б...".
;)))
← →
Scorpio © (2004-12-20 12:20) [18]Удалено модератором
Примечание: дубль
← →
Scorpio © (2004-12-20 12:22) [19]А как пометить ??
А потом удалить ??
У меня они все отсортированны.
А как ввести сурогатное поле, когда таблица создается в SQL запросе??
Мне нужно либо присвоить любой номер строке "NI" либо удалить, для того чтобы с этой таблицей потом связать еще другие три базы.
А как мне обойти ошибку что мне сейчас выдала "Table1: Dataset not in edit or insert mode", причем ч/з DBNavigator удаляет, хотя я пытаюсь присвоить другой номер этому полю. ??
Правда я я пытаюсь работать ч/з TABLE а не ч/з ADOTable, т.к. он мне выдает Null into string.
← →
Соловьев © (2004-12-20 12:23) [20]хотя я пытаюсь присвоить другой номер этому полю. ??
А набор данных в каком состоянии? Читать до осознания действительности - TDataSet.State
← →
msguns © (2004-12-20 12:30) [21]>Scorpio © (20.12.04 12:20) [18]
>А как пометить ??
Присвоить "убитое" значение любому полю. Например, есть поле "Фамилия". Присвоить ему значение "УДАЛЯТЬ !"
>А потом удалить ??
Delete From Table Where "Фамлия"="УДАЛЯТЬ !"
>У меня они все отсортированны.
Да хоть 7 раз !!! Ни на что не влияет.
>А как ввести сурогатное поле, когда таблица создается в SQL запросе??
Дописать в создающий запрос имя сурр.поля (наприамер "ID") и дать ему тип "Автоинкремент". Лиюо заполнить потом отдельной процедурой FieldByName(ID).AsInteger := RecNo;
>А как мне обойти ошибку что мне сейчас выдала "Table1: Dataset not in edit or insert mode", причем ч/з DBNavigator удаляет, хотя я пытаюсь присвоить другой номер этому полю. ??
Судя по всему, перед изменением записи твой код игнорирует перевод датасета в режим Edit. Для этого есть одноименный метод.
Ноафигатор же это делает (его писали люди, слава Богу, грамотные)
← →
Scorpio © (2004-12-20 14:33) [22]Судя по всему, перед изменением записи твой код игнорирует перевод датасета в режим Edit. Для этого есть одноименный метод.
Ноафигатор же это делает (его писали люди, слава Богу, грамотные)
Как мне правильно перевести таблицу в режим чтобы DataSet был в режиме EDIT ??
← →
msguns © (2004-12-20 14:41) [23]DataSet.Edit
При этом, ессно, он (датасет) должен быть редактируемым, т.е. тиа TADOTable или TADODataSet с соответсвующими "примочками"
← →
Scorpio © (2004-12-20 14:55) [24]Всем спасибо ЗАРАБОТАЛО.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.041 c